@internetarchive/collection-browser 2.7.2-alpha.2 → 2.7.2-alpha.3
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-facets/smart-facets/dedupe.d.ts +10 -0
- package/dist/src/collection-facets/smart-facets/dedupe.js +34 -0
- package/dist/src/collection-facets/smart-facets/dedupe.js.map +1 -0
- package/dist/src/collection-facets/smart-facets/heuristics/browser-language-heuristic.d.ts +5 -0
- package/dist/src/collection-facets/smart-facets/heuristics/browser-language-heuristic.js +24 -0
- package/dist/src/collection-facets/smart-facets/heuristics/browser-language-heuristic.js.map +1 -0
- package/dist/src/collection-facets/smart-facets/heuristics/wikidata-heuristic.js +40 -2
- package/dist/src/collection-facets/smart-facets/heuristics/wikidata-heuristic.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/models.d.ts +2 -0
- package/dist/src/collection-facets/smart-facets/models.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-bar.d.ts +3 -0
- package/dist/src/collection-facets/smart-facets/smart-facet-bar.js +82 -40
- package/dist/src/collection-facets/smart-facets/smart-facet-bar.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-button.d.ts +1 -0
- package/dist/src/collection-facets/smart-facets/smart-facet-button.js +10 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-button.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js +4 -2
- package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-equals.d.ts +1 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-equals.js +3 -5
- package/dist/src/collection-facets/smart-facets/smart-facet-equals.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.d.ts +1 -9
- package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.js +9 -20
- package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.js.map +1 -1
- package/package.json +2 -2
- package/src/collection-facets/smart-facets/dedupe.ts +42 -0
- package/src/collection-facets/smart-facets/heuristics/browser-language-heuristic.ts +27 -0
- package/src/collection-facets/smart-facets/heuristics/wikidata-heuristic.ts +40 -2
- package/src/collection-facets/smart-facets/models.ts +2 -0
- package/src/collection-facets/smart-facets/smart-facet-bar.ts +97 -48
- package/src/collection-facets/smart-facets/smart-facet-button.ts +11 -2
- package/src/collection-facets/smart-facets/smart-facet-dropdown.ts +20 -12
- package/src/collection-facets/smart-facets/smart-facet-equals.ts +8 -8
- package/src/collection-facets/smart-facets/smart-facet-heuristics.ts +12 -22
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SmartFacet } from './models';
|
|
2
|
+
/**
|
|
3
|
+
* Removes any duplicated smart facets from the given array.
|
|
4
|
+
* Smart facets are equal if they have the same `label` and same
|
|
5
|
+
* set of facet refs. Only the first occurrence of a given smart
|
|
6
|
+
* facet is kept.
|
|
7
|
+
* @param facets The array of smart facets to deduplicate
|
|
8
|
+
* @returns A new array containing the deduplicated set of facets
|
|
9
|
+
*/
|
|
10
|
+
export declare function dedupe<T extends SmartFacet[] | SmartFacet[][]>(facets: T): T;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { smartFacetEquals } from './smart-facet-equals';
|
|
2
|
+
/**
|
|
3
|
+
* Removes any duplicated smart facets from the given array.
|
|
4
|
+
* Smart facets are equal if they have the same `label` and same
|
|
5
|
+
* set of facet refs. Only the first occurrence of a given smart
|
|
6
|
+
* facet is kept.
|
|
7
|
+
* @param facets The array of smart facets to deduplicate
|
|
8
|
+
* @returns A new array containing the deduplicated set of facets
|
|
9
|
+
*/
|
|
10
|
+
export function dedupe(facets) {
|
|
11
|
+
if (!Array.isArray(facets[0])) {
|
|
12
|
+
const facetsUnnested = facets;
|
|
13
|
+
let result = [...facetsUnnested];
|
|
14
|
+
for (const curFacet of facetsUnnested) {
|
|
15
|
+
result = result.filter(sf => curFacet === sf || !smartFacetEquals(curFacet, sf));
|
|
16
|
+
}
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
const facetsNested = facets;
|
|
20
|
+
const result = [];
|
|
21
|
+
for (const curFacetArray of facetsNested) {
|
|
22
|
+
const subresult = [];
|
|
23
|
+
for (const curFacet of curFacetArray) {
|
|
24
|
+
const existing = result.find(sfa => sfa.find(sf => smartFacetEquals(curFacet, sf)));
|
|
25
|
+
if (!existing)
|
|
26
|
+
subresult.push(curFacet);
|
|
27
|
+
}
|
|
28
|
+
if (subresult.length > 0) {
|
|
29
|
+
result.push(subresult);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=dedupe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedupe.js","sourceRoot":"","sources":["../../../../src/collection-facets/smart-facets/dedupe.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;;;;GAOG;AACH,MAAM,UAAU,MAAM,CAA0C,MAAS;IACvE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QAC7B,MAAM,cAAc,GAAG,MAAsB,CAAC;QAE9C,IAAI,MAAM,GAAiB,CAAC,GAAG,cAAc,CAAC,CAAC;QAC/C,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE;YACrC,MAAM,GAAG,MAAM,CAAC,MAAM,CACpB,EAAE,CAAC,EAAE,CAAC,QAAQ,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,EAAE,CAAC,CACzD,CAAC;SACH;QAED,OAAO,MAAW,CAAC;KACpB;IACD,MAAM,YAAY,GAAG,MAAwB,CAAC;IAE9C,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,KAAK,MAAM,aAAa,IAAI,YAAY,EAAE;QACxC,MAAM,SAAS,GAAiB,EAAE,CAAC;QACnC,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE;YACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CACjC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAC/C,CAAC;YACF,IAAI,CAAC,QAAQ;gBAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACzC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YACxB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SACxB;KACF;IAED,OAAO,MAAW,CAAC;AACrB,CAAC","sourcesContent":["import type { SmartFacet } from './models';\nimport { smartFacetEquals } from './smart-facet-equals';\n\n/**\n * Removes any duplicated smart facets from the given array.\n * Smart facets are equal if they have the same `label` and same\n * set of facet refs. Only the first occurrence of a given smart\n * facet is kept.\n * @param facets The array of smart facets to deduplicate\n * @returns A new array containing the deduplicated set of facets\n */\nexport function dedupe<T extends SmartFacet[] | SmartFacet[][]>(facets: T): T {\n if (!Array.isArray(facets[0])) {\n const facetsUnnested = facets as SmartFacet[];\n\n let result: SmartFacet[] = [...facetsUnnested];\n for (const curFacet of facetsUnnested) {\n result = result.filter(\n sf => curFacet === sf || !smartFacetEquals(curFacet, sf)\n );\n }\n\n return result as T;\n }\n const facetsNested = facets as SmartFacet[][];\n\n const result: SmartFacet[][] = [];\n for (const curFacetArray of facetsNested) {\n const subresult: SmartFacet[] = [];\n for (const curFacet of curFacetArray) {\n const existing = result.find(sfa =>\n sfa.find(sf => smartFacetEquals(curFacet, sf))\n );\n if (!existing) subresult.push(curFacet);\n }\n if (subresult.length > 0) {\n result.push(subresult);\n }\n }\n\n return result as T;\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export class BrowserLanguageHeuristic {
|
|
2
|
+
async getRecommendedFacets() {
|
|
3
|
+
const browserLanguageCode = navigator.language;
|
|
4
|
+
const languageName = BrowserLanguageHeuristic.getLanguageDisplayName(browserLanguageCode);
|
|
5
|
+
if (!languageName)
|
|
6
|
+
return [];
|
|
7
|
+
return [
|
|
8
|
+
{
|
|
9
|
+
facets: [
|
|
10
|
+
{
|
|
11
|
+
facetType: 'language',
|
|
12
|
+
bucketKey: languageName,
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
static getLanguageDisplayName(langCode) {
|
|
19
|
+
// Strip off any script/region/variant codes for greater generality
|
|
20
|
+
const languageOnly = langCode.split('-')[0];
|
|
21
|
+
return new Intl.DisplayNames(['en'], { type: 'language' }).of(languageOnly);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=browser-language-heuristic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-language-heuristic.js","sourceRoot":"","sources":["../../../../../src/collection-facets/smart-facets/heuristics/browser-language-heuristic.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,wBAAwB;IACnC,KAAK,CAAC,oBAAoB;QACxB,MAAM,mBAAmB,GAAG,SAAS,CAAC,QAAQ,CAAC;QAC/C,MAAM,YAAY,GAChB,wBAAwB,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,CAAC;QACvE,IAAI,CAAC,YAAY;YAAE,OAAO,EAAE,CAAC;QAE7B,OAAO;YACL;gBACE,MAAM,EAAE;oBACN;wBACE,SAAS,EAAE,UAAU;wBACrB,SAAS,EAAE,YAAY;qBACxB;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,sBAAsB,CAAC,QAAgB;QACpD,mEAAmE;QACnE,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAC9E,CAAC;CACF","sourcesContent":["import type { SmartQueryHeuristic, SmartFacet } from '../models';\n\nexport class BrowserLanguageHeuristic implements SmartQueryHeuristic {\n async getRecommendedFacets(): Promise<SmartFacet[]> {\n const browserLanguageCode = navigator.language;\n const languageName =\n BrowserLanguageHeuristic.getLanguageDisplayName(browserLanguageCode);\n if (!languageName) return [];\n\n return [\n {\n facets: [\n {\n facetType: 'language',\n bucketKey: languageName,\n },\n ],\n },\n ];\n }\n\n private static getLanguageDisplayName(langCode: string): string | undefined {\n // Strip off any script/region/variant codes for greater generality\n const languageOnly = langCode.split('-')[0];\n return new Intl.DisplayNames(['en'], { type: 'language' }).of(languageOnly);\n }\n}\n"]}
|
|
@@ -16,7 +16,7 @@ export class WikidataHeuristic {
|
|
|
16
16
|
const wikidataResponse = await fetch(`https://www.wikidata.org/w/api.php?action=wbsearchentities&search=${urlQuery}&format=json&language=en&uselang=en&origin=*&type=item&limit=5`);
|
|
17
17
|
const searchResults = await wikidataResponse.json();
|
|
18
18
|
for (const [keyword, facets] of Object.entries(WikidataHeuristic.ENTITIES)) {
|
|
19
|
-
const keywordRegex = new RegExp(
|
|
19
|
+
const keywordRegex = new RegExp(`\\b${keyword}\\b`);
|
|
20
20
|
if (keywordRegex.test((_a = searchResults.search[0]) === null || _a === void 0 ? void 0 : _a.description)) {
|
|
21
21
|
const entityName = searchResults.search[0].label;
|
|
22
22
|
recommendations.push(...facets.map(sf => {
|
|
@@ -46,7 +46,9 @@ export class WikidataHeuristic {
|
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
WikidataHeuristic.ENTITIES = {
|
|
49
|
-
'written work': [
|
|
49
|
+
'written work': [
|
|
50
|
+
{ facets: [{ facetType: 'mediatype', bucketKey: 'texts' }] },
|
|
51
|
+
],
|
|
50
52
|
literature: [{ facets: [{ facetType: 'mediatype', bucketKey: 'texts' }] }],
|
|
51
53
|
book: [{ facets: [{ facetType: 'mediatype', bucketKey: 'texts' }] }],
|
|
52
54
|
novel: [{ facets: [{ facetType: 'mediatype', bucketKey: 'texts' }] }],
|
|
@@ -104,6 +106,24 @@ WikidataHeuristic.ENTITIES = {
|
|
|
104
106
|
],
|
|
105
107
|
},
|
|
106
108
|
],
|
|
109
|
+
'visual artist': [
|
|
110
|
+
{
|
|
111
|
+
label: 'Images by __QUERY',
|
|
112
|
+
facets: [
|
|
113
|
+
{ facetType: 'mediatype', bucketKey: 'image' },
|
|
114
|
+
{ facetType: 'creator', bucketKey: '__QUERY' },
|
|
115
|
+
],
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
'graphic artist': [
|
|
119
|
+
{
|
|
120
|
+
label: 'Images by __QUERY',
|
|
121
|
+
facets: [
|
|
122
|
+
{ facetType: 'mediatype', bucketKey: 'image' },
|
|
123
|
+
{ facetType: 'creator', bucketKey: '__QUERY' },
|
|
124
|
+
],
|
|
125
|
+
},
|
|
126
|
+
],
|
|
107
127
|
singer: [
|
|
108
128
|
{
|
|
109
129
|
label: 'Music by __QUERY',
|
|
@@ -131,5 +151,23 @@ WikidataHeuristic.ENTITIES = {
|
|
|
131
151
|
],
|
|
132
152
|
},
|
|
133
153
|
],
|
|
154
|
+
composer: [
|
|
155
|
+
{
|
|
156
|
+
label: 'Music by __QUERY',
|
|
157
|
+
facets: [
|
|
158
|
+
{ facetType: 'mediatype', bucketKey: 'audio' },
|
|
159
|
+
{ facetType: 'creator', bucketKey: '__QUERY' },
|
|
160
|
+
],
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
pianist: [
|
|
164
|
+
{
|
|
165
|
+
label: 'Music by __QUERY',
|
|
166
|
+
facets: [
|
|
167
|
+
{ facetType: 'mediatype', bucketKey: 'audio' },
|
|
168
|
+
{ facetType: 'creator', bucketKey: '__QUERY' },
|
|
169
|
+
],
|
|
170
|
+
},
|
|
171
|
+
],
|
|
134
172
|
};
|
|
135
173
|
//# sourceMappingURL=wikidata-heuristic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wikidata-heuristic.js","sourceRoot":"","sources":["../../../../../src/collection-facets/smart-facets/heuristics/wikidata-heuristic.ts"],"names":[],"mappings":"AAMA,4EAA4E;AAC5E,mBAAmB;AACnB,0BAA0B;AAC1B,2BAA2B;AAC3B,8CAA8C;AAC9C,+CAA+C;AAC/C,8CAA8C;AAC9C,8CAA8C;AAC9C,OAAO;AACP,MAAM,OAAO,iBAAiB;
|
|
1
|
+
{"version":3,"file":"wikidata-heuristic.js","sourceRoot":"","sources":["../../../../../src/collection-facets/smart-facets/heuristics/wikidata-heuristic.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n SmartQueryHeuristic,\n KeywordFacetMap,\n SmartFacet,\n} from '../models';\n\n// If wikidata describes the top query result as X, recommend facet Y, e.g.:\n// X Y\n// written work mt:texts\n// film mt:movies\n// author mt:texts and creator:<query>\n// filmmaker mt:movies and creator:<query>\n// photographer mt:image and creator:<query>\n// visual artist mt:image and creator:<query>\n// etc.\nexport class WikidataHeuristic implements SmartQueryHeuristic {\n private static readonly ENTITIES: KeywordFacetMap = {\n 'written work': [\n { facets: [{ facetType: 'mediatype', bucketKey: 'texts' }] },\n ],\n literature: [{ facets: [{ facetType: 'mediatype', bucketKey: 'texts' }] }],\n book: [{ facets: [{ facetType: 'mediatype', bucketKey: 'texts' }] }],\n novel: [{ facets: [{ facetType: 'mediatype', bucketKey: 'texts' }] }],\n filmmaker: [\n {\n label: 'Films by __QUERY',\n facets: [\n { facetType: 'mediatype', bucketKey: 'movies' },\n { facetType: 'creator', bucketKey: '__QUERY' },\n ],\n },\n ],\n author: [\n {\n label: 'Writing by __QUERY',\n facets: [\n { facetType: 'mediatype', bucketKey: 'texts' },\n { facetType: 'creator', bucketKey: '__QUERY' },\n ],\n },\n ],\n writer: [\n {\n label: 'Writing by __QUERY',\n facets: [\n { facetType: 'mediatype', bucketKey: 'texts' },\n { facetType: 'creator', bucketKey: '__QUERY' },\n ],\n },\n ],\n poet: [\n {\n label: 'Writing by __QUERY',\n facets: [\n { facetType: 'mediatype', bucketKey: 'texts' },\n { facetType: 'creator', bucketKey: '__QUERY' },\n ],\n },\n ],\n photographer: [\n {\n label: 'Images by __QUERY',\n facets: [\n { facetType: 'mediatype', bucketKey: 'image' },\n { facetType: 'creator', bucketKey: '__QUERY' },\n ],\n },\n ],\n painter: [\n {\n label: 'Images by __QUERY',\n facets: [\n { facetType: 'mediatype', bucketKey: 'image' },\n { facetType: 'creator', bucketKey: '__QUERY' },\n ],\n },\n ],\n 'visual artist': [\n {\n label: 'Images by __QUERY',\n facets: [\n { facetType: 'mediatype', bucketKey: 'image' },\n { facetType: 'creator', bucketKey: '__QUERY' },\n ],\n },\n ],\n 'graphic artist': [\n {\n label: 'Images by __QUERY',\n facets: [\n { facetType: 'mediatype', bucketKey: 'image' },\n { facetType: 'creator', bucketKey: '__QUERY' },\n ],\n },\n ],\n singer: [\n {\n label: 'Music by __QUERY',\n facets: [\n { facetType: 'mediatype', bucketKey: 'audio' },\n { facetType: 'creator', bucketKey: '__QUERY' },\n ],\n },\n ],\n songwriter: [\n {\n label: 'Music by __QUERY',\n facets: [\n { facetType: 'mediatype', bucketKey: 'audio' },\n { facetType: 'creator', bucketKey: '__QUERY' },\n ],\n },\n ],\n musician: [\n {\n label: 'Music by __QUERY',\n facets: [\n { facetType: 'mediatype', bucketKey: 'audio' },\n { facetType: 'creator', bucketKey: '__QUERY' },\n ],\n },\n ],\n composer: [\n {\n label: 'Music by __QUERY',\n facets: [\n { facetType: 'mediatype', bucketKey: 'audio' },\n { facetType: 'creator', bucketKey: '__QUERY' },\n ],\n },\n ],\n pianist: [\n {\n label: 'Music by __QUERY',\n facets: [\n { facetType: 'mediatype', bucketKey: 'audio' },\n { facetType: 'creator', bucketKey: '__QUERY' },\n ],\n },\n ],\n };\n\n async getRecommendedFacets(query: string): Promise<SmartFacet[]> {\n const recommendations: SmartFacet[] = [];\n\n try {\n const urlQuery = encodeURIComponent(query);\n\n const wikidataResponse = await fetch(\n `https://www.wikidata.org/w/api.php?action=wbsearchentities&search=${urlQuery}&format=json&language=en&uselang=en&origin=*&type=item&limit=5`\n );\n const searchResults = await wikidataResponse.json();\n\n for (const [keyword, facets] of Object.entries(\n WikidataHeuristic.ENTITIES\n )) {\n const keywordRegex = new RegExp(`\\\\b${keyword}\\\\b`);\n if (keywordRegex.test(searchResults.search[0]?.description)) {\n const entityName = searchResults.search[0].label;\n recommendations.push(\n ...facets.map(\n sf =>\n ({\n label: sf.label?.replace('__QUERY', entityName),\n facets: sf.facets.map(f => {\n const replaced = {\n ...f,\n bucketKey: f.bucketKey.replace('__QUERY', query),\n };\n\n if (f.displayText) {\n replaced.displayText = replaced.displayText?.replace(\n '__QUERY',\n entityName\n );\n }\n\n return replaced;\n }),\n } as SmartFacet)\n )\n );\n }\n }\n\n return recommendations;\n } catch (err) {\n return [];\n }\n }\n}\n"]}
|
|
@@ -7,10 +7,12 @@ export interface FacetRef {
|
|
|
7
7
|
interface LabeledSmartFacet {
|
|
8
8
|
label: string;
|
|
9
9
|
facets: FacetRef[];
|
|
10
|
+
selected?: boolean;
|
|
10
11
|
}
|
|
11
12
|
interface UnlabeledSmartFacet {
|
|
12
13
|
label?: string;
|
|
13
14
|
facets: [FacetRef];
|
|
15
|
+
selected?: boolean;
|
|
14
16
|
}
|
|
15
17
|
export declare type SmartFacet = LabeledSmartFacet | UnlabeledSmartFacet;
|
|
16
18
|
export interface SmartFacetEvent {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../src/collection-facets/smart-facets/models.ts"],"names":[],"mappings":"","sourcesContent":["import type { FacetEventDetails, FacetOption } from '../../models';\n\nexport interface FacetRef {\n facetType: FacetOption;\n bucketKey: string;\n displayText?: string;\n}\n\ninterface LabeledSmartFacet {\n label: string;\n facets: FacetRef[];\n}\n\ninterface UnlabeledSmartFacet {\n label?: string;\n facets: [FacetRef];\n}\n\nexport type SmartFacet = LabeledSmartFacet | UnlabeledSmartFacet;\n\nexport interface SmartFacetEvent {\n smartFacet: SmartFacet;\n details: FacetEventDetails[];\n}\n\nexport type KeywordFacetMap = Record<string, SmartFacet[]>;\n\nexport interface SmartQueryHeuristic {\n getRecommendedFacets(query: string): Promise<SmartFacet[]>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../src/collection-facets/smart-facets/models.ts"],"names":[],"mappings":"","sourcesContent":["import type { FacetEventDetails, FacetOption } from '../../models';\n\nexport interface FacetRef {\n facetType: FacetOption;\n bucketKey: string;\n displayText?: string;\n}\n\ninterface LabeledSmartFacet {\n label: string;\n facets: FacetRef[];\n selected?: boolean;\n}\n\ninterface UnlabeledSmartFacet {\n label?: string;\n facets: [FacetRef];\n selected?: boolean;\n}\n\nexport type SmartFacet = LabeledSmartFacet | UnlabeledSmartFacet;\n\nexport interface SmartFacetEvent {\n smartFacet: SmartFacet;\n details: FacetEventDetails[];\n}\n\nexport type KeywordFacetMap = Record<string, SmartFacet[]>;\n\nexport interface SmartQueryHeuristic {\n getRecommendedFacets(query: string): Promise<SmartFacet[]>;\n}\n"]}
|
|
@@ -13,15 +13,18 @@ export declare class SmartFacetBar extends LitElement {
|
|
|
13
13
|
filterToggleActive: boolean;
|
|
14
14
|
private heuristicRecs;
|
|
15
15
|
private smartFacets;
|
|
16
|
+
private lastAggregations?;
|
|
16
17
|
render(): TemplateResult<1>;
|
|
17
18
|
protected willUpdate(changed: PropertyValues): void;
|
|
18
19
|
private updateSmartFacets;
|
|
19
20
|
private makeSmartFacet;
|
|
20
21
|
private smartFacetButton;
|
|
22
|
+
private smartFacetDropdown;
|
|
21
23
|
private get filtersToggleTemplate();
|
|
22
24
|
private get facetsToDisplay();
|
|
23
25
|
private toSmartFacet;
|
|
24
26
|
private facetClicked;
|
|
27
|
+
private facetDropdownClicked;
|
|
25
28
|
private filterToggleClicked;
|
|
26
29
|
static get styles(): CSSResultGroup;
|
|
27
30
|
}
|
|
@@ -8,6 +8,8 @@ import { SmartQueryHeuristicGroup } from './smart-facet-heuristics';
|
|
|
8
8
|
import filterIcon from '../../assets/img/icons/filter';
|
|
9
9
|
import './smart-facet-button';
|
|
10
10
|
import './smart-facet-dropdown';
|
|
11
|
+
import { smartFacetEquals } from './smart-facet-equals';
|
|
12
|
+
import { dedupe } from './dedupe';
|
|
11
13
|
const fieldPrefixes = {
|
|
12
14
|
collection: 'Collection: ',
|
|
13
15
|
creator: 'By: ',
|
|
@@ -30,23 +32,28 @@ let SmartFacetBar = class SmartFacetBar extends LitElement {
|
|
|
30
32
|
return html `
|
|
31
33
|
<div id="smart-facets-container">
|
|
32
34
|
${this.filtersToggleTemplate}
|
|
33
|
-
${repeat(this.smartFacets, f => `${f.label}|${f.facets[0].facetType}|${f.facets[0].bucketKey}`, facet => this.makeSmartFacet(
|
|
35
|
+
${repeat(this.smartFacets, f => `${f[0].label}|${f[0].facets[0].facetType}|${f[0].facets[0].bucketKey}`, facet => this.makeSmartFacet(facet))}
|
|
34
36
|
</div>
|
|
35
37
|
`;
|
|
36
38
|
}
|
|
37
39
|
willUpdate(changed) {
|
|
38
|
-
if (changed.has('query')
|
|
39
|
-
(changed.has('aggregations') &&
|
|
40
|
-
(!changed.get('aggregations') ||
|
|
41
|
-
Object.keys(changed.get('aggregations')).length === 0))) {
|
|
40
|
+
if (changed.has('query')) {
|
|
42
41
|
this.updateSmartFacets();
|
|
42
|
+
this.lastAggregations = undefined;
|
|
43
|
+
}
|
|
44
|
+
if (changed.has('aggregations') &&
|
|
45
|
+
!this.lastAggregations &&
|
|
46
|
+
this.aggregations &&
|
|
47
|
+
Object.keys(this.aggregations).length > 0) {
|
|
48
|
+
this.lastAggregations = this.aggregations;
|
|
43
49
|
}
|
|
44
50
|
}
|
|
45
51
|
async updateSmartFacets() {
|
|
52
|
+
console.log('updating smart facets');
|
|
46
53
|
if (this.query) {
|
|
47
54
|
this.heuristicRecs =
|
|
48
55
|
await new SmartQueryHeuristicGroup().getRecommendedFacets(this.query);
|
|
49
|
-
this.smartFacets = this.facetsToDisplay;
|
|
56
|
+
this.smartFacets = dedupe(this.facetsToDisplay);
|
|
50
57
|
}
|
|
51
58
|
}
|
|
52
59
|
//
|
|
@@ -56,31 +63,32 @@ let SmartFacetBar = class SmartFacetBar extends LitElement {
|
|
|
56
63
|
if (facets.length === 0) {
|
|
57
64
|
return nothing;
|
|
58
65
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
66
|
+
if (facets.length === 1) {
|
|
67
|
+
return this.smartFacetButton(facets[0]);
|
|
68
|
+
}
|
|
69
|
+
return this.smartFacetDropdown(facets);
|
|
63
70
|
}
|
|
64
71
|
smartFacetButton(facet) {
|
|
72
|
+
var _a;
|
|
65
73
|
return html `
|
|
66
74
|
<smart-facet-button
|
|
67
75
|
.facetInfo=${facet}
|
|
76
|
+
.labelPrefix=${fieldPrefixes[facet.facets[0].facetType]}
|
|
77
|
+
.selected=${(_a = facet.selected) !== null && _a !== void 0 ? _a : false}
|
|
68
78
|
@facetClick=${this.facetClicked}
|
|
69
79
|
></smart-facet-button>
|
|
70
80
|
`;
|
|
71
81
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
// `;
|
|
83
|
-
// }
|
|
82
|
+
smartFacetDropdown(facets) {
|
|
83
|
+
return html `
|
|
84
|
+
<smart-facet-dropdown
|
|
85
|
+
.facetInfo=${facets}
|
|
86
|
+
.labelPrefix=${fieldPrefixes[facets[0].facets[0].facetType]}
|
|
87
|
+
.activeFacetRef=${facets[0].facets[0]}
|
|
88
|
+
@facetClick=${this.facetDropdownClicked}
|
|
89
|
+
></smart-facet-dropdown>
|
|
90
|
+
`;
|
|
91
|
+
}
|
|
84
92
|
get filtersToggleTemplate() {
|
|
85
93
|
return html `
|
|
86
94
|
<button
|
|
@@ -94,15 +102,26 @@ let SmartFacetBar = class SmartFacetBar extends LitElement {
|
|
|
94
102
|
`;
|
|
95
103
|
}
|
|
96
104
|
get facetsToDisplay() {
|
|
97
|
-
if (!this.
|
|
105
|
+
if (!this.lastAggregations)
|
|
98
106
|
return [];
|
|
99
107
|
const facets = [];
|
|
100
108
|
if (this.heuristicRecs.length > 0) {
|
|
101
109
|
for (const rec of this.heuristicRecs) {
|
|
102
|
-
facets.push(rec);
|
|
110
|
+
facets.push([rec]);
|
|
103
111
|
}
|
|
104
112
|
}
|
|
105
|
-
|
|
113
|
+
const keys = [
|
|
114
|
+
'mediatype',
|
|
115
|
+
'year',
|
|
116
|
+
'language',
|
|
117
|
+
'creator',
|
|
118
|
+
'subject',
|
|
119
|
+
'collection',
|
|
120
|
+
];
|
|
121
|
+
for (const key of keys) {
|
|
122
|
+
const agg = this.lastAggregations[key];
|
|
123
|
+
if (!agg)
|
|
124
|
+
continue;
|
|
106
125
|
if (agg.buckets.length === 0)
|
|
107
126
|
continue;
|
|
108
127
|
if (['lending', 'year_histogram'].includes(key))
|
|
@@ -116,26 +135,30 @@ let SmartFacetBar = class SmartFacetBar extends LitElement {
|
|
|
116
135
|
}
|
|
117
136
|
const facetType = key;
|
|
118
137
|
const buckets = agg.buckets;
|
|
119
|
-
const
|
|
138
|
+
const unusedBuckets = buckets.filter(b => {
|
|
120
139
|
var _a;
|
|
121
140
|
const selectedFacetBucket = (_a = this.selectedFacets) === null || _a === void 0 ? void 0 : _a[facetType][b.key];
|
|
122
|
-
if (selectedFacetBucket && selectedFacetBucket.state !== 'none')
|
|
141
|
+
if (selectedFacetBucket && selectedFacetBucket.state !== 'none') {
|
|
123
142
|
return false;
|
|
143
|
+
}
|
|
124
144
|
return true;
|
|
125
145
|
});
|
|
126
|
-
if (!bestBucket)
|
|
127
|
-
continue;
|
|
128
|
-
facets.push(this.toSmartFacet(facetType, [bestBucket]));
|
|
129
146
|
if (facetType === 'mediatype') {
|
|
130
|
-
facets.push(this.toSmartFacet(facetType, [
|
|
147
|
+
facets.push([this.toSmartFacet(facetType, [unusedBuckets[0]])], [this.toSmartFacet(facetType, [unusedBuckets[1]])]);
|
|
148
|
+
}
|
|
149
|
+
else if (facetType === 'collection' || facetType === 'subject') {
|
|
150
|
+
const topBuckets = unusedBuckets.slice(0, 5);
|
|
151
|
+
facets.push(topBuckets.map(b => this.toSmartFacet(facetType, [b])));
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
facets.push([this.toSmartFacet(facetType, [unusedBuckets[0]])]);
|
|
131
155
|
}
|
|
132
|
-
// if (facetType === 'collection' || facetType === 'subject') {
|
|
133
|
-
// facets[facets.length - 1].buckets.push(...buckets.slice(1, 4).map(b => this.toSmartFacet(facetType, [b], false).buckets[0]));
|
|
134
|
-
// }
|
|
135
156
|
}
|
|
136
157
|
return facets;
|
|
137
158
|
}
|
|
138
|
-
toSmartFacet(facetType, buckets
|
|
159
|
+
toSmartFacet(facetType, buckets
|
|
160
|
+
// prefix = true
|
|
161
|
+
) {
|
|
139
162
|
return {
|
|
140
163
|
facets: buckets.map(bucket => {
|
|
141
164
|
var _a;
|
|
@@ -145,9 +168,9 @@ let SmartFacetBar = class SmartFacetBar extends LitElement {
|
|
|
145
168
|
if (title)
|
|
146
169
|
displayText = title;
|
|
147
170
|
}
|
|
148
|
-
if (prefix && fieldPrefixes[facetType]) {
|
|
149
|
-
|
|
150
|
-
}
|
|
171
|
+
// if (prefix && fieldPrefixes[facetType]) {
|
|
172
|
+
// displayText = fieldPrefixes[facetType] + displayText;
|
|
173
|
+
// }
|
|
151
174
|
return {
|
|
152
175
|
facetType,
|
|
153
176
|
bucketKey: bucket.key.toString(),
|
|
@@ -158,8 +181,24 @@ let SmartFacetBar = class SmartFacetBar extends LitElement {
|
|
|
158
181
|
}
|
|
159
182
|
facetClicked(e) {
|
|
160
183
|
this.smartFacets = [
|
|
161
|
-
e.detail.smartFacet,
|
|
162
|
-
...this.smartFacets.filter(f => f !== e.detail.smartFacet),
|
|
184
|
+
[{ ...e.detail.smartFacet, selected: !e.detail.smartFacet.selected }],
|
|
185
|
+
...this.smartFacets.filter(f => f[0] !== e.detail.smartFacet),
|
|
186
|
+
];
|
|
187
|
+
for (const facet of e.detail.details) {
|
|
188
|
+
this.selectedFacets = updateSelectedFacetBucket(this.selectedFacets, facet.facetType, facet.bucket, true);
|
|
189
|
+
}
|
|
190
|
+
const event = new CustomEvent('facetsChanged', {
|
|
191
|
+
detail: this.selectedFacets,
|
|
192
|
+
});
|
|
193
|
+
this.dispatchEvent(event);
|
|
194
|
+
}
|
|
195
|
+
facetDropdownClicked(e) {
|
|
196
|
+
if (this.smartFacets.find(sf => smartFacetEquals(sf[0], e.detail.smartFacet))) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
this.smartFacets = [
|
|
200
|
+
[{ ...e.detail.smartFacet, selected: true }],
|
|
201
|
+
...this.smartFacets,
|
|
163
202
|
];
|
|
164
203
|
for (const facet of e.detail.details) {
|
|
165
204
|
this.selectedFacets = updateSelectedFacetBucket(this.selectedFacets, facet.facetType, facet.bucket, true);
|
|
@@ -233,6 +272,9 @@ __decorate([
|
|
|
233
272
|
__decorate([
|
|
234
273
|
state()
|
|
235
274
|
], SmartFacetBar.prototype, "smartFacets", void 0);
|
|
275
|
+
__decorate([
|
|
276
|
+
state()
|
|
277
|
+
], SmartFacetBar.prototype, "lastAggregations", void 0);
|
|
236
278
|
SmartFacetBar = __decorate([
|
|
237
279
|
customElement('smart-facet-bar')
|
|
238
280
|
], SmartFacetBar);
|
|
@@ -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":["/* eslint-disable no-continue */\n\nimport {\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 type { Aggregation, Bucket } from '@internetarchive/search-service';\nimport type { CollectionTitles } from '../../data-source/models';\nimport type { FacetOption, SelectedFacets } from '../../models';\nimport { updateSelectedFacetBucket } from '../../utils/facet-utils';\nimport { SmartQueryHeuristicGroup } from './smart-facet-heuristics';\nimport type { SmartFacet, SmartFacetEvent } from './models';\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 @state() private heuristicRecs: SmartFacet[] = [];\n\n @state() private smartFacets: SmartFacet[] = [];\n\n //\n // COMPONENT LIFECYCLE METHODS\n //\n\n render() {\n return html`\n <div id=\"smart-facets-container\">\n ${this.filtersToggleTemplate}\n ${repeat(\n this.smartFacets,\n f => `${f.label}|${f.facets[0].facetType}|${f.facets[0].bucketKey}`,\n facet => this.makeSmartFacet([facet])\n )}\n </div>\n `;\n }\n\n protected willUpdate(changed: PropertyValues): void {\n if (\n changed.has('query') ||\n (changed.has('aggregations') &&\n (!changed.get('aggregations') ||\n Object.keys(changed.get('aggregations')).length === 0))\n ) {\n this.updateSmartFacets();\n }\n }\n\n private async updateSmartFacets(): Promise<void> {\n if (this.query) {\n this.heuristicRecs =\n await new SmartQueryHeuristicGroup().getRecommendedFacets(this.query);\n this.smartFacets = this.facetsToDisplay;\n }\n }\n\n //\n // OTHER METHODS\n //\n\n private makeSmartFacet(facets: SmartFacet[]) {\n if (facets.length === 0) {\n return nothing;\n }\n return this.smartFacetButton(facets[0]);\n // else {\n // return this.smartFacetDropdown(facets);\n // }\n }\n\n private smartFacetButton(facet: SmartFacet) {\n return html`\n <smart-facet-button\n .facetInfo=${facet}\n @facetClick=${this.facetClicked}\n ></smart-facet-button>\n `;\n }\n\n // private smartFacetDropdown(facets: SmartFacet[]) {\n // return html`\n // <smart-facet-dropdown\n // .facetType=${facets[0].facets[0].facetType}\n // .buckets=${facets.map(sf => sf.facets.map(f => ({\n // key: f.bucketKey,\n\n // })))}\n // .activeBucket=${facet.buckets[0]}\n // @facetClick=${this.facetClicked}\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 if (!this.aggregations) return [];\n\n const facets: SmartFacet[] = [];\n\n if (this.heuristicRecs.length > 0) {\n for (const rec of this.heuristicRecs) {\n facets.push(rec);\n }\n }\n\n for (const [key, agg] of Object.entries(this.aggregations)) {\n if (agg.buckets.length === 0) continue;\n if (['lending', 'year_histogram'].includes(key)) 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 bestBucket = buckets.find(b => {\n const selectedFacetBucket = this.selectedFacets?.[facetType][b.key];\n if (selectedFacetBucket && selectedFacetBucket.state !== 'none')\n return false;\n return true;\n });\n if (!bestBucket) continue;\n\n facets.push(this.toSmartFacet(facetType, [bestBucket]));\n\n if (facetType === 'mediatype') {\n facets.push(this.toSmartFacet(facetType, [buckets[1]]));\n }\n\n // if (facetType === 'collection' || facetType === 'subject') {\n // facets[facets.length - 1].buckets.push(...buckets.slice(1, 4).map(b => this.toSmartFacet(facetType, [b], false).buckets[0]));\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 if (prefix && fieldPrefixes[facetType]) {\n displayText = fieldPrefixes[facetType] + displayText;\n }\n\n return {\n facetType,\n bucketKey: bucket.key.toString(),\n displayText,\n };\n }),\n } as SmartFacet;\n }\n\n private facetClicked(e: CustomEvent<SmartFacetEvent>): void {\n this.smartFacets = [\n e.detail.smartFacet,\n ...this.smartFacets.filter(f => f !== e.detail.smartFacet),\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 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;\n padding: 10px 0;\n }\n\n #filters-toggle {\n margin: 0;\n border: 0;\n padding: 5px 10px;\n border-radius: 15px;\n background: #194880;\n color: white;\n font-size: 1.6rem;\n font-family: inherit;\n text-decoration: none;\n box-shadow: 1px 1px rgba(0, 0, 0, 0.4);\n cursor: pointer;\n }\n\n #filters-toggle.active {\n background: #09294d;\n box-shadow: -1px -1px rgba(0, 0, 0, 0.1);\n }\n\n #filters-toggle > svg {\n width: 15px;\n filter: invert(1);\n vertical-align: text-bottom;\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":["/* eslint-disable no-continue */\n\nimport {\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 type { Aggregation, Bucket } from '@internetarchive/search-service';\nimport type { CollectionTitles } from '../../data-source/models';\nimport type { FacetOption, SelectedFacets } from '../../models';\nimport { updateSelectedFacetBucket } from '../../utils/facet-utils';\nimport { SmartQueryHeuristicGroup } from './smart-facet-heuristics';\nimport type { SmartFacet, SmartFacetEvent } from './models';\nimport filterIcon from '../../assets/img/icons/filter';\n\nimport './smart-facet-button';\nimport './smart-facet-dropdown';\nimport { smartFacetEquals } from './smart-facet-equals';\nimport { dedupe } from './dedupe';\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 @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 return html`\n <div id=\"smart-facets-container\">\n ${this.filtersToggleTemplate}\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 if (changed.has('query')) {\n this.updateSmartFacets();\n this.lastAggregations = undefined;\n }\n\n if (\n changed.has('aggregations') &&\n !this.lastAggregations &&\n this.aggregations &&\n Object.keys(this.aggregations).length > 0\n ) {\n this.lastAggregations = this.aggregations;\n }\n }\n\n private async updateSmartFacets(): Promise<void> {\n console.log('updating smart facets');\n if (this.query) {\n this.heuristicRecs =\n await new SmartQueryHeuristicGroup().getRecommendedFacets(this.query);\n this.smartFacets = dedupe(this.facetsToDisplay);\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 ></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 if (!this.lastAggregations) return [];\n\n const facets: SmartFacet[][] = [];\n\n if (this.heuristicRecs.length > 0) {\n for (const rec of this.heuristicRecs) {\n facets.push([rec]);\n }\n }\n\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'].includes(key)) 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 facets.push(\n [this.toSmartFacet(facetType, [unusedBuckets[0]])],\n [this.toSmartFacet(facetType, [unusedBuckets[1]])]\n );\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 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 // if (prefix && fieldPrefixes[facetType]) {\n // displayText = fieldPrefixes[facetType] + displayText;\n // }\n\n return {\n facetType,\n bucketKey: bucket.key.toString(),\n displayText,\n };\n }),\n } as SmartFacet;\n }\n\n private facetClicked(e: CustomEvent<SmartFacetEvent>): void {\n this.smartFacets = [\n [{ ...e.detail.smartFacet, selected: !e.detail.smartFacet.selected }],\n ...this.smartFacets.filter(f => f[0] !== e.detail.smartFacet),\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 facetDropdownClicked(e: CustomEvent<SmartFacetEvent>): void {\n if (\n this.smartFacets.find(sf => smartFacetEquals(sf[0], e.detail.smartFacet))\n ) {\n return;\n }\n\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 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;\n padding: 10px 0;\n }\n\n #filters-toggle {\n margin: 0;\n border: 0;\n padding: 5px 10px;\n border-radius: 15px;\n background: #194880;\n color: white;\n font-size: 1.6rem;\n font-family: inherit;\n text-decoration: none;\n box-shadow: 1px 1px rgba(0, 0, 0, 0.4);\n cursor: pointer;\n }\n\n #filters-toggle.active {\n background: #09294d;\n box-shadow: -1px -1px rgba(0, 0, 0, 0.1);\n }\n\n #filters-toggle > svg {\n width: 15px;\n filter: invert(1);\n vertical-align: text-bottom;\n }\n `;\n }\n}\n"]}
|
|
@@ -2,6 +2,7 @@ import { LitElement, CSSResultGroup, nothing } from 'lit';
|
|
|
2
2
|
import type { SmartFacet } from './models';
|
|
3
3
|
export declare class SmartFacetButton extends LitElement {
|
|
4
4
|
facetInfo?: SmartFacet;
|
|
5
|
+
labelPrefix?: string;
|
|
5
6
|
selected: boolean;
|
|
6
7
|
render(): import("lit-html").TemplateResult<1> | typeof nothing;
|
|
7
8
|
private get href();
|
|
@@ -2,6 +2,11 @@ import { __decorate } from "tslib";
|
|
|
2
2
|
import { css, html, LitElement, nothing } from 'lit';
|
|
3
3
|
import { customElement, property } from 'lit/decorators.js';
|
|
4
4
|
import { mediatypeConfig } from '../../mediatype/mediatype-config';
|
|
5
|
+
function capitalize(str) {
|
|
6
|
+
if (!str)
|
|
7
|
+
return str;
|
|
8
|
+
return str.charAt(0).toLocaleUpperCase() + str.slice(1);
|
|
9
|
+
}
|
|
5
10
|
let SmartFacetButton = class SmartFacetButton extends LitElement {
|
|
6
11
|
constructor() {
|
|
7
12
|
super(...arguments);
|
|
@@ -16,7 +21,8 @@ let SmartFacetButton = class SmartFacetButton extends LitElement {
|
|
|
16
21
|
return nothing;
|
|
17
22
|
const isSingleFacet = this.facetInfo.facets.length === 1;
|
|
18
23
|
const firstFacet = this.facetInfo.facets[0];
|
|
19
|
-
const displayText = (
|
|
24
|
+
const displayText = capitalize((this.labelPrefix ? `${this.labelPrefix} ` : '') +
|
|
25
|
+
((_b = (_a = this.facetInfo.label) !== null && _a !== void 0 ? _a : firstFacet.displayText) !== null && _b !== void 0 ? _b : firstFacet.bucketKey));
|
|
20
26
|
if (!displayText)
|
|
21
27
|
return nothing;
|
|
22
28
|
const icon = isSingleFacet && firstFacet.facetType === 'mediatype'
|
|
@@ -98,6 +104,9 @@ let SmartFacetButton = class SmartFacetButton extends LitElement {
|
|
|
98
104
|
__decorate([
|
|
99
105
|
property({ type: Object })
|
|
100
106
|
], SmartFacetButton.prototype, "facetInfo", void 0);
|
|
107
|
+
__decorate([
|
|
108
|
+
property({ type: String })
|
|
109
|
+
], SmartFacetButton.prototype, "labelPrefix", void 0);
|
|
101
110
|
__decorate([
|
|
102
111
|
property({ type: Boolean })
|
|
103
112
|
], SmartFacetButton.prototype, "selected", void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smart-facet-button.js","sourceRoot":"","sources":["../../../../src/collection-facets/smart-facets/smart-facet-button.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAkB,OAAO,EAAE,MAAM,KAAK,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"smart-facet-button.js","sourceRoot":"","sources":["../../../../src/collection-facets/smart-facets/smart-facet-button.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement, CSSResultGroup, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { mediatypeConfig } from '../../mediatype/mediatype-config';\nimport type { SmartFacet } from './models';\n\nfunction capitalize(str?: string): string | undefined {\n if (!str) return str;\n return str.charAt(0).toLocaleUpperCase() + str.slice(1);\n}\n\n@customElement('smart-facet-button')\nexport class SmartFacetButton extends LitElement {\n @property({ type: Object }) facetInfo?: SmartFacet;\n\n @property({ type: String }) labelPrefix?: string;\n\n @property({ type: Boolean }) selected = false;\n\n //\n // COMPONENT LIFECYCLE METHODS\n //\n\n render() {\n if (!this.facetInfo) return nothing;\n\n const isSingleFacet = this.facetInfo.facets.length === 1;\n const firstFacet = this.facetInfo.facets[0];\n\n const displayText = capitalize(\n (this.labelPrefix ? `${this.labelPrefix} ` : '') +\n (this.facetInfo.label ?? firstFacet.displayText ?? firstFacet.bucketKey)\n );\n if (!displayText) return nothing;\n\n const icon =\n isSingleFacet && firstFacet.facetType === 'mediatype'\n ? mediatypeConfig[firstFacet.bucketKey].icon\n : nothing;\n\n return html`\n <a\n class=\"smart-facet-button ${this.selected ? 'selected' : ''}\"\n href=${this.href}\n @click=${this.facetClicked}\n >\n ${icon} ${displayText}\n ${this.selected\n ? html`<span style=\"margin-left: 5px;\">×</span>`\n : nothing}\n </a>\n `;\n }\n\n //\n // OTHER METHODS\n //\n\n private get href(): string {\n const url = new URL(window.location.href);\n if (this.facetInfo) {\n for (const facet of this.facetInfo.facets) {\n url.searchParams.append(\n 'and[]',\n encodeURIComponent(`${facet.facetType}:\"${facet.bucketKey}\"`)\n );\n }\n }\n return url.toString();\n }\n\n private facetClicked(e: Event): void {\n e.preventDefault();\n if (!this.facetInfo) return;\n\n this.selected = !this.selected;\n\n this.dispatchEvent(\n new CustomEvent('facetClick', {\n detail: {\n smartFacet: this.facetInfo,\n details: this.facetInfo.facets.map(f => ({\n facetType: f.facetType,\n bucket: {\n key: f.bucketKey,\n count: 0,\n state: this.selected ? 'selected' : 'none',\n },\n negative: false,\n })),\n },\n })\n );\n }\n\n //\n // STYLES\n //\n\n static get styles(): CSSResultGroup {\n return css`\n .smart-facet-button {\n padding: 5px 10px;\n border-radius: 15px;\n background: #194880;\n color: white;\n font-size: 1.6rem;\n font-family: inherit;\n text-decoration: none;\n box-shadow: 1px 1px rgba(0, 0, 0, 0.4);\n }\n\n .smart-facet-button.selected {\n background: #4c76aa;\n }\n\n .smart-facet-button > svg {\n width: 15px;\n filter: invert(1);\n vertical-align: text-top;\n }\n `;\n }\n}\n"]}
|
|
@@ -68,7 +68,8 @@ let SmartFacetDropdown = class SmartFacetDropdown extends LitElement {
|
|
|
68
68
|
this.dispatchEvent(new CustomEvent('facetClick', {
|
|
69
69
|
detail: {
|
|
70
70
|
smartFacet: selectedSmartFacet,
|
|
71
|
-
details: [
|
|
71
|
+
details: [
|
|
72
|
+
{
|
|
72
73
|
facetType: this.activeFacetRef.facetType,
|
|
73
74
|
bucket: {
|
|
74
75
|
key: this.activeFacetRef.bucketKey,
|
|
@@ -76,7 +77,8 @@ let SmartFacetDropdown = class SmartFacetDropdown extends LitElement {
|
|
|
76
77
|
state: 'selected',
|
|
77
78
|
},
|
|
78
79
|
negative: false,
|
|
79
|
-
}
|
|
80
|
+
},
|
|
81
|
+
],
|
|
80
82
|
},
|
|
81
83
|
}));
|
|
82
84
|
}
|