From f99374a16ff90ba3ab14c6e8c05e7ab1ecddcbc0 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Tue, 19 May 2026 08:30:57 +0000 Subject: [PATCH] list coordination and design documents in their own sections --- .../live/PropertyDocumentsContent.tsx | 45 +++++++++++++++++-- .../live/propertyDocuments.test.ts | 10 ++--- .../your-projects/live/propertyDocuments.ts | 10 ++++- .../(portfolio)/your-projects/live/types.ts | 11 +++++ 4 files changed, 65 insertions(+), 11 deletions(-) diff --git a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/PropertyDocumentsContent.tsx b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/PropertyDocumentsContent.tsx index 102c2fb..50a9410 100644 --- a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/PropertyDocumentsContent.tsx +++ b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/PropertyDocumentsContent.tsx @@ -59,6 +59,9 @@ export const DOC_TYPE_LABELS: Record = { installer_qualifications: "Installer Qualifications", installer_feedback: "Installer Feedback", contractor_other: "Other", + improvement_option_evaluation: "Improvement Option Evaluation", + medium_term_improvement_plan: "Medium Term Improvement Plan", + retrofit_design_doc: "Retrofit Design Document" }; function formatDocDate(iso: string): string { @@ -172,8 +175,8 @@ export default function PropertyDocumentsContent({ return next; }); - const { retrofitDocs, installDocs } = splitDocumentsByType(documents); - const missingRetrofitTypes = getMissingRetrofitTypes(retrofitDocs); + const { docs: surveyDocs, coordinationDocs, designDocs, installDocs } = splitDocumentsByType(documents); + const missingRetrofitTypes = getMissingRetrofitTypes(surveyDocs); const hasDocuments = documents.length > 0; const isContractor = userCapability?.includes("contractor") ?? false; @@ -258,9 +261,9 @@ export default function PropertyDocumentsContent({

Retrofit Assessment Documents

- {retrofitDocs.length > 0 ? ( + {surveyDocs.length > 0 ? (
- {retrofitDocs.map((doc) => ( + {surveyDocs.map((doc) => ( ))}
@@ -287,6 +290,40 @@ export default function PropertyDocumentsContent({ )} + {/* Coordination Documents */} + +

+ Coordination Documents +

+ {coordinationDocs.length > 0 ? ( +
+ {coordinationDocs.map((doc) => ( + + ))} +
+ ) : ( +

None uploaded yet.

+ )} +
+ + {/* Design Documents */} + +

+ Design Documents +

+ {designDocs.length > 0 ? ( +
+ {designDocs.map((doc) => ( + + ))} +
+ ) : ( +

None uploaded yet.

+ )} +
+ + + {/* Install Documents */}

diff --git a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/propertyDocuments.test.ts b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/propertyDocuments.test.ts index c81eb93..36503d6 100644 --- a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/propertyDocuments.test.ts +++ b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/propertyDocuments.test.ts @@ -35,21 +35,21 @@ function makeMeasureProgress(overrides: Partial = {}): Measu describe("splitDocumentsByType", () => { it("puts survey doc types in retrofitDocs", () => { const doc = makeDoc({ docType: "photo_pack" }); - const { retrofitDocs, installDocs } = splitDocumentsByType([doc]); + const { docs: retrofitDocs, installDocs } = splitDocumentsByType([doc]); expect(retrofitDocs).toHaveLength(1); expect(installDocs).toHaveLength(0); }); it("puts install doc types in installDocs", () => { const doc = makeDoc({ docType: "pre_photo" }); - const { retrofitDocs, installDocs } = splitDocumentsByType([doc]); + const { docs: retrofitDocs, installDocs } = splitDocumentsByType([doc]); expect(retrofitDocs).toHaveLength(0); expect(installDocs).toHaveLength(1); }); it("includes optional ecmk types in retrofitDocs", () => { const doc = makeDoc({ docType: "ecmk_site_note" }); - const { retrofitDocs } = splitDocumentsByType([doc]); + const { docs: retrofitDocs } = splitDocumentsByType([doc]); expect(retrofitDocs).toHaveLength(1); }); @@ -60,13 +60,13 @@ describe("splitDocumentsByType", () => { makeDoc({ id: "3", docType: "site_note" }), makeDoc({ id: "4", docType: "post_photo" }), ]; - const { retrofitDocs, installDocs } = splitDocumentsByType(docs); + const { docs: retrofitDocs, installDocs } = splitDocumentsByType(docs); expect(retrofitDocs).toHaveLength(2); expect(installDocs).toHaveLength(2); }); it("returns empty arrays for empty input", () => { - const { retrofitDocs, installDocs } = splitDocumentsByType([]); + const { docs: retrofitDocs, installDocs } = splitDocumentsByType([]); expect(retrofitDocs).toHaveLength(0); expect(installDocs).toHaveLength(0); }); diff --git a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/propertyDocuments.ts b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/propertyDocuments.ts index 65a5e9e..8496247 100644 --- a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/propertyDocuments.ts +++ b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/propertyDocuments.ts @@ -1,15 +1,21 @@ import { SURVEY_ALL_DOC_TYPES, EXPECTED_RETROFIT_ASSESSMENT_DOC_TYPES, + COORDINATION_DOC_TYPES, + DESIGN_DOC_TYPES, } from "./types"; import type { PropertyDocument, MeasureDocProgress } from "./types"; export function splitDocumentsByType(docs: PropertyDocument[]): { - retrofitDocs: PropertyDocument[]; + docs: PropertyDocument[]; + coordinationDocs: PropertyDocument[]; + designDocs: PropertyDocument[]; installDocs: PropertyDocument[]; } { return { - retrofitDocs: docs.filter((d) => SURVEY_ALL_DOC_TYPES.has(d.docType)), + docs: docs.filter((d) => SURVEY_ALL_DOC_TYPES.has(d.docType)), + coordinationDocs: docs.filter((d) => COORDINATION_DOC_TYPES.has(d.docType)), + designDocs: docs.filter((d) => DESIGN_DOC_TYPES.has(d.docType)), installDocs: docs.filter((d) => !SURVEY_ALL_DOC_TYPES.has(d.docType)), }; } 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 f453b08..47bb9fb 100644 --- a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/types.ts +++ b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/types.ts @@ -253,6 +253,17 @@ export const SURVEY_ALL_DOC_TYPES = new Set([ "pas_significance", ]); +// Coordination doc types +export const COORDINATION_DOC_TYPES = new Set([ + "improvement_option_evaluation", + "medium_term_improvement_plan" +]); + +// Design doc types +export const DESIGN_DOC_TYPES = new Set([ + "retrofit_design_doc" +]); + // Per-measure document upload progress export type MeasureDocProgress = { measureName: string;