fix(interests): list yacht join + EOI status column + col redesign
Wire interests.yachtId -> yachts.name into the listInterests post-fetch enrichment so the redesigned columns (Client · Yacht · Berth · Stage · EOI status · Source · Last activity) render the linked yacht. - Add yachtId/yachtName to InterestRow. - listInterests: fourth parallel join for yachts.name, Map merged alongside the existing client/berth/tag/notes joins. - interest-columns: add Yacht column (with link to /yachts/[id] when the yacht has an id); replace Category with EOI status (badge driven by interests.eoi_status); drop default-view Tags. The "Berth size desired" column called out in §5.2 is deferred to Phase 2 since the underlying desired_*_ft columns don't exist yet. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -209,7 +209,7 @@ export async function listInterests(portId: string, query: ListInterestsInput) {
|
||||
archivedAtColumn: interests.archivedAt,
|
||||
});
|
||||
|
||||
// Join client names and berth mooring numbers
|
||||
// Join client names, berth mooring numbers, and yacht names.
|
||||
const interestIds = (
|
||||
result.data as Array<{ id: string; clientId: string; berthId: string | null }>
|
||||
).map((i) => i.id);
|
||||
@@ -223,9 +223,17 @@ export async function listInterests(portId: string, query: ListInterestsInput) {
|
||||
.filter(Boolean) as string[],
|
||||
),
|
||||
];
|
||||
const yachtIds = [
|
||||
...new Set(
|
||||
(result.data as Array<{ yachtId: string | null }>)
|
||||
.map((i) => i.yachtId)
|
||||
.filter(Boolean) as string[],
|
||||
),
|
||||
];
|
||||
|
||||
let clientsMap: Record<string, string> = {};
|
||||
let berthsMap: Record<string, string> = {};
|
||||
let yachtsMap: Record<string, string> = {};
|
||||
const tagsByInterestId: Record<string, Array<{ id: string; name: string; color: string }>> = {};
|
||||
const notesCountByInterestId: Record<string, number> = {};
|
||||
|
||||
@@ -245,6 +253,14 @@ export async function listInterests(portId: string, query: ListInterestsInput) {
|
||||
berthsMap = Object.fromEntries(berthRows.map((b) => [b.id, b.mooringNumber]));
|
||||
}
|
||||
|
||||
if (yachtIds.length > 0) {
|
||||
const yachtRows = await db
|
||||
.select({ id: yachts.id, name: yachts.name })
|
||||
.from(yachts)
|
||||
.where(inArray(yachts.id, yachtIds));
|
||||
yachtsMap = Object.fromEntries(yachtRows.map((y) => [y.id, y.name]));
|
||||
}
|
||||
|
||||
if (interestIds.length > 0) {
|
||||
const tagRows = await db
|
||||
.select({
|
||||
@@ -280,6 +296,7 @@ export async function listInterests(portId: string, query: ListInterestsInput) {
|
||||
...i,
|
||||
clientName: clientsMap[i.clientId as string] ?? null,
|
||||
berthMooringNumber: i.berthId ? (berthsMap[i.berthId as string] ?? null) : null,
|
||||
yachtName: i.yachtId ? (yachtsMap[i.yachtId as string] ?? null) : null,
|
||||
tags: tagsByInterestId[i.id as string] ?? [],
|
||||
notesCount: notesCountByInterestId[i.id as string] ?? 0,
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user