mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-01-17 07:36:26 +01:00
Done
This commit is contained in:
parent
eb8f055a8f
commit
d5323d4cb9
15 changed files with 188 additions and 201 deletions
|
|
@ -162,6 +162,9 @@ Hooks.on('ready', async () => {
|
||||||
if (game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.appearance).displayFear !== 'hide')
|
if (game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.appearance).displayFear !== 'hide')
|
||||||
ui.resources.render({ force: true });
|
ui.resources.render({ force: true });
|
||||||
|
|
||||||
|
if(!(ui.compendiumBrowser instanceof applications.ui.ItemBrowser))
|
||||||
|
ui.compendiumBrowser = new applications.ui.ItemBrowser();
|
||||||
|
|
||||||
registerCountdownHooks();
|
registerCountdownHooks();
|
||||||
socketRegistration.registerSocketHooks();
|
socketRegistration.registerSocketHooks();
|
||||||
registerRollDiceHooks();
|
registerRollDiceHooks();
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import { abilities } from '../../config/actorConfig.mjs';
|
import { abilities } from '../../config/actorConfig.mjs';
|
||||||
import { burden } from '../../config/generalConfig.mjs';
|
import { burden } from '../../config/generalConfig.mjs';
|
||||||
import { ItemBrowser } from '../ui/itemBrowser.mjs';
|
|
||||||
import { createEmbeddedItemsWithEffects, createEmbeddedItemWithEffects } from '../../helpers/utils.mjs';
|
import { createEmbeddedItemsWithEffects, createEmbeddedItemWithEffects } from '../../helpers/utils.mjs';
|
||||||
|
|
||||||
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
|
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
|
||||||
|
|
@ -46,8 +45,6 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl
|
||||||
};
|
};
|
||||||
|
|
||||||
this._dragDrop = this._createDragDropHandlers();
|
this._dragDrop = this._createDragDropHandlers();
|
||||||
|
|
||||||
this.itemBrowser = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get title() {
|
get title() {
|
||||||
|
|
@ -448,7 +445,7 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl
|
||||||
'type': { key: 'type', value: type }
|
'type': { key: 'type', value: type }
|
||||||
};
|
};
|
||||||
|
|
||||||
return (this.itemBrowser = await new ItemBrowser({ presets }).render({ force: true }));
|
ui.compendiumBrowser.open(presets);
|
||||||
}
|
}
|
||||||
|
|
||||||
static async viewItem(_, target) {
|
static async viewItem(_, target) {
|
||||||
|
|
@ -566,7 +563,7 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl
|
||||||
{ overwrite: true }
|
{ overwrite: true }
|
||||||
);
|
);
|
||||||
|
|
||||||
if (this.itemBrowser) this.itemBrowser.close();
|
if (ui.compendiumBrowser) ui.compendiumBrowser.close();
|
||||||
this.close();
|
this.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import { abilities, subclassFeatureLabels } from '../../config/actorConfig.mjs';
|
import { abilities, subclassFeatureLabels } from '../../config/actorConfig.mjs';
|
||||||
import { getDeleteKeys, tagifyElement } from '../../helpers/utils.mjs';
|
import { getDeleteKeys, tagifyElement } from '../../helpers/utils.mjs';
|
||||||
import { ItemBrowser } from '../ui/itemBrowser.mjs';
|
|
||||||
|
|
||||||
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
|
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
|
||||||
|
|
||||||
|
|
@ -12,8 +11,6 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2)
|
||||||
|
|
||||||
this._dragDrop = this._createDragDropHandlers();
|
this._dragDrop = this._createDragDropHandlers();
|
||||||
this.tabGroups.primary = 'advancements';
|
this.tabGroups.primary = 'advancements';
|
||||||
|
|
||||||
this.itemBrowser = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get title() {
|
get title() {
|
||||||
|
|
@ -558,7 +555,7 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return (this.itemBrowser = await new ItemBrowser({ presets }).render({ force: true }));
|
ui.compendiumBrowser.open(presets);
|
||||||
}
|
}
|
||||||
|
|
||||||
static async selectPreview(_, button) {
|
static async selectPreview(_, button) {
|
||||||
|
|
@ -661,7 +658,8 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2)
|
||||||
}, {});
|
}, {});
|
||||||
|
|
||||||
await this.actor.levelUp(levelupData);
|
await this.actor.levelUp(levelupData);
|
||||||
if (this.itemBrowser) this.itemBrowser.close();
|
|
||||||
|
if (ui.compendiumBrowser) ui.compendiumBrowser.close();
|
||||||
this.close();
|
this.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import { CharacterLevelup, LevelupViewMode } from '../../levelup/_module.mjs';
|
||||||
import DhCharacterCreation from '../../characterCreation/characterCreation.mjs';
|
import DhCharacterCreation from '../../characterCreation/characterCreation.mjs';
|
||||||
import FilterMenu from '../../ux/filter-menu.mjs';
|
import FilterMenu from '../../ux/filter-menu.mjs';
|
||||||
import { getDocFromElement, getDocFromElementSync } from '../../../helpers/utils.mjs';
|
import { getDocFromElement, getDocFromElementSync } from '../../../helpers/utils.mjs';
|
||||||
import { ItemBrowser } from '../../ui/itemBrowser.mjs';
|
|
||||||
|
|
||||||
/**@typedef {import('@client/applications/_types.mjs').ApplicationClickAction} ApplicationClickAction */
|
/**@typedef {import('@client/applications/_types.mjs').ApplicationClickAction} ApplicationClickAction */
|
||||||
|
|
||||||
|
|
@ -29,8 +28,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
|
||||||
toggleEquipItem: CharacterSheet.#toggleEquipItem,
|
toggleEquipItem: CharacterSheet.#toggleEquipItem,
|
||||||
toggleResourceDice: CharacterSheet.#toggleResourceDice,
|
toggleResourceDice: CharacterSheet.#toggleResourceDice,
|
||||||
handleResourceDice: CharacterSheet.#handleResourceDice,
|
handleResourceDice: CharacterSheet.#handleResourceDice,
|
||||||
useDowntime: this.useDowntime,
|
useDowntime: this.useDowntime
|
||||||
tempBrowser: CharacterSheet.#tempBrowser
|
|
||||||
},
|
},
|
||||||
window: {
|
window: {
|
||||||
resizable: true,
|
resizable: true,
|
||||||
|
|
@ -635,7 +633,6 @@ export default class CharacterSheet extends DHBaseActorSheet {
|
||||||
const { key } = button.dataset;
|
const { key } = button.dataset;
|
||||||
|
|
||||||
const presets = {
|
const presets = {
|
||||||
compendium: 'daggerheart',
|
|
||||||
folder: key,
|
folder: key,
|
||||||
filter:
|
filter:
|
||||||
key === 'subclasses'
|
key === 'subclasses'
|
||||||
|
|
@ -651,7 +648,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return new ItemBrowser({ presets }).render({ force: true });
|
ui.compendiumBrowser.open(presets);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -768,13 +765,6 @@ export default class CharacterSheet extends DHBaseActorSheet {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Temp
|
|
||||||
*/
|
|
||||||
static async #tempBrowser(_, target) {
|
|
||||||
new ItemBrowser().render({ force: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle the roll values of resource dice.
|
* Handle the roll values of resource dice.
|
||||||
* @type {ApplicationClickAction}
|
* @type {ApplicationClickAction}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
const { HandlebarsApplicationMixin } = foundry.applications.api;
|
const { HandlebarsApplicationMixin } = foundry.applications.api;
|
||||||
import { getDocFromElement, getDocFromElementSync, tagifyElement } from '../../../helpers/utils.mjs';
|
import { getDocFromElement, getDocFromElementSync, tagifyElement } from '../../../helpers/utils.mjs';
|
||||||
import { ItemBrowser } from '../../ui/itemBrowser.mjs';
|
|
||||||
|
|
||||||
const typeSettingsMap = {
|
const typeSettingsMap = {
|
||||||
character: 'extendCharacterDescriptions',
|
character: 'extendCharacterDescriptions',
|
||||||
|
|
@ -619,7 +618,7 @@ export default function DHApplicationMixin(Base) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ItemBrowser({ presets }).render({ force: true });
|
ui.compendiumBrowser.open(presets);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -15,16 +15,13 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
this.fieldFilter = [];
|
this.fieldFilter = [];
|
||||||
this.selectedMenu = { path: [], data: null };
|
this.selectedMenu = { path: [], data: null };
|
||||||
this.config = CONFIG.DH.ITEMBROWSER.compendiumConfig;
|
this.config = CONFIG.DH.ITEMBROWSER.compendiumConfig;
|
||||||
this.presets = options.presets;
|
this.presets = {};
|
||||||
|
|
||||||
if (this.presets?.folder)
|
|
||||||
ItemBrowser.selectFolder.call(this, null, null, this.presets.folder);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @inheritDoc */
|
/** @inheritDoc */
|
||||||
static DEFAULT_OPTIONS = {
|
static DEFAULT_OPTIONS = {
|
||||||
id: 'itemBrowser',
|
id: 'itemBrowser',
|
||||||
classes: ['daggerheart', 'dh-style', 'dialog', 'compendium-browser'],
|
classes: ['daggerheart', 'dh-style', 'dialog', 'compendium-browser', 'loader'],
|
||||||
tag: 'div',
|
tag: 'div',
|
||||||
window: {
|
window: {
|
||||||
frame: true,
|
frame: true,
|
||||||
|
|
@ -84,17 +81,15 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/** @inheritDoc */
|
|
||||||
async _preFirstRender(context, options) {
|
|
||||||
if (context.presets?.render?.noFolder || context.presets?.render?.lite) options.position.width = 600;
|
|
||||||
|
|
||||||
await super._preFirstRender(context, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @inheritDoc */
|
/** @inheritDoc */
|
||||||
async _preRender(context, options) {
|
async _preRender(context, options) {
|
||||||
if (context.presets?.render?.noFolder || context.presets?.render?.lite)
|
this.presets = options.presets ?? {};
|
||||||
options.parts.splice(options.parts.indexOf('sidebar'), 1);
|
|
||||||
|
const width = this.presets?.render?.noFolder === true || this.presets?.render?.lite === true ? 600 : 850;
|
||||||
|
if(this.rendered)
|
||||||
|
this.setPosition({ width });
|
||||||
|
else
|
||||||
|
options.position.width = width;
|
||||||
|
|
||||||
await super._preRender(context, options);
|
await super._preRender(context, options);
|
||||||
}
|
}
|
||||||
|
|
@ -103,25 +98,18 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
async _onRender(context, options) {
|
async _onRender(context, options) {
|
||||||
await super._onRender(context, options);
|
await super._onRender(context, options);
|
||||||
|
|
||||||
|
this.element
|
||||||
|
.querySelectorAll('[data-action="selectFolder"]')
|
||||||
|
.forEach(element => element.classList.toggle('is-selected', element.dataset.folderId === this.selectedMenu.path.join('.')));
|
||||||
|
|
||||||
this._createSearchFilter();
|
this._createSearchFilter();
|
||||||
this._createFilterInputs();
|
|
||||||
this._createDragProcess();
|
|
||||||
|
|
||||||
if (context.presets?.render?.lite) this.element.classList.add('lite');
|
this.element.classList.toggle('lite', this.presets?.render?.lite === true);
|
||||||
|
this.element.classList.toggle('no-folder', this.presets?.render?.noFolder === true);
|
||||||
if (context.presets?.render?.noFolder) this.element.classList.add('no-folder');
|
this.element.classList.toggle('no-filter', this.presets?.render?.noFilter === true);
|
||||||
|
this.element.querySelectorAll('.folder-list > [data-action="selectFolder"]').forEach(element => {
|
||||||
if (context.presets?.render?.noFilter) this.element.classList.add('no-filter');
|
element.hidden = this.presets.render?.folders?.length && !this.presets.render.folders.includes(element.dataset.folderId);
|
||||||
|
});
|
||||||
if (this.presets?.filter) {
|
|
||||||
Object.entries(this.presets.filter).forEach(
|
|
||||||
([k, v]) => {
|
|
||||||
const filter = this.fieldFilter.find(c => c.name === k)
|
|
||||||
if(filter) filter.value = v.value;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
await this._onInputFilterBrowser();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_attachPartListeners(partId, htmlElement, options) {
|
_attachPartListeners(partId, htmlElement, options) {
|
||||||
|
|
@ -142,20 +130,23 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
async _prepareContext(options) {
|
async _prepareContext(options) {
|
||||||
const context = await super._prepareContext(options);
|
const context = await super._prepareContext(options);
|
||||||
context.compendiums = this.getCompendiumFolders(foundry.utils.deepClone(this.config));
|
context.compendiums = this.getCompendiumFolders(foundry.utils.deepClone(this.config));
|
||||||
// context.pathTitle = this.pathTile;
|
|
||||||
context.menu = this.selectedMenu;
|
context.menu = this.selectedMenu;
|
||||||
context.formatLabel = this.formatLabel;
|
context.formatLabel = this.formatLabel;
|
||||||
context.formatChoices = this.formatChoices;
|
context.formatChoices = this.formatChoices;
|
||||||
context.fieldFilter = this.fieldFilter = this._createFieldFilter();
|
|
||||||
context.items = this.items;
|
context.items = this.items;
|
||||||
context.presets = this.presets;
|
context.presets = this.presets;
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open(presets = {}) {
|
||||||
|
this.presets = presets;
|
||||||
|
ItemBrowser.selectFolder.call(this);
|
||||||
|
}
|
||||||
|
|
||||||
getCompendiumFolders(config, parent = null, depth = 0) {
|
getCompendiumFolders(config, parent = null, depth = 0) {
|
||||||
let folders = [];
|
let folders = [];
|
||||||
Object.values(config).forEach(c => {
|
Object.values(config).forEach(c => {
|
||||||
if(this.presets.render?.folders?.length && !this.presets.render.folders.includes(c.id)) return;
|
// if(this.presets.render?.folders?.length && !this.presets.render.folders.includes(c.id)) return;
|
||||||
const folder = {
|
const folder = {
|
||||||
id: c.id,
|
id: c.id,
|
||||||
label: game.i18n.localize(c.label),
|
label: game.i18n.localize(c.label),
|
||||||
|
|
@ -171,29 +162,9 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
return folders;
|
return folders;
|
||||||
}
|
}
|
||||||
|
|
||||||
static async selectFolder(_, target, folder) {
|
static async selectFolder(_, target) {
|
||||||
|
const folderId = target?.dataset?.folderId ?? this.presets.folder,
|
||||||
let loadTimeout = ItemBrowser.toggleLoader(target, true);
|
folderData = foundry.utils.getProperty(this.config, folderId) ?? {};
|
||||||
|
|
||||||
const folderId = folder ?? target.dataset.folderId,
|
|
||||||
folderData = foundry.utils.getProperty(this.config, folderId) ?? {},
|
|
||||||
promises = [];
|
|
||||||
|
|
||||||
game.packs.forEach(pack => {
|
|
||||||
promises.push(
|
|
||||||
new Promise(async resolve => {
|
|
||||||
const items = await pack.getDocuments({ type__in: folderData?.type });
|
|
||||||
resolve(items);
|
|
||||||
})
|
|
||||||
)
|
|
||||||
});
|
|
||||||
|
|
||||||
Promise.all(promises).then(result => {
|
|
||||||
this.items = ItemBrowser.sortBy(result.flatMap(r => r), 'name');
|
|
||||||
clearTimeout(loadTimeout);
|
|
||||||
ItemBrowser.toggleLoader(target, false);
|
|
||||||
this.render({ force: true });
|
|
||||||
});
|
|
||||||
|
|
||||||
const columns = ItemBrowser.getFolderConfig(folderData).map(col => ({
|
const columns = ItemBrowser.getFolderConfig(folderData).map(col => ({
|
||||||
...col,
|
...col,
|
||||||
|
|
@ -201,20 +172,17 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this.selectedMenu = {
|
this.selectedMenu = {
|
||||||
path: folderId.split('.'),
|
path: folderId?.split('.') ?? [],
|
||||||
data: {
|
data: {
|
||||||
...folderData,
|
...folderData,
|
||||||
columns: columns
|
columns: columns
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (target) {
|
await this.render({ force: true, presets: this.presets });
|
||||||
target
|
|
||||||
.closest('.compendium-sidebar')
|
if(this.selectedMenu?.data?.type?.length)
|
||||||
.querySelectorAll('[data-action="selectFolder"]')
|
this.loadItems();
|
||||||
.forEach(element => element.classList.remove('is-selected'));
|
|
||||||
target.classList.add('is-selected');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_replaceHTML(result, content, options) {
|
_replaceHTML(result, content, options) {
|
||||||
|
|
@ -222,9 +190,70 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
super._replaceHTML(result, content, options);
|
super._replaceHTML(result, content, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
static toggleLoader(target, state) {
|
loadItems() {
|
||||||
if(!target) return;
|
let loadTimeout = this.toggleLoader(true);
|
||||||
const container = target.closest(".window-content");
|
|
||||||
|
const promises = [];
|
||||||
|
|
||||||
|
game.packs.forEach(pack => {
|
||||||
|
promises.push(
|
||||||
|
new Promise(async resolve => {
|
||||||
|
const items = await pack.getDocuments({ type__in: this.selectedMenu?.data?.type });
|
||||||
|
resolve(items);
|
||||||
|
})
|
||||||
|
)
|
||||||
|
});
|
||||||
|
|
||||||
|
Promise.all(promises).then(async result => {
|
||||||
|
this.items = ItemBrowser.sortBy(result.flatMap(r => r), 'name');
|
||||||
|
this.fieldFilter = this._createFieldFilter();
|
||||||
|
|
||||||
|
if (this.presets?.filter) {
|
||||||
|
Object.entries(this.presets.filter).forEach(
|
||||||
|
([k, v]) => {
|
||||||
|
const filter = this.fieldFilter.find(c => c.name === k)
|
||||||
|
if(filter) filter.value = v.value;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
// 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
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
this.element.querySelector('.filter-content .wrapper').innerHTML = filterList;
|
||||||
|
const filterContainer = this.element.querySelector('.filter-header > [data-action="expandContent"]');
|
||||||
|
if(this.fieldFilter.length === 0)
|
||||||
|
filterContainer.setAttribute('disabled', '');
|
||||||
|
else
|
||||||
|
filterContainer.removeAttribute('disabled');
|
||||||
|
|
||||||
|
const itemList = await foundry.applications.handlebars.renderTemplate('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();
|
||||||
|
|
||||||
|
clearTimeout(loadTimeout);
|
||||||
|
this.toggleLoader(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleLoader(state) {
|
||||||
|
const container = this.element.querySelector('.item-list');
|
||||||
return setTimeout(() => {
|
return setTimeout(() => {
|
||||||
container.classList.toggle("loader", state);
|
container.classList.toggle("loader", state);
|
||||||
}, 100);
|
}, 100);
|
||||||
|
|
@ -347,6 +376,7 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
for (const li of html.querySelectorAll('.item-container')) {
|
for (const li of html.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;
|
||||||
const matchesSearch = !query || foundry.applications.ux.SearchFilter.testQuery(rgx, item.name);
|
const matchesSearch = !query || foundry.applications.ux.SearchFilter.testQuery(rgx, item.name);
|
||||||
if (matchesSearch) this.#filteredItems.browser.search.add(item.id);
|
if (matchesSearch) this.#filteredItems.browser.search.add(item.id);
|
||||||
const { input } = this.#filteredItems.browser;
|
const { input } = this.#filteredItems.browser;
|
||||||
|
|
@ -503,8 +533,9 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
<i class="fa-solid fa-book-atlas"></i>
|
<i class="fa-solid fa-book-atlas"></i>
|
||||||
${game.i18n.localize("DAGGERHEART.UI.Tooltip.compendiumBrowser")}
|
${game.i18n.localize("DAGGERHEART.UI.Tooltip.compendiumBrowser")}
|
||||||
`;
|
`;
|
||||||
button.addEventListener("click", event => (new ItemBrowser({ presets: menus[sectionId] })).render({ force: true }));
|
button.addEventListener("click", event => {
|
||||||
// button.addEventListener("click", event => ui.compendiumBrowser?.render({ force: true, presets: menus[sectionId] }));
|
ui.compendiumBrowser.open(menus[sectionId]);
|
||||||
|
});
|
||||||
|
|
||||||
headerActions.append(button);
|
headerActions.append(button);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -355,7 +355,7 @@ export const typeConfig = {
|
||||||
{
|
{
|
||||||
key: 'system.domains',
|
key: 'system.domains',
|
||||||
label: 'DAGGERHEART.GENERAL.Domain.plural',
|
label: 'DAGGERHEART.GENERAL.Domain.plural',
|
||||||
choices: () => Object.values(CONFIG.DH.DOMAIN.domains).map(d => ({ value: d.id, label: d.label })),
|
choices: () => Object.values(CONFIG.DH.DOMAIN.allDomains()).map(d => ({ value: d.id, label: d.label })),
|
||||||
operator: 'contains2'
|
operator: 'contains2'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -30,12 +30,13 @@ export const preloadHandlebarsTemplates = async function () {
|
||||||
'systems/daggerheart/templates/dialogs/downtime/activities.hbs',
|
'systems/daggerheart/templates/dialogs/downtime/activities.hbs',
|
||||||
'systems/daggerheart/templates/dialogs/dice-roll/costSelection.hbs',
|
'systems/daggerheart/templates/dialogs/dice-roll/costSelection.hbs',
|
||||||
|
|
||||||
|
|
||||||
'systems/daggerheart/templates/ui/chat/parts/roll-part.hbs',
|
'systems/daggerheart/templates/ui/chat/parts/roll-part.hbs',
|
||||||
'systems/daggerheart/templates/ui/chat/parts/damage-part.hbs',
|
'systems/daggerheart/templates/ui/chat/parts/damage-part.hbs',
|
||||||
'systems/daggerheart/templates/ui/chat/parts/target-part.hbs',
|
'systems/daggerheart/templates/ui/chat/parts/target-part.hbs',
|
||||||
'systems/daggerheart/templates/ui/chat/parts/button-part.hbs',
|
'systems/daggerheart/templates/ui/chat/parts/button-part.hbs',
|
||||||
|
|
||||||
|
'systems/daggerheart/templates/ui/itemBrowser/itemContainer.hbs',
|
||||||
|
|
||||||
'systems/daggerheart/templates/scene/dh-config.hbs',
|
'systems/daggerheart/templates/scene/dh-config.hbs',
|
||||||
|
|
||||||
]);
|
]);
|
||||||
|
|
|
||||||
|
|
@ -25,9 +25,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.loader {
|
.loader {
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden !important;
|
||||||
|
|
||||||
div {
|
div {
|
||||||
opacity: .5;
|
opacity: .5;
|
||||||
// transition: opacity .3s ease-in-out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&:before {
|
&:before {
|
||||||
|
|
|
||||||
|
|
@ -292,6 +292,7 @@
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 5px;
|
gap: 5px;
|
||||||
|
flex: 1;
|
||||||
|
|
||||||
.item-container {
|
.item-container {
|
||||||
&:hover {
|
&:hover {
|
||||||
|
|
@ -392,6 +393,7 @@
|
||||||
|
|
||||||
.title {
|
.title {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hint {
|
.hint {
|
||||||
|
|
@ -407,7 +409,7 @@
|
||||||
|
|
||||||
&.lite,
|
&.lite,
|
||||||
&.no-folder {
|
&.no-folder {
|
||||||
.menu-path {
|
.compendium-sidebar, .menu-path {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,6 @@
|
||||||
<a class="filter-button">
|
<a class="filter-button">
|
||||||
<i class="fa-solid fa-filter"></i>
|
<i class="fa-solid fa-filter"></i>
|
||||||
</a>
|
</a>
|
||||||
<a data-tooltip="{{localize 'DAGGERHEART.UI.Tooltip.compendiumBrowser'}}" data-action="tempBrowser">
|
|
||||||
<i class="fa-solid fa-book-atlas"></i>
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="currency-section">
|
<div class="currency-section">
|
||||||
|
|
|
||||||
22
templates/ui/itemBrowser/filterContainer.hbs
Normal file
22
templates/ui/itemBrowser/filterContainer.hbs
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
{{#each fieldFilter}}
|
||||||
|
{{#if choices }}
|
||||||
|
<div class="form-group"{{#with (lookup @root.presets.filter key)}}{{#if forced}} disabled{{/if}}{{/with}}>
|
||||||
|
<label>{{localize label}}</label>
|
||||||
|
<div class="form-fields">
|
||||||
|
<select data-key="{{key}}" name={{name}}>
|
||||||
|
{{selectOptions choices valueAttr="value" blank="" localize=true selected=value}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{else}}
|
||||||
|
{{#if filtered }}
|
||||||
|
{{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=value}}
|
||||||
|
{{else}}
|
||||||
|
{{formField field localize=true blank="" name=name dataset=(object key=key) label=label value=value}}
|
||||||
|
{{/if}}
|
||||||
|
{{/if}}
|
||||||
|
{{/if}}
|
||||||
|
{{/each}}
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<div class="compendium-results">
|
<div class="compendium-results">
|
||||||
{{#if menu.data }}
|
{{#if menu.path.length }}
|
||||||
<div class="menu-path">
|
<div class="menu-path">
|
||||||
{{#each menu.path}}
|
{{#each menu.path}}
|
||||||
{{#if (eq this "folders")}}
|
{{#if (eq this "folders")}}
|
||||||
|
|
@ -19,39 +19,13 @@
|
||||||
</div>
|
</div>
|
||||||
<input type="search" name="search" class="search-input" placeholder="{{localize 'DAGGERHEART.UI.ItemBrowser.searchPlaceholder'}}">
|
<input type="search" name="search" class="search-input" placeholder="{{localize 'DAGGERHEART.UI.ItemBrowser.searchPlaceholder'}}">
|
||||||
</div>
|
</div>
|
||||||
{{#if fieldFilter.length}}
|
<a data-tooltip="{{localize 'DAGGERHEART.UI.ItemBrowser.tooltipFilters'}}" data-action="expandContent" disabled><i class="fa-solid fa-filter"></i></a>
|
||||||
<a data-tooltip="{{localize 'DAGGERHEART.UI.ItemBrowser.tooltipFilters'}}" data-action="expandContent"><i class="fa-solid fa-filter"></i></a>
|
|
||||||
{{/if}}
|
|
||||||
<a data-tooltip="{{localize 'DAGGERHEART.UI.ItemBrowser.tooltipErase'}}" data-action="resetFilters"><i class="fa-solid fa-eraser"></i></a>
|
<a data-tooltip="{{localize 'DAGGERHEART.UI.ItemBrowser.tooltipErase'}}" data-action="resetFilters"><i class="fa-solid fa-eraser"></i></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="filter-content extensible">
|
<div class="filter-content extensible">
|
||||||
<div class="wrapper">
|
<div class="wrapper"></div>
|
||||||
{{#each fieldFilter}}
|
|
||||||
{{#if choices }}
|
|
||||||
<div class="form-group"{{#with (lookup @root.presets.filter key)}}{{#if forced}} disabled{{/if}}{{/with}}>
|
|
||||||
<label>{{localize label}}</label>
|
|
||||||
<div class="form-fields">
|
|
||||||
<select data-key="{{key}}" name={{name}}>
|
|
||||||
{{selectOptions choices valueAttr="value" blank="" localize=true selected=value}}
|
|
||||||
</select>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{else}}
|
|
||||||
{{#if filtered }}
|
|
||||||
{{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=value}}
|
|
||||||
{{else}}
|
|
||||||
{{formField field localize=true blank="" name=name dataset=(object key=key) label=label value=value}}
|
|
||||||
{{/if}}
|
|
||||||
{{/if}}
|
|
||||||
{{/if}}
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{!-- <div class="item-list-container"> --}}
|
|
||||||
{{#if menu.data.columns.length}}
|
{{#if menu.data.columns.length}}
|
||||||
<div class="item-list-header">
|
<div class="item-list-header">
|
||||||
<div class="item-list-img"></div>
|
<div class="item-list-img"></div>
|
||||||
|
|
@ -61,25 +35,7 @@
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<div class="item-list">
|
<div class="item-list"></div>
|
||||||
{{#each items}}
|
|
||||||
<div class="item-container" data-item-uuid="{{uuid}}" draggable="true">
|
|
||||||
<div class="item-header">
|
|
||||||
<div class="item-info" data-action="expandContent">
|
|
||||||
<img src="{{img}}" data-item-key="img" class="item-list-img">
|
|
||||||
<span data-item-key="name" class="item-list-name">{{name}}</span>
|
|
||||||
{{#each ../menu.data.columns}}
|
|
||||||
<span data-item-key="{{key}}">{{#with (@root.formatLabel ../this this) as | label |}}{{{label}}}{{/with}}</span>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="item-desc extensible">
|
|
||||||
<span class="wrapper">{{{system.description}}}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
{{!-- </div> --}}
|
|
||||||
{{else}}
|
{{else}}
|
||||||
<div class="welcome-message">
|
<div class="welcome-message">
|
||||||
<h2 class="title">{{localize "DAGGERHEART.UI.ItemBrowser.title"}}</h2>
|
<h2 class="title">{{localize "DAGGERHEART.UI.ItemBrowser.title"}}</h2>
|
||||||
|
|
|
||||||
16
templates/ui/itemBrowser/itemContainer.hbs
Normal file
16
templates/ui/itemBrowser/itemContainer.hbs
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
{{#each items}}
|
||||||
|
<div class="item-container" data-item-uuid="{{uuid}}" draggable="true">
|
||||||
|
<div class="item-header">
|
||||||
|
<div class="item-info" data-action="expandContent">
|
||||||
|
<img src="{{img}}" data-item-key="img" class="item-list-img">
|
||||||
|
<span data-item-key="name" class="item-list-name">{{name}}</span>
|
||||||
|
{{#each ../menu.data.columns}}
|
||||||
|
<span data-item-key="{{key}}">{{#with (@root.formatLabel ../this this) as | label |}}{{{label}}}{{/with}}</span>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-desc extensible">
|
||||||
|
<span class="wrapper">{{{system.description}}}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
|
@ -17,33 +17,6 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{!-- <details class="compendium-container" data-compendium-id="{{id}}" open>
|
|
||||||
<summary>
|
|
||||||
{{label}}
|
|
||||||
<line-div></line-div>
|
|
||||||
</summary>
|
|
||||||
<div class="folder-list">
|
|
||||||
{{#each folders}}
|
|
||||||
<div class="{{#if selected}} is-selected{{/if}}" data-action="selectFolder" data-folder-id="{{id}}" {{#if folders.length}}data-tooltip="DAGGERHEART.UI.Tooltip.rightClickExtand" data-tooltip-direction="RIGHT"{{/if}}>{{label}}</div>
|
|
||||||
{{#if folders.length}}
|
|
||||||
<div class="subfolder-list">
|
|
||||||
<div class="wrapper">
|
|
||||||
{{#each folders}}
|
|
||||||
<div
|
|
||||||
class="subfolder-item {{#if selected}} is-selected{{/if}}"
|
|
||||||
data-action="selectFolder"
|
|
||||||
data-folder-id="{{../id}}.folders.{{id}}"
|
|
||||||
>
|
|
||||||
<span>• {{label}}</span>
|
|
||||||
</div>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{/if}}
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
<line-div></line-div>
|
|
||||||
</details> --}}
|
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue