La fenêtre à tolérance fixe (+/-20) pour distinguer Plat Chaud et
Garniture ratait des lignes selon le nombre de lignes du plat (le
débordement du texte au-dessus de son label varie d'une semaine à
l'autre). Remplacé par une affectation "rangée la plus proche" pour
chaque texte, sur le même principe déjà utilisé pour les colonnes de
jour : robuste quelle que soit la hauteur du bloc.
Corrige aussi la perte du caractère "œ" (ex: "bœuf" -> "buf") dans le
nettoyage du texte, la plage Unicode À-ÿ ne le couvrant pas.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Le parseur regex fait maison ne décodait pas les polices Type0/CID
avec table ToUnicode (courant sur les menus générés par des outils
pro), donc les mots-clés "PLAT CHAUD"/"GARNITURE" n'étaient jamais
reconnus et l'import échouait systématiquement sur ce type de PDF.
Ajoute aussi une correction de la reconnaissance de label insensible
aux accents (strtoupper ne gère pas les accents) et élargit la
tolérance verticale de la grille pour capter les plats sur plusieurs
lignes sans capter la ligne "Déclinaison" (alternative végé).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
loading="lazy" dans un conteneur parent avec overflow:hidden empêche
le browser de détecter les images comme visibles → elles ne chargent pas.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Chaque segment affiche maintenant la gare d'entrée et de sortie
- Affichage de l'opérateur (APRR, COFIROUTE, SANEF...)
- Style amélioré : distance + gares sur la même ligne
- Ajout du champ 'op' dans la réponse API
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Push sur staging-perco → deploy /opt/container/househub-perco
- Push sur staging-fefe → deploy /opt/container/househub-fefe
- Push sur main → deploy /opt/container/househub (production)
- Utiliser `git deploy <env>` pour envoyer sur le bon environnement
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remplacement du formulaire inline par un modal complet
- Color picker : 11 couleurs + option "sans couleur"
- Type de liste : Courses, To-do, Voyage, Travail, Maison, Santé, Loisirs, Autre
- Tab affiche un dot coloré + emoji du type
- Bouton "Supprimer" dans le modal d'édition (remplace le × dans le tab)
- DB : columns color + list_type sur pf_lists
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 22 catégories prédéfinies (Fruits & Légumes, Viande, Frais, etc.)
- Détection automatique par dictionnaire ~250 mots-clés français
- Apprentissage des corrections manuelles (pf_item_category_rules)
- Groupement des articles par section dans l'interface
- Badge catégorie cliquable sur chaque article avec popover de sélection
- API: GET categories, POST set_category
- schema_family.sql: category_id + pf_list_categories + pf_item_category_rules
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Chaque carte est une zone de drop: moitié haute = avant, moitié basse = après
- Indicateur visuel: bordure bleue top ou bottom selon la position du curseur
- Suppression des pk-drop-before (zones 4px invisibles remplacées)
- Colonne comme zone de secours pour listes vides
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- update_card: transmet position à Planka + retourne erreur réelle si Planka rejette
- saveCard: n'envoie listId que si changé (position requise par Planka), sinon nom/desc/dueDate seul
- Labels: affiche le nom en texte dans le badge coloré (comme Planka)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- create_card: POST /api/lists/{id}/cards + type=story (Planka v2 requis)
- create_list: type=active requis
- Drag & drop: zones pk-drop-before avant chaque carte pour tri intra-liste
- moveCard(): position calculée (avg prev/next) + gestion même liste
- Suppression variable dragCardId globale → dataTransfer propre
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Drag & drop: utilise e.dataTransfer (pas de variable globale fragile)
- dropCard prend cardId en paramètre, envoie position requis par Planka
- Nouveau bouton 'Ajouter une liste' en fin de board
- Endpoint create_list dans api.php (POST /api/boards/{id}/lists)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- dropCard envoie position (max+65535) car Planka l'exige pour changer listId
- Ajout vérification res.ok + toast d'erreur/succès
- Filtre les listes avec name='None' (placeholders Planka sans nom)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Drop target = toute la colonne .pk-cards (plus la zone invisible de 4px)
- Filtre les listes et cartes strictement par boardId pour éliminer les listes fantômes
- Indicateur visuel 'Déposer ici' sur colonnes vides
- CSS: colonne highlight en bleu pointillé au survol drag
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Nouveau module 'liste' : plusieurs listes nommées par espace famille
- Tabs de navigation entre les listes + création/renommage/suppression inline
- Migration automatique : existing pf_grocery_items → list_id=1 (Ma liste)
- Schema: nouvelle table pf_lists, ajout list_id sur pf_grocery_items
- Historique global partagé entre toutes les listes
- Ancien module 'groceries' conservé pour compatibilité ascendante
- Mise à jour settings.php, header.php, index.php, schema_family.sql
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds modules/planka/api.php (PHP proxy to Planka at 10.200.33.10:1337), planka.css, and planka.php (full SPA with board selector, drag-and-drop cards, card modal with checklist). Registers planka in header nav, all 3 lang files, schema_family.sql and enables it for family 1.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Clicking a model card now navigates to /printvault-viewer.php (no popup)
- viewer page uses HouseHub header/nav (integrated look)
- GCode metadata displayed as cards: ⏱ time, 🧵 filament, 🔥 nozzle, 🟦 bed
- Two-column layout: Three.js viewer left + metadata sidebar right
- viewer.css: new stylesheet for detail page
- Removed now-unused detail/edit modals from printvault.php
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- unpack('fff',...) in PHP returns only 1 float — must use unpack('f3',...)
to correctly extract 3 floats from binary STL vertices
- ob_end_clean() in pvOk/pvErr discards PHP warnings from output buffer
(display_errors=On was causing warnings to corrupt JSON response)
- Upload dirs chowned to www-data so Apache can write files
- QA verified: categories(8), STL parse, DB insert, file write all pass
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Match reminder_time = HH:MM exactly, runs once per minute naturally
- Log was failing silently: /var/log not writable by perco user
- Fixed crontab to log to /home/perco/househub_todo_cron.log
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- api() now sends credentials + Accept/X-Requested-With headers so session
expiry returns proper JSON 401 instead of HTML redirect
- Safer JSON parsing with readable error in console
- Remove quick-add bar (use modal only)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove date field; due_time is now required
- Cron repeats daily via notified_date (resets at midnight)
- Remove Today/Upcoming/Overdue smart views from sidebar
- Task card shows bell icon + time instead of date labels
- Creation no longer sends immediate Discord notification (cron only)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
pf_expenses.gestion_month, pf_alloc_values.month_date, pf_savings.month_date
were VARCHAR(7) but budget views query with Y-m-01 (10 chars) — converted
all imported data in househub_f2 accordingly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- cron/todo_notify.php: checks every minute for tasks due now and sends
Discord reminder (⏰) only when due_date+due_time is reached
- No immediate notification when due_time is set (cron handles it)
- Immediate notification still fires for tasks without a due_time
- notified column tracks whether reminder was already sent
- Resets notified=0 when a task is edited (new time picked)
- Cron runs via: docker exec househub php /var/www/html/cron/todo_notify.php
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 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>
- New todo.php SPA page with sidebar (smart views + user lists)
- modules/todo/api.php: REST API for lists and todos (CRUD, filters, stats)
- modules/todo/assets/todo.js: frontend (quick add, toggle done, modals)
- modules/todo/assets/todo.css: full light/dark theme styles
- pf_todo_lists + pf_todos tables added to schema_family.sql
- Integrated in header nav, home page cards, settings module list
- Translations added in fr/en/ca
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- SPA PHP/MySQL avec rendu Markdown client-side (marked.js)
- Notes par famille : titre, contenu Markdown, tags, pièces jointes
- Attachements : images, fichiers, URLs avec galerie lightbox
- Recherche full-text (LIKE) + filtrage par tag dans la sidebar
- Preview live Markdown en split-view lors de l'édition
- Drag & drop images + paste depuis presse-papier
- Tables pf_memo_notes + pf_memo_attachments dans schema_family.sql
- Migration des 2 notes existantes depuis PercoMemo
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- <body data-page="pageName"> uniforme sur toutes les pages
- <main> reçoit la classe module via $mainClass (pas le body)
- home.css : body.pf-home → body[data-page="home"]
- family-calendar.css : .pf-family-calendar .pf-main → .pf-family-calendar.pf-main
- dark-mode.css : mise à jour références body.pf-home
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- .gitea/workflows/deploy.yml : git pull via SSH au push sur main
→ plus besoin de rebuilder le container pour les modifs PHP/CSS/JS
- docker-compose.yml : monte /opt/container/househub:/var/www/html
→ les fichiers sont servis directement depuis le repo local
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Ajout !important sur tous les overrides qui en ont besoin (battaient
les règles hardcodées des modules avec !important)
- Header page d'accueil : override explicite de body.pf-home .pf-header
- Calendar : planningTable, sticky cols, fc-view-controls
- Budget : th.sticky-col, tab-item.active, sum-selected
- Holidays/gifts : tous les éléments clés
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remplace le bouton emoji par un vrai switch pill CSS (track + thumb
glissant, soleil/lune qui s'estompent). État visuel entièrement piloté
par [data-theme="dark"] via CSS, JS se contente de toggler l'attribut.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- [data-theme="dark"] sur <html> avec surcharge des variables CSS
- Couverture complète : header, nav, cartes, modals, formulaires,
tables, toasts — global + module garage
- Script early-apply dans <head> pour éviter le flash au rechargement
- Bouton toggle dans le header (desktop + mobile via le burger)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remplace les chips par une liste scrollable (max 160px) avec
nom, référence, marque et prix — identique au GarageManager original.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
setSelectVal() ajoute dynamiquement l'option si elle n'existe pas dans
le select, évitant que .value reste vide et soit envoyé null à l'API.
Validation PHP côté serveur : type et date requis sur PUT maintenance.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- set_exception_handler global : toute exception PDO retourne du JSON
au lieu d'une page HTML qui casse le JSON.parse côté client
- gOk() : JSON_INVALID_UTF8_SUBSTITUTE pour données UTF-8 corrompues,
vérification du retour de json_encode
- db.php die() : retourne JSON au lieu de texte brut
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remplace le thème sombre GarageManager par le thème clair de HouseHub
(variables --bg-panel, --border-light, --text-main, --primary, etc.)
Cohérent avec global.css et les autres modules.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Navigation vers détail entretien (page-maintenance) au clic sur une ligne
- Boutons édition sur entretiens et pièces (openEditMaintenance, openEditPart)
- Formulaire inline ajout pièce sur page entretien avec TVA +20%
- Chips "pièces connues" pour réutiliser rapidement une pièce existante
- Calcul prix TTC dans modal pièce (updatePartPriceTTC) et formulaire inline (updateIPriceTTC)
- API : GET par ID pour maintenances et pièces
- Correction champ garage : name="garage_name" cohérent POST/PUT
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- docker-compose.yml : suppression volume uploads sur MariaDB (mauvais container)
- modules/garage/api.php : conversion chaînes vides → null pour INT/DECIMAL (year, km, cost, price, quantity)
empêche le SQLSTATE[22007] lors de l'édition de véhicule/entretien/pièce
- Photos : vérification que /uploads/garage/ est accessible en écriture
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- modules/garage/api.php : API REST MySQL (vehicles, maintenances, parts, stats, photos)
- modules/garage/assets/garage.css + garage.js : UI adaptée (chemins API mis à jour)
- garage.php : page principale avec header/footer HouseHub + i18n
- docker/schema_family.sql : tables pf_vehicles, pf_maintenances, pf_parts
- docker-compose.yml : volume househub_uploads pour photos
- includes/lang/fr|ca|en.php : ~50 clés de traduction garage
- header.php : lien Garage dans nav desktop + mobile
- settings.php : module garage dans les toggles
- README.md : tableau des modules + mise à jour description
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Sélecteur FR/EN/CA déplacé du header vers settings.php
- Colonne lang ajoutée à users (meta DB) — langue sauvegardée par compte
- Login charge automatiquement la langue préférée de l'utilisateur
- Header nettoyé du sélecteur de langue
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- includes/lang/en.php : traduction complète EN (tests, nav, auth, home, calendrier, voyages, budget, cadeaux)
- includes/i18n.php : ajout 'en' dans les langues acceptées
- header.php : ajout du sélecteur EN dans la barre de langues
- README.md : documentation mise à jour
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- docker/init/00-setup.sql : meta DB househub_meta (families + users) + grants
- docker/schema_family.sql : template DB par famille (toutes les pf_* tables)
- docker-compose.yml : MYSQL_DATABASE=househub_meta, init dir monté
- includes/meta_db.php : PDO vers househub_meta
- includes/db.php : connexion dynamique vers la DB famille (session)
- login.php : auth via meta DB + family_db en session + lien inscription
- register.php : inscription + création famille OU rejoindre via code
- invite.php : voir son code d'invitation + membres de l'espace
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remplacement de toutes les occurrences PachaFamily/pachafamily/PACHAFAMILY
- Renommage pachafamily_source.md → househub_source.md
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>