FEAT: add filters getters on FilterMenu class

This commit is contained in:
Joaquin Pereyra 2025-07-02 21:49:46 -03:00
parent 77edc73b2c
commit 0ad4c8d71e
5 changed files with 122 additions and 51 deletions

View file

@ -571,23 +571,7 @@ export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) {
content: '.items-section',
callback: this._onMenuFilterInventory.bind(this),
target: '.filter-button',
filters: [{
group: "Type",
name: "Weapons",
filter: {
field: "type",
operator: foundry.applications.ux.SearchFilter.OPERATORS.EQUALS,
value: "weapon",
}
}, {
group: "Type",
name: "Armor",
filter: {
field: "type",
operator: foundry.applications.ux.SearchFilter.OPERATORS.EQUALS,
value: "armor",
}
}],
filters: FilterMenu.invetoryFilters,
},
{
key: 'loadout',
@ -595,7 +579,7 @@ export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) {
content: '.items-section',
callback: this._onMenuFilterLoadout.bind(this),
target: '.filter-button',
filters: [],
filters: FilterMenu.cardsFilters,
}
];

View file

@ -50,7 +50,7 @@ export default class FilterMenu extends foundry.applications.ux.ContextMenu {
await super.render(target, { ...options, animate: false });
// Create menu structure
const menu = document.createElement("div");
const menu = document.createElement("menu");
menu.className = "filter-menu";
// Group items by their group property
@ -158,4 +158,87 @@ export default class FilterMenu extends foundry.applications.ux.ContextMenu {
this.callback(event, this.contentElement, filters);
}
}
/**
* Generate and return a sorted array of inventory filters.
* @returns {Array<Object>} An array of filter objects, sorted by name within each group.
*/
static get invetoryFilters() {
const { OPERATORS } = foundry.applications.ux.SearchFilter;
const typesFilters = Object.entries(CONFIG.Item.dataModels)
.filter(([, { metadata }]) => metadata.isInventoryItem)
.map(([type, { metadata }]) => ({
group: game.i18n.localize("Type"),
name: game.i18n.localize(metadata.label),
filter: {
field: "type",
operator: OPERATORS.EQUALS,
value: type
}
}));
const burdenFilter = Object.values(CONFIG.daggerheart.GENERAL.burden).map(({ value, label }) => ({
group: game.i18n.localize("DAGGERHEART.Sheets.Weapon.Burden"),
name: game.i18n.localize(label),
filter: {
field: "system.burden",
operator: OPERATORS.EQUALS,
value: value
}
}));
const damageTypeFilter = Object.values(CONFIG.daggerheart.GENERAL.damageTypes).map(({ id, abbreviation }) => ({
group: "Damage Type", //TODO localize
name: game.i18n.localize(abbreviation),
filter: {
field: "system.damage.type",
operator: OPERATORS.EQUALS,
value: id
}
}));
return [
...game.i18n.sortObjects(typesFilters, "name"),
...game.i18n.sortObjects(burdenFilter, "name"),
...game.i18n.sortObjects(damageTypeFilter, "name"),
];
}
/**
* Generate and return a sorted array of inventory filters.
* @returns {Array<Object>} An array of filter objects, sorted by name within each group.
*/
static get cardsFilters() {
const { OPERATORS } = foundry.applications.ux.SearchFilter;
const typesFilters = Object.values(CONFIG.daggerheart.DOMAIN.cardTypes)
.map(({ id, label }) => ({
group: game.i18n.localize("Type"),
name: game.i18n.localize(label),
filter: {
field: "system.type",
operator: OPERATORS.EQUALS,
value: id
}
}));
const domainFilter = Object.values(CONFIG.daggerheart.DOMAIN.domains).map(({id, label}) => ({
group: game.i18n.localize("DAGGERHEART.Sheets.DomainCard.Domain"),
name: game.i18n.localize(label),
filter: {
field: "system.domain",
operator: OPERATORS.EQUALS,
value: id
}
}))
const sort = (arr) => game.i18n.sortObjects(arr, "name");
return [
...sort(typesFilters),
...sort(domainFilter),
];
}
}

View file

@ -723,7 +723,3 @@ export const actionTypes = {
label: 'DAGGERHEART.ActionType.Reaction'
}
};
export const invetoryFilters = [
];