# Changelog — FlowDeck ## v2.7.1 (2026-07-13) — Private Pages Gitea ### Added - **Table `gitea_private_pages`**: pages FlowDeck locales liées à un projet Gitea (user_id, owner, repo) - **API CRUD**: GET/POST/PUT/DELETE `/api/gitea/projects/{owner}/{repo}/private-pages` - **UI**: liste des pages privées + éditeur titre/contenu dans le workspace Gitea - **Sidebar**: lien "Private Pages" dans l'arborescence du workspace - **Persistance**: les pages survivent au changement de workspace / session ### Fixed - `get_user_repos(limit=100)` — `bruno/flowdeck` était tronqué à la page 2 (30 repos par défaut) ## v2.7.0 (2026-07-13) — Intégration Gitea Phase 1 ### Added - **OAuth2 Provider**: Gitea comme fournisseur OAuth2 pour FlowDeck (Client ID/Secret dans `.env`) - **Redirect URI dynamique**: basé sur le header `Host` — fonctionne depuis `localhost` et `192.168.x.x` - **Workspace listing**: 2 sections — My Workspaces + Gitea Projects (groupés par organisation) - **Tabs par org**: All | user | org1 | org2 avec compteurs de projets - **Barre de recherche**: filtrage live par nom/description dans Gitea Projects - **Lazy tree**: arborescence chargée un dossier à la fois (API Gitea `GET /repos/{o}/{r}/contents`) - **File viewer**: lecture fichiers Gitea avec décodage base64 - **Éditeur + commit**: modifier un fichier et commiter dans Gitea avec message personnalisé - **Delete fichier**: suppression avec confirmation + commit - **Arborescence dans le sidebar**: comme un workspace local, avec lazy-load des sous-dossiers - **Settings › Integrations**: connecter/déconnecter Gitea (`GET /api/gitea/status`, `DELETE /api/gitea/disconnect`) - **Fallback token admin**: opérations GET utilisent le token serveur si pas de token OAuth utilisateur - **Write ops protégées**: commit et delete exigent un token OAuth utilisateur - **Routes API**: `/api/gitea/orgs`, `/api/gitea/projects`, `/api/gitea/projects/{o}/{r}/tree`, `/api/gitea/projects/{o}/{r}/file`, `/api/gitea/projects/{o}/{r}/labels` ### Fixed - Bouton "Register with Gitea" ne crée plus de session admin fantôme (fallback retiré) - `_sidebar_data` gère le cookie `gitea:owner:repo` pour l'arborescence ## v2.6.0 (2026-07-13) — My Account & Auth Locale ### Added - **Section My Account**: modifier username, full name, email, mot de passe - **Toggle mot de passe**: bouton voir/cacher dans les formulaires login/register - **Label "Email or username"**: login accepte les deux formats - **Refresh cookie session**: après modification du compte, le cookie est mis à jour - **Register avec Gitea**: boutons dynamiques "Login/Register with Gitea" selon l'onglet actif ### Fixed - Session cookie non rafraîchi après `PUT /api/settings/account` (création nouvelle session) - Input login `type="email"` → `type="text"` (accepte usernames non-email) ## v2.5.0 (2026-07-13) — Administration Avancée ### Added - **Premier compte = admin automatique**: `is_admin=1` pour le premier utilisateur créé - **Panneau Admin dans Settings**: visible uniquement pour les admins - **Users & Roles**: créer/modifier/supprimer utilisateurs, changer rôles - **Table `login_history`**: audit des connexions (IP, user_agent, timestamp) - **Statistiques par utilisateur**: workspaces, pages, dernière connexion - **API `/api/admin/*`**: users, stats, audit — protégées par `admin_required` - **CSRF fix**: token CSRF dans toutes les requêtes admin (`adminFetch`) ## v2.4.0 (2026-07-13) — Tags Personnalisés par Utilisateur ### Added - **Tags isolés par `user_id`**: chaque utilisateur voit uniquement ses propres tags - **`UNIQUE(name, user_id)`**: remplace `UNIQUE(name)` dans la table `tags` - **Migration**: tags existants assignés au premier utilisateur - **Filtrage transparent**: l'API retourne les tags filtrés par `user_id` (session cookie) ### Fixed - Affichage des tags dans le menu contextuel workspace (sync Alpine.js) - Création de tag avec couleur persistée - Fermeture auto du menu contextuel après ajout de tag - Filtrage par tags: `toggleTagFilter()` appelle `doFilter()` - Pastilles tags: fond = couleur du tag, sans rond séparé ## v2.3.0 (2026-07-12) — Multi-Vues Workspace & Preview Panel ### Added - **Sélecteur de vue**: Tree, List, Details, Title, Content — 5 modes d'affichage - **Vue List**: liste compacte avec Name, Type, Size, Modified - **Vue Details**: table complète avec Path, Author, Tags - **Vue Title**: grille de cartes avec icônes et métadonnées - **Vue Content**: liste avec aperçu inline (taille ou nombre d'items) - **Preview Panel**: panneau latéral droit avec contenu du fichier sélectionné - Header avec icône + titre + bouton fermer - Métadonnées (type, taille, date) - Tags affichés en chips - Corps avec rendu du contenu (blocks JSON → HTML, texte brut) - Actions: Open, Rename, Delete - Animation slide-in/out - **Tri par date**: options Oldest/Newest dans le selecteur de tri ## v2.2.0 (2026-07-12) — Tags & Recherche Avancée ### Added - **Tags**: système complet de tags avec tables `tags` + `page_tags`, CRUD API - **API Tags**: `GET/POST/DELETE /api/local-workspace/items/{id}/tags`, `GET /api/local-workspace/tags` - **Vue Table enrichie**: colonnes Name, Path, Size, Modified, Type, Author, Tags - **Filtrage par tags**: barre de chips avec compteurs, clic pour filtrer - **Ajout/retrait tags inline**: bouton + dans la table, chips avec × pour retirer - **Tree endpoint enrichi**: chaque nœud retourne `size`, `size_display`, `created_at`, `updated_at`, `author`, `tags` - **Filtre "Dossiers"**: nouveau chip Folders dans la barre de filtres - **Auto-switch table**: quand recherche/filtre actif, passe en vue table automatiquement ## v2.1.1 (2026-07-12) — Fix Arborescence Workspace ### Fixed - **Arborescence**: création fichier/dossier dans un sous-dossier met à jour l'arbre sans rechargement - **parentFolder**: corrigé le bug où `parentFolder` était nullifié avant l'insertion dans l'arbre JS - **displayTree**: nouvelle référence array après chaque mutation pour forcer le re-render Alpine.js - **doSort/doFilter**: gèrent maintenant le cas où un filtre/tri est actif après création ## v2.1.0 (2026-07-10) — Intégrations Avancées ### Added - **API publique**: `/api/v1` (collections, pages, my-tasks) avec token auth - **Token generation**: `POST /api/v1/token` - **Webhooks sortants**: `GET/POST/DELETE /workspace/webhooks` + dispatcher - **PWA**: `GET /manifest.json` - **CSRF**: `/api/v1` exempté ### Tests - 73/73 passent (+6 tests v2.1) ## v2.0.0 (2026-07-10) — Multi-User Workspaces & Editor Complete ### Added - **Workspaces**: tables `workspaces` + `workspace_members`, CRUD API, roles admin/editor/commenter/viewer - **Comments**: table `comments` avec thread (parent_id), resolved - **Page History**: table `page_history`, snapshot JSON - **Favorites**: table `favorites`, add/remove/list - **Templates**: `database_templates` + `page_templates`, apply API - **CSV Import/Export**: `POST .../import/csv`, `GET .../export/csv` - **Public Sharing**: `GET /workspace/public/{id}` (read-only, no auth) ### Tests - 67/67 passent (+7 tests v2.0) ## v1.9.0 (2026-07-10) — My Tasks Dashboard ### Added - **My Tasks**: `GET /my-tasks` (HTML), `GET /my-tasks/api` (JSON) - Agrégation cross-collection, vues All/Today/Overdue/Next 7 days ## v1.8.0 (2026-07-10) — Sub-items & Dependencies ### Added - **Sub-items**: parent_id auto-référence, GET/POST sub-items - **Status aggregate**: `GET .../status-aggregate` - **Dependencies**: `POST .../dependencies`, `POST .../check-deps` ## v1.7.0 (2026-07-10) — Vues Améliorées ### Added - **View config**: `PUT /db/views/{id}/config` (group_by, card_size, cover, visible) - **Save view as**: `POST /db/{id}/views/save-as` - **List views**: `GET /db/{id}/views/api` ## v1.6.0 (2026-07-10) — Vues Manquantes ### Added - **Calendar**: grid mensuel, navigation mois - **Gallery**: cartes visuelles, card_size configurable - **List**: vue compacte avec preview - **Timeline**: barres horizontales Gantt - **Table**: rendu SSR avec colonnes properties - **View tabs**: navigation Table/Board/Calendar/Gallery/List/Timeline ## v1.5.0 (2026-07-10) — Relations & Rollups ### Added - **FormulaEngine**: 19 fonctions (prop, if, concat, round, now, today, dateAdd, replace, ...) - **RollupEngine**: 12 agrégations (count, sum, avg, min, max, range, unique, percent_checked) - **Relation**: lien bidirectionnel, API create/link ## v1.4.0 (2026-07-10) — Propriétés Avancées ### Added - **Table `collection_properties`**: 21 types Notion - **Service `property_types.py`**: validation, formatage, auto-values ## v1.3.0 (2026-07-10) — Database Concept ### Added - **Tables**: `collections`, `collection_pages`, `collection_views` - **Router `/db`**: CRUD collections + pages (16 endpoints) - **GiteaBoardCompat**: adaptateur boards legacy → Collections ## v1.0.0 (2026-07-08) — Production ### Added - FastAPI lifespan, 28 tests, CI/CD Gitea Actions, CSS 31KB, 10 templates - 5 vues: Kanban, Table, Status Overview, Team Load, Detailed Board - Filtres cumulables AND, tri multi-critères - Card detail modal, checklists, commentaires Gitea - Propriétés custom, AI keywords, sync API