Files
komp_ac/web/CHANGELOG.md
2026-08-06 17:47:53 +02:00

146 lines
7.6 KiB
Markdown

# Changelog
All notable changes to the **komp_ac web** crate — the Axum SSR/HTMX web frontend
for the komp_ac gRPC backend — are documented in this file.
This changelog tracks only the **gRPC endpoints** the web crate consumes (the
browser never calls gRPC directly; Axum proxies to the backend through these
clients) and the extent to which each is used by the pages that mount them.
Other, non-API changes are intentionally out of scope.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
---
## [Unreleased]
### Added
- **`TableDefinition.ListColumnTypes`** — called by the add-table and
table-definition loaders. The whole response is consumed: `name`, `group`,
`declarable`, `compound`, `spelling`, `requires_currency`, `creation_only`,
`allows_quantity_ledger` and `sql_type` are each read by a rule that used to
be hardcoded in `crate::schema`. The column vocabulary is now the backend's,
so a type it adds is offered by both screens without a change here.
### Changed
- **The column-type picker is the server's list** — it no longer carries its
own. Types the web crate never offered are now reachable: `numeric` and the
`ACCOUNTING_TRANSFER` compound column. Server-generated companion types
(`phone_country`, `iban_bban`, the transfer connectors) are listed by the
endpoint but never offered, and are refused if one is posted anyway.
- **Creation-only types are refused on the append panel by rule, not by name** —
`POST /admin/table-definition/columns` used to exclude `accounting` alone;
it now excludes every type the response marks `creation_only`, which is what
`AddTableColumns` rejects.
- **Compound columns are staged as the backend expands them** — a compound
column takes its type's name, cannot be indexed, and is not offered as a row
display column, since no column of that name survives the expansion.
- **Currency and quantity-ledger rules come from the response** —
`requires_currency` decides which types carry a currency (previously MONEY
and ACCOUNTING by name), and `allows_quantity_ledger` both validates the
choice and writes the hint under the input.
- **`GetProfileDetails` columns show the SQL type behind them** — the
workspace's column list renders `sql_type` from the catalog beside each
logical type, including for the companion columns the backend generates.
## [v0.8.38] — 2026-08-05
The web crate wires up seven gRPC services and calls the following endpoints.
Coverage notes describe which pages exercise each call and how deeply its
response is consumed.
### Auth (`AuthServiceClient`)
- **`AuthService.Login`** — called by `POST /login`. Exchanges identifier and
password for an access token; the token and `expires_in` are written into the
`analytics_token` HTTP-only cookie that every subsequent gRPC call is signed
with. Fully covered end-to-end.
- **`AuthService.Register`** — called by `POST /register`. Submits the full
`RegisterRequest` surface (username, email, password, password_confirmation,
role, timezone, phone_country). Only the success/error message is shown; it
does not create a session.
- **`AuthService.GetAuthorization`** — called by every admin page loader
(`/admin`, table-definition, add-table, add-logic, add-validation,
import/export). Returns the caller's role; the web crate uses it for two
things: gating the admin panel to `role == "admin"` and rendering the navbar
with the current role. Response fields beyond `role` are not used.
### Table definition (`TableDefinitionClient`)
- **`TableDefinition.GetProfileTree`** — called by the analytics, admin, table
definition, add-table, add-logic, and add-validation loaders. Populates the
profile selectors (profile name + table count) and, in the admin panel, the
per-profile table list including `depends_on` and `row_display_columns`.
Response is consumed fairly deeply.
- **`TableDefinition.PostTableDefinition`** — called by `POST /admin/tables`
(add-table page). Creates a table from the draft; the returned `success`,
`sql`, and `message` are surfaced. Full form → endpoint mapping.
- **`TableDefinition.GetProfileDetails`** — called by the table-definition
workspace loader. Returns per-table columns (name, type, currency,
quantity-ledger, rounding, generated/read-only behaviors and `generated_from`
for Steel scripts), scripts (target column/type/description/source), row
display columns, and table kind. The most deeply consumed definition endpoint.
- **`TableDefinition.GetColumnAliasRenameHistory`** — called by the
table-definition workspace loader. Returns rename history entries
(table, old/new column names, timestamp); only those four fields are rendered.
- **`TableDefinition.AddTableColumns`** — called by
`POST /admin/table-definition/columns`. Adds columns to an existing table.
- **`TableDefinition.RenameColumnAlias`** — called by
`POST /admin/table-definition/rename`. Renames a table column alias.
- **`TableDefinition.DeleteTable`** — called by
`POST /admin/table-definition/delete`. Deletes a table definition.
- **`TableDefinition.CopyProfile`** — called by
`POST /admin/table-definition/copy`. Copies a profile.
- **`TableDefinition.CreateInvoiceTemplateTable`** — called by
`POST /admin/table-definition/invoice-template`. Creates a table from the
invoice template contract.
### Table script (`TableScriptClient`)
- **`TableScript.PostTableScript`** — called by `POST /admin/logic`
(add-logic page). Creates a Steel table script; the returned id and warnings
are surfaced to the user.
### Table validation (`TableValidationServiceClient`)
- **`TableValidationService.UpdateFieldValidation`** — called by
`POST /admin/validation`. Creates/updates a field validation.
- **`TableValidationService.UpsertValidationRule`** — called by
`POST /admin/validation/rules`. Creates/updates a reusable validation rule.
- **`TableValidationService.ApplyValidationSet`** — called by
`POST /admin/validation/sets`. Applies a validation set.
- **`TableValidationService.UpsertValidationSet`** — called by
`POST /admin/validation/sets`. Creates/updates a reusable validation set.
Each validation POST maps the submitted form into the corresponding request and
renders only the returned `success`/`message`.
### Table structure (`TableStructureServiceClient`)
- **`TableStructureService.GetTableStructure`** — called by the admin panel,
CSV import, and CSV export. Returns table structures used three ways: the
admin column browse (name, type, nullable, primary key, quantity-ledger),
import header validation, and export column ordering. Only the structure for
the selected/imported/exported tables is requested at a time.
### Tables data (`TablesDataClient`)
- **`TablesData.PostTableDataBulk`** — called by `POST /admin/import`. Chunked
bulk insert of parsed CSV rows into a table, with per-chunk requests.
- **`TablesData.GetTableDataByPosition`** — called by `POST /admin/export.csv`.
Reads table rows by position for CSV download, one request per table.
### Analytics (`AnalyticsServiceClient`)
- **`AnalyticsService.GetAnalyticsCatalog`** — called by `POST /api/catalog`.
Returns the live public analytics catalog for a profile (tables, columns,
types, links); rendered in the sidebar and used to generate starter queries
and LLM schema context.
- **`AnalyticsService.ExecuteAnalyticsQuery`** — called by `POST /api/query`.
Runs a read-only analytics SQL query; the result columns/rows feed the
ECharts charts and table view.
- The analytics profile selector is fed by `TableDefinition.GetProfileTree`
(see above), not by a dedicated analytics profile endpoint.