@ai-matrx/records-ui 0.50.0 → 0.52.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 +85 -0
- package/dist/index.cjs +3858 -2342
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +118 -1
- package/dist/index.d.ts +118 -1
- package/dist/index.js +3580 -2062
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,90 @@
|
|
|
1
1
|
# Changelog — @ai-matrx/records-ui
|
|
2
2
|
|
|
3
|
+
## 0.52.0
|
|
4
|
+
|
|
5
|
+
**Four things this package could make and no screen could reach: a form, a
|
|
6
|
+
booking page, a client portal and a scheduled summary.**
|
|
7
|
+
|
|
8
|
+
The product walk of 2026-09-21 opened a real table filled with a real business's
|
|
9
|
+
records. The Forms, Bookings and Portals rails each said the same thing — *none
|
|
10
|
+
yet, ask an agent for one in a sentence* — and offered nothing else to press;
|
|
11
|
+
dashboards worked and nothing could schedule one. A person who did not know what
|
|
12
|
+
to say to an agent was finished. The agent path is the faster one; it was never
|
|
13
|
+
meant to be the only one.
|
|
14
|
+
|
|
15
|
+
* **`BuildOrAsk`** — the shared empty state every builder now uses. Two buttons,
|
|
16
|
+
one row, every rail identical, the agent named first because it is faster and
|
|
17
|
+
the builder beside it because it always works. "Ask an agent" is the host's new
|
|
18
|
+
`onAskForOne` port and is **absent, never greyed**, when a host has not bound
|
|
19
|
+
it — only a server can honestly speak as an agent.
|
|
20
|
+
* **Forms** — `FormBuilder` opens in place in the Forms rail. It has written the
|
|
21
|
+
same `custom.anon_form` row through the same `custom.form_declare` door since
|
|
22
|
+
0.33.0 and was reachable from nowhere.
|
|
23
|
+
* **`BookingBuilder`** — Calendly's four decisions: how long an appointment is,
|
|
24
|
+
which hours of the week you are free, the gap kept between them, and what the
|
|
25
|
+
person sees after booking. It declares through `custom.booking_declare` and
|
|
26
|
+
shows the availability the STORE normalised, so the builder and the visitor's
|
|
27
|
+
picker cannot hold two ideas of what is free. `slot`, `status` and
|
|
28
|
+
`booked_with` are never offered — the door refuses a question naming any of
|
|
29
|
+
the three, and an always-refused control is a dead control.
|
|
30
|
+
* **`PortalBuilder`** — four questions, and the second is the product: which
|
|
31
|
+
Table holds the clients, which Field on each exposed Table NAMES one of them,
|
|
32
|
+
what they may read, and separately what they may change. A Table with no
|
|
33
|
+
relation pointing at the client Table gets no field picker at all and the
|
|
34
|
+
remedy is named, because "only theirs" has to be answerable before anything is
|
|
35
|
+
published. Re-stating replaces what a portal shows and the screen says so
|
|
36
|
+
above Save; the invitation is a separate act and the door's own sentence is
|
|
37
|
+
shown verbatim, so "invited" is never read as "signed in".
|
|
38
|
+
* **`DigestScheduler`** — "send this every Monday at 8 to these people", mounted
|
|
39
|
+
on the dashboard and in the notifications rail. It saves the thing in front of
|
|
40
|
+
the person as a view (`custom.view_declare`) and writes the subscription over
|
|
41
|
+
it (`custom.subscription_declare`). No new cron and no second notifier: the one
|
|
42
|
+
pg_cron tick and `communication.notification` do the work. "These people" is
|
|
43
|
+
one subscription each, deliberately — admission is tested as the SUBSCRIBER, so
|
|
44
|
+
three recipients is three tests and three summaries, each holding only what
|
|
45
|
+
that person may see — and the per-person outcome is shown, so a partial success
|
|
46
|
+
is never reported as a whole one.
|
|
47
|
+
|
|
48
|
+
## 0.51.0
|
|
49
|
+
|
|
50
|
+
**Paste fifty rows out of a spreadsheet, see what they will become, and only
|
|
51
|
+
then write them.**
|
|
52
|
+
|
|
53
|
+
Real-data crew C, 2026-09-21, entering fifty US airports: *"No 'Paste' control
|
|
54
|
+
(bulk paste of a spreadsheet block) exists on the `/data-v2` grid toolbar —
|
|
55
|
+
only 'New record' (one blank row at a time) and per-cell double-click
|
|
56
|
+
editing"*. That is two hundred and fifty double-clicks for one ordinary
|
|
57
|
+
spreadsheet. The canonical grid has had Excel/Sheets TSV paste since lane
|
|
58
|
+
GRID-ONE; the store's own table never opted in.
|
|
59
|
+
|
|
60
|
+
It opts in now, with the three things a paste into a real store needs and a
|
|
61
|
+
spreadsheet's paste has none of:
|
|
62
|
+
|
|
63
|
+
* **Per-cell refusals in plain words, before the write.** Every clipboard
|
|
64
|
+
string is coerced the way that column's own editor coerces it — `$1,250.50`
|
|
65
|
+
is 1250.5 on a money column, `(75.00)` is −75, `TRUE`/`yes`/`N` are a tick
|
|
66
|
+
box — and what cannot be coerced is left alone and named: *"Callout fee holds
|
|
67
|
+
a number, and “waived” is not one."* A list, a person, a file or another
|
|
68
|
+
record is an identity rather than a word, so a pasted word into one of those
|
|
69
|
+
is refused with the control that does hold it. Then the row is put to
|
|
70
|
+
`predictValueRefusals`, the package's mirror of `custom.validate_values`, so
|
|
71
|
+
a required column left empty comes back in the STORE's sentence rather than
|
|
72
|
+
one this screen invented.
|
|
73
|
+
* **A preview.** The grid's new `onPastePlan` means the primitive applies
|
|
74
|
+
nothing: the person sees the values as they will be stored, how many records
|
|
75
|
+
change and how many are **created**, and every cell that will be left alone
|
|
76
|
+
with its reason — then presses the button themselves.
|
|
77
|
+
* **Success only after a read-back.** The writes go through the two doors the
|
|
78
|
+
grid already uses — `recordUpdate` for a row that exists, `recordWrite` for
|
|
79
|
+
one that does not — one call per row rather than per cell, and then the table
|
|
80
|
+
is READ AGAIN and the values counted. The door's yes is not the answer; that
|
|
81
|
+
confusion is what made "Add field" report success over a column that was not
|
|
82
|
+
there.
|
|
83
|
+
|
|
84
|
+
The rows past the last row become new records, which is the whole point: a
|
|
85
|
+
person filling a new table has three rows on screen and fifty lines on the
|
|
86
|
+
clipboard. Needs `@ai-matrx/design-system` 0.29.0.
|
|
87
|
+
|
|
3
88
|
## 0.50.0
|
|
4
89
|
|
|
5
90
|
**Rules for entering this stage — the screen that writes a gate.**
|