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
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:
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user