@ai-matrx/records-ui 0.85.11 → 0.85.15
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 +132 -3
- package/dist/index.cjs +2928 -2646
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +41 -4
- package/dist/index.d.ts +41 -4
- package/dist/index.js +2889 -2607
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,133 @@
|
|
|
1
1
|
# Changelog — @ai-matrx/records-ui
|
|
2
2
|
|
|
3
|
-
## 0.85.
|
|
3
|
+
## 0.85.15 (2026-09-25 — published by PUBLISH-SWEEP-7)
|
|
4
|
+
|
|
5
|
+
The tagged 0.85.14 never reached npm: its deterministic gate failed on `NeverRecorded … custom.field_declare` (fixture recorded against records 0.58.11). The fixture is re-recorded (below); everything 0.85.14 carried ships here. Needs `@ai-matrx/records` >= 0.58.13 (`viewDesignate` / `custom.view_designate`).
|
|
6
|
+
|
|
7
|
+
### A held decision survives a reload (GATES-TAIL, VERIFIER-21 #3r, 2026-09-25)
|
|
8
|
+
|
|
9
|
+
* **`ActionInbox` keeps every open Undo hold in the browser until the decide door answers for it**
|
|
10
|
+
(`localStorage` `records-ui:held-decisions`, one entry per approval). A reload during the
|
|
11
|
+
five-second hold used to kill the made-on-pagehide request with the page, and the reloaded inbox
|
|
12
|
+
showed the approval pending with no word, though the screen had said "Declined". Now the
|
|
13
|
+
reloaded inbox shows it still held ("Declined · Undo") for the rest of its window, then makes it;
|
|
14
|
+
past its window it is made at once and says so. Undo forgets it; an approval the store no longer
|
|
15
|
+
lists as waiting on this person is forgotten. The store keeps no pending-decision state, so this is
|
|
16
|
+
a browser-side promise; the store still decides who may decide. Suite RED 2/2 → GREEN 7/7.
|
|
17
|
+
|
|
18
|
+
### Gate recording is re-runnable and leaves nothing behind (2026-09-25)
|
|
19
|
+
|
|
20
|
+
* **The deterministic suite is re-recorded against `@ai-matrx/records` 0.58.12** (demo only; no
|
|
21
|
+
shipped code changed). The publish of 0.85.14 failed on `NeverRecorded … custom.field_declare`
|
|
22
|
+
because 0.58.12 sends a column's word as `type`; `demo/fixtures/doors.json` is re-recorded.
|
|
23
|
+
* **Why re-recording kept failing.** Not a name collision — every recording already names its tables
|
|
24
|
+
with a per-run stamp saved in the fixture. The first-time walk asserted a freshly declared table
|
|
25
|
+
had NO columns, which the store stopped producing on 2026-09-21 (a declared name is a Field) and
|
|
26
|
+
cannot produce at all now (`custom.field_retire` refuses a table's title column, REC-2). The walk
|
|
27
|
+
now asserts what the store makes, as `live-smoke` already did: the declared column, drawn, and no
|
|
28
|
+
"no columns yet" sentence over it.
|
|
29
|
+
* **A failed recording never overwrites the fixture, and every run archives what it made.** The
|
|
30
|
+
recording seam keeps a ledger of every record a creating door returned; `afterAll` soft-deletes
|
|
31
|
+
exactly those, newest first, whatever happened (`recorded-doors.ts`, `deterministic.test.tsx`).
|
|
32
|
+
* **`live-smoke` takes back its package table's Home** (read from the Table's `parent_id`). Every gate
|
|
33
|
+
run used to leave one "<name> views Home" in the test organization; 144 stray walk records in
|
|
34
|
+
Test's Org (test@test.com) were archived through `custom.record_delete`.
|
|
35
|
+
|
|
36
|
+
### Lane VIEW-SWITCH-NOT-DESIGNATION (2026-09-25)
|
|
37
|
+
|
|
38
|
+
* **A look at a table never changes how it opens** (`TablePage.tsx`, `views.ts`; VERIFIER-21).
|
|
39
|
+
Pressing Kanban or Calendar saved `layout` onto the table's DEFAULT view, so the next person to
|
|
40
|
+
open the table landed in the last look anybody took. A press on the default view now carries
|
|
41
|
+
every other key it changed (a board's grouping, a calendar's date, a colour) and never `layout` or
|
|
42
|
+
`isDefault` (`viewPatchFor`); the store refuses them through `view_declare` by name. The one way to
|
|
43
|
+
change how a table opens is the menu's **"Make <layout> the default"** — offered only to someone
|
|
44
|
+
who may edit the table and only when what is showing is not already how it opens — sent through
|
|
45
|
+
`designateView` → `custom.view_designate` (editor). New exports: `viewPatchFor`,
|
|
46
|
+
`openingLayoutOf`, `makeDefaultLabel`, `designateView`. Test:
|
|
47
|
+
`a-look-at-a-table-never-changes-how-it-opens.test.tsx` (RED on the prior `TablePage`: two layout
|
|
48
|
+
writes onto the default view and no designate control; GREEN 6/6).
|
|
49
|
+
* **A date stays a date on a board card** (`CardDates.tsx`, `ViewSwitcher.tsx`, `Pipeline.tsx`;
|
|
50
|
+
VERIFIER-21 item 5). Kanban and pipeline cards carry the table's date columns under the title,
|
|
51
|
+
drawn by the one value renderer (`RecordValue`), so "Mar 1, 2026" reads the same on the card as
|
|
52
|
+
in the Sheet, the Grid, the record panel and the Calendar; a blank date draws nothing and a
|
|
53
|
+
withheld one says so. Test: `a-board-card-shows-its-date.test.tsx` (RED: the card read only
|
|
54
|
+
"INV-20417"; GREEN, also under `TZ=America/Los_Angeles`).
|
|
55
|
+
|
|
56
|
+
### Lane BIG-VALUES-READERS (2026-09-25)
|
|
57
|
+
|
|
58
|
+
* **A row read through the matching door opens its whole text** (`values.tsx`): every store read
|
|
59
|
+
door (`custom.read_records_matching` — the grid's — `read_record`, `read_records`,
|
|
60
|
+
`read_records_by_ids`, `read_records_archived`) now carries a value-kept-as-a-file's pointer
|
|
61
|
+
(`_values.<key>.src` -> `_sources.<ptr>`, file fields only), so `wholeValueOf` finds it and the
|
|
62
|
+
grid cell shows "Open the whole text" on every read path. `ProvenanceBadge` now draws nothing for
|
|
63
|
+
such a pointer (the cell already says the text is in a file) instead of the pointer's raw fields.
|
|
64
|
+
Test `a-row-read-through-the-matching-door-opens-its-whole-text.test.tsx` (RED 1/3 -> GREEN 3/3).
|
|
65
|
+
Consumer action: none.
|
|
66
|
+
|
|
67
|
+
### Lane RC-B2b (2026-09-25)
|
|
68
|
+
|
|
69
|
+
* **Authored form text reads the way it was written** (`host.tsx`, `FormRunner.tsx`): new optional
|
|
70
|
+
host port `RecordsUiHost.renderText(text, where)` with `RenderTextSlot`
|
|
71
|
+
(`"form-intro" | "form-help" | "form-thank-you"`). A form's intro, a question's help and the
|
|
72
|
+
thank-you body go through it, so the host's one markdown renderer draws `**bold**`, math and
|
|
73
|
+
links; unbound, the text shows exactly as written. Suite
|
|
74
|
+
`authored-form-text-reads-through-the-host.test.tsx`: RED with the port ignored, GREEN 2/2.
|
|
75
|
+
**Consumer action:** matrx-frontend wraps `/f/[formId]`'s `FormRunner` in
|
|
76
|
+
`RecordsUiProvider value={{ renderText }}` returning `RichContentInline` (phrasing, valid in `<p>`).
|
|
77
|
+
|
|
78
|
+
## 0.85.14 (tagged by the auto release; never published, see 0.85.15)
|
|
4
79
|
|
|
5
80
|
Automatic changed-only republish (docs/metadata drift since the last tag — see
|
|
6
|
-
`git diff npm/records-ui/v0.85.
|
|
81
|
+
`git diff npm/records-ui/v0.85.13..npm/records-ui/v0.85.14 -- apps/shared/records-ui`).
|
|
7
82
|
No source changes intended and no consumer action required.
|
|
8
83
|
|
|
9
|
-
##
|
|
84
|
+
## 0.85.13 (2026-09-25 — published by PUBLISH-SWEEP-6)
|
|
85
|
+
|
|
86
|
+
**Needs `@ai-matrx/records` 0.58.11.** 0.85.12 was tagged but never reached npm: its packed-consumer
|
|
87
|
+
canary could not import `wholeValueOf` because records 0.58.10 never published. Everything under
|
|
88
|
+
0.85.12 below ships here.
|
|
89
|
+
|
|
90
|
+
## 0.85.12 (2026-09-25 — tagged by PUBLISH-SWEEP-5; never published, see 0.85.13)
|
|
91
|
+
|
|
92
|
+
**Needs `@ai-matrx/records` 0.58.10** (the decision hold). Carries UI-FIX-19's dashboard read-back and
|
|
93
|
+
store-sentence-first refusals (`0989c57e69`) and S5-PRIME-2's Undo hold (`3e2c93da3c`). ORDER-FILTER
|
|
94
|
+
shipped in 0.85.11 (below).
|
|
95
|
+
|
|
96
|
+
### Lane MOVER-BIG-VALUES (2026-09-25)
|
|
97
|
+
|
|
98
|
+
* **A value kept as a file shows its words and opens the file** (`WholeValue.tsx`): every read
|
|
99
|
+
layout draws the first words, the whole text's size and "Open the whole text" through the new
|
|
100
|
+
host port `hrefForFile`; unbound, it says the rest is in a file (never a dead link). The export
|
|
101
|
+
writes the file's whole content through the new host port `readFileText`.
|
|
102
|
+
|
|
103
|
+
### Lane S5-PRIME-2, VERIFIER-20 (2026-09-25)
|
|
104
|
+
|
|
105
|
+
* **A decision is held for Undo before it is made** (Gmail's undo send). Approve or decline — by
|
|
106
|
+
key, click or a selection — and the row says "Approved · made in 5s · Undo" for the row's
|
|
107
|
+
`undo_seconds`, then the decision is made through the one door. Undo (or `z`) inside the window
|
|
108
|
+
calls nothing: the item is waiting again exactly as it was, with no history. A row the store
|
|
109
|
+
gives 0 (a run already waits on the answer) is made at once and says so. A hold still open when
|
|
110
|
+
the page goes away or the inbox unmounts is made then, never dropped. Suite
|
|
111
|
+
`inbox-decision-undo.test.tsx`: RED 5/5 on the prior bytes, GREEN 5/5. Needs `@ai-matrx/records`
|
|
112
|
+
with `undo_seconds`.
|
|
113
|
+
* **The inbox's clear is named Clear, and its view Cleared** (was Done / Done). A checklist step
|
|
114
|
+
row already has a Done — it FINISHES the step — so two buttons named Done on one row meant two
|
|
115
|
+
different things (found walking the live inbox as admin@admin.com). `e` still clears.
|
|
116
|
+
|
|
117
|
+
### Lane UI-FIX-19 (2026-09-25, VERIFIER-20)
|
|
118
|
+
|
|
119
|
+
* **A new dashboard says nothing the store did not lose** (VERIFIER-20 a). The read-back treats an
|
|
120
|
+
empty default the store fills in (`group_by: []`, `filter: {}`) as the same "nothing" that was
|
|
121
|
+
sent, beside the earlier rule that keys the store adds to a setting are not a loss. Suite: a
|
|
122
|
+
fresh dashboard created and read back as production stores it — RED 2 on the prior bytes, GREEN.
|
|
123
|
+
* **A refusal is headed by the store's own sentence, and no SQLSTATE or codename reaches a person**
|
|
124
|
+
(VERIFIER-20 b). `PlainRefusal.storeSaid`; `RefusalNotice` heads with the store's sentence (the
|
|
125
|
+
generic title only when nothing of its words survived) and says it once. Engineer text (SQLSTATE,
|
|
126
|
+
an engineer's hint) is on `data-for-engineers` only: no longer the notice's tooltip or a hidden
|
|
127
|
+
line, and `RefusalLine` likewise. `WhereItLives` passes a refused move's hint through
|
|
128
|
+
`hintForAPerson`. Suite `a-refusal-heads-with-the-store-s-own-sentence.test.tsx`: RED 2/2 -> GREEN.
|
|
129
|
+
**Consumer action:** a host that read the notice's `title` for debugging reads
|
|
130
|
+
`data-for-engineers`.
|
|
10
131
|
|
|
11
132
|
**Needs the next `@ai-matrx/records`** (`readInViewOrder({ filter })`).
|
|
12
133
|
|
|
@@ -19,6 +140,14 @@ No source changes intended and no consumer action required.
|
|
|
19
140
|
filtered hand order is the door's page two. The client-side `inHandOrder` helper is gone.
|
|
20
141
|
Tests: `a-hand-set-order-is-the-grids-sort.test.tsx` RED 3/16 on the prior bytes, GREEN 16/16.
|
|
21
142
|
|
|
143
|
+
## 0.85.11
|
|
144
|
+
|
|
145
|
+
Automatic changed-only republish (docs/metadata drift since the last tag — see
|
|
146
|
+
`git diff npm/records-ui/v0.85.10..npm/records-ui/v0.85.11 -- apps/shared/records-ui`).
|
|
147
|
+
No source changes intended and no consumer action required.
|
|
148
|
+
|
|
149
|
+
### Lane ORDER-FILTER (2026-09-25)
|
|
150
|
+
|
|
22
151
|
## 0.85.10 (2026-09-25 — published by PUBLISH-SWEEP-5)
|
|
23
152
|
|
|
24
153
|
**Needs `@ai-matrx/records` 0.58.8** (`TableHomeDestination.slug`). Carries UI-FIX-19's move-destination
|