154 lines
5.1 KiB
JavaScript
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
|
|
} |