Changed so that the ItemBrowser can take in preset.items

This commit is contained in:
WBHarry 2026-05-04 00:31:36 +02:00
parent 533421abba
commit 46af7ad228
2 changed files with 63 additions and 66 deletions

View file

@ -440,9 +440,7 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl
}; };
if (type === 'subclasses') if (type === 'subclasses')
presets.filter = { presets.items = await (await foundry.utils.fromUuid(this.setup.class.uuid)).system.fetchSubclasses();
'system.linkedClass': { key: 'system.linkedClass', value: this.setup.class?.uuid }
};
if (equipment.includes(type)) if (equipment.includes(type))
presets.filter = { presets.filter = {

View file

@ -240,85 +240,84 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
super._replaceHTML(result, content, options); super._replaceHTML(result, content, options);
} }
loadItems() { async loadItems() {
let loadTimeout = this.toggleLoader(true); let loadTimeout = this.toggleLoader(true);
const browserSettings = game.settings.get( const browserSettings = game.settings.get(
CONFIG.DH.id, CONFIG.DH.id,
CONFIG.DH.SETTINGS.gameSettings.CompendiumBrowserSettings CONFIG.DH.SETTINGS.gameSettings.CompendiumBrowserSettings
); );
const promises = [];
game.packs.forEach(pack => { let allItems = [];
promises.push( for (const pack of game.packs) {
new Promise(async resolve => { allItems.push(...(await pack.getDocuments({ type__in: this.selectedMenu?.data?.type })));
const items = await pack.getDocuments({ type__in: this.selectedMenu?.data?.type }); }
resolve(items);
})
);
});
Promise.all(promises).then(async result => { const items = this.presets.items ?? allItems;
this.items = ItemBrowser.sortBy(
result.flatMap(r => r).filter(r => !browserSettings.isEntryExcluded.bind(browserSettings)(r)),
'name'
);
/* If any noticeable slowdown occurs, consider replacing with enriching description on clicking to expand descriptions */ this.items = ItemBrowser.sortBy(
for (const item of this.items) { items.filter(r => !browserSettings.isEntryExcluded.bind(browserSettings)(r)),
if (['weapon', 'armor'].includes(item.type)) { 'name'
item.system.enrichedTags = await foundry.applications.handlebars.renderTemplate( );
'systems/daggerheart/templates/ui/itemBrowser/item-tags.hbs', allItems = ItemBrowser.sortBy(
{ item: item.system } allItems.filter(r => !browserSettings.isEntryExcluded.bind(browserSettings)(r)),
); 'name'
} );
item.system.enrichedDescription =
(await item.system.getEnrichedDescription?.()) ?? /* If any noticeable slowdown occurs, consider replacing with enriching description on clicking to expand descriptions */
(await foundry.applications.ux.TextEditor.implementation.enrichHTML(item.description)); for (const item of this.items) {
if (['weapon', 'armor'].includes(item.type)) {
item.system.enrichedTags = await foundry.applications.handlebars.renderTemplate(
'systems/daggerheart/templates/ui/itemBrowser/item-tags.hbs',
{ item: item.system }
);
} }
item.system.enrichedDescription =
(await item.system.getEnrichedDescription?.()) ??
(await foundry.applications.ux.TextEditor.implementation.enrichHTML(item.description));
}
this.fieldFilter = await this._createFieldFilter(); this.fieldFilter = await this._createFieldFilter(allItems);
if (this.presets?.filter) { if (this.presets?.filter) {
Object.entries(this.presets.filter).forEach(([k, v]) => { Object.entries(this.presets.filter).forEach(([k, v]) => {
const filter = this.fieldFilter.find(c => c.name === k); const filter = this.fieldFilter.find(c => c.name === k);
if (filter) filter.value = v.value; if (filter) filter.value = v.value;
}); });
// await this._onInputFilterBrowser(); // await this._onInputFilterBrowser();
}
const filterList = await foundry.applications.handlebars.renderTemplate(
'systems/daggerheart/templates/ui/itemBrowser/filterContainer.hbs',
{
fieldFilter: this.fieldFilter,
presets: this.presets,
formatChoices: this.formatChoices
} }
);
const filterList = await foundry.applications.handlebars.renderTemplate( this.element.querySelector('.filter-content .wrapper').innerHTML = filterList;
'systems/daggerheart/templates/ui/itemBrowser/filterContainer.hbs', const filterContainer = this.element.querySelector('.filter-header > [data-action="expandContent"]');
{ if (this.fieldFilter.length === 0) filterContainer.setAttribute('disabled', '');
fieldFilter: this.fieldFilter, else filterContainer.removeAttribute('disabled');
presets: this.presets,
formatChoices: this.formatChoices
}
);
this.element.querySelector('.filter-content .wrapper').innerHTML = filterList; const itemList = await foundry.applications.handlebars.renderTemplate(
const filterContainer = this.element.querySelector('.filter-header > [data-action="expandContent"]'); 'systems/daggerheart/templates/ui/itemBrowser/itemContainer.hbs',
if (this.fieldFilter.length === 0) filterContainer.setAttribute('disabled', ''); {
else filterContainer.removeAttribute('disabled'); items: this.items,
menu: this.selectedMenu,
formatLabel: this.formatLabel
}
);
const itemList = await foundry.applications.handlebars.renderTemplate( this.element.querySelector('.item-list').innerHTML = itemList;
'systems/daggerheart/templates/ui/itemBrowser/itemContainer.hbs',
{
items: this.items,
menu: this.selectedMenu,
formatLabel: this.formatLabel
}
);
this.element.querySelector('.item-list').innerHTML = itemList; this._createFilterInputs();
await this._onInputFilterBrowser();
this._createDragProcess();
this._createFilterInputs(); clearTimeout(loadTimeout);
await this._onInputFilterBrowser(); this.toggleLoader(false);
this._createDragProcess();
clearTimeout(loadTimeout);
this.toggleLoader(false);
});
} }
toggleLoader(state) { toggleLoader(state) {
@ -355,12 +354,12 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
); );
} }
async _createFieldFilter() { async _createFieldFilter(items) {
const filters = ItemBrowser.getFolderConfig(this.selectedMenu.data, 'filters'); const filters = ItemBrowser.getFolderConfig(this.selectedMenu.data, 'filters');
for (const f of filters) { for (const f of filters) {
if (typeof f.field === 'string') f.field = foundry.utils.getProperty(game, f.field); if (typeof f.field === 'string') f.field = foundry.utils.getProperty(game, f.field);
else if (typeof f.choices === 'function') { else if (typeof f.choices === 'function') {
f.choices = await f.choices(this.items); f.choices = await f.choices(items);
} }
// Clear field label so template uses our custom label parameter // Clear field label so template uses our custom label parameter