@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 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.**