Correction de plusieurs anomalies : problème de switch entre 2 templates (par exemple si on était sur un template 1 et qu'on voulait passer directement au 2, ce dernier ne chargeait pas) ; correction du soucis d'apparition de la sidebar à gauche qui disparaissait sans explication ; problème de redirection : lorsqu'on terminait de créer un PJ / PNJ ; on arrivait sur l'accueil de la campagne au lieu de voir le résultat de la création. Problème de redirection également lors du clique sur un PNJ / PJ sur le coté : on arrivait sur l'édition au lieu de la présentation. Correction de la première lettre stylisée : tout est au même style comme ça plus de probleme de lecture. Nouveautées : stylisation des modales (notamment suppression, warning.....) avec en prime l'ajout d'un warning lors du changement de système pour avertir que les fiches persos ne sont pas conservées. Ajout d'une option pour créer un game system directement à la création d'une campagne afin de faciliter la mise en place de cette dernière. Ajout d'un bouton pour créer un nouveau template directement lorsqu'on créer une page : ça permet de créer un template et de revenir sur la page qu'on était en train de créer sans perdre le titre. Passage en bêta 0.8.4
117 lines
4.4 KiB
HTML
117 lines
4.4 KiB
HTML
<div class="page">
|
|
|
|
<header class="page-header">
|
|
<h1>Créer une nouvelle Page</h1>
|
|
<p class="subtitle">Créez une page à partir d'un template existant</p>
|
|
</header>
|
|
|
|
<form [formGroup]="form" (ngSubmit)="submit()" class="page-form">
|
|
|
|
<!-- Titre -->
|
|
<div class="field">
|
|
<label for="page-title">Titre de la page *</label>
|
|
<input id="page-title" type="text" formControlName="title" placeholder="Ex: Maître Eldrin, La Cité d'Argent..." />
|
|
</div>
|
|
|
|
<!-- Template -->
|
|
<div class="field">
|
|
<label>Template *</label>
|
|
|
|
<div class="templates-grid" *ngIf="templates.length; else emptyTemplates">
|
|
<button
|
|
type="button"
|
|
class="template-card"
|
|
*ngFor="let t of templates"
|
|
[class.selected]="selectedTemplateId === t.id"
|
|
(click)="selectTemplate(t)">
|
|
<div class="template-card-head">
|
|
<lucide-icon [img]="FileText" [size]="16"></lucide-icon>
|
|
<span class="template-name">{{ t.name }}</span>
|
|
</div>
|
|
<p class="template-description">{{ t.description || '—' }}</p>
|
|
</button>
|
|
|
|
<!-- Carte "+" : sauvegarde le brouillon et part creer un nouveau template ;
|
|
template-create renverra ici via le mecanisme returnTo. -->
|
|
<a
|
|
class="template-card template-card-create"
|
|
[routerLink]="['/lore', loreId, 'templates', 'create']"
|
|
[queryParams]="{ returnTo: 'page-create' }"
|
|
(click)="saveDraft()"
|
|
title="Créer un nouveau template pour ce Lore">
|
|
<div class="template-card-head">
|
|
<lucide-icon [img]="Plus" [size]="16"></lucide-icon>
|
|
<span class="template-name">Créer un template</span>
|
|
</div>
|
|
<p class="template-description">
|
|
Vous reviendrez ici automatiquement, votre saisie sera conservée.
|
|
</p>
|
|
</a>
|
|
</div>
|
|
|
|
<ng-template #emptyTemplates>
|
|
<p class="empty-hint">
|
|
Aucun template défini pour ce Lore.
|
|
<a [routerLink]="['/lore', loreId, 'templates', 'create']" [queryParams]="{ returnTo: 'page-create' }" (click)="saveDraft()">Créer un template</a> d'abord.
|
|
</p>
|
|
</ng-template>
|
|
</div>
|
|
|
|
<!-- Dossier de destination -->
|
|
<div class="field">
|
|
<label for="page-node">Dossier de destination *</label>
|
|
|
|
<ng-container *ngIf="nodes.length; else emptyFolders">
|
|
<select id="page-node" formControlName="nodeId">
|
|
<option value="" disabled>Sélectionnez un dossier</option>
|
|
<option *ngFor="let node of nodes" [value]="node.id">{{ node.name }}</option>
|
|
</select>
|
|
<p class="hint">La page sera créée dans ce dossier</p>
|
|
</ng-container>
|
|
|
|
<ng-template #emptyFolders>
|
|
<p class="empty-hint">
|
|
Aucun dossier dans ce Lore.
|
|
<a [routerLink]="['/lore', loreId, 'nodes', 'create']" [queryParams]="{ returnTo: 'page-create' }" (click)="saveDraft()">Créer un dossier</a> d'abord.
|
|
</p>
|
|
</ng-template>
|
|
</div>
|
|
|
|
<!-- Aide contextuelle -->
|
|
<div class="info-box">
|
|
💡 Option 1 : <strong>Créer la page</strong> vide, puis remplir les champs manuellement.<br>
|
|
💡 Option 2 : <strong>Créer avec l'IA</strong> pour dialoguer avec un assistant qui pré-remplira les champs.
|
|
</div>
|
|
|
|
<!-- Erreur wizard (parsing <values> ou échec HTTP) -->
|
|
<div class="wizard-error" *ngIf="wizardError" role="alert">{{ wizardError }}</div>
|
|
|
|
<!-- Actions -->
|
|
<div class="actions-row">
|
|
<button type="button" class="btn-secondary" (click)="cancel()">Annuler</button>
|
|
<button type="button" class="btn-ai" (click)="openWizard()" [disabled]="!canSubmit"
|
|
title="Ouvrir l'assistant IA pour pré-remplir les champs">
|
|
<lucide-icon [img]="Sparkles" [size]="14"></lucide-icon>
|
|
Créer avec l'IA
|
|
</button>
|
|
<button type="submit" class="btn-primary" [disabled]="!canSubmit">Créer la page</button>
|
|
</div>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
<!-- Drawer chat IA en mode wizard -->
|
|
<app-ai-chat-drawer
|
|
[loreId]="loreId"
|
|
[isOpen]="chatOpen"
|
|
[persistent]="false"
|
|
[welcomeMessage]="wizardWelcome"
|
|
[systemPromptAddon]="wizardSystemPrompt"
|
|
[quickSuggestions]="wizardSuggestions"
|
|
[primaryAction]="wizardPrimaryAction"
|
|
(close)="closeWizard()"
|
|
(assistantReply)="onWizardReply($event)"
|
|
(primaryActionClick)="applyWizardAndCreate()">
|
|
</app-ai-chat-drawer>
|