feat(projects,time): task creation, budget input, project/task time logging (MAPPS-128) #91

Merged
longjacksonle merged 1 commit from feat/mapps-128-project-task-budget-logtime into main 2026-06-07 06:25:23 +02:00

What

Exposes the three project write paths the backend (PMS-51) supports but the SPA did not: creating a task, assigning a budget, and logging time against a project/task.

Closes MAPPS-128.

How

  • Budget on New Project (ProjectNewPage): Budget Amount + Budget Hours inputs, sent on POST /api/v1/projects when set.
  • Add Task (ProjectDetailPage): an "Add Task" button opens a modal (title, status from /task-statuses, priority, estimated hours, due date, optional assignee from /auth/users) that POSTs to /api/v1/projects/:id/tasks and refreshes the Tasks card on success.
  • Log time to a project/task (TimeEntryNewPage): the Work Item picker now lists projects alongside tickets. Select values are prefixed ticket: / project:; a ticket supplies its company, a project supplies its own (only projects with a company are listed, since a time entry's company_id is required). Picking a project reveals an optional Task picker from that project's tasks. The entry carries project_id (+ task_id) and the project's company_id; approved project/task time rolls into the project actuals.

Stacked on #88 + #89

Built on the MAPPS-126/127 branch (reuses the projects wiring). Until those merge, this PR's diff also shows their changes. Merge #88, then #89, then this.

Verification

  • cargo fmt --check clean; cargo clippy --target wasm32-unknown-unknown --all-targets -- -D warnings clean.
  • Live end-to-end against the dev stack: project-with-company-and-budget create, task create (status/priority/estimate/due), and a project_id+task_id time entry all returned 200. Test data cleaned up.

🤖 Generated with Claude Code

## What Exposes the three project write paths the backend (PMS-51) supports but the SPA did not: creating a task, assigning a budget, and logging time against a project/task. Closes MAPPS-128. ## How - **Budget on New Project** (`ProjectNewPage`): Budget Amount + Budget Hours inputs, sent on `POST /api/v1/projects` when set. - **Add Task** (`ProjectDetailPage`): an "Add Task" button opens a modal (title, status from `/task-statuses`, priority, estimated hours, due date, optional assignee from `/auth/users`) that `POST`s to `/api/v1/projects/:id/tasks` and refreshes the Tasks card on success. - **Log time to a project/task** (`TimeEntryNewPage`): the Work Item picker now lists projects alongside tickets. Select values are prefixed `ticket:` / `project:`; a ticket supplies its company, a project supplies its own (only projects with a company are listed, since a time entry's `company_id` is required). Picking a project reveals an optional Task picker from that project's tasks. The entry carries `project_id` (+ `task_id`) and the project's `company_id`; approved project/task time rolls into the project actuals. ## Stacked on #88 + #89 Built on the MAPPS-126/127 branch (reuses the projects wiring). Until those merge, this PR's diff also shows their changes. **Merge #88, then #89, then this.** ## Verification - `cargo fmt --check` clean; `cargo clippy --target wasm32-unknown-unknown --all-targets -- -D warnings` clean. - Live end-to-end against the dev stack: project-with-company-and-budget create, task create (status/priority/estimate/due), and a `project_id`+`task_id` time entry all returned 200. Test data cleaned up. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(projects,time): task creation, budget input, and project/task time logging (MAPPS-128)
All checks were successful
Check / clippy + fmt + tests (pull_request) Successful in 42s
Create release / Create release from merged PR (pull_request) Has been skipped
841b73d366
Exposes the three project write paths that the backend (PMS-51) supported but the SPA did not.

New Project form (ProjectNewPage): adds Budget Amount and Budget Hours inputs, parsed and sent on POST /api/v1/projects when set, so a budget can be assigned at creation.

Project detail (ProjectDetailPage): adds an "Add Task" button opening a modal (title, status from /task-statuses, priority, estimated hours, due date, optional assignee from /auth/users) that POSTs to /api/v1/projects/:id/tasks and refreshes the Tasks card on success.

Log Time (TimeEntryNewPage): the Work Item picker now offers projects alongside tickets. Select values are prefixed ticket: / project: to disambiguate; selecting a ticket supplies its company, selecting a project supplies the project's company (only projects that have one are listed, since a time entry's company is required). When a project is picked, an optional Task picker appears, populated from that project's tasks. The created entry carries project_id (+ task_id) and the project's company_id; approved project/task time then rolls into the project actuals.

Verified end to end against the dev stack: project-with-company-and-budget create, task create, and a project+task time entry all return 200.

Stacked on MAPPS-126 (#88) and MAPPS-127 (#89); merge those first.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
longjacksonle deleted branch feat/mapps-128-project-task-budget-logtime 2026-06-07 06:25:23 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
psa-systems/mokosh-apps!91
No description provided.