This commit introduces a comprehensive Kanban board customization system and improves CSRF token configuration for Docker deployments. ## Major Features ### 1. Customizable Kanban Board Columns Add complete kanban column customization system allowing users to define custom workflow states beyond the default columns. **New Components:** - Add KanbanColumn model with full CRUD operations (app/models/kanban_column.py) - Add kanban routes blueprint with admin endpoints (app/routes/kanban.py) - Add kanban column management templates (app/templates/kanban/) - Add migration 019 for kanban_columns table (migrations/) **Features:** - Create unlimited custom columns with unique keys, labels, icons, and colors - Drag-and-drop column reordering with position persistence - Toggle column visibility without deletion - Protected system columns (todo, in_progress, done) prevent accidental deletion - Complete state marking for columns that should mark tasks as done - Real-time updates via SocketIO broadcasts when columns change - Font Awesome icon support (5000+ icons) - Bootstrap color scheme integration - Comprehensive validation and error handling **Integration:** - Update Task model to work with dynamic column statuses (app/models/task.py) - Update task routes to use kanban column API (app/routes/tasks.py) - Update project routes to fetch active columns (app/routes/projects.py) - Add kanban column management links to base template (app/templates/base.html) - Update kanban board templates to render dynamic columns (app/templates/tasks/) - Add cache prevention headers to force fresh column data **API Endpoints:** - GET /api/kanban/columns - Fetch all active columns - POST /api/kanban/columns/reorder - Reorder columns - GET /kanban/columns - Column management interface (admin only) - POST /kanban/columns/create - Create new column (admin only) - POST /kanban/columns/<id>/edit - Edit column (admin only) - POST /kanban/columns/<id>/delete - Delete column (admin only) - POST /kanban/columns/<id>/toggle - Toggle column visibility (admin only) ### 2. Enhanced CSRF Configuration Improve CSRF token configuration and documentation for Docker deployments. **Configuration Updates:** - Add WTF_CSRF_ENABLED environment variable to all docker-compose files - Add WTF_CSRF_TIME_LIMIT environment variable with 1-hour default - Update app/config.py to read CSRF settings from environment - Add SECRET_KEY validation in app/__init__.py to prevent production deployment with default keys **Docker Compose Updates:** - docker-compose.yml: CSRF enabled by default for security testing - docker-compose.remote.yml: CSRF always enabled in production - docker-compose.remote-dev.yml: CSRF enabled with production-like settings - docker-compose.local-test.yml: CSRF can be disabled for local testing - Add helpful comments explaining each CSRF-related environment variable - Update env.example with CSRF configuration examples **Verification Scripts:** - Add scripts/verify_csrf_config.sh for Unix systems - Add scripts/verify_csrf_config.bat for Windows systems - Scripts check SECRET_KEY, CSRF_ENABLED, and CSRF_TIME_LIMIT settings ### 3. Database Initialization Improvements - Update app/__init__.py to run pending migrations on startup - Add automatic kanban column initialization after migrations - Improve error handling and logging during database setup ### 4. Configuration Management - Update app/config.py with new CSRF and kanban-related settings - Add environment variable parsing with sensible defaults - Improve configuration validation and error messages ## Documentation ### New Documentation Files - CUSTOM_KANBAN_README.md: Quick start guide for kanban customization - KANBAN_CUSTOMIZATION.md: Detailed technical documentation - IMPLEMENTATION_SUMMARY.md: Implementation details and architecture - KANBAN_AUTO_REFRESH_COMPLETE.md: Real-time update system documentation - KANBAN_REFRESH_FINAL_FIX.md: Cache and refresh troubleshooting - KANBAN_REFRESH_SOLUTION.md: Technical solution for data freshness - docs/CSRF_CONFIGURATION.md: Comprehensive CSRF setup guide - CSRF_DOCKER_CONFIGURATION_SUMMARY.md: Docker-specific CSRF setup - CSRF_TROUBLESHOOTING.md: Common CSRF issues and solutions - APPLY_KANBAN_MIGRATION.md: Migration application guide - APPLY_FIXES_NOW.md: Quick fix reference - DEBUG_KANBAN_COLUMNS.md: Debugging guide - DIAGNOSIS_STEPS.md: System diagnosis procedures - BROWSER_CACHE_FIX.md: Browser cache troubleshooting - FORCE_NO_CACHE_FIX.md: Cache prevention solutions - SESSION_CLOSE_ERROR_FIX.md: Session handling fixes - QUICK_FIX.md: Quick reference for common fixes ### Updated Documentation - README.md: Add kanban customization feature description - Update project documentation with new features ## Testing ### New Test Files - test_kanban_refresh.py: Test kanban column refresh functionality ## Technical Details **Database Changes:** - New table: kanban_columns with 11 columns - Indexes on: key, position - Default data: 4 system columns (todo, in_progress, review, done) - Support for both SQLite (development) and PostgreSQL (production) **Real-Time Updates:** - SocketIO events: 'kanban_columns_updated' with action type - Automatic page refresh when columns are created/updated/deleted/reordered - Prevents stale data by expiring SQLAlchemy caches after changes **Security:** - Admin-only access to column management - CSRF protection on all column mutation endpoints - API endpoints exempt from CSRF (use JSON and other auth mechanisms) - System column protection prevents data integrity issues - Validation prevents deletion of columns with active tasks **Performance:** - Efficient querying with position-based ordering - Cached column data with cache invalidation on changes - No-cache headers on API responses to prevent stale data - Optimized database indexes for fast lookups ## Breaking Changes None. This is a fully backward-compatible addition. Existing workflows continue to work with the default columns. Custom columns are opt-in via the admin interface. ## Migration Notes 1. Run migration 019 to create kanban_columns table 2. Default columns are initialized automatically on first run 3. No data migration needed for existing tasks 4. Existing task statuses map to new column keys ## Environment Variables New environment variables (all optional with defaults): - WTF_CSRF_ENABLED: Enable/disable CSRF protection (default: true) - WTF_CSRF_TIME_LIMIT: CSRF token expiration in seconds (default: 3600) - SECRET_KEY: Required in production, must be cryptographically secure See env.example for complete configuration reference. ## Deployment Notes
8.6 KiB
Kanban Board Customization Feature
This document describes the custom kanban board columns feature implemented in the TimeTracker application.
Overview
The kanban board now supports fully customizable columns and task states. Administrators can:
- Create custom columns with unique names and properties
- Modify existing columns (label, icon, color, behavior)
- Reorder columns via drag-and-drop
- Activate/deactivate columns without deleting them
- Define which columns mark tasks as complete
Features Implemented
1. Database Model (KanbanColumn)
New model to store kanban column configurations:
key: Unique identifier for the column (e.g., 'in_progress')label: Display name shown in the UI (e.g., 'In Progress')icon: Font Awesome icon class for visual representationcolor: Bootstrap color class for stylingposition: Sort order on the kanban boardis_active: Whether the column is currently visibleis_system: System columns (todo, in_progress, done) cannot be deletedis_complete_state: Marks tasks as completed when moved to this column
2. Admin Routes (/kanban/columns/)
New routes for column management:
- GET /kanban/columns: List all columns with management options
- GET /kanban/columns/create: Form to create a new column
- POST /kanban/columns/create: Create a new column
- GET /kanban/columns//edit: Form to edit existing column
- POST /kanban/columns//edit: Update column properties
- POST /kanban/columns//delete: Delete custom column (if no tasks use it)
- POST /kanban/columns//toggle: Activate/deactivate column
- POST /api/kanban/columns/reorder: Reorder columns (drag-and-drop)
- GET /api/kanban/columns: API endpoint to get all active columns
3. Updated Templates
Modified templates to load columns dynamically:
app/templates/tasks/_kanban.html: Load columns from databaseapp/templates/kanban/columns.html: Column management pageapp/templates/kanban/create_column.html: Create column formapp/templates/kanban/edit_column.html: Edit column form
4. Updated Task Routes
Task status validation now uses configured kanban columns:
list_tasks(): Passes kanban_columns to templatemy_tasks(): Passes kanban_columns to templateupdate_task_status(): Validates status against active columnsapi_update_status(): API endpoint validates against active columns
5. Migration Script
Migration script to initialize the system:
- Creates
kanban_columnstable - Initializes default columns (To Do, In Progress, Review, Done)
- Located at:
migrations/migration_019_kanban_columns.py
Usage
For Administrators
Accessing Column Management
- Navigate to any kanban board view
- Click "Manage Columns" button (visible to admins only)
- Or directly visit
/kanban/columns
Creating a New Column
- Click "Add Column" button
- Fill in the form:
- Column Label: Display name (e.g., "In Review")
- Column Key: Unique identifier (auto-generated from label)
- Icon: Font Awesome class (e.g., "fas fa-eye")
- Color: Bootstrap color class (primary, success, warning, etc.)
- Mark as Complete State: Check if this column completes tasks
- Click "Create Column"
Editing a Column
- Click the edit icon next to any column
- Modify properties (label, icon, color, complete state, active status)
- Click "Save Changes"
Note: The column key cannot be changed after creation.
Reordering Columns
- On the column management page, drag the grip icon (≡) next to any column
- Drop it in the desired position
- The order is saved automatically
Deleting a Column
- Custom columns can be deleted if no tasks are using that status
- System columns (todo, in_progress, done) cannot be deleted but can be customized
- Click the delete icon and confirm
Activating/Deactivating Columns
- Click the eye icon to toggle column visibility
- Inactive columns are hidden from the kanban board
- Tasks with inactive statuses remain accessible but don't appear on the board
For Users
- The kanban board automatically reflects the configured columns
- Drag and drop tasks between columns
- Tasks automatically update their status when moved
- Complete state columns automatically mark tasks as done
Technical Details
Default Columns
The system initializes with these default columns:
- To Do (todo) - System column
- In Progress (in_progress) - System column
- Review (review) - Custom column
- Done (done) - System column, marks tasks as complete
System Columns
These columns are created by default and cannot be deleted:
todo: Initial state for new tasksin_progress: Active work in progressdone: Completed tasks
System columns can still be customized (label, icon, color) but not deleted.
Column Properties
- Key: Must be unique, lowercase, use underscores instead of spaces
- Label: User-friendly display name, can include spaces and capitals
- Icon: Font Awesome class, e.g., "fas fa-check", "fas fa-spinner"
- Color: Bootstrap color: primary, secondary, success, danger, warning, info, dark
- Position: Auto-managed, can be changed via drag-and-drop
- Active: Hidden columns don't appear on kanban board
- Complete State: Automatically marks tasks as completed
Backward Compatibility
The system maintains backward compatibility with existing task statuses:
- Tasks with old statuses continue to work
- The
status_displayproperty checks kanban columns first - Falls back to hardcoded labels if column not found
- Migration initializes columns to match existing behavior
API Endpoints
GET /api/kanban/columns
Returns all active kanban columns.
Response:
{
"columns": [
{
"id": 1,
"key": "todo",
"label": "To Do",
"icon": "fas fa-list-check",
"color": "secondary",
"position": 0,
"is_active": true,
"is_system": true,
"is_complete_state": false
},
...
]
}
POST /api/kanban/columns/reorder
Reorder columns based on provided ID list.
Request:
{
"column_ids": [1, 3, 2, 4]
}
Response:
{
"success": true,
"message": "Columns reordered successfully"
}
Files Modified
New Files
app/models/kanban_column.py: KanbanColumn modelapp/routes/kanban.py: Kanban column management routesapp/templates/kanban/columns.html: Column management pageapp/templates/kanban/create_column.html: Create column formapp/templates/kanban/edit_column.html: Edit column formmigrations/migration_019_kanban_columns.py: Database migration
Modified Files
app/models/__init__.py: Added KanbanColumn importapp/models/task.py: Updated status_display to use KanbanColumnapp/routes/tasks.py: Updated validation to use KanbanColumnapp/routes/projects.py: Pass kanban_columns to templateapp/templates/tasks/_kanban.html: Load columns dynamicallyapp/__init__.py: Register kanban blueprint
Database Schema
CREATE TABLE kanban_columns (
id INTEGER PRIMARY KEY AUTOINCREMENT,
key VARCHAR(50) NOT NULL UNIQUE,
label VARCHAR(100) NOT NULL,
icon VARCHAR(100) DEFAULT 'fas fa-circle',
color VARCHAR(50) DEFAULT 'secondary',
position INTEGER NOT NULL DEFAULT 0,
is_active BOOLEAN NOT NULL DEFAULT 1,
is_system BOOLEAN NOT NULL DEFAULT 0,
is_complete_state BOOLEAN NOT NULL DEFAULT 0,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_kanban_columns_key ON kanban_columns(key);
CREATE INDEX idx_kanban_columns_position ON kanban_columns(position);
Future Enhancements
Possible future improvements:
- Per-project custom columns
- Column-specific automation rules
- Custom column colors (hex codes)
- Column templates for different workflows
- Bulk task status updates
- Column usage analytics
Troubleshooting
Issue: Custom column not appearing on kanban board
Solution: Check that the column is marked as "Active" in the column management page.
Issue: Cannot delete a custom column
Solution: Ensure no tasks are using that status. Move or delete those tasks first.
Issue: Drag and drop not working
Solution: Ensure JavaScript is enabled and SortableJS library is loaded.
Issue: Changes not reflected immediately
Solution: Refresh the page or clear browser cache.
Security Considerations
- Only administrators can manage kanban columns
- Column keys are validated to prevent SQL injection
- CSRF protection on all forms
- XSS protection on user-provided labels
- System columns cannot be deleted to maintain data integrity