@ai-matrx/records-ui 0.85.18 → 0.88.0

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,12 +1,143 @@
1
1
  # Changelog — @ai-matrx/records-ui
2
2
 
3
- ## 0.85.18
3
+ ## 0.88.0 (2026-09-26 — type-to-edit; needs @ai-matrx/design-system 0.43.0)
4
+
5
+ - **Type to edit (both grids).** Select a cell and type: the cell opens ITS OWN Field editor
6
+ holding what was typed — a letter, an IME composition, an Option/AltGr character, dictation —
7
+ through design-system 0.43's type catcher and `spreadsheet.onEditRequest`. A column a person
8
+ types into opens with the typed text replacing the value (numbers only when it is a number); a
9
+ picker column opens as usual; a worked-out column or a row this person may not write swallows
10
+ nothing. The editor opens with the caret at the end. `GridEditing.begin(address, seed?)`.
11
+ - **"Who changed this?" moved off the bare `h`** (it clashed with typing): Option-Shift-H
12
+ (`asksWhoChanged`, read off `code`), the cell's own badge, and the merged grid's right-click
13
+ Cell section ("Who changed this? ⌥⇧H").
14
+ - Test doubles: `store-rule-gaps.test.tsx` answers `field_options` (the column settings read an
15
+ existing choice column's words for its colours) — 0.87.0's CI publish failed on it.
16
+
17
+ ## Unreleased
18
+
19
+ - **Fix: the one toolbar row never overlaps and never spills** (lane V25-UI-FIXES; VERIFIER-25 on
20
+ production at 1600 px: with Settings open, the purple *Settings* button and the grid's *Manual*
21
+ sort chip overprinted; with a personal look pending the row ran to 1663 px in 1532 px, *New record*
22
+ cut to "Ne", *Layout* past the edge). The layout's slot in `TablePage`'s row is its own sideways
23
+ scroller, so what a layout draws there can never spill over the buttons after it; every piece
24
+ after the slot keeps its width. The row MEASURES its pieces (`useToolbarFit`, `toolbarFit.ts`) and,
25
+ when they do not fit, folds the least it must — first your look's three doors into one
26
+ **Your look** menu (same doors, same words), then the inline layout chooser into the table's menu
27
+ (where a phone already has it) — from widths measured unfolded, so it never flips back and forth.
28
+ Pure `toolbarFold` and the layout pair guard `overlappingPieces` are exported for walks. Suites:
29
+ `the-toolbar-row-never-overlaps.test.tsx` RED 5/5 on 0.87.0 bytes → GREEN 5/5;
30
+ `toolbarFit.test.tsx` 7/7.
31
+
32
+ ## 0.87.0 (2026-09-25 — one-grid merge step 5 + tranches 6a / 6b; needs @ai-matrx/design-system 0.42.0)
33
+
34
+ - **THE MERGED GRID, behind a temporary switch (`RecordsUiHost.grid?: "classic" | "merged"`,
35
+ default `classic`).** Arman and the custom-data lead ruled that the older /data grid's behaviour
36
+ becomes THE table grid in this package. `merged` lays its control layer over `Grid`'s data paths
37
+ (`gridControls.tsx`, pure builders in `gridMenus.ts`):
38
+ - **Column header menu** (`MatrxColumnDef.headerMenu`): Rename column, Column settings…, Insert
39
+ column left… / right…, Use as row label (`title_field`), Hide column, Delete column… — each
40
+ through the store's own doors (`field_update`, `field_declare` via `FieldEditor`,
41
+ `field_retire`, the table record's `title_field`); a person who may not change the table's
42
+ shape sees each item with the reason, never a dead one.
43
+ - **Right-click** (`contextMenu.sections`): Cell (copy, paste, clear, who changed this, show rows
44
+ with this value), Row (open record, row history, copy row, insert row above/below on a
45
+ hand-ordered view, duplicate, delete), Column (sort A→Z / Z→A / clear, plus the header items),
46
+ Table (new record, add column); a selected range gets copy / clear / fill down. Every write is
47
+ the grid's own versioned cell write.
48
+ - **Column order and hidden columns are kept on the view's look** (`presentation.columnOrder` —
49
+ new, sparse like `widths` — and `presentation.hiddenFields`), written through
50
+ `onPresentationChange` (the table page's `view_look_set`), so they survive a reload.
51
+ - A column inserted left/right of another lands beside it in the view's order.
52
+ - **Merge step 5 (pure refactor):** `Grid.tsx`'s drawing parts moved to `gridColumns.tsx`
53
+ (`columnForField`, `workedOutFrom`, `reorderItems` still exported from `Grid`).
54
+ - **A reader can copy (both grids):** readers get the spreadsheet cursor with `readOnly` — range
55
+ select, select all, Cmd-C — and every write gesture says why it cannot run.
56
+ - **A choice wears the colour its column keeps (both grids, tranche 6f early):** the Field's own
57
+ `display_format.options.choices` colours (what the /data-v2 Sheet's seam writes) now paint choice
58
+ chips (design-system `CELL_TINT_CLASS`) and the colour-by lookup; a word with no kept colour
59
+ still reads plain / hashes as before (`choiceLooks.ts`).
60
+ - **Column settings edit an existing column's look** (`FieldEditor`): per-choice colours
61
+ (`ChoiceColorsEditor`) and "Shows as" for plain columns (`ShowsAsPicker`, the design-system
62
+ format registry), both sent as the Field's `display_format` in the same `field_update`;
63
+ `formatForField` now honours a plain column's `display_format` (`shownAsOf`).
64
+ - **Fix:** `Grid` called a hook after its refusal early-return, so a refused table read threw
65
+ "Rendered fewer hooks than expected" instead of drawing the store's sentence (exposed when
66
+ `useTable` moved to `read_records_by_ids`). The clinic testkit models that door.
67
+ - **Guard:** `the-package-imports-no-app.test.tsx` — no source file imports `next/*`, `@/…`,
68
+ supabase or redux.
69
+
70
+ ## 0.86.1
4
71
 
5
72
  Automatic changed-only republish (docs/metadata drift since the last tag — see
6
- `git diff npm/records-ui/v0.85.17..npm/records-ui/v0.85.18 -- apps/shared/records-ui`).
73
+ `git diff npm/records-ui/v0.86.0..npm/records-ui/v0.86.1 -- apps/shared/records-ui`).
7
74
  No source changes intended and no consumer action required.
