From 2ac7ee00791b8e6d68ca5474a7436313649e6796 Mon Sep 17 00:00:00 2001 From: WBHarry Date: Mon, 9 Mar 2026 18:53:48 +0100 Subject: [PATCH] Added resources to the Homebrew Menu --- daggerheart.mjs | 8 +- lang/en.json | 13 +++ .../settings/homebrewSettings.mjs | 103 +++++++++++++++++- .../applications/sheets/actors/character.mjs | 8 +- module/config/_module.mjs | 1 + module/config/actorConfig.mjs | 93 +--------------- module/config/resourceConfig.mjs | 100 +++++++++++++++++ module/config/system.mjs | 2 + module/data/actor/creature.mjs | 53 ++++----- module/data/settings/Homebrew.mjs | 71 ++++++++++++ styles/less/ui/index.less | 1 + .../settings/homebrew-settings/resources.less | 79 ++++++++++++++ .../settings/homebrew-settings/resources.hbs | 78 +++++++++++++ 13 files changed, 488 insertions(+), 122 deletions(-) create mode 100644 module/config/resourceConfig.mjs create mode 100644 styles/less/ui/settings/homebrew-settings/resources.less create mode 100644 templates/settings/homebrew-settings/resources.hbs diff --git a/daggerheart.mjs b/daggerheart.mjs index fa4fff56..8c3e0cc1 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -97,7 +97,7 @@ Hooks.once('init', () => { fields }; - CONFIG.DH.ACTOR.characterResources.basic = { + CONFIG.DH.RESOURCE.characterResources.basic = { id: 'basic', initial: 0, max: 4, @@ -105,7 +105,7 @@ Hooks.once('init', () => { label: 'Basic' }; - CONFIG.DH.ACTOR.characterResources.corruption = { + CONFIG.DH.RESOURCE.characterResources.corruption = { id: 'corruption', initial: 0, max: 4, @@ -123,7 +123,7 @@ Hooks.once('init', () => { } }; - CONFIG.DH.ACTOR.characterResources.fire = { + CONFIG.DH.RESOURCE.characterResources.fire = { id: 'fire', initial: 0, max: 6, @@ -143,7 +143,7 @@ Hooks.once('init', () => { } }; - CONFIG.DH.ACTOR.characterResources.hunger = { + CONFIG.DH.RESOURCE.characterResources.hunger = { id: 'hunger', initial: 0, max: 6, diff --git a/lang/en.json b/lang/en.json index c9d21944..68d590b4 100755 --- a/lang/en.json +++ b/lang/en.json @@ -2266,6 +2266,7 @@ "identify": "Identity", "imagePath": "Image Path", "inactiveEffects": "Inactive Effects", + "initial": "Initial", "inventory": "Inventory", "itemResource": "Item Resource", "itemQuantity": "Item Quantity", @@ -2643,6 +2644,8 @@ "resetMovesText": "Are you sure you want to reset?", "deleteItemTitle": "Delete Homebrew Item", "deleteItemText": "Are you sure you want to delete the item?", + "deleteResourceTitle": "Delete Homebrew Resource", + "deleteResourceText": "Are you sure you want to delete the resource?", "FIELDS": { "maxFear": { "label": "Max Fear" }, "maxHope": { "label": "Max Hope" }, @@ -2651,6 +2654,13 @@ "label": "Max Cards in Loadout", "hint": "Set to blank or 0 for unlimited maximum" }, + "resources": { + "resources": { + "value": { "label": "Icon" }, + "isPath": { "label": "Is Image" }, + "noColorFilter": { "label": "Disable Color Filter" } + } + }, "maxDomains": { "label": "Max Class Domains", "hint": "Max domains you can set on a class" } }, "currency": { @@ -2679,6 +2689,9 @@ "adversaryType": { "title": "Custom Adversary Types", "newType": "Adversary Type" + }, + "resources": { + "typeTitle": "{type} Resources" } }, "Menu": { diff --git a/module/applications/settings/homebrewSettings.mjs b/module/applications/settings/homebrewSettings.mjs index 083c468f..05ccc95c 100644 --- a/module/applications/settings/homebrewSettings.mjs +++ b/module/applications/settings/homebrewSettings.mjs @@ -1,4 +1,5 @@ import { DhHomebrew } from '../../data/settings/_module.mjs'; +import { Resource } from '../../data/settings/Homebrew.mjs'; import { slugify } from '../../helpers/utils.mjs'; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; @@ -44,6 +45,9 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli addAdversaryType: this.addAdversaryType, deleteAdversaryType: this.deleteAdversaryType, selectAdversaryType: this.selectAdversaryType, + addResource: this.addResource, + removeResource: this.removeResource, + resetResourceImage: this.resetResourceImage, save: this.save, resetTokenSizes: this.resetTokenSizes, reset: this.reset @@ -56,6 +60,7 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli settings: { template: 'systems/daggerheart/templates/settings/homebrew-settings/settings.hbs' }, domains: { template: 'systems/daggerheart/templates/settings/homebrew-settings/domains.hbs' }, types: { template: 'systems/daggerheart/templates/settings/homebrew-settings/types.hbs' }, + resources: { template: 'systems/daggerheart/templates/settings/homebrew-settings/resources.hbs' }, itemTypes: { template: 'systems/daggerheart/templates/settings/homebrew-settings/itemFeatures.hbs' }, downtime: { template: 'systems/daggerheart/templates/settings/homebrew-settings/downtime.hbs' }, footer: { template: 'systems/daggerheart/templates/settings/homebrew-settings/footer.hbs' } @@ -64,7 +69,14 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli /** @inheritdoc */ static TABS = { main: { - tabs: [{ id: 'settings' }, { id: 'domains' }, { id: 'types' }, { id: 'itemFeatures' }, { id: 'downtime' }], + tabs: [ + { id: 'settings' }, + { id: 'domains' }, + { id: 'types' }, + { id: 'resources' }, + { id: 'itemFeatures' }, + { id: 'downtime' } + ], initial: 'settings', labelPrefix: 'DAGGERHEART.GENERAL.Tabs' } @@ -77,9 +89,17 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli this.render(); } + _attachPartListeners(partId, htmlElement, options) { + super._attachPartListeners(partId, htmlElement, options); + + for (const element of htmlElement.querySelectorAll('.path-field input')) + element.addEventListener('change', this.toggleResourceIsPath.bind(this)); + } + async _prepareContext(_options) { const context = await super._prepareContext(_options); context.settingFields = this.settings; + context.schemaFields = context.settingFields.schema.fields; return context; } @@ -103,6 +123,8 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli ? { id: this.selected.adversaryType, ...this.settings.adversaryTypes[this.selected.adversaryType] } : null; break; + case 'resources': + break; case 'downtime': context.restOptions = { shortRest: CONFIG.DH.GENERAL.defaultRestOptions.shortRest(), @@ -124,6 +146,33 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli this.render(); } + async toggleResourceIsPath(event) { + const element = event.target.closest('.resource-icon-container'); + const { actorType, resourceKey, imageKey } = element.dataset; + + const current = this.settings.resources[actorType].resources[resourceKey].images[imageKey]; + await this.settings.updateSource({ + [`resources.${actorType}.resources.${resourceKey}.images.${imageKey}`]: { + isPath: !current.isPath, + value: '' + } + }); + + this.render(); + } + + static async resetResourceImage(_event, button) { + const element = button.closest('.resource-icon-container'); + const { actorType, resourceKey, imageKey } = element.dataset; + + await this.settings.updateSource({ + [`resources.${actorType}.resources.${resourceKey}.images.${imageKey}`]: + Resource.getDefaultImageData(imageKey) + }); + + this.render(); + } + static async changeCurrencyIcon(_, target) { const type = target.dataset.currency; const currentIcon = this.settings.currency[type].icon; @@ -466,6 +515,58 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli this.render(); } + static async addResource(_, target) { + const { actorType } = target.dataset; + const content = new foundry.data.fields.StringField({ + label: game.i18n.localize('Resource Identifier'), + required: true + }).toFormGroup({}, { name: 'identifier', localize: true }).outerHTML; + + async function callback(_, button) { + const identifier = button.form.elements.identifier.value; + if (!identifier) return; + + const sluggedIdentifier = slugify(identifier); + + await this.settings.updateSource({ + [`resources.${actorType}.resources.${sluggedIdentifier}`]: Resource.getDefaultResourceData(identifier) + }); + + game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew, this.settings.toObject()); + this.render(); + } + + await foundry.applications.api.DialogV2.prompt({ + content: content, + rejectClose: false, + modal: true, + ok: { callback: callback.bind(this) }, + window: { + title: game.i18n.localize('Set Resource Identifier') + }, + position: { width: 400 } + }); + } + + static async removeResource(_, target) { + const confirmed = await foundry.applications.api.DialogV2.confirm({ + window: { + title: game.i18n.localize(`DAGGERHEART.SETTINGS.Homebrew.deleteResourceTitle`) + }, + content: game.i18n.localize('DAGGERHEART.SETTINGS.Homebrew.deleteResourceText') + }); + + if (!confirmed) return; + + const { actorType, resourceKey } = target.dataset; + await this.settings.updateSource({ + [`resources.${actorType}.resources.-=${resourceKey}`]: null + }); + + game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew, this.settings.toObject()); + this.render(); + } + static async save() { await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew, this.settings.toObject()); this.close(); diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index e2a8d723..b0aecbac 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -245,8 +245,8 @@ export default class CharacterSheet extends DHBaseActorSheet { } async _prepareHeaderContext(context, _options) { - context.hasExtraResources = Object.keys(CONFIG.DH.ACTOR.characterResources).some( - key => !CONFIG.DH.ACTOR.characterBaseResources[key] + context.hasExtraResources = Object.keys(CONFIG.DH.RESOURCE.allCharacterResources()).some( + key => !CONFIG.DH.RESOURCE.characterBaseResources[key] ); } @@ -960,8 +960,8 @@ export default class CharacterSheet extends DHBaseActorSheet { return; } - const extraResources = Object.values(CONFIG.DH.ACTOR.characterResources).reduce((acc, resource) => { - if (CONFIG.DH.ACTOR.characterBaseResources[resource.id]) return acc; + const extraResources = Object.values(CONFIG.DH.RESOURCE.allCharacterResources()).reduce((acc, resource) => { + if (CONFIG.DH.RESOURCE.characterBaseResources[resource.id]) return acc; const resourceData = this.document.system.resources[resource.id]; acc[resource.id] = { diff --git a/module/config/_module.mjs b/module/config/_module.mjs index 560f3fec..7a725f54 100644 --- a/module/config/_module.mjs +++ b/module/config/_module.mjs @@ -11,3 +11,4 @@ export * as settingsConfig from './settingsConfig.mjs'; export * as systemConfig from './system.mjs'; export * as itemBrowserConfig from './itemBrowserConfig.mjs'; export * as triggerConfig from './triggerConfig.mjs'; +export * as resourceConfig from './resourceConfig.mjs'; diff --git a/module/config/actorConfig.mjs b/module/config/actorConfig.mjs index 99d075c2..fb305d53 100644 --- a/module/config/actorConfig.mjs +++ b/module/config/actorConfig.mjs @@ -1,3 +1,5 @@ +import { allAdversaryResources, allCharacterResources, allCompanionResources } from './resourceConfig.mjs'; + export const abilities = { agility: { id: 'agility', @@ -55,101 +57,16 @@ export const abilities = { } }; -/** - * Full custom typing: - * id - * initial - * max - * reverse - * label - * images { - * full { value, isPath, noColorFilter } - * empty { value, isPath noColorFilter } - * } - */ - -export const characterBaseResources = { - hitPoints: { - id: 'hitPoints', - initial: 0, - max: 0, - reverse: true, - label: 'DAGGERHEART.GENERAL.HitPoints.plural', - maxLabel: 'DAGGERHEART.ACTORS.Character.maxHPBonus' - }, - stress: { - id: 'stress', - initial: 0, - max: 6, - reverse: true, - label: 'DAGGERHEART.GENERAL.stress' - }, - hope: { - id: 'hope', - initial: 2, - min: 0, - reverse: false, - label: 'DAGGERHEART.GENERAL.hope' - } -}; - -export const characterResources = { - ...characterBaseResources -}; - -export const adversaryBaseResources = { - hitPoints: { - id: 'hitPoints', - initial: 0, - max: 0, - reverse: true, - label: 'DAGGERHEART.GENERAL.HitPoints.plural', - maxLabel: 'DAGGERHEART.ACTORS.Character.maxHPBonus' - }, - stress: { - id: 'stress', - initial: 0, - max: 0, - reverse: true, - label: 'DAGGERHEART.GENERAL.stress' - } -}; - -export const adversaryResources = { - ...adversaryBaseResources -}; - -export const companionBaseResources = { - stress: { - id: 'stress', - initial: 0, - max: 0, - reverse: true, - label: 'DAGGERHEART.GENERAL.stress' - }, - hope: { - id: 'hope', - initial: 0, - min: 0, - reverse: false, - label: 'DAGGERHEART.GENERAL.hope' - } -}; - -export const companionResources = { - ...companionBaseResources -}; - export const getScrollingTextResources = actorType => ({ armor: { label: 'DAGGERHEART.GENERAL.armor', reverse: true }, ...(actorType === 'character' - ? characterResources + ? allCharacterResources() : actorType === 'adversary' - ? adversaryResources - : companionResources) + ? allAdversaryResources + : allCompanionResources) }); export const featureProperties = { diff --git a/module/config/resourceConfig.mjs b/module/config/resourceConfig.mjs new file mode 100644 index 00000000..4428e20d --- /dev/null +++ b/module/config/resourceConfig.mjs @@ -0,0 +1,100 @@ +/** + * Full custom typing: + * id + * initial + * max + * reverse + * label + * images { + * full { value, isPath, noColorFilter } + * empty { value, isPath noColorFilter } + * } + */ + +export const characterBaseResources = { + hitPoints: { + id: 'hitPoints', + initial: 0, + max: 0, + reverse: true, + label: 'DAGGERHEART.GENERAL.HitPoints.plural', + maxLabel: 'DAGGERHEART.ACTORS.Character.maxHPBonus' + }, + stress: { + id: 'stress', + initial: 0, + max: 6, + reverse: true, + label: 'DAGGERHEART.GENERAL.stress' + }, + hope: { + id: 'hope', + initial: 2, + min: 0, + reverse: false, + label: 'DAGGERHEART.GENERAL.hope' + } +}; + +export const characterResources = { + ...characterBaseResources +}; + +export const allCharacterResources = () => { + const resources = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).resources.character + .resources; + return { + ...Object.keys(resources).reduce((acc, key) => { + acc[key] = { ...resources[key].toObject(), id: key }; + return acc; + }, {}), + ...characterResources + }; +}; + +export const adversaryBaseResources = { + hitPoints: { + id: 'hitPoints', + initial: 0, + max: 0, + reverse: true, + label: 'DAGGERHEART.GENERAL.HitPoints.plural', + maxLabel: 'DAGGERHEART.ACTORS.Character.maxHPBonus' + }, + stress: { + id: 'stress', + initial: 0, + max: 0, + reverse: true, + label: 'DAGGERHEART.GENERAL.stress' + } +}; + +export const adversaryResources = { + ...adversaryBaseResources +}; + +export const allAdversaryResources = () => adversaryResources; + +export const companionBaseResources = { + stress: { + id: 'stress', + initial: 0, + max: 0, + reverse: true, + label: 'DAGGERHEART.GENERAL.stress' + }, + hope: { + id: 'hope', + initial: 0, + min: 0, + reverse: false, + label: 'DAGGERHEART.GENERAL.hope' + } +}; + +export const companionResources = { + ...companionBaseResources +}; + +export const allCompanionResources = () => companionResources; diff --git a/module/config/system.mjs b/module/config/system.mjs index 47a41e8d..31dba518 100644 --- a/module/config/system.mjs +++ b/module/config/system.mjs @@ -2,6 +2,7 @@ import * as GENERAL from './generalConfig.mjs'; import * as DOMAIN from './domainConfig.mjs'; import * as ENCOUNTER from './encounterConfig.mjs'; import * as ACTOR from './actorConfig.mjs'; +import * as RESOURCE from './resourceConfig.mjs'; import * as ITEM from './itemConfig.mjs'; import * as SETTINGS from './settingsConfig.mjs'; import * as EFFECTS from './effectConfig.mjs'; @@ -19,6 +20,7 @@ export const SYSTEM = { GENERAL, DOMAIN, ACTOR, + RESOURCE, ITEM, SETTINGS, EFFECTS, diff --git a/module/data/actor/creature.mjs b/module/data/actor/creature.mjs index 33b47415..db7e6bfa 100644 --- a/module/data/actor/creature.mjs +++ b/module/data/actor/creature.mjs @@ -9,32 +9,35 @@ export default class DhCreature extends BaseDataActor { return { ...super.defineSchema(), resources: new fields.SchemaField({ - ...Object.values(CONFIG.DH.ACTOR[`${this.metadata.type}Resources`]).reduce((acc, resource) => { - if (resource.max !== undefined) { - acc[resource.id] = resourceField( - resource.max, - resource.initial, - resource.label, - resource.reverse, - resource.maxLabel - ); - } else { - acc[resource.id] = new fields.SchemaField( - { - value: new fields.NumberField({ - initial: resource.initial, - min: resource.min, - integer: true, - label: resource.label - }), - isReversed: new fields.BooleanField({ initial: resource.reverse }) - }, - { label: resource.label } - ); - } + ...Object.values(CONFIG.DH.RESOURCE[`all${this.metadata.type.capitalize()}Resources`]()).reduce( + (acc, resource) => { + if (resource.max !== undefined) { + acc[resource.id] = resourceField( + resource.max, + resource.initial, + resource.label, + resource.reverse, + resource.maxLabel + ); + } else { + acc[resource.id] = new fields.SchemaField( + { + value: new fields.NumberField({ + initial: resource.initial, + min: resource.min, + integer: true, + label: resource.label + }), + isReversed: new fields.BooleanField({ initial: resource.reverse }) + }, + { label: resource.label } + ); + } - return acc; - }, {}) + return acc; + }, + {} + ) }), advantageSources: new fields.ArrayField(new fields.StringField(), { label: 'DAGGERHEART.ACTORS.Character.advantageSources.label', diff --git a/module/data/settings/Homebrew.mjs b/module/data/settings/Homebrew.mjs index b8804fa7..fee2b8ca 100644 --- a/module/data/settings/Homebrew.mjs +++ b/module/data/settings/Homebrew.mjs @@ -145,6 +145,16 @@ export default class DhHomebrew extends foundry.abstract.DataModel { description: new fields.StringField() }) ), + resources: new fields.TypedObjectField( + new fields.SchemaField({ + resources: new fields.TypedObjectField(new fields.EmbeddedDataField(Resource)) + }), + { + initial: { + character: { resources: {} } + } + } + ), itemFeatures: new fields.SchemaField({ weaponFeatures: new fields.TypedObjectField( new fields.SchemaField({ @@ -186,3 +196,64 @@ export default class DhHomebrew extends foundry.abstract.DataModel { return source; } } + +export class Resource extends foundry.abstract.DataModel { + static defineSchema() { + const fields = foundry.data.fields; + return { + initial: new fields.NumberField({ + required: true, + integer: true, + initial: 0, + min: 0, + label: 'DAGGERHEART.GENERAL.initial' + }), + max: new fields.NumberField({ + nullable: true, + initial: null, + min: 0, + label: 'DAGGERHEART.GENERAL.max' + }), + label: new fields.StringField({ label: 'DAGGERHEART.GENERAL.label' }), + images: new fields.SchemaField({ + full: imageIconField('fa solid fa-circle'), + empty: imageIconField('fa-regular fa-circle') + }) + }; + } + + static getDefaultResourceData = label => { + const images = Resource._schema.fields.images.getInitialValue(); + return { + initial: 0, + max: 0, + label: label ?? '', + images + }; + }; + + static getDefaultImageData = imageKey => { + return Resource._schema.fields.images.fields[imageKey].getInitialValue(); + }; +} + +const imageIconField = defaultValue => + new foundry.data.fields.SchemaField( + { + value: new foundry.data.fields.StringField({ + initial: defaultValue, + label: 'DAGGERHEART.SETTINGS.Homebrew.FIELDS.resources.resources.value.label' + }), + isPath: new foundry.data.fields.BooleanField({ + required: true, + initial: false, + label: 'DAGGERHEART.SETTINGS.Homebrew.FIELDS.resources.resources.isPath.label' + }), + noColorFilter: new foundry.data.fields.BooleanField({ + required: true, + initial: false, + label: 'DAGGERHEART.SETTINGS.Homebrew.FIELDS.resources.resources.noColorFilter.label' + }) + }, + { required: true } + ); diff --git a/styles/less/ui/index.less b/styles/less/ui/index.less index 065e43c5..5a6e5878 100644 --- a/styles/less/ui/index.less +++ b/styles/less/ui/index.less @@ -27,6 +27,7 @@ @import './settings/settings.less'; @import './settings/homebrew-settings/domains.less'; @import './settings/homebrew-settings/types.less'; +@import './settings/homebrew-settings/resources.less'; @import './sidebar/tabs.less'; @import './sidebar/daggerheartMenu.less'; diff --git a/styles/less/ui/settings/homebrew-settings/resources.less b/styles/less/ui/settings/homebrew-settings/resources.less new file mode 100644 index 00000000..f69d9c5d --- /dev/null +++ b/styles/less/ui/settings/homebrew-settings/resources.less @@ -0,0 +1,79 @@ +.daggerheart.dh-style.setting.homebrew-settings .resources.tab { + .resource-types-container { + display: flex; + flex-direction: column; + gap: 16px; + + .resource-type-container { + width: 100%; + + .resources-container { + display: flex; + flex-direction: column; + gap: 4px; + + .resource-container { + .resource-icons-container { + display: flex; + justify-content: space-between; + gap: 8px; + width: 100%; + + .resource-icon-container { + display: flex; + flex-direction: column; + gap: 4px; + flex: 1; + + .resource-icon-title-container { + display: flex; + align-items: center; + justify-content: center; + gap: 4px; + + &::before, + &::after { + color: @dark-blue; + content: ''; + flex: 1; + height: 2px; + } + + &::before { + background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, @golden 100%); + } + + &::after { + background: linear-gradient(90deg, @golden 0%, rgba(0, 0, 0, 0) 100%); + } + + .resource-icon-title { + font-size: var(--font-size-16); + white-space: nowrap; + display: flex; + align-items: center; + gap: 4px; + color: light-dark(@dark-blue, @golden); + + i { + font-size: 14px; + } + } + } + } + } + } + } + } + } + + .two-columns { + width: 100%; + } + + .form-group.vertical { + > * { + flex: 0 0 100%; + } + } +} diff --git a/templates/settings/homebrew-settings/resources.hbs b/templates/settings/homebrew-settings/resources.hbs new file mode 100644 index 00000000..c9666c67 --- /dev/null +++ b/templates/settings/homebrew-settings/resources.hbs @@ -0,0 +1,78 @@ +
+
+ {{#each settingFields.resources as |type key|}} +
+ + {{localize "DAGGERHEART.SETTINGS.Homebrew.resources.typeTitle" type=(localize (concat "TYPES.Actor." key))}} + + + +
+
+ {{#each type.resources as |resource key|}} +
+ + + {{formField @root.schemaFields.resources.element.fields.resources.element.fields.label value=resource.label name=(concat "resources." @../key ".resources." key ".label") classes="vertical" localize=true }} + +
+ {{formField @root.schemaFields.resources.element.fields.resources.element.fields.initial value=resource.initial name=(concat "resources." @../key ".resources." key ".initial") classes="vertical" localize=true }} + {{formField @root.schemaFields.resources.element.fields.resources.element.fields.max value=resource.max name=(concat "resources." @../key ".resources." key ".max") classes="vertical" localize=true }} +
+ +
+
+ {{#with @root.schemaFields.resources.element.fields.resources.element.fields.images.fields.full.fields}} +
+
+ {{localize "Filled Icon"}} + +
+
+
+ {{#if ../images.full.isPath}} +
+ +
+ {{else}} + {{formGroup this.value value=../images.full.value name=(concat "resources." @../key ".resources." key ".images.full.value") localize=true }} + {{/if}} + {{formGroup this.isPath value=../images.full.isPath name="" classes="path-field" localize=true }} + {{formGroup this.noColorFilter value=../images.full.noColorFilter name=(concat "resources." @../key ".resources." key ".images.full.noColorFilter") localize=true }} +
+ {{/with}} +
+
+ {{#with @root.schemaFields.resources.element.fields.resources.element.fields.images.fields.empty.fields}} +
+
+ {{localize "Empty Icon"}} + +
+
+
+ {{#if ../images.empty.isPath}} +
+ +
+ {{else}} + {{formGroup this.value value=../images.empty.value name=(concat "resources." @../key ".resources." key ".images.empty.value") localize=true }} + {{/if}} + {{formGroup this.isPath value=resource.images.empty.isPath name="" classes="path-field" localize=true }} + {{formGroup this.noColorFilter value=resource.images.empty.noColorFilter name=(concat "resources." @../key ".resources." key ".images.empty.noColorFilter") localize=true }} +
+ {{/with}} +
+
+
+ {{/each}} +
+
+
+ {{/each}} +
+
\ No newline at end of file