Fix Todo module: ID mismatches, overdue filter, Discord webhook settings
Deploy HouseHub / deploy (push) Successful in 2s

- Rewrite todo.php with correct element IDs matching todo.js
- Fix sidebar: fully dynamic rendering (no more static nav items)
- Fix quick-add: list selector added, Enter key works correctly
- Fix modals: todo-form-*, list-form-name, list-icon-opts IDs
- Fix overdue filter missing from API (list_id=overdue)
- Add settings modal (⚙️) with Discord webhook URL field
- Add settings action in API (GET/PUT via pf_notes table)
- Discord webhook: notify on task create and task done

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
perco
2026-05-12 14:46:32 +02:00
co-authored by Claude Sonnet 4.6
parent b97cba6e75
commit 7790375c01
3 changed files with 187 additions and 124 deletions
+45 -56
View File
@@ -14,40 +14,12 @@ require __DIR__ . '/header.php';
<div class="todo-layout">
<!-- ── SIDEBAR ────────────────────────────────────────────────────────────── -->
<aside class="todo-sidebar" id="todo-sidebar">
<aside class="todo-sidebar">
<div class="todo-sidebar-top">
<button class="btn btn-primary" onclick="openAddTodo()" style="width:100%;justify-content:center">+ Nouvelle tâche</button>
</div>
<!-- Smart views -->
<div class="todo-nav-section">Vues</div>
<a class="todo-nav-item active" data-filter="all" onclick="setFilter('all')">
<span>📋</span> Toutes
<span class="todo-nav-badge" id="badge-all">0</span>
</a>
<a class="todo-nav-item" data-filter="today" onclick="setFilter('today')">
<span>☀️</span> Aujourd'hui
<span class="todo-nav-badge urgent" id="badge-today">0</span>
</a>
<a class="todo-nav-item" data-filter="upcoming" onclick="setFilter('upcoming')">
<span>📅</span> À venir
<span class="todo-nav-badge" id="badge-upcoming">0</span>
</a>
<a class="todo-nav-item" data-filter="overdue" onclick="setFilter('overdue')">
<span>⚠️</span> En retard
<span class="todo-nav-badge urgent" id="badge-overdue">0</span>
</a>
<a class="todo-nav-item" data-filter="done" onclick="setFilter('done')">
<span>✅</span> Terminées
<span class="todo-nav-badge" id="badge-done">0</span>
</a>
<!-- User lists -->
<div class="todo-nav-section" style="display:flex;align-items:center;justify-content:space-between;padding-right:.75rem">
Listes
<button class="btn btn-ghost btn-icon btn-sm" onclick="openListModal()" title="Nouvelle liste" style="padding:.1rem .3rem;font-size:.85rem">+</button>
</div>
<div id="todo-lists-nav"></div>
<!-- Contenu rendu dynamiquement par JS (vues + listes) -->
<div id="todo-sidebar-lists"></div>
</aside>
<!-- ── MAIN ───────────────────────────────────────────────────────────────── -->
@@ -56,25 +28,23 @@ require __DIR__ . '/header.php';
<!-- Header -->
<div class="todo-main-header">
<div>
<h2 id="todo-view-title">Toutes les tâches</h2>
<h2 id="todo-header-title">Toutes les tâches</h2>
<div class="todo-subtitle" id="todo-view-subtitle"></div>
</div>
<div class="todo-header-actions">
<button class="show-done-btn" id="show-done-btn" onclick="toggleShowDone()">
<span id="show-done-icon">👁</span> <span id="show-done-label">Afficher terminées</span>
👁 Afficher terminées
</button>
<button class="btn btn-ghost btn-icon" onclick="openSettings()" title="Paramètres Todo">⚙️</button>
<button class="btn btn-primary btn-sm" onclick="openAddTodo()">+ Tâche</button>
</div>
</div>
<!-- Stats bar -->
<div class="todo-stats" id="todo-stats-bar"></div>
<!-- Quick add -->
<div class="todo-quick-add">
<span style="color:var(--text-muted)">+</span>
<input type="text" id="quick-add-input" placeholder="Ajouter une tâche rapide… (Entrée pour valider)">
<button class="btn btn-ghost btn-sm" id="quick-add-list-btn" onclick="openAddTodo(document.getElementById('quick-add-input').value)">Options</button>
<select id="quick-add-list" class="form-control" style="width:auto;font-size:.8rem;padding:.25rem .5rem;border:none;background:transparent;color:var(--text-muted)"></select>
</div>
<!-- Todo list -->
@@ -88,29 +58,28 @@ require __DIR__ . '/header.php';
<div class="todo-modal">
<div class="todo-modal-header">
<h3 id="todo-modal-title">Nouvelle tâche</h3>
<button class="todo-modal-close" onclick="closeTodoModal()">×</button>
<button class="todo-modal-close" onclick="closeModal('todo-modal')">×</button>
</div>
<div class="todo-modal-body">
<input type="hidden" id="todo-id">
<div class="form-group">
<label class="form-label">Titre *</label>
<input type="text" id="todo-title" class="form-control" placeholder="Ex : Appeler le plombier" autofocus>
<input type="text" id="todo-form-title" class="form-control" placeholder="Ex : Appeler le plombier">
</div>
<div class="form-group">
<label class="form-label">Notes</label>
<textarea id="todo-notes" class="form-control" placeholder="Détails, liens, infos…"></textarea>
<textarea id="todo-form-notes" class="form-control" placeholder="Détails, liens, infos…"></textarea>
</div>
<div class="form-row">
<div class="form-group">
<label class="form-label">Date limite</label>
<input type="date" id="todo-due" class="form-control">
<input type="date" id="todo-form-due" class="form-control">
</div>
<div class="form-group">
<label class="form-label">Liste</label>
<select id="todo-list-select" class="form-control">
<select id="todo-form-list" class="form-control">
<option value="">— Aucune —</option>
</select>
</div>
@@ -119,17 +88,16 @@ require __DIR__ . '/header.php';
<div class="form-group">
<label class="form-label">Priorité</label>
<div class="priority-opts">
<div class="priority-opt sel-none" data-p="none" onclick="selectPriority('none')">— Aucune</div>
<div class="priority-opt" data-p="low" onclick="selectPriority('low')">🟢 Basse</div>
<div class="priority-opt" data-p="medium" onclick="selectPriority('medium')">🟡 Moyenne</div>
<div class="priority-opt" data-p="high" onclick="selectPriority('high')">🔴 Haute</div>
<div class="priority-opt sel-none" data-p="none" onclick="setPriority('none')">— Aucune</div>
<div class="priority-opt" data-p="low" onclick="setPriority('low')">🟢 Basse</div>
<div class="priority-opt" data-p="medium" onclick="setPriority('medium')">🟡 Moyenne</div>
<div class="priority-opt" data-p="high" onclick="setPriority('high')">🔴 Haute</div>
</div>
<input type="hidden" id="todo-priority" value="none">
</div>
</div>
<div class="todo-modal-footer">
<button class="btn btn-danger btn-sm" id="todo-delete-btn" onclick="deleteTodo()" style="display:none;margin-right:auto">Supprimer</button>
<button class="btn btn-secondary" onclick="closeTodoModal()">Annuler</button>
<button class="btn btn-danger btn-sm" id="todo-delete-btn" onclick="deleteTodoFromModal()" style="display:none;margin-right:auto">Supprimer</button>
<button class="btn btn-secondary" onclick="closeModal('todo-modal')">Annuler</button>
<button class="btn btn-primary" onclick="saveTodo()">Enregistrer</button>
</div>
</div>
@@ -140,34 +108,55 @@ require __DIR__ . '/header.php';
<div class="todo-modal">
<div class="todo-modal-header">
<h3 id="list-modal-title">Nouvelle liste</h3>
<button class="todo-modal-close" onclick="closeListModal()">×</button>
<button class="todo-modal-close" onclick="closeModal('list-modal')">×</button>
</div>
<div class="todo-modal-body">
<input type="hidden" id="list-id">
<div class="form-group">
<label class="form-label">Nom *</label>
<input type="text" id="list-name" class="form-control" placeholder="Ex : Maison, Travail…">
<input type="text" id="list-form-name" class="form-control" placeholder="Ex : Maison, Travail…">
</div>
<div class="form-group">
<label class="form-label">Icône</label>
<input type="text" id="list-icon" class="form-control" placeholder="📋" maxlength="4" style="font-size:1.2rem;width:80px">
<div id="list-icon-opts" style="display:flex;flex-wrap:wrap;gap:.35rem"></div>
</div>
<div class="form-group">
<label class="form-label">Couleur</label>
<div class="color-swatches" id="list-color-swatches"></div>
<input type="hidden" id="list-color" value="#3b82f6">
</div>
</div>
<div class="todo-modal-footer">
<button class="btn btn-danger btn-sm" id="list-delete-btn" onclick="deleteList()" style="display:none;margin-right:auto">Supprimer</button>
<button class="btn btn-secondary" onclick="closeListModal()">Annuler</button>
<button class="btn btn-secondary" onclick="closeModal('list-modal')">Annuler</button>
<button class="btn btn-primary" onclick="saveList()">Enregistrer</button>
</div>
</div>
</div>
<!-- ── MODAL : PARAMÈTRES ─────────────────────────────────────────────────────── -->
<div class="todo-modal-backdrop" id="settings-modal">
<div class="todo-modal">
<div class="todo-modal-header">
<h3>⚙️ Paramètres Todo</h3>
<button class="todo-modal-close" onclick="closeModal('settings-modal')">×</button>
</div>
<div class="todo-modal-body">
<div class="form-group">
<label class="form-label">Webhook Discord</label>
<input type="url" id="settings-webhook" class="form-control" placeholder="https://discord.com/api/webhooks/…">
<div style="font-size:.75rem;color:var(--text-muted);margin-top:.25rem">
Recevoir une notification Discord quand une tâche est créée ou terminée.
</div>
</div>
</div>
<div class="todo-modal-footer">
<button class="btn btn-secondary" onclick="closeModal('settings-modal')">Annuler</button>
<button class="btn btn-primary" onclick="saveSettings()">Enregistrer</button>
</div>
</div>
</div>
<script src="/modules/todo/assets/todo.js"></script>
<?php require __DIR__ . '/footer.php'; ?>