Add goal tree toolbox module
All checks were successful
Deploy Sokko G / deploy (push) Successful in 15s

This commit is contained in:
Shinuwa 2026-08-22 18:15:39 +02:00
parent e4cbe3e087
commit 59fdcb0927
63 changed files with 4062 additions and 252 deletions

View file

@ -11,7 +11,7 @@ Checklist à suivre lors de l'ajout ou de la modification d'un outil, d'une page
- Mettre à jour la normalisation et le stockage compact dans `website/src/features/toolboxes/storage/modules/<outil>.js`, puis vérifier l'export public dans `website/src/features/toolboxes/storage/toolboxStorage.js`.
- Mettre à jour `docs/STORAGE_SCHEMA.md`.
- Vérifier l'import et l'export si l'outil stocke des données.
- Si l'outil a un contenu représentable en texte, ajouter ou vérifier l'import/export texte round-trip dans le panneau d'ajout.
- Si l'outil a un contenu représentable en texte, ajouter ou vérifier l'import/export texte round-trip depuis le toggle import/export du header.
- Si l'outil porte un état de progression, vérifier que l'import texte repart de l'état initial attendu.
- Vérifier l'affichage dans la page toolbox complète.
- Vérifier l'affichage dans le panneau latéral.

View file

@ -244,6 +244,115 @@ Type : `equipmentPlanner`
}
```
## Outil Arbre D'objectifs
Type : `goalTree`
```json
{
"lastResetAt": 1786226400000,
"orientation": "horizontal",
"nodes": [
{
"id": "goal1",
"parentId": "",
"title": "Breuvage de rage",
"kind": "step",
"icon": "cube",
"color": "gold",
"qtyTarget": 10,
"qtyCurrent": 0,
"formula": "",
"progressMode": "auto",
"resetType": "none",
"resetTime": "00:00",
"weeklyResetDay": 1,
"checkedAt": 0,
"collapsed": false
},
{
"id": "goal2",
"parentId": "goal1",
"parentIds": ["goal1"],
"title": "Élixir de destruction",
"kind": "step",
"icon": "flask",
"color": "cyan",
"qtyTarget": 1,
"qtyCurrent": 0,
"formula": "base * 3",
"resetType": "weekly",
"resetTime": "05:00",
"weeklyResetDay": 1,
"checkedAt": 0,
"collapsed": false
},
{
"id": "goal3",
"parentId": "goal1",
"title": "Liste de farm",
"kind": "checklist",
"items": [
{
"id": "item1",
"label": "Élément",
"formula": "1",
"qtyTarget": 1,
"qtyCurrent": 1
},
{
"id": "item2",
"label": "Faire cela",
"formula": "base",
"qtyTarget": 5,
"qtyCurrent": 2
}
],
"resetType": "none",
"resetTime": "00:00",
"weeklyResetDay": 1,
"checkedAt": 0,
"collapsed": false
}
]
}
```
Stockage compact :
- `lastResetAt` est omis si vide.
- `orientation` est omis si la valeur vaut `horizontal`.
- `orientation` vaut `horizontal` ou `vertical`.
- `parentId` est omis pour les racines.
- `parentId` reste le parent principal de placement dans le schéma.
- `parentIds` contient les parents/prérequis pris en compte pour les liaisons de convergence ; il est omis si aucun prérequis supplémentaire n'existe.
- les calculs `base`, le placement, la suppression de branche et l'agrégation de progression restent basés sur `parentId`.
- un objectif peut donc être placé sous un parent principal tout en ayant d'autres prérequis, afin de représenter une convergence de branches.
- `kind` est omis si la valeur vaut `step`.
- `kind` vaut `step`, `text` ou `checklist`.
- `icon` est omis si la valeur vaut `cube`.
- `icon` vaut `cube`, `fire`, `flask`, `grass`, `leaf`, `meat`, `powder`, `tear` ou `ball`.
- `color` est omis si la valeur vaut `gold`.
- `color` vaut `gold`, `cyan`, `violet`, `pink`, `green`, `gray`, `red`, `orange`, `yellow`, `blue` ou `indigo`.
- `qtyTarget` est omis si la valeur vaut `1`.
- `qtyCurrent` est omis si la valeur vaut `0`.
- `formula` est omis si vide.
- `progressMode` est utilisé uniquement par les objectifs `step`; il vaut `auto` ou `manual`.
- `progressMode` est omis tant qu'aucun choix explicite n'a été fait; par défaut, une étape avec enfants calcule sa progression automatiquement, sauf si tous ses enfants directs ont une cible de `1`, auquel cas elle se comporte en mise à jour manuelle.
- en `auto`, une étape avec enfants calcule sa progression depuis ses enfants; en `manual`, elle utilise sa propre `qtyCurrent`.
- `items` est omis si vide ou si `kind` vaut `step`.
- `items[].label` contient la ligne affichee dans un noeud `text` ou `checklist`; il peut etre vide pendant l'edition.
- `items[].formula` est utilise uniquement par `checklist` pour calculer le total de la ligne ; la variable `base` reference la cible calculee du parent direct.
- `items[].qtyTarget` est utilise uniquement par `checklist` et omis si la valeur vaut `1`.
- `items[].qtyCurrent` est utilise uniquement par `checklist` et omis si la valeur vaut `0`.
- `resetType` est omis si la valeur vaut `none`.
- `resetType` vaut `none`, `daily` ou `weekly`.
- `resetTime` est omis si la valeur vaut `00:00`.
- `weeklyResetDay` est omis si la valeur vaut `1`.
- `checkedAt` est omis si vide.
- `collapsed` est omis si `false`.
- Les parents invalides ou cycliques sont ramenés à la racine pendant la normalisation.
Stockage compact :
- les types sans équipement sont ignorés ;
@ -757,7 +866,7 @@ Exemple :
## Import / Export texte des outils
Les outils compatibles proposent aussi un échange par copier-coller depuis leur panneau d'ajout. Ce format est un format UI distinct du stockage IndexedDB et de l'export JSON global.
Les outils compatibles proposent aussi un échange par copier-coller depuis le toggle import/export de leur header. Ce format est un format UI distinct du stockage IndexedDB et de l'export JSON global.
Règles communes :