LinkDesk/frontend/docs/custom-task-status-manager-...

9.1 KiB

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

interface Props {
  projectId: number  // Required: The project ID to load statuses for
}

Emits

{
  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

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:

<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:

# 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