325 lines
9.8 KiB
JavaScript
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})
|
|
}
|
|
}
|
|
|
|
}
|