feat(uat-batch-7): Wave-2 polish — Open-in-Documents, berth label, residential, NotesList parity

- InterestEoiTab history link renamed "Open" → "Open in Documents"
  so the cross-section nav target is unambiguous.
- DocumentDetail Interest link sub-text now shows the derived
  `berthLabel` (formatBerthRange of the in-EOI-bundle subset, falling
  back to primary, then all linked berths). The link no longer
  duplicates the Client name; falls back to clientName or "No berths
  linked" when no berths exist.
- New /<port>/residential/page.tsx redirects to /residential/clients
  so the breadcrumb's Residential link works.
- Residential interests list — whole row is now a Link target (was
  hidden behind a trailing "View" link); hover + border accent on the
  full row.
- Expenses PageHeader description "Track and manage port expenses" →
  "Track and manage business expenses" (drop the redundant "port",
  same audit pattern flagged in the queue).
- DropdownMenu base content capped at `max-h-96` (was the Radix
  available-height variable, which stretched menus edge-to-edge); the
  existing internal scroll handles overflow.
- Yacht Overview Notes block: replaced the legacy single-field
  textarea with the threaded `<NotesList entityType="yachts">` for
  parity with clients/interests/companies. Legacy `yacht.notes`
  column stays in schema for EOI/contract merge-field path.

tsc clean. 1419/1419 vitest pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-21 17:41:02 +02:00
parent a673b6cec2
commit c6dcf49e18
8 changed files with 89 additions and 23 deletions

View File

@@ -105,7 +105,7 @@ export default function ExpensesPage() {
<div className="space-y-4">
<PageHeader
title="Expenses"
description="Track and manage port expenses"
description="Track and manage business expenses"
actions={
<div className="flex items-center gap-2">
<PermissionGate resource="expenses" action="view">

View File

@@ -0,0 +1,16 @@
import { redirect } from 'next/navigation';
/**
* /<port>/residential is a namespace segment — the actual landing is
* /residential/clients. Without a page.tsx here, the breadcrumb's
* "Residential" link 404s. Server-redirect to the Clients sub-page so
* the link works as a useful shortcut.
*/
export default async function ResidentialIndexPage({
params,
}: {
params: Promise<{ portSlug: string }>;
}) {
const { portSlug } = await params;
redirect(`/${portSlug}/residential/clients`);
}