@ai-matrx/records-ui 0.62.0 → 0.65.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,5 +1,138 @@
1
1
  # Changelog — @ai-matrx/records-ui
2
2
 
3
+ ## 0.65.0
4
+
5
+ **A condition about a relation column stops asking a person to type a uuid.**
6
+ (lane RELATION-DISPLAY-2.)
7
+
8
+ * **`ConditionField` carried no type, so the ONE condition builder could not know a
9
+ column points at another record.** It drew the same plain text box every other
10
+ clause gets — and a relation's stored value is the other record's id (FLD-6 /
11
+ REL-1), so the only way to write a true clause was to find and TYPE a uuid. The
12
+ dispatcher's actual house rule, *"a job for Harborview Property Group cannot
13
+ leave Scheduled without a purchase order"*, was unwritable by exactly the person
14
+ the builder exists for. A box that accepts anything and can only produce a rule
15
+ matching nothing is law 4's dead control.
16
+ * `ConditionField` now carries an OPTIONAL `field`. When it is a relation, the value
17
+ control is **`RelationPicker`** — the same picker the cell uses, on the same
18
+ `relation_words_many` the cell reads — so a filter offers the column's own joined
19
+ words ("Harborview Property Group, Carpinteria") and writes the ID. A filter and
20
+ the column it filters can no longer disagree about what a record is called.
21
+ * It is asked for ONE record even when the column holds several: a clause compares
22
+ against one value, and a picker that let somebody choose three would write an
23
+ expression this row cannot draw back.
24
+ * Both callers in this package already held the whole `Field` and were throwing it
25
+ away one line before handing it over — `StageRules` and `FormBuilder`. In the form
26
+ builder this is the OWNER's screen; a stranger is still never asked a relation
27
+ question (`publicQuestions.ts` is untouched).
28
+
29
+ **Consumer action:** none — `field` is optional and a caller passing only
30
+ `{id, key, label}` gets exactly the old behaviour, which has its own clause. A host
31
+ that wants the picker passes the `Field` it already has.
32
+
33
+ *Numbered 0.65.0, not 0.64.0: a peer lane claimed 0.64.0 for the coercion primitive
34
+ while this work was in flight and tagged it first. Two lanes bumping one package in
35
+ one afternoon is the cost of a shared checkout; the fix is to move, never to take a
36
+ version somebody else's tag already names.*
37
+
38
+ ## 0.64.0
39
+
40
+ **The paste and the editor stop owning their own opinion of a column, and the capture sheet
41
+ stops minting NaN.**
42
+
43
+ - **`editorKindFor` is `fieldKindFor`** (`@ai-matrx/records` 0.45.0) with this package's
44
+ kernel File/Person ids bound. The classifier body lived here and was the only one.
45
+ - **`valueFromPastedText` is one call to `coerceTypedAnswer`**, keeping this package's label
46
+ so a refusal names the column the way the grid's header does. Its 150-line body WAS the
47
+ coercion — and while it sat here, the public booking page was unbookable over any table
48
+ with a number field.
49
+ - **`ChoiceOptions`** is re-exported from the core instead of declared twice.
50
+ - **`CaptureRun`** used `Number(raw)`, which answers NaN for "about twelve" — and a NaN
51
+ becomes null on the wire, so a reading taken in a yard could silently record nothing. It
52
+ coerces through the one body now and KEEPS the typed text when the value is refused.
53
+ - **`ViewSwitcher`**'s calendar offer tested `kind === "datetime" || kind === "date"`. FLD-11
54
+ has no "date" kind; it compiled only because the old `EditorKind` union carried two words
55
+ nothing produced.
56
+ - **`BuildOrAsk`** (landed 0.63.x→here): "Ask an agent" is ABSENT when `mayBuild` is false —
57
+ asking an agent is the same act as building by hand, through the same doors.
58
+ - **One label map per enum** (`enumLabels.ts`): no panel keeps its own copy, and the
59
+ "Done"/"Finished" split between `ChecklistRunner` and `ActionInbox` is gone.
60
+
61
+ *Consumer action:* none. `EditorKind` is now an alias of `FieldKind`; a host that compared a
62
+ kind against `"date"` or `"boolean"` was comparing against a value the classifier never
63
+ returned.
64
+
65
+ ## 0.63.0
66
+
67
+ **A relation cell finally SHOWS what its column was configured to show, and the
68
+ six hand-rolled copies of "what is this id called" are gone — all six, by moving
69
+ the code, none by allowlisting.** (lane RELATION-DISPLAY-2.)
70
+
71
+ * **The display spec reached the store in 0.62.0 and no screen could read it.**
72
+ REL-DISP gave a relation column a `display` — which of the target's columns it
73
+ shows, in what order, joined by what — and shipped `ReferenceBuilder` to
74
+ configure it. But `labels.tsx`, which every grid, board, gallery, calendar and
75
+ peek cell reads through, resolved names ITSELF: 200 rows of the target Table
76
+ plus `tableList()` for its `title_field`. So a person could set Rincon
77
+ Plumbing's `jobs.customer` to read "first name + last name", press Save, and
78
+ the board would go on drawing "Maria Chen" for both of the Maria Chens. The
79
+ builder wrote a setting that nothing displayed.
80
+ `labels.tsx` now fetches NOTHING up front and asks `relation_words_many` for
81
+ the ids the page actually draws — one call per Field per tick, the store's one
82
+ resolver, this column's own spec, the visibility ladder asked BEFORE the name
83
+ is read, and no 200-row prefetch ceiling. Its own comment recorded the batch
84
+ door as missing ("there is still no batch door on the store"); REL-DISP built
85
+ it, so the per-id `record_read` lane is gone entirely.
86
+ * **`RelationPicker` offers the same words the cell shows.** It had the third
87
+ copy of the derivation, which is why a column configured to read "Maria Chen —
88
+ Rincon" still asked a person to choose between two identical "Maria Chen"s.
89
+ One `relation_words_many` now covers the offered rows AND the already-picked
90
+ ids, so what you pick from and what you read back can never disagree.
91
+ * **`recordNameIn` / `rowNameIn` — the one naming call for a record whose Table
92
+ you already hold.** `Grid` (the Talk action), `Peek` (the peek title),
93
+ `PortalsPanel`'s client picker and the host test bench were each writing
94
+ `recordName(row.document, table.title_field)` out by hand. That is not the
95
+ store's question — there is no id to resolve — but it is the same question
96
+ answered five times in four files, which is how a Table titled by `cname` read
97
+ "Untitled" on one screen and correctly on the next. It lives once now.
98
+ NOT a second resolver: hold an id, and the answer is still the store's.
99
+ * **`check:one-reference-builder` goes from a baseline of SIX to ZERO.** The
100
+ guard shipped saying out loud that allowlisting the six "would be the same lie
101
+ with extra steps". None was allowlisted. Proven red on a planted copy at
102
+ baseline 0, then green.
103
+
104
+ **Consumer action:** none for a host that only mounts these components — the
105
+ change is behind them. A host resolving a relation label itself should delete
106
+ that code and call `client.relationWordsMany`; one holding a Table and a
107
+ document should call `recordNameIn` / `rowNameIn`.
108
+
109
+ ## 0.62.0
110
+
111
+ **THE ONE REFERENCE BUILDER.** (lane RELATION-DISPLAY.)
112
+
113
+ *Written after the fact by lane RELATION-DISPLAY-2 — 0.62.0 published with no
114
+ entry here, and a released version with no changelog row is a version nobody
115
+ downstream can read. Sourced from that lane's own progress note, not invented.*
116
+
117
+ * **`ReferenceBuilder` + `previewWords`** — the one place a reference to another
118
+ table is built. It asks, in the order a person thinks of it: which table →
119
+ what a record of it is called TODAY (its own reference column, SHOWN rather
120
+ than hidden) → only if they want it, which columns instead, in order, with a
121
+ separator → a preview on that table's REAL first rows. `FieldEditor`'s private
122
+ `TableToPointAt` is deleted and this stands in its place.
123
+ * **A relation is asked its questions when EDITING too.** That branch skipped
124
+ every existing column that was not a choice list, so there was nowhere to say
125
+ which columns a link should show — the one thing about an existing relation a
126
+ person most wants to change. The target stays locked there, because the panel
127
+ sends no `relation_target` in a patch and a picker that changed it would be a
128
+ control that silently does nothing.
129
+ * **`looksLikeId` and `WITHHELD_RECORD_LABEL` are exported at last** — they were
130
+ defined and unreachable, so a host could not agree with the package about what
131
+ a name is.
132
+
133
+ **Consumer action:** a surface that lets a person choose a column's target table
134
+ mounts `ReferenceBuilder` instead of building its own dropdown.
135
+
3
136
  ## 0.61.0
4
137
 
5
138
  **A link to a board opens a board, and a cell that is still resolving says what