Fix Todo module: ID mismatches, overdue filter, Discord webhook settings
Deploy HouseHub / deploy (push) Successful in 2s
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:
co-authored by
Claude Sonnet 4.6
parent
b97cba6e75
commit
7790375c01
@@ -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'; ?>
|
||||
|
||||
Reference in New Issue
Block a user