diff --git a/CHANGELOG.md b/CHANGELOG.md index d9d35f4..071a8e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,85 +1,86 @@ # Changelog — FlowDeck +## 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 -- **Type `relation`**: lien bidirectionnel entre collections avec reverse_name auto - - API: `POST /db/{id}/properties/relation`, `POST /db/{id}/properties/relation/link` - **FormulaEngine**: 19 fonctions (prop, if, concat, round, now, today, dateAdd, replace, ...) - - API: `POST /db/formula/evaluate` -- **RollupEngine**: 12 fonctions (count, sum, avg, min, max, range, unique, percent_checked, ...) - - API: `POST /db/rollup/compute` -- **Tests**: 5 nouveaux tests (43/43 passent, +13%) - -### Fixed -- FKs `related_collection_id`, `relation_property_id`, `target_property_id` → `ON DELETE SET NULL` - -### Changed -- Version 1.4.0 → 1.5.0 +- **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`**: remplace `project_properties`, liée aux collections - - Types: title, text, number, select, multi_select, status, date, person, checkbox, url, email, phone, files, unique_id - - Auto-propriétés: created_time, created_by, last_edited_time, last_edited_by - - Relations/Rollups/Formulas: schéma prêt (colonnes dispo, implémentation v1.5) -- **Service `property_types.py`**: 21 types définis, validation, formatage, auto-values -- **API propriétés**: `GET /db/property-types/api`, CRUD `/{id}/properties/api`, `PUT/DELETE /properties/{id}/api` -- **Tests**: 4 nouveaux tests (38/38 passent, +12%) - -### Changed -- Version 1.3.0 → 1.4.0 +- **Table `collection_properties`**: 21 types Notion +- **Service `property_types.py`**: validation, formatage, auto-values ## v1.3.0 (2026-07-10) — Database Concept ### Added -- **Nouvelles tables**: `collections`, `collection_pages`, `collection_views` — fondation Database Notion -- **Router `/db`**: API CRUD complète pour collections et pages - - `GET/POST /db/api` — lister/créer collections - - `GET/PUT/DELETE /db/api/{id}` — lire/modifier/supprimer collection - - `GET/POST /db/{id}/pages/api` — lister/créer pages - - `GET/PUT/DELETE /db/pages/{id}/api` — CRUD page standalone - - `GET /db/{id}` — vue HTML basique par collection -- **GiteaBoardCompat**: adaptateur boards Gitea legacy → Collections - - `GET /db/boards/api` — liste boards comme pseudo-collections - - `GET /db/board/{owner}/{repo}/api` — board spécifique comme collection - - `POST /db/board/{owner}/{repo}/sync` — sync board → vraie collection -- **Tests**: 6 nouveaux tests (34/34 passent, +21%) -- **CSRF**: `/db/` exempté (API interne) - -### Changed -- Version 1.0.0 → 1.3.0 (main.py, api.py, health) -- `db.py` init: 3 nouvelles tables + index -- Architecture DB: `collection_pages` utilise `property_values_json` (JSON flexible) +- **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 -- **UI Notion-complete**: sidebar 240px, topbar 44px, dark mode (#191919/#222/#333) -- **5 vues**: Kanban, Detailed Board, Table, Status Overview (SVG donut), Team Load (stacked bars) -- **Filtres cumulables AND** avec status dropdown checkboxes, filtres par assignee/tag -- **Tri multi-critères** hiérarchique (N niveaux, asc/desc) -- **Card detail modal**: titre éditable, propriétés, checklists, commentaires Gitea -- **Création d'issues inline** depuis le board -- **Propriétés custom** par projet: select, multi_select, date, person, text -- **AI keywords**: extraction automatique depuis labels + body, table `ai_keywords` -- **Sync API**: `POST /board/api/sync/{owner}/{repo}` — bidirectionnelle complète -- **CI/CD**: Gitea Actions workflow -- **Tests**: 25 tests, couvrant toutes les vues, APIs, filtres, tris - -### Changed -- FastAPI `on_event` → `lifespan` handler (deprecation fix) -- Version bump 0.3.0 → 1.0.0 -- CSS: 31 KB design system Notion (700+ lignes) -- 10 templates Jinja2 (base, board, card, detail, table, status, team, detailed, fragment, dashboard) - -### Fixed -- Team Load bug: status key mismatch (done → complete) -- CSRF: 403 protection vérifiée sur toutes les routes POST - -## v0.3.0 (2026-06-??) -- OAuth2 Gitea, CSRF, rate limiting, webhooks - -## v0.2.0 (2026-05-??) -- Dashboard + Board Kanban + Gitea sync + Notes + Docker +- 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 diff --git a/README.md b/README.md index 6abef19..edda016 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # FlowDeck -Clone de l'interface **Notion** intégré nativement à **Gitea** — Databases, Pages, Kanban, Table, multi-vues. +Clone complet de **Notion** intégré nativement à **Gitea** — Databases, Pages, Kanban, Calendar, Gallery, Timeline, List, Multi-Users. -> **v1.3.0** — Database Concept (collections, pages, vues, GiteaBoardCompat) +> **v2.1.0** — API publique, Webhooks sortants, PWA ## Quick Start @@ -15,45 +15,62 @@ docker compose up -d ## Features -### Database Concept (v1.3.0) -- **Collections**: databases indépendantes de Gitea, schéma JSON, icon, description -- **Pages**: propriétés JSON, position, parent_id (sub-items ready), lien Gitea optionnel -- **Vues**: configurables (type, filters, sorts, visible_properties) +### Database & Properties (v1.3–v1.5) +- **Collections**: databases indépendantes de Gitea, schéma JSON +- **21 types de propriétés**: title, text, number, select, status, date, person, checkbox, url, email, phone, files, unique_id, relation, rollup, formula + auto-props +- **Relations bidirectionnelles** + **Rollups** (12 agrégations) + **Formulas** (19 fonctions) - **GiteaBoardCompat**: adaptateur boards Gitea legacy → Collections -- **API REST**: CRUD complet collections + pages (12 endpoints) + +### Vues Multiples (v1.6–v1.7) +- **Table**: colonnes SSR, triables +- **Board (Kanban)**: colonnes, groupes, drag & drop +- **Calendar**: grid mensuel, navigation, événements +- **Gallery**: cartes visuelles, card_size configurable +- **List**: vue compacte avec preview +- **Timeline**: barres Gantt horizontales +- **Status Overview**: Donut chart SVG +- **Team Load**: Barres empilées + +### Sub-items & Dépendances (v1.8) +- **Sub-items**: parent_id auto-référence, hiérarchie illimitée +- **Status aggregate**: parent = Done si tous enfants Done +- **Dependencies**: Blocking/Blocked by, contrainte de transition + +### My Tasks (v1.9) +- Dashboard cross-collection agrégeant toutes les tâches assignées +- Vues: All, Today, Overdue, Next 7 days + +### Multi-User & Collaboratif (v2.0) +- **Workspaces**: espaces partagés avec rôles (admin, editor, commenter, viewer) +- **Comments**: commentaires threadés sur les pages +- **Page History**: historique des modifications avec snapshots +- **Favorites**: favoris par utilisateur +- **Templates**: database + page templates +- **CSV Import/Export** +- **Public Sharing**: lien de partage lecture seule + +### API & Intégrations (v2.1) +- **API publique REST**: `/api/v1` avec token auth +- **Webhooks sortants**: gestion + dispatcher d'événements +- **PWA**: manifest.json, prêt pour installation mobile ### UI Notion-Style (v1.1–v1.2) -- **Sidebar gauche** avec sections hiérarchiques (Recents, Private, Library, Trash) -- **Topbar** avec breadcrumbs (workspace > projet > page) -- **Dark mode** Notion: `#191919` fond, `#222222` sidebar, `#333333` actif -- **Éditeur de blocs** Notion-style: slash menu (/), navigation clavier, placeholders -- **Drag & drop** pages dans la sidebar (SortableJS) - -### Vues Multiples (v0.5–v0.8) -- **Kanban board**: colonnes avec sous-groupes, drag & drop cartes -- **Table view**: colonnes triables, groupes rétractables -- **Status overview**: Donut chart SVG avec segments, compteurs -- **Team Load**: Barres empilées par membre -- **Detailed board**: cartes avec propriétés visibles - -### Filtres & Tri (v0.7) -- **Filtres cumulables** (logique AND) avec pastilles -- **Tri multi-critères** hiérarchique -- **Filtre par statut**: checkboxes multiples +- Sidebar gauche avec sections hiérarchiques +- Topbar avec breadcrumbs (workspace > projet > page) +- Dark mode Notion: `#191919` fond, `#222222` sidebar +- Éditeur de blocs: slash menu (/), navigation clavier, placeholders ### Intégration Gitea -- **Issues Gitea → cartes** Notion-style -- Sync labels, milestones, assignees, due dates -- OAuth2 Gitea, CSRF, rate limiting -- Webhooks pour sync temps réel +- Issues Gitea → cartes, sync labels, milestones, assignees, due dates +- OAuth2 Gitea, CSRF, rate limiting, webhooks ## Stack | Couche | Techno | |--------|--------| -| Frontend | Jinja2 + HTMX + Alpine.js + SortableJS + CSS 31KB | +| Frontend | Jinja2 + HTMX + Alpine.js + SortableJS + CSS | | Backend | Python 3.12 + FastAPI + httpx | -| BDD | SQLite (WAL mode) — `/data/flowdeck.db` | +| BDD | SQLite (WAL, 21 tables) — `/data/flowdeck.db` | | Déploiement | Docker (python:3.12-slim), docker-compose | ## Configuration @@ -65,25 +82,16 @@ APP_PORT=8080 DATABASE_URL=sqlite:////data/flowdeck.db ``` -## Roadmap - -Voir [ROADMAP.md](ROADMAP.md) — v1.4.0 Propriétés Avancées → v2.0.0 Multi-Users. - -## Développement - -```bash -python3 -m venv venv -source venv/bin/activate -pip install -r requirements.txt -uvicorn app.main:app --reload --port 8080 -``` - ## Tests ```bash -python3 -m pytest tests/ -v # 34/34 passent +python3 -m pytest tests/ -v # 73/73 passent ``` +## Roadmap + +Voir [ROADMAP.md](ROADMAP.md) — 7/7 blocs complétés, 52/52 features ✅ + ## Licence MIT diff --git a/WORKLOAD.md b/WORKLOAD.md index 837ed0c..02e26ee 100644 --- a/WORKLOAD.md +++ b/WORKLOAD.md @@ -1,71 +1,59 @@ # WORKLOAD — FlowDeck Notion Clone -> **Début**: 2026-07-08 | **Version actuelle**: v1.3.0 | **Prochaine**: v1.4.0 +> **Début**: 2026-07-08 | **Version**: v2.1.0 | **Statut**: COMPLET ✅ ## Avancement Global -| Phase | Description | Statut | Tests | -|-------|-------------|--------|-------| -| v0.2 – v0.9 | Base → Backend | ✅ | — | +| Version | Description | Statut | Tests | +|---------|-------------|--------|-------| +| v0.2–v0.9 | Base → Backend | ✅ | — | | v1.0 | Production (lifespan, CI/CD) | ✅ | 28/28 | | v1.1 | Pages & Sidebar Notion | ✅ | — | | v1.2 | Éditeur Notion (slash menu, blocs) | ✅ | — | | v1.3 | Database Concept (collections) | ✅ | 34/34 | -| v1.4 | Propriétés Avancées (14 types) | ⬜ | — | -| v1.5 | Relations & Rollups | ⬜ | — | -| v1.6 | Vues Calendrier/Timeline/Gallery/List | ⬜ | — | -| v1.7 | Vues Améliorées (group_by, card_size) | ⬜ | — | -| v1.8 | Sub-items & Dépendances | ⬜ | — | -| v1.9 | My Tasks & Dashboard Unifié | ⬜ | — | -| v2.0 | Éditeur Complet & Multi-Users | ⬜ | — | +| v1.4 | Propriétés Avancées (21 types) | ✅ | 38/38 | +| v1.5 | Relations, Rollups, Formulas | ✅ | 43/43 | +| v1.6 | Vues (Calendar, Gallery, List, Timeline) | ✅ | 49/49 | +| v1.7 | Vues Améliorées (view config, save-as) | ✅ | — | +| v1.8 | Sub-items & Dépendances | ✅ | 56/56 | +| v1.9 | My Tasks Dashboard | ✅ | 60/60 | +| v2.0 | Multi-User + Editor Complete | ✅ | 67/67 | +| v2.1 | Public API, Webhooks, PWA | ✅ | 73/73 | ---- +## Blocs Complétés -## v1.3.0 — Database Concept (complété 2026-07-10) +| Bloc | Features | Statut | +|------|----------|--------| +| Bloc 1 | Database Concept | ✅ 6/6 | +| Bloc 2 | Propriétés Avancées | ✅ 14/14 | +| Bloc 3 | Vues Manquantes | ✅ 10/10 | +| Bloc 4 | Sub-items & Dépendances | ✅ 7/7 | +| Bloc 5 | My Tasks | ✅ 7/7 | +| Bloc 6 | Éditeur Complet | ✅ 8/8 | +| Bloc 7 | Fonctions Transversales | ✅ | -### Tables -- [x] `collections` — base de données abstraite, schéma JSON, lien Gitea optionnel -- [x] `collection_pages` — pages avec `parent_id`, `property_values_json`, `position` -- [x] `collection_views` — vues configurables (`view_type`, `config_json`) -- [x] Index: `idx_cp_collection`, `idx_cp_parent`, `idx_cp_gitea` +**Total: 52/52 features (100%)** -### API -- [x] `GET/POST /db/api` — lister/créer collections -- [x] `GET/PUT/DELETE /db/api/{id}` — CRUD collection -- [x] `GET/POST /db/{id}/pages/api` — pages dans une collection -- [x] `GET/PUT/DELETE /db/pages/{id}/api` — CRUD page standalone -- [x] `GET /db/{id}` — vue HTML collection -- [x] `GET /db/boards/api` — boards Gitea comme collections -- [x] `GET /db/board/{o}/{r}/api` — board spécifique -- [x] `POST /db/board/{o}/{r}/sync` — sync board → collection +## Architecture -### Adapter -- [x] `GiteaBoardCompat` — `from_board()`, `from_card()`, `list_boards_as_collections()`, `sync_to_collection()` +### Tables (21) +`users`, `user_tokens`, `boards`, `cards`, `notes`, `col_mapping`, `checklists`, `checklist_items`, `project_properties`, `property_values`, `ai_keywords`, `pages`, `collections`, `collection_pages`, `collection_views`, `collection_properties`, `workspaces`, `workspace_members`, `comments`, `page_history`, `favorites`, `database_templates`, `page_templates`, `webhook_subscriptions` -### Infra -- [x] CSRF exempté pour `/db/` -- [x] Version 1.0.0 → 1.3.0 -- [x] 34/34 tests passent -- [x] Tag git v1.3.0 +### Routeurs (11) +`dashboard`, `board`, `notes`, `api`, `auth`, `webhooks`, `collections`, `my_tasks`, `workspace`, `public_api` + app-level routes ---- +### Services (6) +`GiteaClient`, `FormulaEngine`, `RollupEngine`, `GiteaBoardCompat`, `property_types`, `webhook_outbound` -## Prochaines étapes (v1.4.0 — Propriétés Avancées) +### Endpoints (85+) +CRUD collections/pages, 5 vues HTML, relations/rollups/formulas, sub-items/dependencies, my-tasks, workspaces, comments, history, favorites, templates, CSV import/export, public sharing, public API v1, webhooks, PWA manifest -### Table `collection_properties` -- [ ] Remplacer `project_properties` (liée à `project_owner/name`) par `collection_properties` (liée à `collections`) -- [ ] Types: number, checkbox, url, email, phone, status (9 couleurs), files, unique_id -- [ ] Auto-propriétés: created_time, created_by, last_edited_time, last_edited_by -- [ ] Format number: nombre, %, €, $, £, ¥ +## Stack -### Intégration UI -- [ ] Property editor inline par type (select dropdown, date picker, checkbox...) -- [ ] Affichage des propriétés dans la modale de détail page -- [ ] Migration project_properties → collection_properties - -## Notes - -- **Stack**: FastAPI + Jinja2 + HTMX + Alpine.js + SortableJS + SQLite (WAL) -- **Docker**: python:3.12-slim, port 8080, volume /data -- **Tests**: pytest, 34 tests, client TestClient avec SQLite temporaire +- **Backend**: Python 3.12 + FastAPI + httpx +- **Frontend**: Jinja2 + HTMX + Alpine.js + SortableJS + CSS 31KB +- **BDD**: SQLite WAL mode, 21 tables, foreign keys ON +- **Auth**: OAuth2 Gitea + sessions signed (itsdangerous) + token API +- **Déploiement**: Docker (python:3.12-slim), docker-compose, port 8080 +- **Tests**: pytest, 73 tests, TestClient avec SQLite temporaire - **CI/CD**: Gitea Actions (.gitea/workflows/ci.yml)