@ai-matrx/records-ui 0.7.0 → 0.10.3

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,5 +1,178 @@
1
1
  # Changelog — @ai-matrx/records-ui
2
2
 
3
+ ## 0.10.3
4
+
5
+ Reissues the unpublished 0.10.2 candidate. Its live-store release gate exposed
6
+ a race in the field-add smoke harness: it unmounted each panel immediately
7
+ after clicking Save, before the asynchronous declaration had landed. The
8
+ helper now waits until the real store reports the exact new Field before
9
+ proceeding. Package behavior is unchanged.
10
+
11
+ ### Consumer action
12
+
13
+ None.
14
+
15
+ ## 0.10.2
16
+
17
+ Reissues the unpublished 0.10.1 candidate after its live-store release gate
18
+ revealed that the demo selector read `document.title` while the actual
19
+ `custom.record` row exposes the record payload as `data.title`. The smoke test
20
+ now selects Acme Industrial from the real row shape; package behavior is unchanged.
21
+
22
+ ### Consumer action
23
+
24
+ None.
25
+
26
+ ## 0.10.1
27
+
28
+ Reissues the unpublished 0.10.0 package after its live-store smoke test selected
29
+ the oldest demo record while asserting the identity of Acme Industrial. The
30
+ test now selects that record by title, so re-seeding cannot substitute another
31
+ record. Package behavior is unchanged from the 0.10.0 candidate.
32
+
33
+ ### Consumer action
34
+
35
+ None.
36
+
37
+ ## 0.10.0
38
+
39
+ **The three things the 19 September verdict (fifth pass) said a person hits the
40
+ moment they touch a table.**
41
+
42
+ **A double-click opens the typed editor, on every cell.** The verdict: "only the
43
+ Title column can be opened by double-clicking; double-clicking any other cell
44
+ opens a developer inspector — a floating window showing the record's raw JSON,
45
+ its machine keys, a truncated id, and the headings DOCUMENT, LEVEL and HIDDEN."
46
+ Two things did that. The data table ships a side panel AND a floating window,
47
+ both falling back to `DataRowInspector`; the grid now turns both OFF, because
48
+ this package has a record panel of its own (`Peek`, through `onRowOpen`) and a
49
+ second one beside it is the parallel layer the platform forbids. And a cell now
50
+ FILLS its cell and answers `dblclick` itself — the second press used to land on
51
+ bare table cell after the first had swapped the DOM under the pointer, and a
52
+ bare cell is a row click, which is exactly why a wide column worked and every
53
+ narrow one did not.
54
+
55
+ **Tab commits the typed value before it moves.** The verdict: "when we tabbed
56
+ along a row, the first five values saved and the last four were silently
57
+ dropped." The draft used to live in the open CELL, and this screen re-renders
58
+ that cell for reasons that have nothing to do with the person typing — every
59
+ accepted write calls `reload()`, which rebuilds the rows, the columns and the
60
+ cells. A cell that remounted mid-edit came back initialised from the stored
61
+ value, so the commit wrote what was already there and the screen correctly
62
+ treated it as "nothing changed". The draft now lives in the editing session,
63
+ beside the address of the open cell and the value it started from; `commit(move)`
64
+ takes no value at all, because there is only one place the typed value can be
65
+ read from. The editor is focused once per opening rather than on every render.
66
+
67
+ **"Total of linked records" can be added, and a refusal is a sentence.** The
68
+ panel now offers EVERY relation column — including the ones that hold a single
69
+ record, marked "holds one" — because hiding "Crew lead" from the list taught a
70
+ person nothing. `whatIsMissing` asks, in the panel's own words, what has not been
71
+ answered yet ("Crew lead points at one record at a time, so there is nothing to
72
+ total. Tick 'Can hold more than one' on Crew lead, or use Borrowed value to read
73
+ its one value."), the sentence sits under the button, and the panel never sends a
74
+ declaration it already knows the store must refuse.
75
+
76
+ **A hint written for an engineer never reaches a person.** A store refusal
77
+ carries a message for the person and a hint for whoever has to fix the caller
78
+ ("FLD-11: … config.via names a relation Field of this same table, by its key").
79
+ This package printed both. `hintForAPerson` now filters the hint BY SHAPE — a
80
+ contract row id, a schema-qualified database object, a path inside a document,
81
+ a snake_case identifier or a SQLSTATE — and what it filters joins the SQLSTATE on
82
+ the notice's title, for an engineer. A hint in ordinary words is still shown
83
+ verbatim.
84
+
85
+ New exports: `whatIsMissing`, `hintForAPerson`, `hintIsMachineIdentity`.
86
+
87
+ ### Consumer action
88
+
89
+ None. `GridEditing.commit` now takes `(move)` instead of `(value, move)` and
90
+ carries `draft` / `type`; nothing outside this package calls it.
91
+
92
+ ## 0.9.0
93
+
94
+ **Sharing reaches the record and table screens (SCR-N-5).** `ShareControl` puts a
95
+ Share button on the record peek and on the table page, and hands the subject to
96
+ the host through a new `share` port on `<RecordsUiProvider>`.
97
+
98
+ This package ships NO share dialog, deliberately, for the same reason it ships no
99
+ chat: AI Matrx has exactly one sharing surface, and a second one here would give
100
+ the platform two answers to "who can see this". With no `share` port bound there
101
+ is NO BUTTON — not a greyed one, not one that opens an empty panel — and
102
+ `NO_SHARE_REASON` names the port for anything that asks why.
103
+
104
+ A Table is a record in this store, so one control, one subject shape and one
105
+ dialog serve both screens; `kind` only changes the noun in the sentences.
106
+
107
+ New exports: `ShareControl`, `useCanShare`, `shareUnavailableReason`,
108
+ `NO_SHARE_REASON`, and the `ShareSubject` type.
109
+
110
+ ### Consumer action
111
+
112
+ Bind `share` on your `<RecordsMount host={{ … }}>` with the app's own sharing
113
+ dialog, e.g. in matrx-frontend:
114
+
115
+ ```tsx
116
+ import { recordStoreShare } from "@/features/sharing/components/RecordStoreShareSurface";
117
+
118
+ <RecordsMount host={{ Link, density: "condensed", share: recordStoreShare }} …>
119
+ ```
120
+
121
+ Leave it out and nothing changes — the screens render exactly as they did in
122
+ 0.8.0, with no Share button.
123
+
124
+
125
+ ## 0.8.0
126
+
127
+ **The worst finding of the 19 September verdict: "Add field" opened a proper
128
+ panel and then refused everything.** Number and Date were refused as undeclared,
129
+ Person was refused as a Formula, a choice list demanded a table the panel could
130
+ not name, and before any of those the Key box was blank, unmarked and required.
131
+ A table made with the product's own button had exactly one column.
132
+
133
+ - **The panel collects an INTENTION, and the store decides the rest.**
134
+ `FieldEditor` writes through `custom.field_declare` (`useFieldMutation`) and no
135
+ longer assembles a Field document of its own. It never sets a behaviour, a
136
+ format, a unit, a relation target, a relation maximum, a compute_on or a
137
+ pattern Rule — every one of those was a second place for the thirteen types to
138
+ be wrong.
139
+ - **Sixteen things a column can hold, in a menu under four headings**, each with
140
+ one line saying what it is FOR. `fieldTypes.ts` is new;
141
+ `parityTypesWithNoExplanation()` fails the suite the moment the store ships a
142
+ fourteenth parity type nobody has written a sentence for.
143
+ - **A choice list is defined where a person defines it** — the words go in a box
144
+ and the store keeps them as a Table (FLD-5 / FLD-6 untouched). Nobody is asked
145
+ to build a table before they can have a dropdown.
146
+ - **A Person field offers people.** It resolves to a relation at the kernel
147
+ Person Table, decided by the store.
148
+ - **The Key box is gone.** The key is derived from the name and shown, never
149
+ demanded.
150
+ - **A field is edited and removed from the same panel**, and removal names the
151
+ consequence before the second press. `TableSettings` retires through the field
152
+ door rather than deleting the record, so the TABLE stops declaring the column
153
+ too; the three unsafe removals (the title field, the last field, one another
154
+ field reads through) are refused by name.
155
+ - **Ids stopped being drawn as values.** `RecordLabelProvider` resolves a choice
156
+ or a relation id to the name of the record it points at, once per Field, for
157
+ every read-only surface — the Kanban board's column headings were bare
158
+ 36-character identifiers.
159
+ - **`3` in `units` no longer renders as `units3`.** `editorKindFor` called any
160
+ range field with a unit longer than one character a currency; a currency is a
161
+ range whose FORMAT is currency, which is what the store's own `parity_type`
162
+ says.
163
+ - **One word per type everywhere** — the settings row says what the panel
164
+ offered, and the store's "made of" sentences (`REC-31: a File record reached
165
+ through a relation`, `evaluated by custom.rule_eval`) are out of the UI.
166
+ - The person picker draws a name and an email as two facts, not one run-on
167
+ string.
168
+
169
+ ### Consumer action
170
+
171
+ `renderValue` still works and still draws an unresolved id as "Loading…". A host
172
+ drawing values outside `RecordsMount` should render `<RecordValue>` (or wrap in
173
+ `RecordLabelProvider`) so ids resolve to names.
174
+
175
+
3
176
  ## 0.7.0
4
177
 
5
178
  What the first headless walk of 0.6.0 through a real browser found, in the same