tududi/docs/07-areas.md
2026-03-15 09:01:38 +02:00

763 lines
No EOL
20 KiB
Markdown

# Areas - Behavior Rules
This document explains how areas work in tududi from a user behavior perspective. For technical implementation details, see the backend code in `/backend/modules/areas/` and frontend components in `/frontend/components/Area/`.
---
## Overview
**Areas** are the highest level of organization in tududi, representing major life domains or responsibility categories. They provide a way to group projects into meaningful top-level segments.
**Key characteristics:**
- Represent broad life domains (Work, Personal, Health, Finance, etc.)
- Sit at the top of the organizational hierarchy
- Provide high-level grouping for projects
- Simple structure with just name and description
- User-specific (each user has their own areas)
- Optional organizational layer (projects can exist without areas)
**Hierarchy Position:**
```
Areas (highest level - life domains)
└── Projects (mid level - specific goals)
└── Tasks (actionable items)
└── Subtasks
```
**URL:** `/areas`
---
## Core Principles
1. **Areas are top-level organizational containers**
- They represent the broadest categories of your life and work
- Examples: Work, Personal, Health, Finance, Learning, Home
2. **Areas are optional**
- Projects can exist without belonging to an area
- Areas provide structure but aren't required
3. **Areas don't cascade delete**
- Deleting an area orphans its projects, doesn't delete them
- This prevents accidental data loss
- Orphaned projects remain accessible
4. **Areas are simple by design**
- Just a name and optional description
- No status, priority, or due dates
- Focus is on categorization, not task management
5. **One project, one area**
- A project can belong to at most one area
- But an area can contain many projects
---
## Hierarchy
```
Areas (highest level - life domains)
└── Projects (mid level - specific goals/initiatives)
├── Tasks (actionable items)
└── Notes (reference material)
```
**Example structure:**
```
Area: "Work"
├── Project: "Q1 Marketing Campaign"
│ ├── Task: "Design landing page"
│ └── Task: "Write email copy"
├── Project: "Website Redesign"
│ └── Task: "Research design trends"
└── Project: "Team Onboarding"
Area: "Personal"
├── Project: "Home Renovation"
│ ├── Task: "Get contractor quotes"
│ └── Task: "Choose paint colors"
└── Project: "Learn Spanish"
└── Task: "Complete Duolingo lesson"
Area: "Health"
└── Project: "Exercise Routine"
├── Task: "Go for morning run"
└── Task: "Meal prep for the week"
```
---
## Area Properties
### Basic Information
1. **Name** (required)
- The area title
- Examples: "Work", "Personal", "Health", "Finance", "Learning"
- Displayed in uppercase on area cards
- Sorted alphabetically
2. **Description** (optional)
- Longer explanation of what this area encompasses
- Helps clarify the scope and purpose
- Displayed on area card in smaller text
- Example: "Work related projects and professional development"
3. **UID** (auto-generated)
- Unique identifier for the area
- Used in URLs and API calls
- Cannot be changed
4. **User ID** (system-managed)
- Links area to the user who created it
- Areas are private to each user
- Cannot be shared between users
---
## Area Lifecycle
### Creating an Area
**Ways to create:**
1. Navigate to `/areas`
2. Click "New Area" button (if implemented)
3. Use the area modal to enter details
**Required fields:**
- Name (must not be empty or just whitespace)
**Default values:**
- Description: Empty string
**Auto-generated:**
- UID (unique identifier)
- User ID (current user)
- Timestamps (created_at, updated_at)
**Example:**
```
Name: "Work"
Description: "Professional projects, career development, and work-related tasks"
```
### Editing an Area
**What you can edit:**
- Name (required, cannot be empty)
- Description (optional)
**What you cannot edit:**
- UID
- User ID
- Created timestamp
**How to edit:**
1. Navigate to `/areas`
2. Hover over area card
3. Click three-dot menu (appears on hover)
4. Click "Edit"
5. Modify fields in modal
6. Click "Save" or "Update Area"
**Validation:**
- Name cannot be empty
- Name cannot be only whitespace
- Whitespace is trimmed from name
### Deleting an Area
**What happens:**
1. Area record is deleted from database
2. **Projects belonging to area are orphaned** (area_id set to null)
3. Projects are NOT deleted
4. Tasks and notes within projects are unaffected
**What is NOT deleted:**
- Projects (they become orphaned, with no area)
- Tasks within projects
- Notes within projects
- Any data except the area itself
**How to delete:**
1. Navigate to `/areas`
2. Hover over area card
3. Click three-dot menu
4. Click "Delete"
5. Confirm deletion in dialog
**Who can delete:**
- Area owner only
- Admin users (if admin functionality exists)
**No undo:**
- Deletion is permanent for the area
- But projects can be manually reassigned to a new area
**Finding orphaned projects after deletion:**
1. Go to Projects page
2. Filter by "No Area"
3. Re-assign to a new area if needed
---
## Using Areas
### Viewing Areas
**Areas List Page:**
- URL: `/areas`
- Shows all areas for current user
- Displayed as a responsive grid
- Grid adapts to screen size:
- Mobile: 1 column
- Tablet: 2 columns
- Desktop: 3 columns
- Large desktop: 4 columns
**Area Cards:**
Each card displays:
- Area name (uppercase, centered, large font)
- Description (if provided, smaller text, centered)
- Three-dot menu (appears on hover)
- Edit option
- Delete option
**Card Layout:**
- Fixed height (120px)
- Centered content
- Hover effect (slight opacity change)
- Click card to view projects in that area
### Linking to Projects
**From area card:**
- Clicking an area card navigates to: `/projects?area={uid}-{slug}`
- This filters the Projects page to show only projects in that area
- Example: `/projects?area=abc123-work`
**Slug generation:**
- Area name converted to lowercase
- Non-alphanumeric characters replaced with hyphens
- Leading/trailing hyphens removed
- Example: "My Work Area" → "my-work-area"
**From area detail page:**
- Displays link: "View projects in {area name}"
- Clicking navigates to filtered projects view
### Grouping Projects by Area
**On Projects page:**
- Add query parameter: `?grouped=true`
- Projects grouped under their area names
- Special "No Area" group for orphaned projects
**Example grouped view:**
```
Work
├── Q1 Marketing Campaign (75% complete)
├── Website Redesign (30% complete)
└── Client Onboarding (done)
Personal
├── Home Renovation (in progress)
└── Learn Spanish (planned)
No Area
└── Random Ideas (not started)
```
**Benefits:**
- High-level overview of work distribution
- See balance across life domains
- Identify areas with too many/few projects
---
## Display Rules
### Area Cards (Grid View)
**Information shown:**
- Area name (bold, uppercase, 18px)
- Description (if exists, 12px, gray text)
- Three-dot menu (visible on hover)
**Visual design:**
- Light background: `bg-gray-50` (light mode)
- Dark background: `bg-gray-900` (dark mode)
- Rounded corners with shadow
- Fixed height: 120px
- Centered text alignment
- Hover: Slight opacity reduction (90%)
**Interaction:**
- Click anywhere on card → Navigate to projects filtered by area
- Click three-dot menu → Show edit/delete options
- Hover card → Show three-dot menu
**Sorting:**
- Areas always sorted alphabetically by name (A-Z)
- Case-insensitive sorting
- Consistent across all views
### Empty State
**When no areas exist:**
- Shows message: "No areas found" (translated)
- Prompts user to create their first area
---
## Area-Project Relationship
### Assigning Projects to Areas
**Ways to assign:**
1. **During project creation:**
- Select area from dropdown in project modal
- Area dropdown shows all user's areas alphabetically
2. **When editing existing project:**
- Open project detail or edit modal
- Change area in dropdown
- Can set to "No Area" to orphan project
3. **Bulk operations (if implemented):**
- Select multiple projects
- Assign to area in bulk
**Project can have:**
- One area (normal case)
- No area (orphaned - still valid)
- Cannot have multiple areas
### Area Display on Projects
**On project cards:**
- Area name shown as a label/tag
- Usually displayed below project name
- Clickable link to filter by area
**On project detail page:**
- Area name displayed in metadata section
- Linked to area's projects list
- Can be changed inline (if editable)
**On project forms:**
- Dropdown selector for area
- Includes "No Area" option
- Sorted alphabetically
### Orphaned Projects
**What are orphaned projects:**
- Projects with no area assigned (`area_id = null`)
- Created without an area, or area was deleted
- Perfectly valid state
**How to find:**
1. Navigate to Projects page
2. Filter by "No Area"
3. Or use grouped view - they appear in "No Area" section
**How to fix (if desired):**
1. Open orphaned project
2. Edit project details
3. Select an area from dropdown
4. Save changes
**Not a problem:**
- Areas are optional organizational tools
- Projects work perfectly fine without areas
- Some users prefer not to use areas at all
---
## Common Workflows
### Workflow 1: Set Up Life Domains
**Scenario:** Initial organization of your life
1. Navigate to `/areas`
2. Create areas for major life domains:
- Work
- Personal
- Health
- Finance
- Learning
- Home
3. Add descriptions to clarify scope:
- Work: "Professional projects and career development"
- Personal: "Personal goals and hobbies"
- Health: "Fitness, nutrition, and wellness"
4. Assign existing projects to appropriate areas
5. Review grouped projects view for balance
### Workflow 2: Organize Projects into Areas
**Scenario:** You have many unorganized projects
1. Go to Projects page
2. Filter by "No Area" to see orphaned projects
3. For each project:
- Open project detail
- Consider its nature (work, personal, etc.)
- Assign to appropriate area
4. Use grouped view to verify organization
5. Adjust as needed
### Workflow 3: Focus on Specific Life Domain
**Scenario:** You want to focus on work projects only
1. Navigate to `/areas`
2. Click on "Work" area card
3. See only work-related projects
4. Review active projects in work domain
5. Identify stalled projects
6. Plan next actions
### Workflow 4: Review Life Balance
**Scenario:** Check if you're balanced across domains
1. Navigate to `/projects?grouped=true`
2. See projects grouped by area
3. Count projects in each area
4. Identify areas with:
- Too many projects (overcommitted)
- Too few projects (neglected domain)
- All completed projects (ready for new initiatives)
5. Make adjustments to achieve balance
### Workflow 5: Reorganize Life Structure
**Scenario:** Your life structure has changed
1. Navigate to `/areas`
2. Edit area names/descriptions to reflect new reality
3. Consider creating new areas:
- New job → New work area or split areas
- New hobby → Personal or new Learning area
4. Delete obsolete areas (projects become orphaned)
5. Re-assign orphaned projects to new structure
6. Review and refine
---
## Integration with Other Features
### Areas and Projects Page
**Filtering by area:**
- URL: `/projects?area={uid}-{slug}`
- Shows only projects in that area
- Breadcrumb or header shows current area filter
- Can clear filter to see all projects
**Grouping by area:**
- URL: `/projects?grouped=true`
- Projects organized under area headings
- Collapsible sections (if implemented)
- Shows "No Area" group for orphaned projects
### Areas and Project Detail Page
**Area shown on project:**
- Displayed in metadata section
- Linked to area's projects list
- Can edit to change or remove area (if permissions allow)
### Areas and Navigation
**Sidebar (if areas shown):**
- May show top areas for quick access
- Click to navigate to area's projects
- Usually shows 3-5 most used areas
**Quick filters:**
- Projects page may have area pills/tags
- Click to toggle area filter
- Multiple areas can be selected (OR logic)
---
## Best Practices
### Naming Areas
**Good area names:**
- Short and clear: "Work", "Personal", "Health"
- Broad categories, not specific projects
- Parallel structure: All nouns or all adjectives
- Examples: "Work", "Home", "Health", "Finance"
**Avoid:**
- Overly specific: "Q1 Marketing" (that's a project)
- Too many areas (diminishes organizational value)
- Overlapping categories: "Work" and "Career" (redundant)
- Vague names: "Stuff", "Things", "Other"
### Structuring Your Areas
**Recommended approach:**
- Start with 4-7 major areas
- Based on life domains, not task types
- Examples:
- Professional: Work, Business
- Personal: Personal, Family, Social
- Self-improvement: Health, Learning
- Maintenance: Home, Finance
**Too many areas:**
- Defeats the purpose of high-level organization
- Hard to remember and maintain
- Projects get scattered
- Consider: Do you really need that area?
**Too few areas:**
- Everything in "Work" and "Personal"
- Loses organizational granularity
- Consider: Are you neglecting important life domains?
### Using Descriptions
**Good descriptions:**
- Clarify the scope of the area
- Help with project assignment decisions
- Examples:
- "Work": "Professional projects, career development, and work relationships"
- "Health": "Physical fitness, nutrition, mental wellness, and medical care"
- "Learning": "Online courses, reading, language learning, and skill development"
**When to skip descriptions:**
- Area name is self-explanatory ("Personal", "Work")
- You're the only user and know what it means
### Maintaining Your Areas
**Regular review:**
- Every 3-6 months, review your areas
- Are they still relevant to your life?
- Do you need to add/remove/rename areas?
- Are projects correctly categorized?
**When life changes:**
- New job → Adjust work areas
- New responsibility → Add new area
- Completed major goal → Remove or repurpose area
---
## Troubleshooting
### "My projects disappeared when I deleted the area"
**What happened:**
- Projects are not deleted, they're orphaned
- They still exist in your database
**How to find:**
1. Go to Projects page
2. Filter by "No Area"
3. You'll see all orphaned projects
4. Re-assign to a new area if needed
### "I can't see my area in the projects dropdown"
**Possible causes:**
1. Area belongs to different user (not shared)
2. Area was deleted
3. Frontend cache issue
**How to fix:**
1. Refresh the page
2. Check `/areas` page to confirm area exists
3. If missing, recreate the area
### "Area cards not showing in grid"
**Possible causes:**
1. No areas created yet
2. Loading state
3. API error
**How to check:**
1. Wait for loading to complete
2. Check browser console for errors
3. Verify `/api/areas` endpoint returns data
4. Create first area if none exist
### "Projects grouped view not working"
**Checklist:**
1. Is `?grouped=true` in URL?
2. Do projects have `area_id` set?
3. Are areas loaded in global state?
4. Check browser console for errors
### "Can't delete an area"
**Possible reasons:**
1. You're not the owner (areas can't be shared)
2. Network error
3. Permission issue
**Alternative:**
- If you can't delete, just don't use it
- Remove all projects from the area
- It won't show up in grouped views
---
## Use Cases
### 1. **Life-Work Balance Monitoring**
Areas help you see if you're:
- Overcommitting in work area
- Neglecting personal projects
- Ignoring health/fitness
- Balancing across all domains
**Action:** Review grouped projects view monthly
### 2. **Context Switching**
When switching contexts (work → personal):
- Click area card to see relevant projects
- Focus on that domain exclusively
- Avoid distraction from other areas
**Action:** Use area filters during focused work sessions
### 3. **Goal Setting Across Life Domains**
Ensure you have:
- Active projects in each important area
- Balance between maintenance and growth
- Projects in neglected domains
**Action:** Set quarterly goals per area
### 4. **Delegation and Collaboration**
Though areas themselves aren't shared:
- Projects within areas can be shared
- Use areas to organize shared vs. personal work
- Example: "Work" area has shared team projects
**Action:** Keep team projects in shared areas
### 5. **Year-End Review**
At year end, review each area:
- How many projects completed?
- Which areas were neglected?
- Where did you make most progress?
- What needs attention next year?
**Action:** Annual area-by-area retrospective
---
## Technical Notes
### Data Model
**Database table:** `areas`
**Columns:**
- `id` (integer, primary key, auto-increment)
- `uid` (string, unique, auto-generated)
- `name` (string, required)
- `description` (string, optional)
- `user_id` (integer, foreign key to users table)
- `created_at` (timestamp)
- `updated_at` (timestamp)
**Indexes:**
- Primary key on `id`
- Unique index on `uid`
- Index on `user_id` (for fast user-based queries)
### API Endpoints
**GET /api/areas**
- List all areas for current user
- Sorted alphabetically by name
- Returns: Array of area objects
**GET /api/areas/:uid**
- Get single area by UID
- Returns: Area object
**POST /api/areas**
- Create new area
- Body: `{ name, description }`
- Returns: Created area object (201)
**PATCH /api/areas/:uid**
- Update existing area
- Body: `{ name?, description? }`
- Returns: Updated area object
**DELETE /api/areas/:uid**
- Delete area (orphans projects)
- Returns: 204 No Content
**Authentication:**
- All endpoints require authentication
- 401 if not authenticated
### Validation Rules
**Name validation:**
- Required (cannot be null or undefined)
- Cannot be empty string
- Cannot be only whitespace
- Whitespace trimmed before saving
**Description validation:**
- Optional
- Can be empty string or null
- Stored as empty string if not provided
**UID validation:**
- Must be valid string format
- Checked when getting/updating/deleting
---
## Related Documentation
- [Projects Behavior](06-projects.md) - How areas relate to projects
- [Today Page Sections](02-today-page-sections.md) - How area filtering affects Today view
- [Architecture Overview](architecture.md) - Technical architecture
- [Backend Patterns](backend-patterns.md) - Module structure
- [Database & Migrations](database.md) - Data model details
- [Directory Structure](directory-structure.md) - File locations
**Technical Implementation Files:**
- Area model: [/backend/models/area.js](../backend/models/area.js)
- Areas service: [/backend/modules/areas/service.js](../backend/modules/areas/service.js)
- Areas controller: [/backend/modules/areas/controller.js](../backend/modules/areas/controller.js)
- Areas repository: [/backend/modules/areas/repository.js](../backend/modules/areas/repository.js)
- Areas routes: [/backend/modules/areas/routes.js](../backend/modules/areas/routes.js)
- Areas validation: [/backend/modules/areas/validation.js](../backend/modules/areas/validation.js)
- Frontend components: [/frontend/components/Area/](../frontend/components/Area/)
- Areas list page: [/frontend/components/Areas.tsx](../frontend/components/Areas.tsx)
- Area detail page: [/frontend/components/Area/AreaDetails.tsx](../frontend/components/Area/AreaDetails.tsx)
- Area modal: [/frontend/components/Area/AreaModal.tsx](../frontend/components/Area/AreaModal.tsx)
- Areas API client: [/frontend/utils/areasService.ts](../frontend/utils/areasService.ts)
- Integration tests: [/backend/tests/integration/areas.test.js](../backend/tests/integration/areas.test.js)
---
**Document Version:** 1.0.0
**Last Updated:** 2026-03-14
**Audience:** Developers, AI assistants, and end users