gantt
This commit is contained in:
@ -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()
|
||||
}}
|
||||
|
||||
Reference in New Issue
Block a user