8
75
 
9
- ## Unreleased
76
+ ## 0.86.0 (2026-09-25 — version and notes set by PUBLISHER-5; needs @ai-matrx/design-system 0.40.0)
77
+
78
+ - **A text kept as a file is edited WHOLE (lane BIG-VALUES-WRITE, owner 2026-09-25: "Make sure that
79
+ large data size is easy for users").** A text of any size now simply saves — the store keeps the
80
+ first 1000 characters in the cell and the whole text as a file, behind the scenes. So the grid's
81
+ cell editor (`useGridEditing.begin`, and tabbing into such a cell) reads the WHOLE text through the
82
+ host's `readFileText` and opens on it; saving writes the whole edited text (the store files it as
83
+ the next version) and a conflict is judged against what the store holds. The record form's box is
84
+ the new `WholeValueEditor` (the whole text in a 12-row box, spanning the form). A host that cannot
85
+ read files opens NO editor on such a cell — the cell keeps its words and "Open the whole text" —
86
+ because an editor holding the first 1000 characters would, on save, cut the value to its start.
87
+ New in `WholeValue.tsx` (package-internal): `WholeValueEditor`, `useWholeText`, `wholeValueOpening`,
88
+ `WHOLE_VALUE_NOT_EDITABLE_HERE`. **Consumer action:** bind `readFileText` (matrx-frontend's
89
+ `RECORDS_FILES` already does) or file-backed cells are read-only in place.
90
+
91
+ - **Three rows above the data (lane TABLE-PAGE-CHROME, owner 2026-09-25: "six distinct rows sit
92
+ above the actual data … consolidate").** `TablePage` draws ONE toolbar row: the view picker (one
93
+ chip — the view's name — opening the list, New view and the view's own settings), the layout
94
+ chooser, the view's filter and your look (Save to view / Save as new view / Reset to view as
95
+ compact controls, the sentence as their title), then a SLOT where the showing layout puts its own
96
+ controls: the Grid draws its data-table toolbar (search, columns, sort) INTO the row
97
+ (design-system `toolbar.portalInto` + `singleRow`), a board its "Group by" / "Dates from"
98
+ (`InTableToolbar`), and a host layout is handed the slot as `render({ toolbarSlot })`. Nothing
99
+ wraps; on a phone the row scrolls sideways. The look bar's own row and the saved-view tabs row are
100
+ gone. Exported: `InTableToolbar`, `TableToolbarSlotContext`, `useTableToolbarSlot`.
101
+ - **`TablePage.header(chrome)`** replaces `leading`: the host is handed `{ actions, tableName }` —
102
+ Share and the table's one menu — and draws them in ITS page header (the app's back button and
103
+ title switcher beside them). Without `header` they end the toolbar row. The menu no longer
104
+ carries a second list of views or the "Saved views" toggle; views live in the one picker.
105
+ `actions` is a fragment of two siblings (Share, the menu) so a host's header can fold them one by
106
+ one; on a phone Share is an item of the menu ("Share…") and the header keeps back, the title and
107
+ ONE menu. **Consumer action:** a host that passed `leading` passes nothing (the organization belongs to the
108
+ host's header); a host with a page header passes `header`. `TablePageHeaderChrome` is exported.
109
+ - **The hand-order sentence is toolbar state.** "Sort: Manual · set by hand" / "Sorted by X ↑ ·
110
+ hand-set order set aside Back to manual Use this sort instead" was a sentence row; it is now
111
+ `SortStateControl` — a sort icon, the order in a word, a badge while a column sort sets the hand
112
+ order aside, and a popover that says the state in one line with Back to manual / Use this sort.
113
+ `handOrderSortState`, `handOrderLine` and `MANUAL_SORT` are exported so a host's Sheet draws the
114
+ same control.
115
+ - **Where the footer sits is a view setting** (`presentation.footer`: `sticky` | `inline`, store key
116
+ declared by `custom.view_keys()` on production 2026-09-26 02:4xZ). Default `sticky` (the older
117
+ grid's pinned counts and pages): the records fill the page's height and the layout scrolls inside;
118
+ `inline`: the region scrolls and the footer follows the last row. Chosen in the view picker's
119
+ "Footer" setting, kept as the person's look until Save to view. `Grid.footer`,
120
+ `ViewSwitcher.footer`, host layouts get `render({ footer })`. Exported: `footerOf`,
121
+ `DEFAULT_FOOTER`, `FooterPlacement`, `FOOTER_WORDS`. **Consumer action:** mount `TablePage` in a
122
+ height-bounded body (`h-full overflow-hidden`) so the sticky footer has a height to fill.
123
+ - **A chip's words are drawn in their own surface's foreground.** The view tab's "default" was
124
+ `text-muted-foreground` on the pressed `bg-secondary` tab (black on dark purple in light mode); the
125
+ picker is the `subtle` surface and its Default tag the `neutral` Badge. Census, same class, fixed:
126
+ `EntityReferenceControl` and `EntityReferenceKindPicker` (× on a secondary Badge) and `DocTemplate`
127
+ (version on a secondary tab) now inherit the surface's colour. Guard `crossedPairs` in
128
+ `the-table-page-is-three-rows.test.tsx`.
129
+ - On a table page the Grid's "Not live" is a word in the toolbar row (the reason on hover), not a
130
+ line under it; the inline footer region is a plain scrolling block so the layout is as tall as
131
+ its rows. Walk: `demo/table-chrome-walk.mjs` (harness on the dev clone, source bytes) GREEN 14/14 —
132
+ three rows above the first data row at 1600, the sort popover, the footer sticky → inline → reset,
133
+ no crossed chip foreground light or dark, one toolbar line at 390.
134
+ - Suite `the-table-page-is-three-rows.test.tsx` RED 8/9 on the prior bytes → GREEN 9/9; the hand-order,
135
+ saved-view and designation suites were moved to the new contract.
136
+
137
+ ## 0.85.18
138
+
139
+ The auto release stubbed this version as a docs-only republish; it carried V24-TAILS's source
140
+ change below (notes placed under it by PUBLISHER-5, 2026-09-25).
10
141
 
11
142
  - `TablePage` takes `onShownViewChange(shown: ShownViewReport)` (lane V24-TAILS, VERIFIER-24 item 6):
12
143
  the view exactly as the page draws it — saved view, the person's look laid over it, the address's
@@ -3756,3 +3887,4 @@ First release: `Grid`, `RecordForm`, `FieldEditor`, `TableSettings`,
3756
3887
  `CustomFieldsSection`, plus the `RecordsUiProvider` rights port and the shared
3757
3888
  refusal surface. Every one of them is proven headlessly against the rehearsal
3758
3889
  branch by `pnpm test`.
3890
+