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>
162 lines
4.9 KiB
JSON
162 lines
4.9 KiB
JSON
{
|
|
"version": 4,
|
|
"projects": [
|
|
{
|
|
"id": "site-web",
|
|
"name": "Refonte du site web",
|
|
"color": "#3b82f6",
|
|
"tags": ["client", "web"],
|
|
"collapsed": false,
|
|
"hidden": false,
|
|
"notes": "## Contexte\n\nPiloté par **Marie D.**, budget voté en avril.\n\n> Le prestataire est engagé jusqu'au 31 janvier 2027.\n\n### À suivre\n\n- [x] cadrage validé en comité\n- [ ] relancer sur les maquettes\n - [ ] variante sombre\n- [ ] prévoir la reprise des anciennes URL\n",
|
|
"baselineDate": "2026-06-12",
|
|
"phases": [
|
|
{
|
|
"id": "cadrage",
|
|
"name": "Cadrage",
|
|
"start": "2026-06-15",
|
|
"end": "2026-07-10",
|
|
"status": "done",
|
|
"milestone": false,
|
|
"notes": "Ateliers avec les trois pôles.\n\nPérimètre arrêté le **8 juillet**.",
|
|
"baseline": { "start": "2026-06-15", "end": "2026-07-03" }
|
|
},
|
|
{
|
|
"id": "maquettes",
|
|
"name": "Maquettes",
|
|
"start": "2026-07-13",
|
|
"end": "2026-08-28",
|
|
"status": "doing",
|
|
"milestone": false,
|
|
"notes": "Deux itérations prévues. La seconde dépend du retour de la direction.",
|
|
"baseline": { "start": "2026-07-06", "end": "2026-08-14" }
|
|
},
|
|
{
|
|
"id": "developpement",
|
|
"name": "Développement",
|
|
"start": "2026-08-31",
|
|
"end": "2026-11-13",
|
|
"status": "todo",
|
|
"milestone": false,
|
|
"notes": "",
|
|
"baseline": { "start": "2026-08-17", "end": "2026-10-30" }
|
|
},
|
|
{
|
|
"id": "recette",
|
|
"name": "Recette",
|
|
"start": "2026-11-16",
|
|
"end": "2026-12-11",
|
|
"status": "todo",
|
|
"milestone": false,
|
|
"notes": "",
|
|
"baseline": { "start": "2026-11-02", "end": "2026-11-27" }
|
|
},
|
|
{
|
|
"id": "mise-en-ligne",
|
|
"name": "Mise en ligne",
|
|
"start": "2026-12-15",
|
|
"end": "2026-12-15",
|
|
"status": "todo",
|
|
"milestone": true,
|
|
"notes": "Date communiquée aux partenaires.",
|
|
"baseline": { "start": "2026-12-01", "end": "2026-12-01" }
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "migration-infra",
|
|
"name": "Migration infrastructure",
|
|
"color": "#10b981",
|
|
"tags": ["infra", "interne"],
|
|
"collapsed": false,
|
|
"hidden": false,
|
|
"notes": "Chantier interne, sans budget propre.\n\nContact hébergeur : [support](mailto:support@example.org)\n",
|
|
"phases": [
|
|
{
|
|
"id": "audit",
|
|
"name": "Audit de l'existant",
|
|
"start": "2026-05-04",
|
|
"end": "2026-06-12",
|
|
"status": "done",
|
|
"milestone": false,
|
|
"notes": "Inventaire complet des services et de leurs dépendances."
|
|
},
|
|
{
|
|
"id": "preparation",
|
|
"name": "Préparation des environnements",
|
|
"start": "2026-06-15",
|
|
"end": "2026-08-07",
|
|
"status": "done",
|
|
"milestone": false,
|
|
"notes": ""
|
|
},
|
|
{
|
|
"id": "bascule-pilote",
|
|
"name": "Bascule pilote",
|
|
"start": "2026-08-10",
|
|
"end": "2026-09-11",
|
|
"status": "blocked",
|
|
"milestone": false,
|
|
"notes": "**Bloquée** : en attente de la fenêtre de maintenance côté hébergeur.\n\n- [x] demande déposée le 3 août\n- [ ] créneau confirmé\n"
|
|
},
|
|
{
|
|
"id": "bascule-generale",
|
|
"name": "Bascule générale",
|
|
"start": "2026-09-14",
|
|
"end": "2026-10-23",
|
|
"status": "todo",
|
|
"milestone": false,
|
|
"notes": ""
|
|
},
|
|
{
|
|
"id": "decommissionnement",
|
|
"name": "Décommissionnement",
|
|
"start": "2026-11-02",
|
|
"end": "2026-11-02",
|
|
"status": "todo",
|
|
"milestone": true,
|
|
"notes": "Arrêt définitif des anciens serveurs."
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "formation-equipe",
|
|
"name": "Formation de l'équipe",
|
|
"color": "#f59e0b",
|
|
"tags": ["interne", "RH"],
|
|
"collapsed": true,
|
|
"hidden": false,
|
|
"notes": "",
|
|
"phases": [
|
|
{
|
|
"id": "recensement",
|
|
"name": "Recensement des besoins",
|
|
"start": "2026-09-01",
|
|
"end": "2026-09-25",
|
|
"status": "todo",
|
|
"milestone": false,
|
|
"notes": ""
|
|
},
|
|
{
|
|
"id": "sessions",
|
|
"name": "Sessions de formation",
|
|
"start": "2026-10-05",
|
|
"end": "2026-12-18",
|
|
"status": "todo",
|
|
"milestone": false,
|
|
"notes": "Trois sessions de deux jours, étalées sur le trimestre."
|
|
},
|
|
{
|
|
"id": "bilan",
|
|
"name": "Bilan",
|
|
"start": "2027-01-15",
|
|
"end": "2027-01-15",
|
|
"status": "todo",
|
|
"milestone": true,
|
|
"notes": ""
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|