fix item list columns and pretier itemBrowser.mjs (#729)

This commit is contained in:
Murilo Brito 2025-08-09 08:40:20 -03:00 committed by GitHub
parent 7f3a83564b
commit 1c000c7cfe
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 44 additions and 44 deletions

View file

@ -17,7 +17,7 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
this.config = CONFIG.DH.ITEMBROWSER.compendiumConfig; this.config = CONFIG.DH.ITEMBROWSER.compendiumConfig;
this.presets = options.presets; this.presets = options.presets;
if(this.presets?.compendium && this.presets?.folder) if (this.presets?.compendium && this.presets?.folder)
ItemBrowser.selectFolder.call(this, null, null, this.presets.compendium, this.presets.folder); ItemBrowser.selectFolder.call(this, null, null, this.presets.compendium, this.presets.folder);
} }
@ -26,7 +26,6 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
id: 'itemBrowser', id: 'itemBrowser',
classes: ['daggerheart', 'dh-style', 'dialog', 'compendium-browser'], classes: ['daggerheart', 'dh-style', 'dialog', 'compendium-browser'],
tag: 'div', tag: 'div',
// title: 'Item Browser',
window: { window: {
frame: true, frame: true,
title: 'Compendium Browser', title: 'Compendium Browser',
@ -41,9 +40,8 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
sortList: this.sortList sortList: this.sortList
}, },
position: { position: {
top: 330, left: 100,
left: 120, width: 850,
width: 800,
height: 600 height: 600
} }
}; };
@ -88,16 +86,14 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
/** @inheritDoc */ /** @inheritDoc */
async _preFirstRender(context, options) { async _preFirstRender(context, options) {
if(context.presets?.render?.noFolder || context.presets?.render?.lite) if (context.presets?.render?.noFolder || context.presets?.render?.lite) options.position.width = 600;
options.position.width = 600;
await super._preFirstRender(context, options); await super._preFirstRender(context, options);
} }
/** @inheritDoc */ /** @inheritDoc */
async _preRender(context, options) { async _preRender(context, options) {
if (context.presets?.render?.noFolder || context.presets?.render?.lite)
if(context.presets?.render?.noFolder || context.presets?.render?.lite)
options.parts.splice(options.parts.indexOf('sidebar'), 1); options.parts.splice(options.parts.indexOf('sidebar'), 1);
await super._preRender(context, options); await super._preRender(context, options);
@ -110,18 +106,17 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
this._createSearchFilter(); this._createSearchFilter();
this._createFilterInputs(); this._createFilterInputs();
this._createDragProcess(); this._createDragProcess();
if(context.presets?.render?.lite)
this.element.classList.add('lite');
if(context.presets?.render?.noFolder)
this.element.classList.add('no-folder');
if(context.presets?.render?.noFilter)
this.element.classList.add('no-filter');
if(this.presets?.filter) { if (context.presets?.render?.lite) this.element.classList.add('lite');
Object.entries(this.presets.filter).forEach(([k,v]) => this.fieldFilter.find(c => c.name === k).value = v.value);
if (context.presets?.render?.noFolder) this.element.classList.add('no-folder');
if (context.presets?.render?.noFilter) this.element.classList.add('no-filter');
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(); await this._onInputFilterBrowser();
} }
} }
@ -198,6 +193,7 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
formatLabel(item, field) { formatLabel(item, field) {
const property = foundry.utils.getProperty(item, field.key); const property = foundry.utils.getProperty(item, field.key);
if (Array.isArray(property)) property.join(', ');
if (typeof field.format !== 'function') return property ?? '-'; if (typeof field.format !== 'function') return property ?? '-';
return field.format(property); return field.format(property);
} }
@ -315,19 +311,18 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
async _onInputFilterBrowser(event) { async _onInputFilterBrowser(event) {
this.#filteredItems.browser.input.clear(); this.#filteredItems.browser.input.clear();
if(event) 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;
for (const li of this.element.querySelectorAll('.item-container')) { for (const li of this.element.querySelectorAll('.item-container')) {
const itemUUID = li.dataset.itemUuid, const itemUUID = li.dataset.itemUuid,
item = this.items.find(i => i.uuid === itemUUID); item = this.items.find(i => i.uuid === itemUUID);
if(!item) continue; if (!item) continue;
const matchesMenu = const matchesMenu =
this.fieldFilter.length === 0 || this.fieldFilter.length === 0 ||
this.fieldFilter.every(f => ( this.fieldFilter.every(
!f.value && f.value !== false) || f => (!f.value && f.value !== false) || ItemBrowser.evaluateFilter(item, this.createFilterData(f))
ItemBrowser.evaluateFilter(item, this.createFilterData(f))
); );
if (matchesMenu) this.#filteredItems.browser.input.add(item.id); if (matchesMenu) this.#filteredItems.browser.input.add(item.id);
@ -335,21 +330,21 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
li.hidden = !(search.has(item.id) && matchesMenu); li.hidden = !(search.has(item.id) && matchesMenu);
} }
} }
/** /**
* Foundry evaluateFilter doesn't allow you to match if filter values are included into item data * Foundry evaluateFilter doesn't allow you to match if filter values are included into item data
* @param {*} obj * @param {*} obj
* @param {*} filter * @param {*} filter
*/ */
static evaluateFilter(obj, filter) { static evaluateFilter(obj, filter) {
let docValue = foundry.utils.getProperty(obj, filter.field); let docValue = foundry.utils.getProperty(obj, filter.field);
let filterValue = filter.value; let filterValue = filter.value;
switch (filter.operator) { switch (filter.operator) {
case "contains2": case 'contains2':
filterValue = Array.isArray(filterValue) ? filterValue : [filterValue]; filterValue = Array.isArray(filterValue) ? filterValue : [filterValue];
docValue = Array.isArray(docValue) ? docValue : [docValue]; docValue = Array.isArray(docValue) ? docValue : [docValue];
return docValue.some(dv => filterValue.includes(dv)); return docValue.some(dv => filterValue.includes(dv));
case "contains3": case 'contains3':
return docValue.some(f => f.value === filterValue); return docValue.some(f => f.value === filterValue);
default: default:
return foundry.applications.ux.SearchFilter.evaluateFilter(obj, filter); return foundry.applications.ux.SearchFilter.evaluateFilter(obj, filter);
@ -373,30 +368,33 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
this.render({ force: true }); this.render({ force: true });
} }
static getFolderConfig(folder, property = "columns") { static getFolderConfig(folder, property = 'columns') {
if(!folder) return []; if (!folder) return [];
return folder[property] ?? CONFIG.DH.ITEMBROWSER.typeConfig[folder.listType]?.[property] ?? []; return folder[property] ?? CONFIG.DH.ITEMBROWSER.typeConfig[folder.listType]?.[property] ?? [];
} }
static sortList(_, target) { static sortList(_, target) {
const key = target.dataset.sortKey, const key = target.dataset.sortKey,
type = !target.dataset.sortType || target.dataset.sortType === "DESC" ? "ASC" : "DESC", type = !target.dataset.sortType || target.dataset.sortType === 'DESC' ? 'ASC' : 'DESC',
itemListContainer = target.closest(".compendium-results").querySelector(".item-list"), itemListContainer = target.closest('.compendium-results').querySelector('.item-list'),
itemList = itemListContainer.querySelectorAll(".item-container"); itemList = itemListContainer.querySelectorAll('.item-container');
target.closest(".item-list-header").querySelectorAll('[data-sort-key]').forEach(b => b.dataset.sortType = ""); target
.closest('.item-list-header')
.querySelectorAll('[data-sort-key]')
.forEach(b => (b.dataset.sortType = ''));
target.dataset.sortType = type; target.dataset.sortType = type;
const newOrder = [...itemList].reverse().sort((a, b) => { const newOrder = [...itemList].reverse().sort((a, b) => {
const aProp = a.querySelector(`[data-item-key="${key}"]`), const aProp = a.querySelector(`[data-item-key="${key}"]`),
bProp = b.querySelector(`[data-item-key="${key}"]`) bProp = b.querySelector(`[data-item-key="${key}"]`);
if(type === "DESC") { if (type === 'DESC') {
return aProp.innerText < bProp.innerText ? 1 : -1; return aProp.innerText < bProp.innerText ? 1 : -1;
} else { } else {
return aProp.innerText > bProp.innerText ? 1 : -1; return aProp.innerText > bProp.innerText ? 1 : -1;
} }
}); });
itemListContainer.replaceChildren(...newOrder); itemListContainer.replaceChildren(...newOrder);
} }

View file

@ -227,14 +227,16 @@
display: flex; display: flex;
> * { > * {
flex: 1; flex: 2.5;
text-align: center;
} }
.item-list-img { .item-list-img {
width: 40px; width: 40px;
flex: unset; flex: unset;
} }
.item-list-name { .item-list-name {
flex-grow: 3 !important; flex-grow: 3;
text-align: start;
} }
} }