Files
fvtt-te-deum/modules/items/tedeum-item-sheet.js

154 lines
5.1 KiB
JavaScript

import { TeDeumUtility } from "../common/tedeum-utility.js";
const { HandlebarsApplicationMixin } = foundry.applications.api
/**
* Feuille d'item Te Deum - AppV2
*/
export class TeDeumItemSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ItemSheetV2) {
/** @override */
static DEFAULT_OPTIONS = {
classes: ["fvtt-te-deum", "sheet", "item"],
position: {
width: 620,
height: 580,
},
form: {
submitOnChange: true,
closeOnSubmit: false,
},
window: {
resizable: true,
},
actions: {
editImage: TeDeumItemSheet.#onEditImage,
postItem: TeDeumItemSheet.#onPostItem,
deleteSubitem: TeDeumItemSheet.#onDeleteSubitem,
viewSubitem: TeDeumItemSheet.#onViewSubitem,
},
}
// Static PARTS pointing to the dynamic wrapper template
static PARTS = {
sheet: { template: "systems/fvtt-te-deum/templates/items/item-sheet.hbs" },
}
tabGroups = { primary: "description" }
/* -------------------------------------------- */
/** @override */
async _prepareContext() {
const item = this.document
const TextEditor = foundry.applications.ux.TextEditor.implementation
const enrich = async (val) => val !== undefined ? await TextEditor.enrichHTML(val ?? "", { async: true }) : ""
const context = {
title: this.title,
id: item.id,
type: item.type,
img: item.img,
name: item.name,
editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked",
system: foundry.utils.duplicate(item.system),
systemFields: item.system.schema.fields,
config: foundry.utils.duplicate(game.system.tedeum.config),
competences: TeDeumUtility.getCompetencesForDropDown(),
limited: item.limited,
owner: item.isOwner,
enrichedDescription: await enrich(item.system.description),
enrichedTransmission: await enrich(item.system.transmission),
enrichedSymptomes: await enrich(item.system.symptomes),
enrichedComplications: await enrich(item.system.complications),
enrichedVertus: await enrich(item.system.vertus),
enrichedToxicite: await enrich(item.system.toxicite),
isGM: game.user.isGM,
itemPartialName: `systems/fvtt-te-deum/templates/items/item-${item.type}-sheet.hbs`,
}
if (item.type === "education") {
TeDeumUtility.prepareEducationContent(context)
}
return context
}
/* -------------------------------------------- */
/** @override */
_onRender(context, options) {
super._onRender(context, options)
// Tab navigation
const nav = this.element.querySelector('nav.tabs[data-group]')
if (nav) {
const group = nav.dataset.group
const activeTab = this.tabGroups[group] || "description"
nav.querySelectorAll('[data-tab]').forEach(link => {
const tab = link.dataset.tab
link.classList.toggle('active', tab === activeTab)
link.addEventListener('click', event => {
event.preventDefault()
this.tabGroups[group] = tab
this.render()
})
})
this.element.querySelectorAll(`[data-group="${group}"][data-tab]`).forEach(content => {
content.classList.toggle('active', content.dataset.tab === activeTab)
})
}
// Ignore Enter key in inputs
this.element.addEventListener('keydown', e => {
if (e.keyCode === 13 && e.target.tagName !== 'TEXTAREA') e.preventDefault()
})
}
// #region Static action handlers
static async #onEditImage(event, target) {
const fp = new FilePicker({
type: "image",
current: this.document.img,
callback: path => this.document.update({ img: path }),
})
fp.browse()
}
static async #onPostItem(event, target) {
const chatData = foundry.utils.duplicate(this.item)
if (this.actor) {
chatData.actor = { id: this.actor.id }
}
if (chatData.img?.includes("/blank.png")) {
chatData.img = null
}
chatData.jsondata = JSON.stringify({ compendium: "postedItem", payload: chatData })
const html = await foundry.applications.handlebars.renderTemplate(
'systems/fvtt-te-deum/templates/post-item.html', chatData
)
ChatMessage.create(TeDeumUtility.chatDataSetup(html))
}
static async #onDeleteSubitem(event, target) {
const field = target.dataset.type
const idx = parseInt(target.dataset.index)
const oldArray = this.document.system[field]
if (Array.isArray(oldArray) && oldArray[idx]?.name !== 'None') {
const newArray = oldArray.filter((_, i) => i !== idx)
this.document.update({ [`system.${field}`]: newArray })
}
}
static async #onViewSubitem(event, target) {
const li = target.closest(".item")
const levelIndex = parseInt(li?.dataset.levelIndex)
const choiceIndex = parseInt(li?.dataset.choiceIndex)
const featureId = li?.dataset.featureId
const itemData = this.document.system.levels?.[levelIndex]?.choices?.[choiceIndex]?.features?.[featureId]
if (itemData?.name !== 'None') {
const item = await Item.create(itemData, { temporary: true })
item.system.origin = "embeddedItem"
new TeDeumItemSheet(item).render(true)
}
}
// #endregion
}