feat(todos): case à cocher «Pas de date» dans le formulaire todo

Cochée par défaut à la création (aucune date soumise).
Décochée si la tâche éditée a déjà une date (champ date pré-rempli).
Décocher affiche le sélecteur de date ; cocher le masque et efface la date.

v0.4.14

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-25 13:22:07 +02:00
parent fa1a642240
commit 1210d4f9f3
2 changed files with 23 additions and 9 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "homehub-frontend",
"private": true,
"version": "0.4.13",
"version": "0.4.14",
"type": "module",
"scripts": {
"dev": "vite",
+22 -8
View File
@@ -57,6 +57,7 @@ export default function TodoForm({ onSubmit, onCancel, initialValues, submitLabe
const [title, setTitle] = useState(initialValues?.title ?? '')
const [selectedDomains, setSelectedDomains] = useState<string[]>(initialValues?.domains ?? [])
const [priority, setPriority] = useState<'low' | 'medium' | 'high'>(initialValues?.priority ?? 'medium')
const [noDate, setNoDate] = useState(!initialValues?.due_date)
const [dueDate, setDueDate] = useState(
initialValues?.due_date ? initialValues.due_date.slice(0, 10) : today
)
@@ -114,7 +115,7 @@ export default function TodoForm({ onSubmit, onCancel, initialValues, submitLabe
title: title.trim(),
domains: selectedDomains,
priority,
due_date: dueDate ? new Date(dueDate).toISOString() : undefined,
due_date: noDate ? undefined : (dueDate ? new Date(dueDate).toISOString() : undefined),
body: body.trim() || undefined,
url: url.trim() || undefined,
tags: tags ? tags.split(',').map(t => t.trim()).filter(Boolean) : [],
@@ -201,13 +202,26 @@ export default function TodoForm({ onSubmit, onCancel, initialValues, submitLabe
{/* Date objectif */}
<div>
<div style={labelStyle}>Date objectif</div>
<input
style={inputStyle}
type="date"
value={dueDate}
onChange={e => setDueDate(e.target.value)}
/>
<div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 6 }}>
<label style={{ display: 'flex', alignItems: 'center', gap: 6, cursor: 'pointer', userSelect: 'none' }}>
<input
type="checkbox"
checked={noDate}
onChange={e => setNoDate(e.target.checked)}
style={{ width: 16, height: 16, accentColor: 'var(--accent)', cursor: 'pointer' }}
/>
<span style={{ ...labelStyle, marginBottom: 0 }}>Pas de date</span>
</label>
{!noDate && <span style={labelStyle}>Date objectif</span>}
</div>
{!noDate && (
<input
style={inputStyle}
type="date"
value={dueDate}
onChange={e => setDueDate(e.target.value)}
/>
)}
</div>
{/* Description */}