fix(web): close final workbench interaction gaps

This commit is contained in:
2026-07-22 01:24:51 +08:00
parent 26c3e6fd8a
commit b1ce837845
23 changed files with 808 additions and 175 deletions

View File

@@ -1,4 +1,4 @@
import { Input, Modal, Select, Space, Switch, Typography } from '@arco-design/web-react'
import { Alert, Input, Modal, Select, Space, Switch, Typography } from '@arco-design/web-react'
import { useEffect, useMemo, useState } from 'react'
import type { ProjectWorkspace, TaskItem } from './project-types'
@@ -29,13 +29,16 @@ export function ProjectTaskEditModal({
task: TaskItem | null
workspace: ProjectWorkspace
onClose: () => void
onSubmit: (update: ProjectTaskUpdate) => void
onSubmit: (update: ProjectTaskUpdate) => Promise<void>
}) {
const tagOptions = useMemo(() => workspace.tags.filter((tag) => tag !== 'all' && tag !== '全部'), [workspace.tags])
const [draft, setDraft] = useState<TaskDraft>({ title: '', summary: '', tag: '', completed: false })
const [saving, setSaving] = useState(false)
const [saveError, setSaveError] = useState('')
useEffect(() => {
if (!task) return
setSaveError('')
setDraft({
title: task.title,
summary: task.summary,
@@ -44,24 +47,39 @@ export function ProjectTaskEditModal({
})
}, [task])
async function saveTask() {
if (!task || saving) return
setSaving(true)
setSaveError('')
try {
await onSubmit({
taskId: task.id,
title: draft.title.trim() || task.title,
summary: draft.summary.trim(),
tag: draft.tag.trim(),
completed: draft.completed,
})
onClose()
} catch (error) {
setSaveError(error instanceof Error ? error.message : '任务保存失败,请稍后重试')
} finally {
setSaving(false)
}
}
return (
<Modal
className="action-modal"
title="编辑计划"
visible={Boolean(task)}
onCancel={onClose}
onOk={() => {
if (!task) return
onSubmit({
taskId: task.id,
title: draft.title.trim() || task.title,
summary: draft.summary.trim(),
tag: draft.tag.trim(),
completed: draft.completed,
})
}}
confirmLoading={saving}
maskClosable={!saving}
cancelButtonProps={{ disabled: saving }}
onCancel={() => { if (!saving) onClose() }}
onOk={() => void saveTask()}
>
<Space direction="vertical" size={12} className="action-form">
{saveError && <Alert type="error" content={saveError} />}
<label>
<Text></Text>
<Input value={draft.title} onChange={(title) => setDraft((value) => ({ ...value, title }))} />