feat(calendar): v5.8.0 calendrier & rappels + v5.7.0 database avancee (pt.2)
FlowDeck CI / lint (push) Successful in 49s
FlowDeck CI / test (push) Successful in 5m26s
FlowDeck CI / docker (push) Successful in 43s

v5.8.0 (release 5.11.7) — Calendrier & Rappels :
- moteur de recurrence RRULE subset (daily/weekly/monthly, interval,
  count, until, byweekday, timezone) — app/services/recurrence.py
- vues calendar Jour / Semaine / Mois avec expansion des occurrences
  cote serveur (GET /db/{id}/calendar/api) et popover evenement
  (Time / Timezone / Repeat / Remind)
- rappels avant echeance (scan 60 s, table reminder_log, in-app +
  email, cible = personnes assignees) — app/services/reminders.py
- fuseaux horaires : users.timezone + reglages in-app, timezone par
  evenement, liste de zones (GET /db/timezones/api)
- notifications d'assignation sur PUT /db/pages/{id}/api et
  preferences etendues (reminders, assignments)
- template Meeting notes enrichi (Agenda, Notes — migration 12)
- migrations 11-12 ; 20 tests dedies ; suite complete 523 verte

v5.7.0 (release 5.11.6, termine avant cette session, reste dans
l'arbre sans commit) — Database Avancée Pt.2 :
- proprietes person + auto-proprietes (created/last-edited time & by)
- groupes de proprietes, vues sauvegardees par utilisateur
- swimlanes, WIP limits, cartes configurables, calendar drag & drop,
  gallery couvertures ; 12 tests dedies
This commit is contained in:
2026-09-13 22:49:14 -04:00
parent 055956a351
commit d4adf89db5
18 changed files with 3301 additions and 366 deletions
+94
View File
@@ -1,5 +1,99 @@
# Changelog - FlowDeck
## v5.11.7 (2026-09-13) — v5.8.0 Calendrier & Rappels
> Calendrier complet (jour / semaine / mois) avec récurrences expandues
> côté serveur, rappels avant échéance (in-app + email), fuseaux horaires
> par utilisateur et par événement, notifications d'assignation et centre
> de notifications enrichi.
- **Moteur de récurrence** — `app/services/recurrence.py` : sous-ensemble
RRULE (daily/weekly/monthly, intervalle, count, until, byweekday lundi=0,
timezone IANA) ; expansion virtuelle par fenêtre, jamais persistée,
bornée (garde anti-explosion). `validate_rule()` pour le 400 en écriture.
- **Vues Jour / Semaine / Mois** — la vue calendar de
`_database_table_scripts.html` gagne un sélecteur de mode (persisté dans
`viewConfig.calendar_mode`), navigation ‹/› adaptée au mode, vue Jour en
agenda trié par heure, Semaine en 7 colonnes. Les événements viennent de
`GET /db/{id}/calendar/api` (expansion serveur des occurrences).
- **Récurrences dans l'UI** — double-clic sur un événement : popover Time /
Timezone / Repeat (Every + Ends never|after count|on date) / Remind.
Règle stockée dans `property_values_json` sous `__recurrence__` (clé méta
par id de propriété date), badge ↻ sur les chips et cellules date.
- **Rappels** — `app/services/reminders.py` : `scan_and_fire(now)`
déterministe (lead minutes/heures/jours, occurrence suivante
timezone-aware), `reminder_scheduler()` toutes les 60 s ; dédup via la
table `reminder_log (page_id, occurrence_date)` ; cible = personnes
assignées, repli premier admin ; notifie en in-app + email (pref
`reminders`). Config `reminders_enabled` /
`reminder_scan_interval_seconds`.
- **Fuseaux horaires** — colonne `users.timezone` ; réglable dans Settings →
Notifications (picker IANA via `GET/POST /api/notifications/timezone`,
liste `GET /db/timezones/api`) ; priorité de résolution par ligne :
`__timezone__` de l'événement → règle de récurrence → timezone de
l'utilisateur.
- **Notifications d'assignation** — `notify_assignment()` compare les
propriétés `person` avant/après sur `PUT /db/pages/{id}/api` : les
nouvellement assignés reçoivent une notif in-app + email (pref
`assignments`). Préférences étendues : `comments`, `mentions`,
`reminders`, `assignments`.
- **Template Meeting notes** — propriétés `Agenda` et `Notes` ajoutées
(migration 12 ; ne touche pas une version personnalisée du template).
- **Migrations 11 & 12** — `reminder_log`, `users.timezone`, enrichissement
du template seed.
- **Tests** — `tests/test_v58_calendar_reminders.py` : **20 tests**
(moteur pur, schéma, validation des méta-clés 400, calendar/api,
timezone user, scanner avec horloge injectée + dédup + récurrence +
cible assignée, notifications d'assignation, prefs, câblage front).
Suite complète **523 verte**, `ruff check` OK.
- **Version** — 5.11.7.
## v5.11.6 (2026-09-13) — v5.7.0 Database Avancée (Pt. 2)
> Complète la parité Notion des bases de données : personnes et propriétés
> automatiques, groupes de propriétés, vues sauvegardées par utilisateur,
> swimlanes Kanban + WIP limits, cartes configurables, calendar avec
> glisser-déposer et gallery avec couvertures.
- **Types propriété** — `person`, `created_time`, `created_by`,
`last_edited_time`, `last_edited_by` câblés de bout en bout.
`apply_auto_properties()` (property_types) remplit/rafraîchit les valeurs
automatiques à la création et à la mise à jour des lignes ; `created_*` est
figé, `last_edited_*` est rafraîchi. Nouvel endpoint
`GET /db/{collection_id}/members/api` (membres du workspace, repli tous
utilisateurs) alimente le sélecteur `person` (chips + avatars).
- **Groupes de propriétés** — colonne `collection_properties.group_name`,
en-tête de table avec sections pliables (`db-group-row` + chevron) et
`POST /db/{collection_id}/property-groups/api` pour réassigner les colonnes.
- **Vues sauvegardées par utilisateur** — `collection_views.created_by` ;
`GET /db/{id}/views/api` ne renvoie que les vues de l'utilisateur (les vues
partagées `NULL` restent visibles), `save-as`/`duplicate` attribuent le
propriétaire, `DELETE /db/views/{id}/api` et renommage.
- **Swimlanes Kanban** — `sub_group_by` : une rangée de colonnes par lane
(2e dimension de groupement).
- **WIP limits** — `wip_limits` par colonne, colonne surlignée + compteur
`WIP n/limit` au dépassement.
- **Cartes configurables** — `card_properties` (propriétés affichées),
`card_size` (compact/détaillé) et couverture `cover_mode`
(`none`/`icon`/`color`/`property` via `cover_property`).
- **Calendar drag & drop** — vue mois (`date_property` configurable),
navigation ‹/›/Today, glisser une carte sur un jour = reschedule immédiat.
- **Gallery avec couvertures** — vignettes image (propriété `files`/`url`),
icône, couleur ou cover de ligne ; tailles small/medium/large.
- **Composant multi-vues** — `_database_table_scripts.html` réécrit :
barre de vues (ajout/suppression/duplication/paramètres), vues
table/board/calendar/gallery/list, éditeurs de cellules par type
(select/status/date/number/checkbox/multi_select/person), cellules
read-only pour les types automatiques, popover de configuration.
- **Correctif** — `PUT /db/pages/{id}/api` fusionne désormais les valeurs
soumises avec l'existant (PATCH partiel) au lieu de remplacer toute la
ligne ; `cover_url` par ligne (`collection_pages.cover_url`).
- **Migration 10** — `collection_properties.group_name`,
`collection_views.created_by`/`updated_at`, `collection_pages.cover_url`.
- **Tests** — `tests/test_v57_db_advanced.py` : **12 tests**. Suite complète
**503 verte**, `ruff check` OK.
- **Version** — 5.11.6.
## v5.11.5 (2026-09-13) — v5.6.0 Import de données (Phase 5 — durcissement)
> Finalise la solution d'import : ré-import incrémental, lots, URL, dépôt forge,