Avoir des listes de base à la création d'une famille #3
Labels
No labels
bug
duplicate
enhancement
help wanted
invalid
priority
high
priority
low
priority
medium
question
step
backlog
step
delivered
step
done
step
in-progress
step
todo
wontfix
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
maxime/OrganisateurFamilial#3
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Description
À la création d'une famille, l'espace est vide : on arrive sur un accueil sans rien et il faut deviner qu'il faut d'abord créer une liste. Provisionner une liste de courses et une liste de tâches, vides toutes les deux, donne quelque chose à ouvrir tout de suite.
Où ça se passe
services/family.ts, dans la création qui monte déjà l'équipe Circles et les trois agendas. Les deux listes sont des lignes SQLite et non des ressources Nextcloud : leur création ne peut pas échouer à moitié et n'a rien à compenser.Ce qu'il faut trancher
created_by. La personne qui crée la famille est l'auteur naturel, mais elle n'a rien écrit. La colonne n'accepte pas NULL.Plan d'action
Arbitrages et détail : voir le commentaire de conception.
createFamilyreçoit la langue de la requête et crée, en dernière étape, « Liste de courses » (shopping) puis « Tâches » (todo) dans une transaction SQLite,created_by= le créateurfindListsByFamilydépartage deux listes créées dans la même seconde (ORDER BY created_at, rowid)Shopping list/Tasks, traductions françaises,make l10n-buildfamilies.specne suppose plus une famille neuve vide ; nouveau scénario (listes présentes, supprimées elles ne reviennent pas) ;i18n.specvérifie les noms anglaisArchitecture(et renvoi depuis D36)useActiveFamilyinvalide une ouverture dont la vue est démontée (course révélée par l'E2E, voir commentaire)Recette
make lint typecheck test,make l10n-checkmake build-frontend, puiscd e2e && npm test(suite complète : d'autres scénarios peuvent supposer une famille neuve sans liste)/code-review, retours en commentairePlan de MEP
Aucune migration, aucun changement de schéma : livré avec la version 1.0.x. Les familles existantes ne sont pas touchées.
Avoir des liste de base à la créationto Avoir des listes de base à la création d'une familleConception technique
Arbitrages (validés avec Maxime)
req.language), puis stocké comme n'importe quel nom : c'est désormais celui de la famille, qu'elle peut renommer. Rejeté : un nom NULL rendu dans la langue de chaque lecteur — une migration, et chaque lecteur d'un nom de liste (export, page hors ligne, notifications, accueil) à adapter.Shopping list/Tasks).Choix de réalisation
created_by= le créateur. L'auteur d'une liste n'est affiché nulle part (il sort seulement dans le contrat d'API), donc pas d'enjeu visible.createStarterLists(familyId, userId, language)dansservices/list.ts, appelé parcreateFamilyaprèsprovisionCalendars— la dernière étape, qui ne dépend pas du réseau. Les deuxINSERTpassent dans une transactionbetter-sqlite3: les deux ou aucune.lists.family_idest enON DELETE CASCADE, et la compensation « family row » existe déjà. Un échec après coup ne laisse donc aucune liste orpheline.findListsByFamilytrie parcreated_at, à la seconde près. Deux listes créées dans la même seconde ont un ordre indéterminé ; ajout derowidcomme critère secondaire pour que « Liste de courses » soit toujours la première.families.activeId. À vérifier en E2E.Tests touchés
families.spec.ts:82-102crée une famille et attend « Aucune liste » : l'intention (l'isolation entre familles) reste, l'assertion devient « les deux listes de départ, et pas la liste de l'autre famille ».i18n.spec.ts: un compte anglais obtientShopping list/Tasks.useListSelectionouvre la première liste, et un scénario qui crée sa propre liste peut ne plus tomber dessus.Réalisation — branche
feat/starter-lists(non poussée)Trois commits :
fix(frontend)— une course existante, révélée par ce ticket. Après un changement de famille, l'écran Listes charge les listes puis route vers la première ; un clic sur Paramètres pendant ce chargement était annulé par cerouter.replace.useActiveFamilyne considérait une ouverture comme périmée qu'au changement de famille suivant, pas au démontage de la vue. Invisible tant qu'une famille neuve n'avait aucune liste ; corrigé pour toutes les vues (onScopeDispose), avec un test unitaire qui échoue sans le correctif.feat(lists)—createLists(une transaction) etORDER BY created_at, rowid.feat(families)— les deux listes, nommées avectranslate(req.language, …). Les sourcesShopping list/Tasksexistaient déjà au catalogue, avec « Liste de courses » / « Tâches ».E2E touchés.
families.spec: scénario réécrit (listes de départ, pas celles de l'autre famille) + « une liste de départ supprimée ne revient pas après rechargement ».i18n.spec: un compte anglais obtientShopping list/Tasks.transfer.spec: l'import annonce désormais 3 listes, celles de départ de la famille source voyageant avec l'export — conforme à D41.Portes.
make lint typecheck testetmake l10n-checkverts. Suite E2E complète : tout passe saufmember-colors.spec.ts:199, sans rapport : ses événements sont posés le mercredi de la semaine courante à 10 h/11 h UTC, donc absents de « À venir » quand la suite tourne un mercredi soir (c'était le cas). Expliqué par l’heure d’exécution, pas rejoué surmain; tâche séparée proposée.Wiki. D41 ajoutée à
Architecture, renvoi depuis D36 ; paragraphe « A new family is not empty » dansUX.Reste en recette :
/code-review, revue technique personnelle, revue fonctionnelle./code-review (low) —
main..feat/starter-listsUn seul retour, mineur :
db/lists.ts:126— l’accueil montre les listes de départ dans l’ordre inverse.findRecentLists(« Listes en cours ») trie parupdated_at DESC, rowid DESC; les deux listes, écrites dans le même instant, y apparaissent « Tâches » puis « Liste de courses », alors que l’écran Listes montre « Liste de courses » en premier. Cosmétique, mais contraire à l’intention de D41. Correctif possible : écrire « Tâches » d’abord, ou trier l’accueil parrowid ASCà égalité — à trancher.Vérifié sans retour :
useActiveFamily— seuluseListSelectionlitisStillActive, les autres appelants l’ignorent, donc l’invalidation au démontage ne change rien pour eux.Retour de
/code-reviewcorrigé :findRecentListsdépartage désormais parrowid ASC, comme l’écran Listes ; test ajouté (il échoue sans le correctif). Intégré au commitfeat(lists)par autosquash. Portes vertes,summary.specetfamilies.specpassent. D41 mise à jour.