feat(V0.2): 标题30字+智能拆分 / 时间标记 MM-dd / 时间词前缀 (T-TK-14~16)
Docker Build and Push / build-image (push) Successful in 1m25s

- 标题上限收紧至 30 字 (服务端校验+详情编辑框); 快速添加输入框
  放宽到 200 字: 超长时在 30 字内分隔符处截断为标题, 完整原文进描述
- Task.markDate (DateTime, 迁移 20261025120000): 详情页 DatePicker
  选择/清除, 列表行与看板卡显示 MM-dd 小标签
- 快速添加时间词前缀: 今天/明天/后天/本周/下周/本月/下月 开头
  (后跟分隔符) 自动设为时间标记并移出标题; 本周=本周日, 本月=月末
- 需求/功能/数据库设计文档同步更新 T-TK-14~16 与 Task 表字段
This commit is contained in:
jif2.zhang
2026-10-25 11:47:44 +08:00
parent fd27242e4e
commit 74e1e7dd13
13 changed files with 303 additions and 16 deletions
+17 -6
View File
@@ -3,6 +3,7 @@ import { ActionSheet, Dialog, DotLoading, Toast } from 'antd-mobile'
import { projectApi, taskApi } from '../../api/task.js'
import { filterVisible, msToNextBoundary } from './date.js'
import { getViewMode, setViewMode } from './prefs.js'
import { parseTimePrefix, splitTitle } from './quickAdd.js'
import ListView from './ListView.jsx'
import BoardView from './BoardView.jsx'
import TaskDetail from './TaskDetail.jsx'
@@ -141,12 +142,21 @@ export default function ProjectView({ projectId, onProjectChanged, onProjectExit
} catch { /* ignore */ }
}
/** 新建任务 */
async function createTask(title, parentId = null) {
const t = String(title || '').trim()
if (!t) return
/** 新建任务 (快速添加): 时间词前缀 → 时间标记; 超过 30 字在分隔符处截断,
* 前段为标题, 余文并入描述 (T-TK-14/16) */
async function createTask(rawTitle, parentId = null) {
const raw = String(rawTitle || '').trim()
if (!raw) return
const { markDate, rest } = parseTimePrefix(raw)
const { title, desc } = splitTitle(rest)
if (!title) return
try {
await taskApi.create(projectId, { title: t, parentId })
await taskApi.create(projectId, {
title,
description: desc || undefined,
markDate: markDate || undefined,
parentId,
})
setAdding(false)
load()
} catch (e) {
@@ -232,7 +242,8 @@ export default function ProjectView({ projectId, onProjectChanged, onProjectExit
<input
className="inp"
autoFocus
placeholder="输入任务标题,回车创建"
maxLength={200}
placeholder="输入任务标题,回车创建;开头可用 今天/明天/本周/本月 等时间词"
onKeyDown={(e) => {
if (e.key === 'Enter') createTask(e.currentTarget.value)
if (e.key === 'Escape') setAdding(false)