diff --git a/module/applications/sheets/items/ancestry.mjs b/module/applications/sheets/items/ancestry.mjs index eb03de99..3636ea62 100644 --- a/module/applications/sheets/items/ancestry.mjs +++ b/module/applications/sheets/items/ancestry.mjs @@ -1,10 +1,12 @@ import DHHeritageSheet from '../api/heritage-sheet.mjs'; export default class AncestrySheet extends DHHeritageSheet { + /**@inheritdoc */ static DEFAULT_OPTIONS = { classes: ['ancestry'] }; + /**@inheritdoc */ static PARTS = { header: { template: 'systems/daggerheart/templates/sheets/items/ancestry/header.hbs' }, ...super.PARTS diff --git a/module/applications/sheets/items/class.mjs b/module/applications/sheets/items/class.mjs index a12e89d2..6b23531c 100644 --- a/module/applications/sheets/items/class.mjs +++ b/module/applications/sheets/items/class.mjs @@ -23,7 +23,7 @@ export default class ClassSheet extends DHBaseItemSheet { }, tagifyConfigs: [ { - selector: 'domain-input', + selector: '.domain-input', choices: () => CONFIG.daggerheart.DOMAIN.domains, callback: ClassSheet.#onDomainSelect } @@ -62,14 +62,19 @@ export default class ClassSheet extends DHBaseItemSheet { } }; + /**@inheritdoc */ async _prepareContext(_options) { const context = await super._prepareContext(_options); context.domains = this.document.system.domains; return context; } - static async #onDomainSelect(domains) { - await this.document.update({ 'system.domains': domains.map(x => x.value) }); + /** + * Callback function used by `tagifyElement`. + * @param {Array} selectedOptions - The currently selected tag objects. + */ + static async #onDomainSelect(selectedOptions) { + await this.document.update({ 'system.domains': selectedOptions.map(x => x.value) }); } static async removeSubclass(_, button) { @@ -125,9 +130,9 @@ export default class ClassSheet extends DHBaseItemSheet { async selectActionType() { const content = await foundry.applications.handlebars.renderTemplate( - 'systems/daggerheart/templates/views/actionType.hbs', - { types: SYSTEM.ACTIONS.actionTypes } - ), + 'systems/daggerheart/templates/views/actionType.hbs', + { types: SYSTEM.ACTIONS.actionTypes } + ), title = 'Select Action Type', type = 'form', data = {}; diff --git a/module/applications/sheets/items/consumable.mjs b/module/applications/sheets/items/consumable.mjs index 26fdd312..f6fb1ba5 100644 --- a/module/applications/sheets/items/consumable.mjs +++ b/module/applications/sheets/items/consumable.mjs @@ -1,11 +1,13 @@ import DHBaseItemSheet from '../api/base-item.mjs'; export default class ConsumableSheet extends DHBaseItemSheet { + /**@inheritdoc */ static DEFAULT_OPTIONS = { classes: ['consumable'], position: { width: 550 } }; + /**@override */ static PARTS = { header: { template: 'systems/daggerheart/templates/sheets/items/consumable/header.hbs' }, tabs: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' }, diff --git a/module/applications/sheets/items/domainCard.mjs b/module/applications/sheets/items/domainCard.mjs index 285573cc..d29c9d18 100644 --- a/module/applications/sheets/items/domainCard.mjs +++ b/module/applications/sheets/items/domainCard.mjs @@ -1,11 +1,13 @@ import DHBaseItemSheet from '../api/base-item.mjs'; export default class DomainCardSheet extends DHBaseItemSheet { + /**@inheritdoc */ static DEFAULT_OPTIONS = { classes: ['domain-card'], position: { width: 450, height: 700 } }; + /**@override */ static PARTS = { header: { template: 'systems/daggerheart/templates/sheets/items/domainCard/header.hbs' }, tabs: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' }, diff --git a/module/applications/sheets/items/heritage.mjs b/module/applications/sheets/items/heritage.mjs deleted file mode 100644 index 44d950ca..00000000 --- a/module/applications/sheets/items/heritage.mjs +++ /dev/null @@ -1,147 +0,0 @@ -import { actionsTypes } from '../../../data/_module.mjs'; -import DHActionConfig from '../../config/Action.mjs'; -import DHItemMixin from '../item.mjs'; - -export default function DHHeritageMixin(Base) { - return class DHHeritageSheetV2 extends DHItemMixin(Base) { - static DEFAULT_OPTIONS = { - tag: 'form', - position: { width: 450, height: 700 }, - actions: { - addAction: this.addAction, - editAction: this.editAction, - removeAction: this.removeAction, - addEffect: this.addEffect, - editEffect: this.editEffect, - removeEffect: this.removeEffect - }, - form: { - handler: this.updateForm, - submitOnChange: true, - closeOnSubmit: false - } - }; - - static PARTS = { - tabs: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' }, - description: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-description.hbs' }, - actions: { - template: 'systems/daggerheart/templates/sheets/global/tabs/tab-actions.hbs', - scrollable: ['.actions'] - }, - effects: { - template: 'systems/daggerheart/templates/sheets/global/tabs/tab-effects.hbs', - scrollable: ['.effects'] - } - }; - - static TABS = { - description: { - active: true, - cssClass: '', - group: 'primary', - id: 'description', - icon: null, - label: 'DAGGERHEART.Sheets.Feature.Tabs.Description' - }, - actions: { - active: false, - cssClass: '', - group: 'primary', - id: 'actions', - icon: null, - label: 'DAGGERHEART.Sheets.Feature.Tabs.Actions' - }, - effects: { - active: false, - cssClass: '', - group: 'primary', - id: 'effects', - icon: null, - label: 'DAGGERHEART.Sheets.Feature.Tabs.Effects' - } - }; - - async _prepareContext(_options) { - const context = await super._prepareContext(_options); - context.document = this.document; - context.tabs = super._getTabs(this.constructor.TABS); - - return context; - } - - static async updateForm(event, _, formData) { - await this.document.update(formData.object); - this.render(); - } - - async selectActionType() { - const content = await foundry.applications.handlebars.renderTemplate( - 'systems/daggerheart/templates/views/actionType.hbs', - { types: SYSTEM.ACTIONS.actionTypes } - ), - title = 'Select Action Type', - type = 'form', - data = {}; - return Dialog.prompt({ - title, - label: title, - content, - type, - callback: html => { - const form = html[0].querySelector('form'), - fd = new foundry.applications.ux.FormDataExtended(form); - foundry.utils.mergeObject(data, fd.object, { inplace: true }); - return data; - }, - rejectClose: false - }); - } - - static async addAction() { - const actionType = await this.selectActionType(); - const cls = actionsTypes[actionType?.type] ?? actionsTypes.attack, - action = new cls( - { - _id: foundry.utils.randomID(), - type: actionType.type, - name: game.i18n.localize(SYSTEM.ACTIONS.actionTypes[actionType.type].name), - ...cls.getSourceConfig(this.document) - }, - { - parent: this.document - } - ); - await this.document.update({ 'system.actions': [...this.document.system.actions, action] }); - } - - static async editAction(_, button) { - const action = this.document.system.actions[button.dataset.index]; - await new DHActionConfig(action).render(true); - } - - static async removeAction(event, button) { - event.stopPropagation(); - await this.document.update({ - 'system.actions': this.document.system.actions.filter( - (_, index) => index !== Number.parseInt(button.dataset.index) - ) - }); - } - - static async addEffect() { - await this.document.createEmbeddedDocuments('ActiveEffect', [ - { name: game.i18n.localize('DAGGERHEART.Feature.NewEffect') } - ]); - } - - static async editEffect(_, target) { - const effect = this.document.effects.get(target.dataset.effect); - effect.sheet.render(true); - } - - static async removeEffect(_, target) { - await this.document.effects.get(target.dataset.effect).delete(); - } - }; -} diff --git a/module/applications/sheets/items/miscellaneous.mjs b/module/applications/sheets/items/miscellaneous.mjs index 4ef74b5c..62df4e8c 100644 --- a/module/applications/sheets/items/miscellaneous.mjs +++ b/module/applications/sheets/items/miscellaneous.mjs @@ -1,11 +1,13 @@ import DHBaseItemSheet from '../api/base-item.mjs'; export default class MiscellaneousSheet extends DHBaseItemSheet { + /**@inheritdoc */ static DEFAULT_OPTIONS = { classes: ['miscellaneous'], position: { width: 550 } }; + /**@override */ static PARTS = { header: { template: 'systems/daggerheart/templates/sheets/items/miscellaneous/header.hbs' }, tabs: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' }, diff --git a/module/applications/sheets/items/subclass.mjs b/module/applications/sheets/items/subclass.mjs index 1aeb6063..c12593ec 100644 --- a/module/applications/sheets/items/subclass.mjs +++ b/module/applications/sheets/items/subclass.mjs @@ -3,6 +3,7 @@ import { actionsTypes } from '../../../data/_module.mjs'; import DHActionConfig from '../../config/Action.mjs'; export default class SubclassSheet extends DHBaseItemSheet { + /**@inheritdoc */ static DEFAULT_OPTIONS = { classes: ['subclass'], position: { width: 600 }, @@ -14,6 +15,7 @@ export default class SubclassSheet extends DHBaseItemSheet { } }; + /**@override */ static PARTS = { header: { template: 'systems/daggerheart/templates/sheets/items/subclass/header.hbs' }, tabs: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' }, diff --git a/module/applications/sheets/items/weapon.mjs b/module/applications/sheets/items/weapon.mjs index ab018943..50f30f0f 100644 --- a/module/applications/sheets/items/weapon.mjs +++ b/module/applications/sheets/items/weapon.mjs @@ -1,11 +1,16 @@ import DHBaseItemSheet from '../api/base-item.mjs'; -import { weaponFeatures } from '../../../config/itemConfig.mjs'; -import { tagifyElement } from '../../../helpers/utils.mjs'; export default class WeaponSheet extends DHBaseItemSheet { /**@inheritdoc */ static DEFAULT_OPTIONS = { - classes: ['weapon'] + classes: ['weapon'], + tagifyConfigs: [ + { + selector: '.features-input', + choices: () => CONFIG.daggerheart.ITEM.weaponFeatures, + callback: WeaponSheet.#onFeatureSelect + } + ] }; /**@override */ @@ -36,20 +41,11 @@ export default class WeaponSheet extends DHBaseItemSheet { return context; } - /**@inheritdoc */ - _attachPartListeners(partId, htmlElement, options) { - super._attachPartListeners(partId, htmlElement, options); - - const featureInput = htmlElement.querySelector('.features-input'); - tagifyElement(featureInput, weaponFeatures, WeaponSheet.onFeatureSelect.bind(this)); - } - /** * Callback function used by `tagifyElement`. * @param {Array} selectedOptions - The currently selected tag objects. */ - static async onFeatureSelect(selectedOptions) { + static async #onFeatureSelect(selectedOptions) { await this.document.update({ 'system.features': selectedOptions.map(x => ({ value: x.value })) }); - this.render({ force: false, parts: ['settings'] }); } }