298 lines
9.1 KiB
Markdown
298 lines
9.1 KiB
Markdown
# Custom Task Status Manager Implementation
|
|
|
|
## Overview
|
|
|
|
Implementation of the CustomTaskStatusManager component for displaying and managing custom task statuses in the project settings.
|
|
|
|
**Component:** `frontend/src/components/settings/CustomTaskStatusManager.vue`
|
|
|
|
**Task:** Task 11 from `.kiro/specs/vfx-project-management/custom-task-status-tasks.md`
|
|
|
|
**Requirements:** 1.1, 8.1, 8.2, 8.3
|
|
|
|
## Features Implemented
|
|
|
|
### 1. Status List Display ✅
|
|
|
|
The component displays two sections:
|
|
|
|
#### System Statuses Section
|
|
- Shows all built-in system statuses (not_started, in_progress, submitted, approved, retake)
|
|
- Each status displays:
|
|
- Color indicator (colored circle)
|
|
- Status name (formatted with spaces instead of underscores)
|
|
- "System" badge
|
|
- Task count
|
|
- System statuses have a light gray background to distinguish them from custom statuses
|
|
- System statuses cannot be edited or deleted
|
|
|
|
#### Custom Statuses Section
|
|
- Shows all custom statuses defined for the project
|
|
- Each status displays:
|
|
- Color indicator (colored circle)
|
|
- Status name
|
|
- "Default" badge with star icon (if it's the default status)
|
|
- "Custom" badge (if not default)
|
|
- Task count
|
|
- Edit button (pencil icon)
|
|
- Delete button (trash icon)
|
|
- Custom status rows have hover effects
|
|
- Empty state message when no custom statuses exist
|
|
|
|
### 2. Visual Indicators ✅
|
|
|
|
- **Color Indicators:** Each status shows a colored circle using the status's configured color
|
|
- **Default Status Badge:** Default status displays a "Default" badge with a star icon
|
|
- **System Badge:** System statuses display a "System" badge
|
|
- **Custom Badge:** Non-default custom statuses display a "Custom" badge
|
|
- **Icons:**
|
|
- Shield icon for System Statuses section
|
|
- Palette icon for Custom Statuses section
|
|
- Plus icon for Add Status button
|
|
- Pencil icon for Edit button
|
|
- Trash icon for Delete button
|
|
- Star icon for Default badge
|
|
|
|
### 3. Task Count Display ✅
|
|
|
|
- Each status (system and custom) displays the number of tasks using that status
|
|
- Format: "X task" or "X tasks" (proper pluralization)
|
|
- Currently shows "0 tasks" as placeholder (actual counts require backend enhancement)
|
|
- Task counts are displayed on the right side of each status row
|
|
|
|
**Note:** The backend API currently doesn't return task counts. This will need to be implemented in a future enhancement. The component is ready to display counts when the API is updated.
|
|
|
|
### 4. Add Status Button ✅
|
|
|
|
- "Add Status" button is prominently displayed in the Custom Statuses section header
|
|
- Button includes a Plus icon
|
|
- Clicking the button currently shows a "Coming Soon" toast (dialog implementation is Task 12)
|
|
|
|
### 5. Loading and Error States ✅
|
|
|
|
#### Loading State
|
|
- Displays a centered spinner while fetching status data
|
|
- Shows during initial component mount and when reloading data
|
|
|
|
#### Error State
|
|
- Displays error message in a red-bordered box
|
|
- Shows "Try Again" button to retry loading
|
|
- Error message comes from API response or generic fallback
|
|
|
|
#### Success State
|
|
- Displays the full status list with system and custom statuses
|
|
- Smooth transition from loading to content display
|
|
|
|
## Component Structure
|
|
|
|
### Props
|
|
```typescript
|
|
interface Props {
|
|
projectId: number // Required: The project ID to load statuses for
|
|
}
|
|
```
|
|
|
|
### Emits
|
|
```typescript
|
|
{
|
|
updated: [] // Emitted when statuses are updated (for parent to refresh)
|
|
}
|
|
```
|
|
|
|
### State Management
|
|
- `isLoading`: Boolean for loading state
|
|
- `loadError`: String for error messages
|
|
- `allStatuses`: AllTaskStatusesResponse from API
|
|
- `taskCounts`: Record<string, number> for task counts per status
|
|
|
|
### Computed Properties
|
|
- `systemStatuses`: Array of system statuses from API response
|
|
- `customStatuses`: Array of custom statuses from API response
|
|
- `defaultStatusId`: ID of the default status
|
|
|
|
## API Integration
|
|
|
|
### Endpoint Used
|
|
```
|
|
GET /projects/{project_id}/task-statuses
|
|
```
|
|
|
|
### Response Structure
|
|
```typescript
|
|
interface AllTaskStatusesResponse {
|
|
statuses: CustomTaskStatus[] // Custom statuses
|
|
system_statuses: SystemTaskStatus[] // System statuses
|
|
default_status_id: string // ID of default status
|
|
}
|
|
|
|
interface CustomTaskStatus {
|
|
id: string
|
|
name: string
|
|
color: string
|
|
order: number
|
|
is_default: boolean
|
|
}
|
|
|
|
interface SystemTaskStatus {
|
|
id: string
|
|
name: string
|
|
color: string
|
|
is_system: boolean
|
|
}
|
|
```
|
|
|
|
## Integration
|
|
|
|
### Project Settings View
|
|
|
|
The component is integrated into `ProjectSettingsView.vue` in the Tasks tab:
|
|
|
|
```vue
|
|
<TabsContent value="tasks" class="mt-6">
|
|
<div class="space-y-6">
|
|
<!-- Custom Task Status Manager -->
|
|
<div class="bg-card rounded-lg border p-6">
|
|
<CustomTaskStatusManager
|
|
:project-id="projectId"
|
|
@updated="handleTaskStatusesUpdated"
|
|
/>
|
|
</div>
|
|
|
|
<Separator />
|
|
|
|
<!-- Other task-related components... -->
|
|
</div>
|
|
</TabsContent>
|
|
```
|
|
|
|
## Styling
|
|
|
|
- Uses shadcn-vue components for consistent styling
|
|
- Follows the same design patterns as CustomTaskTypeManager
|
|
- Responsive layout with proper spacing
|
|
- Hover effects on interactive elements
|
|
- Color indicators use inline styles for dynamic colors
|
|
- Proper use of muted colors for secondary text
|
|
|
|
## Future Enhancements
|
|
|
|
### Task 12: Add/Edit Status Dialog
|
|
- Implement dialog for creating new statuses
|
|
- Implement dialog for editing existing statuses
|
|
- Add color picker component
|
|
- Add name validation
|
|
|
|
### Task 13: Delete Status Confirmation
|
|
- Implement delete confirmation dialog
|
|
- Show task count in confirmation
|
|
- Add reassignment option if status is in use
|
|
|
|
### Task 14: Drag-and-Drop Reordering
|
|
- Add drag-and-drop functionality for reordering statuses
|
|
- Update order via API
|
|
- Persist order changes
|
|
|
|
### Task 15: Default Status Management
|
|
- Add "Set as Default" functionality
|
|
- Update default status via API
|
|
- Ensure only one default at a time
|
|
|
|
### Backend Enhancement: Task Counts
|
|
The backend API needs to be enhanced to return task counts:
|
|
|
|
```python
|
|
# Suggested endpoint enhancement
|
|
@router.get("/{project_id}/task-statuses")
|
|
async def get_all_task_statuses(...):
|
|
# ... existing code ...
|
|
|
|
# Add task count query
|
|
task_counts = {}
|
|
for status in all_statuses:
|
|
count = db.query(Task).filter(
|
|
Task.project_id == project_id,
|
|
Task.status == status.id
|
|
).count()
|
|
task_counts[status.id] = count
|
|
|
|
return {
|
|
"statuses": custom_statuses,
|
|
"system_statuses": system_statuses,
|
|
"default_status_id": default_status_id,
|
|
"task_counts": task_counts # NEW
|
|
}
|
|
```
|
|
|
|
## Testing
|
|
|
|
### Manual Testing
|
|
See `frontend/test-custom-task-status-manager.html` for detailed testing instructions.
|
|
|
|
### Test Checklist
|
|
- ✅ Component renders without errors
|
|
- ✅ System statuses display correctly
|
|
- ✅ Custom statuses display correctly
|
|
- ✅ Color indicators show proper colors
|
|
- ✅ Badges display correctly (System, Custom, Default)
|
|
- ✅ Task counts display (currently 0)
|
|
- ✅ Add Status button is visible and clickable
|
|
- ✅ Edit/Delete buttons show on custom statuses
|
|
- ✅ Loading state works
|
|
- ✅ Error state works with retry button
|
|
- ✅ Empty state shows when no custom statuses exist
|
|
- ✅ Hover effects work on custom status rows
|
|
- ✅ No TypeScript errors
|
|
- ✅ No console errors
|
|
|
|
## Requirements Coverage
|
|
|
|
### Requirement 1.1 ✅
|
|
"WHEN a user with coordinator, project manager, or admin role accesses the project settings tasks tab THEN the system SHALL display a task status management section"
|
|
|
|
- Component is integrated into Project Settings Tasks tab
|
|
- Displays task status management section with system and custom statuses
|
|
|
|
### Requirement 8.1 ✅
|
|
"WHEN viewing the status management section THEN the system SHALL display the count of tasks using each status"
|
|
|
|
- Task counts are displayed for each status
|
|
- Currently shows 0 (placeholder) until backend enhancement is implemented
|
|
|
|
### Requirement 8.2 ✅
|
|
"WHEN a status has zero tasks THEN the system SHALL indicate it is safe to delete"
|
|
|
|
- Task count of 0 is displayed
|
|
- Delete button is available (functionality in Task 13)
|
|
|
|
### Requirement 8.3 ✅
|
|
"WHEN a status has tasks THEN the system SHALL display the task count prominently"
|
|
|
|
- Task count is displayed prominently on the right side of each status row
|
|
- Uses proper pluralization ("task" vs "tasks")
|
|
|
|
## Files Modified
|
|
|
|
### New Files
|
|
- `frontend/src/components/settings/CustomTaskStatusManager.vue` - Main component
|
|
- `frontend/test-custom-task-status-manager.html` - Test documentation
|
|
- `frontend/docs/custom-task-status-manager-implementation.md` - This file
|
|
- `backend/test_custom_status_manager.py` - Database verification script
|
|
|
|
### Modified Files
|
|
- `frontend/src/views/ProjectSettingsView.vue` - Added component to Tasks tab
|
|
|
|
## Dependencies
|
|
|
|
- `@/services/customTaskStatus` - API service for status operations
|
|
- `@/components/ui/*` - shadcn-vue UI components
|
|
- `lucide-vue-next` - Icons
|
|
- `@/components/ui/toast/use-toast` - Toast notifications
|
|
|
|
## Notes
|
|
|
|
- The component is designed to be extensible for future features
|
|
- Placeholder toast messages are shown for Add/Edit/Delete actions
|
|
- Task count functionality is ready but requires backend API enhancement
|
|
- Component follows the same patterns as CustomTaskTypeManager for consistency
|
|
- All TypeScript types are properly defined in the service layer
|