feat(calendar): v5.8.0 calendrier & rappels + v5.7.0 database avancee (pt.2)
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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user