Web Console¶
The backend webapp is a React, Vite, and MUI console for tasks, reusable tags, and hierarchical nomenclatures. It identifies resources by server-generated id and presents business fields directly instead of editing a generic JSON payload.
Run the Console¶
Start the API and the webapp from the repository root:
make java-run
make react-run
Open http://localhost:5173. The webapp reads the API base URL from VITE_API_BASE_URL; the Docker stack builds it with http://localhost:8989, while direct local development defaults to http://localhost:8080.
Routes¶
| Route | Purpose |
|---|---|
/ |
Dashboard with task metrics and recent tasks. |
/tasks |
List, import, export, print, and delete tasks. |
/tasks/new |
Create a task with a structured form. |
/tasks/{id} |
View and print one task by ID. |
/tasks/{id}/edit |
Update its mutable fields by ID. |
/tags |
Manage reusable task tags. |
/nomenclatures |
Manage reusable hierarchical classifications. |
/settings |
Manage your user settings; administrators also manage the ANONYMOUS role settings. |
/admin/users/{id}/edit |
Edit a user in the Account tab and its user settings in the Settings tab (administrators only). |
/about |
Show API, documentation, and Swagger UI links. |
View Mode¶
Use the icons in the top bar or the /settings page to choose bright, dark, or system mode. The selected mode is saved in local storage and, when signed in, in the user settings through /api/v1/settings/user/me. Anonymous visitors start with the ANONYMOUS role settings.
The Settings tab of the user edit page is only available for users with the USER role.
List Tasks¶
The Tasks page presents task identity, workflow status, priority, and business fields. Desktop and tablet layouts use MUI DataGrid. Mobile layouts provide the same view, edit, and delete actions in a compact list.
Create or Update a Task¶
For creation, enter a required unique code, a required label, and an optional description. Choose status (TODO, IN_PROGRESS, DONE, or CANCELLED) and priority (LOW, NORMAL, HIGH, or URGENT); defaults are TODO and NORMAL. Due date is an optional YYYY-MM-DD date, and assignee is optional free text, not a user foreign key.
Select existing tags and an optional nomenclature. Tasks store their IDs as tagIds (default []) and nullable nomenclatureId; create these reusable entries first. The server assigns ID, audit timestamps, and audit actors. Create calls POST /api/v1/task.
For update, the console loads /tasks/{id} and disables code because it is immutable. Only mutable fields are sent to PUT /api/v1/task/{id}; code is excluded.
Manage Tags and Nomenclatures¶
Tags are flat, reusable task labels. Nomenclatures are reusable classifications
with an optional parent, for example Engineering → Release. Both have
id, code, label, description, createdDate, lastModifiedDate,
createdBy, and lastModifiedBy; nomenclatures additionally have nullable
parentId. Creation accepts code, label, description, and optional parent;
updates never send code.
The API requires references to exist and rejects self-parenting and hierarchy cycles. A tag or nomenclature referenced by a task cannot be deleted, nor can a nomenclature with children. Remove or change references first.
Delete a Task¶
The delete action asks for confirmation, then calls DELETE /api/v1/task/{id}.
Task deletion archives the record; archived tasks disappear from normal views.
View and Print¶
The detail page shows task fields and audit metadata. Print actions request PDF output from the API and open it in a new browser tab. Use the PDF viewer's Print control to choose a printer. The list also supports printing all or selected tasks; see PDF printing.
Import and Export¶
The Tasks page can seed sample tasks and import or export JSON and CSV. Seed and import upsert by code: existing tasks are updated and missing ones are created. Imported IDs, timestamps, and audit actors never replace server-owned values.
JSON import accepts an array of records:
[
{
"id": 42,
"code": "RELEASE-001",
"label": "Prepare release",
"description": "Review the release checklist",
"status": "TODO",
"priority": "HIGH",
"dueDate": "2026-11-01",
"assignedTo": "alice",
"tagIds": [],
"nomenclatureId": null,
"createdDate": "2026-08-30T17:00:00Z",
"lastModifiedDate": "2026-08-30T17:00:00Z"
}
]
CSV import uses this header:
id,code,label,description,createdDate,lastModifiedDate,status,priority,dueDate,assignedTo,tagIds,nomenclatureId
42,RELEASE-001,Prepare release,Review the release checklist,2026-08-30T17:00:00Z,2026-08-30T17:00:00Z,TODO,HIGH,2026-11-01,alice,,
Tag IDs use semicolons within their CSV cell (for example 3;7), not a JSON
array. Empty tag IDs mean []; empty due date, assignee, and nomenclature mean
null. Blank status and priority use their defaults. The legacy six-column
header is accepted for import; exports use the extended header.
Both formats round-trip exports. Import uses code, label, description, and task workflow/assignment/taxonomy fields; server-owned identity and audit values are ignored. Referenced tags and nomenclatures must already exist in the same database with matching IDs; taxonomy IDs are not automatically remapped between environments. See the API format reference for CSV encoding.
Coverage¶
Generate coverage reports for the monorepo:
make coverage
Reports are written to:
| Stack | Report location |
|---|---|
| Java API | template-java-api/target/site/jacoco/index.html |
| Java client | template-java-api-client/target/site/jacoco/index.html |
| React backend | template-react-backend/coverage/index.html |
| React client | template-react-api-client/coverage/index.html |
| Dart client | template-flutter-api-client/coverage/lcov.info |