diff --git a/module/data/fields/foreignDocumentUUIDField.mjs b/module/data/fields/foreignDocumentUUIDField.mjs new file mode 100644 index 00000000..69331d36 --- /dev/null +++ b/module/data/fields/foreignDocumentUUIDField.mjs @@ -0,0 +1,30 @@ +/** + * A class extending DocumentUUIDField to allow selecting a foreign document reference + * that resolves to either the document, the index(for items in compenidums) or the UUID string. + */ +export default class ForeignDocumentUUIDField extends foundry.data.fields.DocumentUUIDField { + static get _defaults() { + return foundry.utils.mergeObject(super._defaults, { + nullable: true, + readonly: false, + idOnly: false, + }); + } + + initialize(value, _model, _options = {}) { + if (this.idOnly) return value; + return () => { + try { + const doc = fromUuidSync(value); + return doc; + } catch (error) { + console.error(error); + return value ?? null; + } + }; + } + + toObject(value) { + return value?.uuid ?? value; + } +} diff --git a/module/data/interface/featuresSchema.mjs b/module/data/interface/featuresSchema.mjs deleted file mode 100644 index 89a0c1f4..00000000 --- a/module/data/interface/featuresSchema.mjs +++ /dev/null @@ -1,13 +0,0 @@ -const fields = foundry.data.fields; - -const featuresSchema = () => - new fields.ArrayField( - new fields.SchemaField({ - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}), - subclassLevel: new fields.StringField({}) - }) - ); - -export default featuresSchema; diff --git a/module/data/items/ancestry.mjs b/module/data/items/ancestry.mjs index 992d4e90..b4bca270 100644 --- a/module/data/items/ancestry.mjs +++ b/module/data/items/ancestry.mjs @@ -16,8 +16,7 @@ export default class DHAncestry extends BaseDataItem { const fields = foundry.data.fields; return { ...super.defineSchema(), - //TODO: use DocumentUUIDField, DocumentIdField or create LocalDocumentField - abilities: featuresSchema() + //use ForeignDocumentUUIDField for Abilities }; } } diff --git a/module/data/items/class.mjs b/module/data/items/class.mjs index 05550e0a..29a22ba3 100644 --- a/module/data/items/class.mjs +++ b/module/data/items/class.mjs @@ -1,5 +1,6 @@ import { getTier } from '../../helpers/utils.mjs'; import BaseDataItem from './base.mjs'; +import ForeignDocumentUUIDField from '../fields/foreignDocumentUUIDField.mjs'; export default class DHClass extends BaseDataItem { /** @inheritDoc */ @@ -19,64 +20,26 @@ export default class DHClass extends BaseDataItem { domains: new fields.ArrayField(new fields.StringField(), { max: 2 }), classItems: new fields.ArrayField( - //TODO: use DocumentUUIDField, DocumentIdField or create LocalDocumentField - new fields.SchemaField({ - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}) - }) + new ForeignDocumentUUIDField({ type:"Item" }), ), evasion: new fields.NumberField({ initial: 0, integer: true }), features: new fields.ArrayField( - //TODO: use DocumentUUIDField, DocumentIdField or create LocalDocumentField - new fields.SchemaField({ - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}) - }) + new ForeignDocumentUUIDField({ type:"Item" }), ), subclasses: new fields.ArrayField( - //TODO: use DocumentUUIDField, DocumentIdField or create LocalDocumentField - new fields.SchemaField({ - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}) - }) + new ForeignDocumentUUIDField({ type:"Item", required: false, nullable: true, initial: undefined}), ), inventory: new fields.SchemaField({ take: new fields.ArrayField( - //TODO: use DocumentUUIDField, DocumentIdField or create LocalDocumentField - new fields.SchemaField({ - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}) - }) + new ForeignDocumentUUIDField({ type:"Item", required: false, nullable: true, initial: undefined}), ), choiceA: new fields.ArrayField( - //TODO: use DocumentUUIDField, DocumentIdField or create LocalDocumentField - new fields.SchemaField({ - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}) - }) + new ForeignDocumentUUIDField({ type:"Item", required: false, nullable: true, initial: undefined}), ), choiceB: new fields.ArrayField( - //TODO: use DocumentUUIDField, DocumentIdField or create LocalDocumentField - new fields.SchemaField({ - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}) - }) + new ForeignDocumentUUIDField({ type:"Item", required: false, nullable: true, initial: undefined}), ), - extra: new fields.SchemaField( - //TODO: use DocumentUUIDField, DocumentIdField or create LocalDocumentField - { - title: new fields.StringField({}), - description: new fields.StringField({}) - }, - { initial: null, nullable: true } - ) }), characterGuide: new fields.SchemaField({ suggestedTraits: new fields.SchemaField({ @@ -87,48 +50,15 @@ export default class DHClass extends BaseDataItem { presence: new fields.NumberField({ initial: 0, integer: true }), knowledge: new fields.NumberField({ initial: 0, integer: true }) }), - suggestedPrimaryWeapon: new fields.SchemaField( - { - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}) - }, - { initial: null, nullable: true } - ), - suggestedSecondaryWeapon: new fields.SchemaField( - { - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}) - }, - { initial: null, nullable: true } - ), - suggestedArmor: new fields.SchemaField( - { - name: new fields.StringField({}), - img: new fields.StringField({}), - uuid: new fields.StringField({}) - }, - { initial: null, nullable: true } - ), - - //FIXME this not will work - backgroundQuestions: new fields.ArrayField(new fields.StringField({}), { initial: ['', '', ''] }), - - //FIXME this not will work - connections: new fields.ArrayField(new fields.StringField({}), { initial: ['', '', ''] }) + suggestedPrimaryWeapon: new ForeignDocumentUUIDField({ type:"Item" }), + suggestedSecondaryWeapon: new ForeignDocumentUUIDField({ type:"Item" }), + suggestedArmor: new ForeignDocumentUUIDField({ type:"Item" }), }), multiclass: new fields.NumberField({ initial: null, nullable: true, integer: true }), }; } - get multiclassTier() { + get multiclassTier() { return getTier(this.multiclass, true); } - - /** @inheritDoc */ - prepareBaseData() { - super.prepareBaseData() - this.domains = this.domains.map(k => SYSTEM.DOMAIN.domains[k]); - } } diff --git a/module/data/items/community.mjs b/module/data/items/community.mjs index cdbce3b4..7f5d763c 100644 --- a/module/data/items/community.mjs +++ b/module/data/items/community.mjs @@ -17,8 +17,7 @@ export default class DHCommunity extends BaseDataItem { const fields = foundry.data.fields; return { ...super.defineSchema(), - //TODO: use DocumentUUIDField, DocumentIdField or create LocalDocumentField - abilities: featuresSchema() + //use ForeignDocumentUUIDField for Abilities }; } }