0.4.1j 12-Feb-2021

- Correct compactItem for feats and items required display items
- Rename itemType -> browserTab to differentiate candidate item's type from the tab it appears on (spell, feat/class, item, NPC)
 - Fixed: Was calling the wrong sort for feat and NPC
v0.3.1-spetzel2020
opus1217 2021-02-12 08:53:29 -08:00
parent c9b6a751ad
commit 558cd6c8d0
1 changed files with 83 additions and 86 deletions

View File

@ -22,6 +22,9 @@
11-Feb-2021 0.4.1e: Don't save the filter data (which is most of the memory) and remove the preload limit; instead just save the minimal amount of data 11-Feb-2021 0.4.1e: Don't save the filter data (which is most of the memory) and remove the preload limit; instead just save the minimal amount of data
0.4.1g: Generalize the spell list reload and confirm spells still working 0.4.1g: Generalize the spell list reload and confirm spells still working
0.4.1h: Add the partials for npc, feat, item and the backing code 0.4.1h: Add the partials for npc, feat, item and the backing code
12-Feb-2021 0.4.1j: Correct compactItem for feats and items required display items
Rename itemType -> browserTab to differentiate candidate item's type from the tab it appears on (spell, feat/class, item, NPC)
Fixed: Was calling the wrong sort for feat and NPC
*/ */
const CMPBrowser = { const CMPBrowser = {
@ -107,20 +110,15 @@ class CompendiumBrowser extends Application {
} }
} }
async loadAndFilterItems(itemType="spell",numToPreload=CMPBrowser.PRELOAD) { async loadAndFilterItems(browserTab="spell",numToPreload=CMPBrowser.PRELOAD) {
console.log(`Load and Filter Items | Started loading ${itemType}s`); console.log(`Load and Filter Items | Started loading ${browserTab}s`);
console.time("loadAndFilterItems"); console.time("loadAndFilterItems");
await this.checkListsLoaded(); await this.checkListsLoaded();
//0.4.1: Load and filter just one of spells, feats, and items (specified by itemType) //0.4.1: Load and filter just one of spells, feats, and items (specified by browserTab)
let unfoundSpells = ''; let unfoundSpells = '';
let numItemsLoaded = 0; let numItemsLoaded = 0;
let compactItems = {}; let compactItems = {};
let items = {
spells: {},
feats: {},
items: {}
};
//Filter the full list, but only save the core compendium information + level //Filter the full list, but only save the core compendium information + level
for (let pack of game.packs) { for (let pack of game.packs) {
@ -128,43 +126,46 @@ class CompendiumBrowser extends Application {
//FIXME: How much could we do with the loaded index rather than all content? //FIXME: How much could we do with the loaded index rather than all content?
await pack.getContent().then(content => { await pack.getContent().then(content => {
for (let item5e of content) { for (let item5e of content) {
if ((item5e.type === itemType) || ((itemType === "item") && !["spell","feat"].includes(item5e.type))) { let compactItem = null;
const decoratedItem = this.decorateCompendiumEntry(item5e); const decoratedItem = this.decorateCompendiumEntry(item5e);
if (decoratedItem) { if (decoratedItem) {
let altItemSort = null; if ((browserTab === "spell") && (decoratedItem.type === "spell")) {
decoratedItem.compendium = pack.collection;
if (decoratedItem.type === "spell") {
if (this.getFilterResult(decoratedItem, this.spellFilters.activeFilters)) { if (this.getFilterResult(decoratedItem, this.spellFilters.activeFilters)) {
altItemSort = decoratedItem.data?.level; compactItem = {
}
} else if (decoratedItem.type === "feat") {
if (this.getFilterResult(decoratedItem, this.featFilters.activeFilters)) {
altItemSort = item5e.name; //FIXME
}
} else {
if (this.getFilterResult(decoratedItem, this.itemFilters.activeFilters)) {
altItemSort = item5e.name; //FIXME
}
}
if (altItemSort) { //Indicates it passed the filters
compactItems[decoratedItem._id] = {
compendium : pack.collection, compendium : pack.collection,
name : decoratedItem.name, name : decoratedItem.name,
img: decoratedItem.img, img: decoratedItem.img,
data : { data : {
level : decoratedItem.data?.level, level : decoratedItem.data?.level,
components : decoratedItem.data?.components components : decoratedItem.data?.components
},
altItemSort : altItemSort
} }
}
}
} else if ((browserTab === "feat") && ((decoratedItem.type === "feat") || (decoratedItem.type === "class"))) {
if (this.getFilterResult(decoratedItem, this.featFilters.activeFilters)) {
compactItem = {
compendium : pack.collection,
name : decoratedItem.name,
img: decoratedItem.img,
classRequirementString : decoratedItem.classRequirementString
}
}
} else if ((browserTab === "item") && this.getFilterResult(decoratedItem, this.itemFilters.activeFilters)) {
compactItem = {
compendium : pack.collection,
name : decoratedItem.name,
img: decoratedItem.img,
type : decoratedItem.type
}
}
if (compactItem) { //Indicates it passed the filters
compactItems[decoratedItem._id] = compactItem;
if (numItemsLoaded++ >= numToPreload) break; if (numItemsLoaded++ >= numToPreload) break;
} }
}
} }
}//for item5e of content }//for item5e of content
}); });
} }//end if pack entity === Item
if (numItemsLoaded >= numToPreload) break; if (numItemsLoaded >= numToPreload) break;
}//for packs }//for packs
@ -176,7 +177,7 @@ class CompendiumBrowser extends Application {
*/ */
this.itemsLoaded = true; this.itemsLoaded = true;
console.timeEnd("loadAndFilterItems"); console.timeEnd("loadAndFilterItems");
console.log(`Load and Filter Items | Finished loading ${Object.keys(compactItems).length} ${itemType}s`); console.log(`Load and Filter Items | Finished loading ${Object.keys(compactItems).length} ${browserTab}s`);
return compactItems; return compactItems;
} }
@ -656,12 +657,12 @@ class CompendiumBrowser extends Application {
//0.4.1: Now does a re-load and updates just the data side //0.4.1: Now does a re-load and updates just the data side
// text filters // text filters
html.find('.filter[data-type=text] input, .filter[data-type=text] select').on('keyup change paste', ev => { html.find('.filter[data-type=text] input, .filter[data-type=text] select').on('keyup change paste', ev => {
let path = $(ev.target).parents('.filter').data('path'); const path = $(ev.target).parents('.filter').data('path');
let key = path.replace(/\./g, ''); const key = path.replace(/\./g, '');
let value = ev.target.value; const value = ev.target.value;
let itemType = $(ev.target).parents('.tab').data('tab'); const browserTab = $(ev.target).parents('.tab').data('tab');
let filterTarget = `${itemType}Filters`; const filterTarget = `${browserTab}Filters`;
if (value === '' || value === undefined) { if (value === '' || value === undefined) {
delete this[filterTarget].activeFilters[key]; delete this[filterTarget].activeFilters[key];
@ -674,22 +675,22 @@ class CompendiumBrowser extends Application {
} }
} }
this.replaceList(html, itemType, observer); this.replaceList(html, browserTab, observer);
}); });
// select filters // select filters
html.find('.filter[data-type=select] select, .filter[data-type=bool] select').on('change', ev => { html.find('.filter[data-type=select] select, .filter[data-type=bool] select').on('change', ev => {
let path = $(ev.target).parents('.filter').data('path'); const path = $(ev.target).parents('.filter').data('path');
let key = path.replace(/\./g, ''); const key = path.replace(/\./g, '');
let filterType = $(ev.target).parents('.filter').data('type'); const filterType = $(ev.target).parents('.filter').data('type');
let itemType = $(ev.target).parents('.tab').data('tab'); const browserTab = $(ev.target).parents('.tab').data('tab');
let valIsArray = $(ev.target).parents('.filter').data('valisarray'); let valIsArray = $(ev.target).parents('.filter').data('valisarray');
if (valIsArray === 'true') valIsArray = true; if (valIsArray === 'true') valIsArray = true;
let value = ev.target.value; let value = ev.target.value;
if (value === 'false') value = false; if (value === 'false') value = false;
if (value === 'true') value = true; if (value === 'true') value = true;
let filterTarget = `${itemType}Filters`; const filterTarget = `${browserTab}Filters`;
if (value === "null") { if (value === "null") {
delete this[filterTarget].activeFilters[key] delete this[filterTarget].activeFilters[key]
@ -701,21 +702,21 @@ class CompendiumBrowser extends Application {
value:value value:value
} }
} }
this.replaceList(html, itemType, observer); this.replaceList(html, browserTab, observer);
}); });
// multiselect filters // multiselect filters
html.find('.filter[data-type=multiSelect] input').on('change', ev => { html.find('.filter[data-type=multiSelect] input').on('change', ev => {
let path = $(ev.target).parents('.filter').data('path'); const path = $(ev.target).parents('.filter').data('path');
let key = path.replace(/\./g, ''); const key = path.replace(/\./g, '');
let filterType = 'multiSelect'; const filterType = 'multiSelect';
let itemType = $(ev.target).parents('.tab').data('tab'); const browserTab = $(ev.target).parents('.tab').data('tab');
let valIsArray = $(ev.target).parents('.filter').data('valisarray'); let valIsArray = $(ev.target).parents('.filter').data('valisarray');
if (valIsArray === 'true') valIsArray = true; if (valIsArray === 'true') valIsArray = true;
let value = $(ev.target).data('value'); let value = $(ev.target).data('value');
let filterTarget = `${itemType}Filters`; const filterTarget = `${browserTab}Filters`;
let filter = this[filterTarget].activeFilters[key]; const filter = this[filterTarget].activeFilters[key];
if (ev.target.checked === true) { if (ev.target.checked === true) {
if (filter === undefined) { if (filter === undefined) {
@ -735,21 +736,21 @@ class CompendiumBrowser extends Application {
} }
} }
this.replaceList(html, itemType, observer); this.replaceList(html, browserTab, observer);
}); });
html.find('.filter[data-type=numberCompare] select, .filter[data-type=numberCompare] input').on('change keyup paste', ev => { html.find('.filter[data-type=numberCompare] select, .filter[data-type=numberCompare] input').on('change keyup paste', ev => {
let path = $(ev.target).parents('.filter').data('path'); const path = $(ev.target).parents('.filter').data('path');
let key = path.replace(/\./g, ''); const key = path.replace(/\./g, '');
let filterType = 'numberCompare'; const filterType = 'numberCompare';
let itemType = $(ev.target).parents('.tab').data('tab'); const browserTab = $(ev.target).parents('.tab').data('tab');
let valIsArray = false; let valIsArray = false;
let operator = $(ev.target).parents('.filter').find('select').val(); const operator = $(ev.target).parents('.filter').find('select').val();
let value = $(ev.target).parents('.filter').find('input').val(); const value = $(ev.target).parents('.filter').find('input').val();
let filterTarget = `${itemType}Filters`; const filterTarget = `${browserTab}Filters`;
if (value === '' || operator === 'null') { if (value === '' || operator === 'null') {
delete this[filterTarget].activeFilters[key] delete this[filterTarget].activeFilters[key]
@ -763,7 +764,7 @@ class CompendiumBrowser extends Application {
} }
} }
this.replaceList(html, itemType, observer); this.replaceList(html, browserTab, observer);
}); });
@ -771,22 +772,22 @@ class CompendiumBrowser extends Application {
html.find("img").each((i, img) => observer.observe(img)); html.find("img").each((i, img) => observer.observe(img));
} }
async replaceList(html, itemType, observer) { async replaceList(html, browserTab, observer) {
let items = null; let items = null;
if (itemType === 'spell') { if (browserTab === 'spell') {
items = html.find("ul#CBSpells"); items = html.find("ul#CBSpells");
} else if (itemType === 'npc') { } else if (browserTab === 'npc') {
items = html.find("ul#CBNPCs"); items = html.find("ul#CBNPCs");
} else if (itemType === 'feat') { } else if (browserTab === 'feat') {
items = html.find("ul#CBFeats"); items = html.find("ul#CBFeats");
} else if (itemType === 'item') { } else if (browserTab === 'item') {
items = html.find("ul#CBItems"); items = html.find("ul#CBItems");
} }
if (items?.length) { if (items?.length) {
const newItemsHTML = await this.renderItemData(itemType); const newItemsHTML = await this.renderItemData(browserTab);
items[0].innerHTML = newItemsHTML; items[0].innerHTML = newItemsHTML;
//Re-sort before setting up lazy loading //Re-sort before setting up lazy loading
this.triggerSort(html, itemType); this.triggerSort(html, browserTab);
//Lazy load images //Lazy load images
$(items).find("img").each((i,img) => observer.observe(img)); $(items).find("img").each((i,img) => observer.observe(img));
@ -797,34 +798,34 @@ class CompendiumBrowser extends Application {
} }
async renderItemData(itemType) { async renderItemData(browserTab) {
let items; let items;
let html; let html;
if (itemType === "spell") { if (browserTab === "spell") {
items = await this.loadAndFilterItems(itemType); items = await this.loadAndFilterItems(browserTab);
html = await renderTemplate("modules/compendium-browser/template/spell-browser-list.html", {spells : items}); html = await renderTemplate("modules/compendium-browser/template/spell-browser-list.html", {spells : items});
} else if (itemType === "feat") { } else if (browserTab === "feat") {
items = await this.loadAndFilterItems(itemType); items = await this.loadAndFilterItems(browserTab);
html = await renderTemplate("modules/compendium-browser/template/feat-browser-list.html", {feats : items}); html = await renderTemplate("modules/compendium-browser/template/feat-browser-list.html", {feats : items});
} else if (itemType === "npc") { } else if (browserTab === "npc") {
const npcs = this.loadNpcs(); const npcs = this.loadNpcs();
html = await renderTemplate("modules/compendium-browser/template/npc-browser-list.html", {npcs : npcs}); html = await renderTemplate("modules/compendium-browser/template/npc-browser-list.html", {npcs : npcs});
} else { } else {
items = await this.loadAndFilterItems(itemType); items = await this.loadAndFilterItems(browserTab);
html = await renderTemplate("modules/compendium-browser/template/item-browser-list.html", {items : items}); html = await renderTemplate("modules/compendium-browser/template/item-browser-list.html", {items : items});
} }
return html; return html;
} }
//SORTING //SORTING
triggerSort(html, itemType) { triggerSort(html, browserTab) {
if (itemType === 'spell') { if (browserTab === 'spell') {
html.find('.spell-browser select[name=sortorder]').trigger('change'); html.find('.spell-browser select[name=sortorder]').trigger('change');
} else if (itemType === 'npc') { } else if (browserTab === 'feat') {
html.find('.feat-browser select[name=sortorder]').trigger('change'); html.find('.feat-browser select[name=sortorder]').trigger('change');
} else if (itemType === 'feat') { } else if (browserTab === 'npc') {
html.find('.npc-browser select[name=sortorder]').trigger('change') html.find('.npc-browser select[name=sortorder]').trigger('change')
} else if (itemType === 'item') { } else if (browserTab === 'item') {
html.find('.item-browser select[name=sortorder]').trigger('change'); html.find('.item-browser select[name=sortorder]').trigger('change');
} }
} }
@ -957,7 +958,7 @@ class CompendiumBrowser extends Application {
decorateCompendiumEntry(item5e) { decorateCompendiumEntry(item5e) {
if (!item5e) return null; if (!item5e) return null;
//Decorate and then filter a compendium entry - returns null or the item //Decorate and then filter a compendium entry - returns null or the item
let item = item5e.data; const item = item5e.data;
// getting damage types (common to all Items, although some won't have any) // getting damage types (common to all Items, although some won't have any)
item.damageTypes = []; item.damageTypes = [];
@ -1173,10 +1174,6 @@ class CompendiumBrowser extends Application {
game.settings.set(CMPBrowser.MODULE_NAME, 'settings', this.settings); game.settings.set(CMPBrowser.MODULE_NAME, 'settings', this.settings);
} }
_lazyLoadImg(entries, observer) {
}
//FILTERS - Added on the Ready hook //FILTERS - Added on the Ready hook
//0.4.0 Make this async so filters can be added all at once //0.4.0 Make this async so filters can be added all at once
async addFilter(entityType, category, label, path, type, possibleValues = null, valIsArray = false) { async addFilter(entityType, category, label, path, type, possibleValues = null, valIsArray = false) {