fix: #1800 批量生成进度卡片布局 + #1893 文案库 AI 入口 UX 细节 (#1937)
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (push) Successful in 11s
CI/CD Pipeline / Check push changed paths (push) Successful in 11s
CI/CD Pipeline / Integration Tests (push) Successful in 4m12s
CI/CD Pipeline / Validate - Style (push) Successful in 5m8s
CI/CD Pipeline / Validate - Python (mypy + alembic) (push) Successful in 5m2s
CI/CD Pipeline / Frontend Unit Tests (push) Failing after 3m46s
CI/CD Pipeline / Build Staging API Image (push) Successful in 34s
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 29s
CI/CD Pipeline / Build Staging Web Image (push) Successful in 2m3s
CI/CD Pipeline / Unit Tests (push) Successful in 11m1s
CI/CD Pipeline / Validate - Security (push) Successful in 13m26s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Has been cancelled
CI/CD Pipeline / Staging E2E Tests (push) Has been cancelled
CI/CD Pipeline / Staging API Integration Tests (push) Has been cancelled
CI/CD Pipeline / Deploy Production (push) Has been cancelled
CI/CD Pipeline / Production Browser E2E (push) Has been cancelled
CI/CD Pipeline / ACR Image Cleanup (push) Has been cancelled
CI/CD Pipeline / Canary Release to Production (push) Has been cancelled
CI/CD Pipeline / Retag skipped Staging Web Image (push) Failing after 14h57m53s
CI/CD Pipeline / PR Build Worker Image (push) Failing after 15h18m20s
CI/CD Pipeline / PR Build Web Image (push) Failing after 15h18m21s
CI/CD Pipeline / PR Build API Image (push) Failing after 15h18m21s
CI/CD Pipeline / Build Production API Image (push) Failing after 14h57m6s
CI/CD Pipeline / Retag skipped Staging API Image (push) Failing after 14h57m10s
CI/CD Pipeline / Build Production Worker Image (push) Failing after 14h57m6s
CI/CD Pipeline / Build Production Web Image (push) Failing after 14h57m6s
CI/CD Pipeline / Retag skipped Staging Worker Image (push) Failing after 14h57m10s
CI/CD Pipeline / CI Gate (push) Failing after 14h57m6s
CI/CD Pipeline / Frontend Lint (push) Failing after 15h16m42s
CI/CD Pipeline / Check if frontend-only change (push) Failing after 15h33m52s

fix: #1800 批量生成进度卡片布局 + #1893 文案库 AI 入口 UX 细节

- #1800: 卡片标题加 ellipsis 防溢出,grid 列宽 minmax(320px,1fr) max380px,card-head flex 布局
- #1893: AI 生成标题/改写按钮 disabled 时用 Tooltip 包裹 span,改写弹窗 loading 时禁关禁点
This commit was merged in pull request #1937.
This commit is contained in:
2026-09-15 23:31:26 +08:00
parent dc0a5834f1
commit ab90a5ec9f
3 changed files with 100 additions and 48 deletions
+46 -21
View File
@@ -31,6 +31,7 @@ import {
Space,
Spin,
Tag,
Tooltip,
Typography,
message,
} from "antd"
@@ -604,18 +605,25 @@ const ScriptLibrary: React.FC = () => {
label={
<span>
名称
<Button
type="link"
size="small"
icon={<BulbOutlined />}
loading={titleGenLoading}
disabled={contentEmpty}
onClick={handleGenerateTitles}
{/* #1893 UX: disabled 时原生 title 在 antd Button 上不触发,
用 Tooltip + span 包裹保证提示可见 */}
<Tooltip
title={contentEmpty ? "请先填写文案内容" : "基于正文 AI 生成 3 个候选标题"}
style={{ padding: "0 4px", marginLeft: 4, height: 22 }}
>
✨ AI 生成标题
</Button>
<span style={{ display: "inline-flex", marginLeft: 4 }}>
<Button
type="link"
size="small"
icon={<BulbOutlined />}
loading={titleGenLoading}
disabled={contentEmpty}
onClick={handleGenerateTitles}
style={{ padding: "0 4px", height: 22 }}
>
✨ AI 生成标题
</Button>
</span>
</Tooltip>
</span>
}
rules={[{ required: true, message: "请填写文案名称" }, { max: 200 }]}
@@ -662,16 +670,29 @@ const ScriptLibrary: React.FC = () => {
options={REWRITE_STYLE_OPTIONS}
style={{ width: 110 }}
size="small"
disabled={rewriteLoading}
/>
<Button
size="small"
icon={<RobotOutlined />}
loading={rewriteLoading}
onClick={() => setRewriteModalOpen(true)}
>
✨ AI 改写
</Button>
{rewriteResult && (
{/* #1893 UX: content 为空时禁用改写按钮并给提示,避免用户点了才弹 warning */}
<Tooltip title={contentEmpty ? "请先填写文案正文再改写" : ""}>
<span style={{ display: "inline-flex" }}>
<Button
size="small"
icon={<RobotOutlined />}
loading={rewriteLoading}
disabled={contentEmpty}
onClick={() => {
// 每次打开重置上一次结果,避免误看旧对比
if (!rewriteLoading) {
setRewriteResult(null)
setRewriteModalOpen(true)
}
}}
>
✨ AI 改写
</Button>
</span>
</Tooltip>
{rewriteResult && !contentEmpty && (
<Button size="small" type="link" onClick={() => setRewriteModalOpen(true)}>
查看上一次改写结果
</Button>
@@ -782,7 +803,9 @@ const ScriptLibrary: React.FC = () => {
<Modal
title={`✨ AI 改写(${rewriteStyle}风格)`}
open={rewriteModalOpen}
onCancel={() => setRewriteModalOpen(false)}
onCancel={() => !rewriteLoading && setRewriteModalOpen(false)}
maskClosable={!rewriteLoading}
closable={!rewriteLoading}
footer={
rewriteResult ? (
<Space>
@@ -792,7 +815,9 @@ const ScriptLibrary: React.FC = () => {
</Button>
</Space>
) : (
<Button onClick={() => setRewriteModalOpen(false)}>关闭</Button>
<Button disabled={rewriteLoading} onClick={() => setRewriteModalOpen(false)}>
关闭
</Button>
)
}
width={640}