feat(admin): updates as a version comparison, holds lead with the reason, free-tier line on the seat meter #329

Merged
Cordy merged 7 commits from feat/admin-final into main 2026-08-27 17:52:41 +00:00
Owner

Admin slice D of the UI port (#311). Presentation-only: no endpoints, ids, or save handlers change.

Updates — was a stack of "Label: value" .sharemeta lines. The question the page actually answers is a comparison (what you run vs. what exists), so the comparison is now the object: running version → latest, the box border warming when an update is due, with the apply instruction sitting directly beneath it because it is the only actionable thing on the page. Adds a "How checking works" table stating plainly what is sent (a version string — no instance name, no user count, no file data), how often, and that applying is always manual.

Legal holds — the note is the reason, which is the first field an auditor reads, and it was being joined into a single meta string between the author and the timestamp. Rows now lead with the path, then the reason (or an explicit "No reason recorded"), then who/when as quiet meta. Lift demoted from .danger to .linkbtn: lifting a hold is deliberate but not destructive, and a row of red buttons reads as a hazard.

Licensing — the free tier is the product's promise, not a lesser licence, so the 50-seat threshold is drawn on the seat meter instead of being left in prose. Footer states what a seat is (people who have signed in, not accounts), which is the recurring support question.

Peering — deliberately untouched. It already received a full relationship-card redesign (v0.6.32–41); peerCardEl joins the inbound key we issued with the outbound peer entry and handles either half being absent. Restyling it would have re-litigated a design that already shipped, so this slice leaves it alone.

Two things dropped rather than faked, recorded for #311:

  • Retention rules table — rules are edited as free text in a textarea; rendering them as structured rows means parsing a syntax I have not verified.
  • Retention path resolver — resolving "what applies to this path" client-side could disagree with the server's own answer, and there is no resolve endpoint to ask. A wrong authoritative-looking answer here is worse than no answer.

Implementation notes: the free-tier marker hangs off an outer .seatwrap, not .stobar, because the bar carries overflow:hidden to clip the fill's corners and would clip the marker out of existence. The updates fetch helper was read off the function being replaced rather than assumed. i18n audit passes with no missing keys; all four languages populated.

Admin slice D of the UI port (#311). Presentation-only: no endpoints, ids, or save handlers change. **Updates** — was a stack of "Label: value" `.sharemeta` lines. The question the page actually answers is a comparison (what you run vs. what exists), so the comparison is now the object: running version → latest, the box border warming when an update is due, with the apply instruction sitting directly beneath it because it is the only actionable thing on the page. Adds a "How checking works" table stating plainly what is sent (a version string — no instance name, no user count, no file data), how often, and that applying is always manual. **Legal holds** — the note is the *reason*, which is the first field an auditor reads, and it was being joined into a single meta string between the author and the timestamp. Rows now lead with the path, then the reason (or an explicit "No reason recorded"), then who/when as quiet meta. Lift demoted from `.danger` to `.linkbtn`: lifting a hold is deliberate but not destructive, and a row of red buttons reads as a hazard. **Licensing** — the free tier is the product's promise, not a lesser licence, so the 50-seat threshold is drawn *on* the seat meter instead of being left in prose. Footer states what a seat is (people who have signed in, not accounts), which is the recurring support question. **Peering — deliberately untouched.** It already received a full relationship-card redesign (v0.6.32–41); `peerCardEl` joins the inbound key we issued with the outbound peer entry and handles either half being absent. Restyling it would have re-litigated a design that already shipped, so this slice leaves it alone. **Two things dropped rather than faked**, recorded for #311: - *Retention rules table* — rules are edited as free text in a textarea; rendering them as structured rows means parsing a syntax I have not verified. - *Retention path resolver* — resolving "what applies to this path" client-side could disagree with the server's own answer, and there is no resolve endpoint to ask. A wrong authoritative-looking answer here is worse than no answer. Implementation notes: the free-tier marker hangs off an outer `.seatwrap`, not `.stobar`, because the bar carries `overflow:hidden` to clip the fill's corners and would clip the marker out of existence. The updates fetch helper was read off the function being replaced rather than assumed. i18n audit passes with no missing keys; all four languages populated.
Cordy merged commit 1404f210ea into main 2026-08-27 17:52:41 +00:00
Cordy deleted branch feat/admin-final 2026-08-27 17:52:43 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Cordy/Cairn#329
No description provided.