@ai-matrx/records-ui 0.84.0 → 0.84.7

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,160 @@
1
1
  # Changelog — @ai-matrx/records-ui
2
2
 
3
+ ## 0.84.7 (unpublished — needs @ai-matrx/records 0.57.3)
4
+
5
+ * **The suite is green again (386/386), and the class is gone rather than patched.** 0.84.5's
6
+ publish gate went red in 15 files because records 0.57.2 made every table list ask
7
+ `custom.table_facts`. Only `TablesHome` sorts tables into sections, so only it asks now
8
+ (`client.tableFacts()` + `withTableFacts`); no test double had to learn the door. It says
9
+ `SECTIONS_UNKNOWN` only when the store has the door and it failed.
10
+
11
+ ## 0.84.6 (unpublished)
12
+
13
+ **A choice column that takes other values lets a person type one.** (lane STORE-RULE-GAPS.)
14
+ The production walk found the "A value that is not one of the choices is added to them" tick
15
+ saved, while the grid cell and the record form drew a closed drop-down — nothing could send an
16
+ off-list word. Now, on a column with `config.allow_other`, `FieldControl` (the one editor the
17
+ grid cell, the record form and the form runner draw) is the relation picker's shape: a search
18
+ over the choices and **Add “<typed>”** at the foot, which sends the word as typed (the store adds
19
+ it to the column's choices and stores its key). A word that already names a choice picks that
20
+ choice. Several-choices columns keep what was picked. Columns that do not take other values are
21
+ unchanged. The field editor's tick is gated on the same code path
22
+ (`CHOICE_EDITOR_ADDS_WHAT_IS_TYPED`). Paste keeps its own "add these options" step.
23
+
24
+ **One "pick or add" builder.** `PickOrAdd` (search box, list, Add/Create “<typed>” foot) is the
25
+ ONE layout both `RelationPicker` and the open choice editor are built from — same look, one place.
26
+ The choice editor orders choices by the store's own `metadata.option_position` (`inTheStoresOrder`),
27
+ so a choice added by typing is last, where the store put it, not wherever the lookup returned it.
28
+
29
+ Consumer action: none.
30
+
31
+ ## 0.84.5 (unpublished — needs @ai-matrx/records 0.57.2 published first)
32
+
33
+ **Mine is what you made, and an archived table's own address says it is archived.** (lane
34
+ HUB-FIX, guide re-walk 2026-09-23 + chair ruling.)
35
+
36
+ * `TablesHome`'s Mine section is the tables the person signed in MADE (`created_by`, folded in
37
+ by records 0.57.2's `tableList` from `custom.table_facts`), whatever their visibility — a new
38
+ internal table is under Mine AND My organization. When the store HAS `custom.table_facts`
39
+ and it does not answer, the page says so (`SECTIONS_UNKNOWN`) instead of filing everything
40
+ under My organization with Mine empty; when the store's catalogue does not carry the door at
41
+ all, nothing is asked and nothing is said (the door-presence pattern). `TablePage`'s archived
42
+ screen reads only the archive door every table already uses — it does not depend on
43
+ `table_facts`. `LANE_EMPTY.mine` says what is true under the new meaning.
44
+ * `TablePage` asks the archive (`client.tableArchived`) before saying a table is not here. An
45
+ archived table reads "This table is archived", who archived it and when, and **Bring it
46
+ back**; `TABLE_NOT_REACHABLE` no longer says "…or it may have been deleted".
47
+ * New exports `SECTIONS_UNKNOWN`, `TABLE_IS_ARCHIVED`. Full suite 379/379.
48
+
49
+ **Consumer action:** none beyond installing it with records 0.57.2.
50
+
51
+ ## 0.84.4 (unpublished — needs @ai-matrx/records 0.57.1 published first)
52
+
53
+ **The guide re-walk's small wrong things, each fixed as a class.** (lane RECORDS-UI-FIX,
54
+ 2026-09-23.)
55
+
56
+ * **Two records with one name are told apart in the linked-record picker.** Rincon's
57
+ Customers really holds two Patricia Marshes; the picker drew only the name, so the list
58
+ read as duplicates. New `tellApart(rows, nameOf)`: a colliding name carries the first of
59
+ its own columns that differs (an address), and search reads it too.
60
+ * **Charts no longer print their timing ("34.5 ms").** The number stays on the block as
61
+ `data-store-ms` for whoever measures dashboards.
62
+ * **The Bookings suggestion is English** ("a 30-minute appointment … put each one in Jobs",
63
+ never "a 30-minute appointments slot"). `bookingSuggestion` is exported.
64
+ * **Table Settings' Proposed box names no door by its code** and shows no baseless "0"; it
65
+ says proposals wait in the table's Inbox.
66
+ * **A record's history follows the writes on its page.** `HistoryPanel` re-reads on
67
+ `useRecordChangeRevision` (records 0.57.1). This was not the no-op-version class: the
68
+ store had the row, the panel never asked again.
69
+ * A refused value no longer lights the app's error pill — see records 0.57.1.
70
+ * Tests (red on 0.84.3): `two-customers-with-one-name-are-told-apart`,
71
+ `the-history-count-follows-the-writes`, `guide-rewalk-words`, and the reversed ms clause in
72
+ `demo/dashboard-canvas.test.tsx` (it had enshrined printing the timing).
73
+
74
+ **Also, in matrx-frontend (`features/sharing`):** the Share dialog's Access tab no longer
75
+ reads "Internal — readable inside the owning organization" over "Private — only you".
76
+
77
+ ## 0.84.3 (unpublished — rides on top of 0.84.2)
78
+
79
+ **After an import writes, the wizard is a report — never the same import again — and every
80
+ line it names is the line in the person's file.** (lane RECORDS-UI-FIX, VERIFIER-16 H1 + M8,
81
+ VERIFIER-15 M5.)
82
+
83
+ * **No second write of the same file.** A run that landed rows used to leave the pre-write
84
+ notice ("…Nothing has been written yet", now false) and a live "Import N rows" beside the
85
+ result. Once a file has been offered to the store — finished, stopped part-way, or turned
86
+ away as already imported — every pre-write step (what each record is called, the mapping,
87
+ the options, the rule notice, the Import button) is replaced by one sentence saying the
88
+ file was sent, and the report of what landed and what was refused stays. Another run
89
+ means choosing a file again.
90
+ * **Line numbers are the file's.** The store and the rule check number rows from 1 under the
91
+ header; the file has its header on line 1. New export `lineInYourFile(dataRow)` is used on
92
+ the column's refusal, the run's refused rows and past runs' refused rows — the `-3` on
93
+ line 3 is called line 3.
94
+ * **Nothing sits past the rail.** The mapping is one block per column (name, where it goes,
95
+ what it is, what would be refused, first values) instead of a 52rem row in a 26rem rail.
96
+ * **No machine word.** A column the table already has is named from its Field
97
+ (`fieldTypeLabel`), so a number reads "Number", never "range"; an unknown token is written
98
+ out, never shown raw.
99
+ * **Whole sentences.** `refusalLineForAPerson` ends the store's sentence before the remedy
100
+ ("…at least 0. Send this column…"). The report's "The 1 row that was refused is kept".
101
+ * Tests: new `src/the-import-after-a-write-is-a-report.test.tsx` (4, red on 0.84.1 bytes);
102
+ `import-asks-the-rules-first` now expects line 4 for the fourth line (it had enshrined the
103
+ off-by-one); `import-wizard` expects "is kept"; the F9 source guard now forbids a row wider
104
+ than the rail and keeps the 14rem "Goes to" floor.
105
+
106
+ **Consumer action:** none.
107
+
108
+ ## 0.84.2 (unpublished — rides on top of 0.84.1)
109
+
110
+ **A booking link opens that booking page, and the table list's empty sections stop
111
+ describing a product that does not exist.** (lane HUB-FIX, VERIFIER-16 M4 + M6.)
112
+
113
+ * `BookingSlots` gains `activeBookingId`: the page a link named is marked (`data-linked`) and
114
+ scrolled to; a page the rail does not list says `BOOKING_NOT_HERE_LINE`, never a different
115
+ page. `TablePage` hands it `?item=` when `?rail=bookings`.
116
+ * `LANE_EMPTY.mine` said "New table makes one that only you can see" and
117
+ `LANE_EMPTY.organization` said "a table you make is yours until you change its visibility
118
+ to internal" — New table makes an internal table, and no screen here changes visibility.
119
+ Both now say what is true.
120
+ * New export `BOOKING_NOT_HERE_LINE`. Tests: `rail-deep-link.test.tsx` +1,
121
+ `visibility-lanes.test.tsx` +1.
122
+
123
+ **Consumer action (matrx-frontend):** the hub's Bookings row links
124
+ `/data-v2/<table>?rail=bookings&item=<form_id>` (it already can; the item is marked from
125
+ this version).
126
+
127
+ ## 0.84.1 (unpublished — lands with the 2026-09-24 window)
128
+
129
+ **A blank the store can explain is never drawn as a dash.** (lane OLD-TABLES-4, VERIFIER-16.)
130
+ `renderValue` — the one value renderer for the grid, the peek and the forms — now says two
131
+ things a dash used to hide:
132
+
133
+ * **A relation whose record no longer exists** reads *"The record this pointed at no longer
134
+ exists"* (the id it held is in the tooltip). The move of an older table lands such a cell
135
+ empty and keeps the id on the record's provenance entry, `_sources.<ptr>.unresolved.<key>`;
136
+ `unresolvedFor(document, key)` is exported for any other reader of that fact.
137
+ * **A worked-out column with no formula in it yet** reads *"Worked out once its formula is in
138
+ place"* instead of an answer of nothing.
139
+
140
+ Consumer action: none.
141
+
142
+ **The field editor sets the three column settings the older grid carried.** (lane
143
+ STORE-RULE-GAPS.) Existing controls only, no new primitive:
144
+
145
+ * **A pattern's example** — a box beside a "Looks like" check (`rule.example`). A refused value
146
+ is told "Enter it like 949-555-0142.": `refusalForAPerson` reads the example from the store's
147
+ `detail.example` as data, so an example shaped like an identifier ("SKU-12") is never dropped
148
+ by the machine-identity filter.
149
+ * **A length's shortest** — the "Number of characters" check (was "No longer than") has a
150
+ *fewest* box beside its *most* (`rule.min`).
151
+ * **A choice list that takes other values** — one tick, "A value that is not one of the choices
152
+ is added to them" (`allow_other`), on select / multi-select columns only; unticking sends false.
153
+
154
+ Consumer action: none. Needs `@ai-matrx/records` with `FieldRule.example` / `.min` and
155
+ `allow_other` (aidream `290411764c`) and, for the store to honour them, matrx-frontend
156
+ `storerulegaps_an_example_a_shortest_length_and_other_choices.sql` on the database.
157
+
3
158
  ## 0.84.0
4
159
 
5
160
  **A refusal is said once, with the doors that fit it, and a change a person made is kept or