---
name: project_reservation_groups
description: Notion de groupe sur les réservations, 2 modes d'affichage dans subnet.php, filtre, sidebar scrollable — ajoutés le 10 juillet 2026
metadata:
  type: project
---

Ajout d'une notion de **groupe** sur les réservations et de plusieurs améliorations d'interface (branche `feature/ui-subnets-groupes-filtres`, 10 juillet 2026, migration v0.13).

- **Stockage groupe** : colonne `group_name VARCHAR(64) NULL` dans `app_reservation_meta` (table `app_` — JAMAIS dans les tables natives Kea, cf. [[feedback_kea_cancelled]]). Migration `sql/add_reservation_group.sql`. Vide → `NULL`.
- **Modèle** : `Reservation::getBySubnet()`/`getById()` renvoient `group_name` ; `add()`/`update()` acceptent `$data['group_name']` ; nouvelle méthode `Reservation::getGroups(int $keaSubnetId)` (liste distincte pour l'autocomplétion).
- **Formulaires** (`reservation_add.php`/`edit.php`) : champ texte « Groupe » + `<datalist>` (autocomplétion native, offline). `reservation_add.php` accepte le GET `group=`.
- **Vue subnet** (`subnet.php`) : convertie en **rendu JS** (données injectées via `json_encode` avec flags `JSON_HEX_*`, rendu via `textContent` — pas de XSS). Deux modes : **Groupés** (défaut, bandeaux repliables, tri IP dans chaque groupe, « (sans groupe) » en dernier) et **Plat** (liste unique triée IP + colonne Groupe). Bascule mémorisée en `localStorage` (`dhcpman.subnet.viewmode`). Filtre multi-champs instantané : hostname/IP/MAC (avec ou sans `:` via `mac_hex`)/description/groupe, hors date ; insensible casse+accents (`normalize('NFD')` + retrait plage U+0300–U+036F).
- **Sidebar** (`layout_header.php` + `app.css`) : Navigation et Administration figées ; seule la liste des subnets scrolle (flexbox `min-height:0` + `overflow-y:auto`), sous un champ de filtre rapide (JS, sur le nom du subnet).
- **CSV** : colonne `group` à l'import et l'export, même pattern que [[project_csv_no_gateway]] (`subnet_export.php`, `subnet_import.php` parseCsv/analyzeRows/étape 2).

Spec : `docs/superpowers/specs/2026-07-10-ui-subnets-groupes-filtres-design.md`. Plan : `docs/superpowers/plans/2026-07-10-ui-subnets-groupes-filtres.md`.
