foundry-dsa41-game/src/module/sheets/equipmentSheet.mjs

325 lines
9.8 KiB
JavaScript

const {DocumentSheetV2, HandlebarsApplicationMixin} = foundry.applications.api
/**
* @typedef ApplicationTab
* @property {string} id
* @property {string} group
* @property {boolean} active
* @property {string} cssClass
* @property {string} [label]
* @property {string} [icon]
* @property {string} [tooltip]
*/
export class EquipmentSheet extends HandlebarsApplicationMixin(DocumentSheetV2) {
/** @inheritDoc */
static DEFAULT_OPTIONS = {
position: {width: 640, height: 480},
classes: ['dsa41', 'sheet', 'item', 'equipment'],
tag: 'form',
form: {
submitOnChange: true,
closeOnSubmit: false,
handler: EquipmentSheet.#onSubmitForm
},
window: {
resizable: true,
},
actions: {
editImage: DocumentSheetV2.DEFAULT_OPTIONS.actions.editImage
}
}
static TABS = {
sheet: {
tabs: [
{id: 'meta', group: 'sheet', label: 'Meta'},
// Additional Tabs are added based on the nature of this item
],
initial: 'meta'
}
}
/** @inheritDoc */
static PARTS = {
form: {
template: `systems/DSA_4-1/templates/item/equipment/main-sheet.hbs`
},
meta: {
template: `systems/DSA_4-1/templates/item/equipment/tab-meta.hbs`
},
melee: {
template: `systems/DSA_4-1/templates/item/equipment/tab-melee.hbs`
},
ranged: {
template: `systems/DSA_4-1/templates/item/equipment/tab-ranged.hbs`
},
ammunition: {
template: `systems/DSA_4-1/templates/item/equipment/tab-ammunition.hbs`
},
currency: {
template: 'systems/DSA_4-1/templates/item/equipment/tab-currency.hbs'
},
armor: {
template: `systems/DSA_4-1/templates/item/equipment/tab-armor.hbs`
},
settings: {
template: `systems/DSA_4-1/templates/item/equipment/tab-settings.hbs`
},
}
_configureRenderOptions(options) {
super._configureRenderOptions(options)
if (options.window) {
options.window.title = this.document.name
}
return options
}
/**
* Handle form submission
* @this {EquipmentSheet}
* @param {SubmitEvent} event
* @param {HTMLFormElement} form
* @param {FormDataExtended} formData
*/
static async #onSubmitForm(event, form, formData) {
event.preventDefault()
let normalisedFormData = {}
Object.entries(formData.object).forEach(([key, value]) => {
if (Array.isArray(value)) {
normalisedFormData[key] = value[0]
} else {
normalisedFormData[key] = value
}
})
// manage categories into array
normalisedFormData['system.category'] = []
if (normalisedFormData.isMelee) normalisedFormData['system.category'].push("Nahkampfwaffe")
delete normalisedFormData.isMelee
if (normalisedFormData.isRanged) normalisedFormData['system.category'].push("Fernkampfwaffe")
delete normalisedFormData.isRanged
if (normalisedFormData.isAmmunition) normalisedFormData['system.category'].push("Munition")
delete normalisedFormData.isAmmunition
if (normalisedFormData.isArmor) normalisedFormData['system.category'].push("Rüstung")
delete normalisedFormData.isArmor
if (normalisedFormData.isCurrency) normalisedFormData['system.category'].push("Währung")
delete normalisedFormData.isCurrency
await this.document.update(normalisedFormData) // Note: formData.object
}
async _preparePartContext(partId, context) {
switch (partId) {
case 'meta':
this.#prepareMetaContext(context)
break;
case 'melee':
this.#prepareMeleeContext(context)
break;
case 'ranged':
this.#prepareRangedContext(context)
break;
case 'armor':
this.#prepareArmorContext(context)
break;
case 'ammunition':
this.#prepareAmmunitionContext(context)
break;
case 'currency':
this.#prepareCurrencyContext(context)
break;
case 'settings':
this.#prepareSettingsContext(context)
break;
}
context.tab = context.tabs[partId]
return context
}
#prepareMetaContext(context) {
const equipmentData = context.document.system
context.system = equipmentData
context.quantity = equipmentData.quantity
context.description = equipmentData.description
context.name = context.document.name
context.img = context.document.img
context.categoryAndOptions = {
options: {
Gegenstand: "Gegenstand",
Nahkampfwaffe: "Nahkampfwaffe",
Fernkampfwaffe: "Fernkampfwaffe",
Behälter: "Behälter",
},
entries: equipmentData.category,
targetField: "category"
};
}
#prepareMeleeContext(context) {
const equipmentData = context.document.system
context.system = equipmentData
context.meleeSkillsAndOptions = {
options: {
"": "",
Dolche: "Dolche",
Fechtwaffen: "Fechtwaffen",
"Säbel": "Säbel",
Schwerter: "Schwerter",
"Anderthalbhänder": "Anderthalbhänder",
"Zweihandschwerter/-säbel": "Zweihandschwerter/-säbel",
"Infanteriewaffen": "Infanteriewaffen",
"Speere": "Speere",
"Stäbe": "Stäbe",
"Hiebwaffen": "Hiebwaffen",
"Zweihand-Hiebwaffen": "Zweihand-Hiebwaffen",
"Kettenwaffen": "Kettenwaffen",
"Raufen": "Raufen"
},
entries: equipmentData.meleeSkills,
targetField: "meleeSkills"
}
}
#prepareRangedContext(context) {
const equipmentData = context.document.system
context.rangedSkillsAndOptions = {
options: {
"": "",
"Wurfmesser": "Wurfmesser",
"Wurfspeer": "Wurfspeer",
"Wurfbeil": "Wurfbeil",
"Armbrust": "Armbrust",
"Bogen": "Bogen",
},
entries: equipmentData.rangedSkills,
targetField: "rangedSkills"
}
}
#prepareAmmunitionContext(context) {
}
#prepareArmorContext(context) {
}
#prepareCurrencyContext(context) {
}
#prepareSettingsContext(context) {
context.isMelee = this.document.system.category.includes("Nahkampfwaffe")
context.isRanged = this.document.system.category.includes("Fernkampfwaffe")
context.isAmmunition = this.document.system.category.includes("Munition")
context.isArmor = this.document.system.category.includes("Rüstung")
context.isCurrency = this.document.system.category.includes("Währung")
}
/**
* Adds Tabs based on the items nature
*
* @param {String} group
* @private
*/
_getTabsConfig(group) {
const tabs = foundry.utils.deepClone(super._getTabsConfig(group))
const category = this.document.system.category
/**
*
* @type {[{ApplicationTab}]}
*/
if (category.includes("Nahkampfwaffe")) {
tabs.tabs.push({
id: 'melee', group: group, label: 'Nahkampfwaffe'
})
}
if (category.includes("Fernkampfwaffe")) {
tabs.tabs.push({
id: 'ranged', group: group, label: 'Fernkampfwaffe'
})
}
if (category.includes("Rüstung")) {
tabs.tabs.push({
id: 'armor', group: group, label: 'Rüstung'
})
}
if (category.includes("Währung")) {
tabs.tabs.push({
id: 'currency', group: group, label: 'Währung'
})
}
tabs.tabs.push({
id: 'settings', group: group, label: 'Einstellungen'
})
return tabs
}
/** @override */
async _prepareContext(options) {
const context = await super._prepareContext(options)
context.price = context.document.system.price
context.weight = context.document.system.weight
context.inventoryItems = []
context.containerVolume = context.document.system.containerVolume
return context
}
/**
* Actions performed after any render of the Application.
* Post-render steps are not awaited by the render process.
* @param {ApplicationRenderContext} context Prepared context data
* @param {RenderOptions} options Provided render options
* @protected
*/
_onRender(context, options) {
new foundry.applications.ux.DragDrop.implementation({
dropSelector: ".inventory-table",
permissions: {
drop: this._canDragDrop.bind(this)
},
callbacks: {
drop: this._onDrop.bind(this)
}
}).bind(this.element);
}
_canDragDrop(event) {
return true
}
async _onDrop(event) {
const data = TextEditor.implementation.getDragEventData(event);
// Dropped Documents
const documentClass = foundry.utils.getDocumentClass(data.type);
if (documentClass) {
const document = await documentClass.fromDropData(data)
// Dropped Documents
document.update({"parent": this.document})
}
}
}