@ai-matrx/records-ui 0.76.0 → 0.78.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,93 @@
1
1
  # Changelog — @ai-matrx/records-ui
2
2
 
3
+ ## 0.78.0
4
+
5
+ **The button that could not get rid of a table now can, and says what it does.** (lane
6
+ FIX-11A, VERIFIER-11 finding F3.)
7
+
8
+ `TableSettings` called `useRecordMutation().remove` with the TABLE's id — one unbounded
9
+ statement — so on a 1,430-record table it died twelve seconds in on `57014` and told the
10
+ person nothing had changed and to "try a smaller page". There is no page.
11
+
12
+ * The panel now drives `useTableArchive` from `@ai-matrx/records` 0.53.0: it previews
13
+ first (`chunk: 0`) so the confirm names the real number of records, then archives in
14
+ passes and shows "N of M records put away so far" while it works.
15
+ * **It never claims nothing happened.** A refused pass or a stopped run says what went
16
+ wrong, how many records are already archived and how many are left, and offers **Carry on
17
+ archiving**, which picks up exactly where it stopped. There is a **Stop** while it runs.
18
+ * When the store is busy the loop takes smaller passes, and the screen SAYS so rather than
19
+ going quietly four times slower.
20
+ * **The control's word matches what it does.** It said "Delete this table" over a sentence
21
+ explaining the store keeps everything for a year; the store's own verb is archive
22
+ (`table_archive`, `record_restore`, `read_records_archived`), so that is the word on the
23
+ button and the sentence says plainly it can be brought back.
24
+
25
+ Consumer action: none — the panel's props are unchanged; `onDeleted` still fires, now when
26
+ the Table itself has been archived.
27
+
28
+ ## 0.77.0
29
+
30
+ **A publish button that would hand out a dead link is not drawn.** (lane STORE-OFF, from
31
+ FIX-10A's own "left behind, named".)
32
+
33
+ Of the seventeen published forms live on the main database on 2026-09-22, three belonged to
34
+ ONE organization whose record store is switched off — and `custom.form_public` answered every
35
+ one of them with nothing, which the public route turned into a 404. Their owner pressed
36
+ Publish here, was handed a URL, and sent it to her customers.
37
+
38
+ The STORE always said no: `custom.anon_publish` opens with `custom.assert_store_door`, which
39
+ refuses 42501 while the switch is down. What was missing was the SCREEN. `usePublishGate`
40
+ (new, exported) asks `custom.store_is_open` once per mount, and the forms rail, the form
41
+ builder and the booking builder all read it — so one switch cannot be described three ways.
42
+ The control is ABSENT, never greyed, and `PUBLISH_NEEDS_THE_STORE_ON` says where the switch
43
+ is and that nothing already built is lost.
44
+
45
+ An unreadable switch is deliberately NOT treated as a closed one here — the opposite of the
46
+ store's own rule, for the opposite reason: on a screen the cost of guessing wrong is hiding a
47
+ button from somebody who may press it, so only a definite `false` removes anything and the
48
+ door still refuses.
49
+
50
+ Guard: `src/a-publish-control-needs-the-store-on.test.tsx`, shown RED (1 of 2 clauses) on the
51
+ bytes before this change and GREEN after.
52
+
53
+ **Consumer action:** none — no API changed. `usePublishGate` and
54
+ `PUBLISH_NEEDS_THE_STORE_ON` are available to a host that wants the same gate on its own
55
+ publish surface.
56
+
57
+ ## 0.76.0
58
+
59
+ **An archived portal was reachable from nowhere.** (lane PUBLISH-SWEEP, closing ORG-CLEANUP's
60
+ own "left behind, named".)
61
+
62
+ * The store grew `custom.portal_archive`, `custom.portal_restore` and the archive-aware
63
+ `custom.list_portals`, and nine of Rincon Plumbing Co's ten identical "Your jobs and
64
+ invoices" portals were archived through them from a script. No screen could do any of it:
65
+ the Portals rail reads `custom.portals`, which hides archived portals by design — so those
66
+ nine vanished from every client in the platform, with no way to see one, no way to bring one
67
+ back, and no way to archive the tenth when somebody made another mess. The same shape
68
+ `ArchivedView` closed for records, one surface later.
69
+ * `ArchivedDisclosure` (new, exported) is the archived-items law's ONE CLICK, written once so
70
+ any rail that grows an archive reveals it with the same control and the same words:
71
+ the default hides, one press on the surface itself reveals, and an empty archive is a
72
+ sentence rather than a blank.
73
+ * `ArchivedPortals` (new, exported) reads `list_portals(org, 'archived')` — the archive-aware
74
+ door, never a filter over a list that already hid them — and restores through the store's own
75
+ door with the portal's title typed back. It is organization-wide on purpose: a portal is
76
+ archived because nobody is standing on it, and narrowing the archive to the Table you happen
77
+ to be on is how an archived portal becomes unreachable from every page at once.
78
+ * `PortalsPanel` grows both halves: Archive on a live portal, with the consequence said in the
79
+ words of what actually happens before the click and the store's own sentence after it, and
80
+ the archive below the list, re-read whenever the rail changed something or somebody reveals
81
+ it.
82
+
83
+ Guard: `src/an-archived-portal-can-come-back.test.tsx` (Meridian Tax & Bookkeeping's three
84
+ identical client portals), shown RED on the rail wiring removed and the archive lane wrong,
85
+ then GREEN.
86
+
87
+ **The import wizard adds the columns as its own step.** (lane IMPORT-2.)
88
+
89
+ **Consumer action:** none — everything here is additive.
90
+
3
91
  ## 0.75.0
4
92
 
5
93
  **0.74.0 was tagged and never reached npm** — its release gate failed on