implementing decent homes checklist

This commit is contained in:
Khalim Conn-Kowlessar 2025-08-26 17:39:19 +00:00
parent abc2055058
commit ccc75ce059
2 changed files with 109 additions and 52 deletions

View file

@ -69,13 +69,13 @@ export function Toolbar({ portfolioId, scenarios }: ToolbarProps) {
Summary
</NavigationMenuItem>
<NavigationMenuItem
{/* <NavigationMenuItem
className={navigationMenuTriggerStyle() + " ml-3 mr-2"}
onClick={handleClickMeasures}
>
<WrenchScrewdriverIcon className="h-4 w-4 mr-2" />
Measures
</NavigationMenuItem>
</NavigationMenuItem> */}
<NavigationMenuItem
className={navigationMenuTriggerStyle() + " ml-3 mr-2"}

View file

@ -17,6 +17,8 @@ import {
AccordionTrigger,
} from "@/app/shadcn_components/ui/accordion";
import clsx from "clsx";
import { AlertTriangle } from "lucide-react";
function ChecklistItem({
label,
@ -70,20 +72,28 @@ function ChecklistItem({
<strong>Condition:</strong> {room.room_info.overall_condition_of_the_room}
</div>
)}
{room.room_info?.does_the_room_have_any_defects && (
<div>
<strong>Defects:</strong> {room.room_info.does_the_room_have_any_defects}
{room.room_info?.does_the_room_have_any_defects === "Yes" && (
<div className="flex items-start gap-2 text-brandblue">
<AlertTriangle className="w-4 h-4 mt-0.5 shrink-0" />
<div>
<div><strong>Defect reported</strong></div>
{room.room_info?.description_of_defect && (
<div className="text-sm text-muted-foreground">
{room.room_info.description_of_defect}
</div>
)}
</div>
</div>
)}
{room.room_info?.ventilation_info
?.are_there_any_visible_or_reported_signs_of_damp_mould_or_excessive_condensation_within_the_room !==
undefined && (
<div>
<strong>Damp/Mould:</strong>{" "}
{room.room_info.ventilation_info
.are_there_any_visible_or_reported_signs_of_damp_mould_or_excessive_condensation_within_the_room
? "Yes"
: "No"}
{room.room_info?.ventilation_info?.location_of_any_damp_or_mould && (
<div className="flex items-center gap-2 text-red-600">
<AlertTriangle className="w-4 h-4 shrink-0" />
<span>
<strong>Damp/Mould Location:</strong> {room.room_info.ventilation_info.location_of_any_damp_or_mould}
<span className="ml-2 text-xs text-muted-foreground italic">
(Severity: Average)
</span>
</span>
</div>
)}
{room.room_info?.windows_info?.condition_of_the_windows && (
@ -202,6 +212,43 @@ export default function ConditionReport({
const areaPerPerson = totalFloorArea / occupantsToUse;
const hasSufficientSpace = (occupantsToUse <= maxOccupants) && (areaPerPerson >= 20);
// Category 1 Hazard structural
const frontElevation = conditionReport.access_and_elevations?.external_elevation_front?.external_elevation;
const elevationEntries: [string, any][] = [
["Front Elevation", frontElevation],
["Back Elevation", conditionReport.access_and_elevations?.external_elevation_back?.external_elevation],
["Gable One", conditionReport.access_and_elevations?.external_elevation_gable_one?.external_elevation],
["Gable Two", conditionReport.access_and_elevations?.external_elevation_gable_two?.external_elevation],
];
// If a wall inherits front elevation, use the front's data
const applyFrontDefaults = (label: string, elevationKey: string): [string, any] => {
const section = conditionReport.access_and_elevations?.[elevationKey];
if (section?.do_all_answers_for_the_front_elevation_apply_to_this_wall) {
return [label, frontElevation];
}
return [label, section?.external_elevation ?? null];
};
const allElevations: [string, any][] = [
["Front Elevation", frontElevation],
applyFrontDefaults("Back Elevation", "external_elevation_back"),
applyFrontDefaults("Gable One", "external_elevation_gable_one"),
applyFrontDefaults("Gable Two", "external_elevation_gable_two"),
];
const elevationsWithIssues = allElevations.filter(([_, elevation]) =>
elevation &&
(
elevation.does_any_structural_defect_need_resolving_before_retrofit === true ||
elevation.are_there_any_signs_of_water_penetration_caused_by_failed_rainwater_goods_or_pipework === true ||
elevation.are_there_any_visible_signs_of_movement === true ||
elevation.are_there_any_visible_signs_of_cracking_to_the_existing_external_finish === true
)
);
return (
<div className="space-y-6 mt-8">
<Card>
@ -209,44 +256,54 @@ export default function ConditionReport({
Decent Homes Checklist
</CardHeader>
<CardContent className="space-y-3">
<ChecklistItem
label={roomsWithDamp ? "Signs of damp or mould present": "No signs of damp or mould"}
passed={roomsWithDamp.length === 0}
alert={roomsWithDamp.length > 0}
roomsWithIssues={roomsWithDamp}
/>
<ChecklistItem
label={hasDefects ? "Room defects present" : "No room defects present"}
passed={!hasDefects}
alert={hasDefects}
roomsWithIssues={roomsWithDefects}
/>
<ChecklistItem
label={heatingWorking ? "Heating system operational" : "Heating system not operational"}
passed={heatingWorking}
alert={!heatingWorking}
/>
<ChecklistItem
label={windowsOk ? "Windows in good condition" : "Windows not in good condition"}
passed={windowsOk}
alert={!windowsOk}
roomsWithIssues={roomsWithBadWindows}
/>
<ChecklistItem
label={kitchenOk ? "Kitchen in good condition" : "Kitchen not in good condition"}
passed={kitchenOk}
alert={!kitchenOk}
/>
<ChecklistItem
label={bathroomsOk ? "Bathrooms in good condition" : "Bathrooms not in good condition"}
passed={bathroomsOk}
alert={!bathroomsOk}
/>
<ChecklistItem
label="Sufficient space for number of occupants"
passed={hasSufficientSpace}
alert={!hasSufficientSpace}
note={`${totalOccupants} occupants, ${numberOfBedrooms} bedrooms. ${areaPerPerson}m² per person`}
<ChecklistItem
label={
elevationsWithIssues.length > 0
? "Structural issues identified"
: "No major structural issues identified"
}
passed={elevationsWithIssues.length === 0}
alert={elevationsWithIssues.length > 0}
roomsWithIssues={elevationsWithIssues}
/>
<ChecklistItem
label={roomsWithDamp ? "Signs of damp or mould present": "No signs of damp or mould"}
passed={roomsWithDamp.length === 0}
alert={roomsWithDamp.length > 0}
roomsWithIssues={roomsWithDamp}
/>
<ChecklistItem
label={hasDefects ? "Room defects present" : "No room defects present"}
passed={!hasDefects}
alert={hasDefects}
roomsWithIssues={roomsWithDefects}
/>
<ChecklistItem
label={heatingWorking ? "Heating system operational" : "Heating system not operational"}
passed={heatingWorking}
alert={!heatingWorking}
/>
<ChecklistItem
label={windowsOk ? "Windows in good condition" : "Windows not in good condition"}
passed={windowsOk}
alert={!windowsOk}
roomsWithIssues={roomsWithBadWindows}
/>
<ChecklistItem
label={kitchenOk ? "Kitchen in good condition" : "Kitchen not in good condition"}
passed={kitchenOk}
alert={!kitchenOk}
/>
<ChecklistItem
label={bathroomsOk ? "Bathrooms in good condition" : "Bathrooms not in good condition"}
passed={bathroomsOk}
alert={!bathroomsOk}
/>
<ChecklistItem
label="Sufficient space for number of occupants"
passed={hasSufficientSpace}
alert={!hasSufficientSpace}
note={`${occupantsToUse} occupants, ${numberOfBedrooms} bedrooms. ${areaPerPerson}m² per person`}
/>
</CardContent>