feat(todo): richer metadata (tags, startDate, files) + edit/detail dialog
ToDoアイテムのメタデータを拡充し、編集/詳細ダイアログを追加。
- lib/db/migrations/003_todo_tags.sql: todo_items に tags 列を追加
- TodoRepository/TodoService: startDate(従来ハードコードNULL)とtagsをcreate/updateで永続化、fileIdsで添付紐付け(トランザクション)、deleteItemで添付クリーンアップ、getItem/getItemAttachments を追加
- API: GET /todos/items/[itemId] ({item, attachments}) を追加、POST/PATCH で startDate/tags/fileIds を受理、PATCH は null(クリア)と undefined(更新しない)を区別
- UI: TodoDialog(タイトル/説明/担当/優先度/開始日/期限/タグ/添付を編集、完了日時・タイムスタンプは読み取り専用)、KanbanBoard のカードクリックでダイアログを開きメタデータを表示
- MilestoneRepository の todo マッピングに tags を追加し as never キャストを修正
- docs/functional-design.md に tags / file_assets.source / attachments テーブルを追記
This commit is contained in:
@ -114,6 +114,49 @@ describe('TodoRepository', () => {
|
||||
expect(updated?.completedAt).toBeTruthy();
|
||||
});
|
||||
|
||||
it('persists startDate and tags on create', () => {
|
||||
const item = repo.createItem({
|
||||
projectId,
|
||||
columnId,
|
||||
title: 't',
|
||||
creatorId: userId,
|
||||
orderIndex: 0,
|
||||
startDate: '2026-07-01',
|
||||
tags: 'frontend,urgent',
|
||||
});
|
||||
const found = repo.findItemById(item.id);
|
||||
expect(found?.startDate).toBe('2026-07-01');
|
||||
expect(found?.tags).toBe('frontend,urgent');
|
||||
});
|
||||
|
||||
it('updates startDate and tags', () => {
|
||||
const item = repo.createItem({
|
||||
projectId,
|
||||
columnId,
|
||||
title: 't',
|
||||
creatorId: userId,
|
||||
orderIndex: 0,
|
||||
});
|
||||
const updated = repo.updateItem(item.id, {
|
||||
startDate: '2026-08-01',
|
||||
tags: 'backend',
|
||||
});
|
||||
expect(updated?.startDate).toBe('2026-08-01');
|
||||
expect(updated?.tags).toBe('backend');
|
||||
});
|
||||
|
||||
it('defaults startDate and tags to null when omitted', () => {
|
||||
const item = repo.createItem({
|
||||
projectId,
|
||||
columnId,
|
||||
title: 't',
|
||||
creatorId: userId,
|
||||
orderIndex: 0,
|
||||
});
|
||||
expect(item.startDate).toBeNull();
|
||||
expect(item.tags).toBeNull();
|
||||
});
|
||||
|
||||
it('isolates items by project', () => {
|
||||
const p2 = new ProjectRepository(db).create({
|
||||
name: 'P2',
|
||||
|
||||
Reference in New Issue
Block a user