Merge pull request #117 from Hestia-Homes/feature/livewest_and_southern

formatted bar chart
This commit is contained in:
KhalimCK 2025-11-05 10:15:25 +00:00 committed by GitHub
commit ed5e8d8159
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -8,44 +8,54 @@ const STAGE_ORDER = [
"Booking team to contact tenant",
"Survey in progress",
"Not viable",
"Needs Heating Upgrade installed",
"Needs support",
"Coordination + design",
"Ready to be installed",
];
const stage = (label: string) => STAGE_ORDER.find((s) => s === label)!;
const STAGE_LABELS: Record<string, string> = {
"1617223910": STAGE_ORDER[0],
"3583836399": STAGE_ORDER[0],
"3589581001": STAGE_ORDER[1],
"3569878239": STAGE_ORDER[1],
"1617223911": STAGE_ORDER[1],
"1984184569": STAGE_ORDER[1],
"3569572028": STAGE_ORDER[1],
"3570936026": STAGE_ORDER[1],
"2663668937": STAGE_ORDER[1],
"1984401629": STAGE_ORDER[1],
"1617223912": STAGE_ORDER[2],
"1617223913": STAGE_ORDER[2],
"2558220518": STAGE_ORDER[1],
"3474594026": STAGE_ORDER[1],
"3206388924": STAGE_ORDER[2],
"1617223915": STAGE_ORDER[2],
"1617223917": STAGE_ORDER[2],
"1887735998": STAGE_ORDER[3],
"3061261536": STAGE_ORDER[4],
"2571417798": STAGE_ORDER[2],
"1617223914": STAGE_ORDER[5],
"1887736000": STAGE_ORDER[2],
"1617223916": STAGE_ORDER[2],
"2628341989": STAGE_ORDER[2],
"3441170637": STAGE_ORDER[2],
"2628233422": STAGE_ORDER[5],
"1887735999": STAGE_ORDER[4],
"2702650617": STAGE_ORDER[5],
"2473886962": STAGE_ORDER[5],
"3016601828": STAGE_ORDER[4],
"1668803774": STAGE_ORDER[6],
"3440363736": STAGE_ORDER[6],
"1617223910": stage("Initial planning"),
"3583836399": stage("Initial planning"),
"3589581001": stage("Booking team to contact tenant"),
"3569878239": stage("Booking team to contact tenant"),
"1617223911": stage("Booking team to contact tenant"),
"1984184569": stage("Booking team to contact tenant"),
"3569572028": stage("Booking team to contact tenant"),
"3570936026": stage("Booking team to contact tenant"),
"2663668937": stage("Booking team to contact tenant"),
"1984401629": stage("Booking team to contact tenant"),
"2558220518": stage("Booking team to contact tenant"),
"3474594026": stage("Booking team to contact tenant"),
"1617223912": stage("Survey in progress"),
"1617223913": stage("Survey in progress"),
"3206388924": stage("Survey in progress"),
"1617223915": stage("Survey in progress"),
"1617223917": stage("Survey in progress"),
"2571417798": stage("Survey in progress"),
"1887736000": stage("Survey in progress"),
"1617223916": stage("Survey in progress"),
"2628341989": stage("Survey in progress"),
"3441170637": stage("Survey in progress"),
"1887735998": stage("Not viable"),
"3061261536": stage("Needs Heating Upgrade installed"),
"1887735999": stage("Needs Heating Upgrade installed"),
"3016601828": stage("Needs Heating Upgrade installed"),
"1617223914": stage("Needs support"),
"2628233422": stage("Needs support"),
"2702650617": stage("Needs support"),
"2473886962": stage("Needs support"),
"1668803774": stage("Coordination + design"),
"3440363736": stage("Coordination + design"),
"2769407183": stage("Needs Heating Upgrade installed"),
};
interface DealStageChartProps {
@ -56,18 +66,22 @@ interface DealStageChartProps {
export function DealStageChart({ deals, onOpenTable }: DealStageChartProps) {
const data = useMemo(() => {
const counts: Record<string, number> = {};
// Count deals by stage
deals.forEach((d) => {
const stageId = d.dealstage || "unknown";
const stageName = STAGE_LABELS[stageId] || "Unknown Stage";
counts[stageName] = (counts[stageName] || 0) + 1;
});
const unsorted = Object.entries(counts).map(([name, value]) => ({
// Ensure every stage in STAGE_ORDER has a default of 0
const complete = STAGE_ORDER.map((name) => ({
name,
value,
value: counts[name] || 0,
}));
return unsorted.sort((a, b) => {
// Sort according to STAGE_ORDER (just in case)
return complete.sort((a, b) => {
const aIndex = STAGE_ORDER.indexOf(a.name);
const bIndex = STAGE_ORDER.indexOf(b.name);
return (
@ -77,6 +91,9 @@ export function DealStageChart({ deals, onOpenTable }: DealStageChartProps) {
});
}, [deals]);
// ✅ Calculate total deals
const total = useMemo(() => deals.length, [deals]);
const handleBarClick = (value: { name: string; value: number }) => {
const filtered = deals.filter((d) => {
const stageId = d.dealstage || "unknown";
@ -95,6 +112,11 @@ export function DealStageChart({ deals, onOpenTable }: DealStageChartProps) {
<p className="text-sm text-gray-500 text-center mt-1">
Click a bar to view related properties
</p>
{/* ✅ Total count */}
<p className="text-sm text-gray-700 font-medium mt-2">
Total: {total.toLocaleString()} properties
</p>
</div>
<div className="w-full">