Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,10 @@ export const MyComponent = () => {
| `src/components/ProjectSheet.tsx` | Shared Sheet (drawer) for add and edit project forms; handles both modes via `mode` prop |
| `src/components/CategorySheet.tsx` | Shared Sheet (drawer) for add and edit category forms; handles both modes via `mode` prop |
| `src/pages/Clients.tsx` | Thin page wrapper around `ClientManagement` (route `/clients`) |
| `src/pages/ProjectPlanning.tsx` | Per-project Initiative planning view (route `/projects/:id/planning`); shows `InitiativeTimeline` and the add/edit `InitiativeSheet` |
| `src/components/InitiativeSheet.tsx` | Shared Sheet (drawer) for add/edit/delete of a planning `Initiative`; deadline is a specific date or a calendar quarter |
| `src/components/InitiativeTimeline.tsx` | Roadmap-style timeline for a project's Initiatives — status-grouped collapsible swimlanes, month-scale header, "Today" line |
| `src/utils/initiativeUtils.ts` | `resolveInitiativeDeadline`/`parseLocalDate` — date-vs-quarter deadline resolution without the UTC-midnight day-shift bug |
| `src/services/localStorageService/clients.ts` | Client persistence module for guest mode (versioned localStorage blob) |
| `supabase/migrations/20260530_clients.sql` | `clients` table + RLS + one-time backfill from distinct project clients |
| `src/components/AppSidebar.tsx` | Collapsible sidebar nav (Planning/Manage/Reports groups); reads page title/actions from `PageTitleContext`; footer has print button, sync status, and auth |
Expand Down
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Added

- Each project now has its own Planning view — a goal/deadline/status "Initiative" entity scoped to that project, shown as a GitHub-Projects-style Roadmap timeline (status-grouped, collapsible swimlanes, a month-scale header, and a "Today" line), reached via a new "Planning" link on each project card. Deadlines are either a specific date or a calendar quarter (rendered as the quarter's end date); status is set manually (Not started/In progress/Done/Blocked). Backed by a new `Initiative` entity behind the existing `DataService` abstraction — guest localStorage, Supabase (`planning_initiatives` table, RLS, no FK to `projects` since default project ids are shared across accounts — cascade delete is handled at the app layer instead), and the self-hosted SQL backend (`server/repositories/initiatives.ts`, `/api/initiatives`)
— `src/components/InitiativeSheet.tsx` (new), `src/components/InitiativeTimeline.tsx` (new), `src/pages/ProjectPlanning.tsx` (new), `src/utils/initiativeUtils.ts` (new), `src/contexts/TimeTrackingContext.tsx`, `src/services/dataService.ts`, `src/services/supabaseService.ts`, `src/services/sqlApiService.ts`, `src/services/localStorageService/initiatives.ts` (new), `server/repositories/initiatives.ts` (new), `server/schema.ts`, `server/app.ts`, `supabase/migrations/20261023_planning_initiatives.sql` (new), `src/pages/ProjectList.tsx`, `src/App.tsx`
- Task board now has sort (Priority, Title A–Z, Newest first, Oldest first) and filter (project, client, category) controls above the columns, applying to all four status columns at once. Choices persist to `localStorage` (`timetracker_task_board_view`), not Supabase, so they're per-browser only. New `useTaskBoardView` hook holds the sort/filter state and reconciles it with `plannedTasks`
— `src/hooks/useTaskBoardView.ts` (new), `src/components/KanbanBoardControls.tsx` (new), `src/components/KanbanBoard.tsx`
- Starting a day from the task board no longer requires a detour through the Dashboard. The Tasks page header has a "Start Day" button (starts at the current time, rounded to 15 minutes, without the start-time dialog), and each planned task's menu offers "Start Day and Pull" (or "Start Day and Resume" for in-progress tasks) when no day is running. New context method `startDayAndPullPlannedTask` starts the day and the task in one step; it is blocked while an ended day is still awaiting posting. Pull/add/start-day-and-pull share one internal helper, and `startNewTask` now delegates to an internal `beginTask` that takes the day state explicitly so a day and its first task can be created in the same tick without a stale-closure save
Expand Down
16 changes: 16 additions & 0 deletions README-EXT.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ For the main overview, see [README.md](README.md).
- [Daily Workflow](#daily-workflow)
- [Keyboard Shortcuts](#keyboard-shortcuts)
- [Project Management](#project-management)
- [Project Planning](#project-planning)
- [Client Management](#client-management)
- [Category Management](#category-management)
- [Data Export & Import](#data-export--import)
Expand Down Expand Up @@ -121,6 +122,17 @@ The sidebar footer contains two key elements:

Projects enable automatic revenue calculation, per-client invoice exports, and archive filtering.

### Project Planning

Each project has its own Planning view (the "Planning" link on its project card) for tracking goals and timelines, separate from day-to-day task tracking.

1. Click **New Initiative** and enter a name, an optional goal, and a deadline — either a specific date or a calendar quarter (shown on the timeline as that quarter's last day).
2. Status (Not started / In progress / Done / Blocked) is set manually; new initiatives start as Not started and the status field is editable once an initiative exists.
3. The timeline groups initiatives into collapsible, status-grouped swimlanes on a six-month, month-scale window with a "Today" line, styled after GitHub Projects' Roadmap view. Each bar spans from the initiative's creation date to its deadline.
4. Click an initiative's row to edit it, or delete it from the edit sheet (undoable, like other deletes in the app).

Initiatives are scoped to one project — there is no cross-project planning view. Deleting a project deletes its initiatives too.

### Client Management

1. Navigate to **Settings → Manage Clients**.
Expand Down Expand Up @@ -406,6 +418,8 @@ src/
│ ├── DaySummary.tsx
│ ├── DeleteConfirmationDialog.tsx
│ ├── ExportDialog.tsx
│ ├── InitiativeSheet.tsx # Add/edit/delete sheet for a project's planning Initiatives
│ ├── InitiativeTimeline.tsx # Roadmap-style status swimlanes for a project's Initiatives
│ ├── InstallPrompt.tsx
│ ├── KanbanBoard.tsx # Kanban planning board
│ ├── KanbanBoardControls.tsx # Sort/filter bar above the board, backed by useTaskBoardView
Expand Down Expand Up @@ -462,6 +476,7 @@ src/
│ ├── Index.tsx # Dashboard (start/end day, stats)
│ ├── NotFound.tsx # 404 page
│ ├── ProjectList.tsx # Project management
│ ├── ProjectPlanning.tsx # Per-project Initiative timeline ("Planning" link on a project card)
│ ├── Report.tsx # AI weekly summary
│ ├── Settings.tsx # App settings
│ └── TaskList.tsx # Active task list and NewTaskForm
Expand All @@ -474,6 +489,7 @@ src/
│ ├── calculationUtils.ts # Revenue and hours calculations
│ ├── checklistUtils.ts # GFM checklist extraction
│ ├── exportUtils.ts # CSV import/export
│ ├── initiativeUtils.ts # Initiative deadline resolution (date/quarter) and local-date parsing
│ ├── reportUtils.ts # Report grouping and formatting
│ └── timeUtil.ts # Time formatting, 15-minute rounding, zero-floored `elapsedMs`, end-before-start check
├── App.css
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ A Progressive Web App (PWA) for time tracking built with React, TypeScript, and
- **Keyboard Shortcuts** — `N` new task, `Cmd/Ctrl+S` save, `Cmd/Ctrl+K` command palette, `?` for the shortcuts help dialog (web and Tauri desktop; the desktop app's native menu also offers `Cmd/Ctrl+N` for new task); the sidebar footer now includes a Print button for quick printing
- **No Account Required** — full functionality with local storage; optional cloud sync via Supabase
- **Self-Hosted SQL Backend** — optionally run against your own PostgreSQL or MySQL database instead of Supabase or local storage (see [docs/SQL_BACKEND.md](docs/SQL_BACKEND.md))
- **Project Planning View** — set a goal, status, and deadline (date or quarter) for initiatives scoped to a project, visualized as a Roadmap-style timeline
- **PWA** — installable on desktop/mobile

---
Expand Down Expand Up @@ -134,6 +135,7 @@ See [CHANGELOG.md](CHANGELOG.md) for the full history of changes.

**Recent highlights:**

- **Project planning view** — per-project goal/deadline/status "Initiatives" shown on a GitHub-Projects-style Roadmap timeline (status swimlanes, month-scale header, "Today" line)
- **Keyboard shortcuts** — global `N`/`Cmd/Ctrl+S`/`Cmd/Ctrl+K` shortcuts and a `?` help dialog in the web/PWA build, plus native `Cmd/Ctrl+N`/`Cmd/Ctrl+S`/`Cmd/Ctrl+K` menu accelerators in the Tauri desktop build
- **Guest-mode data durability** — schema-mismatch backups, write-failure toasts, undo for hard deletes, Tauri desktop disk-based backup snapshots (independent of `localStorage`, including a final flush on app quit), and an in-app "Data Recovery" UI in Settings to preview and restore those backups
- **Self-hosted SQL backend** — opt-in PostgreSQL/MySQL support via a small REST API (`server/`), alongside the existing Supabase and local storage modes
Expand Down
Loading
Loading