优化: 清理无意义注释(走查编号前缀/过时历史标注/死代码注释)
This commit is contained in:
+21
-21
@@ -417,7 +417,7 @@ const router = useRouter()
|
||||
const store = useProjectStore()
|
||||
const { t } = useI18n()
|
||||
const { confirmState, confirmDialog, answerConfirm } = useConfirm()
|
||||
// WK-13:快捷操作失败 toast 反馈(对齐 Projects.vue useToast 模式)
|
||||
// 快捷操作失败 toast 反馈(对齐 Projects.vue useToast 模式)
|
||||
const { toast, showToast } = useToast()
|
||||
|
||||
// 列表筛选/分页状态持久化到 localStorage(key 前缀 'tasks.'),
|
||||
@@ -447,14 +447,14 @@ function toggleStatus(key: string) {
|
||||
const sortBy = usePersistedRef('tasks.sortBy', 'updated_at')
|
||||
const searchKeyword = usePersistedRef('tasks.searchKeyword', '')
|
||||
const loading = ref(false)
|
||||
// WK-11:搜索态(keyword 过滤可能截断父子关系,子进度徽章/迷你条语义失真 → 隐藏)
|
||||
// 搜索态(keyword 过滤可能截断父子关系,子进度徽章/迷你条语义失真 → 隐藏)
|
||||
const isSearching = computed(() => searchKeyword.value.trim().length > 0)
|
||||
|
||||
// F-260805 D5:列表页一次性加载 + 前端组装树,移除真分页(page/pageSize/totalTasks 已删)。
|
||||
// 分组折叠状态(localStorage 记忆)
|
||||
const collapsedGroups = reactive(new Set<string>())
|
||||
|
||||
// F-260805:父任务展开/折叠状态(localStorage 记忆,沿用 collapsedGroups 模式)
|
||||
// 父任务展开/折叠状态(localStorage 记忆,沿用 collapsedGroups 模式)
|
||||
const expandedParents = reactive(new Set<string>())
|
||||
function toggleParent(id: string) {
|
||||
if (expandedParents.has(id)) {
|
||||
@@ -491,7 +491,7 @@ const STATUS_FILTER_META: Record<string, { icon: string; labelKey: string }> = {
|
||||
const quickStatuses = computed(() =>
|
||||
TASK_STATUS_ORDER.map(key => ({ key, icon: STATUS_FILTER_META[key].icon, label: t(STATUS_FILTER_META[key].labelKey) })),
|
||||
)
|
||||
/** WK-8:快捷状态目标 = 状态机合法流转目标(TASK_STATUS_TRANSITIONS 过滤,对齐 TaskDetail ADVANCE_MAP) */
|
||||
/** 快捷状态目标 = 状态机合法流转目标(TASK_STATUS_TRANSITIONS 过滤,对齐 TaskDetail ADVANCE_MAP) */
|
||||
function quickStatusesFor(task: TaskRecord): { key: string; icon: string; label: string }[] {
|
||||
const valid = new Set(TASK_STATUS_TRANSITIONS[task.status] ?? [])
|
||||
return quickStatuses.value.filter(s => valid.has(s.key))
|
||||
@@ -508,14 +508,14 @@ async function quickAdvance(id: string, target: string) {
|
||||
await taskApi.advance(id, target)
|
||||
await store.loadTasks(buildTaskQuery())
|
||||
} catch (e: any) {
|
||||
// WK-13:快捷操作失败 toast 反馈(原 console.error 静默,用户无感知)
|
||||
// 快捷操作失败 toast 反馈(原 console.error 静默,用户无感知)
|
||||
showToast(e?.toString() ?? t('common.unknownError'), 'error')
|
||||
}
|
||||
}
|
||||
async function quickPriority(id: string, priority: number) {
|
||||
quickMenuId.value = null
|
||||
try {
|
||||
// WK-13:改用 taskApi 直调(不走 store.updateTask,避免失败置 store.error 触发整表错误态)
|
||||
// 改用 taskApi 直调(不走 store.updateTask,避免失败置 store.error 触发整表错误态)
|
||||
await taskApi.update(id, 'priority', String(priority))
|
||||
await store.loadTasks(buildTaskQuery())
|
||||
} catch (e: any) {
|
||||
@@ -524,13 +524,13 @@ async function quickPriority(id: string, priority: number) {
|
||||
}
|
||||
async function quickDelete(task: TaskRecord, childCount = 0) {
|
||||
quickMenuId.value = null
|
||||
// F-260805:父任务带子任务时确认文案含子任务数(后端级联软删)
|
||||
// 父任务带子任务时确认文案含子任务数(后端级联软删)
|
||||
const msg = childCount > 0
|
||||
? t('tasks.confirmDeleteWithChildren', { title: task.title, n: childCount })
|
||||
: t('tasks.confirmDelete', { title: task.title })
|
||||
if (!await confirmDialog(msg)) return
|
||||
try {
|
||||
// WK-13:deleteTask 返成功布尔,失败 toast(store.error 同时走 error-banner)
|
||||
// deleteTask 返成功布尔,失败 toast(store.error 同时走 error-banner)
|
||||
const ok = await store.deleteTask(task.id)
|
||||
if (!ok) showToast(t('tasks.err.deleteFailed'), 'error')
|
||||
} catch (e) { console.error('删除失败:', e) }
|
||||
@@ -556,7 +556,7 @@ try {
|
||||
// 搜索防抖
|
||||
let _searchTimer: ReturnType<typeof setTimeout> | null = null
|
||||
watch(searchKeyword, () => {
|
||||
// WK-10:登记当前关键字到 barrel(数据变更联动刷新复用同一筛选,不冲掉搜索结果)
|
||||
// 登记当前关键字到 barrel(数据变更联动刷新复用同一筛选,不冲掉搜索结果)
|
||||
store.setActiveTaskKeyword(searchKeyword.value.trim() || undefined)
|
||||
if (_searchTimer) clearTimeout(_searchTimer)
|
||||
_searchTimer = setTimeout(() => {
|
||||
@@ -572,18 +572,18 @@ const newTaskTitle = ref('')
|
||||
const newTaskDesc = ref('')
|
||||
const newTaskBranch = ref('')
|
||||
const newTaskPriority = ref(2)
|
||||
// F-260805:父任务下拉选中值(空串=无/顶层任务)
|
||||
// 父任务下拉选中值(空串=无/顶层任务)
|
||||
const newTaskParentId = ref('')
|
||||
// F-260619-01:关联灵感(空串=不关联,与后端 idea_id 空串处理一致)
|
||||
// 关联灵感(空串=不关联,与后端 idea_id 空串处理一致)
|
||||
const newTaskIdeaId = ref('')
|
||||
const submitting = ref(false)
|
||||
|
||||
// F-260805:父任务选项 = 当前选中项目的顶层任务(无 parent_id;仅顶层可作父,1 级嵌套)
|
||||
// 父任务选项 = 当前选中项目的顶层任务(无 parent_id;仅顶层可作父,1 级嵌套)
|
||||
const parentTaskOptions = computed(() =>
|
||||
store.tasks.filter(t => !t.parent_id && t.project_id === newTaskProjectId.value),
|
||||
)
|
||||
|
||||
// F-260805:树形行结构(父任务 + 直接子任务 + 子进度)。1 级嵌套,无递归。
|
||||
// 树形行结构(父任务 + 直接子任务 + 子进度)。1 级嵌套,无递归。
|
||||
interface TaskRow {
|
||||
task: TaskRecord
|
||||
/** 父任务的直接子任务(仅父有;叶子为空数组) */
|
||||
@@ -615,7 +615,7 @@ interface TaskGroup {
|
||||
rows: TaskRow[]
|
||||
}
|
||||
|
||||
// F-260805:树组装 — 顶层 = 无 parent_id 的任务,每个顶层挂 children;父进度前端计算(D6,全量已在前端)。
|
||||
// 树组装 — 顶层 = 无 parent_id 的任务,每个顶层挂 children;父进度前端计算(D6,全量已在前端)。
|
||||
const taskRows = computed<TaskRow[]>(() => {
|
||||
// 子任务按 parent_id 分组(1 级嵌套)
|
||||
const childMap = new Map<string, TaskRecord[]>()
|
||||
@@ -806,7 +806,7 @@ function buildTaskQuery(): TaskQuery | undefined {
|
||||
return query
|
||||
}
|
||||
|
||||
// F-260805:打开新建弹窗。可选 parent(父任务快捷菜单「添加子任务」):
|
||||
// 打开新建弹窗。可选 parent(父任务快捷菜单「添加子任务」):
|
||||
// 有父 → project_id 锁定为该父所属项目、parent_id 预填;无父(顶部「新建任务」)→ 默认父=无(顶层任务)。
|
||||
function openCreateModal(parent?: TaskRecord) {
|
||||
if (parent) {
|
||||
@@ -835,9 +835,9 @@ async function confirmCreate() {
|
||||
description: newTaskDesc.value.trim(),
|
||||
branch_name: newTaskBranch.value.trim() || undefined,
|
||||
priority: newTaskPriority.value,
|
||||
// F-260619-01:空串=不关联(对齐后端 idea_id 空串语义)
|
||||
// 空串=不关联(对齐后端 idea_id 空串语义)
|
||||
idea_id: newTaskIdeaId.value.trim() || undefined,
|
||||
// F-260805:父任务透传(空串=顶层任务,后端视为 None)
|
||||
// 父任务透传(空串=顶层任务,后端视为 None)
|
||||
parent_id: newTaskParentId.value || undefined,
|
||||
})
|
||||
if (!r) return
|
||||
@@ -912,7 +912,7 @@ onMounted(async () => {
|
||||
store.loadProjects(),
|
||||
// F-260805 D5:一次拉当前筛选全量(limit 500),树形需要完整父子关系
|
||||
store.loadTasks(buildTaskQuery()),
|
||||
// F-260619-01:加载灵感供新建任务模态关联下拉选择(幂等,已加载则 no-op)
|
||||
// 加载灵感供新建任务模态关联下拉选择(幂等,已加载则 no-op)
|
||||
store.loadIdeas(),
|
||||
])
|
||||
} finally {
|
||||
@@ -1171,7 +1171,7 @@ onUnmounted(() => {
|
||||
background: var(--df-bg-card);
|
||||
border: 0.5px solid var(--df-border);
|
||||
border-radius: var(--df-radius-lg);
|
||||
/* WK-9:原 overflow:hidden 会把快捷菜单(.quick-menu 绝对定位向下溢出)裁切。
|
||||
/* 原 overflow:hidden 会把快捷菜单(.quick-menu 绝对定位向下溢出)裁切。
|
||||
改为组自身不裁切,圆角裁剪下放给 header(顶角)与末行(底角,见下),菜单可正常浮出。 */
|
||||
}
|
||||
|
||||
@@ -1184,7 +1184,7 @@ onUnmounted(() => {
|
||||
user-select: none;
|
||||
border-bottom: 0.5px solid var(--df-border);
|
||||
transition: background 0.1s;
|
||||
/* WK-9:承接原 .task-group overflow:hidden 的顶角圆角裁剪(自身 overflow,组不再裁切快捷菜单) */
|
||||
/* 承接原 .task-group overflow:hidden 的顶角圆角裁剪(自身 overflow,组不再裁切快捷菜单) */
|
||||
border-radius: var(--df-radius-lg) var(--df-radius-lg) 0 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
@@ -1216,7 +1216,7 @@ onUnmounted(() => {
|
||||
cursor: pointer;
|
||||
}
|
||||
.task-item:last-child { border-bottom: none; }
|
||||
/* WK-9:末行承接组底角圆角裁剪(替代原 .task-group overflow:hidden) */
|
||||
/* 末行承接组底角圆角裁剪(替代原 .task-group overflow:hidden) */
|
||||
.task-item:last-child { border-radius: 0 0 var(--df-radius-lg) var(--df-radius-lg); }
|
||||
.task-item:hover { background: var(--df-accent-bg); }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user