From 2ca27d339812dbc7dbad0124f0145a9958b0a30c Mon Sep 17 00:00:00 2001 From: bruno Date: Mon, 20 Jul 2026 15:58:52 -0400 Subject: [PATCH] docs: NOTION_DATABASE_TASKS_GUIDE.md v2.0 + ROADMAP Database/Views/Tasks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - NOTION_DATABASE_TASKS_GUIDE.md: réécriture complète (822→~750 lignes) - 16 sections: anatomie DB, 22 propriétés, relations/rollups, formules - 10 Database Views détaillées, filtres/tris/groupes - Data Sources & Linked Databases, Templates, Dashboards - Tasks, Sub-items, Dependencies, Sprints, My Tasks - Modèle de données complet (tables existantes + 5 nouvelles) - Plan d'implémentation en 5 phases (v4.1–v4.5) - ROADMAP: v4.1–v4.5 redéfini = Database/Views/Tasks - v4.1: Data Sources & Linked - v4.2: Templates & Dashboards - v4.3: 10 Database Views complètes - v4.4: Tasks, Sub-items & Dependencies - v4.5: Sprints & My Tasks - Versions suivantes renumérotées (v4.6→v6.0) - Sources: Guide_Complet_Notion_database.md + 15 URLs docs officielles Notion --- ROADMAP.md | 101 +- docs/NOTION_DATABASE_TASKS_GUIDE.md | 1346 +++++++++++++-------------- 2 files changed, 720 insertions(+), 727 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 896814f..a0e95dc 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -202,7 +202,66 @@ Propriétés custom, AI keywords, sync API, 12 tables DB --- -### v4.1.0 — Content Blocks enrichis (Notion Parity Tier 2) +### v4.1.0 — Database: Data Sources & Linked Databases +> **Objectif** : Collections multi-sources, databases liées (linked). +> **Doc** : [`NOTION_DATABASE_TASKS_GUIDE.md` Phase 1](docs/NOTION_DATABASE_TASKS_GUIDE.md#14-plan-implémentation) + +- [ ] **Table `collection_data_sources`** — multi-sources par collection +- [ ] **API sources** — POST /db/{id}/sources, DELETE +- [ ] **API linked DB** — POST /db/{id}/linked +- [ ] **UI data source manager** — gestion dans settings collection +- [ ] **Règle permissions** — linked DB hérite des perms de la source +- [ ] **Full-page vs Inline** — flag `is_inline`, toggle, transformation + +### v4.2.0 — Database: Templates & Dashboards +> **Objectif** : Templates réutilisables + dashboards combinant vues/widgets. +> **Doc** : [`NOTION_DATABASE_TASKS_GUIDE.md` Phase 2](docs/NOTION_DATABASE_TASKS_GUIDE.md#14-plan-implémentation) + +- [ ] **Table `collection_templates`** — avec récurrence (daily/weekly/monthly/yearly) +- [ ] **Table `collection_dashboards`** — layout widgets (grille configurable) +- [ ] **API templates** — CRUD + POST apply +- [ ] **API dashboards** — CRUD widgets (view_id, position, taille) +- [ ] **UI template picker** — dropdown New avec templates +- [ ] **UI dashboard view** — combinaison de vues/widgets sur une page + +### v4.3.0 — Database Views complètes (10 types) +> **Objectif** : Tous les types de vues Notion avec layouts. +> **Doc** : [`NOTION_DATABASE_TASKS_GUIDE.md` Phase 3](docs/NOTION_DATABASE_TASKS_GUIDE.md#14-plan-implémentation) + +- [ ] **Chart** — barres, courbes, camemberts, donuts, scatter (Chart.js) +- [ ] **Form** — formulaire HTML → POST création page +- [ ] **Map** — Leaflet/OSM pour propriété Place +- [ ] **Feed** — vue chronologique type fil d'actualité +- [ ] **Timeline/Gantt** — barres horizontales avec dépendances +- [ ] **Layout options** — card size, preview, open in peek/side/full +- [ ] **View tabs** — navigation fluide entre vues (existant à enrichir) + +### v4.4.0 — Tasks, Sub-items & Dependencies +> **Objectif** : Système complet de tâches Notion-style. +> **Doc** : [`NOTION_DATABASE_TASKS_GUIDE.md` Phase 4](docs/NOTION_DATABASE_TASKS_GUIDE.md#14-plan-implémentation) + +- [ ] **Flag `is_task`** sur collections — Turn into Tasks +- [ ] **Propriété ID** auto-générée (TASK-XXX) +- [ ] **Sub-items** — parent_id enrichi, modes d'affichage (nested/flattened/card) +- [ ] **Table `page_dependencies`** — bloque/bloqué par +- [ ] **API dependencies** — POST/GET/DELETE /db/{c}/pages/{p}/dependencies +- [ ] **Auto-shift dates** — overlap / maintain_time / never + skip weekends +- [ ] **UI dépendances** — graphe ou liste, toggle sub-items +- [ ] **Filtres sub-items** — parents only / all / sub-items only + +### v4.5.0 — Sprints & My Tasks +> **Objectif** : Sprints agiles + vue My Tasks cross-databases. +> **Doc** : [`NOTION_DATABASE_TASKS_GUIDE.md` Phase 5](docs/NOTION_DATABASE_TASKS_GUIDE.md#14-plan-implémentation) + +- [ ] **Tables `sprints`, `sprint_pages`** — sprints agiles +- [ ] **API sprints** — CRUD + assignation pages, vélocité +- [ ] **Sprint board** — Current Sprint / Planning / Backlog +- [ ] **Burndown chart** — vélocité, points complétés vs restants +- [ ] **My Tasks** — agrégation cross-databases (toutes les task DBs) +- [ ] **My Tasks API** — /my-tasks?view=all|today|overdue|upcoming +- [ ] **My Tasks UI** — groupes par collection, status badges, filtres + +### v4.6.0 — Content Blocks enrichis > **Objectif** : parité d'édition avec Notion. - [ ] **Callout blocks** — boîtes colorées (info, warning, tip, success) @@ -211,33 +270,17 @@ Propriétés custom, AI keywords, sync API, 12 tables DB - [ ] **Toggle lists** — contenu expandable/collapsible (déjà partiel) - [ ] **Multi-colonnes** — layout flexible (2, 3 colonnes) -### v4.2.0 — Export +### v4.7.0 — Export - [ ] **Export Markdown** — avec images et sous-pages (déjà partiel dans editor) - [ ] **Export PDF** — mise en page fidèle, table des matières - [ ] **Export HTML** — site statique standalone -### v4.3.0 — Collaboration +### v4.8.0 — Collaboration - [ ] **Inline comments** — commentaires sur sélection de texte - [ ] **@mentions** — notifier un utilisateur → page/commentaire - [ ] **Email notifications** — changements, mentions -### v4.4.0 — Embeds & Rich Media -- [ ] **Embeds** — YouTube, Figma, Google Maps, Twitter, etc. -- [ ] **Image lightbox** — clic pour agrandir, navigation -- [ ] **Bookmark cards** — aperçu riche des liens (OG metadata) - -### v4.5.0 — Kanban Adaptable -- [ ] Colonnes configurables par utilisateur -- [ ] Cartes configurables (choisir propriétés affichées) -- [ ] Couverture de carte (image, icône, couleur) -- [ ] WIP limits par colonne - -### v4.6.0 — Calendar & Meetings -- [ ] Vue Calendrier drag & drop -- [ ] Récurrence d'événements -- [ ] Template Meeting Notes - -### v4.7.0 — FlowDeck Agent (Agent IA natif) +### v4.9.0 — FlowDeck Agent (Agent IA natif) **Objectif :** Un agent IA intégré à FlowDeck, capable de planifier, rechercher et **agir** directement sur les workspaces — collections, pages, propriétés, vues, issues Gitea. Inspiré de Notion Agent (2026). @@ -312,22 +355,22 @@ app/ - Budget tokens max par conversation (500k tokens) - Timeout 5 minutes par run -### v4.8.0 — Command Palette & Recherche +### v5.0.0 — Command Palette & Recherche - [ ] **Command palette** — Ctrl+K / Ctrl+P recherche universelle - [ ] **Quick actions** — navigation, création, commandes -### v4.9.0 — Automations +### v5.1.0 — Automations - [ ] **Database automations** — if-this-then-that - [ ] **Buttons** — cliquables déclenchant actions -### v4.10.0 — Database Avancée +### v5.2.0 — Database Avancée - [ ] Inline databases dans n'importe quelle page - [ ] Templates de database (Project tracker, CRM…) - [ ] Validation des propriétés (required, unique, min/max) --- -## v5.0.0 — Pro (futur) +## v6.0.0 — Pro (futur) - [ ] **PWA** — Progressive Web App, offline support - [ ] **SSO/SAML** — enterprise authentication @@ -348,10 +391,10 @@ Base + Kanban Éditeur + Gitea UX Pro MVP Onboard + UI Notion + Tags + Admin + Sharing COMPLETED + GitHub OAuth + Library -v4.0.2 ✅ v4.1.0 ⬜ v4.2.0 ⬜ v4.3.0 ⬜ v4.4–4.7 ⬜ v5.0.0 ⬜ -Quality Blocks Export Collab Notion Pro -& Tests enrichis PDF/MD @mentions Parity (futur) - ⬜ v4.7.0: FlowDeck Agent (IA native) +v4.0.2 ✅ v4.1–4.5 ⬜ v4.6.0 ⬜ v4.7.0 ⬜ v4.8–4.9 ⬜ v5.x–v6.0 ⬜ +Quality Database + Content Export Collab + Pro + Agent +& Tests Views/Tasks Blocks PDF/MD Agent IA (futur) + 📚 NOTION_DATABASE_TASKS_GUIDE.md v2.0 ``` -*Dernière mise à jour: 2026-07-20 — v4.7.0 FlowDeck Agent ajouté, ARCHITECTURE.md v4.0 synchronisé* +*Dernière mise à jour: 2026-07-20 — Database/Views/Tasks phases ajoutées (v4.1–v4.5), NOTION_DATABASE_TASKS_GUIDE.md v2.0* diff --git a/docs/NOTION_DATABASE_TASKS_GUIDE.md b/docs/NOTION_DATABASE_TASKS_GUIDE.md index 3404f1b..ffc4c97 100644 --- a/docs/NOTION_DATABASE_TASKS_GUIDE.md +++ b/docs/NOTION_DATABASE_TASKS_GUIDE.md @@ -1,822 +1,772 @@ -# Guide Technique — Recréer Database & Tasks de Notion dans FlowDeck +# Guide Technique — Databases, Views & Tasks Notion → FlowDeck -> **Version:** 1.0 · **Date:** 2026-07-10 -> **Auteur:** Hermes-Deepin · **Cible:** FlowDeck v1.2+ +> **Version:** 2.0 · **Date:** 2026-07-20 +> **Auteur:** Hermes-Deepin · **Cible:** FlowDeck v4.0.x+ +> **Sources:** [Notion Help — Databases](https://www.notion.com/help/category/databases), [Database Views](https://www.notion.com/help/category/database-views), [Tasks & Dependencies](https://www.notion.com/help/tasks-and-dependencies), [Sprints](https://www.notion.com/help/sprints), [Data Sources](https://www.notion.com/help/data-sources-and-linked-databases), [docs/Guide_Complet_Notion_database.md](Guide_Complet_Notion_database.md) --- ## Table des matières -1. [Introduction](#introduction) -2. [Comprendre Notion : le modèle « Blocs & Collections »](#1-comprendre-notion--le-modèle-blocs--collections) -3. [La Database Notion : anatomie complète](#2-la-database-notion--anatomie-complète) -4. [Les Tasks Notion : un cas spécial de database](#3-les-tasks-notion--un-cas-spécial-de-database) -5. [Comment Notion connecte Database et Tasks](#4-comment-notion-connecte-database-et-tasks) -6. [Implémentation dans FlowDeck : plan pas à pas](#5-implémentation-dans-flowdeck--plan-pas-à-pas) -7. [Références](#6-références) +1. [Introduction : les 3 piliers Notion](#1-introduction) +2. [Anatomy d'une Database Notion](#2-anatomy-database) +3. [Les propriétés (Database Properties)](#3-propriétés) +4. [Les relations et rollups](#4-relations-rollups) +5. [Les formules (Formulas)](#5-formules) +6. [Templates de database](#6-templates) +7. [Les Database Views (10 types)](#7-views) +8. [Filtres, tris & regroupements](#8-filtres-tris-groupes) +9. [Data Sources & Linked Databases](#9-data-sources) +10. [Tasks, Sub-items, Dependencies & Sprints](#10-tasks) +11. [My Tasks — vue unifiée](#11-my-tasks) +12. [Dashboards](#12-dashboards) +13. [Modèle de données FlowDeck](#13-modèle-de-données) +14. [Plan d'implémentation (5 phases)](#14-plan-implémentation) +15. [Limites Notion à respecter](#15-limites) +16. [Références](#16-références) --- -## Introduction +## 1. Introduction : les 3 piliers Notion {#1-introduction} -L'objectif est de **recréer dans FlowDeck** les deux fonctionnalités les plus puissantes de Notion : - -- **Les Databases** — tables structurées avec propriétés typées, vues multiples, filtres et tris -- **Les Tasks** — sous-tâches hiérarchiques avec dépendances, liées aux databases - -Ces deux systèmes sont **profondément interconnectés** dans Notion : les tâches ne sont qu'une forme spécialisée de database, avec un parent auto-référencé et des propriétés de dépendance. - -### État actuel de FlowDeck (v1.2) - -FlowDeck a déjà une base solide : +Notion repose sur 3 concepts fondamentaux interconnectés : ``` -✅ Boards (Kanban lié à Gitea) → table `boards` -✅ Cards (issues → colonnes) → table `cards` -✅ Colonnes custom → `project_properties` + `property_values` -✅ Checklists par issue → `checklists` + `checklist_items` -✅ Vues multiples → Kanban, Table, Status, TeamLoad, Detailed -✅ Notes Markdown → `notes` -✅ Pages (ébauche Notion editor) → `pages` (content, parent_id, sort_order, content_format) -⚠️ Database concept → ABSENT (pas de notion de collection/row) -❌ Relations entre projets → ABSENT -❌ Sub-tasks / Parent-item → ABSENT -❌ Rollups / Formules → ABSENT -❌ Dependencies (bloque/bloqué par) → ABSENT +┌─────────────────────────────────────────────────────────────────┐ +│ NOTION │ +│ │ +│ ┌─────────────────────┐ ┌─────────────────────┐ │ +│ │ DATABASES │ │ DATABASE VIEWS │ │ +│ │ │ │ │ │ +│ │ • Collections de │ │ • 10 types de vues │ │ +│ │ pages │ │ • Filtres/Tris/ │ │ +│ │ • Propriétés typées │ │ Groupes │ │ +│ │ • Relations/Rollups │ │ • Layouts & │ │ +│ │ • Formules │ │ Dashboards │ │ +│ │ • Templates │ │ • Charts/Graphiques │ │ +│ └──────────┬──────────┘ └──────────┬──────────┘ │ +│ │ │ │ +│ └────────┬───────────────┘ │ +│ ▼ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ TASKS │ │ +│ │ • Sub-items (parent_id auto-référencé) │ │ +│ │ • Dependencies (bloque/bloqué par) │ │ +│ │ • Sprints (planification agile) │ │ +│ │ • My Tasks (vue unifiée cross-databases) │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────────┘ +``` + +### État actuel FlowDeck (v4.0.x) + +``` +✅ Workspaces → workspaces, workspace_members +✅ Pages + Arbre → pages (parent_id, sort_order) +✅ Block Editor → content_format='blocks', JSON blocks +✅ Sidebar Notion → Recents, Favorites, Shared, Published, Private +✅ Library multi-onglets → library.html + /api/library/* +✅ Share / Publish → page_shares, share_mode, publish_slug +✅ Recents tracking → recents table +✅ Tags → tags, page_tags +✅ Gitea / GitHub OAuth → auth_method, OAuth tokens +⚠️ Collections (ébauche) → collections, collection_pages +⚠️ Collection Properties (ébauche) → collection_properties (21 types définis) +⚠️ Collection Views (ébauche) → collection_views (structure partielle) +❌ Database multi-sources → ABSENT (data_sources concept) +❌ Full-page vs Inline databases → ABSENT +❌ Charts, Forms, Maps, Feed → ABSENT +❌ Dashboards → ABSENT (combinaison de vues) +❌ Templates de database → ABSENT (database_templates ébauche) +❌ Tasks / Sub-items → ABSENT +❌ Dependencies / Sprints → ABSENT +❌ My Tasks (cross-DB unifié) → ABSENT (/my-tasks ébauche statique) ``` --- -## 1. Comprendre Notion : le modèle « Blocs & Collections » +## 2. Anatomy d'une Database Notion {#2-anatomy-database} -### 1.1 Le principe fondateur : « Everything is a Block » +### 2.1 Concept fondamental -Dans Notion, **chaque élément de contenu est un bloc**. Un bloc peut être : +Une **Database Notion** est une **collection de pages**, chaque ligne/élément étant une **page Notion complète** — ouvrable et éditable comme n'importe quelle page (texte, images, sous-pages, embeds…). + +| Concept | Définition | +|---------|-----------| +| **Database** | Conteneur global : 1+ data sources + 1+ vues | +| **Data source** | Un ensemble de pages liées. Chaque DB a ≥ 1 source | +| **Page / Item** | Une ligne = une page Notion complète, éditable | +| **Property** | Champ de métadonnées (date, statut, personne…) | +| **View** | Fenêtre d'affichage sur les données (table, board, etc.) | + +### 2.2 Full-page vs Inline + +| Type | Comportement | +|------|-------------| +| **Full-page** | Apparaît comme une page dans la sidebar, peut être verrouillée | +| **Inline** | Intégrée dans une page existante, contrôles masqués au survol, peut être étendue | + +**Transformations :** +- Inline → Full-page : cliquer sur **⤡** (étendre) ou glisser vers la sidebar +- Full-page → Inline : glisser dans une autre page → `⋮⋮` → Turn into inline + +### 2.3 Création d'une database + +1. **New page** → sous *Get started with*, sélectionner **Table** (ou `•••` → Database) +2. **Slash command** : `/database` dans une page existante +3. **Options** : New empty / Link to existing data / Build with AI / Template + +**Premières étapes :** +1. Créer une page → bouton **New page** +2. Ajouter une propriété → **Add property** +3. Ajouter une vue → par défaut Table view, puis autant que souhaité +4. Éditer la vue → nom, layout, propriétés visibles, filtres, tris, groupes + +--- + +## 3. Les propriétés (Database Properties) {#3-propriétés} + +### 3.1 Types disponibles (20 types) + +| # | Propriété | Usage | Value format | +|---|-----------|-------|-------------| +| 1 | **Text** | Texte formaté (notes, descriptions) | String | +| 2 | **Number** | Nombre, format devise ou barre de progression | Float + format | +| 3 | **Select** | Une option parmi une liste de tags | String | +| 4 | **Status** | Progression : To-do, In Progress, Complete | String | +| 5 | **Multi-Select** | Plusieurs tags/catégories | Array[String] | +| 6 | **Date** | Date ou plage de dates (heure optionnelle) | ISO 8601 / range | +| 7 | **Formula** | Calculs basés sur d'autres propriétés | Expression → Dynamic | +| 8 | **Relation** | Connexion entre databases | FK référence | +| 9 | **Rollup** | Agrégation d'infos via une relation | Dynamic (count/sum/avg…) | +| 10 | **Person** | Assigner une personne/groupe | User ref | +| 11 | **File** | Upload de fichiers et images | File metadata | +| 12 | **Checkbox** | Booléen | Boolean | +| 13 | **URL** | Lien web cliquable | String (URL) | +| 14 | **Email** | Adresse email (ouvre client mail) | String (email) | +| 15 | **Phone** | Numéro de téléphone | String (phone) | +| 16 | **Created time** | Auto-généré, non éditable | Timestamp | +| 17 | **Created by** | Auto-généré, non éditable | User ref | +| 18 | **Last edited time** | Auto-mis à jour | Timestamp | +| 19 | **Last edited by** | Auto-mis à jour | User ref | +| 20 | **Button** | Automatiser des actions (v5.0) | Action config | +| 21 | **ID** | Identifiant unique, immuable | Auto-incrément | +| 22 | **Place** | Localisation (services, nom, adresse) | Geo + text | + +> ⚠️ Limite : 500 propriétés max par database. + +### 3.2 Gestion des propriétés + +- **Créer** : `Add property` ou `+` à droite → nom + type +- **Éditer** : menu ⚙️ → Edit properties +- **Masquer** : cliquer l'icône 👁️ +- **Réordonner** : drag & drop +- **Dupliquer** : `•••` → Duplicate property (ne duplique pas les valeurs) +- **Supprimer** : supprime définitivement la propriété et toutes ses valeurs + +--- + +## 4. Relations & Rollups {#4-relations-rollups} + +### 4.1 Relations + +Une **relation** connecte les pages de deux databases (ou d'une database à elle-même). ``` -┌──────────────────────────────────────┐ -│ BLOC │ -│ ├─ id: UUID │ -│ ├─ type: "paragraph" │ -│ │ "heading_1" │ -│ │ "to_do" │ -│ │ "bulleted_list_item" │ -│ │ "child_page" │ -│ │ "child_database" │ -│ │ "collection_view_page" │ ← Database -│ │ ... │ -│ ├─ content: [...] (blocs enfants) │ -│ ├─ properties: {} (metadata) │ -│ └─ parent: {type, id} │ -└──────────────────────────────────────┘ +┌──────────────────────┐ ┌──────────────────────┐ +│ Customers │ │ Deals │ +│ │────────▶│ │ +│ id, name, email │ related │ id, amount, stage │ +│ │◀────────│ │ +└──────────────────────┘ └──────────────────────┘ ``` -### 1.2 Les 3 couches d'une Database Notion +**Config :** +- **1-way** (par défaut) ou **2-way** (bidirectionnelle) +- **Limit** : nombre de pages liées (1 ou illimité) +- **Property visibility** : Always show / Hide when empty / Always hide +- **Relation vers soi-même** : ex. tâches liées entre elles (dependencies) -Une database Notion est un assemblage de **3 concepts distincts** : +### 4.2 Rollups + +Un **rollup** agrège les données issues d'une relation selon une fonction : + +| Fonction | Description | +|----------|-------------| +| `count` | Nombre d'éléments liés | +| `count values` | Nombre de valeurs non vides | +| `count unique values` | Nombre de valeurs uniques | +| `count empty` | Nombre de valeurs vides | +| `percent empty` | % de valeurs vides | +| `percent not empty` | % de valeurs non vides | +| `sum` | Somme | +| `average` | Moyenne | +| `min` / `max` | Valeur min / max | +| `range` | Intervalle (max - min) | +| `earliest date` / `latest date` | Date la plus ancienne / récente | +| `show original` | Affiche la valeur brute | + +> ⚠️ **Pas de rollup d'un rollup** (anti-boucle). + +--- + +## 5. Formules (Formulas) {#5-formules} + +Une propriété **Formula** exécute des calculs via le langage de formules Notion. + +### 5.1 Éléments du langage ``` -┌────────────────────────────────────────────────────────────┐ -│ DATABASE NOTION │ -│ │ -│ ┌─────────────┐ ┌──────────────────┐ ┌────────────┐│ -│ │ COLLECTION │ │ COLLECTION_VIEW │ │ PAGES ││ -│ │ (schema) │◄───│ (présentation) │◄───│ (data) ││ -│ │ │ │ │ │ ││ -│ │ properties │ │ type: table │ │ row 1 ││ -│ │ - Name │ │ board │ │ row 2 ││ -│ │ - Status │ │ calendar │ │ row 3 ││ -│ │ - Priority │ │ gallery │ │ ... ││ -│ │ - Due Date │ │ list │ │ ││ -│ │ - Assignee │ │ timeline │ │ ││ -│ │ │ │ │ │ ││ -│ │ │ │ filters │ │ ││ -│ │ │ │ sorts │ │ ││ -│ │ │ │ grouping │ │ ││ -│ │ │ │ format options │ │ ││ -│ └─────────────┘ └──────────────────┘ └────────────┘│ -│ │ -│ 1 SCHÉMA N VUES (filtres N LIGNES │ -│ partagé + tris différents) (pages filles) │ -└────────────────────────────────────────────────────────────┘ +Properties : prop("Nom") +Math : + - * / % ^ +Booléens : true, false +Comparaison : ==, !=, <, <=, >, >= +Logiques : and, or, not +Ternaire : X ? Y : Z (équivaut à if(X, Y, Z)) ``` -**Concept clé** : Une database n'est PAS une table SQL. C'est une **collection de pages**, chaque page ayant un schéma de propriétés commun, affiché via des vues configurables. +### 5.2 Fonctions courantes -### 1.3 Le cycle de vie d'une Database +`if()`, `ifs()`, `empty()`, `length()`, `substring()`, `contains()`, `replace()`, `lower()`, `upper()`, `style()`, `format()`, `formatDate()`, `now()`, `today()`, `dateAdd()`, `dateBetween()`, `.first()`, `.last()`, `.every()`, `.filter()`, `.map()`, `.at()`, `round()`, `ceil()`, `floor()`, `min()`, `max()`, `sum()`, `mean()`, `median()`, `join()`, `toNumber()`, `toString()`, `concat()`, `id()`, `let()`… -``` -Création Consultation Modification -───────── ──────────── ──────────── +### 5.3 Exemples -1. L'utilisateur choisit 4. Les vues lisent le 7. Édition inline : - un type de vue schéma + les pages - click → édite valeur - (table, board...) - drag → réorganise - 5. Filtres/sorts/tri - shortcuts → ajoute ligne -2. Notion crée : appliqués - - 1 Collection 8. Changement de vue = - - 1 CollectionView 6. Rendu en temps réel même données, - - 1 CollectionViewPage autre présentation - - + pages vides optionnelles - 9. Ajout propriété = -3. L'utilisateur définit nouveau champ sur - les propriétés (schéma) TOUTES les pages +```notion +// Due date = date de début + 2 semaines +dateAdd(Start Date, 2, "week") +// Marquer "Overdue" en rouge/gras si dépassé et non terminé +if(and(now() > Due Date, Status != "Done"), style("Overdue", "red", "b"), "") + +// Nombre de tâches liées +Tasks.length() + +// Priorité calculée à partir de l'impact et l'effort +if(and(Impact == "High", Effort == "Low"), "🔥 Quick win", "Normal") + +// Calcul du CA journalier +prop("Prix unitaire") * prop("Quantité") ``` --- -## 2. La Database Notion : anatomie complète +## 6. Templates de database {#6-templates} -### 2.1 Propriétés (le schéma) +Permettent de répliquer une structure de page en un clic. -Notion supporte **21 types de propriétés**. Toutes sont définies au niveau de la Collection : +**Créer :** +1. Flèche déroulante à côté de **New** → **+ New template** +2. Nommer le template +3. Prédéfinir propriétés (ex. Priority = P1) et contenu (texte, images, embeds) -``` -Type │ Description │ Exemple de valeur -──────────────────┼────────────────────────────┼────────────────── -Title │ Le titre de la page (obligatoire, unique) -Text │ Texte libre │ "Description..." -Number │ Nombre (décimales, format) │ 42 / 12.5% -Select │ Choix unique │ "En cours" -Multi-select │ Choix multiples │ ["Frontend","Backend"] -Status │ Select avec couleur forcée │ "Done" (vert) -Date │ Date + heure optionnelle │ 2026-07-15 -Person │ Mention utilisateur │ ["bruno"] -Files & media │ Uploads │ [url1, url2] -Checkbox │ Booléen │ true / false -URL │ Lien cliquable │ "https://..." -Email │ Email cliquable │ "a@b.com" -Phone │ Téléphone cliquable │ "+1..." -Formula │ Calcul (JS-like) │ prop("Prix")*prop("Qté") ← CLÉ -Relation │ Lien vers autre database │ [page_id_1, page_id_2] ← CLÉ -Rollup │ Agrégation via relation │ sum, avg, count, min, max ← CLÉ -Created time │ Date de création (auto) │ 2026-01-15T10:30:00Z -Created by │ Auteur (auto) │ "bruno" -Last edited time │ Dernière édition (auto) │ 2026-07-09T18:00:00Z -Last edited by │ Dernier éditeur (auto) │ "bruno" -Unique ID │ ID incrémental (auto) │ 42 -Button │ Déclenche action (nouveau) │ — -AI Summary │ Résumé AI (nouveau) │ "Ce projet..." -``` +**Fonctionnalités :** +- **Récurrence** : quotidienne, hebdomadaire, mensuelle, annuelle +- **Nesting max** : 3 niveaux (sauf template quotidien → pas de nesting) -### 2.2 Views (les vues) - -Une database peut avoir **N vues**, chaque vue avec : - -``` -┌─────────────────────────────────────────┐ -│ Vue "Kanban" │ -│ ├─ type: board │ -│ ├─ group_by: "Status" │ ← Groupement -│ ├─ filter: {Status ≠ "Archivé"} │ ← Filtres -│ ├─ sort: [Due Date ASC, Priority DESC] │ ← Tris -│ ├─ visible_properties: [Name, Assignee, Due Date] │ -│ ├─ card_size: medium │ -│ └─ cover_image_property: "Files" │ -└─────────────────────────────────────────┘ -``` - -**6 types de vues :** - -| Vue | Usage | Particularité | -|-----|-------|---------------| -| **Table** | Liste classique | Colonnes = propriétés | -| **Board** | Kanban | Groupé par propriété Select/Status | -| **Timeline** | Gantt | Axe X = propriété Date | -| **Calendar** | Calendrier | Groupé par propriété Date (jour/semaine/mois) | -| **Gallery** | Cartes visuelles | Cover image + preview | -| **List** | Liste compacte | Comme table mais 1 colonne + preview | - -**Filtres avancés :** - -``` -Filtre 1 : Status IS "En cours" → filtre simple -Filtre 2 : Due Date IS BEFORE "today" → filtre date -Filtre 3 : Priority CONTAINS "P1" → filtre multi-select -Groupe : AND / OR entre les filtres -Sous-groupe : (FiltreA OR FiltreB) AND FiltreC -``` - -### 2.3 Relations et Rollups (les super-pouvoirs) - -C'est LE mécanisme qui rend Notion puissant : - -``` -┌─────────────────────┐ ┌──────────────────────┐ -│ DATABASE A │ │ DATABASE B │ -│ « Projets » │ │ « Tâches » │ -│ │ │ │ -│ ┌─────────────┐ │ relation│ ┌──────────────┐ │ -│ │ Nom │ │◄───────►│ │ Titre │ │ -│ │ Description │ │ │ │ Priorité │ │ -│ │ Statut │ │ │ │ Projet ──────┼──┐ │ -│ └─────────────┘ │ │ │ Assignee │ │ │ -│ │ │ └──────────────┘ │ │ -│ │ │ │ │ -│ ROLLUP « Nb tâches»│◄────────┼─── count(Tâches) │ │ -│ ROLLUP « Avancement│◄────────┼─── avg(%Complété) │ │ -│ ROLLUP « Prochaine │◄────────┼─── min(Due Date) │ │ -└─────────────────────┘ └───────────────────┘──┘ -``` - -**Relation** = pointeur bidirectionnel entre pages de 2 databases différentes -**Rollup** = agrégation (COUNT, SUM, AVG, MIN, MAX, RANGE, UNIQUE) sur une propriété de la database liée +> ⚠️ Templates propres à chaque database. Ne pas pré-remplir les relations dans un template (sinon toutes les pages pointeront sur la même cible). --- -## 3. Les Tasks Notion : un cas spécial de database +## 7. Les Database Views {#7-views} -### 3.1 Architecture des tâches +Une **vue** est une fenêtre d'affichage sur les données. Chaque vue possède ses propres filtres, tris, groupes et propriétés visibles — **indépendants** de la database source. -Contrairement à ce qu'on pourrait penser, **Notion n'a pas de module « Tasks » séparé**. +### 7.1 Les 10 types de vues -``` -Les tâches sont simplement des PAGES dans une DATABASE -qui possède des propriétés spécifiques de type tâche. -``` +| # | Vue | Idéal pour | Caractéristique | +|---|-----|-----------|-----------------| +| 1 | **Table** | Données structurées, aperçu complet | Lignes × colonnes, calculs en bas de colonne | +| 2 | **Board (Kanban)** | Workflows, gestion de tâches | Colonnes regroupées par propriété, cartes | +| 3 | **Timeline** | Planification, dépendances | Chronologie horizontale type Gantt | +| 4 | **Calendar** | Événements, deadlines | Basé sur propriété Date, vues jour/semaine/mois | +| 5 | **List** | Notes, docs, lecture simple | Minimaliste et épurée | +| 6 | **Gallery** | Moodboards, portfolios | Cartes visuelles avec aperçu image | +| 7 | **Chart** | Analyse, reporting | Barres, courbes, camemberts, donuts, scatter | +| 8 | **Form** | Collecte de données, sondages | Formulaire de saisie → crée pages | +| 9 | **Map** | Lieux, adresses | Géolocalisation (propriété Place) | +| 10 | **Feed** | Mises à jour, annonces | Flux de contenu type actualité | -Voici comment Notion les distingue : +### 7.2 Ajouter une vue -``` -┌─────────────────────────────────────────────────────────────┐ -│ DATABASE « Tasks » (ou n'importe quelle DB) │ -│ │ -│ Propriétés « tâche » │ Propriétés « standard » │ -│ ────────────────────────── │ ────────────────────────── │ -│ ✅ Sub-item (parent) │ • Titre (obligatoire) │ -│ ✅ Dependencies (bloque) │ • Status (Select) │ -│ ✅ Due Date │ • Priority (Select) │ -│ ✅ Assignee │ • Tags (Multi-select) │ -│ ✅ Reminder │ • ... │ -│ │ -│ La magie : ces propriétés SONT la database. │ -│ Pas de modèle « Task » séparé. │ -└─────────────────────────────────────────────────────────────┘ -``` +1. Cliquer **+** à côté des onglets de vues existants +2. Choisir le type de layout +3. Donner un nom +4. Configurer : propriétés visibles, filtres, tris, groupes, layout -### 3.2 Sub-items (sous-tâches) +### 7.3 Layouts personnalisables -Les sous-tâches utilisent une **relation auto-référencée** : - -``` -┌──────────────────────────────────────┐ -│ Table « tasks » (dans la DB) │ -│ │ -│ id │ title │ parent_id │ -│ ───┼────────────────┼───────────────│ -│ 1 │ Refonte UI │ NULL │ ← Tâche parent -│ 2 │ Nouveau header │ 1 │ ← Sous-tâche de 1 -│ 3 │ Dark mode │ 1 │ ← Sous-tâche de 1 -│ 4 │ Tests header │ 2 │ ← Sous-sous-tâche de 2 -│ 5 │ Déploiement │ NULL │ ← Autre tâche parent -│ │ -│ Propriétés spéciales : │ -│ ├─ « Sub-item » = relation vers │ -│ │ la même database │ -│ └─ « Parent item » = l'inverse │ -│ (auto-créé par Notion) │ -└──────────────────────────────────────┘ -``` - -**Comment ça fonctionne techniquement :** - -1. L'utilisateur active « Sub-items » dans une database -2. Notion crée automatiquement 2 propriétés de type **Relation** pointant vers la même database : - - `Sub-item` (relation → même DB) - - `Parent item` (relation inverse, auto-générée) -3. Dans l'interface Kanban, les sous-tâches apparaissent imbriquées sous le parent -4. La récursion est illimitée (tâche → sous-tâche → sous-sous-tâche → ...) - -### 3.3 Dependencies (dépendances) - -Les dépendances bloquantes sont une **seconde relation auto-référencée** : - -``` -┌──────────────────────────────────────┐ -│ Relation « Bloque » │ -│ │ -│ Tâche A ──bloque──► Tâche B │ -│ Tâche B ──bloquée par──► Tâche A │ -│ │ -│ Règles métier : │ -│ ├─ B ne peut pas être « Done » │ -│ │ tant que A n'est pas « Done » │ -│ ├─ Si A est déplacée, B suit │ -│ │ (optionnel, selon config) │ -│ └─ Timeline affiche les flèches │ -│ A ────────► B │ -└──────────────────────────────────────┘ -``` - -### 3.4 La vue « My Tasks » (vue agrégée) - -La killer feature de Notion : un dashboard qui regroupe TOUTES les tâches, peu importe leur database d'origine. - -``` -┌──────────────────────────────────────────────────┐ -│ MY TASKS │ -│ ┌───────────────────────────────────────────┐ │ -│ │ Projet Alpha ┌──────────────────────┐│ │ -│ │ ├─ Design maquette│ Assignee: Bruno ││ │ -│ │ └─ Tests UI │ Due: 15 juillet ││ │ -│ │ └──────────────────────┘│ │ -│ │ Projet Beta │ │ -│ │ ├─ API endpoint │ │ -│ │ └─ Documentation │ │ -│ │ Daily Tasks │ │ -│ │ └─ Réunion standup │ │ -│ └───────────────────────────────────────────┘ │ -│ │ -│ Agrège TOUTES les databases ayant : │ -│ ├─ Une propriété « Person » = current user │ -│ └─ Un Status ≠ « Done » │ -└──────────────────────────────────────────────────┘ -``` - -**Fonctionnement interne :** - -1. Notion scanne TOUTES les databases du workspace -2. Filtre les pages où `Assignee = current_user` ET `Status ≠ Done/Completed` -3. Regroupe par database d'origine (ou par projet parent) -4. Affiche avec tri par `Due Date` ASC -5. Cette vue est **read-only logique** (pas une vraie database) +Chaque vue possède des options de **layout** : +- **Card size** : small / medium / large (board, gallery) +- **Card preview** : page cover / page content / none +- **Properties** : choisir lesquelles afficher sur les cartes +- **Open pages in** : center peek / side peek / full page --- -## 4. Comment Notion connecte Database et Tasks +## 8. Filtres, tris & regroupements {#8-filtres-tris-groupes} -### 4.1 Le diagramme de dépendance conceptuel +### 8.1 Filtres +Affichent uniquement les éléments correspondant à des critères. + +**Structure :** ``` - DATABASE (concept racine) - │ - ┌──────────────┼──────────────┐ - ▼ ▼ ▼ - COLLECTION PAGES (rows) COLLECTION_VIEWS - (schéma) │ (présentations) - │ │ │ - │ ├─ Title ├─ Table - ├─ Text ├─ Properties ├─ Board - ├─ Select │ (valeurs ├─ Calendar - ├─ Date │ par page) ├─ Timeline - ├─ Person │ ├─ Gallery - ├─ Relation ────┼──► SELF └─ List - │ └── Sub-items │ ┌── Parent - │ └── Deps │ └── Blocked by - ├─ Rollup ←──────┼──┘ (count, sum, avg via relation) - ├─ Formula │ - └─ ... │ - │ - ┌──────┴──────┐ - │ TASKS │ (surcouche métier) - │ │ - │ Ne sont PAS │ - │ un modèle │ - │ séparé — │ - │ ce sont des │ - │ PAGES avec │ - │ propriétés │ - │ spécifiques │ - └─────────────┘ +┌─ Filter group (AND) +│ ├─ Status = "In Progress" +│ ├─ Due Date is within this week +│ └─ Filter group (OR) +│ ├─ Priority = "P1" +│ └─ Priority = "P2" ``` -### 4.2 Les invariants du modèle +**Opérateurs disponibles :** `is`, `is not`, `contains`, `does not contain`, `starts with`, `ends with`, `is empty`, `is not empty`, `is before`, `is after`, `is within`, `is today`, `is this week` -1. **Une database = 1 Collection** (schéma de propriétés) -2. **1 Collection = N CollectionViews** (vues) -3. **1 CollectionView = 1 type** (table | board | calendar | timeline | gallery | list) -4. **Les pages d'une database sont des blocs** (comme toute page Notion) -5. **Une propriété « Relation » pointe vers une autre database** (pas une table SQL) -6. **Une propriété « Rollup » agrège via une Relation existante** -7. **Les sub-items sont une Relation auto-référencée** -8. **Les dépendances sont une Relation auto-référencée avec contrainte métier** +### 8.2 Tris + +Ordonnent les éléments. Multi-niveaux (ex. trier par Status ASC puis Due Date DESC). + +### 8.3 Regroupements (Groups) + +Regroupent visuellement les éléments par propriété : +- **Group** (principal), **Sub-group** (secondaire, surtout en board) +- Exemples : par Status, par Assignee, par Date (mois/semaine) --- -## 5. Implémentation dans FlowDeck : plan pas à pas +## 9. Data Sources & Linked Databases {#9-data-sources} -### 5.1 Phase 1 — Le concept de Database (semaine 1) +### 9.1 Concept -**Objectif :** Abstraire le concept de « board Gitea » en « database » réutilisable. +Chaque database a ≥ 1 **data source**. Une database peut en regrouper **plusieurs**. -#### Nouvelle table : `collections` +``` +┌──────────────────────────────────────────────────────────┐ +│ DATABASE (CRM tout-en-un) │ +│ │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ Contacts │ │Entreprises│ │ Deals │ │Activités │ │ +│ │ (source) │ │ (source) │ │ (source) │ │ (linked) │ │ +│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ +└──────────────────────────────────────────────────────────┘ +``` + +### 9.2 Databases liées + +Une **linked database** est une copie d'une database existante qui : +- Peut avoir ses propres vues/filtres/tris/**sans affecter l'originale** +- Mais l'édition du contenu/titres/propriétés **est répercutée** sur la source +- L'accès respecte celui de la database originale + +--- + +## 10. Tasks, Sub-Items, Dependencies & Sprints {#10-tasks} + +### 10.1 Task Database + +Une database standard avec des **propriétés obligatoires** : +- **Status** (To-do, In Progress, Done) +- **Assignee** (Person) +- **Due Date** (Date) + +**Activation :** ⚙️ → More settings → **Turn into Tasks** + +Effets : +- Les tâches assignées apparaissent dans **My Tasks** (widget Home) +- Propriété **ID** auto-générée (format `TASK-123`) +- URL directe : `notion.so/TASK-123` +- Fonctionnalités Sprints débloquées + +### 10.2 Sub-items + +Permettent de découper une tâche en sous-tâches, visibles dans toutes les vues. + +**Activation :** ⚙️ → More settings → Sub-items → Turn on + +**Modes d'affichage :** +- **Nested in toggle** — arborescence pliable (défaut) +- **Flattened list** — liste plate indentée +- **Card property** — affichée sur la carte parente + +**Filtres :** Parents only / Parents and sub-items / Sub-items only + +### 10.3 Dependencies + +Relient les tâches de façon linéaire (`A bloque B`). + +**Calendrier automatique :** +- Shift only when dates overlap +- Shift & maintain time between items +- Do not automatically shift + +**Éviction des week-ends** : configurable. + +### 10.4 Sprints + +Nécessitent une **Task database** préalable. + +**Activation :** ⚙️ → More settings → Sprints → Turn on sprints + +**Éléments :** +- **Sprint board** : 3 colonnes (Current Sprint / Sprint planning / Backlog) +- **Sprints database** : vue globale + Timeline +- **Réglages** : durée (1-8 semaines), jour de début, gestion incomplètes, complétion auto +- **Vélocité** : suivi de la capacité de l'équipe + +--- + +## 11. My Tasks — vue unifiée {#11-my-tasks} + +### 11.1 Qu'est-ce que My Tasks ? + +**My Tasks** agrège **toutes les tâches assignées à l'utilisateur** à travers **toutes les databases** du workspace, dans une vue unique. + +Pas besoin de naviguer dans chaque database pour trouver ses tâches — tout est consolidé. + +### 11.2 Fonctionnement + +1. Une database est marquée comme **Task database** +2. L'utilisateur est assigné à certaines pages (propriété **Person**) +3. Ces pages apparaissent automatiquement dans **My Tasks** +4. Filtrage possible : aujourd'hui, overdue, next 7 days, par collection + +### 11.3 Interface + +``` +┌─────────────────────────────────────────────┐ +│ 📋 My Tasks │ +│ │ +│ [All] [Today] [Overdue] [Next 7 days] │ +│ │ +│ ── Collection A (3) ── │ +│ ┌──────────────────────────────────────────┐ │ +│ │ 📋 Tâche 1 ⏳ In Progress 15 juil │ │ +│ │ 📋 Tâche 2 ✅ Done 10 juil │ │ +│ │ 📋 Tâche 3 📝 Todo — │ │ +│ └──────────────────────────────────────────┘ │ +│ │ +│ ── Collection B (1) ── │ +│ ┌──────────────────────────────────────────┐ │ +│ │ 📋 Tâche 4 🚀 P1 20 juil │ │ +│ └──────────────────────────────────────────┘ │ +│ │ +│ 4 tasks across 2 collections │ +└─────────────────────────────────────────────┘ +``` + +### 11.4 API nécessaire + +``` +GET /my-tasks?view=all|today|overdue|upcoming&days=7 +→ Retourne toutes les pages de type tâche assignées à l'utilisateur +→ Groupées par collection +→ Avec statut, due date, priorité +``` + +--- + +## 12. Dashboards {#12-dashboards} + +Transforment une database en **tableau de bord** centralisé en combinant plusieurs vues/widgets sur une même page. + +``` +┌──────────────────────────────────────────────────────────┐ +│ DASHBOARD — Suivi Projet │ +│ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ +│ │ 📊 Chart │ │ 📊 Chart │ │ 📋 Board (Kanban) │ │ +│ │ Burn-down │ │ Status │ │ Current Sprint │ │ +│ │ │ │ répartition │ │ │ │ +│ └─────────────┘ └─────────────┘ └─────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────┐ │ +│ │ 📅 Calendar — Échéances du mois │ │ +│ └─────────────────────────────────────────────────────┘ │ +└──────────────────────────────────────────────────────────┘ +``` + +--- + +## 13. Modèle de données FlowDeck {#13-modèle-de-données} + +### 13.1 Tables existantes (v4.0) — à conserver ```sql +-- Collections (existantes, à enrichir) CREATE TABLE collections ( id INTEGER PRIMARY KEY AUTOINCREMENT, + workspace_id INTEGER REFERENCES workspaces(id), name TEXT NOT NULL, description TEXT DEFAULT '', icon TEXT DEFAULT '📋', - - -- Peut être liée à un projet Gitea (optionnel) + schema_json TEXT NOT NULL DEFAULT '[]', -- propriétés gitea_owner TEXT, gitea_repo TEXT, - - -- Schéma de propriétés en JSON (flexible, évolutif) - schema_json TEXT NOT NULL DEFAULT '[]', - -- Format: [{"name":"Status","type":"select","options":["Todo","Done"],"position":0}, ...] - + is_locked BOOLEAN NOT NULL DEFAULT 0, + is_inline BOOLEAN NOT NULL DEFAULT 0, + parent_page_id INTEGER REFERENCES collection_pages(id), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + created_by INTEGER REFERENCES users(id), + UNIQUE(workspace_id, name) ); -``` -#### Nouvelle table : `collection_pages` (remplace `cards`) - -```sql +-- Pages dans une collection CREATE TABLE collection_pages ( id INTEGER PRIMARY KEY AUTOINCREMENT, collection_id INTEGER NOT NULL REFERENCES collections(id) ON DELETE CASCADE, - - -- Peut être liée à une issue Gitea + title TEXT NOT NULL DEFAULT '', + icon TEXT DEFAULT '📄', + position INTEGER NOT NULL DEFAULT 0, + parent_id INTEGER REFERENCES collection_pages(id), -- sub-items gitea_issue_id INTEGER, gitea_issue_number INTEGER, - - -- Titre de la page (obligatoire) - title TEXT NOT NULL DEFAULT '', - - -- Position dans la collection - position INTEGER NOT NULL DEFAULT 0, - - -- Sub-items (auto-référence) - parent_id INTEGER REFERENCES collection_pages(id), - - -- Valeurs des propriétés en JSON - property_values_json TEXT NOT NULL DEFAULT '{}', - -- Format: {"Status":"Done","Priority":"P1","DueDate":"2026-07-15"} - - -- Métadonnées temporelles + property_values_json TEXT NOT NULL DEFAULT '{}', -- valeurs des propriétés created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + created_by INTEGER REFERENCES users(id), + updated_by INTEGER REFERENCES users(id) ); -CREATE INDEX idx_cp_collection ON collection_pages(collection_id, position); -CREATE INDEX idx_cp_parent ON collection_pages(parent_id); -CREATE INDEX idx_cp_gitea ON collection_pages(gitea_issue_id); -``` - -#### Nouvelle table : `collection_views` - -```sql +-- Vues d'une collection CREATE TABLE collection_views ( id INTEGER PRIMARY KEY AUTOINCREMENT, collection_id INTEGER NOT NULL REFERENCES collections(id) ON DELETE CASCADE, - name TEXT NOT NULL DEFAULT 'Default View', - view_type TEXT NOT NULL DEFAULT 'table', -- table, board, calendar, timeline, gallery, list - - -- Configuration JSON + view_type TEXT NOT NULL DEFAULT 'table', config_json TEXT NOT NULL DEFAULT '{}', - -- Format: - -- { - -- "group_by": "Status", ← board/calendar uniquement - -- "filters": [ ← tous types - -- {"property":"Status","operator":"is_not","value":"Done"}, - -- {"property":"DueDate","operator":"is_before","value":"today"} - -- ], - -- "filter_conjunction": "and", ← "and" | "or" - -- "sorts": [ ← tous types - -- {"property":"Priority","direction":"asc"}, - -- {"property":"DueDate","direction":"desc"} - -- ], - -- "visible_properties": ["Title","Status","Assignee","DueDate"], - -- "card_size": "medium", ← board/gallery - -- "cover_property": "Files", ← board/gallery - -- "date_property": "DueDate", ← calendar/timeline - -- "date_range_property": "EndDate" ← timeline (optionnel) - -- } - position INTEGER NOT NULL DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -``` -### 5.2 Phase 2 — Le système de propriétés (semaine 1-2) - -#### Nouvelle table : `collection_properties` (remplace `project_properties`) - -```sql +-- Propriétés d'une collection CREATE TABLE collection_properties ( id INTEGER PRIMARY KEY AUTOINCREMENT, collection_id INTEGER NOT NULL REFERENCES collections(id) ON DELETE CASCADE, - name TEXT NOT NULL, prop_type TEXT NOT NULL DEFAULT 'text', - -- Types: title, text, number, select, multi_select, status, - -- date, person, checkbox, url, email, phone, - -- relation, rollup, formula, - -- created_time, created_by, last_edited_time, last_edited_by - - -- Options pour select/multi_select/status options_json TEXT DEFAULT '[]', - -- Format: [{"name":"Todo","color":"gray"},{"name":"Done","color":"green"}] - - -- Pour les relations + number_format TEXT DEFAULT 'number', related_collection_id INTEGER REFERENCES collections(id), - reverse_name TEXT, -- nom de la relation inverse (auto-généré) - - -- Pour les rollups + reverse_name TEXT, relation_property_id INTEGER REFERENCES collection_properties(id), target_property_id INTEGER REFERENCES collection_properties(id), - rollup_function TEXT, -- count, sum, avg, min, max, range, unique - - -- Pour les formules + rollup_function TEXT, formula_expression TEXT, - - -- Position dans la liste des propriétés position INTEGER NOT NULL DEFAULT 0, - required BOOLEAN NOT NULL DEFAULT 0, visible_in_views BOOLEAN NOT NULL DEFAULT 1, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - UNIQUE(collection_id, name) ); ``` -**Mapping des types Notion → FlowDeck :** +### 13.2 Nouvelles tables — Database Views enrichies -```python -PROPERTY_TYPES = { - "title": { - "storage": "string", - "validation": "max 2000 chars", - "indexed": True, - "unique_per_collection": False, - }, - "text": { - "storage": "string", - "validation": "any text", - }, - "number": { - "storage": "float", - "validation": "numeric", - "format_options": ["number", "percent", "currency", "dollar", "euro", "pound", "yen"], - }, - "select": { - "storage": "string (from options_json)", - "validation": "must match one option", - }, - "multi_select": { - "storage": "JSON array of strings", - "validation": "each must match option", - }, - "status": { - "storage": "string (from options_json) + color", - "validation": "must match one option", - "colors": ["gray","brown","orange","yellow","green","blue","purple","pink","red"], - }, - "date": { - "storage": "ISO 8601 string or range", - "validation": "valid datetime", - "include_time": True, # configurable - }, - "person": { - "storage": "JSON array of {id, login, avatar_url}", - "validation": "must be workspace user", - }, - "checkbox": { - "storage": "boolean", - "validation": "true/false", - }, - "relation": { - "storage": "JSON array of page IDs", - "validation": "must be existing page in related_collection", - "bidirectional": True, - }, - "rollup": { - "storage": "computed — not stored directly", - "functions": ["count","count_values","empty","not_empty", - "sum","average","median","min","max","range"], - "depends_on": ["relation_property_id","target_property_id"], - }, - "formula": { - "storage": "computed — not stored directly", - "expression": "JavaScript-like DSL", - "functions_available": [ - "prop()", "now()", "today()", "if()", "concat()", "round()", - "dateAdd()", "dateSubtract()", "formatDate()", "toNumber()", - "contains()", "length()", "replace()", "replaceAll()", - ], - }, -} +```sql +-- Dashboard : combinaison de vues/widgets sur une page +CREATE TABLE collection_dashboards ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + collection_id INTEGER NOT NULL REFERENCES collections(id) ON DELETE CASCADE, + name TEXT NOT NULL DEFAULT 'Dashboard', + layout_json TEXT NOT NULL DEFAULT '{"columns":1,"widgets":[]}', + -- [{view_id, x, y, width, height}, ...] + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- Templates de collection +CREATE TABLE collection_templates ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + collection_id INTEGER NOT NULL REFERENCES collections(id) ON DELETE CASCADE, + name TEXT NOT NULL DEFAULT 'Default', + description TEXT DEFAULT '', + property_defaults_json TEXT NOT NULL DEFAULT '{}', + content_json TEXT DEFAULT '[]', + is_recurring BOOLEAN NOT NULL DEFAULT 0, + recurrence_rule TEXT, -- 'daily', 'weekly', 'monthly', 'yearly' + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- Data sources multiples par collection +CREATE TABLE collection_data_sources ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + collection_id INTEGER NOT NULL REFERENCES collections(id) ON DELETE CASCADE, + source_collection_id INTEGER NOT NULL REFERENCES collections(id), + source_name TEXT, -- nom d'affichage dans la DB composite + is_linked BOOLEAN NOT NULL DEFAULT 0, -- 1 = linked (provient d'ailleurs) + position INTEGER NOT NULL DEFAULT 0, + UNIQUE(collection_id, source_collection_id) +); + +-- Dependencies entre pages (tâches) +CREATE TABLE page_dependencies ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + page_id INTEGER NOT NULL REFERENCES collection_pages(id) ON DELETE CASCADE, + dependency_id INTEGER NOT NULL REFERENCES collection_pages(id) ON DELETE CASCADE, + dependency_type TEXT NOT NULL DEFAULT 'blocks', -- blocks | blocked_by | related + auto_shift TEXT DEFAULT 'overlap', -- overlap | maintain_time | never + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + UNIQUE(page_id, dependency_id) +); + +-- Sprints +CREATE TABLE sprints ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + collection_id INTEGER NOT NULL REFERENCES collections(id) ON DELETE CASCADE, + name TEXT NOT NULL, + start_date TEXT NOT NULL, + end_date TEXT NOT NULL, + goal TEXT DEFAULT '', + status TEXT NOT NULL DEFAULT 'planning', -- planning | active | completed + auto_complete BOOLEAN NOT NULL DEFAULT 1, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE sprint_pages ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + sprint_id INTEGER NOT NULL REFERENCES sprints(id) ON DELETE CASCADE, + page_id INTEGER NOT NULL REFERENCES collection_pages(id) ON DELETE CASCADE, + status_at_start TEXT, -- snapshot du statut au début du sprint + velocity_points INTEGER DEFAULT 1, + UNIQUE(sprint_id, page_id) +); ``` -### 5.3 Phase 3 — Sub-items et Dépendances (semaine 2) - -#### Implémentation des sub-items (relation auto-référencée) - -```python -# Dans le schema d'une database, activer Sub-items crée automatiquement : - -def enable_sub_items(collection_id: int): - """Active les sub-items sur une collection.""" - - # 1. Créer la propriété relation « Parent item » (si pas déjà) - parent_prop = create_property( - collection_id=collection_id, - name="Parent item", - prop_type="relation", - related_collection_id=collection_id, # AUTO-RÉFÉRENCE - reverse_name="Sub-item", # relation inverse - visible_in_views=False, # cachée dans les vues - ) - - # 2. Marquer la collection comme ayant des sub-items - mark_collection_feature(collection_id, "has_sub_items", True) - - # 3. Mettre à jour la vue board pour afficher l'imbrication - # Le rendu Kanban doit maintenant supporter : - # - Groupe parent → sous-tâches indentées - # - Bouton « + Add sub-item » sous chaque carte - # - État du parent = agrégation des enfants -``` - -#### Rendu des sub-items dans le board - -```html - -
- -
{{ page.title }}
- - - {% for sub in page.sub_items %} -
- ├─ {{ sub.title }} - {{ sub.properties.Status }} -
- {% endfor %} - - - -
-``` - -#### Implémentation des dépendances - -```python -def enable_dependencies(collection_id: int): - """Active les dépendances bloquantes.""" - - # Création de 2 propriétés relation - blocks = create_property( - collection_id=collection_id, - name="Blocks", - prop_type="relation", - related_collection_id=collection_id, - reverse_name="Blocked by", - ) - - # Contrainte métier : au niveau applicatif - # (pas de contrainte SQL pour garder la flexibilité) - -def check_dependency_constraint(page_id: int, new_status: str): - """Vérifie qu'une page peut passer à 'Done' - seulement si toutes les pages qu'elle bloque sont Done.""" - - blocked_pages = get_blocked_pages(page_id) - if new_status == "Done" and blocked_pages: - not_done = [p for p in blocked_pages - if p.status not in ("Done", "Cancelled")] - if not_done: - raise DependencyError( - f"Cannot mark as Done: still blocking {len(not_done)} tasks" - ) -``` - -### 5.4 Phase 4 — « My Tasks » (vue agrégée) (semaine 2-3) - -```python -# GET /my-tasks -async def my_tasks(request: Request): - """Dashboard personnel : toutes les tâches assignées à l'utilisateur.""" - - user = get_current_user(request) - - # 1. Scanner TOUTES les collections - collections = db.fetch_all("SELECT * FROM collections") - - my_tasks = [] - for col in collections: - schema = json.loads(col.schema_json) - - # 2. Vérifier si la collection a une propriété Person - person_props = [p for p in schema if p["type"] == "person"] - if not person_props: - continue - - # 3. Récupérer les pages assignées à l'utilisateur - pages = db.fetch_all(""" - SELECT cp.*, cpv.value as property_values - FROM collection_pages cp - JOIN collection_properties cprop - ON cprop.collection_id = cp.collection_id - AND cprop.prop_type = 'person' - WHERE cp.collection_id = ? - AND cp.property_values_json LIKE ? - """, (col.id, f'%"{user.login}"%')) - - my_tasks.extend([ - {"collection": col, "page": p, "schema": schema} - for p in pages - ]) - - # 4. Grouper par collection - grouped = {} - for task in my_tasks: - col_name = task["collection"].name - if col_name not in grouped: - grouped[col_name] = [] - grouped[col_name].append(task) - - # 5. Trier par Due Date - for tasks in grouped.values(): - tasks.sort(key=lambda t: t["page"].get_property("DueDate") or "9999") - - return render_template("my_tasks.html", tasks=grouped) -``` - -### 5.5 Phase 5 — Rétrocompatibilité avec Gitea - -**Stratégie de migration progressive :** - -```python -# Phase 5a : Wrapper — les boards Gitea existants -# deviennent des collections avec une couche de compatibilité - -class GiteaBoardCompat: - """Adaptateur : ancien board Gitea → nouvelle Collection.""" - - @staticmethod - def from_board(board_row): - """Convertit un board existant en collection.""" - return { - "collection_id": f"gitea:{board_row.id}", - "name": f"{board_row.project_owner}/{board_row.project_name}", - "gitea_owner": board_row.project_owner, - "gitea_repo": board_row.project_name, - "schema": [ - {"name": "Title", "type": "title"}, - {"name": "Status", "type": "select", - "options": json.loads(board_row.columns_json)}, - {"name": "Priority", "type": "select", - "options": ["P1","P2","P3","P4"]}, - ], - "is_gitea_linked": True, - } - -# Phase 5b : Nouvelle route hybride -# GET /board/{owner}/{repo} → détecte si c'est un board Gitea legacy -# ou une collection pure, et route vers le bon renderer -``` - -### 5.6 Résumé du plan d'implémentation +### 13.3 Diagramme des relations clés ``` -Semaine 1 Semaine 2 Semaine 3 -──────── ───────── ───────── +collections ──1:N── collection_pages ── self-ref ── parent_id (sub-items) + │ │ + │1:N │N:N + ▼ ▼ +collection_views page_dependencies (bloque/bloqué par) + │ + │1:N + ▼ +collection_properties + │ + │ self-ref + ├── related_collection_id (relation) + ├── relation_property_id (rollup) + └── target_property_id (rollup) -┌──────────────┐ ┌──────────────┐ ┌──────────────┐ -│ Database │ │ Properties │ │ My Tasks │ -│ Concept │ ──► │ Avancées │ ──► │ Dashboard │ -│ │ │ │ │ │ -│ • collections│ │ • Relations │ │ • Vue agrégée│ -│ • pages │ │ • Rollups │ │ • Filtres │ -│ • views │ │ • Formules │ │ globaux │ -│ • filters │ │ • Auto-prop │ │ • Calendrier │ -│ • sorts │ │ computed │ │ intégré │ -│ │ │ │ │ │ -│ Sub-items │ │ Dependencies │ │ UI polish │ -│ (parent_id) │ ──► │ + contraintes│ ──► │ + tests │ -└──────────────┘ └──────────────┘ └──────────────┘ +collections ──1:N── collection_data_sources (multi-sources) +collections ──1:N── collection_templates +collections ──1:N── sprints ──1:N── sprint_pages +collections ──1:N── collection_dashboards ``` --- -## 6. Références +## 14. Plan d'implémentation (5 phases) {#14-plan-implémentation} -- [Notion API — Property Object](https://developers.notion.com/reference/property-object) -- [Notion Help — Intro to Databases](https://www.notion.com/help/intro-to-databases) -- [Notion Help — Tasks & Dependencies](https://www.notion.com/help/tasks-and-dependencies) -- [Notion Help — Relations & Rollups](https://www.notion.com/help/relations-and-rollups) -- [react-notion-x — Block types reference](https://github.com/NotionX/react-notion-x) -- [Notion Data Sources update (2025)](https://www.notionapps.com/blog/notion-data-sources-update-2025/) +### Phase 1 — Data Sources & Linked Databases (v4.1.0) -### Différences clés FlowDeck vs Notion +**Objectif :** Permettre à une collection d'avoir plusieurs sources de données et des vues liées. -| Concept | Notion | FlowDeck (cible) | -|---------|--------|------------------| -| **Database** | Collection + Pages + Views | `collections` + `collection_pages` + `collection_views` | -| **Schéma** | Properties sur la Collection | `collection_properties` au niveau collection | -| **Valeurs** | Dans chaque page (bloc) | `property_values_json` dans chaque `collection_page` | -| **Sub-items** | Relation auto-référencée | `parent_id` auto-référence dans `collection_pages` | -| **Dependencies** | Relation auto-référencée + contrainte | Idem + check applicatif au changement de statut | -| **My Tasks** | Scan cross-database + filtre | Route `/my-tasks` + JOIN sur `collection_pages` | -| **Gitea sync** | N/A (pas de Gitea) | Les pages peuvent être liées à `gitea_issue_id` | -| **Stockage** | Cloud distribué (PostgreSQL + cache) | SQLite local (1 fichier) | +``` +✅ Table collection_data_sources +✅ API: POST /db/{id}/sources (add) +✅ API: DELETE /db/{id}/sources/{sid} (remove) +✅ API: POST /db/{id}/linked (créer une linked DB) +✅ UI: Data source manager dans settings database +✅ Règle: les linked DB héritent des permissions de la source +``` + +### Phase 2 — Templates & Dashboard (v4.2.0) + +**Objectif :** Templates réutilisables + combinaison de vues en dashboard. + +``` +✅ Table collection_templates (avec récurrence) +✅ Table collection_dashboards (layout widgets) +✅ API: templates CRUD +✅ API: POST /db/{id}/templates/{tid}/apply +✅ API: dashboards CRUD +✅ UI: Dashboard view (grille configurable de widgets) +✅ UI: Template picker dans le dropdown New +``` + +### Phase 3 — Database Views complètes (v4.3.0) + +**Objectif :** Compléter les 10 types de vues avec leurs layouts. + +``` +✅ Charts: barres, courbes, camemberts, donuts, scatter (morris.js / chart.js) +✅ Form: formulaire HTML → POST création page +✅ Map: intégration Leaflet pour propriété Place +✅ Feed: vue chronologique type fil d'actualité +✅ Timeline/Gantt: barres horizontales avec dépendances +✅ Layout options: card size, card preview, open in peek/side/full +✅ View tabs: navigation fluide entre vues +``` + +### Phase 4 — Tasks, Sub-items & Dependencies (v4.4.0) + +**Objectif :** Implémenter le système complet de gestion de tâches Notion-style. + +``` +✅ Flag is_task sur collections (Turn into Tasks) +✅ Sub-items: parent_id dans collection_pages (existant, à enrichir) +✅ Propriété ID auto-générée (TASK-XXX) +✅ Table page_dependencies (bloque/bloqué par) +✅ API: POST/GET/DELETE /db/{c}/pages/{p}/dependencies +✅ Auto-shift des dates (overlap / maintain_time / never) +✅ UI: vue dépendances (graphe ou liste), toggle sub-items +✅ Filtres sub-items: parents only / all / sub-items only +``` + +### Phase 5 — Sprints & My Tasks (v4.5.0) + +**Objectif :** Sprints agiles + vue My Tasks cross-databases. + +``` +✅ Tables sprints, sprint_pages +✅ API: sprints CRUD + assignation pages aux sprints +✅ Sprint board: Current Sprint / Planning / Backlog +✅ Vélocité: calcul points/burndown chart +✅ My Tasks: agrégation cross-databases +✅ My Tasks API: /my-tasks?view=all|today|overdue|upcoming +✅ My Tasks UI: groupes par collection, status badges +✅ Assignee property sync avec users FlowDeck +``` + +--- + +## 15. Limites Notion à respecter {#15-limites} + +| Limite | Valeur | +|--------|--------| +| Propriétés max par database | 500 | +| Pas de rollup d'un rollup | ✅ À respecter | +| Pages avant indexation non linéaire | ~1 000 | +| Nesting templates | max 3 niveaux | +| Nesting template quotidien | interdit | +| Templates | propres à chaque database | +| Database liée : partage | nécessite accès à l'originale | + +--- + +## 16. Références {#16-références} + +**Documentation Notion officielle :** +- [Intro to databases](https://www.notion.com/help/intro-to-databases) +- [Database properties](https://www.notion.com/help/database-properties) +- [Relations & rollups](https://www.notion.com/help/relations-and-rollups) +- [Formulas](https://www.notion.com/help/formulas) +- [Formula syntax](https://www.notion.com/help/formula-syntax) +- [Database templates](https://www.notion.com/help/database-templates) +- [Tasks & dependencies](https://www.notion.com/help/tasks-and-dependencies) +- [Sprints](https://www.notion.com/help/sprints) +- [Data sources & linked databases](https://www.notion.com/help/data-sources-and-linked-databases) +- [Views, filters & sorts](https://www.notion.com/help/views-filters-and-sorts) +- [Tables](https://www.notion.com/help/tables), [Boards](https://www.notion.com/help/boards), [Timelines](https://www.notion.com/help/timelines) +- [Calendars](https://www.notion.com/help/calendars), [Lists](https://www.notion.com/help/lists), [Galleries](https://www.notion.com/help/galleries) +- [Charts](https://www.notion.com/help/charts), [Forms](https://www.notion.com/help/forms), [Maps](https://www.notion.com/help/maps) +- [Feeds](https://www.notion.com/help/feeds), [Layouts](https://www.notion.com/help/layouts), [Dashboards](https://www.notion.com/help/dashboards) +- [My Tasks with Task databases](https://www.notion.com/help/guides/give-your-to-dos-a-home-with-task-databases) + +**Documents FlowDeck :** +- [Guide Complet Notion Database](Guide_Complet_Notion_database.md) +- [Architecture FlowDeck v4.0](../ARCHITECTURE.md) +- [Roadmap](../ROADMAP.md) +- [FlowDeck Agent Integration](Flowdeck_Agent_integration.md)