@internetarchive/collection-browser 2.18.3-alpha-webdev7768.2 → 2.18.3-alpha-webdev7768.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/collection-browser.js +3 -4
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-bar.d.ts +13 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-bar.js +91 -84
- package/dist/src/collection-facets/smart-facets/smart-facet-bar.js.map +1 -1
- package/package.json +1 -1
- package/src/collection-browser.ts +3 -5
- package/src/collection-facets/smart-facets/smart-facet-bar.ts +413 -410
|
@@ -29,8 +29,20 @@ export declare class SmartFacetBar extends LitElement {
|
|
|
29
29
|
* Toggles the state of the given smart facet, and updates the selected facets accordingly.
|
|
30
30
|
*/
|
|
31
31
|
private toggleSmartFacet;
|
|
32
|
+
/**
|
|
33
|
+
* Updates the selected facet buckets for each of the given facets,
|
|
34
|
+
* and emits a `facetsChanged` event to notify parent components of
|
|
35
|
+
* the new state.
|
|
36
|
+
*/
|
|
37
|
+
private updateSelectedFacets;
|
|
38
|
+
/**
|
|
39
|
+
* Handler for when a smart facet button is clicked
|
|
40
|
+
*/
|
|
32
41
|
private facetClicked;
|
|
33
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Handler for when an option in a smart facet dropdown is selected
|
|
44
|
+
*/
|
|
45
|
+
private dropdownOptionClicked;
|
|
34
46
|
private onDropdownClick;
|
|
35
47
|
private filterToggleClicked;
|
|
36
48
|
static get styles(): CSSResultGroup;
|
|
@@ -32,14 +32,14 @@ let SmartFacetBar = class SmartFacetBar extends LitElement {
|
|
|
32
32
|
if (!this.query)
|
|
33
33
|
return nothing;
|
|
34
34
|
const shouldShowLabel = !!this.label && this.smartFacets.length > 0;
|
|
35
|
-
return html `
|
|
36
|
-
<div id="smart-facets-container">
|
|
37
|
-
${this.filtersToggleTemplate}
|
|
35
|
+
return html `
|
|
36
|
+
<div id="smart-facets-container">
|
|
37
|
+
${this.filtersToggleTemplate}
|
|
38
38
|
${shouldShowLabel
|
|
39
39
|
? html `<p id="filters-label">${this.label}</p>`
|
|
40
|
-
: nothing}
|
|
41
|
-
${repeat(this.smartFacets, f => `${f[0].label}|${f[0].facets[0].facetType}|${f[0].facets[0].bucketKey}`, facet => this.makeSmartFacet(facet))}
|
|
42
|
-
</div>
|
|
40
|
+
: nothing}
|
|
41
|
+
${repeat(this.smartFacets, f => `${f[0].label}|${f[0].facets[0].facetType}|${f[0].facets[0].bucketKey}`, facet => this.makeSmartFacet(facet))}
|
|
42
|
+
</div>
|
|
43
43
|
`;
|
|
44
44
|
}
|
|
45
45
|
willUpdate(changed) {
|
|
@@ -90,36 +90,36 @@ let SmartFacetBar = class SmartFacetBar extends LitElement {
|
|
|
90
90
|
}
|
|
91
91
|
smartFacetButton(facet) {
|
|
92
92
|
var _a;
|
|
93
|
-
return html `
|
|
94
|
-
<smart-facet-button
|
|
95
|
-
.facetInfo=${facet}
|
|
96
|
-
.labelPrefix=${fieldPrefixes[facet.facets[0].facetType]}
|
|
97
|
-
.selected=${(_a = facet.selected) !== null && _a !== void 0 ? _a : false}
|
|
98
|
-
@facetClick=${this.facetClicked}
|
|
99
|
-
></smart-facet-button>
|
|
93
|
+
return html `
|
|
94
|
+
<smart-facet-button
|
|
95
|
+
.facetInfo=${facet}
|
|
96
|
+
.labelPrefix=${fieldPrefixes[facet.facets[0].facetType]}
|
|
97
|
+
.selected=${(_a = facet.selected) !== null && _a !== void 0 ? _a : false}
|
|
98
|
+
@facetClick=${this.facetClicked}
|
|
99
|
+
></smart-facet-button>
|
|
100
100
|
`;
|
|
101
101
|
}
|
|
102
102
|
smartFacetDropdown(facets) {
|
|
103
|
-
return html `
|
|
104
|
-
<smart-facet-dropdown
|
|
105
|
-
.facetInfo=${facets}
|
|
106
|
-
.labelPrefix=${fieldPrefixes[facets[0].facets[0].facetType]}
|
|
107
|
-
.activeFacetRef=${facets[0].facets[0]}
|
|
108
|
-
@facetClick=${this.
|
|
109
|
-
@dropdownClick=${this.onDropdownClick}
|
|
110
|
-
></smart-facet-dropdown>
|
|
103
|
+
return html `
|
|
104
|
+
<smart-facet-dropdown
|
|
105
|
+
.facetInfo=${facets}
|
|
106
|
+
.labelPrefix=${fieldPrefixes[facets[0].facets[0].facetType]}
|
|
107
|
+
.activeFacetRef=${facets[0].facets[0]}
|
|
108
|
+
@facetClick=${this.dropdownOptionClicked}
|
|
109
|
+
@dropdownClick=${this.onDropdownClick}
|
|
110
|
+
></smart-facet-dropdown>
|
|
111
111
|
`;
|
|
112
112
|
}
|
|
113
113
|
get filtersToggleTemplate() {
|
|
114
|
-
return html `
|
|
115
|
-
<button
|
|
116
|
-
id="filters-toggle"
|
|
117
|
-
class=${this.filterToggleActive ? 'active' : ''}
|
|
118
|
-
title="${this.filterToggleActive ? 'Hide' : 'Show'} filters pane"
|
|
119
|
-
@click=${this.filterToggleClicked}
|
|
120
|
-
>
|
|
121
|
-
${filterIcon}
|
|
122
|
-
</button>
|
|
114
|
+
return html `
|
|
115
|
+
<button
|
|
116
|
+
id="filters-toggle"
|
|
117
|
+
class=${this.filterToggleActive ? 'active' : ''}
|
|
118
|
+
title="${this.filterToggleActive ? 'Hide' : 'Show'} filters pane"
|
|
119
|
+
@click=${this.filterToggleClicked}
|
|
120
|
+
>
|
|
121
|
+
${filterIcon}
|
|
122
|
+
</button>
|
|
123
123
|
`;
|
|
124
124
|
}
|
|
125
125
|
get facetsToDisplay() {
|
|
@@ -222,19 +222,32 @@ let SmartFacetBar = class SmartFacetBar extends LitElement {
|
|
|
222
222
|
...this.smartFacets.filter(f => f[0] !== facet),
|
|
223
223
|
];
|
|
224
224
|
}
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
225
|
+
this.updateSelectedFacets(details.map(facet => ({ ...facet, state: newState })));
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Updates the selected facet buckets for each of the given facets,
|
|
229
|
+
* and emits a `facetsChanged` event to notify parent components of
|
|
230
|
+
* the new state.
|
|
231
|
+
*/
|
|
232
|
+
updateSelectedFacets(facets) {
|
|
233
|
+
for (const facet of facets) {
|
|
234
|
+
this.selectedFacets = updateSelectedFacetBucket(this.selectedFacets, facet.facetType, facet.bucket, true);
|
|
228
235
|
}
|
|
229
236
|
const event = new CustomEvent('facetsChanged', {
|
|
230
237
|
detail: this.selectedFacets,
|
|
231
238
|
});
|
|
232
239
|
this.dispatchEvent(event);
|
|
233
240
|
}
|
|
241
|
+
/**
|
|
242
|
+
* Handler for when a smart facet button is clicked
|
|
243
|
+
*/
|
|
234
244
|
facetClicked(e) {
|
|
235
245
|
this.toggleSmartFacet(e.detail.smartFacet, e.detail.details);
|
|
236
246
|
}
|
|
237
|
-
|
|
247
|
+
/**
|
|
248
|
+
* Handler for when an option in a smart facet dropdown is selected
|
|
249
|
+
*/
|
|
250
|
+
dropdownOptionClicked(e) {
|
|
238
251
|
const existingFacet = this.smartFacets.find(sf => sf.length === 1 && smartFacetEquals(sf[0], e.detail.smartFacet));
|
|
239
252
|
if (existingFacet) {
|
|
240
253
|
// The facet already exists outside the dropdown, so just select it there
|
|
@@ -246,13 +259,7 @@ let SmartFacetBar = class SmartFacetBar extends LitElement {
|
|
|
246
259
|
[{ ...e.detail.smartFacet, selected: true }],
|
|
247
260
|
...this.smartFacets,
|
|
248
261
|
];
|
|
249
|
-
|
|
250
|
-
this.selectedFacets = updateSelectedFacetBucket(this.selectedFacets, facet.facetType, facet.bucket, true);
|
|
251
|
-
}
|
|
252
|
-
const event = new CustomEvent('facetsChanged', {
|
|
253
|
-
detail: this.selectedFacets,
|
|
254
|
-
});
|
|
255
|
-
this.dispatchEvent(event);
|
|
262
|
+
this.updateSelectedFacets(e.detail.details);
|
|
256
263
|
}
|
|
257
264
|
onDropdownClick(e) {
|
|
258
265
|
var _a;
|
|
@@ -271,49 +278,49 @@ let SmartFacetBar = class SmartFacetBar extends LitElement {
|
|
|
271
278
|
// STYLES
|
|
272
279
|
//
|
|
273
280
|
static get styles() {
|
|
274
|
-
return css `
|
|
275
|
-
#smart-facets-container {
|
|
276
|
-
display: flex;
|
|
277
|
-
align-items: center;
|
|
278
|
-
flex-wrap: wrap;
|
|
279
|
-
gap: 5px 10px;
|
|
280
|
-
padding: 10px 0;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
#filters-toggle {
|
|
284
|
-
margin: 0;
|
|
285
|
-
border: 0;
|
|
286
|
-
padding: 5px 8px;
|
|
287
|
-
border-radius: 5px;
|
|
288
|
-
background: white;
|
|
289
|
-
color: #2c2c2c;
|
|
290
|
-
border: 1px solid #194880;
|
|
291
|
-
font-size: 1.4rem;
|
|
292
|
-
font-family: inherit;
|
|
293
|
-
text-decoration: none;
|
|
294
|
-
cursor: pointer;
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
#filters-toggle.active {
|
|
298
|
-
background: #194880;
|
|
299
|
-
color: white;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
#filters-toggle > svg {
|
|
303
|
-
width: 12px;
|
|
304
|
-
filter: invert(0.16667);
|
|
305
|
-
vertical-align: -1px;
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
#filters-toggle.active > svg {
|
|
309
|
-
filter: invert(1);
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
#filters-label {
|
|
313
|
-
font-size: 1.4rem;
|
|
314
|
-
font-weight:
|
|
315
|
-
margin: 0 -5px 0 0;
|
|
316
|
-
}
|
|
281
|
+
return css `
|
|
282
|
+
#smart-facets-container {
|
|
283
|
+
display: flex;
|
|
284
|
+
align-items: center;
|
|
285
|
+
flex-wrap: wrap;
|
|
286
|
+
gap: 5px 10px;
|
|
287
|
+
padding: 10px 0;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
#filters-toggle {
|
|
291
|
+
margin: 0;
|
|
292
|
+
border: 0;
|
|
293
|
+
padding: 5px 8px;
|
|
294
|
+
border-radius: 5px;
|
|
295
|
+
background: white;
|
|
296
|
+
color: #2c2c2c;
|
|
297
|
+
border: 1px solid #194880;
|
|
298
|
+
font-size: 1.4rem;
|
|
299
|
+
font-family: inherit;
|
|
300
|
+
text-decoration: none;
|
|
301
|
+
cursor: pointer;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
#filters-toggle.active {
|
|
305
|
+
background: #194880;
|
|
306
|
+
color: white;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
#filters-toggle > svg {
|
|
310
|
+
width: 12px;
|
|
311
|
+
filter: invert(0.16667);
|
|
312
|
+
vertical-align: -1px;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
#filters-toggle.active > svg {
|
|
316
|
+
filter: invert(1);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
#filters-label {
|
|
320
|
+
font-size: 1.4rem;
|
|
321
|
+
font-weight: var(--smartFacetLabelFontWeight, normal);
|
|
322
|
+
margin: 0 -5px 0 0;
|
|
323
|
+
}
|
|
317
324
|
`;
|
|
318
325
|
}
|
|
319
326
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smart-facet-bar.js","sourceRoot":"","sources":["../../../../src/collection-facets/smart-facets/smart-facet-bar.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n html,\n LitElement,\n TemplateResult,\n CSSResultGroup,\n nothing,\n PropertyValues,\n} from 'lit';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { msg } from '@lit/localize';\nimport type { Aggregation, Bucket } from '@internetarchive/search-service';\nimport type { CollectionTitles } from '../../data-source/models';\nimport type {\n FacetEventDetails,\n FacetOption,\n FacetState,\n SelectedFacets,\n} from '../../models';\nimport { updateSelectedFacetBucket } from '../../utils/facet-utils';\nimport { SmartQueryHeuristicGroup } from './smart-facet-heuristics';\nimport type { SmartFacetDropdown } from './smart-facet-dropdown';\nimport type { SmartFacet, SmartFacetEvent } from './models';\nimport { smartFacetEquals } from './smart-facet-equals';\nimport { dedupe } from './dedupe';\nimport { log } from '../../utils/log';\nimport filterIcon from '../../assets/img/icons/filter';\n\nimport './smart-facet-button';\nimport './smart-facet-dropdown';\n\nconst fieldPrefixes: Partial<Record<FacetOption, string>> = {\n collection: 'Collection: ',\n creator: 'By: ',\n subject: 'About: ',\n};\n\nfunction capitalize(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n@customElement('smart-facet-bar')\nexport class SmartFacetBar extends LitElement {\n @property({ type: String }) query?: string;\n\n @property({ type: Object }) aggregations?: Record<string, Aggregation>;\n\n @property({ type: Object }) selectedFacets?: SelectedFacets;\n\n /** The map from collection identifiers to their titles */\n @property({ type: Object })\n collectionTitles?: CollectionTitles;\n\n @property({ type: Boolean }) filterToggleActive = false;\n\n @property({ type: String }) label?: string;\n\n @state() private heuristicRecs: SmartFacet[] = [];\n\n @state() private smartFacets: SmartFacet[][] = [];\n\n @state() private lastAggregations?: Record<string, Aggregation>;\n\n //\n // COMPONENT LIFECYCLE METHODS\n //\n\n render() {\n if (!this.query) return nothing;\n\n const shouldShowLabel = !!this.label && this.smartFacets.length > 0;\n return html`\n <div id=\"smart-facets-container\">\n ${this.filtersToggleTemplate}\n ${shouldShowLabel\n ? html`<p id=\"filters-label\">${this.label}</p>`\n : nothing}\n ${repeat(\n this.smartFacets,\n f =>\n `${f[0].label}|${f[0].facets[0].facetType}|${f[0].facets[0].bucketKey}`,\n facet => this.makeSmartFacet(facet),\n )}\n </div>\n `;\n }\n\n protected willUpdate(changed: PropertyValues): void {\n let shouldUpdateSmartFacets = false;\n\n if (changed.has('query')) {\n log('query change', changed.get('query'), this.query);\n this.lastAggregations = undefined;\n shouldUpdateSmartFacets = true;\n }\n\n if (\n changed.has('aggregations') &&\n !this.lastAggregations &&\n this.aggregations &&\n Object.keys(this.aggregations).length > 0\n ) {\n log('aggs change', changed.get('aggregations'), this.aggregations);\n this.lastAggregations = this.aggregations;\n shouldUpdateSmartFacets = true;\n }\n\n if (shouldUpdateSmartFacets) {\n log('should update smart facets, doing so...');\n this.updateSmartFacets();\n }\n }\n\n refresh(): void {\n this.lastAggregations = this.aggregations;\n this.updateSmartFacets();\n }\n\n private async updateSmartFacets(): Promise<void> {\n log('updating smart facets');\n if (this.query) {\n this.heuristicRecs =\n await new SmartQueryHeuristicGroup().getRecommendedFacets(this.query);\n log('heuristic recs are', this.heuristicRecs);\n this.smartFacets = dedupe(this.facetsToDisplay);\n log('smart facets are', this.smartFacets);\n }\n }\n\n //\n // OTHER METHODS\n //\n\n private makeSmartFacet(facets: SmartFacet[]) {\n if (facets.length === 0) {\n return nothing;\n }\n if (facets.length === 1) {\n return this.smartFacetButton(facets[0]);\n }\n return this.smartFacetDropdown(facets);\n }\n\n private smartFacetButton(facet: SmartFacet) {\n return html`\n <smart-facet-button\n .facetInfo=${facet}\n .labelPrefix=${fieldPrefixes[facet.facets[0].facetType]}\n .selected=${facet.selected ?? false}\n @facetClick=${this.facetClicked}\n ></smart-facet-button>\n `;\n }\n\n private smartFacetDropdown(facets: SmartFacet[]) {\n return html`\n <smart-facet-dropdown\n .facetInfo=${facets}\n .labelPrefix=${fieldPrefixes[facets[0].facets[0].facetType]}\n .activeFacetRef=${facets[0].facets[0]}\n @facetClick=${this.facetDropdownClicked}\n @dropdownClick=${this.onDropdownClick}\n ></smart-facet-dropdown>\n `;\n }\n\n private get filtersToggleTemplate(): TemplateResult {\n return html`\n <button\n id=\"filters-toggle\"\n class=${this.filterToggleActive ? 'active' : ''}\n title=\"${this.filterToggleActive ? 'Hide' : 'Show'} filters pane\"\n @click=${this.filterToggleClicked}\n >\n ${filterIcon}\n </button>\n `;\n }\n\n private get facetsToDisplay(): SmartFacet[][] {\n const facets: SmartFacet[][] = [];\n\n if (this.heuristicRecs.length > 0) {\n for (const rec of this.heuristicRecs) {\n // Suppress mediatype-only facets for now.\n if (rec.facets.length === 1 && rec.facets[0].facetType === 'mediatype')\n continue;\n\n facets.push([rec]);\n }\n }\n\n if (this.lastAggregations) {\n const keys = [\n 'mediatype',\n 'year',\n 'language',\n 'creator',\n 'subject',\n 'collection',\n ];\n for (const key of keys) {\n const agg = this.lastAggregations[key];\n if (!agg) continue;\n if (agg.buckets.length === 0) continue;\n if (['lending', 'year_histogram', 'date_histogram'].includes(key))\n continue;\n if (typeof agg.buckets[0] === 'number') continue;\n\n if (\n key === 'mediatype' &&\n this.selectedFacets &&\n Object.values(this.selectedFacets.mediatype ?? {}).some(\n bucket => bucket.state !== 'none',\n )\n ) {\n continue;\n }\n\n const facetType = key as FacetOption;\n const buckets = agg.buckets as Bucket[];\n\n const unusedBuckets = buckets.filter(b => {\n const selectedFacetBucket = this.selectedFacets?.[facetType]?.[b.key];\n if (selectedFacetBucket && selectedFacetBucket.state !== 'none') {\n return false;\n }\n return true;\n });\n\n if (facetType === 'mediatype') {\n continue;\n // Don't include mediatype bubbles\n } else if (facetType === 'collection' || facetType === 'subject') {\n const topBuckets = unusedBuckets.slice(0, 5);\n facets.push(topBuckets.map(b => this.toSmartFacet(facetType, [b])));\n } else {\n facets.push([this.toSmartFacet(facetType, [unusedBuckets[0]])]);\n }\n }\n }\n\n return facets;\n }\n\n private toSmartFacet(\n facetType: FacetOption,\n buckets: Bucket[],\n // prefix = true\n ): SmartFacet {\n return {\n facets: buckets.map(bucket => {\n let displayText = capitalize(bucket.key.toString());\n if (facetType === 'collection') {\n const title = this.collectionTitles?.get(bucket.key.toString());\n if (title) displayText = title;\n }\n\n return {\n facetType,\n bucketKey: bucket.key.toString(),\n displayText,\n };\n }),\n } as SmartFacet;\n }\n\n /**\n * Toggles the state of the given smart facet, and updates the selected facets accordingly.\n */\n private toggleSmartFacet(\n facet: SmartFacet,\n details: FacetEventDetails[],\n ): void {\n let newState: FacetState;\n if (facet.selected) {\n // When deselected, leave the smart facet where it is\n newState = 'none';\n this.smartFacets = this.smartFacets.map(f => {\n if (f[0] === facet) return [{ ...facet, selected: false }];\n return f;\n });\n } else {\n // When selected, move the toggled smart facet to the front of the list\n newState = 'selected';\n this.smartFacets = [\n [{ ...facet, selected: true }],\n ...this.smartFacets.filter(f => f[0] !== facet),\n ];\n }\n\n // Update the selected facets\n for (const facet of details) {\n this.selectedFacets = updateSelectedFacetBucket(\n this.selectedFacets,\n facet.facetType,\n { ...facet.bucket, state: newState },\n true,\n );\n }\n\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: this.selectedFacets,\n });\n this.dispatchEvent(event);\n }\n\n private facetClicked(e: CustomEvent<SmartFacetEvent>): void {\n this.toggleSmartFacet(e.detail.smartFacet, e.detail.details);\n }\n\n private facetDropdownClicked(e: CustomEvent<SmartFacetEvent>): void {\n const existingFacet = this.smartFacets.find(\n sf => sf.length === 1 && smartFacetEquals(sf[0], e.detail.smartFacet),\n );\n if (existingFacet) {\n // The facet already exists outside the dropdown, so just select it there\n this.toggleSmartFacet(existingFacet[0], e.detail.details);\n return;\n }\n\n // Otherwise, prepend a new smart facet for the selected option\n this.smartFacets = [\n [{ ...e.detail.smartFacet, selected: true }],\n ...this.smartFacets,\n ];\n\n for (const facet of e.detail.details) {\n this.selectedFacets = updateSelectedFacetBucket(\n this.selectedFacets,\n facet.facetType,\n facet.bucket,\n true,\n );\n }\n\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: this.selectedFacets,\n });\n this.dispatchEvent(event);\n }\n\n private onDropdownClick(e: CustomEvent<SmartFacetDropdown>): void {\n log('smart bar: onDropdownClick', e.detail);\n this.shadowRoot\n ?.querySelectorAll('smart-facet-dropdown')\n .forEach(dropdown => {\n if (dropdown !== e.detail) {\n log('closing', dropdown);\n (dropdown as SmartFacetDropdown).close();\n }\n });\n }\n\n private filterToggleClicked(): void {\n this.dispatchEvent(new CustomEvent('filtersToggled'));\n }\n\n //\n // STYLES\n //\n\n static get styles(): CSSResultGroup {\n return css`\n #smart-facets-container {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 5px 10px;\n padding: 10px 0;\n }\n\n #filters-toggle {\n margin: 0;\n border: 0;\n padding: 5px 8px;\n border-radius: 5px;\n background: white;\n color: #2c2c2c;\n border: 1px solid #194880;\n font-size: 1.4rem;\n font-family: inherit;\n text-decoration: none;\n cursor: pointer;\n }\n\n #filters-toggle.active {\n background: #194880;\n color: white;\n }\n\n #filters-toggle > svg {\n width: 12px;\n filter: invert(0.16667);\n vertical-align: -1px;\n }\n\n #filters-toggle.active > svg {\n filter: invert(1);\n }\n\n #filters-label {\n font-size: 1.4rem;\n font-weight: bold;\n margin: 0 -5px 0 0;\n }\n `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"smart-facet-bar.js","sourceRoot":"","sources":["../../../../src/collection-facets/smart-facets/smart-facet-bar.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n css,\r\n html,\r\n LitElement,\r\n TemplateResult,\r\n CSSResultGroup,\r\n nothing,\r\n PropertyValues,\r\n} from 'lit';\r\nimport { repeat } from 'lit/directives/repeat.js';\r\nimport { customElement, property, state } from 'lit/decorators.js';\r\nimport type { Aggregation, Bucket } from '@internetarchive/search-service';\r\nimport type { CollectionTitles } from '../../data-source/models';\r\nimport type {\r\n FacetEventDetails,\r\n FacetOption,\r\n FacetState,\r\n SelectedFacets,\r\n} from '../../models';\r\nimport { updateSelectedFacetBucket } from '../../utils/facet-utils';\r\nimport { SmartQueryHeuristicGroup } from './smart-facet-heuristics';\r\nimport type { SmartFacetDropdown } from './smart-facet-dropdown';\r\nimport type { SmartFacet, SmartFacetEvent } from './models';\r\nimport { smartFacetEquals } from './smart-facet-equals';\r\nimport { dedupe } from './dedupe';\r\nimport { log } from '../../utils/log';\r\nimport filterIcon from '../../assets/img/icons/filter';\r\n\r\nimport './smart-facet-button';\r\nimport './smart-facet-dropdown';\r\n\r\nconst fieldPrefixes: Partial<Record<FacetOption, string>> = {\r\n collection: 'Collection: ',\r\n creator: 'By: ',\r\n subject: 'About: ',\r\n};\r\n\r\nfunction capitalize(str: string) {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n\r\n@customElement('smart-facet-bar')\r\nexport class SmartFacetBar extends LitElement {\r\n @property({ type: String }) query?: string;\r\n\r\n @property({ type: Object }) aggregations?: Record<string, Aggregation>;\r\n\r\n @property({ type: Object }) selectedFacets?: SelectedFacets;\r\n\r\n /** The map from collection identifiers to their titles */\r\n @property({ type: Object })\r\n collectionTitles?: CollectionTitles;\r\n\r\n @property({ type: Boolean }) filterToggleActive = false;\r\n\r\n @property({ type: String }) label?: string;\r\n\r\n @state() private heuristicRecs: SmartFacet[] = [];\r\n\r\n @state() private smartFacets: SmartFacet[][] = [];\r\n\r\n @state() private lastAggregations?: Record<string, Aggregation>;\r\n\r\n //\r\n // COMPONENT LIFECYCLE METHODS\r\n //\r\n\r\n render() {\r\n if (!this.query) return nothing;\r\n\r\n const shouldShowLabel = !!this.label && this.smartFacets.length > 0;\r\n return html`\r\n <div id=\"smart-facets-container\">\r\n ${this.filtersToggleTemplate}\r\n ${shouldShowLabel\r\n ? html`<p id=\"filters-label\">${this.label}</p>`\r\n : nothing}\r\n ${repeat(\r\n this.smartFacets,\r\n f =>\r\n `${f[0].label}|${f[0].facets[0].facetType}|${f[0].facets[0].bucketKey}`,\r\n facet => this.makeSmartFacet(facet),\r\n )}\r\n </div>\r\n `;\r\n }\r\n\r\n protected willUpdate(changed: PropertyValues): void {\r\n let shouldUpdateSmartFacets = false;\r\n\r\n if (changed.has('query')) {\r\n log('query change', changed.get('query'), this.query);\r\n this.lastAggregations = undefined;\r\n shouldUpdateSmartFacets = true;\r\n }\r\n\r\n if (\r\n changed.has('aggregations') &&\r\n !this.lastAggregations &&\r\n this.aggregations &&\r\n Object.keys(this.aggregations).length > 0\r\n ) {\r\n log('aggs change', changed.get('aggregations'), this.aggregations);\r\n this.lastAggregations = this.aggregations;\r\n shouldUpdateSmartFacets = true;\r\n }\r\n\r\n if (shouldUpdateSmartFacets) {\r\n log('should update smart facets, doing so...');\r\n this.updateSmartFacets();\r\n }\r\n }\r\n\r\n refresh(): void {\r\n this.lastAggregations = this.aggregations;\r\n this.updateSmartFacets();\r\n }\r\n\r\n private async updateSmartFacets(): Promise<void> {\r\n log('updating smart facets');\r\n if (this.query) {\r\n this.heuristicRecs =\r\n await new SmartQueryHeuristicGroup().getRecommendedFacets(this.query);\r\n log('heuristic recs are', this.heuristicRecs);\r\n this.smartFacets = dedupe(this.facetsToDisplay);\r\n log('smart facets are', this.smartFacets);\r\n }\r\n }\r\n\r\n //\r\n // OTHER METHODS\r\n //\r\n\r\n private makeSmartFacet(facets: SmartFacet[]) {\r\n if (facets.length === 0) {\r\n return nothing;\r\n }\r\n if (facets.length === 1) {\r\n return this.smartFacetButton(facets[0]);\r\n }\r\n return this.smartFacetDropdown(facets);\r\n }\r\n\r\n private smartFacetButton(facet: SmartFacet) {\r\n return html`\r\n <smart-facet-button\r\n .facetInfo=${facet}\r\n .labelPrefix=${fieldPrefixes[facet.facets[0].facetType]}\r\n .selected=${facet.selected ?? false}\r\n @facetClick=${this.facetClicked}\r\n ></smart-facet-button>\r\n `;\r\n }\r\n\r\n private smartFacetDropdown(facets: SmartFacet[]) {\r\n return html`\r\n <smart-facet-dropdown\r\n .facetInfo=${facets}\r\n .labelPrefix=${fieldPrefixes[facets[0].facets[0].facetType]}\r\n .activeFacetRef=${facets[0].facets[0]}\r\n @facetClick=${this.dropdownOptionClicked}\r\n @dropdownClick=${this.onDropdownClick}\r\n ></smart-facet-dropdown>\r\n `;\r\n }\r\n\r\n private get filtersToggleTemplate(): TemplateResult {\r\n return html`\r\n <button\r\n id=\"filters-toggle\"\r\n class=${this.filterToggleActive ? 'active' : ''}\r\n title=\"${this.filterToggleActive ? 'Hide' : 'Show'} filters pane\"\r\n @click=${this.filterToggleClicked}\r\n >\r\n ${filterIcon}\r\n </button>\r\n `;\r\n }\r\n\r\n private get facetsToDisplay(): SmartFacet[][] {\r\n const facets: SmartFacet[][] = [];\r\n\r\n if (this.heuristicRecs.length > 0) {\r\n for (const rec of this.heuristicRecs) {\r\n // Suppress mediatype-only facets for now.\r\n if (rec.facets.length === 1 && rec.facets[0].facetType === 'mediatype')\r\n continue;\r\n\r\n facets.push([rec]);\r\n }\r\n }\r\n\r\n if (this.lastAggregations) {\r\n const keys = [\r\n 'mediatype',\r\n 'year',\r\n 'language',\r\n 'creator',\r\n 'subject',\r\n 'collection',\r\n ];\r\n for (const key of keys) {\r\n const agg = this.lastAggregations[key];\r\n if (!agg) continue;\r\n if (agg.buckets.length === 0) continue;\r\n if (['lending', 'year_histogram', 'date_histogram'].includes(key))\r\n continue;\r\n if (typeof agg.buckets[0] === 'number') continue;\r\n\r\n if (\r\n key === 'mediatype' &&\r\n this.selectedFacets &&\r\n Object.values(this.selectedFacets.mediatype ?? {}).some(\r\n bucket => bucket.state !== 'none',\r\n )\r\n ) {\r\n continue;\r\n }\r\n\r\n const facetType = key as FacetOption;\r\n const buckets = agg.buckets as Bucket[];\r\n\r\n const unusedBuckets = buckets.filter(b => {\r\n const selectedFacetBucket = this.selectedFacets?.[facetType]?.[b.key];\r\n if (selectedFacetBucket && selectedFacetBucket.state !== 'none') {\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n if (facetType === 'mediatype') {\r\n continue;\r\n // Don't include mediatype bubbles\r\n } else if (facetType === 'collection' || facetType === 'subject') {\r\n const topBuckets = unusedBuckets.slice(0, 5);\r\n facets.push(topBuckets.map(b => this.toSmartFacet(facetType, [b])));\r\n } else {\r\n facets.push([this.toSmartFacet(facetType, [unusedBuckets[0]])]);\r\n }\r\n }\r\n }\r\n\r\n return facets;\r\n }\r\n\r\n private toSmartFacet(\r\n facetType: FacetOption,\r\n buckets: Bucket[],\r\n // prefix = true\r\n ): SmartFacet {\r\n return {\r\n facets: buckets.map(bucket => {\r\n let displayText = capitalize(bucket.key.toString());\r\n if (facetType === 'collection') {\r\n const title = this.collectionTitles?.get(bucket.key.toString());\r\n if (title) displayText = title;\r\n }\r\n\r\n return {\r\n facetType,\r\n bucketKey: bucket.key.toString(),\r\n displayText,\r\n };\r\n }),\r\n } as SmartFacet;\r\n }\r\n\r\n /**\r\n * Toggles the state of the given smart facet, and updates the selected facets accordingly.\r\n */\r\n private toggleSmartFacet(\r\n facet: SmartFacet,\r\n details: FacetEventDetails[],\r\n ): void {\r\n let newState: FacetState;\r\n if (facet.selected) {\r\n // When deselected, leave the smart facet where it is\r\n newState = 'none';\r\n this.smartFacets = this.smartFacets.map(f => {\r\n if (f[0] === facet) return [{ ...facet, selected: false }];\r\n return f;\r\n });\r\n } else {\r\n // When selected, move the toggled smart facet to the front of the list\r\n newState = 'selected';\r\n this.smartFacets = [\r\n [{ ...facet, selected: true }],\r\n ...this.smartFacets.filter(f => f[0] !== facet),\r\n ];\r\n }\r\n\r\n this.updateSelectedFacets(\r\n details.map(facet => ({ ...facet, state: newState })),\r\n );\r\n }\r\n\r\n /**\r\n * Updates the selected facet buckets for each of the given facets,\r\n * and emits a `facetsChanged` event to notify parent components of\r\n * the new state.\r\n */\r\n private updateSelectedFacets(facets: FacetEventDetails[]): void {\r\n for (const facet of facets) {\r\n this.selectedFacets = updateSelectedFacetBucket(\r\n this.selectedFacets,\r\n facet.facetType,\r\n facet.bucket,\r\n true,\r\n );\r\n }\r\n\r\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\r\n detail: this.selectedFacets,\r\n });\r\n this.dispatchEvent(event);\r\n }\r\n\r\n /**\r\n * Handler for when a smart facet button is clicked\r\n */\r\n private facetClicked(e: CustomEvent<SmartFacetEvent>): void {\r\n this.toggleSmartFacet(e.detail.smartFacet, e.detail.details);\r\n }\r\n\r\n /**\r\n * Handler for when an option in a smart facet dropdown is selected\r\n */\r\n private dropdownOptionClicked(e: CustomEvent<SmartFacetEvent>): void {\r\n const existingFacet = this.smartFacets.find(\r\n sf => sf.length === 1 && smartFacetEquals(sf[0], e.detail.smartFacet),\r\n );\r\n if (existingFacet) {\r\n // The facet already exists outside the dropdown, so just select it there\r\n this.toggleSmartFacet(existingFacet[0], e.detail.details);\r\n return;\r\n }\r\n\r\n // Otherwise, prepend a new smart facet for the selected option\r\n this.smartFacets = [\r\n [{ ...e.detail.smartFacet, selected: true }],\r\n ...this.smartFacets,\r\n ];\r\n\r\n this.updateSelectedFacets(e.detail.details);\r\n }\r\n\r\n private onDropdownClick(e: CustomEvent<SmartFacetDropdown>): void {\r\n log('smart bar: onDropdownClick', e.detail);\r\n this.shadowRoot\r\n ?.querySelectorAll('smart-facet-dropdown')\r\n .forEach(dropdown => {\r\n if (dropdown !== e.detail) {\r\n log('closing', dropdown);\r\n (dropdown as SmartFacetDropdown).close();\r\n }\r\n });\r\n }\r\n\r\n private filterToggleClicked(): void {\r\n this.dispatchEvent(new CustomEvent('filtersToggled'));\r\n }\r\n\r\n //\r\n // STYLES\r\n //\r\n\r\n static get styles(): CSSResultGroup {\r\n return css`\r\n #smart-facets-container {\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: 5px 10px;\r\n padding: 10px 0;\r\n }\r\n\r\n #filters-toggle {\r\n margin: 0;\r\n border: 0;\r\n padding: 5px 8px;\r\n border-radius: 5px;\r\n background: white;\r\n color: #2c2c2c;\r\n border: 1px solid #194880;\r\n font-size: 1.4rem;\r\n font-family: inherit;\r\n text-decoration: none;\r\n cursor: pointer;\r\n }\r\n\r\n #filters-toggle.active {\r\n background: #194880;\r\n color: white;\r\n }\r\n\r\n #filters-toggle > svg {\r\n width: 12px;\r\n filter: invert(0.16667);\r\n vertical-align: -1px;\r\n }\r\n\r\n #filters-toggle.active > svg {\r\n filter: invert(1);\r\n }\r\n\r\n #filters-label {\r\n font-size: 1.4rem;\r\n font-weight: var(--smartFacetLabelFontWeight, normal);\r\n margin: 0 -5px 0 0;\r\n }\r\n `;\r\n }\r\n}\r\n"]}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"description": "The Internet Archive Collection Browser.",
|
|
4
4
|
"license": "AGPL-3.0-only",
|
|
5
5
|
"author": "Internet Archive",
|
|
6
|
-
"version": "2.18.3-alpha-webdev7768.
|
|
6
|
+
"version": "2.18.3-alpha-webdev7768.4",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
8
|
"module": "dist/index.js",
|
|
9
9
|
"scripts": {
|
|
@@ -7,7 +7,6 @@ import {
|
|
|
7
7
|
nothing,
|
|
8
8
|
} from 'lit';
|
|
9
9
|
import { customElement, property, query, state } from 'lit/decorators.js';
|
|
10
|
-
import { ifDefined } from 'lit/directives/if-defined.js';
|
|
11
10
|
import { classMap } from 'lit/directives/class-map.js';
|
|
12
11
|
import { msg } from '@lit/localize';
|
|
13
12
|
|
|
@@ -2517,7 +2516,7 @@ export class CollectionBrowser
|
|
|
2517
2516
|
.mobile #left-column {
|
|
2518
2517
|
width: 100%;
|
|
2519
2518
|
min-width: 0;
|
|
2520
|
-
padding: 0;
|
|
2519
|
+
padding: 5px 0;
|
|
2521
2520
|
border: 0;
|
|
2522
2521
|
}
|
|
2523
2522
|
|
|
@@ -2590,9 +2589,8 @@ export class CollectionBrowser
|
|
|
2590
2589
|
}
|
|
2591
2590
|
|
|
2592
2591
|
.mobile #results-total {
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
margin-right: 5px;
|
|
2592
|
+
position: absolute;
|
|
2593
|
+
right: 10px;
|
|
2596
2594
|
}
|
|
2597
2595
|
|
|
2598
2596
|
#big-results-count {
|