From 1813603bb3bcc71b3712a873bb1116e448768824 Mon Sep 17 00:00:00 2001 From: Bastien COIGNOUX Date: Sun, 26 Apr 2026 10:57:13 +0200 Subject: [PATCH] gantt --- src/App.tsx | 1 + src/components/DashboardSettingsModal.tsx | 30 ++++++++++++++-- src/components/SprintGanttView.tsx | 28 +++++++++------ src/lib/dashboardConfig.ts | 30 ++++++++++++++++ src/lib/sprintGantt.ts | 42 ++++++++++++++++------- 5 files changed, 107 insertions(+), 24 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 65e4b37..f5d1550 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -423,6 +423,7 @@ export default function App() { groups={groups} sprintFieldId={sprintFieldResolved} ganttSprintRowMetric={dashboardCfg.ganttSprintRowMetric} + ganttNonWorkingDates={dashboardCfg.ganttNonWorkingDates} onGanttSprintRowMetricChange={setGanttSprintRowMetric} onOpenSettings={() => setSettingsOpen(true)} /> diff --git a/src/components/DashboardSettingsModal.tsx b/src/components/DashboardSettingsModal.tsx index 8162325..551daa1 100644 --- a/src/components/DashboardSettingsModal.tsx +++ b/src/components/DashboardSettingsModal.tsx @@ -5,6 +5,7 @@ import { GANTT_SPRINT_METRIC_OPTIONS, mergeImportedConfig, normalizeFunctionalGapsForSave, + parseGanttNonWorkingDatesFromText, sanitizeExcludedSprintIds, type DashboardConfig, type FunctionalGapBadge, @@ -108,11 +109,18 @@ export function DashboardSettingsModal({ open, config, onClose, onSave, boardSpr const fileRef = useRef(null) const titleId = useId() const [draft, setDraft] = useState(config) + const [ganttNonWorkInput, setGanttNonWorkInput] = useState('') useEffect(() => { if (open) setDraft(config) }, [open, config]) + const configNonWorkKey = config.ganttNonWorkingDates.join('|') + useEffect(() => { + if (!open) return + setGanttNonWorkInput(config.ganttNonWorkingDates.join('\n')) + }, [open, configNonWorkKey]) + useEffect(() => { const el = dialogRef.current if (!el) return @@ -146,8 +154,10 @@ export function DashboardSettingsModal({ open, config, onClose, onSave, boardSpr try { const parsed = JSON.parse(String(reader.result)) as unknown const merged = mergeImportedConfig(draft, parsed) - if (merged) setDraft(merged) - else alert('Fichier JSON invalide (configuration v1 ou bundle Synology v1).') + if (merged) { + setDraft(merged) + setGanttNonWorkInput(merged.ganttNonWorkingDates.join('\n')) + } else alert('Fichier JSON invalide (configuration v1 ou bundle Synology v1).') } catch { alert('Impossible de lire ce fichier JSON.') } @@ -373,6 +383,21 @@ export function DashboardSettingsModal({ open, config, onClose, onSave, boardSpr ))} + +

+ Une date par ligne au format AAAA-MM-JJ (fuseau + local du navigateur). Même style que sam. / dim. : fériés, ponts, fermeture. +

+