Résolution d'un bug de switch entre les PNJ lorsqu'on essai de passer directement de l'un à l'autre

Ajout de dossiers pour la partie PNJ pour qu'on puisse les regrouper par cité par exemple et que ce soit plus lisible
This commit is contained in:
2026-06-08 11:05:07 +02:00
parent edc4434298
commit ed22d9f29c
14 changed files with 145 additions and 32 deletions

View File

@@ -96,18 +96,45 @@ export function buildCampaignTree(campaignId: string, data: CampaignTreeData): T
// à une Partie (Playthrough). On ne les affiche donc plus dans la sidebar de
// campagne — seuls les PNJ (donnée de scénario) restent sous "Personnages".
const sortedNpcs = [...data.npcs].sort(byName);
const npcItems: TreeItem[] = sortedNpcs.map(n => ({
const npcItem = (n: Npc): TreeItem => ({
id: `npc-${n.id}`,
label: n.name,
route: `/campaigns/${campaignId}/npcs/${n.id}`
}));
});
// Regroupement par DOSSIER : un sous-nœud (dépliable) par dossier, puis les PNJ
// non classés directement sous « PNJ ».
const npcsByFolder = new Map<string, Npc[]>();
const ungroupedNpcs: Npc[] = [];
for (const n of sortedNpcs) {
const f = (n.folder ?? '').trim();
if (f) {
if (!npcsByFolder.has(f)) npcsByFolder.set(f, []);
npcsByFolder.get(f)!.push(n);
} else {
ungroupedNpcs.push(n);
}
}
const npcFolderNodes: TreeItem[] = [...npcsByFolder.keys()]
.sort((a, b) => a.localeCompare(b, 'fr', { sensitivity: 'base' }))
.map(folder => {
const items = npcsByFolder.get(folder)!.map(npcItem);
return {
id: `npc-folder-${folder}`,
label: folder,
iconKey: 'folder',
children: items,
meta: String(items.length)
};
});
const npcChildren: TreeItem[] = [...npcFolderNodes, ...ungroupedNpcs.map(npcItem)];
const npcsNode: TreeItem = {
id: 'npcs-root',
label: 'PNJ',
iconKey: 'c-drama',
children: npcItems,
meta: npcItems.length ? String(npcItems.length) : undefined,
children: npcChildren,
meta: sortedNpcs.length ? String(sortedNpcs.length) : undefined,
// Porte le header de section "Personnages" (les PJ ayant migré vers la Partie).
// Le filet au-dessus est masqué par CSS si c'est le tout premier item de la sidebar.
sectionHeaderBefore: 'Personnages',