chore(autonomous-session): consolidate uncommitted work from prior session

Bundles the prior autonomous-session output that was sitting unstaged:

- Em-dash sweep across src/ + tests/ (en-dash/em-dash to hyphen, ~2280 instances)
- country-flag-icons rollout (CountryFlag component, replaces emoji glyphs that
  never rendered on Windows; lazy-loads the 3x2 SVG index as a single chunk
  after the per-subpath dynamic-import approach silently failed in webpack)
- Admin IA Phase 1+2: 7-domain regroup, 41 to 38 pages, /admin/berths index,
  redirects (ocr to ai, reports to dashboard, invitations to users),
  docs/admin-ia-proposal.md
- Per-template email tester (registry + endpoint + UI on Email admin page)
- Cancel-document mode picker (delete-from-Documenso vs keep-for-audit)
- Dashboard PDF report: 25 widgets, SVG charts, date-range picker, 11 resolvers
- Customize-widgets per-region sortables at xl+ (charts/rails/feed); single
  flat sortable below xl when the layout stacks; per-viewport saved orders
- Audit doc updates capturing each shipped item
- Lint fixes: react-compiler immutability in DonutChart (reduce instead of
  let-reassign), set-state-in-effect disables in CountryFlag and
  UploadForSigning preview-bytes effect, unused 'confirm' destructures in
  interest contract + reservation tabs, unescaped apostrophe in test-template
  card copy
This commit is contained in:
2026-05-23 00:52:59 +02:00
parent 43719b49e9
commit 221ae5784e
749 changed files with 7440 additions and 3118 deletions

View File

@@ -79,7 +79,7 @@ export function InterestList() {
}, [setChrome]);
// Force the list view at mobile widths even when the user previously
// toggled the kanban from desktop the board is desktop-only.
// toggled the kanban from desktop - the board is desktop-only.
useEffect(() => {
if (typeof window === 'undefined') return;
if (viewMode === 'board' && window.innerWidth < 640) setViewMode('table');
@@ -135,7 +135,7 @@ export function InterestList() {
},
});
// Single bulk endpoint replaces the prior parallel fan-out gives
// Single bulk endpoint replaces the prior parallel fan-out - gives
// the user a per-row failure summary and shares one server-side
// permission check.
const bulkMutation = useMutation({
@@ -155,7 +155,7 @@ export function InterestList() {
const s = res.data.summary;
if (s.failed > 0) {
toast.warning(
`${s.succeeded} of ${s.total} succeeded. ${s.failed} failed check the activity log.`,
`${s.succeeded} of ${s.total} succeeded. ${s.failed} failed - check the activity log.`,
);
}
},
@@ -167,7 +167,7 @@ export function InterestList() {
onArchive: (interest) => setArchiveInterest(interest),
});
// Persisted per-user column visibility same pattern as ClientList.
// Persisted per-user column visibility - same pattern as ClientList.
// The hidden array is the source of truth; built columns stay
// declared and we drive table visibility via columnVisibility.
const { hidden, setHidden } = useTablePreferences('interests', INTEREST_DEFAULT_HIDDEN);
@@ -181,7 +181,7 @@ export function InterestList() {
variant="gradient"
actions={
<div className="flex items-center gap-2">
{/* Kanban view is desktop-only mobile drops the toggle and
{/* Kanban view is desktop-only - mobile drops the toggle and
falls back to the list/cards view (the board's column
horizontal-scroll model is unusable at phone widths). */}
<div
@@ -223,7 +223,7 @@ export function InterestList() {
<div className="flex flex-wrap items-center gap-2">
{/* On the kanban view we strip filters that don't make sense
* there: `pipelineStage` (the columns ARE the stages) and
* `includeArchived` (the board is for active deals the
* `includeArchived` (the board is for active deals - the
* list view is the place to see history). The board endpoint
* rejects these via boardFiltersSchema if they're sent. */}
<FilterBar
@@ -238,7 +238,7 @@ export function InterestList() {
onChange={setFilter}
onClear={clearFilters}
/>
{/* Tag picker primary use case is filtering by event/yacht-show
{/* Tag picker - primary use case is filtering by event/yacht-show
* ("Palm Beach 2026") that the rep tagged interests with at the
* show. The validator already accepts `tagIds` on listInterests;
* this surfaces the input in the filter UI. */}