From d18141bb658a93d2bad2f65ae05afddb7203173a Mon Sep 17 00:00:00 2001 From: Joaquin Pereyra Date: Tue, 17 Jun 2025 19:09:09 -0300 Subject: [PATCH] FIX: ForeignDocumentUUIDField initialize like a getter FEAT: ForeignDocumentUUIDArrayField created and used --- module/data/_module.mjs | 2 -- module/data/fields/_module.mjs | 1 + .../fields/foreignDocumentUUIDArrayField.mjs | 21 +++++++++++++++++++ .../data/fields/foreignDocumentUUIDField.mjs | 2 +- module/data/item/base.mjs | 2 -- module/data/item/class.mjs | 20 +++++++----------- module/data/item/subclass.mjs | 4 ++-- 7 files changed, 32 insertions(+), 20 deletions(-) create mode 100644 module/data/fields/foreignDocumentUUIDArrayField.mjs diff --git a/module/data/_module.mjs b/module/data/_module.mjs index 828c5275..4284bc41 100644 --- a/module/data/_module.mjs +++ b/module/data/_module.mjs @@ -1,5 +1,3 @@ -export { default as DhClass } from './item/class.mjs'; -export { default as DhSubclass } from './item/subclass.mjs'; export { default as DhCombat } from './combat.mjs'; export { default as DhCombatant } from './combatant.mjs'; diff --git a/module/data/fields/_module.mjs b/module/data/fields/_module.mjs index af61157b..4cdc903c 100644 --- a/module/data/fields/_module.mjs +++ b/module/data/fields/_module.mjs @@ -1,2 +1,3 @@ export { default as FormulaField } from './formulaField.mjs'; export { default as ForeignDocumentUUIDField } from './foreignDocumentUUIDField.mjs'; +export { default as ForeignDocumentUUIDArrayField } from "./foreignDocumentUUIDArrayField.mjs"; \ No newline at end of file diff --git a/module/data/fields/foreignDocumentUUIDArrayField.mjs b/module/data/fields/foreignDocumentUUIDArrayField.mjs new file mode 100644 index 00000000..230a13a5 --- /dev/null +++ b/module/data/fields/foreignDocumentUUIDArrayField.mjs @@ -0,0 +1,21 @@ +import ForeignDocumentUUIDField from "./foreignDocumentUUIDField.mjs"; +/** + * A subclass of {@link foundry.data.fields.ArrayField} that defines an array of foreign document UUID references. + */ +export default class ForeignDocumentUUIDArrayField extends foundry.data.fields.ArrayField { + /** + * @param {foundry.data.types.DocumentUUIDFieldOptions} [fieldOption] - Options to configure each individual ForeignDocumentUUIDField. + * @param {foundry.data.types.ArrayFieldOptions} [options] - Options to configure the array behavior + * @param {foundry.data.types.DataFieldContext} [context] - Optional context for schema processing + */ + constructor(fieldOption = {}, options = {}, context = {}) { + super(new ForeignDocumentUUIDField(fieldOption), options, context); + } + + /** @inheritdoc */ + initialize(value, model, options = {}) { + const v = super.initialize(value, model, options); + return () => v.map(entry => typeof entry === 'function' ? entry() : entry); + } + +} \ No newline at end of file diff --git a/module/data/fields/foreignDocumentUUIDField.mjs b/module/data/fields/foreignDocumentUUIDField.mjs index 29cfaff3..d4fa57b5 100644 --- a/module/data/fields/foreignDocumentUUIDField.mjs +++ b/module/data/fields/foreignDocumentUUIDField.mjs @@ -31,7 +31,7 @@ export default class ForeignDocumentUUIDField extends foundry.data.fields.Docume console.error(error); return value ?? null; } - })(); + }); } /**@override */ diff --git a/module/data/item/base.mjs b/module/data/item/base.mjs index 3dd174d7..6f557866 100644 --- a/module/data/item/base.mjs +++ b/module/data/item/base.mjs @@ -5,7 +5,6 @@ * @property {string} type - The system type that this data model represents. * @property {boolean} hasDescription - Indicates whether items of this type have description field * @property {boolean} isQuantifiable - Indicates whether items of this type have quantity field - * @property {Record} embedded - Record of document names of pseudo-documents and the path to the collection */ const fields = foundry.data.fields; @@ -18,7 +17,6 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel { type: "base", hasDescription: false, isQuantifiable: false, - embedded: {}, }; } diff --git a/module/data/item/class.mjs b/module/data/item/class.mjs index 47acb712..e796dd75 100644 --- a/module/data/item/class.mjs +++ b/module/data/item/class.mjs @@ -1,5 +1,6 @@ import BaseDataItem from './base.mjs'; import ForeignDocumentUUIDField from '../fields/foreignDocumentUUIDField.mjs'; +import ForeignDocumentUUIDArrayField from '../fields/foreignDocumentUUIDArrayField.mjs'; import ActionField from '../fields/actionField.mjs'; export default class DHClass extends BaseDataItem { @@ -18,23 +19,16 @@ export default class DHClass extends BaseDataItem { return { ...super.defineSchema(), domains: new fields.ArrayField(new fields.StringField(), { max: 2 }), - classItems: new fields.ArrayField(new ForeignDocumentUUIDField({ type: 'Item' })), + classItems: new ForeignDocumentUUIDArrayField({type: 'Item', required: false}), + evasion: new fields.NumberField({ initial: 0, integer: true }), hopeFeatures: new foundry.data.fields.ArrayField(new ActionField()), classFeatures: new foundry.data.fields.ArrayField(new ActionField()), - subclasses: new fields.ArrayField( - new ForeignDocumentUUIDField({ type: 'Item', required: false, nullable: true, initial: undefined }) - ), + subclasses: new ForeignDocumentUUIDArrayField({type: 'Item', required: false}), inventory: new fields.SchemaField({ - take: new fields.ArrayField( - new ForeignDocumentUUIDField({ type: 'Item', required: false, nullable: true, initial: undefined }) - ), - choiceA: new fields.ArrayField( - new ForeignDocumentUUIDField({ type: 'Item', required: false, nullable: true, initial: undefined }) - ), - choiceB: new fields.ArrayField( - new ForeignDocumentUUIDField({ type: 'Item', required: false, nullable: true, initial: undefined }) - ) + take: new ForeignDocumentUUIDArrayField({type: 'Item', required: false}), + choiceA: new ForeignDocumentUUIDArrayField({type: 'Item', required: false}), + choiceB: new ForeignDocumentUUIDArrayField({type: 'Item', required: false}), }), characterGuide: new fields.SchemaField({ suggestedTraits: new fields.SchemaField({ diff --git a/module/data/item/subclass.mjs b/module/data/item/subclass.mjs index 1e236ff4..bb473db1 100644 --- a/module/data/item/subclass.mjs +++ b/module/data/item/subclass.mjs @@ -1,11 +1,11 @@ import ActionField from '../fields/actionField.mjs'; -import ForeignDocumentUUIDField from '../fields/foreignDocumentUUIDField.mjs'; +import ForeignDocumentUUIDArrayField from '../fields/foreignDocumentUUIDArrayField.mjs'; import BaseDataItem from './base.mjs'; const featureSchema = () => { return new foundry.data.fields.SchemaField({ name: new foundry.data.fields.StringField({ required: true }), - effects: new foundry.data.fields.ArrayField(new ForeignDocumentUUIDField({ type: 'ActiveEffect' })), + effects: new ForeignDocumentUUIDArrayField({type: 'Item', required: false}), actions: new foundry.data.fields.ArrayField(new ActionField()) }); };