Add PM extension (Projects, Work Logs, Comments) + Quill rich-text UI

Projects: Brick-backed model with list/detail screens and nav entry.
Work Logs: per-contributor time ledger, assignee running-clock +
helper logged minutes with Hours/Minutes input; pause-after-save and
helper-deduct prompts.
Comments: threaded comments with file attachments and Quill composer.
Detail screen: tabbed layout (Work Log / Comments / Activity),
editable title + description via edit dialog, Quill-rendered
descriptions with legacy plain-text fallback.
Create dialog: fixed-width (480px max), Quill description editor.
Shared QuillFieldEditor + QuillReadOnly widgets extracted for reuse.
RLS: hardened activity-log actor binding, immutable creator_id/
created_at triggers, SECURITY INVOKER visibility helper,
append-only work-log and scoped comment policies.
Brick migration for project_id FK on programmer_tasks.

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
2026-09-27 16:06:26 +08:00
parent 627645056b
commit b307f66f2c
33 changed files with 2960 additions and 216 deletions
+3
View File
@@ -74,6 +74,7 @@ class ProgrammerTask extends OfflineFirstWithSupabaseModel {
final int priority;
final String? assigneeId;
final String? creatorId;
final String? projectId;
final DateTime createdAt;
final DateTime? startedAt;
final DateTime? completedAt;
@@ -90,6 +91,7 @@ class ProgrammerTask extends OfflineFirstWithSupabaseModel {
this.priority = 1,
this.assigneeId,
this.creatorId,
this.projectId,
required this.createdAt,
this.startedAt,
this.completedAt,
@@ -126,6 +128,7 @@ class ProgrammerTask extends OfflineFirstWithSupabaseModel {
priority: (map['priority'] as num?)?.toInt() ?? 1,
assigneeId: map['assignee_id']?.toString(),
creatorId: map['creator_id']?.toString(),
projectId: map['project_id']?.toString(),
createdAt: AppTime.parse(map['created_at'] as String),
startedAt: map['started_at'] == null
? null