# 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.