@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 +173 -0
- package/dist/index.cjs +2051 -1419
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +173 -9
- package/dist/index.d.ts +173 -9
- package/dist/index.js +1946 -1309
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
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
|