63770790b9
Arrêter d'utiliser le jQuery $(selector) qui cause des effets de bord si plusieurs élements de la page (ie: foundry) correspondent au selector. Stocker le html dans les Sheet/Dialogs lors de l'appel activateListeners afin de pouvoir s'y référer ensuite. Utiliser this.html.find pour chercher dans le html de la fenêtre courante. Eliminer les référence par id html car l'id est unique (donc ne marche pas en multi-fenêtres)
128 lines
5.5 KiB
JavaScript
128 lines
5.5 KiB
JavaScript
import { ChatUtility } from "./chat-utility.js";
|
|
import { HtmlUtility } from "./html-utility.js";
|
|
import { RdDItemSigneDraconique } from "./item-signedraconique.js";
|
|
import { 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.buildSelectionTypesTMR(signe.system.typesTMR),
|
|
actors: game.actors.filter(actor => actor.isPersonnage() && actor.isHautRevant())
|
|
.map(actor => ({
|
|
id: actor.id,
|
|
name: actor.name,
|
|
selected: true
|
|
}))
|
|
};
|
|
|
|
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-create-signedraconique.html", dialogData);
|
|
new DialogCreateSigneDraconique(dialogData, html)
|
|
.render(true);
|
|
}
|
|
|
|
constructor(dialogData, html) {
|
|
let options = { classes: ["DialogCreateSigneDraconiqueActorsActors"], width: 500, height: 650, 'z-index': 99999 };
|
|
let conf = {
|
|
title: "Créer un signe",
|
|
content: html,
|
|
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 this.html.find("[name='signe.system.ephemere']").change();
|
|
await this.html.find(".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(actor.name),
|
|
content: await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/chat-signe-draconique-actor.html", {
|
|
signe: signe,
|
|
alias: actor.name
|
|
})
|
|
});
|
|
}
|
|
|
|
validerSigne() {
|
|
this.dialogData.signe.name = this.html.find("[name='signe.name']").val();
|
|
this.dialogData.signe.system.valeur.norm = this.html.find("[name='signe.system.valeur.norm']").val();
|
|
this.dialogData.signe.system.valeur.sign = this.html.find("[name='signe.system.valeur.sign']").val();
|
|
this.dialogData.signe.system.valeur.part = this.html.find("[name='signe.system.valeur.part']").val();
|
|
this.dialogData.signe.system.difficulte = this.html.find("[name='signe.system.difficulte']").val();
|
|
this.dialogData.signe.system.ephemere = this.html.find("[name='signe.system.ephemere']").prop("checked");
|
|
this.dialogData.signe.system.duree = this.html.find("[name='signe.system.duree']").val();
|
|
this.dialogData.signe.system.typesTMR = TMRUtility.buildListTypesTMRSelection(this.dialogData.tmrs);
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
activateListeners(html) {
|
|
super.activateListeners(html);
|
|
this.html = html;
|
|
this.setEphemere(this.dialogData.signe.system.ephemere);
|
|
html.find(".signe-aleatoire").click(event => this.setSigneAleatoire());
|
|
html.find("[name='signe.system.ephemere']").change((event) => this.setEphemere(event.currentTarget.checked));
|
|
html.find(".signe-xp-sort").change((event) => this.onValeurXpSort(event));
|
|
html.find("input.select-actor").change((event) => this.onSelectActor(event));
|
|
html.find("input.select-tmr").change((event) => this.onSelectTmr(event));
|
|
}
|
|
|
|
async setSigneAleatoire() {
|
|
const newSigne = await RdDItemSigneDraconique.randomSigneDraconique({ephemere: true});
|
|
|
|
this.html.find("[name='signe.name']").val(newSigne.name);
|
|
this.html.find("[name='signe.system.valeur.norm']").val(newSigne.system.valeur.norm);
|
|
this.html.find("[name='signe.system.valeur.sign']").val(newSigne.system.valeur.sign);
|
|
this.html.find("[name='signe.system.valeur.part']").val(newSigne.system.valeur.part);
|
|
this.html.find("[name='signe.system.difficulte']").val(newSigne.system.difficulte);
|
|
this.html.find("[name='signe.system.duree']").val(newSigne.system.duree);
|
|
this.html.find("[name='signe.system.ephemere']").prop("checked", newSigne.system.ephemere);
|
|
this.dialogData.tmrs = TMRUtility.buildSelectionTypesTMR(newSigne.system.typesTMR);
|
|
this.dialogData.tmrs.forEach(t => {
|
|
this.html.find(`[data-tmr-name='${t.name}']`).prop( "checked", t.selected);
|
|
})
|
|
this.setEphemere(newSigne.system.ephemere);
|
|
}
|
|
|
|
async setEphemere(ephemere) {
|
|
this.dialogData.signe.system.ephemere = ephemere;
|
|
HtmlUtility._showControlWhen(this.html.find(".signe-system-duree"), ephemere);
|
|
}
|
|
|
|
async onSelectActor(event) {
|
|
const actorId = this.html.find(event.currentTarget)?.data("actor-id");
|
|
const actor = this.dialogData.actors.find(it => it.id == actorId);
|
|
if (actor) {
|
|
actor.selected = event.currentTarget.checked;
|
|
}
|
|
}
|
|
|
|
onSelectTmr(event) {
|
|
const tmrName = this.html.find(event.currentTarget)?.data("tmr-name");
|
|
const onTmr = this.tmrs.find(it => it.name == tmrName);
|
|
if (onTmr){
|
|
onTmr.selected = event.currentTarget.checked;
|
|
}
|
|
}
|
|
|
|
|
|
onValeurXpSort(event) {
|
|
const codeReussite = event.currentTarget.attributes['data-typereussite']?.value ?? 0;
|
|
const xp = Number(event.currentTarget.value);
|
|
const oldValeur = this.dialogData.signe.system.valeur;
|
|
this.dialogData.signe.system.valeur = RdDItemSigneDraconique.calculValeursXpSort(codeReussite, xp, oldValeur);
|
|
}
|
|
|
|
} |