This commit is contained in:
Bastien COIGNOUX
2026-04-26 10:57:13 +02:00
parent f32e74c713
commit 1813603bb3
5 changed files with 107 additions and 24 deletions

View File

@ -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<HTMLInputElement>(null)
const titleId = useId()
const [draft, setDraft] = useState<DashboardConfig>(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
</option>
))}
</select>
<label className="mt-3 block text-[10px] font-semibold uppercase tracking-wide text-indigo-200/80">
Jours non travaillés (Gantt)
</label>
<p className="mt-1 text-[10px] leading-relaxed text-slate-500">
Une date par ligne au format <span className="font-mono text-slate-400">AAAA-MM-JJ</span> (fuseau
local du navigateur). Même style que sam. / dim. : fériés, ponts, fermeture.
</p>
<textarea
rows={4}
spellCheck={false}
placeholder={'2026-05-01\n2026-05-08'}
className="mt-1.5 w-full resize-y rounded-lg border border-white/10 bg-black/30 px-2 py-1.5 font-mono text-[11px] leading-relaxed text-slate-200 outline-none ring-indigo-500/20 focus:ring-1"
value={ganttNonWorkInput}
onChange={(e) => setGanttNonWorkInput(e.target.value)}
/>
<p className="mt-3 text-[10px] font-semibold uppercase tracking-wide text-indigo-200/80">
Sprints à masquer
</p>
@ -649,6 +674,7 @@ export function DashboardSettingsModal({ open, config, onClose, onSave, boardSpr
...draft,
functionalGaps: normalizeFunctionalGapsForSave(draft.functionalGaps),
excludedSprintIds: sanitizeExcludedSprintIds(draft.excludedSprintIds),
ganttNonWorkingDates: parseGanttNonWorkingDatesFromText(ganttNonWorkInput),
})
onClose()
}}