-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathfacetsidebar.js
78 lines (68 loc) · 2.49 KB
/
facetsidebar.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
export default class FacetSidebar extends HTMLElement {
constructor() {
super();
this.eventListeners = {};
this.elems = {};
this.predefinedFacets = [];
}
set data(data) {
this.dataChunks = data;
}
connectedCallback() {
this.initDOM();
}
initDOM() {
const predefinedFacets = Array.from(this.querySelectorAll(':scope > *'));
// <div class="filters">
// <div class="quick-filter">
// <input type="text" id="filter" placeholder="Type to filter...">
// </div>
// <aside id="facets">
// </aside>
// </div>;
const filters = document.createElement('div');
filters.className = 'filters';
const quickFilter = document.createElement('div');
quickFilter.className = 'quick-filter';
const filterInput = document.createElement('input');
filterInput.type = 'text';
filterInput.id = 'filter';
filterInput.placeholder = 'Type to filter, press ↵ to apply';
quickFilter.append(filterInput);
this.append(quickFilter);
const facetsElement = document.createElement('aside');
facetsElement.id = 'facets';
this.append(facetsElement);
this.elems.filterInput = filterInput;
this.elems.facetsElement = facetsElement;
predefinedFacets.forEach((facet) => {
this.elems.facetsElement.append(facet);
});
}
updateFacets(mode) {
const filterTags = document.querySelector('.filter-tags');
filterTags.textContent = '';
const addFilterTag = (name, value) => {
const tag = document.createElement('span');
if (value) tag.textContent = `${name}: ${value}`;
else tag.textContent = `${name}`;
tag.classList.add(`filter-tag-${name}`);
filterTags.append(tag);
};
if (this.elems.filterInput.value) addFilterTag('text', this.elems.filterInput.value);
const existingFacetElements = Array.from(this.elems.facetsElement.children);
existingFacetElements.forEach((facet) => {
facet.setAttribute('mode', 'hidden');
});
const keys = Object.keys(this.dataChunks.facets)
// only show facets that have no decorators or are not hidden
.filter((key) => key !== 'filter');
keys.forEach((facetName) => {
const facetEl = this.querySelector(`[facet="${facetName}"]`);
// eslint-disable-next-line no-console
console.assert(facetEl, `Facet ${facetName} not found in provided UI elements.`);
if (facetEl) facetEl.setAttribute('mode', mode || 'default');
if (facetEl) this.elems.facetsElement.append(facetEl);
});
}
}