133 lines
5.1 KiB
JavaScript
133 lines
5.1 KiB
JavaScript
const { HandlebarsApplicationMixin } = foundry.applications.api
|
|
|
|
import { LesOubliesUtility } from "../../les-oublies-utility.js"
|
|
|
|
export default class LesOubliesItemSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ItemSheetV2) {
|
|
static SHEET_MODES = { EDIT: 0, PLAY: 1 }
|
|
|
|
static DEFAULT_OPTIONS = {
|
|
classes: ["fvtt-les-oublies", "sheet", "item"],
|
|
position: {
|
|
width: 760,
|
|
height: 720,
|
|
},
|
|
window: {
|
|
resizable: true,
|
|
},
|
|
form: {
|
|
submitOnChange: true,
|
|
closeOnSubmit: false,
|
|
},
|
|
actions: {
|
|
toggleSheet: LesOubliesItemSheet.#onToggleSheet,
|
|
editImage: LesOubliesItemSheet.#onEditImage,
|
|
},
|
|
}
|
|
|
|
_sheetMode = this.constructor.SHEET_MODES.EDIT
|
|
|
|
get isEditMode() {
|
|
return this._sheetMode === this.constructor.SHEET_MODES.EDIT
|
|
}
|
|
|
|
get isPlayMode() {
|
|
return this._sheetMode === this.constructor.SHEET_MODES.PLAY
|
|
}
|
|
|
|
async _prepareContext() {
|
|
const config = CONFIG.LESOUBLIES
|
|
const enriched = await LesOubliesUtility.prepareEnrichedHtml("Item", this.document.type, this.document.system)
|
|
const skillLabels = Object.fromEntries(Object.entries(config.skills).map(([key, skill]) => [key, skill.label]))
|
|
const choiceSets = {
|
|
profileOptions: config.profiles.map((profile) => ({ value: profile.id, label: profile.label })),
|
|
skillOptions: LesOubliesUtility.createChoices(Object.keys(config.skills), skillLabels),
|
|
spellSkillOptions: LesOubliesUtility.createChoices(["magie", "onirologie", "chimerisme"], skillLabels),
|
|
weaponCategoryOptions: LesOubliesUtility.ensureChoice(
|
|
LesOubliesUtility.createChoices(Object.keys(config.weaponCategoryLabels), config.weaponCategoryLabels),
|
|
this.document.system.category,
|
|
),
|
|
weaponOriginOptions: LesOubliesUtility.ensureChoice(
|
|
LesOubliesUtility.createChoices(Object.keys(config.weaponOriginLabels), config.weaponOriginLabels),
|
|
this.document.system.origin,
|
|
),
|
|
armorStateOptions: LesOubliesUtility.ensureChoice(
|
|
LesOubliesUtility.createChoices(Object.keys(config.armorStateLabels), config.armorStateLabels),
|
|
this.document.system.state,
|
|
),
|
|
equipmentCategoryOptions: LesOubliesUtility.ensureChoice(
|
|
LesOubliesUtility.createChoices(Object.keys(config.equipmentCategoryLabels), config.equipmentCategoryLabels),
|
|
this.document.system.category,
|
|
),
|
|
spellTraditionOptions: LesOubliesUtility.ensureChoice(
|
|
LesOubliesUtility.createChoices(Object.keys(config.spellTraditionLabels), config.spellTraditionLabels),
|
|
this.document.system.tradition,
|
|
),
|
|
polarityOptions: LesOubliesUtility.ensureChoice(
|
|
LesOubliesUtility.createChoices(Object.keys(config.polarityLabels), config.polarityLabels),
|
|
this.document.system.polarity,
|
|
),
|
|
stackingOptions: LesOubliesUtility.ensureChoice(
|
|
LesOubliesUtility.createChoices(Object.keys(config.stackingLabels), config.stackingLabels),
|
|
this.document.system.stacking,
|
|
),
|
|
companyPowerScopeOptions: LesOubliesUtility.ensureChoice(
|
|
LesOubliesUtility.createChoices(Object.keys(config.companyPowerScopeLabels), config.companyPowerScopeLabels),
|
|
this.document.system.scope,
|
|
),
|
|
companyPowerModeOptions: LesOubliesUtility.ensureChoice(
|
|
LesOubliesUtility.createChoices(Object.keys(config.companyPowerModeLabels), config.companyPowerModeLabels),
|
|
this.document.system.effectMode,
|
|
),
|
|
raceSizeOptions: LesOubliesUtility.ensureChoice(
|
|
LesOubliesUtility.createRangeChoices(1, 4, config.sizes),
|
|
this.document.system.size,
|
|
),
|
|
mainRaceOptions: LesOubliesUtility.ensureChoice(
|
|
LesOubliesUtility.sortByName(game.items.filter((item) => item.type === "race")).map((item) => ({
|
|
value: item.name,
|
|
label: item.name,
|
|
})),
|
|
this.document.system.mainRace,
|
|
),
|
|
}
|
|
|
|
return {
|
|
item: this.document,
|
|
system: this.document.system,
|
|
source: this.document.toObject(),
|
|
fields: this.document.schema.fields,
|
|
systemFields: this.document.system.schema.fields,
|
|
isEditable: this.isEditable,
|
|
isEditMode: this.isEditMode,
|
|
isPlayMode: this.isPlayMode,
|
|
isGM: game.user.isGM,
|
|
config,
|
|
choiceSets,
|
|
enriched,
|
|
enrichedDescription: foundry.utils.getProperty(enriched, "description") ?? "",
|
|
weaponDamagePreview: this.document.type === "arme"
|
|
? LesOubliesUtility.formatWeaponDamage(this.document.parent instanceof Actor ? this.document.parent : null, this.document)
|
|
: "",
|
|
}
|
|
}
|
|
|
|
static #onToggleSheet() {
|
|
const modes = this.constructor.SHEET_MODES
|
|
this._sheetMode = this.isEditMode ? modes.PLAY : modes.EDIT
|
|
this.render()
|
|
}
|
|
|
|
static async #onEditImage(event, target) {
|
|
const attr = target.dataset.edit
|
|
const current = foundry.utils.getProperty(this.document, attr)
|
|
const fp = new FilePicker({
|
|
current,
|
|
type: "image",
|
|
callback: (path) => this.document.update({ [attr]: path }),
|
|
top: this.position.top + 40,
|
|
left: this.position.left + 10,
|
|
})
|
|
return fp.browse()
|
|
}
|
|
}
|