forked from public/foundryvtt-reve-de-dragon
		
	Forcer la validation des champs saisis avant de fermer les dialogs et d'appeler le callback pour avoir la dernière valuer saisie par l'utilisateur
		
			
				
	
	
		
			119 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { ChatUtility } from "./chat-utility.js";
 | |
| import { HtmlUtility } from "./html-utility.js";
 | |
| import { RdDItemSigneDraconique } from "./item-signedraconique.js";
 | |
| import { Misc } from "./misc.js";
 | |
| import { RdDRollTables } from "./rdd-rolltables.js";
 | |
| import { TMRType, TMRUtility } from "./tmr-utility.js";
 | |
| 
 | |
| export class DialogCreateSigneDraconique extends Dialog {
 | |
| 
 | |
|   static async createSigneForActors() {
 | |
|     const signe = await RdDItemSigneDraconique.randomSigneDraconique({ephemere: true});
 | |
|     let dialogData = {
 | |
|       signe: signe,
 | |
|       tmrs: TMRUtility.listSelectedTMR(signe.data.typesTMR ?? []),
 | |
|       actors: game.actors.filter(actor => actor.isHautRevant()).map(actor => {
 | |
|         let actorData = duplicate(Misc.data(actor));
 | |
|         actorData.selected = actor.hasPlayerOwner;
 | |
|         return actorData;
 | |
|       })
 | |
|     };
 | |
| 
 | |
|     const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-create-signedraconique.html", dialogData);
 | |
|     new DialogCreateSigneDraconique(dialogData, html)
 | |
|       .render(true);
 | |
|   }
 | |
| 
 | |
|   constructor(dialogData, html, callback) {
 | |
|     let options = { classes: ["DialogCreateSigneDraconiqueActorsActors"], width: 500, height: 650, 'z-index': 99999 };
 | |
|     let conf = {
 | |
|       title: "Créer un signe",
 | |
|       content: html,
 | |
|       default: "Ajouter aux haut-rêvants",
 | |
|       buttons: {
 | |
|         "Ajouter aux haut-rêvants": { label: "Ajouter aux haut-rêvants", callback: it => { this._onCreerSigneActeurs(); } }
 | |
|       }
 | |
|     };
 | |
|     super(conf, options);
 | |
|     this.dialogData = dialogData;
 | |
|   }
 | |
| 
 | |
|   async _onCreerSigneActeurs() {
 | |
|     await $("[name='signe.data.ephemere']").change();
 | |
|     await $(".signe-xp-sort").change();
 | |
|     this.validerSigne();
 | |
|     this.dialogData.actors.filter(it => it.selected).map(it => game.actors.get(it._id))
 | |
|       .forEach(actor => this._createSigneForActor(actor, this.dialogData.signe));
 | |
|   }
 | |
| 
 | |
|   async _createSigneForActor(actor, signe) {
 | |
|     actor.createEmbeddedDocuments("Item", [signe]);
 | |
|     ChatMessage.create({
 | |
|       whisper: ChatUtility.getWhisperRecipientsAndGMs(Misc.data(actor).name),
 | |
|       content: await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/chat-signe-draconique-actor.html", {
 | |
|         signe: signe,
 | |
|         alias: Misc.data(actor).name
 | |
|       })
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   validerSigne() {
 | |
|     this.dialogData.signe.name = $("[name='signe.name']").val();
 | |
|     this.dialogData.signe.data.valeur.norm = $("[name='signe.data.valeur.norm']").val();
 | |
|     this.dialogData.signe.data.valeur.sign = $("[name='signe.data.valeur.sign']").val();
 | |
|     this.dialogData.signe.data.valeur.part = $("[name='signe.data.valeur.part']").val();
 | |
|     this.dialogData.signe.data.difficulte = $("[name='signe.data.difficulte']").val();
 | |
|     this.dialogData.signe.data.ephemere = $("[name='signe.data.ephemere']").prop("checked");
 | |
|     this.dialogData.signe.data.duree = $("[name='signe.data.duree']").val();
 | |
|     this.dialogData.signe.data.typesTMR = $(".select-tmr").val();
 | |
|   }
 | |
| 
 | |
|   /* -------------------------------------------- */
 | |
|   activateListeners(html) {
 | |
|     super.activateListeners(html);
 | |
|     this.setEphemere(this.dialogData.signe.data.ephemere);
 | |
|     html.find(".signe-aleatoire").click(event => this.setSigneAleatoire());
 | |
|     html.find("[name='signe.data.ephemere']").change((event) => this.setEphemere(event.currentTarget.checked));
 | |
|     html.find(".select-actor").change((event) => this.onSelectActor(event));
 | |
|     html.find(".signe-xp-sort").change((event) => this.onValeurXpSort(event));
 | |
|   }
 | |
| 
 | |
|   async setSigneAleatoire() {
 | |
|     const newSigne = await RdDItemSigneDraconique.randomSigneDraconique({ephemere: true});
 | |
| 
 | |
|     $("[name='signe.name']").val(newSigne.name);
 | |
|     $("[name='signe.data.valeur.norm']").val(newSigne.data.valeur.norm);
 | |
|     $("[name='signe.data.valeur.sign']").val(newSigne.data.valeur.sign);
 | |
|     $("[name='signe.data.valeur.part']").val(newSigne.data.valeur.part);
 | |
|     $("[name='signe.data.difficulte']").val(newSigne.data.difficulte);
 | |
|     $("[name='signe.data.duree']").val(newSigne.data.duree);
 | |
|     $("[name='signe.data.ephemere']").prop("checked", newSigne.data.ephemere);
 | |
|     $(".select-tmr").val(newSigne.data.typesTMR);
 | |
|     this.setEphemere(newSigne.data.ephemere);
 | |
|   }
 | |
| 
 | |
|   async setEphemere(ephemere) {
 | |
|     this.dialogData.signe.data.ephemere = ephemere;
 | |
|     HtmlUtility._showControlWhen($(".signe-data-duree"), ephemere);
 | |
|   }
 | |
| 
 | |
|   async onSelectActor(event) {
 | |
|     event.preventDefault();
 | |
|     const options = event.currentTarget.options;
 | |
|     for (var i = 0; i < options.length; i++) { // looping over the options
 | |
|       const actorId = options[i].attributes["data-actor-id"].value;
 | |
|       const actor = this.dialogData.actors.find(it => it._id == actorId);
 | |
|       if (actor) {
 | |
|         actor.selected = options[i].selected;
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   onValeurXpSort(event) {
 | |
|     const codeReussite = event.currentTarget.attributes['data-typereussite']?.value ?? 0;
 | |
|     const xp = Number(event.currentTarget.value);
 | |
|     const oldValeur = this.dialogData.signe.data.valeur;
 | |
|     this.dialogData.signe.data.valeur = RdDItemSigneDraconique.calculValeursXpSort(codeReussite, xp, oldValeur);
 | |
|   }
 | |
| 
 | |
| } |