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)
110 lines
4.0 KiB
JavaScript
110 lines
4.0 KiB
JavaScript
|
|
import { Monnaie } from "./item-monnaie.js";
|
|
import { RdDUtility } from "./rdd-utility.js";
|
|
|
|
export class DialogItemAchat extends Dialog {
|
|
|
|
static venteData(button) {
|
|
const vendeurId = button.attributes['data-vendeurId']?.value;
|
|
const vendeur = vendeurId ? game.actors.get(vendeurId) : undefined;
|
|
const acheteur = RdDUtility.getSelectedActor();
|
|
const json = button.attributes['data-jsondata']?.value;
|
|
if (!acheteur && !vendeur) {
|
|
ui.notifications.info("Pas d'acheteur ni de vendeur, aucun changement");
|
|
return undefined;
|
|
}
|
|
if (!json) {
|
|
ui.notifications.warn("Impossible d'acheter: informations sur l'objet manquantes")
|
|
return undefined;
|
|
}
|
|
|
|
const prixLot = Number(button.attributes['data-prixLot']?.value ?? 0);
|
|
return {
|
|
item: json ? JSON.parse(json) : undefined,
|
|
actingUserId: game.user.id,
|
|
vendeurId: vendeurId,
|
|
vendeur: vendeur,
|
|
acheteur: acheteur,
|
|
tailleLot: parseInt(button.attributes['data-tailleLot']?.value ?? 1),
|
|
quantiteIllimite: button.attributes['data-quantiteIllimite']?.value == 'true',
|
|
quantiteNbLots: parseInt(button.attributes['data-quantiteNbLots']?.value),
|
|
choix: {
|
|
nombreLots: 1,
|
|
seForcer: false,
|
|
supprimerSiZero: true
|
|
},
|
|
prixLot: prixLot,
|
|
prixTotal: prixLot,
|
|
isVente: prixLot > 0,
|
|
chatMessageIdVente: RdDUtility.findChatMessageId(button)
|
|
};
|
|
}
|
|
|
|
static async onAcheter(venteData) {
|
|
const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-achat.html`, venteData);
|
|
new DialogItemAchat(html, venteData).render(true);
|
|
}
|
|
|
|
constructor(html, venteData) {
|
|
const isConsommable = venteData.item.type == 'nourritureboisson' && venteData.acheteur?.isPersonnage();
|
|
let options = { classes: ["dialogachat"], width: 400, height: 'fit-content', 'z-index': 99999 };
|
|
|
|
const actionAchat = venteData.prixLot > 0 ? "Acheter" : "Prendre";
|
|
const buttons = {};
|
|
if (isConsommable) {
|
|
buttons["consommer"] = { label: venteData.item.system.boisson ? "Boire" : "Manger", callback: it => this.onAchatConsommer() }
|
|
}
|
|
buttons[actionAchat] = { label: actionAchat, callback: it => { this.onAchat(); } };
|
|
buttons["decliner"] = { label: "Décliner", callback: it => { } };
|
|
let conf = {
|
|
title: venteData.acheteur ? venteData.acheteur.name + " - " + actionAchat : actionAchat,
|
|
content: html,
|
|
default: actionAchat,
|
|
buttons: buttons
|
|
};
|
|
|
|
super(conf, options);
|
|
this.venteData = venteData;
|
|
}
|
|
|
|
async onAchat() {
|
|
await this.html.find(".nombreLots").change();
|
|
(this.venteData.vendeur ?? this.venteData.acheteur).achatVente({
|
|
userId: game.user.id,
|
|
vendeurId: this.venteData.vendeur?.id,
|
|
acheteurId: this.venteData.acheteur?.id,
|
|
prixTotal: this.venteData.prixTotal,
|
|
chatMessageIdVente: this.venteData.chatMessageIdVente,
|
|
choix: this.venteData.choix,
|
|
vente: this.venteData
|
|
});
|
|
}
|
|
|
|
async onAchatConsommer() {
|
|
this.venteData.choix.consommer = true;
|
|
await this.onAchat();
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
activateListeners(html) {
|
|
super.activateListeners(html);
|
|
this.html = html;
|
|
this.html.find(".nombreLots").change(event => this.setNombreLots(Number(event.currentTarget.value)));
|
|
this.html.find(".se-forcer").change(event => this.setSeForcer(event));
|
|
}
|
|
|
|
setSeForcer(event) {
|
|
this.venteData.choix.seForcer = event.currentTarget.checked;
|
|
}
|
|
|
|
setNombreLots(nombreLots) {
|
|
if (nombreLots > this.venteData.quantiteNbLots) {
|
|
ui.notifications.warn(`Seulement ${this.venteData.quantiteNbLots} lots disponibles, vous ne pouvez pas en prendre ${nombreLots}`)
|
|
}
|
|
this.venteData.choix.nombreLots = Math.min(nombreLots, this.venteData.quantiteNbLots);
|
|
this.venteData.prixTotal = (nombreLots * this.venteData.prixLot).toFixed(2);
|
|
this.html.find(".nombreLots").val(this.venteData.choix.nombreLots);
|
|
this.html.find(".prixTotal").text(this.venteData.prixTotal);
|
|
}
|
|
|
|
} |