@ai-matrx/records-ui 0.85.4 → 0.85.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,116 @@
1
1
  # Changelog — @ai-matrx/records-ui
2
2
 
3
- ## Unreleased — lane DATA-V2-FACE (2026-09-24)
3
+ ## Unreleased — lane S5-PRIME (2026-09-24)
4
+
5
+ * **`ActionInbox` reaches Linear's and Superhuman's table stakes.** Grouped by kind (default:
6
+ Approvals, Agent proposals, Assigned to you) or by table, each heading counted; a `Group by`
7
+ control and `g` cycle kind → table → none; `j/k`, `x`, `a/d` walk the rows in the order they are
8
+ drawn. `h` / "Show decided" brings closed items in, and **a closed item says who decided it and
9
+ when** ("Approved by … · <time>", or "Withdrawn when … archived it") with the store's sentence and no
10
+ controls. **An empty inbox says why** (what arrives here; nothing ever decided; or, narrowed to a
11
+ table, how many wait in other tables with "Show all"). `tableId` now actually narrows (it kept every
12
+ row). Exports `groupInbox`, `InboxGrouping`, `INBOX_GROUPINGS`; `enumLabels` adds
13
+ `WORK_INBOX_KIND_GROUP_LABEL`, `WORK_APPROVAL_STATES`, `WORK_APPROVAL_STATE_LABEL`. Suite
14
+ `inbox-groups-and-closed-items.test.tsx`: RED 6/6 on the prior bytes, GREEN 6/6. Needs
15
+ `@ai-matrx/records` with the S5-PRIME `WorkInboxItem` fields.
16
+
17
+ ## Unreleased — lane VIEW-KEYS-SHEET (2026-09-24)
18
+
19
+ * **The Sheet is designated one way: `layout: "sheet"`.** `designatedLayoutOf` no longer reads the
20
+ mover's mark (`moved_from.kind = "default_view"` with no layout) as the Sheet; `moved_from` is
21
+ provenance only. The store's view-keys registry declares `sheet` as a layout, the mover writes it,
22
+ and a production repair wrote it on every copied table's default view (none left on the mark
23
+ alone — measured on production before this change). Suites: `a-table-opens-the-way-it-was-designated.test.tsx`
24
+ (the mark alone designates nothing: RED on the prior bytes, GREEN), `the-designated-default-wins-over-a-seed.test.tsx`.
25
+
26
+ ## Unreleased — lane UI-FIX-18 (2026-09-24)
27
+
28
+ * **A card is titled by what names its record** (VERIFIER-18 H5). New `cardTitleField(fields, titleKey,
29
+ exclude)` in `names.ts`: the Table's `title_field` → a conventional name key → the first text column
30
+ in declared order → any other column that can title; never a checkbox, the group/stage column or a
31
+ system stamp. The kanban, the calendar and the pipeline all read it (the kanban used to take the
32
+ first non-group column, so a board grouped by Stage read "false"/"true"). The table's title column
33
+ is handed down by the host that already read the table — new `ViewSwitcher` prop `titleField`
34
+ (TablePage passes it) and `PipelineBoard` prop `titleKey`; neither reads the table a second time.
35
+ Suite `a-card-is-titled-by-what-names-its-record.test.tsx` (RED 1/7 on the prior bytes, GREEN 7/7).
36
+ * **A date is a date — the control and the text follow the stored value, never `config.kind` alone**
37
+ (correction to the 0.85.6 date line). `carriesTimeOfDay(field, value)` / `dateFormatFor(field, value)`
38
+ read the value's shape: a value with no time part (a date of birth on a `kind: "datetime"` Field) gets
39
+ a date-only control and a date-only reading in the grid, the form, the panel and the calendar; with no
40
+ value, only `format: "datetime"` or the store's own Created / Last changed stamps carry a time. The
41
+ one-day-early fix stays: a bare date is read as a local calendar day. The recorded public form's
42
+ "date of birth" asks for a date again (`demo/form-runner.test.tsx` GREEN on the unchanged fixture);
43
+ the date suite gains the birthday clauses (GREEN 15/15).
44
+ * **A dashboard save is confirmed, and what the store did not keep is said** (VERIFIER-18 M2). Every
45
+ `declare()` on the canvas (shape, grouping, comparison, target, remove) reads the dashboard back and
46
+ `whatTheStoreDidNotKeep(sent, stored)` names any setting the store answered differently, on its block
47
+ ("The store did not keep its comparison for “Jobs by status”…"), in a status line; the controls show
48
+ what the store really holds. Suite `a-dashboard-save-says-what-the-store-did-not-keep.test.tsx`
49
+ (RED 4/4 on the prior bytes, GREEN 4/4); S3 and canvas suites still green.
50
+ * **A withheld value says why, in every layout** (VERIFIER-18 H1, the screen half). New `withheld.tsx`
51
+ is the one helper: `withheldNoticeOf(hidden, key)`, `withheldSentence(field, notice)` (the store's
52
+ own `says` — "Budget with contingency is worked out from Budget, which you have not been given." —
53
+ or its reason, the level it needs and the other way in), `WithheldValue` and `WITHHELD_WORD`.
54
+ `RecordValue` takes `withheld` and draws "Withheld" with the sentence on hover and for screen
55
+ readers, never "—"; the grid cell, the editing cell, the gallery, the record panel and the public
56
+ page hand it `row.hidden[key]`; every card (kanban, calendar, pipeline, unplaced list) reads one
57
+ `cardWords(record, field, labels)`; the export writes "Withheld: <sentence>". A source guard refuses a
58
+ `<RecordValue` that draws a row's value without its notice. Suite
59
+ `a-withheld-value-says-why-in-every-layout.test.tsx` (RED 5/6 on the prior bytes, GREEN 6/6).
60
+ * **`TablesHome makingOnly`** (VERIFIER-18 M3): only the ways to make a table (New table, Start from an
61
+ example, the import that follows) and none of the lists — no table sections, no dashboards list (and
62
+ no `dashboards` read), no booking pages, no "Show everything" line. matrx-frontend's organization hub,
63
+ which lists the organization's tables (pick lists under "Kept by the app"), dashboards and booking
64
+ pages itself, passes it once this version is in its lockfile, so the page draws one list. Default
65
+ false. Suite `the-organization-page-lists-its-tables-once.test.tsx` (RED 1/2 on the prior bytes,
66
+ GREEN 2/2).
67
+ * **Exported for hosts:** `resolveTableStyle` and `styleFromDecorations` (the one color resolver —
68
+ matrx-frontend's Sheet moves onto them and deletes its own translation once this version is in its
69
+ lockfile), the date helper (`dateText`, `calendarDayOf`, `calendarDayLabel`, `carriesTimeOfDay`,
70
+ `dateFormatFor`, `hasTimePart`, `isDateField`) and `cardTitleField`.
71
+
72
+ ## 0.85.6 (2026-09-24 — published by PUBLISH-SWEEP-5)
73
+
74
+ **Needs `@ai-matrx/records` 0.58.4** (published first: its catalogue carries the doors this release
75
+ draws — `table_home`, `table_move`, `portal_form`, the `entity_reference` kind). 0.85.5 (the release
76
+ run's automatic tag) never reached npm: `every-kind-the-store-takes-is-on-the-menu` found
77
+ `entity_reference` published by the store with nothing classifying how the menu sends it (it goes as
78
+ its word, with `allowed_types`, exactly like `signature`); and `every-table-row-says-where-it-lives`
79
+ asserted the door-absent sentence for `custom.table_home`, which is live now — it asserts the store is
80
+ asked once, when the chip is pressed, and that its organization is drawn (RED on the pre-apply
81
+ catalogue, GREEN on the live one).
82
+
83
+ ### Lane UI-FIX-18 (2026-09-24)
84
+
85
+ * **A date reads the same day in every layout, in every time zone** (VERIFIER-18 H2). New `dates.ts`
86
+ is the one date helper: `dateText` prints through the design system's registry (`formatFieldValue`,
87
+ what the grid already used), `calendarDayOf` / `calendarDayLabel` file and head a calendar day
88
+ without UTC midnight, `carriesTimeOfDay` / `dateFormatFor` read `config.kind` (with the older
89
+ `format: "datetime"` honoured). `scalarText` (gallery, cards, record panel, history), the calendar,
90
+ the date editor and `formatForField` all read it. A bare `2026-04-01` is Apr 1 in Los Angeles and in
91
+ Tokyo, never Mar 31. Suite `a-date-reads-the-same-day-in-every-layout.test.tsx` (RED 7/13 on the
92
+ prior bytes, GREEN 13/13), with a source guard refusing `toISOString().slice(0, 10)` and UTC-midnight
93
+ dates in any screen.
94
+ * **Created time and Last changed time print like every other date and time** (VERIFIER-18 M1):
95
+ `formatForField` answers `{ id: "datetime" }` for `config.system` `created_time` / `modified_time`, so
96
+ the grid, gallery, record panel and the panel's "Worked out by the system" line read
97
+ *Sep 24, 2026, 5:13 PM*, not `2026-09-25T00:13:34.564Z`.
98
+
99
+ ### Lane DATA-V2-FACE-2 (2026-09-24)
100
+
101
+ * **One name, one place: the Grid draws no name of its own.** `Grid` no longer draws the table's name
102
+ and row count above the records, nor the design system's per-browser working-view tabs ("Default
103
+ view" + "+") and "Default view ▾" menu (`viewTabs={false}`, no `tableId` handed to `MatrxDataTable`).
104
+ The page that places the grid names the table; the page's view bar is the one place views live; the
105
+ data table's footer counts the rows. `toolbarActions` still draw, on their own row, only when given.
106
+ Suite: `the-grid-names-nothing-the-page-already-names.test.tsx` (RED 3/3 on the prior bytes, GREEN 3/3).
107
+ * **`defaultViewOf(views)`** — when two views both claim the table's default (the mover's designated
108
+ Sheet and a page seed a later move of the view bar's older store brings in, both "All records"), the
109
+ designated one wins; `ViewBar` opens on it. Suite `the-designated-default-wins-over-a-seed.test.tsx`.
110
+ * **`WhereItLives` `variant="title"`** — quiet, frameless, for the page header beside the object's name
111
+ (matrx-frontend's /data-v2 table header uses its own copy today; the swap keeps the look).
112
+
113
+ ### Lane DATA-V2-FACE (2026-09-24)
4
114
 
5
115
  * **A table opens the way it was designated, and its face is one row.** `TablePage` draws, above the
6
116
  records, only the saved-views bar (when the table has two or more views, or the person asked for it),
@@ -17,13 +127,16 @@
17
127
  (no second "All records" is seeded beside it). A package layout (`grid`, `kanban`…) never designates,
18
128
  because a click writes those; on a designated table a layout picked from the menu is for the visit and
19
129
  is never written over the designation.
130
+ * `TablePage` takes `leading` (the host's quiet where-it-lives chip, at the start of the one row) and
131
+ `menuExtras` (host capabilities in the table menu, e.g. "When a row changes, run an agent…").
132
+ `designatedLayoutOf`, `tableOpening` and `TABLE_MENU` are exported.
20
133
  * `ViewSwitcher` takes `chooser={false}` (the page draws the choice) and `openExport`; a host layout's
21
134
  `render` receives `openExport`, so the Sheet's "Export this table…" opens the page's own export.
22
135
  `ViewBar` takes `quietWhenAlone` and `onViews`.
23
136
  * Tests: `a-table-opens-the-way-it-was-designated.test.tsx` (RED 3/3 against the pre-lane page, GREEN
24
137
  8/8); `every-table-can-reach-its-archive.test.tsx` now reaches Archived through the menu.
25
138
 
26
- ## Unreleased — lane SC-1-TAILS (2026-09-24)
139
+ ### Lane SC-1-TAILS (2026-09-24)
27
140
 
28
141
  * **`WhereItLives`** — the one chip for "Lives in <organization>" and moving a table, moved here from matrx-frontend
29
142
  so every host (and `TablesHome`) mounts the same builder. The consequence is said in the panel before "Move it";
@@ -35,6 +148,12 @@
35
148
  * **Consumer action:** matrx-frontend passes `organizationName` to `TablesHome` in `OrganizationHub.tsx` and swaps
36
149
  its three `WhereItLives` call sites to this export.
37
150
 
151
+ ## 0.85.5
152
+
153
+ Automatic changed-only republish (docs/metadata drift since the last tag — see
154
+ `git diff npm/records-ui/v0.85.4..npm/records-ui/v0.85.5 -- apps/shared/records-ui`).
155
+ No source changes intended and no consumer action required.
156
+
38
157
  ## 0.85.4 (2026-09-24 — published by PUBLISH-SWEEP-5; folds every section below down to 0.84.8)
39
158
 
40
159
  **0.85.3 never reached npm** (the release run's automatic tag, run 36064683447): every test passed
@@ -80,6 +199,9 @@ integrator's sweeps (`79b505cfa5`, `9a6618f2d0`, `452e363c2e`) rather than their
80
199
  Every change is one `custom.action_declare` with the whole list; a store refusal is shown under the
81
200
  form and what was typed stays. Same controls as the field panel. Suite
82
201
  `an-owner-writes-the-tables-own-buttons.test.tsx`: RED 6 on the bytes without the section, GREEN 8.
202
+ * **An agent action is never labelled "a column it changes is gone".** The store answers `runnable: false`
203
+ for every agent action; the badge is for update actions only (found on the live walk of Rincon's Invoices;
204
+ test RED → GREEN).
83
205
  * **A button declared in settings appears on the grid beside it without a reload.** `rowActionsChanged(tableId)`
84
206
  (gridActions.tsx): every mounted `useTableActions` of that table reads `custom.row_actions` again after a
85
207
  declare. Test RED without the listener, GREEN with it.