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)
278 lines
11 KiB
JavaScript
278 lines
11 KiB
JavaScript
import { RdDItemSort } from "./item-sort.js";
|
|
import { RdDUtility } from "./rdd-utility.js";
|
|
import { RdDAlchimie } from "./rdd-alchimie.js";
|
|
import { RdDItemCompetence } from "./item-competence.js";
|
|
import { RdDHerbes } from "./rdd-herbes.js";
|
|
import { RdDGemme } from "./rdd-gemme.js";
|
|
import { HtmlUtility } from "./html-utility.js";
|
|
import { ReglesOptionelles } from "./settings/regles-optionelles.js";
|
|
import { SYSTEM_RDD } from "./constants.js";
|
|
import { RdDSheetUtility } from "./rdd-sheet-utility.js";
|
|
import { SystemCompendiums } from "./settings/system-compendiums.js";
|
|
import { Misc } from "./misc.js";
|
|
|
|
/**
|
|
* Extend the basic ItemSheet for RdD specific items
|
|
*/
|
|
export class RdDItemSheet extends ItemSheet {
|
|
|
|
static get ITEM_TYPE() {
|
|
return undefined
|
|
}
|
|
|
|
static defaultTemplate(type) {
|
|
return type ?
|
|
`systems/foundryvtt-reve-de-dragon/templates/item-${type}-sheet.html` :
|
|
"systems/foundryvtt-reve-de-dragon/templates/item-sheet.html";
|
|
}
|
|
|
|
static register(sheetClass) {
|
|
Items.registerSheet(SYSTEM_RDD, sheetClass, {
|
|
label: Misc.typeName('Item', sheetClass.ITEM_TYPE),
|
|
types: [sheetClass.ITEM_TYPE],
|
|
makeDefault: true
|
|
})
|
|
}
|
|
|
|
/** @override */
|
|
static get defaultOptions() {
|
|
return mergeObject(super.defaultOptions, {
|
|
classes: [SYSTEM_RDD, "sheet", "item"],
|
|
template: RdDItemSheet.defaultTemplate(RdDItemSheet.ITEM_TYPE),
|
|
width: 550,
|
|
height: 550
|
|
});
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
get template() {
|
|
return RdDItemSheet.defaultTemplate(this.item.type);
|
|
}
|
|
|
|
get title() {
|
|
return `${Misc.typeName('Item', this.item.type)}: ${this.item.name}`;
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
_getHeaderButtons() {
|
|
let buttons = super._getHeaderButtons();
|
|
if (this.item.isInventaire() && this.item.isVideOuNonConteneur()) {
|
|
buttons.unshift({
|
|
class: "vendre",
|
|
icon: "fas fa-comments-dollar",
|
|
onclick: ev => this.item.proposerVente()
|
|
});
|
|
}
|
|
buttons.unshift({
|
|
class: "montrer",
|
|
icon: "fas fa-comment",
|
|
onclick: ev => this.item.postItem()
|
|
});
|
|
return buttons
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
/** @override */
|
|
setPosition(options = {}) {
|
|
const position = super.setPosition(options);
|
|
const sheetHeader = this.element.find(".sheet-header");
|
|
const sheetBody = this.element.find(".sheet-body");
|
|
const bodyHeight = position.height - sheetHeader[0].clientHeight;
|
|
sheetBody.css("height", bodyHeight);
|
|
return position;
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
async getData() {
|
|
let formData = {
|
|
id: this.item.id,
|
|
title: this.item.name,
|
|
type: this.item.type,
|
|
img: this.item.img,
|
|
name: this.item.name,
|
|
system: this.item.system,
|
|
isGM: game.user.isGM,
|
|
actorId: this.actor?.id,
|
|
isOwned: this.actor ? true : false,
|
|
owner: this.item.isOwner,
|
|
editable: this.isEditable,
|
|
cssClass: this.isEditable ? "editable" : "locked",
|
|
isSoins: false,
|
|
description: await TextEditor.enrichHTML(this.item.system.description, { async: true }),
|
|
descriptionmj: await TextEditor.enrichHTML(this.item.system.descriptionmj, { async: true }),
|
|
isComestible: this.item.isComestible()
|
|
}
|
|
|
|
const competences = await SystemCompendiums.getCompetences(this.actor?.type);
|
|
formData.categorieCompetences = RdDItemCompetence.getCategorieCompetences()
|
|
if (this.item.type == 'tache' || this.item.type == 'livre' || this.item.type == 'meditation' || this.item.type == 'oeuvre') {
|
|
formData.caracList = duplicate(game.system.model.Actor.personnage.carac)
|
|
formData.caracList["reve-actuel"] = duplicate(game.system.model.Actor.personnage.reve.reve)
|
|
formData.competences = competences;
|
|
}
|
|
if (this.item.type == 'arme') {
|
|
formData.competences = competences.filter(it => RdDItemCompetence.isCompetenceArme(it));
|
|
}
|
|
if (['sort', 'sortreserve'].includes(this.item.type)) {
|
|
formData.competences = competences.filter(it => RdDItemCompetence.isDraconic(it));
|
|
}
|
|
if (this.item.type == 'recettecuisine') {
|
|
formData.ingredients = await TextEditor.enrichHTML(this.object.system.ingredients, { async: true })
|
|
}
|
|
if (this.item.type == 'extraitpoetique') {
|
|
formData.extrait = await TextEditor.enrichHTML(this.object.system.extrait, { async: true })
|
|
formData.texte = await TextEditor.enrichHTML(this.object.system.texte, { async: true })
|
|
}
|
|
if (this.item.type == 'recettealchimique') {
|
|
RdDAlchimie.processManipulation(this.item, this.actor && this.actor.id);
|
|
formData.manipulation_update = await TextEditor.enrichHTML(this.object.system.manipulation_update, { async: true })
|
|
formData.utilisation = await TextEditor.enrichHTML(this.object.system.utilisation, { async: true })
|
|
formData.enchantement = await TextEditor.enrichHTML(this.object.system.enchantement, { async: true })
|
|
formData.sureffet = await TextEditor.enrichHTML(this.object.system.sureffet, { async: true })
|
|
}
|
|
if (this.item.type == 'gemme') {
|
|
formData.gemmeTypeList = RdDGemme.getGemmeTypeOptionList();
|
|
RdDGemme.calculDataDerivees(this.item);
|
|
}
|
|
if (this.item.type == 'potion') {
|
|
if (this.dateUpdated) {
|
|
formData.system.prdate = this.dateUpdated;
|
|
this.dateUpdated = undefined;
|
|
}
|
|
await RdDHerbes.updatePotionData(formData);
|
|
}
|
|
if (formData.isOwned && this.item.type == 'herbe' && (formData.system.categorie == 'Soin' || formData.system.categorie == 'Repos')) {
|
|
formData.isIngredientPotionBase = true;
|
|
}
|
|
if (this.item.type == 'sortreserve') {
|
|
const sortId = this.item.system.sortid;
|
|
formData.sort = formData.isOwned ? this.item.actor.items.get(sortId) : game.items.get(sortId);
|
|
}
|
|
formData.bonusCaseList = RdDItemSort.getBonusCaseList(formData, true);
|
|
|
|
return formData;
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
/** @override */
|
|
activateListeners(html) {
|
|
super.activateListeners(html);
|
|
this.html = html;
|
|
|
|
let itemSheetDialog = this;
|
|
|
|
HtmlUtility._showControlWhen(this.html.find(".item-cout"), ReglesOptionelles.isUsing('afficher-prix-joueurs') || game.user.isGM || !this.item.isOwned);
|
|
HtmlUtility._showControlWhen(this.html.find(".item-magique"), this.item.isMagique());
|
|
|
|
// Everything below here is only needed if the sheet is editable
|
|
if (!this.options.editable) return;
|
|
|
|
this.form.ondragstart = (event) => this._onDragStart(event);
|
|
this.form.ondrop = (event) => this._onDrop(event);
|
|
|
|
// Select competence categorie
|
|
this.html.find(".categorie").change(event => this._onSelectCategorie(event));
|
|
|
|
this.html.find('.sheet-competence-xp').change((event) => {
|
|
if (this.item.isCompetencePersonnage()) {
|
|
RdDUtility.checkThanatosXP(this.item.name);
|
|
}
|
|
});
|
|
|
|
this.html.find('.enchanteDate').change((event) => {
|
|
let jour = Number(this.html.find('[name="splitDate.day"]').val());
|
|
let mois = this.html.find('[name="splitDate.month"]').val();
|
|
this.dateUpdated = game.system.rdd.calendrier.getIndexFromDate(jour, mois);
|
|
});
|
|
|
|
this.html.find('.creer-tache-livre').click((event) => this._getEventActor(event).creerTacheDepuisLivre(this.item));
|
|
this.html.find('.consommer-potion').click((event) => this._getEventActor(event).consommerPotion(this.item));
|
|
this.html.find('.creer-potion-base').click((event) => this._getEventActor(event).dialogFabriquerPotion(this.item));
|
|
|
|
this.html.find('.alchimie-tache a').click((event) => {
|
|
let actor = this._getEventActor(event);
|
|
if (actor) {
|
|
let recetteId = event.currentTarget.attributes['data-recette-id'].value;
|
|
let tacheName = event.currentTarget.attributes['data-alchimie-tache'].value;
|
|
let tacheData = event.currentTarget.attributes['data-alchimie-data'].value;
|
|
actor.effectuerTacheAlchimie(recetteId, tacheName, tacheData);
|
|
} else {
|
|
ui.notifications.info("Impossible trouver un acteur pour réaliser cette tache Alchimique.");
|
|
}
|
|
});
|
|
|
|
this.html.find('.item-split').click(async event => RdDSheetUtility.splitItem(RdDSheetUtility.getItem(event, this.actor), this.actor, async () => itemSheetDialog.render(true)));
|
|
this.html.find('.item-edit').click(async event => RdDSheetUtility.getItem(event, this.actor)?.sheet.render(true));
|
|
this.html.find('.item-delete').click(async event => RdDUtility.confirmerSuppressionItem(this, RdDSheetUtility.getItem(event, this.actor)));
|
|
this.html.find('.item-vendre').click(async event => RdDSheetUtility.getItem(event, this.actor)?.proposerVente());
|
|
this.html.find('.item-montrer').click(async event => RdDSheetUtility.getItem(event, this.actor)?.postItem());
|
|
this.html.find('.item-action').click(async event => RdDSheetUtility.getItem(event, this.actor)?.actionPrincipale(this.actor, async () => itemSheetDialog.render(true)));
|
|
}
|
|
|
|
_getEventActor(event) {
|
|
let actorId = event.currentTarget.attributes['data-actor-id'].value;
|
|
let actor = game.actors.get(actorId);
|
|
return actor;
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
async _onSelectCategorie(event) {
|
|
event.preventDefault();
|
|
|
|
if (this.item.isCompetence()) {
|
|
let level = RdDItemCompetence.getNiveauBase(event.currentTarget.value);
|
|
this.item.system.base = level;
|
|
this.html.find('[name="system.base"]').val(level);
|
|
}
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
/** @override */
|
|
_updateObject(event, formData) {
|
|
if (this.item.type == 'sort') {
|
|
// Données de bonus de cases ?
|
|
formData['system.bonuscase'] = RdDItemSort.buildBonusCaseStringFromFormData(formData.bonusValue, formData.caseValue);
|
|
}
|
|
|
|
return this.item.update(formData);
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
async _onDragStart(event) {
|
|
}
|
|
|
|
async _onDrop(event) {
|
|
// Try to extract the dragData
|
|
let dragData = RdDItemSheet.$extractDragData(event);
|
|
if (!dragData) return false;
|
|
const allowed = Hooks.call("dropActorSheetData", this.actor, this, dragData);
|
|
if (allowed === false) return false;
|
|
|
|
// Handle different dragData types
|
|
switch (dragData.type) {
|
|
case "Item":
|
|
return this._onDropItem(event, dragData);
|
|
case "Actor":
|
|
return this._onDropActor(event, dragData);
|
|
}
|
|
return super._onDrop(event);
|
|
}
|
|
|
|
static $extractDragData(event) {
|
|
try {
|
|
const eventData = event?.dataTransfer?.getData('text/plain');
|
|
if (eventData) {
|
|
return JSON.parse(eventData);
|
|
}
|
|
} catch (err) { }
|
|
return undefined;
|
|
}
|
|
|
|
async _onDropItem(event, dragData) {
|
|
}
|
|
|
|
async _onDropActor(event, dragData) {
|
|
}
|
|
|
|
}
|