99 lines
3.4 KiB
Markdown
99 lines
3.4 KiB
Markdown
|
|
|
|
|
|
|
|
Task Table:
|
|
|
|
- task_id: primary key
|
|
- title: str (required, non-empty)
|
|
- desc: str (optional, can be empty)
|
|
- status: enum{todo, doing, pending, done}
|
|
- goal_id: foreign key to goal table (required, each task belongs to exactly one goal)
|
|
- start_time: timestamp or None
|
|
- finished_time: timestamp or None
|
|
- order: float (for ordering unfinished tasks)
|
|
|
|
Goal Table:
|
|
|
|
- goal_id: primary key
|
|
- title: str (required, non-empty)
|
|
- activated: bool (deactivated goals and their tasks are hidden from Task Page GUI)
|
|
|
|
User Table:
|
|
|
|
- user_id: primary key
|
|
- username: str (unique, required)
|
|
- password_hash: str (required)
|
|
- role: enum{user, admin} (admin can configure goal limits)
|
|
- max_goals: int (maximum goals this user can create, configurable by admin)
|
|
|
|
|
|
GUI:
|
|
|
|
Page 1. Goal CRUD
|
|
- List all goals with activate/deactivate toggle
|
|
- Create, edit, delete goals
|
|
- Shows goal title and activation status
|
|
|
|
Page 2. Task CRUD
|
|
- Tasks are grouped by their parent goal
|
|
- Only activated goals and their tasks are visible
|
|
- Focus Rule: Each goal highlights its single "doing" task prominently
|
|
- Scroll View: Tasks displayed in a scrollable selector (like time picker widget)
|
|
- Center/focus area shows current task
|
|
- Unfinished tasks ordered by `order` field
|
|
- Finished tasks ordered by `finished_time` (most recent first)
|
|
- Drag-and-drop reordering for unfinished tasks
|
|
- Side Panel: Clicking a task opens a side panel for editing task details
|
|
- Task status transitions:
|
|
- User manually switches task to "doing" (only one per goal)
|
|
- When "doing" task is completed, status becomes "done" (no auto-promotion)
|
|
- User must manually set next task to "doing"
|
|
|
|
|
|
Constraints:
|
|
|
|
1. **Focus Rule**: Under each goal, there should be only one "doing" task. The GUI must visually emphasize the "doing" task for each goal.
|
|
|
|
2. **Ordering Rule**:
|
|
- Finished tasks are ordered by `finished_time` (descending)
|
|
- Unfinished tasks are ordered by `order` field (ascending)
|
|
- Users can reorder unfinished tasks via drag-and-drop
|
|
|
|
3. **Scroll View**: Tasks are displayed in a linear scroll view selector (similar to HH:mm time picker). The current task is centered/focused. Users can drag-and-drop to reorder future tasks.
|
|
|
|
4. **Task-Good Relationship**: Tasks cannot exist without a goal. Each task belongs to exactly one goal.
|
|
|
|
5. **Goal Limit**: Each user can only create up to their `max_goals` limit. Admin can modify this limit per user.
|
|
|
|
6. **Visibility**: Deactivated goals and all their tasks are hidden from the Task Page.
|
|
|
|
|
|
Business Rules:
|
|
|
|
- Task title is required and cannot be empty
|
|
- Goal title is required and cannot be empty
|
|
- Tasks can be deleted (order values don't need to be continuous)
|
|
- Goals can be activated/deactivated (only affects GUI visibility)
|
|
- Only one "doing" task per goal at any time
|
|
- Users must manually set a task to "doing" status
|
|
- Simple user registration with username/password
|
|
|
|
|
|
Tech Stack:
|
|
|
|
- Backend: Python + Flask (lightweight, good for small apps)
|
|
- Frontend: Vanilla JS + HTML/CSS (simple, no build step needed)
|
|
- Database: SQLite (lightweight file-based relational database)
|
|
- Authentication: Session-based with password hashing (bcrypt)
|
|
- Drag-and-drop: HTML5 Drag and Drop API or SortableJS
|
|
|
|
|
|
Multi-User Features:
|
|
|
|
- User registration and login
|
|
- Each user has isolated goals and tasks
|
|
- Admin user can:
|
|
- Configure `max_goals_per_user` limit
|
|
- View all users (optional)
|
|
- Regular users can only see/manage their own data |