Session 2026-05-30: task detail page overhaul

- New TaskDetail replaces /tasks/:id (was v2 at /requests/:id/v2)
- Overview tab: R00 request info, Requested By/Date/Sign Count inline row, Notes, Sign Family, files, amendments
- Revisions tab: R01+ from submissions, newest first, same layout as overview, per-entry Amend button
- Comments tab: single-line input, post on Enter, delete own comments, Supabase task_comments table
- Folder tab: placeholder for file sharing
- Tab badges showing revision/comment counts
- Amend Request modal: drag-drop file zone, popupOverlayStyle/Surface, Save+Cancel buttons
- Request Revision modal for clients on approved/invoiced/paid tasks
- JSZip download-all with progress popup for submission files
- Upload progress popup for Add Task and amend file uploads
- FileAttachment drop zone: 8px radius, transparent bg, label style fix (no all-caps override)
- PageLoader on task detail load
- task_comments migration with RLS policies

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Krao Hasanee
2026-05-30 22:44:16 -04:00
parent 13ef1f4ded
commit 0b4705311b
28 changed files with 1491 additions and 1552 deletions
+18 -1
View File
@@ -80,6 +80,9 @@ export async function createInitialSubmissionForRequest({
requestKey,
isHot,
serviceType,
signFamily,
signCount,
signs,
deadline,
description,
submittedBy,
@@ -94,6 +97,8 @@ export async function createInitialSubmissionForRequest({
type: 'initial',
is_hot: isHot,
service_type: serviceType,
sign_family: signFamily || null,
sign_count: signCount || null,
deadline: deadline || null,
description,
submitted_by: submittedBy,
@@ -102,7 +107,19 @@ export async function createInitialSubmissionForRequest({
.select()
.single();
if (!error && submission) return { submission, duplicate: false };
if (!error && submission) {
if (signs?.length > 0) {
await supabase.from('submission_signs').insert(
signs.map((s, i) => ({
submission_id: submission.id,
sign_number: i + 1,
sign_name: s.signName,
sign_family: s.signFamily || null,
}))
);
}
return { submission, duplicate: false };
}
if (error?.code === '23505' && requestKey) {
const { data: existingSubmission, error: existingError } = await supabase