From 3ea050997b29733444c75f4490ca90a218970982 Mon Sep 17 00:00:00 2001 From: Dapoolp Date: Wed, 6 Aug 2025 03:04:00 +0200 Subject: [PATCH] Replace compendium calls --- .../characterCreation/characterCreation.mjs | 21 +++++- module/applications/levelup/levelup.mjs | 21 +++++- .../applications/sheets/actors/character.mjs | 11 ++- .../sheets/api/application-mixin.mjs | 70 ++++++++++++++++++- module/applications/ui/itemBrowser.mjs | 56 ++++++++------- module/config/itemBrowserConfig.mjs | 3 +- styles/less/global/dialog.less | 25 +++++++ styles/less/ui/item-browser/item-browser.less | 5 ++ templates/sheets/actors/character/header.hbs | 12 ++-- .../partials/inventory-fieldset-items-V2.hbs | 2 +- templates/ui/itemBrowser/itemBrowser.hbs | 60 ++++++++-------- templates/ui/itemBrowser/sidebar.hbs | 4 +- 12 files changed, 220 insertions(+), 70 deletions(-) diff --git a/module/applications/characterCreation/characterCreation.mjs b/module/applications/characterCreation/characterCreation.mjs index ddcaaaea..8c07fb9e 100644 --- a/module/applications/characterCreation/characterCreation.mjs +++ b/module/applications/characterCreation/characterCreation.mjs @@ -1,6 +1,7 @@ import { abilities } from '../../config/actorConfig.mjs'; import { burden } from '../../config/generalConfig.mjs'; import { createEmbeddedItemWithEffects } from '../../helpers/utils.mjs'; +import { ItemBrowser } from '../ui/itemBrowser.mjs'; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; @@ -485,8 +486,24 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl }); } - static async viewCompendium(_, target) { - (await game.packs.get(`daggerheart.${target.dataset.compendium}`))?.render(true); + static async viewCompendium(event, target) { + const type = target.dataset.compendium ?? target.dataset.type; + + const presets = { + compendium: "daggerheart", + folder: type, + render: { + noFolder: true + } + }; + + if(type == "domains") + presets.filter = { + 'level.max': { key: 'level.max', value: 1 }, + 'system.domain': { key: 'system.domain', value: this.setup.class?.system.domains ?? null }, + }; + + return new ItemBrowser({ presets }).render({ force: true }); } static async viewItem(_, target) { diff --git a/module/applications/levelup/levelup.mjs b/module/applications/levelup/levelup.mjs index f025c131..3160a938 100644 --- a/module/applications/levelup/levelup.mjs +++ b/module/applications/levelup/levelup.mjs @@ -1,6 +1,7 @@ import { abilities, subclassFeatureLabels } from '../../config/actorConfig.mjs'; import { domains } from '../../config/domainConfig.mjs'; import { getDeleteKeys, tagifyElement } from '../../helpers/utils.mjs'; +import { ItemBrowser } from '../ui/itemBrowser.mjs'; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; @@ -525,8 +526,24 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2) this.render(); } - static async viewCompendium(_, button) { - (await game.packs.get(`daggerheart.${button.dataset.compendium}`))?.render(true); + static async viewCompendium(event, target) { + const type = target.dataset.compendium ?? target.dataset.type; + + const presets = { + compendium: "daggerheart", + folder: type, + render: { + noFolder: true + } + }; + + // if(type == "domains") + // presets.filter = { + // 'level.max': { key: 'level.max', value: 1 }, + // 'system.domain': { key: 'system.domain', value: this.setup.class?.system.domains ?? null }, + // }; + + return new ItemBrowser({ presets }).render({ force: true }); } static async selectPreview(_, button) { diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index 35b3860b..82b0fff3 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -594,7 +594,16 @@ export default class CharacterSheet extends DHBaseActorSheet { */ static async #openPack(_event, button) { const { key } = button.dataset; - game.packs.get(key)?.render(true); + + const presets = { + compendium: "daggerheart", + folder: key, + render: { + noFolder: true + } + }; + + return new ItemBrowser({ presets }).render({ force: true }); } /** diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs index 9e5d6ac9..7c89bf0f 100644 --- a/module/applications/sheets/api/application-mixin.mjs +++ b/module/applications/sheets/api/application-mixin.mjs @@ -1,5 +1,6 @@ const { HandlebarsApplicationMixin } = foundry.applications.api; import { getDocFromElement, getDocFromElementSync, tagifyElement } from '../../../helpers/utils.mjs'; +import { ItemBrowser } from '../../ui/itemBrowser.mjs'; /** * @typedef {import('@client/applications/_types.mjs').ApplicationClickAction} ApplicationClickAction @@ -82,7 +83,9 @@ export default function DHApplicationMixin(Base) { toChat: DHSheetV2.#toChat, useItem: DHSheetV2.#useItem, toggleEffect: DHSheetV2.#toggleEffect, - toggleExtended: DHSheetV2.#toggleExtended + toggleExtended: DHSheetV2.#toggleExtended, + addNewItem: DHSheetV2.#addNewItem, + browseItem: DHSheetV2.#browseItem, }, contextMenus: [ { @@ -409,6 +412,71 @@ export default function DHApplicationMixin(Base) { /* Application Clicks Actions */ /* -------------------------------------------- */ + static async #addNewItem(event, target) { + const { type } = target.dataset; + + const createChoice = await foundry.applications.api.DialogV2.wait({ + classes: ['dh-style', 'two-big-buttons'], + buttons: [ + { + action: "create", + label: "Create Item", + icon: "fa-solid fa-plus" + }, + { + action: "browse", + label: "Browse Compendium", + icon: "fa-solid fa-book" + } + ] + }); + + if(!createChoice) return; + + if(createChoice === "browse") + return DHSheetV2.#browseItem.call(this, event, target); + else + return DHSheetV2.#createDoc.call(this, event, target); + + } + + static async #browseItem(event, target) { + const type = target.dataset.compendium ?? target.dataset.type; + + const presets = {}; + + switch (type) { + case 'loot': + case 'consumable': + case 'armor': + case 'weapon': + presets.compendium = "daggerheart"; + presets.folder = "equipments"; + presets.render = { + noFolder: true + }; + presets.filter = { + type: { key: 'type', value: type, forced: true } + }; + break; + case 'domainCard': + presets.compendium = "daggerheart"; + presets.folder = "domains"; + presets.render = { + noFolder: true + }; + presets.filter = { + 'level.max': { key: 'level.max', value: this.document.system.levelData.level.current }, + 'system.domain': { key: 'system.domain', value: this.document.system.domains }, + }; + break; + default: + return; + } + + return new ItemBrowser({ presets }).render({ force: true }); + } + /** * Create an embedded document. * @type {ApplicationClickAction} diff --git a/module/applications/ui/itemBrowser.mjs b/module/applications/ui/itemBrowser.mjs index 168625bb..ffc1b77b 100644 --- a/module/applications/ui/itemBrowser.mjs +++ b/module/applications/ui/itemBrowser.mjs @@ -15,6 +15,10 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { this.fieldFilter = []; this.selectedMenu = { path: [], data: null }; this.config = CONFIG.DH.ITEMBROWSER.compendiumConfig; + this.presets = options.presets; + + if(this.presets?.folder) + ItemBrowser.selectFolder.call(this, null, null, this.presets.compendium, this.presets.folder); } /** @inheritDoc */ @@ -37,10 +41,10 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { sortList: this.sortList }, position: { - width: 1000, - height: 800 - // top: "200px", - // left: "120px" + top: 70, + left: 120, + width: 800, + height: 600 } }; @@ -89,6 +93,11 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { this._createSearchFilter(); this._createFilterInputs(); this._createDragProcess(); + + if(this.presets?.filter) { + Object.entries(this.presets.filter).forEach(([k,v]) => this.fieldFilter.find(c => c.name === k).value = v.value); + await this._onInputFilterBrowser(); + } } /* -------------------------------------------- */ @@ -105,7 +114,7 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { context.formatChoices = this.formatChoices; context.fieldFilter = this.fieldFilter = this._createFieldFilter(); context.items = this.items; - console.log(this.items); + context.presets = this.presets; return context; } @@ -128,10 +137,10 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { return folders; } - static async selectFolder(_, target) { + static async selectFolder(_, target, compend, folder) { const config = foundry.utils.deepClone(this.config), - compendium = target.closest('[data-compendium-id]').dataset.compendiumId, - folderId = target.dataset.folderId, + compendium = compend ?? target.closest('[data-compendium-id]').dataset.compendiumId, + folderId = folder ?? target.dataset.folderId, folderPath = `${compendium}.folders.${folderId}`, folderData = foundry.utils.getProperty(config, folderPath); @@ -186,9 +195,9 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { if (typeof f.field === 'string') f.field = foundry.utils.getProperty(game, f.field); else if (typeof f.choices === 'function') { f.choices = f.choices(); - console.log(f.choices) } f.name ??= f.key; + f.value = this.presets.filter?.[f.name]?.value ?? null; // filters.push(f); }); return filters; @@ -286,11 +295,9 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { async _onInputFilterBrowser(event) { this.#filteredItems.browser.input.clear(); - this.fieldFilter.find(f => f.name === event.target.name).value = event.target.value; + if(event) this.fieldFilter.find(f => f.name === event.target.name).value = event.target.value; - // console.log(_event, html, filters) - - for (const li of event.target.closest('[data-application-part="list"]').querySelectorAll('.item-container')) { + for (const li of this.element.querySelectorAll('.item-container')) { const itemUUID = li.dataset.itemUuid, item = this.items.find(i => i.uuid === itemUUID); @@ -308,6 +315,8 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { li.hidden = !(search.has(item.id) && matchesMenu); // li.hidden = !(matchesMenu); } + + console.log(this.fieldFilter) } /** @@ -316,24 +325,18 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { * @param {*} filter */ static evaluateFilter(obj, filter) { - const docValue = foundry.utils.getProperty(obj, filter.field); - const filterValue = filter.value; + let docValue = foundry.utils.getProperty(obj, filter.field); + let filterValue = filter.value; switch (filter.operator) { case "contains2": - return Array.isArray(docValue) ? docValue.includes(filterValue) : [docValue].includes(filterValue); - break; + filterValue = Array.isArray(filterValue) ? filterValue : [filterValue]; + docValue = Array.isArray(docValue) ? docValue : [docValue]; + return docValue.some(dv => filterValue.includes(dv)); case "contains3": return docValue.some(f => f.value === filterValue); - break; default: return foundry.applications.ux.SearchFilter.evaluateFilter(obj, filter); - break; } - if(filter.operator === "contains2") { - const docValue = foundry.utils.getProperty(obj, filter.field); - const filterValue = filter.value; - return Array.isArray(docValue) ? docValue.includes(filterValue) : [docValue].includes(filterValue); - } return foundry.applications.ux.SearchFilter.evaluateFilter(obj, filter) } createFilterData(filter) { @@ -414,8 +417,9 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { async _onDragStart(event) { // console.log(event) // ui.context?.close({ animate: false }); - const { itemUuid } = event.target.closest('[data-item-uuid]').dataset; - const dragData = foundry.utils.fromUuidSync(itemUuid).toDragData(); + const { itemUuid } = event.target.closest('[data-item-uuid]').dataset, + item = await foundry.utils.fromUuid(itemUuid), + dragData = item.toDragData(); // console.log(dragData) // const dragData = { UUID: itemUuid }; event.dataTransfer.setData('text/plain', JSON.stringify(dragData)); diff --git a/module/config/itemBrowserConfig.mjs b/module/config/itemBrowserConfig.mjs index 2ae9e4bb..5d20ae7d 100644 --- a/module/config/itemBrowserConfig.mjs +++ b/module/config/itemBrowserConfig.mjs @@ -169,7 +169,8 @@ export const typeConfig = { { key: "system.domain", label: "Domain", - field: 'system.api.models.items.DHDomainCard.schema.fields.domain' + field: 'system.api.models.items.DHDomainCard.schema.fields.domain', + operator: "contains2" }, { key: "system.level", diff --git a/styles/less/global/dialog.less b/styles/less/global/dialog.less index 8c86e825..7fd71f18 100644 --- a/styles/less/global/dialog.less +++ b/styles/less/global/dialog.less @@ -67,4 +67,29 @@ gap: 5px; } } + + &.two-big-buttons { + .window-content { + padding-top: 0; + + .form-footer { + display: grid; + grid-auto-columns: 1fr; + grid-auto-flow: column; + } + + button[type="submit"] { + flex-direction: column-reverse; + font-family: @font-body; + font-size: var(--font-size-14); + height: unset; + padding: .5rem 1rem; + white-space: nowrap; + + i { + font-size: var(--font-size-20); + } + } + } + } } diff --git a/styles/less/ui/item-browser/item-browser.less b/styles/less/ui/item-browser/item-browser.less index f8356502..9dd453ec 100644 --- a/styles/less/ui/item-browser/item-browser.less +++ b/styles/less/ui/item-browser/item-browser.less @@ -333,5 +333,10 @@ font-family: @font-body; } } + + [disabled] { + opacity: .5; + pointer-events: none; + } } } diff --git a/templates/sheets/actors/character/header.hbs b/templates/sheets/actors/character/header.hbs index 827d49d6..56dc1a14 100644 --- a/templates/sheets/actors/character/header.hbs +++ b/templates/sheets/actors/character/header.hbs @@ -31,25 +31,25 @@ {{#if document.system.class.value}} {{document.system.class.value.name}} {{else}} - {{localize 'TYPES.Item.class'}} + {{localize 'TYPES.Item.class'}} {{/if}} {{#if document.system.class.subclass}} {{document.system.class.subclass.name}} {{else}} - {{localize 'TYPES.Item.subclass'}} + {{localize 'TYPES.Item.subclass'}} {{/if}} {{#if document.system.community}} {{document.system.community.name}} {{else}} - {{localize 'TYPES.Item.community'}} + {{localize 'TYPES.Item.community'}} {{/if}} {{#if document.system.ancestry}} {{document.system.ancestry.name}} {{else}} - {{localize 'TYPES.Item.ancestry'}} + {{localize 'TYPES.Item.ancestry'}} {{/if}} @@ -58,13 +58,13 @@ {{#if document.system.multiclass.value}} {{document.system.multiclass.value.name}} {{else}} - {{localize 'DAGGERHEART.GENERAL.multiclass'}} + {{localize 'DAGGERHEART.GENERAL.multiclass'}} {{/if}} {{#if document.system.multiclass.subclass}} {{document.system.multiclass.subclass.name}} {{else}} - {{localize 'TYPES.Item.subclass'}} + {{localize 'TYPES.Item.subclass'}} {{/if}} {{/if}} diff --git a/templates/sheets/global/partials/inventory-fieldset-items-V2.hbs b/templates/sheets/global/partials/inventory-fieldset-items-V2.hbs index cc030523..c5ef4c69 100644 --- a/templates/sheets/global/partials/inventory-fieldset-items-V2.hbs +++ b/templates/sheets/global/partials/inventory-fieldset-items-V2.hbs @@ -26,7 +26,7 @@ Parameters: {{localize title}} {{#if canCreate}} - {{#if menu.data }} - -
-
- - {{#if fieldFilter}} - - {{/if}} - + {{#unless (or presets.render.lite presets.render.noFolder)}} + + {{/unless}} +
+ {{#unless presets.render.lite}} +
+ + {{#if (and fieldFilter (not presets.render.noFilter))}} + + {{/if}} + +
+ {{/unless}}
{{#each fieldFilter}} {{#if choices }} -
+
{{else}} {{#if filtered }} - {{formField field localize=true blank="" name=name choices=(@root.formatChoices this) valueAttr="value" dataset=(object key=key)}} + {{formField field localize=true blank="" name=name choices=(@root.formatChoices this) valueAttr="value" dataset=(object key=key) value=value}} {{else}} {{#if field.label}} - {{formField field localize=true blank="" name=name dataset=(object key=key) value=""}} + {{formField field localize=true blank="" name=name dataset=(object key=key) value=value}} {{else}} - {{formField field localize=true blank="" name=name dataset=(object key=key) label=label value=""}} + {{formField field localize=true blank="" name=name dataset=(object key=key) label=label value=value}} {{/if}} {{/if}} {{/if}} diff --git a/templates/ui/itemBrowser/sidebar.hbs b/templates/ui/itemBrowser/sidebar.hbs index f722d8c4..0d873c90 100644 --- a/templates/ui/itemBrowser/sidebar.hbs +++ b/templates/ui/itemBrowser/sidebar.hbs @@ -1,4 +1,4 @@ -
+
{{#each compendiums}}
@@ -25,4 +25,4 @@
{{/each}} -
\ No newline at end of file +