Skip to content

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/lmstudio Configure the global LM Studio connection (administrators only).
/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.

Configure LM Studio

Sign in as an administrator and select Administration > LM Studio in the navigation menu, or Configure LM Studio on the Settings page. Enter the server URL, the identifier of the loaded model, and a strictly positive timeout in seconds, then select Save settings.

If LM Studio requires authentication, enter its token in the masked API token field (without the Bearer prefix). The API sends it as Authorization: Bearer .... The saved token is never returned to the browser. Leave the field blank to keep the current token, enter a new value to replace it, or select Remove saved token to disable authentication. After saving, the token input is cleared.

For LM Studio running on the Docker Desktop host, the server URL is typically http://host.docker.internal:1234, not localhost. Do not append /v1/chat/completions. Enable network access in LM Studio and allow the connection through the host firewall.

The settings are persisted in the API database via /api/v1/lmstudio/settings; they are not deployment environment variables. They survive restarts and apply to the next prompt without restarting the API. The page reports when no configuration exists, validates input, and displays loading or save errors instead of reporting success. See LM Studio settings for the API contract.

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 java/api/target/site/jacoco/index.html
Java client java/java-client/target/site/jacoco/index.html
React backend react/backend/coverage/index.html
React client react/react-client/coverage/index.html
Dart client flutter/dart-client/coverage/lcov.info