diff --git a/module/applications/characterCreation/characterCreation.mjs b/module/applications/characterCreation/characterCreation.mjs index 8211f896..159b187c 100644 --- a/module/applications/characterCreation/characterCreation.mjs +++ b/module/applications/characterCreation/characterCreation.mjs @@ -503,8 +503,6 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl const secondaryAncestryFeature = this.setup.secondaryAncestry?.uuid ? this.setup.secondaryAncestry.system.secondaryFeature : this.setup.primaryAncestry.system.secondaryFeature; - // const primaryFeature = await this.character.createEmbeddedDocuments('Item', [primaryAncestryFeature]); - // const secondaryFeature = await this.character.createEmbeddedDocuments('Item', [secondaryAncestryFeature]); const ancestry = { ...this.setup.primaryAncestry, diff --git a/module/applications/sheets/api/base-item.mjs b/module/applications/sheets/api/base-item.mjs index 8b439f4d..c13d89b6 100644 --- a/module/applications/sheets/api/base-item.mjs +++ b/module/applications/sheets/api/base-item.mjs @@ -229,7 +229,7 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { if (featureItem) { const feature = this.document.system.features.find(x => x?.id === featureItem.id); if (!feature) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.notifications.featureIsMissing')); + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureIsMissing')); return; } diff --git a/module/applications/sheets/items/ancestry.mjs b/module/applications/sheets/items/ancestry.mjs index 7a55166d..577cc7cd 100644 --- a/module/applications/sheets/items/ancestry.mjs +++ b/module/applications/sheets/items/ancestry.mjs @@ -30,13 +30,13 @@ export default class AncestrySheet extends DHHeritageSheet { static async #addFeature(_event, button) { const feature = await game.items.documentClass.create({ type: 'feature', - name: game.i18n.format('DOCUMENT.New', { type: game.i18n.localize('TYPES.Item.feature') }) + name: game.i18n.format('DOCUMENT.New', { type: game.i18n.localize('TYPES.Item.feature') }), + system: { + primary: button.dataset.type === 'primary' + } }); await this.document.update({ - system: { - features: [...this.document.system.features.map(x => x.uuid), feature.uuid], - [`${button.dataset.type}Feature`]: feature.uuid - } + 'system.features': [...this.document.system.features.map(x => x.uuid), feature.uuid] }); } @@ -47,7 +47,7 @@ export default class AncestrySheet extends DHHeritageSheet { static async #editFeature(_event, button) { const target = button.closest('.feature-item'); const feature = this.document.system[`${target.dataset.type}Feature`]; - if (!feature) { + if (!feature || Object.keys(feature).length === 0) { ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureIsMissing')); return; } @@ -63,8 +63,9 @@ export default class AncestrySheet extends DHHeritageSheet { event.stopPropagation(); const target = button.closest('.feature-item'); const feature = this.document.system[`${target.dataset.type}Feature`]; + const featureExists = feature && Object.keys(feature).length > 0; - if (feature) { + if (featureExists) { const confirmed = await foundry.applications.api.DialogV2.confirm({ window: { title: game.i18n.format('DAGGERHEART.APPLICATIONS.DeleteConfirmation.title', { @@ -77,11 +78,9 @@ export default class AncestrySheet extends DHHeritageSheet { if (!confirmed) return; } + if (featureExists && target.dataset.type === 'primary') await feature.update({ 'system.primary': null }); await this.document.update({ - system: { - features: this.document.system.features.filter(x => x.uuid !== feature.uuid).map(x => x.uuid), - [`${target.dataset.type}Feature`]: null - } + 'system.features': this.document.system.features.filter(x => x && x.uuid !== feature.uuid).map(x => x.uuid) }); } @@ -101,19 +100,13 @@ export default class AncestrySheet extends DHHeritageSheet { const item = await fromUuid(data.uuid); if (item?.type === 'feature') { - const update = { - system: { - features: [...this.document.system.features.map(x => x.uuid), item.uuid] - } - }; - if (event.target.closest('.primary-feature')) { - update.system.primaryFeature = item.uuid; - } else if (event.target.closest('.secondary-feature')) { - update.system.secondaryFeature = item.uuid; + await item.update({ 'system.primary': true }); } - await this.document.update(update); + await this.document.update({ + 'system.features': [...this.document.system.features.map(x => x.uuid), item.uuid] + }); } } } diff --git a/module/applications/sheets/items/class.mjs b/module/applications/sheets/items/class.mjs index c7b84340..2804e795 100644 --- a/module/applications/sheets/items/class.mjs +++ b/module/applications/sheets/items/class.mjs @@ -190,7 +190,7 @@ export default class ClassSheet extends DHBaseItemSheet { const actionPath = this.getActionPath(button.dataset.type); const feature = this.document.system[actionPath].find(x => x?.id === target.dataset.featureId); if (!feature) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.notifications.featureIsMissing')); + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureIsMissing')); return; } diff --git a/module/applications/sheets/items/subclass.mjs b/module/applications/sheets/items/subclass.mjs index 7761dcbc..31eca43a 100644 --- a/module/applications/sheets/items/subclass.mjs +++ b/module/applications/sheets/items/subclass.mjs @@ -50,7 +50,7 @@ export default class SubclassSheet extends DHBaseItemSheet { static async editFeature(_, button) { const feature = this.document.system[button.dataset.type]; if (!feature) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.notifications.featureIsMissing')); + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureIsMissing')); return; } @@ -71,7 +71,7 @@ export default class SubclassSheet extends DHBaseItemSheet { if (featureItem) { const feature = this.document.system[featureItem.dataset.type]; if (!feature) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.notifications.featureIsMissing')); + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.featureIsMissing')); return; } diff --git a/module/data/item/ancestry.mjs b/module/data/item/ancestry.mjs index 7de44124..fdc67a97 100644 --- a/module/data/item/ancestry.mjs +++ b/module/data/item/ancestry.mjs @@ -1,5 +1,4 @@ import ForeignDocumentUUIDArrayField from '../fields/foreignDocumentUUIDArrayField.mjs'; -import ForeignDocumentUUIDField from '../fields/foreignDocumentUUIDField.mjs'; import BaseDataItem from './base.mjs'; export default class DHAncestry extends BaseDataItem { @@ -16,9 +15,15 @@ export default class DHAncestry extends BaseDataItem { static defineSchema() { return { ...super.defineSchema(), - features: new ForeignDocumentUUIDArrayField({ type: 'Item' }), - primaryFeature: new ForeignDocumentUUIDField({ type: 'Item' }), - secondaryFeature: new ForeignDocumentUUIDField({ type: 'Item' }) + features: new ForeignDocumentUUIDArrayField({ type: 'Item' }) }; } + + get primaryFeature() { + return this.features.find(x => x?.system?.primary) ?? (this.features.length > 0 ? {} : null); + } + + get secondaryFeature() { + return this.features.find(x => !x?.system?.primary); + } } diff --git a/module/data/item/feature.mjs b/module/data/item/feature.mjs index a5b5cb3c..6a9b4010 100644 --- a/module/data/item/feature.mjs +++ b/module/data/item/feature.mjs @@ -19,7 +19,8 @@ export default class DHFeature extends BaseDataItem { type: new fields.StringField({ choices: CONFIG.DH.ITEM.featureTypes, nullable: true, initial: null }), originId: new fields.StringField({ nullable: true, initial: null }), identifier: new fields.StringField(), - actions: new fields.ArrayField(new ActionField()) + actions: new fields.ArrayField(new ActionField()), + primary: new fields.BooleanField({ nullable: true, initial: null }) }; } }