Rendre les notes en markdown, et en donner au projet
Une phase avait quatre lignes de texte brut ; un projet n'avait rien. Les deux
manques se tiennent : la frise ne dit pas qui pilote ni sur quel budget, et ce
contexte finissait dans les notes de la première phase venue, où il ne survit
pas à sa suppression.
Le bloc de notes est le même dans les deux panneaux et prend toute la hauteur
restante : les autres champs ont une taille dictée par leur contenu, une note
fait ce qu'on a à dire. Il s'ouvre sur l'aperçu quand la note existe, sur la
saisie quand elle est vide.
Les cases à cocher se cliquent dans l'aperçu — seul geste de l'aperçu qui touche
aux données. La bascule réécrit la seule ligne visée plutôt que de régénérer la
note, qui verrait sinon sa mise en forme normalisée. Inertes dans la vue par
mois, en lecture seule (décision 24).
La barre d'outils écrit par `document.execCommand('insertText')` et non en
affectant `value`, qui viderait la pile d'annulation du navigateur : `Ctrl+Z`
doit continuer de marcher. Le DOM est bâti nœud par nœud, sans un `innerHTML`.
Les infobulles aplatissent le markdown — `title` ne connaît que le texte —, et
celles d'un jalon et d'un libellé de projet les affichent désormais.
Le format passe en version 4 : le validateur reconstruit chaque projet champ par
champ, un binaire antérieur effacerait les notes de projet à la première
sauvegarde.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
19
js/model.js
19
js/model.js
@@ -12,7 +12,18 @@
|
||||
* La date de fin est *incluse* : du 01/08 au 01/08 dure un jour.
|
||||
*/
|
||||
|
||||
export const VERSION_FORMAT = 3;
|
||||
/**
|
||||
* Version du format de fichier.
|
||||
*
|
||||
* Elle a changé pour la dernière fois quand le projet a reçu des `notes` (v4).
|
||||
* Un champ ajouté n'oblige pourtant à rien : la v3 se relit sans encombre, et
|
||||
* le validateur ne refuse qu'un fichier *plus récent* que lui. C'est justement
|
||||
* là qu'est la raison d'incrémenter — le validateur reconstruit chaque projet
|
||||
* champ par champ et laisse tomber ce qu'il ne connaît pas. Sans ce numéro, un
|
||||
* binaire antérieur ouvrirait un fichier v4 sans broncher et en effacerait
|
||||
* toutes les notes de projet à la première sauvegarde.
|
||||
*/
|
||||
export const VERSION_FORMAT = 4;
|
||||
|
||||
export const STATUTS = ['todo', 'doing', 'done', 'blocked'];
|
||||
|
||||
@@ -347,6 +358,11 @@ export function validerPlanning(donnees) {
|
||||
tags: validerTags(projet.tags, repere),
|
||||
collapsed: Boolean(projet.collapsed),
|
||||
hidden: Boolean(projet.hidden),
|
||||
// Absentes d'un fichier en version 3, et ramenées à vide si elles ne sont
|
||||
// pas du texte : une note est de la prose, comme celles d'une phase, et
|
||||
// bloquer le chargement d'un planning entier pour un champ mal typé serait
|
||||
// disproportionné là où le champ n'engage aucun calcul.
|
||||
notes: typeof projet.notes === 'string' ? projet.notes : '',
|
||||
...(projet.baselineDate ? { baselineDate: projet.baselineDate } : {}),
|
||||
phases: trierPhases(phases),
|
||||
};
|
||||
@@ -616,6 +632,7 @@ export function creerProjet(planning, nom, tags = []) {
|
||||
tags: normaliserTags(tags),
|
||||
collapsed: false,
|
||||
hidden: false,
|
||||
notes: '',
|
||||
phases: [],
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user