From 17b9a5e5b4f573665d294d022c0f2a86d0be69f7 Mon Sep 17 00:00:00 2001 From: Manuel Bustillo Date: Mon, 8 Sep 2025 22:47:16 +0200 Subject: [PATCH] Display simulation progress --- app/[slug]/dashboard/tables/page.tsx | 2 +- app/api/tableSimulations.tsx | 2 ++ app/lib/definitions.ts | 2 ++ app/lib/tableSimulation.tsx | 6 ++-- app/ui/arrangements/arrangements-table.tsx | 33 ++++++++++++++-------- 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/app/[slug]/dashboard/tables/page.tsx b/app/[slug]/dashboard/tables/page.tsx index 8fd4a81..42dffd9 100644 --- a/app/[slug]/dashboard/tables/page.tsx +++ b/app/[slug]/dashboard/tables/page.tsx @@ -8,7 +8,7 @@ import Arrangement from '@/app/ui/arrangements/arrangement'; import ArrangementsTable from '@/app/ui/arrangements/arrangements-table'; import { classNames } from '@/app/ui/components/button'; import { Toast } from 'primereact/toast'; -import React, { useRef, useState } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; export default function Page() { const toast = useRef(null); diff --git a/app/api/tableSimulations.tsx b/app/api/tableSimulations.tsx index 5b0f538..f8048a2 100644 --- a/app/api/tableSimulations.tsx +++ b/app/api/tableSimulations.tsx @@ -13,6 +13,8 @@ export function loadTableSimulations(onLoad?: (tableSimulations: TableArrangemen name: record.name, discomfort: record.discomfort, valid: record.valid, + progress: record.progress, + status : record.status }); })); }, (error) => { diff --git a/app/lib/definitions.ts b/app/lib/definitions.ts index 5e6ffe8..a9d81a9 100644 --- a/app/lib/definitions.ts +++ b/app/lib/definitions.ts @@ -14,6 +14,8 @@ export type TableArrangement = { guests?: Guest[]; discomfort?: number; valid?: boolean; + progress: number; + status: 'in_progress' | 'completed' | 'not_started'; } export type User = { diff --git a/app/lib/tableSimulation.tsx b/app/lib/tableSimulation.tsx index 493dbf1..06c18db 100644 --- a/app/lib/tableSimulation.tsx +++ b/app/lib/tableSimulation.tsx @@ -22,10 +22,12 @@ export type Table = { export class TableSimulation implements Entity { id?: string; tables: Table[]; + progress: number; - constructor(id?: string, tables?: Table[]) { + constructor(id?: string, tables?: Table[], progress?: number) { this.id = id; this.tables = tables || []; + this.progress = progress || 0; } } @@ -43,7 +45,7 @@ export class TableSimulationSerializer implements Serializable } }, } - })); + }), data.progress); } toJson(simulation: TableSimulation): string { diff --git a/app/ui/arrangements/arrangements-table.tsx b/app/ui/arrangements/arrangements-table.tsx index 07a3eff..db65d1e 100644 --- a/app/ui/arrangements/arrangements-table.tsx +++ b/app/ui/arrangements/arrangements-table.tsx @@ -10,11 +10,21 @@ import { loadTableSimulations } from "@/app/api/tableSimulations"; import { ArchiveBoxXMarkIcon, CheckBadgeIcon } from "@heroicons/react/24/outline"; import { Tooltip } from "primereact/tooltip"; import clsx from "clsx"; +import { ProgressBar } from "primereact/progressbar"; +import { useEffect } from "react"; +import { TableSimulation, TableSimulationSerializer } from "@/app/lib/tableSimulation"; +import { AbstractApi } from "@/app/api/abstract-api"; export default function ArrangementsTable({ onArrangementSelected }: { onArrangementSelected: (arrangementId: string) => void }) { const [arrangements, setArrangements] = useState>([]); const [arrangementsLoaded, setArrangementsLoaded] = useState(false); + useEffect(() => { + refreshSimulations(); + const interval = setInterval(refreshSimulations, 10000); + return () => clearInterval(interval); + }, []); + function refreshSimulations() { loadTableSimulations((arrangements) => { setArrangements(arrangements); @@ -26,11 +36,9 @@ export default function ArrangementsTable({ onArrangementSelected }: { onArrange onArrangementSelected(e.currentTarget.getAttribute('data-arrangement-id') || ''); } - !arrangementsLoaded && refreshSimulations(); - return ( ( @@ -44,17 +52,18 @@ export default function ArrangementsTable({ onArrangementSelected }: { onArrange {arrangement.discomfort} - - - - + - { - arrangement.valid ? - : - - } + <> + { arrangement.valid && arrangement.status === 'not_started' && } + { arrangement.valid && arrangement.status !== 'not_started' && } + + { !arrangement.valid && 'The list of potential guests has changed since this simulation.' } + + + + )}