@ai-matrx/records-ui 0.49.0 → 0.51.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 +81 -0
- package/dist/index.cjs +3776 -2331
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +137 -2
- package/dist/index.d.ts +137 -2
- package/dist/index.js +3652 -2205
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,86 @@
|
|
|
1
1
|
# Changelog — @ai-matrx/records-ui
|
|
2
2
|
|
|
3
|
+
## 0.51.0
|
|
4
|
+
|
|
5
|
+
**Paste fifty rows out of a spreadsheet, see what they will become, and only
|
|
6
|
+
then write them.**
|
|
7
|
+
|
|
8
|
+
Real-data crew C, 2026-09-21, entering fifty US airports: *"No 'Paste' control
|
|
9
|
+
(bulk paste of a spreadsheet block) exists on the `/data-v2` grid toolbar —
|
|
10
|
+
only 'New record' (one blank row at a time) and per-cell double-click
|
|
11
|
+
editing"*. That is two hundred and fifty double-clicks for one ordinary
|
|
12
|
+
spreadsheet. The canonical grid has had Excel/Sheets TSV paste since lane
|
|
13
|
+
GRID-ONE; the store's own table never opted in.
|
|
14
|
+
|
|
15
|
+
It opts in now, with the three things a paste into a real store needs and a
|
|
16
|
+
spreadsheet's paste has none of:
|
|
17
|
+
|
|
18
|
+
* **Per-cell refusals in plain words, before the write.** Every clipboard
|
|
19
|
+
string is coerced the way that column's own editor coerces it — `$1,250.50`
|
|
20
|
+
is 1250.5 on a money column, `(75.00)` is −75, `TRUE`/`yes`/`N` are a tick
|
|
21
|
+
box — and what cannot be coerced is left alone and named: *"Callout fee holds
|
|
22
|
+
a number, and “waived” is not one."* A list, a person, a file or another
|
|
23
|
+
record is an identity rather than a word, so a pasted word into one of those
|
|
24
|
+
is refused with the control that does hold it. Then the row is put to
|
|
25
|
+
`predictValueRefusals`, the package's mirror of `custom.validate_values`, so
|
|
26
|
+
a required column left empty comes back in the STORE's sentence rather than
|
|
27
|
+
one this screen invented.
|
|
28
|
+
* **A preview.** The grid's new `onPastePlan` means the primitive applies
|
|
29
|
+
nothing: the person sees the values as they will be stored, how many records
|
|
30
|
+
change and how many are **created**, and every cell that will be left alone
|
|
31
|
+
with its reason — then presses the button themselves.
|
|
32
|
+
* **Success only after a read-back.** The writes go through the two doors the
|
|
33
|
+
grid already uses — `recordUpdate` for a row that exists, `recordWrite` for
|
|
34
|
+
one that does not — one call per row rather than per cell, and then the table
|
|
35
|
+
is READ AGAIN and the values counted. The door's yes is not the answer; that
|
|
36
|
+
confusion is what made "Add field" report success over a column that was not
|
|
37
|
+
there.
|
|
38
|
+
|
|
39
|
+
The rows past the last row become new records, which is the whole point: a
|
|
40
|
+
person filling a new table has three rows on screen and fifty lines on the
|
|
41
|
+
clipboard. Needs `@ai-matrx/design-system` 0.29.0.
|
|
42
|
+
|
|
43
|
+
## 0.50.0
|
|
44
|
+
|
|
45
|
+
**Rules for entering this stage — the screen that writes a gate.**
|
|
46
|
+
|
|
47
|
+
A board could enforce a rule and nobody could write one: gates arrived through
|
|
48
|
+
`custom.pipeline_declare`, which is a person at a terminal, an agent, or the
|
|
49
|
+
`pipeline_propose` verb. The homeowner this was built against told her partner
|
|
50
|
+
her rule out loud — "nothing over $5,000 gets approved on a single bid" — and
|
|
51
|
+
there was nowhere to type it.
|
|
52
|
+
|
|
53
|
+
`StageRulesSection` is a fourth section of the table settings rail, drawn only on
|
|
54
|
+
a table that is a board. One row of header: the heading, which stage, how many
|
|
55
|
+
rules, and Add a rule.
|
|
56
|
+
|
|
57
|
+
Four things it has to get right, each of which is a defect if it does not:
|
|
58
|
+
|
|
59
|
+
- **It opens the rule that is there.** `PipelineRule` now carries the gate's own
|
|
60
|
+
`when` and `demands`, so the editor shows "When Quote amount is more than 5000,
|
|
61
|
+
it cannot get here unless…" instead of a blank condition it would overwrite on
|
|
62
|
+
Save. A gate the store never kept the words for says exactly that, with its
|
|
63
|
+
sentence, rather than being drawn as an empty condition somebody saves over.
|
|
64
|
+
- **It says what the rule would do today**, in cards and by name, while she is
|
|
65
|
+
still typing — "3 of 13 quotes would be refused today — Primary Bathroom,
|
|
66
|
+
Primary Bathroom, Guest Bathroom". The old way to find out was to drag a card
|
|
67
|
+
and be refused.
|
|
68
|
+
- **Its third answer is the organization's, not the rule's.** A gate chooses
|
|
69
|
+
between turning a card away and asking for approval. Whether a refusal is
|
|
70
|
+
softened to a warning is one switch for the whole organization, so the screen
|
|
71
|
+
SAYS which mode it is in instead of offering a third option that quietly means
|
|
72
|
+
something else.
|
|
73
|
+
- **It will not save a refusal with no words.** The button is absent with a
|
|
74
|
+
sentence saying what is missing, never present and dead.
|
|
75
|
+
|
|
76
|
+
**There is still exactly one condition builder.** The form builder's private
|
|
77
|
+
`Condition` moved to `./Condition` as `ConditionRow` and both screens mount it —
|
|
78
|
+
a second one would be a second dialect of the store's one Rule language. Moving
|
|
79
|
+
it found a defect: the value was written as a STRING always, so
|
|
80
|
+
`{"op":"gt","args":[…,{"const":"5000"}]}` compared a number column against text.
|
|
81
|
+
A value that is a number is now written as a number, which is the difference
|
|
82
|
+
between "nothing over $5,000" working and not.
|
|
83
|
+
|
|
3
84
|
## 0.49.0
|
|
4
85
|
|
|
5
86
|
**"Add field" said it worked and the column was not there.**
|