diff --git a/frontend/assignment-popover-final-status.md b/frontend/assignment-popover-final-status.md
deleted file mode 100644
index 5123251..0000000
--- a/frontend/assignment-popover-final-status.md
+++ /dev/null
@@ -1,109 +0,0 @@
-# Assignment Popover Implementation - Final Status
-
-## โ Implementation Complete
-
-The EditableTaskStatus component has been successfully updated with comprehensive fixes for the assignment popover functionality. All major issues have been addressed.
-
-## ๐ง Key Fixes Applied
-
-### 1. Event Handling
-- **Event Prevention Wrapper**: Added `
` around the popover to prevent table row click interference
-- **Proper Event Propagation**: Removed custom click handlers that were conflicting with Popover's natural behavior
-
-### 2. Z-Index and Positioning
-- **Button Z-Index**: Added `z-10` to the assignment button for proper layering
-- **Popover Z-Index**: Added `z-50` to popover content for top-level display
-- **Positioning**: Added `side="bottom"` and `:side-offset="4"` for better popover placement
-
-### 3. Data Loading Strategy
-- **Watcher-Based Loading**: Project members are loaded when popover opens using Vue watcher
-- **Preload Strategy**: Members are also preloaded on component mount for faster access
-- **Loading States**: Proper loading indicators and error handling
-
-### 4. Debug and Error Handling
-- **Debug Information**: Shows project ID and member count in popover
-- **Loading States**: Spinner and "Loading members..." message
-- **Error States**: "No project members found" with retry button
-- **Console Logging**: Comprehensive logging for debugging
-
-### 5. Assignment Logic
-- **Task Creation**: Automatically creates tasks if they don't exist
-- **Assignment API**: Uses `taskService.assignTask()` for user assignment
-- **Unassignment API**: Uses `taskService.updateTask()` with `assigned_user_id: 0`
-- **Visual Feedback**: Avatar updates to show assigned user
-- **Notifications**: Success toast messages for assignment/unassignment
-
-## ๐ฏ Component Features
-
-### Visual Elements
-- **Unassigned Tasks**: Show ๐ค User icon
-- **Assigned Tasks**: Show ๐ต Avatar with user initials
-- **Loading State**: Spinner overlay during updates
-- **Disabled State**: Button disabled during API calls
-
-### Popover Content
-- **Header**: "Assign Task" title
-- **Debug Info**: Project ID and member count
-- **Loading State**: Spinner with "Loading members..." text
-- **Error State**: "No project members found" with retry button
-- **Unassign Option**: "Unassign" button with UserX icon
-- **Member List**: Scrollable list with avatars, names, and roles
-
-### Functionality
-- **Smart Loading**: Only loads members when popover opens (if not already loaded)
-- **Retry Logic**: Retry button for failed member loading
-- **Assignment**: Click member to assign task
-- **Unassignment**: Click "Unassign" to remove assignment
-- **Auto-Close**: Popover closes after successful assignment
-- **Toast Notifications**: Success/error messages
-
-## ๐งช Testing Checklist
-
-### Manual Testing Steps
-1. **Navigate to Shots Table**: Go to any project's shots page in table view
-2. **Locate Assignment Buttons**: Look for ๐ค or ๐ต icons in task columns
-3. **Click Assignment Button**: Verify popover opens immediately
-4. **Check Content Loading**: Verify debug info, loading states, and member list
-5. **Test Assignment**: Click a member and verify assignment works
-6. **Test Unassignment**: Click "Unassign" and verify it works
-7. **Check Visual Updates**: Verify button shows correct icon/avatar
-8. **Verify Notifications**: Check for success toast messages
-
-### Console Verification
-Expected console messages when clicking assignment button:
-```
-Popover state changed: true
-Loading project members when popover opens
-Loading project members for project: [ID]
-Loaded project members: [...]
-```
-
-### Network Verification
-Expected API calls:
-- `GET /projects/{id}/members` - Load project members
-- `POST /shots/{id}/tasks` - Create task if needed
-- `PUT /tasks/{id}/assign` - Assign task to user
-- `PUT /tasks/{id}` - Update task (for unassignment)
-
-## ๐ Ready for Production
-
-The assignment popover functionality is now fully implemented and ready for use. The component includes:
-
-- โ Robust event handling
-- โ Proper z-index management
-- โ Smart data loading
-- โ Comprehensive error handling
-- โ Visual feedback and notifications
-- โ Debug information for troubleshooting
-- โ Full assignment/unassignment workflow
-
-## ๐ Troubleshooting
-
-If issues occur, check:
-1. Browser console for JavaScript errors
-2. Network tab for failed API calls
-3. User permissions (coordinator/admin required)
-4. Backend service availability
-5. Project member data availability
-
-The implementation is comprehensive and should handle all common use cases and edge cases gracefully.
\ No newline at end of file
diff --git a/frontend/clear-auth-and-reload.html b/frontend/clear-auth-and-reload.html
deleted file mode 100644
index 9bf0562..0000000
--- a/frontend/clear-auth-and-reload.html
+++ /dev/null
@@ -1,124 +0,0 @@
-
-
-
- Clear Auth & Reload
-
-
-
-
๐ง Fix Shot Detail 403 Error
-
-
-
Current Issue:
-
You're getting 403 errors when clicking on shots, even though you're logged in as admin.
-
Solution: Clear your authentication tokens and login again.
- โ ๏ธ Token Expiration Issue
- Your JWT tokens have expired. This is causing the "Signature has expired" error when trying to log in.
-
-
-
- Current Token Status:
-
-
-
-
-
-
-
-
- What this does:
- โข Removes access_token from localStorage
- โข Removes refresh_token from localStorage
- โข Allows you to log in fresh with valid credentials
-
-
-
- After clearing tokens:
- 1. Click the "Clear Expired Tokens" button above
- 2. Navigate to http://localhost:5173/login
- 3. Log in with your credentials
- 4. You should now be able to access the application
-
userStore.fetchAllUsers() - User name resolution (if needed)
-
-
These calls are appropriate because notes and attachments are separate data not included in the main asset response.
-
-
-
-
๐ฏ Optimization Benefits
-
-
Reduced API Calls: No redundant task loading calls
-
Better Performance: Uses embedded data from single asset request
-
Consistent Pattern: Follows the same optimization pattern as AssetBrowser
-
Maintained Functionality: All component features work with embedded data
-
-
-
-
-
๐ Task Requirements Compliance
-
Requirements 2.2, 4.4 - Both requirements are already satisfied:
-
-
2.2: "System SHALL show task status information without additional API calls per row" โ
-
4.4: "System SHALL provide task status information in a format optimized for table rendering" โ
-
-
-
-
-
โ Conclusion
-
Task 8 is already complete. The AssetDetailPanel component was already optimized to use embedded task data and does not make redundant API calls. This component serves as a good example of the optimized pattern that other components should follow.
-
-
The component efficiently:
-
-
Uses embedded task_details from asset data
-
Transforms data through computed properties
-
Avoids redundant taskService.getTasks() calls
-
Maintains full functionality with optimized data flow
-
-
-
-
\ No newline at end of file
diff --git a/frontend/test-asset-functionality-preservation.html b/frontend/test-asset-functionality-preservation.html
deleted file mode 100644
index a4f8a0e..0000000
--- a/frontend/test-asset-functionality-preservation.html
+++ /dev/null
@@ -1,208 +0,0 @@
-
-
-
-
-
- Asset Functionality Preservation Test
-
-
-
-
Asset Browser Table Refactor - Functionality Preservation Test
-
This document verifies that all existing asset functionality has been preserved in the new TanStack Table implementation.
-
-
-
1. EditableTaskStatus Components
-
โ PRESERVED
-
-
EditableTaskStatus components are properly integrated in columns.ts
-
Task status editing works through Select dropdowns
-
Status updates trigger proper callbacks to parent component
-
Custom task statuses are supported through taskStatusesStore
-
Loading states and error handling are maintained
-
-
-Location: frontend/src/components/asset/columns.ts
-Implementation: EditableTaskStatus component rendered in task columns
-Key features: Status selection, optimistic updates, error handling
-
-
-
-
-
2. Thumbnail Column Functionality
-
โ PRESERVED
-
-
Thumbnail column is defined in columns.ts
-
Thumbnail visibility can be toggled via button and column controls
-
Session storage persistence for thumbnail preference
-
Proper placeholder icon when no thumbnail available
Task status filtering through TaskStatusFilter component
-
Column visibility controls through ColumnVisibilityControl
-
Bulk operations for task status changes
-
Search functionality across asset names and descriptions
-
Sorting capabilities for all sortable columns
-
Row selection with keyboard modifiers (Ctrl, Shift)
-
Session storage for column visibility preferences
-
Custom task types support
-
-
-Components involved:
-- TaskStatusFilter.vue: Task status filtering
-- ColumnVisibilityControl.vue: Column visibility management
-- AssetsDataTable.vue: Row selection and table rendering
-- columns.ts: Bulk operations and sorting
-
-
-
-
-
7. TanStack Table Integration Benefits
-
โ ENHANCED
-
-
Improved performance with virtual scrolling capabilities
-
Better state management for sorting and column visibility
-
Consistent row selection behavior
-
Enhanced accessibility features
-
Better TypeScript support and type safety
-
Standardized column definitions
-
-
-
-
-
8. Testing Recommendations
-
To verify functionality preservation:
-
-
Test asset creation, editing, and deletion workflows
-
Verify task status editing in table cells
-
Test bulk operations with multiple asset selection
-
Verify detail panel behavior on desktop and mobile
-
Test column visibility controls and persistence
-
Verify category and task status filtering
-
Test keyboard shortcuts and accessibility
-
-
-
-
-
Conclusion
-
โ ALL FUNCTIONALITY PRESERVED
-
The asset browser table refactor has successfully preserved all existing functionality while improving the underlying architecture with TanStack Table. The implementation maintains backward compatibility and enhances the user experience with better performance and consistency.
-
-
-
\ No newline at end of file
diff --git a/frontend/test-asset-selection.html b/frontend/test-asset-selection.html
deleted file mode 100644
index 5f6d592..0000000
--- a/frontend/test-asset-selection.html
+++ /dev/null
@@ -1,190 +0,0 @@
-
-
-
-
-
- Asset Selection Test
-
-
-
-
-
-
Asset Selection Test
-
Testing checkbox selection with array-based v-model
โ Implemented - Unselected rows are automatically selected on right-click
-
-
-
-
Requirement 3.3: Click outside closes menu
-
- Requirement: WHEN the context menu is open and the user clicks outside THEN the system SHALL close the context menu
-
-
Implementation:
-
-// TaskBulkActionsMenu handles this via DropdownMenuContent's @interact-outside
-// The menu component emits 'update:open' with false value
-v-model:open="showContextMenu"
-
-
โ Implemented - Menu closes via v-model binding and interact-outside handler
-
-
-
-
Requirement 3.4: No menu on empty space
-
- Requirement: WHEN no tasks are selected and the user right-clicks empty space THEN the system SHALL not display the context menu
-
-
Implementation:
-
-// Prevent context menu on empty table areas
-if (filteredTasks.value.length === 0) {
- return
-}
-
-// Context menu only attached to TableRow elements, not empty space
-@contextmenu="handleContextMenu($event, index)"
-
-
โ Implemented - Menu only appears when right-clicking actual rows
-
-
-
-
-
Testing Instructions
-
-
Manual Testing Steps:
-
-
Start the application:
-
cd frontend && npm run dev
-
-
Navigate to a project's Tasks view
-
Test Requirement 3.1:
-
-
Click checkbox to select a task
-
Right-click on the selected task row
-
Verify context menu appears at cursor position
-
Verify menu shows "X tasks selected" header
-
-
-
Test Requirement 3.2:
-
-
Clear all selections (if any)
-
Right-click on an unselected task row
-
Verify the row becomes selected (highlighted)
-
Verify context menu appears
-
Verify menu shows "1 task selected"
-
-
-
Test Requirement 3.3:
-
-
Open context menu by right-clicking a task
-
Click anywhere outside the menu
-
Verify menu closes
-
-
-
Test Requirement 3.4:
-
-
Apply filters to show no tasks (empty table)
-
Right-click in the empty table area
-
Verify no context menu appears
-
Right-click on the "No tasks found" message
-
Verify no context menu appears
-
-
-
-
-
-
-
Integration Points
-
-
Components Integrated:
-
-
TaskBulkActionsMenu: Context menu component with status and assignee submenus
-
Project Service: Fetches project members for assignee list
-
TanStack Table: Row selection state management
-
-
-
State Management:
-
-
showContextMenu: Controls menu visibility
-
contextMenuPosition: Tracks cursor position for menu placement
-
rowSelection: TanStack Table selection state
-
projectMembers: List of users for assignment submenu
-
-
-
-
-
Next Steps
-
The following tasks will implement the actual bulk action handlers:
-
-
Task 9: Implement bulk status update action
-
Task 10: Implement bulk assignment action
-
Task 11: Implement keyboard shortcuts
-
-
Currently, the context menu appears correctly but the action handlers are placeholder functions that will be implemented in subsequent tasks.
The following colors are available in the predefined palette:
-
-
-
- #8B5CF6 Purple
-
-
-
- #EC4899 Pink
-
-
-
- #14B8A6 Teal
-
-
-
- #F97316 Orange
-
-
-
- #06B6D4 Cyan
-
-
-
- #84CC16 Lime
-
-
-
- #A855F7 Violet
-
-
-
- #F43F5E Rose
-
-
-
- #22D3EE Sky
-
-
-
- #FACC15 Yellow
-
-
-
-
-
-
๐งช Manual Testing Steps
-
-
Test 1: Create New Status
-
-
Navigate to Project Settings โ Tasks tab
-
Click "Add Status" button
-
Verify dialog opens with "Add Status" title
-
Enter status name (e.g., "In Review")
-
Select a color from the palette
-
Verify live preview updates
-
Click "Create Status"
-
Verify success toast appears
-
Verify dialog closes
-
Verify new status appears in the list
-
-
-
Test 2: Edit Existing Status
-
-
Click edit button on a custom status
-
Verify dialog opens with "Edit Status" title
-
Verify form is pre-filled with current values
-
Verify "Set as default" checkbox is visible
-
Change the name and/or color
-
Verify live preview updates
-
Click "Update Status"
-
Verify success toast appears
-
Verify changes are reflected in the list
-
-
-
Test 3: Name Validation
-
-
Open add status dialog
-
Try to submit with empty name โ Should show error
-
Enter a name longer than 50 characters โ Should show error
-
Enter a duplicate name (case-insensitive) โ Should show error
-
Verify character counter updates as you type
-
Verify submit button is disabled when invalid
-
-
-
Test 4: Color Validation
-
-
Open add status dialog
-
Click different palette colors โ Should update preview
-
Enter invalid hex code (e.g., "red") โ Should show error
-
Enter valid hex code (e.g., "#FF5733") โ Should update preview
-
Use native color picker โ Should update hex input and preview
-
-
-
Test 5: Cancel Action
-
-
Open add status dialog
-
Enter some data
-
Click "Cancel" button
-
Verify dialog closes without saving
-
Verify no status was created
-
-
-
Test 6: Set as Default (Edit Mode)
-
-
Edit a custom status
-
Check "Set as default" checkbox
-
Save the status
-
Verify the status now shows "Default" badge
-
Verify other statuses no longer show "Default" badge
-
-
-
-
-
๐ Requirements Coverage
-
-
- Requirement 1.2: Create custom status form
-
โ IMPLEMENTED
-
-
-
- Requirement 1.3: Name uniqueness validation
-
โ IMPLEMENTED
-
-
-
- Requirement 1.4: Color assignment with palette
-
โ IMPLEMENTED
-
-
-
- Requirement 2.1: Edit form pre-filled with current values
-
โ IMPLEMENTED
-
-
-
- Requirement 2.2: Update status name with validation
-
โ IMPLEMENTED
-
-
-
- Requirement 2.3: Update status color with immediate reflection
-
โ IMPLEMENTED
-
-
-
-
-
๐ฏ Implementation Summary
-
- The Custom Task Status Dialog has been successfully implemented with all required features:
-
-
-
Dual Mode: Single component handles both create and edit operations
-
Comprehensive Validation: Name uniqueness, length limits, and hex color format
-
User-Friendly Color Selection: Predefined palette + custom color picker
-
Live Preview: Real-time visual feedback of status appearance
-
Error Handling: Inline validation errors and submit error display
-
Integration: Seamlessly integrated with CustomTaskStatusManager
-
Accessibility: Proper labels, form validation, and keyboard navigation
-
-
-
-
-
โ Task Complete
-
- Task 12 "Frontend: Implement Add/Edit status dialog" has been successfully completed.
- All acceptance criteria have been met and the implementation is ready for testing.
-
-
- Next Steps:
-
-
-
Test the dialog in the running application
-
Verify integration with backend API
-
Proceed to Task 13: Implement status deletion with confirmation
- Add custom task types beyond the standard types to adapt the pipeline to your project needs
-
-
-
-
-
-
๐ฆ Asset Task Types
-
-
-
-
-
- Modeling
- Standard
-
-
-
-
- Surfacing
- Standard
-
-
-
-
- Rigging
- Standard
-
-
-
-
- Grooming
- Custom
-
-
-
-
-
-
-
-
- Look Dev
- Custom
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
๐ฌ Shot Task Types
-
-
-
-
-
- Layout
- Standard
-
-
-
-
- Animation
- Standard
-
-
-
-
- Simulation
- Standard
-
-
-
-
- Lighting
- Standard
-
-
-
-
- Compositing
- Standard
-
-
-
-
- Previz
- Custom
-
-
-
-
-
-
-
-
- Matchmove
- Custom
-
-
-
-
-
-
-
-
-
-
-
-
โน๏ธ About Custom Task Types
-
- Standard task types are built-in and cannot be edited or deleted.
- Custom task types can be added, renamed, or removed to match your project's specific workflow.
- Custom task types will appear in the task template editor and can be enabled for specific asset categories or shots.
-
This test plan validates the default status management functionality for custom task statuses.
-
Requirements: 5.1, 5.2, 5.3, 5.4, 5.5
-
-
-
-
๐ง Setup Instructions
-
-
Ensure backend server is running: cd backend && uvicorn main:app --reload
-
Ensure frontend server is running: cd frontend && npm run dev
-
Login as a coordinator or admin user
-
Navigate to a project's settings page
-
Go to the "Tasks" tab to access Custom Task Status Manager
-
-
-
-
-
โ Test Cases
-
-
-
Test 1: Visual Indicator for Default Status
-
Requirement: 5.1 - WHEN a user views the status list THEN the system SHALL indicate which status is the default
-
-
View the custom statuses list
-
Verify that the default status has a "Default" badge with a star icon
-
Verify that non-default statuses show "Custom" badge instead
-
Verify that system statuses show "System" badge
-
-
- Expected: Default status should be clearly marked with a distinctive badge containing a star icon.
-
-
-
-
-
Test 2: Set Status as Default
-
Requirement: 5.2 - WHEN a user clicks "Set as Default" on a status THEN the system SHALL mark that status as the default and remove the default flag from other statuses
-
-
Create at least 2 custom statuses if not already present
-
Identify which status is currently the default
-
Click "Set as Default" button on a different status
-
Verify success toast message appears
-
Verify the clicked status now shows "Default" badge
-
Verify the previous default status now shows "Custom" badge
-
Verify only ONE status has the "Default" badge
-
-
- Expected: Only one status should be marked as default at any time. Setting a new default should automatically unset the previous default.
-
-
-
-
-
Test 3: Set as Default Button Visibility
-
Requirement: UI should show "Set as Default" button only for non-default statuses
-
-
View the custom statuses list
-
Verify that non-default statuses have a "Set as Default" button
-
Verify that the default status does NOT have a "Set as Default" button
-
Set a different status as default
-
Verify the button visibility updates correctly
-
-
- Expected: The "Set as Default" button should only appear for statuses that are not currently the default.
-
-
-
-
-
Test 4: Default Status for New Tasks
-
Requirement: 5.3 - WHEN a new task is created without an explicit status THEN the system SHALL assign the project's default status
-
-
Set a custom status as the default (e.g., "Ready to Start")
-
Navigate to a shot or asset in the project
-
Create a new task without specifying a status
-
Verify the task is created with the default custom status
-
Change the default status to a different one
-
Create another new task
-
Verify the new task uses the updated default status
-
-
- Expected: New tasks should automatically receive the project's default status when no status is explicitly specified.
-
-
-
-
-
Test 5: Fallback to System Default
-
Requirement: 5.4 - WHEN no custom statuses exist THEN the system SHALL use "not_started" as the default status
-
-
Delete all custom statuses (if any exist)
-
Create a new task
-
Verify the task is created with "not_started" status
-
Create a custom status but don't set it as default
-
Create another new task
-
Verify the task still uses "not_started" as default
-
-
- Expected: When no custom default is set, the system should fall back to "not_started" as the default status.
-
-
-
-
-
Test 6: Default Status Deletion Handling
-
Requirement: 5.5 - WHEN a default status is deleted THEN the system SHALL automatically assign the first status in the list as the new default
-
-
Create at least 2 custom statuses
-
Set one as the default
-
Delete the default status (with task reassignment if needed)
-
Verify the deletion succeeds
-
Verify another status is automatically marked as default
-
Create a new task to confirm the new default is applied
-
-
- Expected: Deleting the default status should automatically promote another status to be the new default.
-
-
-
-
-
Test 7: Edit Dialog Default Checkbox
-
Requirement: Users should be able to set default status through the edit dialog
-
-
Click the edit button on a non-default status
-
Verify the "Set as default status for new tasks" checkbox is present
-
Verify the checkbox is unchecked
-
Check the checkbox and save
-
Verify the status is now marked as default
-
Edit the default status
-
Verify the checkbox is checked
-
Uncheck it and save
-
Verify the status is no longer default
-
-
- Expected: The edit dialog should allow toggling the default status via checkbox.
-
-
-
-
-
Test 8: Concurrent Default Status Updates
-
Requirement: System should handle multiple users trying to set default status
-
-
Open the project settings in two different browser tabs/windows
-
In tab 1, set status A as default
-
In tab 2, set status B as default
-
Refresh both tabs
-
Verify only one status is marked as default
-
Verify the last update wins
-
-
- Expected: The system should maintain consistency even with concurrent updates.
-
-
-
-
-
Test 9: Button Disabled States
-
Requirement: UI should prevent actions during operations
-
-
Click "Set as Default" on a status
-
Verify the button shows loading state or is disabled
-
Verify other "Set as Default" buttons are also disabled
-
Wait for the operation to complete
-
Verify buttons are re-enabled
-
Start a drag-and-drop reorder operation
-
Verify "Set as Default" buttons are disabled during reorder
-
-
- Expected: Buttons should be disabled during operations to prevent race conditions.
-
-
-
-
-
Test 10: API Response Validation
-
Requirement: Backend should correctly handle default status updates
-
-
Open browser DevTools Network tab
-
Set a status as default
-
Verify PUT request to /api/projects/{id}/task-statuses/{status_id}
-
Verify request body includes is_default: true
-
Verify response includes updated statuses list
-
Verify only one status has is_default: true in response
-
-
- Expected: API should correctly update the default status and return consistent data.
-
-
-
-
-
-
๐ Known Issues / Edge Cases
-
-
What happens if all custom statuses are deleted? (Should fall back to system default)
-
Can system statuses be set as default? (No, only custom statuses)
-
What if the default status is in use by many tasks and gets deleted? (Should reassign and set new default)
-
-
-
-
-
๐ Test Results
-
Record your test results here:
-
-
-
-
- โ All tests passed? If yes, mark task 15 as complete in the implementation plan!
-
The @update:open="closeDeleteDialog" was being called when the dialog closed for ANY reason, including clicking the Delete button. This cleared taskTypeToDelete BEFORE confirmDelete could use it.
-
-
The Fix:
-
Changed to: @update:open="(open) => { if (!open) closeDeleteDialog() }"
-
Now it only clears the value when the dialog is actually closing (open becomes false), not during the delete action.
-
-
Expected Behavior:
-
-
โ Click Delete button โ Dialog opens with task type name
-
โ Click Delete in dialog โ API call includes task type in URL
-
โ Success โ Dialog closes and list updates
-
โ Click Cancel โ Dialog closes and clears state
-
-
-
Test in Frontend:
-
-
Go to Project Settings โ Custom Task Types
-
Add a test task type (e.g., "test_fix")
-
Click the delete button for that task type
-
Open browser DevTools Network tab
-
Click "Delete" in the confirmation dialog
-
Check the DELETE request URL - it should now include the task type name
-
-
-
-
\ No newline at end of file
diff --git a/frontend/test-episode-dropdown.html b/frontend/test-episode-dropdown.html
deleted file mode 100644
index 7effb8c..0000000
--- a/frontend/test-episode-dropdown.html
+++ /dev/null
@@ -1,238 +0,0 @@
-
-
-
-
-
- Episode Dropdown - Simplified
-
-
-
-
-
โจ Episode Dropdown - Simplified
-
- The episode dropdown has been simplified to show basic episode names for better usability and performance.
-
-
-
-
-
โ Before (Complex)
-
-
- ๐
- All Episodes
-
-
-
- 75%
- 3 eps
- 12 shots
-
-
-
-
-
- โฐ
- Episode 1
-
-
-
- 40%
- 4 shots
-
-
-
-
- โถ๏ธ
- Episode 2
-
-
-
- 80%
- 5 shots
-
-
-
-
- โ
- Episode 3
-
-
-
- 100%
- 3 shots
-
-
-
-
-
-
โ After (Simple)
-
-
All Episodes
-
-
-
-
Episode 1
-
-
-
Episode 2
-
-
-
Episode 3
-
-
-
-
-
-
โจ Benefits of Simplification
-
-
Cleaner UI: Less visual clutter makes it easier to scan and select episodes
-
Faster Loading: No need to calculate progress or render complex components
-
Better Performance: Simpler rendering with fewer DOM elements
-
Easier to Read: Episode names are the primary focus
-
Standard Pattern: Follows common dropdown UI conventions
-
Mobile Friendly: Simpler items work better on smaller screens
-
-
-
-
- ๐ Note: All functionality remains intact - episode selection, sorting, filtering,
- and the create episode option all work exactly the same way. Only the visual presentation has been simplified.
-
-
-
-
What Changed
-
-
Removed status icons (Clock, Play, Pause, CheckCircle, XCircle)
-
Removed progress bars and percentages
-
Removed shot count badges
-
Removed episode count and total shot count from "All Episodes"
-
Simplified to show only episode names
-
-
-
-
-
โ Implementation Complete
-
- The episode dropdown now uses a clean, simple design that focuses on episode names.
- This improves usability and performance while maintaining all core functionality.
-
-Episodes:
-- ID: 1, Name: "Episode C - The Final Battle"
-- ID: 2, Name: "Episode A - The Beginning"
-- ID: 3, Name: "Episode B - The Journey"
-
-Shots:
-- Shot_001 (Episode ID: 1) โ "Episode C - The Final Battle"
-- Shot_002 (Episode ID: 2) โ "Episode A - The Beginning"
-- Shot_003 (Episode ID: 3) โ "Episode B - The Journey"
-
-
-
Before Fix (sorting by ID): Shot_001, Shot_002, Shot_003
-
After Fix (sorting by name): Shot_002, Shot_003, Shot_001
-
Now the visual order matches alphabetical episode names!
-
-
-
-
๐ง TanStack Table accessorFn
-
The fix uses TanStack Table's accessorFn instead of accessorKey:
-
-// accessorKey - uses a simple property path
-accessorKey: 'episode_id' // Gets row.episode_id
-
-// accessorFn - uses a custom function to extract the sort value
-accessorFn: (row) => {
- const episode = meta.episodes.find((e) => e.id === row.episode_id)
- return episode ? episode.name : `Episode ${row.episode_id}`
-}
-
-
This allows us to sort by the computed episode name while still accessing the episode_id from the data.
โ Replaced accessorKey: 'episode_id' with accessorFn
-
โ Now sorts by episode name instead of episode ID
-
โ Maintains same visual display
-
โ Preserves all existing functionality
-
-
-
-
-
๐งช Testing Instructions
-
To verify the episode sorting fix works correctly:
-
-
Navigate to Shot Table: Go to any project's shots page with multiple episodes
-
Check Episode Names: Ensure you have shots from episodes with different names (not just "Episode 1", "Episode 2")
-
Test Episode Sort: Click on the "Episode" column header
-
Verify Ascending: First click should sort episodes alphabetically AโZ by episode name
-
Verify Descending: Second click should sort episodes reverse alphabetically ZโA by episode name
-
Check Visual Order: The displayed episode names should be in alphabetical order, not numeric ID order
-
Test with Mixed Names: Works best with episodes like "Episode A - Intro", "Episode C - Finale", "Episode B - Middle"
-
-
-
-
-
๐ฏ Expected Behavior
-
After the fix, clicking the Episode column header should:
-
-1. No Sort (โ) โ Original data order
-2. Ascending (โ) โ Episodes sorted A-Z by name: "Episode A", "Episode B", "Episode C"
-3. Descending (โ) โ Episodes sorted Z-A by name: "Episode C", "Episode B", "Episode A"
-4. Back to No Sort (โ) โ Original data order
-
-
Note: The sort is now based on episode names, not episode IDs, so the visual order will match the alphabetical order of episode names.
-
-
-
-
๐ Related Improvements
-
This fix also ensures:
-
-
Consistency: Sort behavior matches what users see
-
Usability: Users can sort episodes alphabetically by name
-
Flexibility: Works with any episode naming convention
-
Performance: Efficient lookup using episode metadata
Result: Episode column now sorts by episode name instead of episode ID
-
Impact: Episode sorting now works as expected and matches visual display
-
Status: Ready for testing
-
-
-
-
\ No newline at end of file
diff --git a/frontend/test-error-fix.html b/frontend/test-error-fix.html
deleted file mode 100644
index 947ee05..0000000
--- a/frontend/test-error-fix.html
+++ /dev/null
@@ -1,139 +0,0 @@
-
-
-
-
-
- Error Fix Verification
-
-
-
-
-
๐ง Error Fix Verification
-
-
-
โ Issue Identified
-
The browser console was showing this error:
-
-Error: A <SelectItem /> must have a value prop that is not an empty string.
-This is because the Select value can be set to an empty string to clear the selection and show the placeholder.
-
-
This was caused by the TaskStatusFilter component having a SelectItem with value="" (empty string).
-
-
-
-
โ Fix Applied
-
The issue has been resolved by:
-
-
Changed value="" to value="all" for the "All Tasks" option
-
Updated the filter logic to convert "all" to empty string for the API
-
Fixed the clear button visibility condition
-
Updated the default selected value to "all"
-
-
-
-
-
๐งช Test Instructions
-
To verify the fix:
-
-
Open the VFX Project Management app: http://localhost:5174
-
Login with: admin@vfx.com / admin123
-
Navigate to a project and click the Assets tab
-
Check the browser console - there should be no errors
-
Verify that the task status filter dropdown works without errors
-
Confirm that task status columns are visible in the table
-
-
-
-
-
๐ Expected Behavior
-
After the fix, you should see:
-
-
โ No console errors when navigating to Assets tab
-
โ Task status filter dropdown works properly
-
โ "All Tasks" option is selected by default
-
โ Task status columns (Modeling, Surfacing, Rigging) are visible
-
โ Task status badges are clickable and editable
-
โ Filtering by task status works correctly
-
-
-
-
-
๐ฏ Task Status Features Working
-
All the implemented task status features should now be functional:
-
-
Task Status Columns: Individual columns for each task type
-
Color-coded Badges: Visual status indicators
-
Editable Status: Click to change task status
-
Category Awareness: Rigging only for Characters/Vehicles
-
Filtering: Filter assets by task status
-
Sorting: Sort by task status columns
-
Toggle: Show/hide task status columns
-
Session Persistence: Remember user preferences
-
-
-
-
-
๐ Current Status
-
Checking application status...
-
-
-
-
-
-
\ No newline at end of file
diff --git a/frontend/test-frame-columns-fix.html b/frontend/test-frame-columns-fix.html
deleted file mode 100644
index 22edf61..0000000
--- a/frontend/test-frame-columns-fix.html
+++ /dev/null
@@ -1,283 +0,0 @@
-
-
-
-
-
- Frame Columns Fix Test
-
-
-
-
๐ง Frame Columns & Sort Icons Fix
-
-
-
โ Issues Identified
-
Multiple Problems Found:
-
-
Sort Icons Broken: getSortIcon function was corrupted by autofix - showing wrong icons
-
Frame Range Sortable: Frame Range column should not be sortable (display only)
-
Frame Count Sort Wrong: Frames column was sorting by frame_end instead of calculated frame count
-
-
-
-
\ No newline at end of file
diff --git a/frontend/test-popover-fix-verification.html b/frontend/test-popover-fix-verification.html
deleted file mode 100644
index e1f4b50..0000000
--- a/frontend/test-popover-fix-verification.html
+++ /dev/null
@@ -1,305 +0,0 @@
-
-
-
-
-
- Popover Fix Verification
-
-
-
-
-
โ Popover Fix Applied
-
-
-
๐ง Changes Made
-
-
-
1. Removed v-model:open Binding
-
Fixed: Removed v-model:open="isAssignmentPopoverOpen" from Popover component
-
Reason: This binding was preventing the popover from opening naturally
-
-
-
-
2. Removed Reactive State
-
Fixed: Removed isAssignmentPopoverOpen ref
-
Reason: No longer needed since popover manages its own state
-
-
-
-
3. Replaced Watcher with Click Handler
-
Fixed: Replaced popover state watcher with @click="ensureMembersLoaded"
-
Reason: Load members when button is clicked instead of when popover opens
-
-
-
-
4. Simplified Popover Closing
-
Fixed: Removed manual popover closing in assignment handler
-
Reason: Let popover close naturally (clicking outside or on assignment)
-
-
-
-
-
๐งช Testing Instructions
-
-
-
Step 1: Navigate to Shots Table
-
-
Go to any project's shots page
-
Make sure you're in table view
-
Look for task status columns (Animation, Lighting, etc.)
-
-
-
-
-
Step 2: Test Popover Opening
-
-
Find assignment buttons (๐ค user icon or ๐ต avatar)
-
Click on any assignment button
-
Expected: Popover should open immediately
-
Expected: You should see "Assign Task" header
-
-
-
-
-
Step 3: Verify Content Loading
-
-
Check debug info shows project ID and member count
-
Verify loading spinner appears if needed
-
Confirm project members list loads
-
Check console for loading messages
-
-
-
-
-
Step 4: Test Assignment
-
-
Click on a project member in the list
-
Expected: Task gets assigned
-
Expected: Button shows assigned user's avatar
-
Expected: Success toast notification appears
-
-
-
-
-
-
๐ Console Messages to Look For
-
-
-
When Clicking Assignment Button
-
Ensuring project members are loaded
-Loading project members on button click (if not already loaded)
-Loading project members for project: [PROJECT_ID]
-Loaded project members: [ARRAY_OF_MEMBERS]
-
-
-
-
When Assigning a Task
-
// API calls in Network tab:
-POST /shots/[SHOT_ID]/tasks (if task doesn't exist)
-PUT /tasks/[TASK_ID]/assign (for assignment)
-PUT /tasks/[TASK_ID] (for unassignment)
-
-
-
-
-
๐ ๏ธ Interactive Testing
-
-
-
-
-
-
-
Test Results:
-
-
-
-
-
-
โ Success Criteria
-
-
-
The fix is successful if:
-
-
โ Assignment buttons are clickable
-
โ Popover opens when clicking assignment buttons
-
โ Popover shows "Assign Task" header
-
โ Debug info displays project ID and member count
-
โ Project members list loads and displays
-
โ Assignment functionality works (click member to assign)
-
โ Unassignment works (click "Unassign")
-
โ Visual feedback (avatar changes) occurs
-
โ Success toast notifications appear
-
โ No JavaScript errors in console
-
-
-
-
-
-
๐จ If Still Not Working
-
-
-
Additional Debugging Steps
-
-
Check browser console for JavaScript errors
-
Verify you're on the correct page (shots table view)
-
Try refreshing the page
-
Check if backend is running (should be on localhost:8000)
-
Verify user has proper permissions
-
Test in a different browser
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/frontend/test-popover-simple-fix.html b/frontend/test-popover-simple-fix.html
deleted file mode 100644
index f84826a..0000000
--- a/frontend/test-popover-simple-fix.html
+++ /dev/null
@@ -1,242 +0,0 @@
-
-
-
-
-
- Simple Popover Fix Test
-
-
-
-
-
๐ง Simple Popover Fix
-
-
-
๐ฏ Identified Issue
-
The problem might be with the v-model:open binding on the Popover component. Let's test different approaches.
Check that the sidebar shows "Recovery Management" under Administration
-
Click on "Recovery Management" and verify:
-
-
URL is /admin/deleted-items
-
Browser tab title is "Recovery Management - VFX Studio"
-
Page title is "Recovery Management"
-
All text uses recovery-focused language
-
-
-
Test that bookmarking the page uses the correct title
-
-
-
-
-
Status
-
โ Task 1 Complete: All navigation and routing terminology has been successfully updated to use "Recovery Management" while preserving backward compatibility.
-
-
-
\ No newline at end of file
diff --git a/frontend/test-response-format-validation.html b/frontend/test-response-format-validation.html
deleted file mode 100644
index df332db..0000000
--- a/frontend/test-response-format-validation.html
+++ /dev/null
@@ -1,715 +0,0 @@
-
-
-
-
-
- Response Format Validation Test
-
-
-
-
Frontend Response Format Validation Test
-
Task: 12. Frontend Response Format Validation
-
Requirements: 4.1, 4.2, 4.3 - Verify optimized endpoints return embedded task_statuses and frontend components can consume the data
-
-
-
Test Summary
-
-
Endpoints Tested: 0
-
-
-
Response Format Tests: 0
-
-
-
Component Tests: 0
-
-
-
Overall Status: Testing...
-
-
-
-
-
1. Backend Endpoint Response Format Validation
-
Testing that all optimized endpoints return embedded task_statuses field with complete information
-
-
-
-
Shots List Endpoint
-
-
Testing GET /api/shots/...
-
-
-
-
-
Assets List Endpoint
-
-
Testing GET /api/assets/...
-
-
-
-
-
Single Shot Endpoint
-
-
Testing GET /api/shots/{id}...
-
-
-
-
-
Single Asset Endpoint
-
-
Testing GET /api/assets/{id}...
-
-
-
-
-
-
-
2. Response Data Structure Validation
-
Validating that embedded task status data includes all required fields
-
-
-
-
-
3. Frontend Component Consumption Test
-
Testing that frontend components can properly consume the optimized data format
-
-
-
-
-
4. Performance and Optimization Validation
-
Verifying that optimized queries reduce API calls and improve performance
-
-
-
-
-
Test Results
-
-
-
-
-
-
\ No newline at end of file
diff --git a/frontend/test-services-soft-deletion.html b/frontend/test-services-soft-deletion.html
deleted file mode 100644
index 805f5f5..0000000
--- a/frontend/test-services-soft-deletion.html
+++ /dev/null
@@ -1,101 +0,0 @@
-
-
-
-
-
- Test Soft Deletion Services
-
-
-
-
Soft Deletion Services Test
-
-
-
Service Import Test
-
-
-
-
-
Error Handling Test
-
-
-
-
-
-
\ No newline at end of file
diff --git a/frontend/test-set-default-status.html b/frontend/test-set-default-status.html
deleted file mode 100644
index e57fc2c..0000000
--- a/frontend/test-set-default-status.html
+++ /dev/null
@@ -1,171 +0,0 @@
-
-
-
-
-
- Quick Test: Set Default Status
-
-
-
-
-
๐ฏ Quick Test: Set Default Status
-
Follow these steps to verify the "Set as Default" functionality works correctly.
-
-
-
Step 1: Navigate to Custom Task Status Manager
-
-
Login to the application as a coordinator or admin
-
Navigate to any project
-
Click on "Settings" in the sidebar
-
Go to the "Tasks" tab
-
Scroll to the "Custom Task Statuses" section
-
-
-
-
-
Step 2: Create Test Statuses (if needed)
-
-
If you don't have at least 2 custom statuses, click "Add Status"
-
Create a status named "In Review" with any color
-
Create another status named "Approved" with any color
-
-
- Expected: You should now have at least 2 custom statuses in the list.
-
-
-
-
-
Step 3: Identify Current Default
-
-
Look at the custom statuses list
-
Find which status has the "Default" badge with a star icon
-
Note which status is currently the default
-
-
- Expected: One status should have a badge that says "Default" with a star icon. Other statuses should show "Custom" badge.
-
-
-
-
-
Step 4: Set a Different Status as Default
-
-
Find a status that is NOT currently the default
-
Verify it has a "Set as Default" button (with star icon)
-
Click the "Set as Default" button
-
Wait for the operation to complete
-
-
- Expected:
-
-
A success toast message appears: "[Status Name] is now the default status for new tasks"
-
The clicked status now shows the "Default" badge
-
The previous default status now shows "Custom" badge
-
The "Set as Default" button disappears from the new default status
-
The "Set as Default" button appears on the previous default status
-
-
-
-
-
-
Step 5: Verify Only One Default
-
-
Count how many statuses have the "Default" badge
-
Verify only ONE status is marked as default
-
-
- Expected: Exactly one status should have the "Default" badge at any time.
-
-
-
-
-
Step 6: Test via Edit Dialog
-
-
Click the edit button (pencil icon) on a non-default status
-
Verify the "Set as default status for new tasks" checkbox is present
-
Check the checkbox
-
Click "Update Status"
-
Verify the status is now marked as default in the list
-
-
- Expected: The edit dialog checkbox should also work for setting default status.
-
-
-
-
-
Step 7: Verify New Tasks Use Default
-
-
Note which status is currently the default
-
Navigate to a shot or asset in the project
-
Create a new task (don't specify a status)
-
Check what status the new task has
-
-
- Expected: The new task should automatically have the default status you set.
-
-
-
-
- โ Test Complete!
- If all steps passed, the default status management feature is working correctly.
-
Successfully implemented shadcn-vue DatePicker components for the project creation form:
-
-
โ Installed shadcn-vue calendar components
-
โ Created custom DatePicker component using Calendar + Popover
-
โ Integrated DatePicker into ProjectsView.vue
-
โ Maintained all existing functionality (defaults, validation, auto-update)
-
โ No TypeScript errors
-
-
-
-
-
Components Created
-
-
DatePicker.vue
-
Custom component that combines:
-
-
Popover - For the dropdown container
-
PopoverTrigger - Button that opens the calendar
-
PopoverContent - Container for the calendar
-
Calendar - The actual date picker calendar
-
Button - Styled trigger button with calendar icon
-
-
-
Key Features
-
-
String Date Handling: Works with YYYY-MM-DD format strings
-
Date Formatting: Displays dates in readable format (e.g., "Dec 12, 2024")
-
Validation Support: Supports min/max date constraints
-
Accessibility: Full keyboard navigation and screen reader support
-
Consistent Styling: Matches shadcn-vue design system
-
-
-
-
-
Integration Details
-
-
ProjectsView.vue Changes
-
-
Replaced native <input type="date"> with <DatePicker>
-
Added DatePicker import from @/components/ui/date-picker
-
Maintained all existing form logic and validation
-
Preserved default date values and auto-update functionality
-
-
-
Dependencies
-
-
@internationalized/date - For date parsing and formatting
-
lucide-vue-next - For calendar icon
-
reka-ui - Base components (Calendar, Popover)
-
-
-
-
-
Testing Instructions
-
-
Navigate to the Projects page
-
Click "New Project" button
-
Verify start date shows today's date in the button
-
Verify end date shows 1 month from today
-
Click on a date picker button to open the calendar popup
-
Navigate through months using the arrow buttons
-
Select a different date and verify it updates the button text
-
Change start date and verify end date auto-updates (for new projects)
-
Try setting end date before start date and verify validation error
-
Test editing an existing project to ensure dates don't auto-update
-
-
-
-
-
Benefits of shadcn-vue DatePicker
-
-
Better UX: Calendar popup is more intuitive than native date inputs
-
Consistent Design: Matches the application's design system
-
Cross-platform: Works consistently across all browsers and devices
-
Accessibility: Better keyboard navigation and screen reader support
-
Customizable: Easy to extend with additional features
-
Mobile-friendly: Better touch interaction than native inputs
-
-
-
-
-
-
\ No newline at end of file
diff --git a/frontend/test-shot-bulk-status-change.html b/frontend/test-shot-bulk-status-change.html
deleted file mode 100644
index 317096b..0000000
--- a/frontend/test-shot-bulk-status-change.html
+++ /dev/null
@@ -1,225 +0,0 @@
-
-
-
-
-
- Shot Bulk Status Change Test
-
-
-
-
Shot Table Bulk Task Status Change - Test Plan
-
-
-
๐ฏ Feature Overview
-
This test verifies the bulk task status change functionality for the shot data table, similar to the existing task data table implementation.
-
-
Key Features Implemented:
-
-
Bulk status change buttons appear in task status column headers when shots are selected
-
Popover with colored status badges for each task status option
-
Selection count tracking to show/hide bulk action buttons
-
Bulk update functionality that changes status for all selected shots
-
Toast notifications for successful bulk updates
-
Error handling for failed bulk operations
-
-
-
-
-
๐งช Test Scenarios
-
-
Test 1: Bulk Status Change Button Visibility
-
-
-
Navigate to the shot table view
-
Ensure no shots are selected initially
-
Verify that task status column headers show only the column name and sort icon
-
Select one or more shots using checkboxes
-
Verify that task status column headers now show a dropdown button (ChevronDown icon)
-
Deselect all shots
-
Verify that dropdown buttons disappear
-
-
-
- Expected: Bulk action buttons appear/disappear based on selection state
-
-
-
Test 2: Bulk Status Change Popover
-
-
-
Select multiple shots (2-3 shots)
-
Click the dropdown button in any task status column header
-
Verify popover opens with title "Change [TaskType] Status"
-
Verify all task status options are shown as colored badges:
-
-
Not Started (secondary)
-
In Progress (default)
-
Submitted (outline)
-
Approved (default)
-
Retake (destructive)
-
-
-
Click outside popover to close it
-
-
-
- Expected: Popover shows correctly formatted status options with proper colors
-
-
-
Test 3: Bulk Status Update Functionality
-
-
-
Select 2-3 shots with different current task statuses
-
Note the current status of each selected shot for a specific task type
-
Click the bulk action button for that task type
-
Select a different status from the popover (e.g., "In Progress")
-
Verify popover closes automatically
-
Verify all selected shots now show the new status for that task type
-
Verify success toast appears with message like "Updated [TaskType] status for X shots"
-
-
-
- Expected: All selected shots update to the new status with success notification
-
-
-
Test 4: Multiple Task Types
-
-
-
Select multiple shots
-
Verify bulk action buttons appear in ALL visible task type columns
-
Test bulk update for different task types (e.g., Animation, Lighting, Compositing)
-
Verify each task type can be updated independently
-
Verify updates don't affect other task types
-
-
-
- Expected: Each task type column has independent bulk update functionality
-
-
-
Test 5: Error Handling
-
-
-
Try to use bulk action without selecting any shots
-
Verify appropriate error message appears
-
Test with network disconnected (if possible)
-
Verify error handling for failed API calls
-
-
-
- Expected: Appropriate error messages for edge cases
-
-
-
-
-
๐ง Implementation Details
-
-
Files Modified:
-
-frontend/src/components/shot/columns.ts
-- Added bulk status change button in task column headers
-- Added popover with status badges
-- Added selection count checking
-
-frontend/src/components/shot/ShotBrowser.vue
-- Added selectedShotIds tracking
-- Added getSelectedCount() function
-- Added handleBulkTaskStatusChange() function
-- Updated createStableMeta() with new callbacks
-
-
-
Key Components Used:
-
-
Popover/PopoverContent/PopoverTrigger for dropdown UI
-
TaskStatusBadge for colored status display
-
ChevronDown icon for dropdown button
-
Toast notifications for user feedback
-
-
-
-
-
โ Acceptance Criteria
-
-
Bulk action buttons only appear when shots are selected (count > 0)
-
Each task type column has its own independent bulk action button
-
Popover shows all available task statuses with proper colors
-
Bulk updates work correctly for multiple selected shots
-
Success/error notifications provide appropriate feedback
-
UI matches the existing task table bulk action pattern
-
Performance remains smooth with multiple selections
-
-
-
-
-
๐ Ready for Testing
-
The bulk task status change functionality has been implemented for the shot data table. The feature follows the same pattern as the existing task data table implementation and provides:
-
-
Conditional UI: Bulk action buttons appear only when shots are selected
-
Intuitive Interface: Dropdown buttons in task column headers with colored status badges
-
Bulk Operations: Update task status for multiple shots simultaneously
-
User Feedback: Toast notifications for success/error states
-
Consistent Design: Matches existing UI patterns and styling
-
-
-
Next Steps: Test the functionality in the application to ensure it works as expected and provides a smooth user experience.
-
-
-
\ No newline at end of file
diff --git a/frontend/test-shot-bulk-status-consistency.html b/frontend/test-shot-bulk-status-consistency.html
deleted file mode 100644
index 78cff11..0000000
--- a/frontend/test-shot-bulk-status-consistency.html
+++ /dev/null
@@ -1,267 +0,0 @@
-
-
-
-
-
- Shot Bulk Status Consistency Test
-
-
-
-
Shot Bulk Status Consistency - Test Plan
-
-
-
๐ฏ Issue Fixed
-
The bulk task status change popover was showing only system statuses (TaskStatus enum values) while the individual EditableTaskStatus components showed both system and custom statuses from the task statuses store.
-
-
Root Cause:
-
-
Bulk popover used Object.values(TaskStatus) - only system statuses
-
EditableTaskStatus used taskStatusesStore.getAllStatusOptions() - system + custom statuses
-
Store was being accessed incorrectly inside column definition (no Vue context)
-
-
-
-
-
๐ง Solution Implemented
-
-
Changes Made:
-
-
Updated ShotColumnMeta interface to include getAllStatusOptions callback
-
Modified ShotBrowser to provide status options from taskStatusesStore
-
Added loadTaskStatuses() function to load custom statuses on project change
-
Updated bulk popover to use same status source as EditableTaskStatus
-
Ensured TaskStatusBadge component consistency across both interfaces
-
-
-
-// Before (only system statuses):
-Object.values(TaskStatus).map((status) => ...)
-
-// After (system + custom statuses):
-meta.getAllStatusOptions?.().map((statusOption) => ...)
-
-
-
-
-
๐งช Test Scenarios
-
-
Test 1: Status List Consistency
-
-
-
Navigate to shot table with task columns visible
-
Click on any individual task status dropdown (EditableTaskStatus)
-
Note the available status options and their colors
-
Close the dropdown
-
Select multiple shots
-
Click the bulk action button in the same task column header
-
Compare the status options in the bulk popover
-
-
-
- Expected: Both lists should be identical - same statuses, same colors, same order
-
-
-
Test 2: Custom Status Support
-
-
-
Ensure the project has custom task statuses configured
Automatic custom status support in bulk operations
-
Consistent colors and styling across interfaces
-
Proper Vue reactivity and store integration
-
Future-proof for new custom statuses
-
-
-
-
-
โ Acceptance Criteria
-
-
Bulk popover shows identical status list as individual EditableTaskStatus
-
Custom task statuses appear in both individual and bulk interfaces
-
Status colors and styling are consistent across both interfaces
-
TaskStatusBadge component renders identically in both contexts
-
Bulk operations work with both system and custom statuses
-
Status list updates automatically when custom statuses change
-
No console errors or warnings related to store access
-
-
-
-
-
๐ Ready for Testing
-
The shot bulk status change functionality now uses the same task status source as the individual EditableTaskStatus components, ensuring complete consistency between individual and bulk operations.
-
-
Key Improvement: Users will now see the same comprehensive list of task statuses (including custom ones) in both the individual dropdowns and bulk action popovers, providing a unified and consistent experience across the application.
-
-
-
\ No newline at end of file
diff --git a/frontend/test-shot-bulk-status-final-verification.html b/frontend/test-shot-bulk-status-final-verification.html
deleted file mode 100644
index 63cf2e6..0000000
--- a/frontend/test-shot-bulk-status-final-verification.html
+++ /dev/null
@@ -1,179 +0,0 @@
-
-
-
-
-
- Shot Bulk Status Change - Final Verification
-
-
-
-
Shot Bulk Status Change - Final Verification
-
-
-
โ Implementation Complete
-
The bulk task status change functionality has been successfully implemented with the following features:
-
-
-
Bulk action buttons appear in task column headers when shots are selected
-
Popover shows colored TaskStatusBadge components for all available statuses
-
Status list matches EditableTaskStatus component (includes custom statuses)
-
Selection persists after bulk operations (no automatic clearing)
-
Detail panel toggle button shows primary color when enabled
Control: Users decide when to clear selection, not the system
-
Consistency: Matches expected behavior from other bulk operation interfaces
-
Productivity: Faster batch processing of shot task statuses
-
-
-
-
-
๐ฏ Edge Cases to Test
-
-
Selection Behavior:
-
-
Bulk operation with single shot selected
-
Bulk operation with all shots selected
-
Partial deselection after bulk operation
-
New shot selection after bulk operation
-
Page refresh with active selection
-
-
-
Error Scenarios:
-
-
Bulk operation fails - selection should persist
-
Network error during bulk operation
-
Partial success in bulk operation
-
-
-
-
-
โ Acceptance Criteria
-
-
Bulk action buttons remain visible after successful bulk operations
-
Shot selection persists after bulk status changes
-
Users can perform multiple bulk operations without re-selecting
-
Manual selection controls (checkboxes) work normally
-
Header "select all" checkbox works normally
-
Bulk buttons disappear only when selection count reaches 0
-
Success toast appears for each bulk operation
-
No console errors or unexpected behavior
-
-
-
-
-
๐ Ready for Testing
-
The bulk task status change functionality now maintains selection persistence, allowing users to perform multiple bulk operations efficiently without losing their shot selection.
-
-
Key Improvement: Users can now select a group of shots once and perform multiple bulk status changes across different task types, significantly improving workflow efficiency for batch operations.
-
-
-
\ No newline at end of file
diff --git a/frontend/test-shot-column-visibility-debug.html b/frontend/test-shot-column-visibility-debug.html
deleted file mode 100644
index 63c3b86..0000000
--- a/frontend/test-shot-column-visibility-debug.html
+++ /dev/null
@@ -1,258 +0,0 @@
-
-
-
-
-
- Shot Column Visibility Debug
-
-
-
-
๐ Shot Column Visibility Debug
-
-
- Issue: Column Visibility Control in ShotTableToolbar is using direct popover but not showing all task type columns including custom task types.
-
- The issue is likely that allColumns is not reactive to changes in props.allTaskTypes.
- It should be a computed property instead of a static array.
-
Automatically includes custom task types when loaded
-
Maintains proper column visibility state
-
Consistent with Vue 3 reactivity patterns
-
-
-
-
-
๐ Implementation Plan
-
-
-
Update ShotTableToolbar.vue: Make allColumns a computed property
-
Add Debug Logging: Verify task types are loaded correctly
-
Test Column Visibility: Ensure all task types appear in popover
-
Verify Reactivity: Check that adding custom task types updates columns
-
-
-
-
-
-
\ No newline at end of file
diff --git a/frontend/test-shot-column-visibility-fix.html b/frontend/test-shot-column-visibility-fix.html
deleted file mode 100644
index 0728b06..0000000
--- a/frontend/test-shot-column-visibility-fix.html
+++ /dev/null
@@ -1,216 +0,0 @@
-
-
-
-
-
- Shot Column Visibility Fix
-
-
-
-
โ Shot Column Visibility Fix
-
-
- FIXED: Column Visibility Control in ShotTableToolbar now properly shows all task type columns including custom task types.
-
-
-
-
๐ง Problem Identified
-
-
The issue was that allColumns was defined as a static array that used props.allTaskTypes at component initialization time. Since task types are loaded asynchronously, the initial allTaskTypes was empty, and the static array never updated when the task types were loaded.
-
-
Root Cause
-
-
Timing Issue: Component renders before task types are loaded
-
Reactivity Issue: Static array doesn't react to prop changes
-
Async Loading: Task types loaded after component initialization
-
-
-
-
-
๐ ๏ธ Solution Applied
-
-
Changed allColumns from Static Array to Computed Property
UI Update: Column visibility popover shows all columns including custom types
-
-
-
-
-
๐งช Testing Scenarios
-
-
Test Cases to Verify
-
-
Initial Load: Column visibility shows all standard columns
-
After Task Types Load: Custom task type columns appear in visibility control
-
Add Custom Task Type: New columns appear immediately in visibility control
-
Remove Custom Task Type: Columns are removed from visibility control
-
Column Toggle: All columns (standard + custom) can be toggled on/off
-
-
-
Expected Behavior
-
-
Column visibility popover shows all available columns
-
Custom task type columns appear with proper capitalization
-
Column visibility state is preserved correctly
-
Badge shows correct count of hidden columns
-
-
-
-
-
๐ Files Modified
-
-
-frontend/src/components/shot/ShotTableToolbar.vue
-โโโ Changed allColumns from static array to computed property
-โโโ Updated hiddenColumnsCount to use allColumns.value
-โโโ Maintained existing template structure (no changes needed)
-
-
-
-
- SUCCESS: Shot Column Visibility Control now properly displays all task type columns including custom task types. The fix ensures reactive updates when task types are loaded asynchronously.
-
-
-
-
-
\ No newline at end of file
diff --git a/frontend/test-shot-column-visibility-unification.html b/frontend/test-shot-column-visibility-unification.html
deleted file mode 100644
index 8b70ddf..0000000
--- a/frontend/test-shot-column-visibility-unification.html
+++ /dev/null
@@ -1,186 +0,0 @@
-
-
-
-
-
- Shot Column Visibility - Unified with Task Page
-
-
-
-
Shot Column Visibility - Unified with Task Page โ
-
-
-
โ Implementation Complete
-
The shot page column visibility filter now uses the same UI pattern as the task page, providing a consistent user experience across the application.
This provides a consistent, familiar experience for users switching between different data tables in the application.
-
-
-
-
โ Status: Complete
-
The shot page column visibility filter now uses the same view filter component pattern as the task page. Users will experience consistent UI behavior across all data tables in the application.
-
-
-
\ No newline at end of file
diff --git a/frontend/test-shot-delete-alert-components.html b/frontend/test-shot-delete-alert-components.html
deleted file mode 100644
index ca1bf2e..0000000
--- a/frontend/test-shot-delete-alert-components.html
+++ /dev/null
@@ -1,249 +0,0 @@
-
-
-
-
-
- Shot Delete Dialog - Alert Components Test
-
-
-
-
-
-
-
-
Shot Delete Dialog - Alert Components Test
-
-
-
-
Error State
-
-
-
-
Failed to load deletion information
-
Unable to connect to the server. Please check your connection and try again.
-
-
-
-
-
-
-
Affected Users Warning
-
-
-
-
3 users will be affected
-
-
The following users have work associated with this shot that will be marked as deleted:
-
-
-
-
John Smith
-
john.smith@studio.com โข Artist
-
-
-
2 tasks
-
1 submission
-
Last active: Dec 14, 2025
-
-
-
-
-
Sarah Johnson
-
sarah.johnson@studio.com โข Director
-
-
-
1 task
-
3 notes
-
Last active: Dec 13, 2025
-
-
-
-
-
-
-
-
-
-
-
No Affected Users
-
-
-
-
- No users will be affected by this deletion.
-
-
-
-
-
-
-
-
Data Preservation Notice
-
-
-
-
Data Preservation
-
- All data will be preserved in the database and can be recovered by administrators.
- Files will remain on the server unchanged. This is a soft deletion, not permanent removal.
-
-
-
-
-
-
-
-
Complete Dialog Preview
-
-
-
-
Soft Delete Shot: SH001_Opening
-
-
- This will mark the shot and all related data as deleted while preserving it for potential recovery.
- The data will be hidden from normal operations but can be restored by administrators.
-
-
-
-
-
-
Deletion Impact Summary
-
-
- 5 tasks
-
-
- 3 submissions
-
-
- 2 attachments
-
-
- 7 notes
-
-
- 1 review
-
-
- 2.5 MB files
-
-
-
-
-
-
-
-
-
2 users will be affected
-
-
The following users have work associated with this shot that will be marked as deleted:
-
-
-
-
Alice Cooper
-
alice.cooper@studio.com โข Artist
-
-
-
3 tasks
-
2 submissions
-
-
-
-
-
-
-
-
-
-
-
-
Data Preservation
-
- All data will be preserved in the database and can be recovered by administrators.
- Files will remain on the server unchanged. This is a soft deletion, not permanent removal.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/frontend/test-shot-delete-debug.html b/frontend/test-shot-delete-debug.html
deleted file mode 100644
index e3fac6b..0000000
--- a/frontend/test-shot-delete-debug.html
+++ /dev/null
@@ -1,421 +0,0 @@
-
-
-
-
-
- Shot Delete Debug Test
-
-
-
-
-
-
-
-
Shot Delete Debug Test
-
-
-
-
Event Log
-
-
Events will be logged here...
-
-
-
-
-
-
-
Shot Table - Debug Test
-
-
-
-
-
Shot Name
-
Status
-
Actions
-
-
-
-
-
-
{{ shot.name }}
-
-
-
- {{ shot.status }}
-
-
-
-
-
-
-
-
-
- Edit Shot
-
-
-
- View Tasks
-
-
-
-
- Delete Shot
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Shot Detail Panel
-
-
-
-
-
{{ selectedShot.name }}
-
Status: {{ selectedShot.status }}
-
This panel should NOT open when clicking delete!
-
-
-
-
-
-
Debug Instructions
-
-
โข Row Click: Click on shot name or status - should open detail panel
-
โข Dropdown Button: Click three-dot menu - should NOT open detail panel
-
โข Edit/View Tasks: Click menu items - should NOT open detail panel
-
โข Delete Shot: Click "Delete Shot" - should NOT open detail panel (main issue)
-
โข Watch the event log to see what events are being triggered
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/frontend/test-shot-delete-detail-panel-fix.html b/frontend/test-shot-delete-detail-panel-fix.html
deleted file mode 100644
index f350fcf..0000000
--- a/frontend/test-shot-delete-detail-panel-fix.html
+++ /dev/null
@@ -1,182 +0,0 @@
-
-
-
-
-
- Shot Delete Detail Panel Fix Test
-
-
-
-
Shot Delete Detail Panel Fix - Test Guide
-
-
This document outlines the test cases to verify that the shot detail panel no longer opens when performing delete actions.
-
-
Problem Description
-
Previously, when clicking "Delete Shot" from the dropdown menu in the shots table, the shot detail panel would incorrectly open, causing confusion for users.
-
-
Solution Implemented
-
Added multiple layers of protection to prevent the detail panel from opening during delete operations:
-
-
-1. Enhanced event handling in ShotsDataTable.vue handleRowClick method
-2. Added dialog state checks in ShotBrowser.vue handleRowClick and handleRowDoubleClick
-3. Added dropdown menu state detection
-4. Comprehensive event propagation prevention in dropdown menu items
-
-
-
Test Cases
-
-
-
Test Case 1: Delete from Dropdown Menu
-
Steps:
-
-
Navigate to a project's shots view
-
Click the three-dot menu (โฏ) on any shot row
-
Click "Delete Shot" from the dropdown menu
-
-
Expected Result:
-
-
โ Delete confirmation dialog opens
-
โ Shot detail panel does NOT open
-
โ No unwanted navigation or panel changes
-
-
-
-
-
Test Case 2: Edit from Dropdown Menu
-
Steps:
-
-
Click the three-dot menu (โฏ) on any shot row
-
Click "Edit Shot" from the dropdown menu
-
-
Expected Result:
-
-
โ Edit dialog opens
-
โ Shot detail panel does NOT open
-
-
-
-
-
Test Case 3: View Tasks from Dropdown Menu
-
Steps:
-
-
Click the three-dot menu (โฏ) on any shot row
-
Click "View Tasks" from the dropdown menu
-
-
Expected Result:
-
-
โ Shot detail panel opens (this is intended behavior)
-
-
-
-
-
Test Case 4: Row Click (Normal Behavior)
-
Steps:
-
-
Click on an empty area of a shot row (not on buttons or interactive elements)
-
-
Expected Result:
-
-
โ Row selection changes (if applicable)
-
โ Shot detail panel does NOT open (single click should not open panel)
-
-
-
-
-
Test Case 5: Row Double Click
-
Steps:
-
-
Double-click on an empty area of a shot row
-
-
Expected Result:
-
-
โ Shot detail panel opens (this is intended behavior)
-
-
-
-
-
Test Case 6: Delete Dialog Interaction
-
Steps:
-
-
Open delete dialog for a shot
-
Try clicking on other shot rows while dialog is open
-
Cancel or complete the delete operation
-
-
Expected Result:
-
-
โ No row clicks are processed while dialog is open
-
โ Detail panel does not open during dialog interaction
-
-
-
-
Key Fixes Applied
-
-
-1. Dialog State Checks:
-// Don't handle row clicks if any dialog is open
-if (showDeleteDialog.value || showCreateDialog.value ||
- showBulkCreateDialog.value || showEditDialog.value) {
- return
-}
-
-2. Dropdown Menu State Detection:
-// If any dropdown is open, don't handle row clicks
-const openDropdown = document.querySelector(
- '[data-radix-dropdown-menu-content][data-state="open"]'
-)
-if (openDropdown) {
- return
-}
-
-3. Enhanced Event Propagation Prevention:
-onClick: (e: Event) => {
- e.stopPropagation()
- e.preventDefault()
- meta.onDelete(shot)
-}
-
-
-
Verification Checklist
-
-
โก Delete action opens only the delete dialog
-
โก Edit action opens only the edit dialog
-
โก View Tasks action opens the detail panel (intended)
โก No unwanted panel opening during any dropdown interactions
-
-
-
Note: If any test case fails, check the browser console for JavaScript errors and verify that all event handlers are properly preventing propagation.
-
-
\ No newline at end of file
diff --git a/frontend/test-shot-delete-dialog-status-fix.html b/frontend/test-shot-delete-dialog-status-fix.html
deleted file mode 100644
index 5fbdcb8..0000000
--- a/frontend/test-shot-delete-dialog-status-fix.html
+++ /dev/null
@@ -1,150 +0,0 @@
-
-
-
-
-
- Shot Delete Dialog - Custom Status Test
-
-
-
-
Shot Delete Dialog - Custom Status Enhancement Test
-
-
-
โ Implementation Summary
-
Enhanced the ShotDeleteConfirmDialog to properly display custom task statuses with correct names and colors:
-
-
Changes Made:
-
-
Added projectId prop to ShotDeleteConfirmDialog component
-
Imported customTaskStatusService to fetch project-specific task statuses
-
Added reactive state for allTaskStatuses
-
Created statusMap computed property for efficient status lookup
-
Added getStatusForTask function to map status IDs to proper status objects
-
Updated TaskStatusBadge usage to pass status objects instead of strings
-
Updated ShotBrowser to pass projectId to the dialog
-
-
-
-
-
๐ง Technical Implementation
-
-
Status Object Structure:
-
-{
- id: string, // Status ID (e.g., "not_started", "custom_status_1")
- name: string, // Display name (e.g., "Not Started", "In Review")
- color: string, // Hex color code (e.g., "#6b7280", "#f59e0b")
- is_system: boolean // Whether it's a system or custom status
-}
-
-
-
Status Mapping Logic:
-
-
Fetches all task statuses (system + custom) for the project on component mount
-
Creates a Map for efficient O(1) status lookup by ID
-
Falls back to string display if status not found in map
-
Passes proper status objects to TaskStatusBadge component
-
-
-
-
-
๐จ Visual Benefits
-
-
Custom Status Names: Shows proper display names instead of IDs
-
Custom Colors: Uses project-configured colors for custom statuses
-
Consistent Styling: Maintains consistent badge appearance across the app
-
Automatic Contrast: TaskStatusBadge automatically calculates text color for readability
-
-
-
-
-
๐ Component Flow
-
-
ShotBrowser passes projectId to ShotDeleteConfirmDialog
-
Dialog mounts and fetches all task statuses for the project
-
Status map is created from fetched data
-
For each task, getStatusForTask maps status ID to status object
-
TaskStatusBadge receives proper status object with name and color
-
Badge displays with correct name and custom color (if applicable)
-
-
-
-
-
๐ก๏ธ Error Handling
-
-
Network Errors: Gracefully handles API failures, falls back to string display
-
Missing Statuses: Falls back to original status ID if not found in map
-
Invalid Data: Component continues to work even with malformed status data
-
-
-
-
-
๐ Testing Checklist
-
-
โ Component compiles without TypeScript errors
-
โ Props interface updated to include projectId
-
โ Custom task status service imported and used
-
โ Status mapping logic implemented
-
โ TaskStatusBadge receives proper status objects
-
โ ShotBrowser passes projectId to dialog
-
โ Error handling for API failures
-
-
-
-
-
๐ฏ Expected Behavior
-
Before: Task statuses showed as raw IDs (e.g., "not_started", "custom_status_1")
-
After: Task statuses show proper names with custom colors (e.g., "Not Started", "In Review" with orange background)
-
-
The TaskStatusBadge component will now display:
-
-
System statuses with default colors and proper names
-
Custom statuses with project-configured colors and names
-
Automatic text color contrast for readability
-
Consistent badge sizing and styling
-
-
-
-
-
๐ Manual Testing Steps
-
-
Navigate to a project with custom task statuses configured
-
Go to the shots page and select a shot with tasks
-
Click the delete button on a shot
-
Verify the confirmation dialog shows tasks with proper status names and colors
-
Check that custom statuses display with their configured colors
-
Verify system statuses still display correctly
-
-
-
-
โ Shot Delete Dialog Custom Status Enhancement Complete!