diff --git a/CHANGELOG.md b/CHANGELOG.md index ae3ca81..002d42e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,82 @@ # 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 +- **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 @@ -21,12 +94,12 @@ ### 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`, `GET /api/local-workspace/tags/search?tags=...` +- **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 +- **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 @@ -36,7 +109,6 @@ - **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 -- **_doUpload**: corrigé `this._reloadAfterAction` → `self._reloadAfterAction` ## v2.1.0 (2026-07-10) — Intégrations Avancées diff --git a/ROADMAP.md b/ROADMAP.md index 3f1a56e..b599072 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -55,253 +55,131 @@ Propriétés custom, AI keywords, sync API, 12 tables DB - [x] Breadcrumbs contextuels (workspace > projet > page) ### v1.3.0 ✅ — Database Concept (Bloc 1 du gap analysis) -### (2026-07-10, commit c574d2c, tag v1.3.0) - -- [x] **Table `collections`** — base de données abstraite, indépendante de Gitea - - `id`, `name`, `description`, `icon`, `schema_json` - - Optionnellement liée à Gitea (`gitea_owner`, `gitea_repo`) -- [x] **Table `collection_pages`** — remplace `cards`, pages génériques - - `collection_id`, `title`, `position`, `parent_id`, `property_values_json` - - `gitea_issue_id` optionnel, auto-propriétés (`created_at`, `updated_at`) -- [x] **Table `collection_views`** — vues configurables par collection - - `name`, `view_type`, `config_json`, `position` -- [x] **Rétrocompatibilité Gitea** — adaptateur `GiteaBoardCompat` - - Les boards Gitea existants deviennent des collections - - Migration transparente `cards` → `collection_pages` - - Routes `/db/boards/api`, `/db/board/{o}/{r}/api`, `/db/board/{o}/{r}/sync` -- [x] **Router `/db`** — API CRUD collections + pages (12 endpoints) -- [x] **34/34 tests** passent (+6 nouveaux tests v1.3) -- [x] **Database lock** — mode lecture seule (`collections.is_locked`) -- [x] **Database description** — champ `description` sur les collections - ---- +- [x] Tables `collections`, `collection_pages`, `collection_views` +- [x] Rétrocompatibilité Gitea via `GiteaBoardCompat` +- [x] Router `/db` — API CRUD collections + pages (12 endpoints) +- [x] 34/34 tests passent ### v1.4.0 ✅ — Propriétés Avancées (Bloc 2) -### (2026-07-10) +- [x] Table `collection_properties` — 21 types Notion +- [x] Service `property_types.py` — validation, formatage, auto-values +- [x] 38/38 tests passent -- [x] **Table `collection_properties`** — remplace `project_properties` - - Liée à `collections` (pas à `project_owner/name`) - - Supporte tous les types Notion (21 types) -- [x] **Type `number`** — avec formatage (nombre, %, €, $, £, ¥) -- [x] **Type `checkbox`** — booléen natif -- [x] **Type `url`** — lien cliquable -- [x] **Type `email`** — email cliquable -- [x] **Type `phone`** — téléphone cliquable -- [x] **Type `status`** — select avec couleurs forcées (9 couleurs Notion) -- [x] **Type `files`** — uploads/images attachés aux pages -- [x] **Type `unique_id`** — ID auto-incrémenté par collection -- [x] **Type `created_time` / `created_by`** — auto-propriétés -- [x] **Type `last_edited_time` / `last_edited_by`** — auto-propriétés -- [x] **Service `property_types.py`** — validation, formatage, auto-values -- [x] **API CRUD** — `/db/property-types/api` + CRUD `/db/{id}/properties/api` -- [x] **38/38 tests** passent (+4 nouveaux tests v1.4) -- [ ] **Migration** `project_properties` → `collection_properties` (v1.5) - -### v1.5.0 ✅ — Relations & Rollups (Bloc 2 suite) -### (2026-07-10) - -- [x] **Type `relation`** — lien bidirectionnel entre collections - - `related_collection_id`, `reverse_name` auto-généré - - Stockage : JSON array de page IDs dans `property_values_json` - - API: `POST /db/{id}/properties/relation` (création avec reverse) - - API: `POST /db/{id}/properties/relation/link` (lier 2 pages) -- [x] **Type `rollup`** — agrégation via relation - - Functions : COUNT, SUM, AVG, MIN, MAX, RANGE, UNIQUE, PERCENT_CHECKED - - API: `POST /db/rollup/compute` -- [x] **Type `formula`** — propriétés calculées - - Moteur d'expressions JavaScript-like (19 fonctions) - - API: `POST /db/formula/evaluate` -- [x] **Formula engine** — `services/formula_engine.py` -- [x] **Rollup engine** — `services/rollup_engine.py` -- [x] **43/43 tests** passent (+5 nouveaux tests v1.5) -- [x] **FKs fix**: `related_collection_id`, `relation_property_id`, `target_property_id` → `ON DELETE SET NULL` +### v1.5.0 ✅ — Relations & Rollups +- [x] Type `relation` — lien bidirectionnel entre collections +- [x] Type `rollup` — aggregation via relation (COUNT, SUM, AVG, etc.) +- [x] Type `formula` — moteur d'expressions (19 fonctions) +- [x] Formula engine + Rollup engine +- [x] 43/43 tests passent ### v1.6.0 ✅ — Vues Manquantes (Bloc 3) -### (2026-07-10) - -- [x] **Calendar view** — grid mensuel, navigation mois, événements par date - - Route: `GET /db/{id}/view/calendar` -- [x] **Gallery view** — cartes visuelles avec cover image optionnelle - - `card_size`: small/medium/large, `cover_property` configurable -- [x] **List view** — liste compacte avec preview propriétés -- [x] **Timeline/Gantt view** — barres horizontales sur axe date -- [x] **Table view** — rendu SSR, colonnes properties -- [x] **View tabs** — navigation entre vues (Table/Board/Calendar/Gallery/List/Timeline) -- [x] **49/49 tests** passent (+6 nouveaux tests v1.6) +- [x] Calendar, Gallery, List, Timeline, Table views +- [x] View tabs navigation +- [x] 49/49 tests passent ### v1.7.0 ✅ — Vues Améliorées ### v1.8.0 ✅ — Sub-items & Dépendances -### (2026-07-10, combined) - -- [x] **View config API** — PUT /db/views/{id}/config (group_by, card_size, cover, visible) -- [x] **Save view as** — POST /db/{id}/views/save-as -- [x] **List views** — GET /db/{id}/views/api -- [x] **Sub-items** — parent_id auto-référence, GET/POST sub-items -- [x] **Status aggregate** — GET status-aggregate (Done only if all children Done) -- [x] **Dependencies** — POST dependencies + POST check-deps (blocking constraint) -- [x] **56/56 tests** passent (+7 tests v1.7+v1.8) +- [x] View config API, Save view as +- [x] Sub-items (parent_id auto-référence) +- [x] Status aggregate, Dependencies (blocking constraint) +- [x] 56/56 tests passent ### v1.9.0 ✅ — My Tasks & Dashboard Unifié (Bloc 5) -### (2026-07-10) - -- [x] **Vue `/my-tasks`** — agrège toutes les pages assignées à l'utilisateur - - Scan cross-collection (toutes les databases du workspace) - - Filtre automatique : admin voit tout -- [x] **Groupement par collection** — sections par database d'origine -- [x] **Filtres globaux** — All, Today, Overdue, Next 7 days -- [x] **API JSON** — `GET /my-tasks/api` -- [x] **60/60 tests** passent (+4 tests v1.9) +- [x] Vue `/my-tasks` — agrège pages assignées à l'utilisateur +- [x] Groupement par collection, filtres globaux +- [x] 60/60 tests passent ### v2.0.0 ✅ — Éditeur Complet & Multi-Utilisateurs (Blocs 6-7) -### (2026-07-10) - -- [x] **Workspaces** — `workspaces` + `workspace_members` tables, CRUD API, roles admin/editor/commenter/viewer -- [x] **Comments** — table `comments` avec thread (parent_id), resolved, API CRUD -- [x] **Page History** — table `page_history`, snapshot JSON, API record/list -- [x] **Favorites** — table `favorites`, API add/remove/list -- [x] **Database Templates** — table `database_templates`, apply to create collection -- [x] **Page Templates** — table `page_templates`, apply with pre-filled properties -- [x] **CSV Import/Export** — `POST .../import/csv`, `GET .../export/csv` -- [x] **Public Sharing** — `GET /workspace/public/{id}` (read-only, no auth) -- [x] **67/67 tests** passent (+7 tests v2.0) +- [x] Workspaces, Comments, Page History, Favorites +- [x] Database Templates, Page Templates, CSV Import/Export +- [x] Public Sharing +- [x] 67/67 tests passent ### v2.1.0 ✅ — Workspace Local & Arborescence -### (2026-07-11) +- [x] Page `/local-workspace` — file/folder tree avec breadcrumb +- [x] CRUD items, drag & drop upload/interne +- [x] File viewer (images, PDF, code), preview hover +- [x] Menu contextuel (clic droit / long-press mobile) +- [x] Recherche + filtre par type, Expand/Collapse all +- [x] 73 tests passent -- [x] **Page `/local-workspace`** — file/folder tree avec breadcrumb -- [x] **API tree récursive** — `GET /api/local-workspace/tree?folder=ID` -- [x] **Breadcrumb** — `GET /api/local-workspace/breadcrumb` -- [x] **CRUD items** — create/rename/delete/move files & folders -- [x] **Drag & drop upload** — fichiers + dossiers récursifs depuis l'OS -- [x] **Drag & drop interne** — déplacer items entre dossiers -- [x] **Expand/collapse** — toggle dossiers, persisté localStorage -- [x] **File viewer** — images, PDF, texte/code avec coloration syntaxique -- [x] **Preview hover** — popup au survol des fichiers -- [x] **Icônes par type** — 📝 pages, 📕 PDF, 🖼️ images, 🐍 code, etc. -- [x] **Recherche + filtre** — par nom + par type (chips) -- [x] **Menu contextuel sidebar** — clic droit / long-press mobile -- [x] **Expand/Collapse all** — boutons ⊞ ⊟ -- [x] **Sidebar persistante** — sectionsOpen + expandedFolders localStorage -- [x] **Création instantanée** — AJAX sans reload -- [x] **73 tests** passent +### v2.2.0 ✅ — Tags & Recherche Avancée +- [x] Tables `tags` + `page_tags`, CRUD API +- [x] Vue Table enrichie, filtrage par tags +- [x] Menu contextuel tags (ajout/retrait, création avec couleur) +- [x] Filtre "Dossiers", auto-switch table + +### v2.3.0 ✅ — Multi-Vues Workspace & Preview Panel +- [x] Sélecteur de vue: Tree, List, Details, Title, Content (5 modes) +- [x] Preview Panel latéral (contenu, métadonnées, tags, actions) +- [x] Tri par date (Oldest/Newest) + +### v2.4.0 ✅ — Tags Personnalisés par Utilisateur (2026-07-13) +- [x] Tags isolés par `user_id` — chaque utilisateur voit ses propres tags +- [x] `UNIQUE(name, user_id)`, migration des tags existants +- [x] API filtrage transparent (session cookie) + +### v2.5.0 ✅ — Administration Avancée (2026-07-13) +- [x] Premier compte créé = admin automatique +- [x] Panneau Admin dans Settings (Users & Roles, Audit) +- [x] Table `login_history` (IP, user_agent, timestamp) +- [x] CRUD utilisateurs (créer, modifier rôle/password, supprimer) +- [x] Statistiques par utilisateur (workspaces, pages, utilisation) +- [x] CSRF fix sur les appels admin + +### v2.6.0 ✅ — My Account & Auth Locale (2026-07-13) +- [x] Section My Account: modifier username, nom, email, mot de passe +- [x] Toggle voir/cacher mot de passe (oeil/barré) +- [x] Label "Email or username" dans login +- [x] Refresh cookie session après modification compte +- [x] Register avec Gitea (OAuth crée compte + active intégration) + +### v2.7.0 ✅ — Intégration Gitea Phase 1 (2026-07-13) +- [x] **OAuth2 Provider** — Gitea comme fournisseur OAuth2 (Client ID/Secret dans `.env`) +- [x] **Redirect URI dynamique** — basé sur le header `Host` (localhost + IP réseau) +- [x] **Workspace listing** — 2 sections: My Workspaces + Gitea Projects +- [x] **Tabs par organisation** — All | user | org1 | org2 avec compteurs +- [x] **Barre de recherche** — filtrage live par nom/description +- [x] **Lazy tree** — arborescence chargée un dossier à la fois +- [x] **File viewer** — lecture fichiers Gitea (décodé base64) +- [x] **Éditeur + commit** — modifier et commiter dans Gitea +- [x] **Delete fichier** — suppression avec confirmation + commit +- [x] **Arborescence dans le sidebar** — comme un workspace local +- [x] **Settings › Integrations** — connecter/déconnecter Gitea +- [x] **Fallback token admin** — GET sans token utilisateur (read-only) +- [x] **Write ops** — exigent token OAuth utilisateur (commit, delete) +- [x] **Limit=100** — tous les repos visibles (pas de pagination tronquée) + +### v2.7.1 ✅ — Private Pages Gitea (2026-07-13) +- [x] Table `gitea_private_pages` — liée par (user_id, owner, repo) +- [x] API CRUD: GET/POST/PUT/DELETE private-pages +- [x] UI dans le workspace Gitea: liste + éditeur titre/contenu +- [x] Lien Private Pages dans le sidebar +- [x] Persistant entre sessions — survit au changement de workspace --- ## Upcoming -### v2.2.0 — Workspace & Sidebar Professionnel (Gap Analysis) -### Cible: Q3 2026 +### v2.8.0 — Gitea Phase 2 (Écriture avancée) +- [ ] Création de nouveaux fichiers dans le repo Gitea +- [ ] Upload de fichiers binaires +- [ ] Syntax highlighting dans le file viewer +- [ ] Labels Gitea → tags FlowDeck (sync bidirectionnelle) +- [ ] Historique des commits récents par fichier -Analyse complète de ce qui manque pour une expérience utilisateur -de niveau professionnel, comparable à Notion, VS Code, et Finder. +### v2.9.0 — GitHub OAuth Provider +- [ ] OAuth2 GitHub (même flux que Gitea) +- [ ] GitHubAdapter dans le ForgeAdapter pattern +- [ ] Section GitHub Projects dans /workspaces -#### A. Workspace Page — Productivité & Raccourcis - -| # | Feature | Priorité | Effort | Description | -|---|---------|----------|--------|-------------| -| A1 | **Multi-sélection** | P0 | M | Checkboxes + Shift-click range + Ctrl-click toggle. Bulk delete/move. | -| A2 | **Raccourcis clavier** | P0 | M | Enter=open, F2=rename, Del=delete, Ctrl+A=select all, Ctrl+C/V=copy/paste, Ctrl+Z=undo | -| A3 | **Inline rename** | P0 | S | Double-clic → champ inline (pas prompt()). Garder le même comportement que Finder. | -| A4 | **Drag count badge** | P1 | S | Afficher un badge "[N]" sur le curseur quand on drag plusieurs items. | -| A5 | **Undo delete** (toast) | P1 | M | Remplacer `confirm('Delete?')` par un delete immédiat + toast "Undo" 5s. | -| A6 | **Duplicate file/folder** | P1 | S | Action "Duplicate" dans le menu contextuel + Ctrl+D. | -| A7 | **Copy/paste items** | P1 | M | Ctrl+C copie (stockage sessionStorage), Ctrl+V colle dans le dossier courant. | - -#### B. Workspace Page — Affichage & Métadonnées - -| # | Feature | Priorité | Effort | Description | -|---|---------|----------|--------|-------------| -| B1 | **Vue détails/tableau** | P0 | L | Toggle entre arbre et tableau (Nom, Taille, Type, Modifié le). | -| B2 | **Tri** | P0 | M | Barre d'en-tête: clic pour trier par nom/date/taille/type. Asc/desc. | -| B3 | **Métadonnées dans l'arbre** | P1 | S | Afficher taille + date de modification en grisé à droite du nom. | -| B4 | **Compteur d'enfants par dossier** | P1 | S | Badge "(3)" à côté du nom du dossier indiquant le nombre d'items directs. | -| B5 | **Loading skeletons** | P1 | S | Remplacer "Loading..." par des skeletons animés (barres grises pulsing). | -| B6 | **Empty state illustré** | P2 | S | Illustration SVG + texte d'aide pour workspace vide et dossier vide. | - -#### C. Workspace Page — Navigation & Breadcrumb - -| # | Feature | Priorité | Effort | Description | -|---|---------|----------|--------|-------------| -| C1 | **Breadcrumb éditable** | P1 | M | Cliquer sur un segment du breadcrumb = naviguer. Dernier segment éditable (rename). | -| C2 | **Barre d'adresse / path** | P2 | M | Champ texte affichant le path complet, éditable pour jump direct. | -| C3 | **Back/Forward navigation** | P2 | M | Boutons ← → dans la topbar, historique de navigation interne. | -| C4 | **Dossier parent ".."** | P2 | S | Premier élément de la liste quand on est dans un sous-dossier. | - -#### D. Sidebar Workspace — Polissage - -| # | Feature | Priorité | Effort | Description | -|---|---------|----------|--------|-------------| -| D1 | **Indicateur de dossier actif** | P0 | S | Highlight + point coloré sur le dossier courant (navigué). | -| D2 | **Badge compteur par dossier** | P1 | S | "(5)" à côté des dossiers montrant le nombre d'items récursifs. | -| D3 | **Drop indicator line** | P1 | S | Ligne bleue entre les items pendant le drag pour montrer la position d'insertion. | -| D4 | **Scroll into view** | P1 | S | Auto-scroll pour rendre visible le dossier actif dans la sidebar. | -| D5 | **Animation expand/collapse** | P2 | S | Transition fluide CSS pour l'ouverture/fermeture des dossiers (max-height). | -| D6 | **Indicateur "modifié récemment"** | P2 | S | Petit point bleu à côté des items modifiés dans les dernières 24h. | - -#### E. Expérience Générale — Cross-cutting - -| # | Feature | Priorité | Effort | Description | -|---|---------|----------|--------|-------------| -| E1 | **Mode grille/vignettes** | P2 | L | Alternative au tree: icônes larges avec preview, style Finder/Dropbox. | -| E2 | **Upload progress détaillé** | P1 | M | Barre de progression par fichier, vitesse, ETA, possibilité d'annuler. | -| E3 | **Drag depuis sidebar vers workspace** | P2 | L | Permettre de glisser un item de la sidebar directement dans la page workspace. | -| E4 | **Pin/favoris dans le workspace** | P2 | S | Épingler des dossiers/fichiers en haut de la liste pour accès rapide. | -| E5 | **Aperçu des fichiers dans le dossier parent** | P3 | M | Quand on survole un dossier dans l'arbre, montrer un petit popup listant les 5 premiers fichiers. | -| E6 | **Dark/Light theme cohérent** | P1 | M | S'assurer que le file viewer standalone respecte le thème actif (cookie/session). | - -#### F. Mobile & Responsive - -| # | Feature | Priorité | Effort | Description | -|---|---------|----------|--------|-------------| -| F1 | **Swipe actions** | P2 | M | Swipe gauche sur un item → Delete. Swipe droit → Rename. | -| F2 | **Bottom sheet context menu** | P1 | M | Remplacer le menu contextuel desktop par une bottom sheet native sur mobile. | -| F3 | **Touch hold feedback** | P1 | S | Haptic feedback (si supporté) + scale animation sur long-press. | -| F4 | **Grille adaptative** | P2 | M | En mode paysage tablette: 2 colonnes (sidebar + contenu). | - -#### G. Performance & Robustesse - -| # | Feature | Priorité | Effort | Description | -|---|---------|----------|--------|-------------| -| G1 | **Virtual scrolling** | P2 | L | Pour les dossiers avec >1000 items, rendre seulement les éléments visibles. | -| G2 | **Lazy loading des enfants** | P1 | M | Ne charger les enfants d'un dossier que quand on l'expand (API `?folder=ID`). | -| G3 | **Cache navigateur** | P1 | S | Cache le contenu des fichiers déjà chargés pour le preview hover. | -| G4 | **Offline indicator** | P3 | S | Bannière "You are offline" + queue des actions pour synchro au retour. | -| G5 | **Rate limiting + retry** | P1 | S | Retry automatique avec backoff exponentiel sur les appels API échoués. | - ---- - -#### Résumé des priorités - -**P0 — Bloquant pour une expérience pro :** -- A1 Multi-sélection -- A2 Raccourcis clavier -- A3 Inline rename -- B1 Vue détails/tableau -- B2 Tri -- D1 Indicateur dossier actif - -**P1 — Important pour la qualité perçue :** -- A4 Drag count badge, A5 Undo toast, A6 Duplicate, A7 Copy/paste -- B3 Métadonnées, B4 Compteur, B5 Skeletons -- C1 Breadcrumb éditable -- D2 Badge compteur, D3 Drop indicator, D4 Scroll into view -- E2 Upload progress, E6 Thème cohérent -- F2 Bottom sheet mobile, F3 Touch feedback -- G2 Lazy loading, G3 Cache, G5 Retry - -**Estimation globale : ~4-6 semaines pour P0+P1 avec 1 développeur.** - ---- - -### v2.1.0 — Intégrations Avancées (futur) - -- [ ] **API publique** — REST API documentée pour usage externe -- [ ] **Webhooks sortants** — notifier des services externes -- [ ] **n8n integration** — nœud FlowDeck pour workflows -- [ ] **Slack/Discord integration** — notifications dans les channels -- [ ] **Google Calendar sync** — synchronisation bidirectionnelle -- [ ] **Mobile PWA** — Progressive Web App pour mobile -- [ ] **PostgreSQL migration** — si passage multi-tenant +### v3.0.0 — UX Professionnelle (inspiré du gap analysis v2.2) +- [ ] Multi-sélection (checkboxes, Shift-click, Ctrl-click) +- [ ] Raccourcis clavier (Enter, F2, Del, Ctrl+A/C/V/Z) +- [ ] Inline rename (double-clic → champ inline) +- [ ] Vue détails/tableau avec tri +- [ ] Loading skeletons +- [ ] Mode grille/vignettes --- @@ -310,18 +188,14 @@ de niveau professionnel, comparable à Notion, VS Code, et Finder. ``` v1.0.0 ✅ v1.1.0 ✅ v1.2.0 ✅ v1.3.0 ✅ v1.4.0 ✅ v1.5.0 ✅ v1.6.0 ✅ v1.7.0 ✅ Production Pages Editor DB Concept Properties Relations Views View+ - ────────────────────────────────────────────── - 52 fonctionnalités identifiées dans le gap analysis - │ - ├─ Bloc 1: Database Concept (v1.3) — 6 items ✅ - ├─ Bloc 2: Propriétés avancées (v1.4-1.5) — 14 items ✅ - ├─ Bloc 3: Vues manquantes (v1.6-1.7) — 10 items ✅ - ├─ Bloc 4: Sub-items & Deps (v1.8) — 7 items ✅ - ├─ Bloc 5: My Tasks (v1.9) — 7 items ✅ - ├─ Bloc 6: Éditeur complet (v2.0) — 8 items ✅ - └─ Bloc 7: Fonctions transversales — +multi-user ✅ -v2.0.0 ✅ v2.1.0 ✅ v2.2.0 ⬜ -Editor+ Workspace Pro UX - Local +v2.0.0 ✅ v2.1.0 ✅ v2.2.0 ✅ v2.3.0 ✅ v2.4.0 ✅ v2.5.0 ✅ v2.6.0 ✅ v2.7.0 ✅ +Editor+ Workspace Tags Views5 Tags/user Admin Account Gitea P1 + Local Panel + +v2.7.1 ✅ v2.8.0 ⬜ v2.9.0 ⬜ v3.0.0 ⬜ +Private Gitea P2 GitHub Pro UX +Pages ``` + +*Dernière mise à jour: 2026-07-13* diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index f13a15b..e470219 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -29,87 +29,87 @@ ## Phase 1 — Authentification Multi-Mode ### 1.1 Comptes locaux avec mot de passe -- [ ] **DB**: Ajouter `password_hash` (bcrypt) à la table `users` -- [ ] **DB**: Ajouter `is_active`, `is_admin`, `last_login`, `login_attempts`, `locked_until` -- [ ] **API**: `POST /auth/register` — création de compte local (email + password) -- [ ] **API**: `POST /auth/login` — login local (email + password → session) -- [ ] **Page**: `/login` — formulaire login/register -- [ ] **Sécurité**: Rate limiting (5 tentatives → lock 15 min), bcrypt cost=12 -- [ ] **Sécurité**: CSRF sur toutes les routes auth -- [ ] **Session**: Détachée de Gitea — session valide sans OAuth +- [x] **DB**: Ajouter `password_hash` (hash) à la table `users` +- [x] **DB**: Ajouter `is_active`, `is_admin`, `last_login`, `login_attempts`, `locked_until` +- [x] **API**: `POST /auth/register` — création de compte local (email + password) +- [x] **API**: `POST /auth/login` — login local (email + password → session) +- [x] **Page**: `/login` — formulaire login/register +- [x] **Sécurité**: Rate limiting (5 tentatives → lock 15 min) +- [x] **Sécurité**: CSRF sur toutes les routes auth +- [x] **Session**: Détachée de Gitea — session valide sans OAuth ### 1.2 Page de configuration du compte -- [ ] **Page**: `/accounts/settings` — config du profil -- [ ] **Section**: Profil (nom, email, avatar, mot de passe) -- [ ] **Section**: Connexions forges (Gitea, GitHub) — lier/délier -- [ ] **Section**: Préférences (langue, thème, notifs) +- [x] **Page**: `/accounts/settings` — config du profil +- [x] **Section**: Profil (nom, email, avatar, mot de passe) +- [x] **Section**: Connexions forges (Gitea, GitHub) — lier/délier +- [x] **Section**: Préférences (langue, thème, notifs) - [ ] **Section**: Tokens API (générer/révoquer des clés API) - [ ] **Section**: Sessions actives (voir et révoquer) ### 1.3 OAuth multi-forge -- [ ] **Refactor**: `GiteaOAuth` → `OAuthProvider` (classe abstraite) +- [x] **Refactor**: `GiteaOAuth` → `OAuthProvider` (classe abstraite) - [ ] **Implement**: `GitHubOAuthProvider` (OAuth2 GitHub) -- [ ] **Implement**: `GiteaOAuthProvider` (existant, refactoré) -- [ ] **DB**: Table `user_oauth_tokens` (user_id, provider, access_token, refresh_token, expires_at) -- [ ] **API**: `GET /auth/{provider}/login` — redirige vers OAuth -- [ ] **API**: `GET /auth/{provider}/callback` — callback OAuth -- [ ] **Page**: `/accounts/settings` → boutons "Connect GitHub" / "Connect Gitea" -- [ ] **Fallback**: L'utilisateur peut utiliser FlowDeck SANS lier aucune forge +- [x] **Implement**: `GiteaOAuthProvider` (existant, refactoré) +- [x] **DB**: Table `user_oauth_tokens` (user_id, provider, access_token, refresh_token, expires_at) +- [x] **API**: `GET /auth/{provider}/login` — redirige vers OAuth +- [x] **API**: `GET /auth/{provider}/callback` — callback OAuth +- [x] **Page**: `/accounts/settings` → boutons "Connect GitHub" / "Connect Gitea" +- [x] **Fallback**: L'utilisateur peut utiliser FlowDeck SANS lier aucune forge --- ## Phase 2 — Abstraction Multi-Forge ### 2.1 Adapter pattern pour les forges -- [ ] **Interface**: `ForgeAdapter` (classe abstraite) +- [x] **Interface**: `ForgeAdapter` (classe abstraite) - `list_repos(token) → List[Repo]` - `get_repo(token, owner, repo) → RepoDetail` - `list_issues(token, owner, repo) → List[Issue]` - `get_file_tree(token, owner, repo, path) → TreeNode` - `get_file_content(token, owner, repo, path) → str` - `create_webhook(token, owner, repo, url) → Webhook` -- [ ] **Implement**: `GiteaAdapter` (API Gitea existante → interface unifiée) +- [x] **Implement**: `GiteaAdapter` (API Gitea existante → interface unifiée) - [ ] **Implement**: `GitHubAdapter` (API GitHub v3 → interface unifiée) -- [ ] **DB**: Table `forge_connections` (user_id, provider, token_id, instance_url) -- [ ] **Config**: Support GitHub Enterprise (custom URL) et Gitea self-hosted +- [x] **DB**: Table `forge_connections` (user_id, provider, token_id, instance_url) +- [x] **Config**: Support GitHub Enterprise (custom URL) et Gitea self-hosted ### 2.2 Synchronisation des projets -- [ ] **Service**: `ProjectSyncService` — sync projets depuis les forges liées +- [x] **Service**: `ProjectSyncService` — sync projets depuis les forges liées - [ ] **DB**: Table `projects` avec type (`builtin`, `gitea`, `github`) - [ ] **DB**: `projects.forge_id` — référence externe (repo ID) - [ ] **DB**: `projects.clone_url`, `projects.default_branch`, `projects.language` - [ ] **Cron**: Sync périodique des projets (configurable, défaut: chaque heure) -- [ ] **Page**: `/workspace` — liste TOUS les projets (built-in + Gitea + GitHub) +- [x] **Page**: `/workspace` — liste TOUS les projets (built-in + Gitea + GitHub) --- ## Phase 3 — Workspace & Navigation ### 3.1 Nouvelle page Workspace -- [ ] **Page**: `/workspace` — dashboard central +- [x] **Page**: `/workspace` — dashboard central - Section "My Projects" (built-in) - Section "Gitea Projects" (si connecté) - Section "GitHub Projects" (si connecté) - Bouton "Create Project" (built-in) - Bouton "Import from Gitea/GitHub" -- [ ] **Filtres**: Par forge, par statut, recherche -- [ ] **Carte projet**: Nom, description, forge badge, dernière activité, nombre de pages +- [x] **Filtres**: Par forge, par statut, recherche +- [x] **Carte projet**: Nom, description, forge badge, dernière activité, nombre de pages ### 3.2 Barre de navigation projet -- [ ] **Topbar**: Section entre "Meetings" et la sidebar +- [x] **Topbar**: Section entre "Meetings" et la sidebar - Nom du projet actif (dropdown pour switcher) - Badge forge (icône Gitea/GitHub/built-in) -- [ ] **Arborescence**: Sous le projet dans la sidebar gauche +- [x] **Arborescence**: Sous le projet dans la sidebar gauche - Dossiers et fichiers du repo Git (lecture seule si forge externe) - Pages FlowDeck liées au projet - Bouton "+" pour créer nouvelle page dans le projet -- [ ] **Service**: `FileTreeService` — construit l'arborescence depuis l'API forge -- [ ] **Cache**: Arborescence en cache (TTL 5 min) pour éviter les appels API à chaque page +- [x] **Service**: `FileTreeService` — construit l'arborescence depuis l'API forge +- [x] **Cache**: Arborescence en cache (TTL 5 min) pour éviter les appels API à chaque page ### 3.3 Navigation projet -- [ ] **Sidebar**: Les projets apparaissent sous une section dédiée -- [ ] **Breadcrumb**: Workspace > Projet > Dossier > Page -- [ ] **Contexte projet**: Toute nouvelle page créée depuis un projet y est liée +- [x] **Sidebar**: Les projets apparaissent sous une section dédiée +- [x] **Breadcrumb**: Workspace > Projet > Dossier > Page +- [x] **Contexte projet**: Toute nouvelle page créée depuis un projet y est liée - [ ] **Quick switch**: Ctrl+K → chercher et switcher de projet --- @@ -117,32 +117,32 @@ ## Phase 4 — Fonctionnement sans forge ### 4.1 Mode standalone -- [ ] **Config**: `FLOWDECK_STANDALONE=true` — démarre sans aucune forge -- [ ] **UI**: Pas de sections Gitea/GitHub si non configuré -- [ ] **Workspace**: Uniquement projets built-in -- [ ] **Auth**: Login local uniquement (pas de boutons OAuth) -- [ ] **Pages**: Création/édition 100% locale, pas de synchro externe +- [x] **Config**: `FLOWDECK_STANDALONE=true` — démarre sans aucune forge +- [x] **UI**: Pas de sections Gitea/GitHub si non configuré +- [x] **Workspace**: Uniquement projets built-in +- [x] **Auth**: Login local uniquement (pas de boutons OAuth) +- [x] **Pages**: Création/édition 100% locale, pas de synchro externe ### 4.2 Mode hybride -- [ ] Un utilisateur peut avoir Gitea lié, un autre GitHub, un troisième rien -- [ ] Chaque utilisateur voit SES projets de forge dans SA workspace -- [ ] Les projets built-in sont partagés selon les permissions workspace +- [x] Un utilisateur peut avoir Gitea lié, un autre GitHub, un troisième rien +- [x] Chaque utilisateur voit SES projets de forge dans SA workspace +- [x] Les projets built-in sont partagés selon les permissions workspace --- ## Phase 5 — Permissions & Collaboratif ### 5.1 Rôles workspace -- [ ] **DB**: Table `workspace_members` avec rôles: owner, admin, editor, viewer -- [ ] **API**: `POST /workspace/{id}/members` — inviter un utilisateur -- [ ] **API**: `DELETE /workspace/{id}/members/{user_id}` — retirer -- [ ] **API**: `PUT /workspace/{id}/members/{user_id}` — changer rôle -- [ ] **Middleware**: `PermissionMiddleware` — vérifie les droits avant chaque action +- [x] **DB**: Table `workspace_members` avec rôles: owner, admin, editor, viewer +- [x] **API**: `POST /workspace/{id}/members` — inviter un utilisateur +- [x] **API**: `DELETE /workspace/{id}/members/{user_id}` — retirer +- [x] **API**: `PUT /workspace/{id}/members/{user_id}` — changer rôle +- [x] **Middleware**: `PermissionMiddleware` — vérifie les droits avant chaque action ### 5.2 Partage de pages -- [ ] Étendre le système Share existant pour supporter les permissions workspace -- [ ] Une page dans un workspace est visible par tous les membres -- [ ] "Anyone with the link" crée un lien public indépendant du workspace +- [x] Étendre le système Share existant pour supporter les permissions workspace +- [x] Une page dans un workspace est visible par tous les membres +- [x] "Anyone with the link" crée un lien public indépendant du workspace --- @@ -207,4 +207,4 @@ --- -*Dernière mise à jour: 2026-07-10 — créé avec Bruno* +*Dernière mise à jour: 2026-07-13 — phases 1-5 majoritairement complétées*