5.7 KiB
5.7 KiB
Custom Task Status Service Implementation
Overview
Implemented the frontend service layer for managing custom task statuses in the VFX Project Management System. This service provides a clean API for interacting with the backend custom task status endpoints.
Implementation Details
File Created
frontend/src/services/customTaskStatus.ts
TypeScript Interfaces
The service includes comprehensive TypeScript interfaces for type safety:
Core Types
- CustomTaskStatus: Represents a custom task status with id, name, color, order, and is_default flag
- SystemTaskStatus: Represents built-in system statuses
- AllTaskStatusesResponse: Combined response containing both system and custom statuses
Request Types
- CustomTaskStatusCreate: For creating new statuses (name required, color optional)
- CustomTaskStatusUpdate: For updating statuses (all fields optional)
- CustomTaskStatusReorder: For reordering statuses (ordered list of status IDs)
- CustomTaskStatusDelete: For deleting statuses (optional reassignment)
Response Types
- CustomTaskStatusResponse: Standard response with message, status, and all_statuses
- TaskStatusInUseError: Error response when attempting to delete a status in use
Service Methods
1. getAllStatuses(projectId: number)
- Purpose: Retrieve all task statuses (system + custom) for a project
- Endpoint:
GET /projects/{projectId}/task-statuses - Returns: AllTaskStatusesResponse with system statuses, custom statuses, and default status ID
- Requirements: 1.1
2. createStatus(projectId: number, status: CustomTaskStatusCreate)
- Purpose: Create a new custom task status
- Endpoint:
POST /projects/{projectId}/task-statuses - Parameters:
name: Status name (required)color: Hex color code (optional, auto-assigned if not provided)
- Returns: CustomTaskStatusResponse with created status and all statuses
- Requirements: 1.2
3. updateStatus(projectId: number, statusId: string, status: CustomTaskStatusUpdate)
- Purpose: Update an existing custom task status
- Endpoint:
PUT /projects/{projectId}/task-statuses/{statusId} - Parameters:
name: New status name (optional)color: New hex color code (optional)is_default: Set as default status (optional)
- Returns: CustomTaskStatusResponse with updated status and all statuses
- Requirements: 2.1
4. deleteStatus(projectId: number, statusId: string, deleteData?: CustomTaskStatusDelete)
- Purpose: Delete a custom task status
- Endpoint:
DELETE /projects/{projectId}/task-statuses/{statusId} - Parameters:
reassign_to_status_id: Status ID to reassign tasks to (optional, required if status is in use)
- Returns: CustomTaskStatusResponse with remaining statuses
- Requirements: 3.1
5. reorderStatuses(projectId: number, reorderData: CustomTaskStatusReorder)
- Purpose: Reorder custom task statuses
- Endpoint:
PATCH /projects/{projectId}/task-statuses/reorder - Parameters:
status_ids: Ordered array of status IDs
- Returns: CustomTaskStatusResponse with statuses in new order
- Requirements: 4.1
API Integration
The service uses the centralized apiClient from ./api.ts which handles:
- Authentication headers (JWT tokens)
- Base URL configuration
- Request/response interceptors
- Error handling
Usage Example
import { customTaskStatusService } from '@/services/customTaskStatus'
// Get all statuses
const statuses = await customTaskStatusService.getAllStatuses(projectId)
// Create a new status
const newStatus = await customTaskStatusService.createStatus(projectId, {
name: 'Ready for Review',
color: '#9333EA'
})
// Update a status
const updated = await customTaskStatusService.updateStatus(projectId, statusId, {
name: 'In Review',
is_default: true
})
// Reorder statuses
await customTaskStatusService.reorderStatuses(projectId, {
status_ids: ['status-1', 'status-2', 'status-3']
})
// Delete a status
await customTaskStatusService.deleteStatus(projectId, statusId, {
reassign_to_status_id: 'other-status-id'
})
Testing
A test page has been created at frontend/test-custom-task-status-service.html that provides:
- Interactive UI for testing all service methods
- Login functionality
- Visual display of results
- Error handling demonstration
To test:
- Start the backend server:
uvicorn main:app --reload(from backend directory) - Start the frontend dev server:
npm run dev(from frontend directory) - Open
http://localhost:5173/test-custom-task-status-service.html - Click "Login as Admin" to authenticate
- Test each service method using the provided UI
Requirements Coverage
This implementation satisfies the following requirements from the custom task status specification:
- Requirement 1.1: Get all task statuses (system + custom)
- Requirement 1.2: Create custom task status
- Requirement 2.1: Update custom task status
- Requirement 3.1: Delete custom task status
- Requirement 4.1: Reorder custom task statuses
Next Steps
The service is now ready to be integrated into UI components:
- Task 11: CustomTaskStatusManager component
- Task 12: Add/Edit status dialog
- Task 13: Status deletion with confirmation
- Task 14: Drag-and-drop reordering
- Task 15: Default status management
Type Safety
All methods are fully typed with TypeScript interfaces, providing:
- Compile-time type checking
- IntelliSense support in IDEs
- Clear API contracts
- Reduced runtime errors
Error Handling
The service relies on the apiClient's error handling, which:
- Catches HTTP errors
- Provides structured error responses
- Includes validation error details from the backend
- Supports error recovery patterns in UI components