From 8d8d4b7fa10c8b86059cefaa2ba96e074ad06dc8 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Mon, 13 Jul 2026 23:10:25 +0000 Subject: [PATCH] feat(live): add planning fields as toggleable property columns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Surface the four planning columns from hubspot_deal_data — Planning Authority, Designated Area, Article 4 PD Rights, Listed Building — as optional columns in the Live Reporting properties table. The DB columns already exist (migration 0267); this wires them through the read path only: query mapping, HubspotDeal type, column defs, the column-visibility toggle (hidden by default), and CSV export. Rendered as plain text since they are text columns in HubSpot. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../your-projects/live/PropertyTable.tsx | 10 +++- .../live/PropertyTableColumns.tsx | 48 +++++++++++++++++++ .../your-projects/live/dealQuery.ts | 4 ++ .../your-projects/live/docStatus.test.ts | 4 ++ .../your-projects/live/measureFilters.test.ts | 4 ++ .../your-projects/live/propertyCsv.test.ts | 4 ++ .../your-projects/live/propertyCsv.ts | 4 ++ .../your-projects/live/transforms.test.ts | 4 ++ .../(portfolio)/your-projects/live/types.ts | 6 +++ 9 files changed, 87 insertions(+), 1 deletion(-) diff --git a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/PropertyTable.tsx b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/PropertyTable.tsx index d1e07c96..eca925e7 100644 --- a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/PropertyTable.tsx +++ b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/PropertyTable.tsx @@ -67,7 +67,11 @@ const COLUMN_LABELS: Record = { coordinationComments: "Coordination Comments", dampAndMouldGrowth: "Damp and Mould Growth", dampMouldAndRepairComments: "Damp, Mould and Repair Comments", - domnaSurveyRequested: "Domna Survey Requested" + domnaSurveyRequested: "Domna Survey Requested", + planningAuthority: "Planning Authority", + designatedArea: "Designated Area", + article4PdRights: "Article 4 PD Rights", + listedBuilding: "Listed Building", }; type DocFilter = "all" | "has_docs" | "incomplete" | "none"; @@ -114,6 +118,10 @@ export default function PropertyTable({ data, onOpenDrawer, portfolioId = "", sh dampAndMouldGrowth: false, dampMouldAndRepairComments: false, domnaSurveyRequested: false, + planningAuthority: false, + designatedArea: false, + article4PdRights: false, + listedBuilding: false, }); // Pre-filter by stage, doc status, and removal status before TanStack gets it diff --git a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/PropertyTableColumns.tsx b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/PropertyTableColumns.tsx index aa0157a2..aa1c59e7 100644 --- a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/PropertyTableColumns.tsx +++ b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/PropertyTableColumns.tsx @@ -439,6 +439,54 @@ export function createPropertyTableColumns( }, }, + // ── Planning authority ─────────────────────────────────────────────── + { + accessorKey: "planningAuthority", + id: "planningAuthority", + header: ({ column }) => , + cell: ({ row }) => ( + + {row.original.planningAuthority ?? } + + ), + }, + + // ── Designated area ────────────────────────────────────────────────── + { + accessorKey: "designatedArea", + id: "designatedArea", + header: ({ column }) => , + cell: ({ row }) => ( + + {row.original.designatedArea ?? } + + ), + }, + + // ── Article 4 PD rights ────────────────────────────────────────────── + { + accessorKey: "article4PdRights", + id: "article4PdRights", + header: ({ column }) => , + cell: ({ row }) => ( + + {row.original.article4PdRights ?? } + + ), + }, + + // ── Listed building ────────────────────────────────────────────────── + { + accessorKey: "listedBuilding", + id: "listedBuilding", + header: ({ column }) => , + cell: ({ row }) => ( + + {row.original.listedBuilding ?? } + + ), + }, + ]; if (showDocuments) { diff --git a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/dealQuery.ts b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/dealQuery.ts index 68ce00ac..72d94089 100644 --- a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/dealQuery.ts +++ b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/dealQuery.ts @@ -73,6 +73,10 @@ export function mapDbRowToHubspotDeal(row: DealRow): HubspotDeal { domnaSurveyDate: d.domnaSurveyDate, batch: d.batch, batchDescription: d.batchDescription, + planningAuthority: d.planningAuthority, + designatedArea: d.designatedArea, + article4PdRights: d.article4PdRights, + listedBuilding: d.listedBuilding, createdAt: d.createdAt, updatedAt: d.updatedAt, }; diff --git a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/docStatus.test.ts b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/docStatus.test.ts index 32d1671e..2c8d22f8 100644 --- a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/docStatus.test.ts +++ b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/docStatus.test.ts @@ -60,6 +60,10 @@ function makeDeal(overrides: Partial = {}): HubspotDeal { domnaSurveyDate: null, batch: null, batchDescription: null, + planningAuthority: null, + designatedArea: null, + article4PdRights: null, + listedBuilding: null, coordinationComments: null, domnasurveyRequired: null, createdAt: new Date(), diff --git a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/measureFilters.test.ts b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/measureFilters.test.ts index 6a30d703..51343752 100644 --- a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/measureFilters.test.ts +++ b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/measureFilters.test.ts @@ -59,6 +59,10 @@ function makeDeal(overrides: Partial = {}): ClassifiedDeal { domnaSurveyDate: null, batch: null, batchDescription: null, + planningAuthority: null, + designatedArea: null, + article4PdRights: null, + listedBuilding: null, coordinationComments: null, domnasurveyRequired: null, createdAt: new Date(), diff --git a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/propertyCsv.test.ts b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/propertyCsv.test.ts index 91501665..c96ce491 100644 --- a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/propertyCsv.test.ts +++ b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/propertyCsv.test.ts @@ -59,6 +59,10 @@ function makeDeal(overrides: Partial = {}): HubspotDeal { domnaSurveyDate: null, batch: null, batchDescription: null, + planningAuthority: null, + designatedArea: null, + article4PdRights: null, + listedBuilding: null, coordinationComments: null, domnasurveyRequired: null, createdAt: new Date(), diff --git a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/propertyCsv.ts b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/propertyCsv.ts index 1b29caab..5e8c9f09 100644 --- a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/propertyCsv.ts +++ b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/propertyCsv.ts @@ -30,6 +30,10 @@ export const PROPERTY_CSV_FIELDS: PropertyCsvField[] = [ { key: "dampMouldFlag", label: "Damp and Mould Growth" }, { key: "dampMouldAndRepairComments", label: "Damp Mould and Repair Comments" }, { key: "domnasurveyRequired", label: "Domna Survey Required" }, + { key: "planningAuthority", label: "Planning Authority" }, + { key: "designatedArea", label: "Designated Area" }, + { key: "article4PdRights", label: "Article 4 PD Rights" }, + { key: "listedBuilding", label: "Listed Building" }, ]; export function escapeCsvCell(value: unknown): string { diff --git a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/transforms.test.ts b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/transforms.test.ts index ad7bf045..8df8b962 100644 --- a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/transforms.test.ts +++ b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/transforms.test.ts @@ -66,6 +66,10 @@ function makeDeal(overrides: Partial = {}): HubspotDeal { domnaSurveyDate: null, batch: null, batchDescription: null, + planningAuthority: null, + designatedArea: null, + article4PdRights: null, + listedBuilding: null, coordinationComments: null, domnasurveyRequired: null, createdAt: new Date(), diff --git a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/types.ts b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/types.ts index aa49fe25..519a301f 100644 --- a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/types.ts +++ b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/types.ts @@ -71,6 +71,12 @@ export type HubspotDeal = { batch: string | null; batchDescription: string | null; + // ── Planning fields (issue: extra PM columns) ───────────────────────── + planningAuthority: string | null; + designatedArea: string | null; + article4PdRights: string | null; + listedBuilding: string | null; + createdAt: Date; updatedAt: Date; };