Some checks failed
E2E Tests / e2e (push) Failing after 21s
- Système de templating dans le game system : en effet, les templates sont liés au game system car les fiches personnages ne sont pas forcément les même selon les jeux (perso Dnd possède + de compétences que Nimble par exemple) - changement des fiches personnages pour adapter le templating au niveau des campagnes et remplir des pages de perso
93 lines
2.7 KiB
HTML
93 lines
2.7 KiB
HTML
<div class="ne-page">
|
|
|
|
<div class="ne-header">
|
|
<button class="btn-back" (click)="back()">
|
|
<lucide-icon [img]="ArrowLeft" [size]="14"></lucide-icon>
|
|
Retour à la campagne
|
|
</button>
|
|
<div class="header-row">
|
|
<h1>
|
|
<lucide-icon [img]="Drama" [size]="22"></lucide-icon>
|
|
{{ npcId ? 'Éditer le PNJ' : 'Nouveau PNJ' }}
|
|
</h1>
|
|
<button
|
|
*ngIf="npcId"
|
|
type="button"
|
|
class="btn-ai"
|
|
(click)="toggleChat()"
|
|
[class.active]="chatOpen"
|
|
title="Ouvrir l'Assistant IA pour dialoguer autour de ce PNJ">
|
|
<lucide-icon [img]="Sparkles" [size]="14"></lucide-icon>
|
|
Assistant IA
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="ne-form">
|
|
|
|
<div class="field">
|
|
<label>Nom du PNJ *</label>
|
|
<input
|
|
type="text"
|
|
[(ngModel)]="name"
|
|
name="name"
|
|
placeholder="Ex: Borin le forgeron, Dame Elara, Kael l'aubergiste..."
|
|
/>
|
|
</div>
|
|
|
|
<div class="field-row">
|
|
<div class="field">
|
|
<label>Portrait (ID image)</label>
|
|
<input type="text" [(ngModel)]="portraitImageId" name="portraitImageId" placeholder="ID de l'image portrait" />
|
|
</div>
|
|
<div class="field">
|
|
<label>Bandeau / Header (ID image)</label>
|
|
<input type="text" [(ngModel)]="headerImageId" name="headerImageId" placeholder="ID de l'image bandeau" />
|
|
</div>
|
|
</div>
|
|
<p class="hint">
|
|
Les portraits et bandeaux acceptent un ID d'image (MVP). Picker visuel a venir.
|
|
</p>
|
|
|
|
<div class="template-fields">
|
|
<app-dynamic-fields-form
|
|
[fields]="templateFields"
|
|
[values]="values"
|
|
[imageValues]="imageValues"
|
|
(valuesChange)="values = $event"
|
|
(imageValuesChange)="imageValues = $event">
|
|
</app-dynamic-fields-form>
|
|
</div>
|
|
|
|
<div class="actions">
|
|
<button type="button" class="btn-primary" [disabled]="!name.trim()" (click)="submit()">
|
|
<lucide-icon [img]="Save" [size]="16"></lucide-icon>
|
|
{{ npcId ? 'Enregistrer' : 'Créer' }}
|
|
</button>
|
|
<button type="button" class="btn-secondary" (click)="back()">Annuler</button>
|
|
<span class="spacer"></span>
|
|
<button
|
|
*ngIf="npcId"
|
|
type="button"
|
|
class="btn-danger"
|
|
(click)="deleteNpc()">
|
|
<lucide-icon [img]="Trash2" [size]="14"></lucide-icon>
|
|
Supprimer
|
|
</button>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<app-ai-chat-drawer
|
|
*ngIf="npcId && campaignId"
|
|
[campaignId]="campaignId"
|
|
entityType="npc"
|
|
[entityId]="npcId"
|
|
[isOpen]="chatOpen"
|
|
welcomeMessage="Je vois cette fiche de PNJ. Demande-moi de proposer apparence, motivations, secrets, ou répliques signatures."
|
|
[quickSuggestions]="chatQuickSuggestions"
|
|
(close)="chatOpen = false">
|
|
</app-ai-chat-drawer>
|