@internetarchive/collection-browser 0.2.21 → 0.2.22-rc1
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/app-root.d.ts +1 -0
- package/dist/src/app-root.js +34 -4
- package/dist/src/app-root.js.map +1 -1
- package/dist/src/assets/img/icons/arrow-left.d.ts +2 -0
- package/dist/src/assets/img/icons/arrow-left.js +10 -0
- package/dist/src/assets/img/icons/arrow-left.js.map +1 -0
- package/dist/src/assets/img/icons/arrow-right.d.ts +2 -0
- package/dist/src/assets/img/icons/arrow-right.js +10 -0
- package/dist/src/assets/img/icons/arrow-right.js.map +1 -0
- package/dist/src/collection-browser.d.ts +2 -0
- package/dist/src/collection-browser.js +10 -2
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets/facets-template.d.ts +16 -0
- package/dist/src/collection-facets/facets-template.js +266 -0
- package/dist/src/collection-facets/facets-template.js.map +1 -0
- package/dist/src/collection-facets/facets-util.d.ts +10 -0
- package/dist/src/collection-facets/facets-util.js +20 -0
- package/dist/src/collection-facets/facets-util.js.map +1 -0
- package/dist/src/collection-facets/more-facets-content.d.ts +83 -0
- package/dist/src/collection-facets/more-facets-content.js +475 -0
- package/dist/src/collection-facets/more-facets-content.js.map +1 -0
- package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -0
- package/dist/src/collection-facets/more-facets-pagination.js +267 -0
- package/dist/src/collection-facets/more-facets-pagination.js.map +1 -0
- package/dist/src/collection-facets.d.ts +19 -5
- package/dist/src/collection-facets.js +138 -239
- package/dist/src/collection-facets.js.map +1 -1
- package/dist/src/models.d.ts +4 -1
- package/dist/src/models.js +24 -0
- package/dist/src/models.js.map +1 -1
- package/dist/src/restoration-state-handler.js +5 -6
- package/dist/src/restoration-state-handler.js.map +1 -1
- package/dist/src/tiles/collection-browser-loading-tile.js +2 -5
- package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -1
- package/dist/test/collection-browser.test.js +5 -3
- package/dist/test/collection-browser.test.js.map +1 -1
- package/dist/test/collection-facets/facets-template.test.d.ts +1 -0
- package/dist/test/collection-facets/facets-template.test.js +75 -0
- package/dist/test/collection-facets/facets-template.test.js.map +1 -0
- package/dist/test/collection-facets/facets-util.test.d.ts +1 -0
- package/dist/test/collection-facets/facets-util.test.js +13 -0
- package/dist/test/collection-facets/facets-util.test.js.map +1 -0
- package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -0
- package/dist/test/collection-facets/more-facets-content.test.js +104 -0
- package/dist/test/collection-facets/more-facets-content.test.js.map +1 -0
- package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -0
- package/dist/test/collection-facets/more-facets-pagination.test.js +133 -0
- package/dist/test/collection-facets/more-facets-pagination.test.js.map +1 -0
- package/dist/test/collection-facets.test.d.ts +1 -0
- package/dist/test/collection-facets.test.js +98 -33
- package/dist/test/collection-facets.test.js.map +1 -1
- package/package.json +11 -4
- package/src/app-root.ts +34 -4
- package/src/assets/img/icons/arrow-left.ts +10 -0
- package/src/assets/img/icons/arrow-right.ts +10 -0
- package/src/collection-browser.ts +9 -2
- package/src/collection-facets/facets-template.ts +284 -0
- package/src/collection-facets/facets-util.ts +22 -0
- package/src/collection-facets/more-facets-content.ts +529 -0
- package/src/collection-facets/more-facets-pagination.ts +297 -0
- package/src/collection-facets.ts +175 -261
- package/src/models.ts +28 -1
- package/src/restoration-state-handler.ts +7 -6
- package/src/tiles/collection-browser-loading-tile.ts +2 -5
- package/test/collection-browser.test.ts +6 -3
- package/test/collection-facets/facets-template.test.ts +103 -0
- package/test/collection-facets/facets-util.test.ts +18 -0
- package/test/collection-facets/more-facets-content.test.ts +146 -0
- package/test/collection-facets/more-facets-pagination.test.ts +202 -0
- package/test/collection-facets.test.ts +127 -44
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
/* eslint-disable dot-notation */
|
|
3
|
+
/* eslint-disable lit-a11y/click-events-have-key-events */
|
|
4
|
+
import { css, html, LitElement, nothing, } from 'lit';
|
|
5
|
+
import { customElement, property, state } from 'lit/decorators.js';
|
|
6
|
+
import { facetTitles, } from '../models';
|
|
7
|
+
import { getFacetOptionFromKey } from './facets-util';
|
|
8
|
+
import '@internetarchive/ia-activity-indicator/ia-activity-indicator';
|
|
9
|
+
import './more-facets-pagination';
|
|
10
|
+
import './facets-template';
|
|
11
|
+
let MoreFacetsContent = class MoreFacetsContent extends LitElement {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.sortedBy = 'count'; // count | alpha
|
|
15
|
+
this.facetGroup = [];
|
|
16
|
+
this.facetGroupTitle = '';
|
|
17
|
+
this.pageNumber = 1;
|
|
18
|
+
/**
|
|
19
|
+
* Facets are loading on popup
|
|
20
|
+
*/
|
|
21
|
+
this.facetsLoading = true;
|
|
22
|
+
this.paginationSize = 0;
|
|
23
|
+
this.facetsType = 'modal';
|
|
24
|
+
this.facetsPerPage = 60; // TODO: Q. how many items we want to have on popup view
|
|
25
|
+
}
|
|
26
|
+
updated(changed) {
|
|
27
|
+
if (changed.has('facetKey')) {
|
|
28
|
+
this.facetsLoading = true;
|
|
29
|
+
this.pageNumber = 1;
|
|
30
|
+
this.updateSpecificFacets();
|
|
31
|
+
}
|
|
32
|
+
if (changed.has('pageNumber')) {
|
|
33
|
+
this.facetGroup = this.aggregationFacetGroups;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
firstUpdated() {
|
|
37
|
+
this.setupEscapeListeners();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Close more facets modal on Escape click
|
|
41
|
+
*/
|
|
42
|
+
setupEscapeListeners() {
|
|
43
|
+
if (this.modalManager) {
|
|
44
|
+
document.addEventListener('keydown', (e) => {
|
|
45
|
+
var _a;
|
|
46
|
+
if (e.key === 'Escape') {
|
|
47
|
+
(_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.closeModal();
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
document.removeEventListener('keydown', () => { });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get specific facets data from search-service API based of currently query params
|
|
57
|
+
* - this.aggregations - hold result of search service and being used for further processing.
|
|
58
|
+
*/
|
|
59
|
+
async updateSpecificFacets() {
|
|
60
|
+
var _a, _b;
|
|
61
|
+
const aggregations = {
|
|
62
|
+
advancedParams: [
|
|
63
|
+
{
|
|
64
|
+
field: this.facetAggregationKey,
|
|
65
|
+
size: 65535, // todo - do we want to have all the records at once?
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
};
|
|
69
|
+
const params = {
|
|
70
|
+
query: this.fullQuery,
|
|
71
|
+
fields: ['identifier'],
|
|
72
|
+
aggregations,
|
|
73
|
+
rows: 1, // todo - do we want server-side pagination with offset/page/limit flag?
|
|
74
|
+
};
|
|
75
|
+
const results = await ((_a = this.searchService) === null || _a === void 0 ? void 0 : _a.search(params));
|
|
76
|
+
this.aggregations = (_b = results === null || results === void 0 ? void 0 : results.success) === null || _b === void 0 ? void 0 : _b.response.aggregations;
|
|
77
|
+
this.facetGroup = this.aggregationFacetGroups;
|
|
78
|
+
this.facetsLoading = false;
|
|
79
|
+
}
|
|
80
|
+
pageNumberClicked(e) {
|
|
81
|
+
var _a;
|
|
82
|
+
const page = (_a = e === null || e === void 0 ? void 0 : e.detail) === null || _a === void 0 ? void 0 : _a.page;
|
|
83
|
+
if (page) {
|
|
84
|
+
this.pageNumber = Number(page);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Combines the selected facets with the aggregations to create a single list of facets
|
|
89
|
+
*/
|
|
90
|
+
get mergedFacets() {
|
|
91
|
+
var _a;
|
|
92
|
+
const facetGroups = [];
|
|
93
|
+
const selectedFacetGroup = this.selectedFacetGroups.find(group => group.key === this.facetKey);
|
|
94
|
+
const aggregateFacetGroup = this.aggregationFacetGroups.find(group => group.key === this.facetKey);
|
|
95
|
+
// if the user selected a facet, but it's not in the aggregation, we add it as-is
|
|
96
|
+
if (selectedFacetGroup && !aggregateFacetGroup) {
|
|
97
|
+
facetGroups.push(selectedFacetGroup);
|
|
98
|
+
return facetGroups;
|
|
99
|
+
}
|
|
100
|
+
// if we don't have an aggregate facet group, don't add this to the list
|
|
101
|
+
if (!aggregateFacetGroup)
|
|
102
|
+
return facetGroups;
|
|
103
|
+
// start with either the selected group if we have one, or the aggregate group
|
|
104
|
+
const facetGroup = selectedFacetGroup !== null && selectedFacetGroup !== void 0 ? selectedFacetGroup : aggregateFacetGroup;
|
|
105
|
+
// attach the counts to the selected buckets
|
|
106
|
+
const bucketsWithCount = (_a = selectedFacetGroup === null || selectedFacetGroup === void 0 ? void 0 : selectedFacetGroup.buckets.map(bucket => {
|
|
107
|
+
const selectedBucket = aggregateFacetGroup.buckets.find(b => b.key === bucket.key);
|
|
108
|
+
return selectedBucket
|
|
109
|
+
? {
|
|
110
|
+
...bucket,
|
|
111
|
+
count: selectedBucket.count,
|
|
112
|
+
}
|
|
113
|
+
: bucket;
|
|
114
|
+
})) !== null && _a !== void 0 ? _a : [];
|
|
115
|
+
// append any additional buckets that were not selected
|
|
116
|
+
aggregateFacetGroup.buckets.forEach(bucket => {
|
|
117
|
+
const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);
|
|
118
|
+
if (existingBucket)
|
|
119
|
+
return;
|
|
120
|
+
bucketsWithCount.push(bucket);
|
|
121
|
+
});
|
|
122
|
+
facetGroup.buckets = bucketsWithCount;
|
|
123
|
+
facetGroups.push(facetGroup);
|
|
124
|
+
return facetGroups;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Converts the selected facets to a `FacetGroup` array,
|
|
128
|
+
* which is easier to work with
|
|
129
|
+
*/
|
|
130
|
+
get selectedFacetGroups() {
|
|
131
|
+
if (!this.selectedFacets)
|
|
132
|
+
return [];
|
|
133
|
+
const facetGroups = Object.entries(this.selectedFacets).map(([key, selectedFacets]) => {
|
|
134
|
+
const option = key;
|
|
135
|
+
const title = facetTitles[option];
|
|
136
|
+
const buckets = Object.entries(selectedFacets).map(([value, data]) => {
|
|
137
|
+
var _a, _b;
|
|
138
|
+
let displayText = value;
|
|
139
|
+
// for selected languages, we store the language code instead of the
|
|
140
|
+
// display name, so look up the name from the mapping
|
|
141
|
+
if (option === 'language') {
|
|
142
|
+
displayText =
|
|
143
|
+
(_b = (_a = this.languageCodeHandler) === null || _a === void 0 ? void 0 : _a.getLanguageNameFromCodeString(value)) !== null && _b !== void 0 ? _b : value;
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
displayText,
|
|
147
|
+
key: value,
|
|
148
|
+
count: data === null || data === void 0 ? void 0 : data.count,
|
|
149
|
+
state: data === null || data === void 0 ? void 0 : data.state,
|
|
150
|
+
};
|
|
151
|
+
});
|
|
152
|
+
return {
|
|
153
|
+
title,
|
|
154
|
+
key: option,
|
|
155
|
+
buckets,
|
|
156
|
+
};
|
|
157
|
+
});
|
|
158
|
+
return facetGroups;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Converts the raw `aggregations` to `FacetGroups`, which are easier to use
|
|
162
|
+
*/
|
|
163
|
+
get aggregationFacetGroups() {
|
|
164
|
+
var _a;
|
|
165
|
+
const facetGroups = [];
|
|
166
|
+
Object.entries((_a = this.aggregations) !== null && _a !== void 0 ? _a : []).forEach(([key, buckets]) => {
|
|
167
|
+
// the year_histogram data is in a different format so can't be handled here
|
|
168
|
+
if (key === 'year_histogram')
|
|
169
|
+
return;
|
|
170
|
+
const option = getFacetOptionFromKey(key);
|
|
171
|
+
this.facetGroupTitle = facetTitles[option];
|
|
172
|
+
let castedBuckets = buckets.buckets;
|
|
173
|
+
// we are not showing fav- items in facets
|
|
174
|
+
castedBuckets = castedBuckets === null || castedBuckets === void 0 ? void 0 : castedBuckets.filter(bucket => { var _a, _b; return ((_b = (_a = bucket === null || bucket === void 0 ? void 0 : bucket.key) === null || _a === void 0 ? void 0 : _a.toString()) === null || _b === void 0 ? void 0 : _b.startsWith('fav-')) === false; });
|
|
175
|
+
// sort facets in specific order
|
|
176
|
+
castedBuckets = this.sortedFacets(castedBuckets);
|
|
177
|
+
// find length and pagination size for modal pagination
|
|
178
|
+
const { length } = Object.keys(castedBuckets);
|
|
179
|
+
this.paginationSize = Math.ceil(length / this.facetsPerPage);
|
|
180
|
+
// asynchronously load the collection name
|
|
181
|
+
if (option === 'collection') {
|
|
182
|
+
this.preloadCollectionNames(castedBuckets);
|
|
183
|
+
}
|
|
184
|
+
// render only items which will be visible as per this.facetsPerPage
|
|
185
|
+
const bucketsMaxSix = castedBuckets === null || castedBuckets === void 0 ? void 0 : castedBuckets.slice((this.pageNumber - 1) * this.facetsPerPage, this.pageNumber * this.facetsPerPage);
|
|
186
|
+
const facetBucket = bucketsMaxSix.map(bucket => {
|
|
187
|
+
var _a, _b;
|
|
188
|
+
let bucketKey = bucket.key;
|
|
189
|
+
// for languages, we need to search by language code instead of the
|
|
190
|
+
// display name, which is what we get from the search engine result
|
|
191
|
+
if (option === 'language') {
|
|
192
|
+
bucketKey =
|
|
193
|
+
(_b = (_a = this.languageCodeHandler) === null || _a === void 0 ? void 0 : _a.getCodeStringFromLanguageName(`${bucket.key}`)) !== null && _b !== void 0 ? _b : bucket.key;
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
displayText: `${bucket.key}`,
|
|
197
|
+
key: `${bucketKey}`,
|
|
198
|
+
count: bucket.doc_count,
|
|
199
|
+
state: 'none',
|
|
200
|
+
};
|
|
201
|
+
});
|
|
202
|
+
const group = {
|
|
203
|
+
title: this.facetGroupTitle,
|
|
204
|
+
key: option,
|
|
205
|
+
buckets: facetBucket,
|
|
206
|
+
};
|
|
207
|
+
facetGroups.push(group);
|
|
208
|
+
});
|
|
209
|
+
return facetGroups;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* for collections, we need to asynchronously load the collection name
|
|
213
|
+
* so we use the `async-collection-name` widget and for the rest, we have a static value to use
|
|
214
|
+
*
|
|
215
|
+
* @param castedBuckets
|
|
216
|
+
*/
|
|
217
|
+
preloadCollectionNames(castedBuckets) {
|
|
218
|
+
var _a;
|
|
219
|
+
const collectionIds = castedBuckets === null || castedBuckets === void 0 ? void 0 : castedBuckets.map(option => option.key);
|
|
220
|
+
const collectionIdsArray = Array.from(new Set(collectionIds));
|
|
221
|
+
(_a = this.collectionNameCache) === null || _a === void 0 ? void 0 : _a.preloadIdentifiers(collectionIdsArray);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* sort the facets on modal
|
|
225
|
+
* - alpha sort perform in ascending order
|
|
226
|
+
* - count/frequency sort perform in descending order
|
|
227
|
+
*
|
|
228
|
+
* @param facetBucket as Bucket[]
|
|
229
|
+
*
|
|
230
|
+
* @return sortedFacetBucket as Bucket
|
|
231
|
+
*/
|
|
232
|
+
sortedFacets(facetBucket) {
|
|
233
|
+
let sortedFacetBucket = facetBucket;
|
|
234
|
+
if (this.sortedBy === 'alpha') {
|
|
235
|
+
// sort by alphabetic in ascending order. eg. a,b,c,...
|
|
236
|
+
sortedFacetBucket = facetBucket === null || facetBucket === void 0 ? void 0 : facetBucket.sort((a, b) => (a.key > b.key ? 1 : -1));
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
// sort by frequency/count in descending order. eg 100,99,98,...
|
|
240
|
+
sortedFacetBucket = facetBucket === null || facetBucket === void 0 ? void 0 : facetBucket.sort((a, b) => a.doc_count < b.doc_count ? 1 : -1);
|
|
241
|
+
}
|
|
242
|
+
return sortedFacetBucket;
|
|
243
|
+
}
|
|
244
|
+
get getMoreFacetsTemplate() {
|
|
245
|
+
var _a;
|
|
246
|
+
return html `
|
|
247
|
+
<facets-template
|
|
248
|
+
.facetGroup=${(_a = this.mergedFacets) === null || _a === void 0 ? void 0 : _a.shift()}
|
|
249
|
+
.selectedFacets=${this.selectedFacets}
|
|
250
|
+
.renderOn=${'modal'}
|
|
251
|
+
.collectionNameCache=${this.collectionNameCache}
|
|
252
|
+
@selectedFacetsChanged=${(e) => {
|
|
253
|
+
this.selectedFacets = e.detail;
|
|
254
|
+
}}
|
|
255
|
+
></facets-template>
|
|
256
|
+
`;
|
|
257
|
+
}
|
|
258
|
+
get loaderTemplate() {
|
|
259
|
+
return html `<div class="facets-loader">
|
|
260
|
+
<ia-activity-indicator .mode=${'processing'}></ia-activity-indicator>
|
|
261
|
+
</div> `;
|
|
262
|
+
}
|
|
263
|
+
// render pagination if more then 1 page
|
|
264
|
+
get facetsPaginationTemplate() {
|
|
265
|
+
return this.paginationSize > 1
|
|
266
|
+
? html `<more-facets-pagination
|
|
267
|
+
.size=${this.paginationSize}
|
|
268
|
+
.currentPage=${1}
|
|
269
|
+
@pageNumberClicked=${this.pageNumberClicked}
|
|
270
|
+
></more-facets-pagination>`
|
|
271
|
+
: nothing;
|
|
272
|
+
}
|
|
273
|
+
get footerTemplate() {
|
|
274
|
+
if (this.paginationSize > 0) {
|
|
275
|
+
return html `${this.facetsPaginationTemplate}
|
|
276
|
+
<div class="footer">
|
|
277
|
+
<button
|
|
278
|
+
class="btn btn-cancel"
|
|
279
|
+
type="button"
|
|
280
|
+
@click=${this.cancelClick}
|
|
281
|
+
>
|
|
282
|
+
Cancel
|
|
283
|
+
</button>
|
|
284
|
+
<button
|
|
285
|
+
class="btn btn-submit"
|
|
286
|
+
type="button"
|
|
287
|
+
@click=${this.applySearchFacetsClicked}
|
|
288
|
+
>
|
|
289
|
+
Apply filters
|
|
290
|
+
</button>
|
|
291
|
+
</div> `;
|
|
292
|
+
}
|
|
293
|
+
return nothing;
|
|
294
|
+
}
|
|
295
|
+
sortFacetAggregation() {
|
|
296
|
+
this.sortedBy = this.sortedBy === 'count' ? 'alpha' : 'count';
|
|
297
|
+
this.dispatchEvent(new CustomEvent('sortedFacets', { detail: this.sortedBy }));
|
|
298
|
+
}
|
|
299
|
+
get getModalHeaderTemplate() {
|
|
300
|
+
const title = this.sortedBy === 'alpha' ? 'Sort by count' : 'Sort by alphabetically';
|
|
301
|
+
const image = this.sortedBy === 'alpha'
|
|
302
|
+
? 'https://archive.org/images/filter-alpha.png'
|
|
303
|
+
: 'https://archive.org/images/filter-count.png';
|
|
304
|
+
return html `<span class="sr-only">More facets for:</span>
|
|
305
|
+
<span class="title">
|
|
306
|
+
${this.facetGroupTitle}
|
|
307
|
+
<input
|
|
308
|
+
class="sorting-icon"
|
|
309
|
+
type="image"
|
|
310
|
+
@click=${() => this.sortFacetAggregation()}
|
|
311
|
+
src="${image}"
|
|
312
|
+
title=${title}
|
|
313
|
+
alt="sort facets"
|
|
314
|
+
/>
|
|
315
|
+
</span> `;
|
|
316
|
+
}
|
|
317
|
+
render() {
|
|
318
|
+
return html `
|
|
319
|
+
${this.facetsLoading
|
|
320
|
+
? this.loaderTemplate
|
|
321
|
+
: html `
|
|
322
|
+
<div class="header-content">${this.getModalHeaderTemplate}</div>
|
|
323
|
+
<div class="scrollable-content">
|
|
324
|
+
<div class="facets-content">${this.getMoreFacetsTemplate}</div>
|
|
325
|
+
</div>
|
|
326
|
+
${this.footerTemplate}
|
|
327
|
+
`}
|
|
328
|
+
`;
|
|
329
|
+
}
|
|
330
|
+
applySearchFacetsClicked() {
|
|
331
|
+
var _a;
|
|
332
|
+
const event = new CustomEvent('facetsChanged', {
|
|
333
|
+
detail: this.selectedFacets,
|
|
334
|
+
bubbles: true,
|
|
335
|
+
composed: true,
|
|
336
|
+
});
|
|
337
|
+
this.dispatchEvent(event);
|
|
338
|
+
(_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.closeModal();
|
|
339
|
+
}
|
|
340
|
+
cancelClick() {
|
|
341
|
+
var _a;
|
|
342
|
+
(_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.closeModal();
|
|
343
|
+
}
|
|
344
|
+
static get styles() {
|
|
345
|
+
const modalSubmitButton = css `var(--primaryButtonBGColor, #194880)`;
|
|
346
|
+
return css `
|
|
347
|
+
.header-content .title {
|
|
348
|
+
display: block;
|
|
349
|
+
text-align: left;
|
|
350
|
+
font-size: 1.8rem;
|
|
351
|
+
padding: 0 10px;
|
|
352
|
+
font-weight: bold;
|
|
353
|
+
}
|
|
354
|
+
.scrollable-content {
|
|
355
|
+
overflow-y: auto;
|
|
356
|
+
max-height: 65vh;
|
|
357
|
+
}
|
|
358
|
+
.facets-content {
|
|
359
|
+
font-size: 1.2rem;
|
|
360
|
+
margin: 10px;
|
|
361
|
+
}
|
|
362
|
+
.page-number {
|
|
363
|
+
background: none;
|
|
364
|
+
border: 0;
|
|
365
|
+
cursor: pointer;
|
|
366
|
+
border-radius: 100%;
|
|
367
|
+
width: 25px;
|
|
368
|
+
height: 25px;
|
|
369
|
+
margin: 10px;
|
|
370
|
+
font-size: 1.4rem;
|
|
371
|
+
vertical-align: middle;
|
|
372
|
+
}
|
|
373
|
+
.current-page {
|
|
374
|
+
background: black;
|
|
375
|
+
color: white;
|
|
376
|
+
}
|
|
377
|
+
.facets-loader {
|
|
378
|
+
margin-bottom: 20px;
|
|
379
|
+
width: 70px;
|
|
380
|
+
display: block;
|
|
381
|
+
margin-left: auto;
|
|
382
|
+
margin-right: auto;
|
|
383
|
+
}
|
|
384
|
+
.btn {
|
|
385
|
+
border: none;
|
|
386
|
+
padding: 10px;
|
|
387
|
+
margin-bottom: 10px;
|
|
388
|
+
width: auto;
|
|
389
|
+
border-radius: 4px;
|
|
390
|
+
cursor: pointer;
|
|
391
|
+
}
|
|
392
|
+
.btn-cancel {
|
|
393
|
+
background-color: #000;
|
|
394
|
+
color: white;
|
|
395
|
+
}
|
|
396
|
+
.btn-submit {
|
|
397
|
+
background-color: ${modalSubmitButton};
|
|
398
|
+
color: white;
|
|
399
|
+
}
|
|
400
|
+
.footer {
|
|
401
|
+
text-align: center;
|
|
402
|
+
margin-top: 10px;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
.sr-only {
|
|
406
|
+
position: absolute;
|
|
407
|
+
width: 1px;
|
|
408
|
+
height: 1px;
|
|
409
|
+
padding: 0;
|
|
410
|
+
margin: -1px;
|
|
411
|
+
overflow: hidden;
|
|
412
|
+
clip: rect(0, 0, 0, 0);
|
|
413
|
+
border: 0;
|
|
414
|
+
}
|
|
415
|
+
.sorting-icon {
|
|
416
|
+
height: 15px;
|
|
417
|
+
vertical-align: baseline;
|
|
418
|
+
cursor: pointer;
|
|
419
|
+
}
|
|
420
|
+
`;
|
|
421
|
+
}
|
|
422
|
+
};
|
|
423
|
+
__decorate([
|
|
424
|
+
property({ type: String })
|
|
425
|
+
], MoreFacetsContent.prototype, "facetKey", void 0);
|
|
426
|
+
__decorate([
|
|
427
|
+
property({ type: String })
|
|
428
|
+
], MoreFacetsContent.prototype, "facetAggregationKey", void 0);
|
|
429
|
+
__decorate([
|
|
430
|
+
property({ type: String })
|
|
431
|
+
], MoreFacetsContent.prototype, "fullQuery", void 0);
|
|
432
|
+
__decorate([
|
|
433
|
+
property({ type: Object })
|
|
434
|
+
], MoreFacetsContent.prototype, "modalManager", void 0);
|
|
435
|
+
__decorate([
|
|
436
|
+
property({ type: Object })
|
|
437
|
+
], MoreFacetsContent.prototype, "searchService", void 0);
|
|
438
|
+
__decorate([
|
|
439
|
+
property({ type: Object })
|
|
440
|
+
], MoreFacetsContent.prototype, "collectionNameCache", void 0);
|
|
441
|
+
__decorate([
|
|
442
|
+
property({ type: Object })
|
|
443
|
+
], MoreFacetsContent.prototype, "languageCodeHandler", void 0);
|
|
444
|
+
__decorate([
|
|
445
|
+
property({ type: Object })
|
|
446
|
+
], MoreFacetsContent.prototype, "selectedFacets", void 0);
|
|
447
|
+
__decorate([
|
|
448
|
+
property({ type: String })
|
|
449
|
+
], MoreFacetsContent.prototype, "sortedBy", void 0);
|
|
450
|
+
__decorate([
|
|
451
|
+
state()
|
|
452
|
+
], MoreFacetsContent.prototype, "aggregations", void 0);
|
|
453
|
+
__decorate([
|
|
454
|
+
state()
|
|
455
|
+
], MoreFacetsContent.prototype, "facetGroup", void 0);
|
|
456
|
+
__decorate([
|
|
457
|
+
state()
|
|
458
|
+
], MoreFacetsContent.prototype, "facetGroupTitle", void 0);
|
|
459
|
+
__decorate([
|
|
460
|
+
state()
|
|
461
|
+
], MoreFacetsContent.prototype, "pageNumber", void 0);
|
|
462
|
+
__decorate([
|
|
463
|
+
state()
|
|
464
|
+
], MoreFacetsContent.prototype, "facetsLoading", void 0);
|
|
465
|
+
__decorate([
|
|
466
|
+
state()
|
|
467
|
+
], MoreFacetsContent.prototype, "paginationSize", void 0);
|
|
468
|
+
__decorate([
|
|
469
|
+
state()
|
|
470
|
+
], MoreFacetsContent.prototype, "facetsType", void 0);
|
|
471
|
+
MoreFacetsContent = __decorate([
|
|
472
|
+
customElement('more-facets-content')
|
|
473
|
+
], MoreFacetsContent);
|
|
474
|
+
export { MoreFacetsContent };
|
|
475
|
+
//# sourceMappingURL=more-facets-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"more-facets-content.js","sourceRoot":"","sources":["../../../src/collection-facets/more-facets-content.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable dot-notation */\n/* eslint-disable lit-a11y/click-events-have-key-events */\nimport {\n css,\n CSSResultGroup,\n html,\n LitElement,\n nothing,\n PropertyValues,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport type {\n Aggregation,\n Bucket,\n SearchServiceInterface,\n SearchParams,\n} from '@internetarchive/search-service';\nimport type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\nimport type { ModalManagerInterface } from '@internetarchive/modal-manager';\nimport {\n SelectedFacets,\n FacetGroup,\n FacetBucket,\n FacetOption,\n facetTitles,\n} from '../models';\nimport type { LanguageCodeHandlerInterface } from '../language-code-handler/language-code-handler';\nimport { getFacetOptionFromKey } from './facets-util';\nimport '@internetarchive/ia-activity-indicator/ia-activity-indicator';\nimport './more-facets-pagination';\nimport './facets-template';\n\n@customElement('more-facets-content')\nexport class MoreFacetsContent extends LitElement {\n @property({ type: String }) facetKey?: string;\n\n @property({ type: String }) facetAggregationKey?: string;\n\n @property({ type: String }) fullQuery?: string;\n\n @property({ type: Object }) modalManager?: ModalManagerInterface;\n\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: Object })\n collectionNameCache?: CollectionNameCacheInterface;\n\n @property({ type: Object })\n languageCodeHandler?: LanguageCodeHandlerInterface;\n\n @property({ type: Object }) selectedFacets?: SelectedFacets;\n\n @property({ type: String }) sortedBy = 'count'; // count | alpha\n\n @state() aggregations?: Record<string, Aggregation>;\n\n @state() facetGroup?: FacetGroup[] = [];\n\n @state() facetGroupTitle?: String = '';\n\n @state() pageNumber = 1;\n\n /**\n * Facets are loading on popup\n */\n @state() facetsLoading = true;\n\n @state() paginationSize = 0;\n\n @state() facetsType = 'modal';\n\n private facetsPerPage = 60; // TODO: Q. how many items we want to have on popup view\n\n updated(changed: PropertyValues) {\n if (changed.has('facetKey')) {\n this.facetsLoading = true;\n this.pageNumber = 1;\n\n this.updateSpecificFacets();\n }\n\n if (changed.has('pageNumber')) {\n this.facetGroup = this.aggregationFacetGroups;\n }\n }\n\n firstUpdated() {\n this.setupEscapeListeners();\n }\n\n /**\n * Close more facets modal on Escape click\n */\n private setupEscapeListeners() {\n if (this.modalManager) {\n document.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.modalManager?.closeModal();\n }\n });\n } else {\n document.removeEventListener('keydown', () => {});\n }\n }\n\n /**\n * Get specific facets data from search-service API based of currently query params\n * - this.aggregations - hold result of search service and being used for further processing.\n */\n async updateSpecificFacets(): Promise<void> {\n const aggregations = {\n advancedParams: [\n {\n field: this.facetAggregationKey as string,\n size: 65535, // todo - do we want to have all the records at once?\n },\n ],\n };\n\n const params: SearchParams = {\n query: this.fullQuery as string,\n fields: ['identifier'],\n aggregations,\n rows: 1, // todo - do we want server-side pagination with offset/page/limit flag?\n };\n\n const results = await this.searchService?.search(params);\n this.aggregations = results?.success?.response.aggregations as any;\n\n this.facetGroup = this.aggregationFacetGroups;\n this.facetsLoading = false;\n }\n\n private pageNumberClicked(e: CustomEvent<{ page: number }>) {\n const page = e?.detail?.page;\n if (page) {\n this.pageNumber = Number(page);\n }\n }\n\n /**\n * Combines the selected facets with the aggregations to create a single list of facets\n */\n private get mergedFacets(): FacetGroup[] | void {\n const facetGroups: FacetGroup[] = [];\n\n const selectedFacetGroup = this.selectedFacetGroups.find(\n group => group.key === this.facetKey\n );\n const aggregateFacetGroup = this.aggregationFacetGroups.find(\n group => group.key === this.facetKey\n );\n\n // if the user selected a facet, but it's not in the aggregation, we add it as-is\n if (selectedFacetGroup && !aggregateFacetGroup) {\n facetGroups.push(selectedFacetGroup);\n return facetGroups;\n }\n\n // if we don't have an aggregate facet group, don't add this to the list\n if (!aggregateFacetGroup) return facetGroups;\n\n // start with either the selected group if we have one, or the aggregate group\n const facetGroup = selectedFacetGroup ?? aggregateFacetGroup;\n\n // attach the counts to the selected buckets\n const bucketsWithCount =\n selectedFacetGroup?.buckets.map(bucket => {\n const selectedBucket = aggregateFacetGroup.buckets.find(\n b => b.key === bucket.key\n );\n return selectedBucket\n ? {\n ...bucket,\n count: selectedBucket.count,\n }\n : bucket;\n }) ?? [];\n\n // append any additional buckets that were not selected\n aggregateFacetGroup.buckets.forEach(bucket => {\n const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);\n if (existingBucket) return;\n bucketsWithCount.push(bucket);\n });\n facetGroup.buckets = bucketsWithCount;\n\n facetGroups.push(facetGroup);\n return facetGroups;\n }\n\n /**\n * Converts the selected facets to a `FacetGroup` array,\n * which is easier to work with\n */\n private get selectedFacetGroups(): FacetGroup[] {\n if (!this.selectedFacets) return [];\n\n const facetGroups: FacetGroup[] = Object.entries(this.selectedFacets).map(\n ([key, selectedFacets]) => {\n const option = key as FacetOption;\n const title = facetTitles[option];\n\n const buckets: FacetBucket[] = Object.entries(selectedFacets).map(\n ([value, data]) => {\n let displayText = value;\n // for selected languages, we store the language code instead of the\n // display name, so look up the name from the mapping\n if (option === 'language') {\n displayText =\n this.languageCodeHandler?.getLanguageNameFromCodeString(\n value\n ) ?? value;\n }\n return {\n displayText,\n key: value,\n count: data?.count,\n state: data?.state,\n };\n }\n );\n\n return {\n title,\n key: option,\n buckets,\n };\n }\n );\n\n return facetGroups;\n }\n\n /**\n * Converts the raw `aggregations` to `FacetGroups`, which are easier to use\n */\n private get aggregationFacetGroups(): FacetGroup[] {\n const facetGroups: FacetGroup[] = [];\n Object.entries(this.aggregations ?? []).forEach(([key, buckets]) => {\n // the year_histogram data is in a different format so can't be handled here\n if (key === 'year_histogram') return;\n\n const option = getFacetOptionFromKey(key);\n this.facetGroupTitle = facetTitles[option];\n let castedBuckets = buckets.buckets as Bucket[];\n\n // we are not showing fav- items in facets\n castedBuckets = castedBuckets?.filter(\n bucket => bucket?.key?.toString()?.startsWith('fav-') === false\n );\n\n // sort facets in specific order\n castedBuckets = this.sortedFacets(castedBuckets) as Bucket[];\n\n // find length and pagination size for modal pagination\n const { length } = Object.keys(castedBuckets as []);\n this.paginationSize = Math.ceil(length / this.facetsPerPage);\n\n // asynchronously load the collection name\n if (option === 'collection') {\n this.preloadCollectionNames(castedBuckets);\n }\n\n // render only items which will be visible as per this.facetsPerPage\n const bucketsMaxSix = castedBuckets?.slice(\n (this.pageNumber - 1) * this.facetsPerPage,\n this.pageNumber * this.facetsPerPage\n );\n\n const facetBucket: FacetBucket[] = bucketsMaxSix.map(bucket => {\n let bucketKey = bucket.key;\n // for languages, we need to search by language code instead of the\n // display name, which is what we get from the search engine result\n if (option === 'language') {\n bucketKey =\n this.languageCodeHandler?.getCodeStringFromLanguageName(\n `${bucket.key}`\n ) ?? bucket.key;\n }\n return {\n displayText: `${bucket.key}`,\n key: `${bucketKey}`,\n count: bucket.doc_count,\n state: 'none',\n };\n });\n const group: FacetGroup = {\n title: this.facetGroupTitle as string,\n key: option,\n buckets: facetBucket,\n };\n facetGroups.push(group);\n });\n\n return facetGroups;\n }\n\n /**\n * for collections, we need to asynchronously load the collection name\n * so we use the `async-collection-name` widget and for the rest, we have a static value to use\n *\n * @param castedBuckets\n */\n private preloadCollectionNames(castedBuckets: any[]) {\n const collectionIds = castedBuckets?.map(option => option.key);\n const collectionIdsArray = Array.from(new Set(collectionIds)) as string[];\n\n this.collectionNameCache?.preloadIdentifiers(collectionIdsArray);\n }\n\n /**\n * sort the facets on modal\n * - alpha sort perform in ascending order\n * - count/frequency sort perform in descending order\n *\n * @param facetBucket as Bucket[]\n *\n * @return sortedFacetBucket as Bucket\n */\n private sortedFacets(facetBucket: Bucket[]) {\n let sortedFacetBucket = facetBucket;\n if (this.sortedBy === 'alpha') {\n // sort by alphabetic in ascending order. eg. a,b,c,...\n sortedFacetBucket = facetBucket?.sort((a, b) => (a.key > b.key ? 1 : -1));\n } else {\n // sort by frequency/count in descending order. eg 100,99,98,...\n sortedFacetBucket = facetBucket?.sort((a, b) =>\n a.doc_count < b.doc_count ? 1 : -1\n );\n }\n\n return sortedFacetBucket;\n }\n\n private get getMoreFacetsTemplate(): TemplateResult {\n return html`\n <facets-template\n .facetGroup=${this.mergedFacets?.shift()}\n .selectedFacets=${this.selectedFacets}\n .renderOn=${'modal'}\n .collectionNameCache=${this.collectionNameCache}\n @selectedFacetsChanged=${(e: CustomEvent) => {\n this.selectedFacets = e.detail;\n }}\n ></facets-template>\n `;\n }\n\n private get loaderTemplate(): TemplateResult {\n return html`<div class=\"facets-loader\">\n <ia-activity-indicator .mode=${'processing'}></ia-activity-indicator>\n </div> `;\n }\n\n // render pagination if more then 1 page\n private get facetsPaginationTemplate() {\n return this.paginationSize > 1\n ? html`<more-facets-pagination\n .size=${this.paginationSize}\n .currentPage=${1}\n @pageNumberClicked=${this.pageNumberClicked}\n ></more-facets-pagination>`\n : nothing;\n }\n\n private get footerTemplate() {\n if (this.paginationSize > 0) {\n return html`${this.facetsPaginationTemplate}\n <div class=\"footer\">\n <button\n class=\"btn btn-cancel\"\n type=\"button\"\n @click=${this.cancelClick}\n >\n Cancel\n </button>\n <button\n class=\"btn btn-submit\"\n type=\"button\"\n @click=${this.applySearchFacetsClicked}\n >\n Apply filters\n </button>\n </div> `;\n }\n\n return nothing;\n }\n\n private sortFacetAggregation() {\n this.sortedBy = this.sortedBy === 'count' ? 'alpha' : 'count';\n this.dispatchEvent(\n new CustomEvent('sortedFacets', { detail: this.sortedBy })\n );\n }\n\n private get getModalHeaderTemplate(): TemplateResult {\n const title =\n this.sortedBy === 'alpha' ? 'Sort by count' : 'Sort by alphabetically';\n\n const image =\n this.sortedBy === 'alpha'\n ? 'https://archive.org/images/filter-alpha.png'\n : 'https://archive.org/images/filter-count.png';\n\n return html`<span class=\"sr-only\">More facets for:</span>\n <span class=\"title\">\n ${this.facetGroupTitle}\n <input\n class=\"sorting-icon\"\n type=\"image\"\n @click=${() => this.sortFacetAggregation()}\n src=\"${image}\"\n title=${title}\n alt=\"sort facets\"\n />\n </span> `;\n }\n\n render() {\n return html`\n ${this.facetsLoading\n ? this.loaderTemplate\n : html`\n <div class=\"header-content\">${this.getModalHeaderTemplate}</div>\n <div class=\"scrollable-content\">\n <div class=\"facets-content\">${this.getMoreFacetsTemplate}</div>\n </div>\n ${this.footerTemplate}\n `}\n `;\n }\n\n private applySearchFacetsClicked() {\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: this.selectedFacets,\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n this.modalManager?.closeModal();\n }\n\n private cancelClick() {\n this.modalManager?.closeModal();\n }\n\n static get styles(): CSSResultGroup {\n const modalSubmitButton = css`var(--primaryButtonBGColor, #194880)`;\n\n return css`\n .header-content .title {\n display: block;\n text-align: left;\n font-size: 1.8rem;\n padding: 0 10px;\n font-weight: bold;\n }\n .scrollable-content {\n overflow-y: auto;\n max-height: 65vh;\n }\n .facets-content {\n font-size: 1.2rem;\n margin: 10px;\n }\n .page-number {\n background: none;\n border: 0;\n cursor: pointer;\n border-radius: 100%;\n width: 25px;\n height: 25px;\n margin: 10px;\n font-size: 1.4rem;\n vertical-align: middle;\n }\n .current-page {\n background: black;\n color: white;\n }\n .facets-loader {\n margin-bottom: 20px;\n width: 70px;\n display: block;\n margin-left: auto;\n margin-right: auto;\n }\n .btn {\n border: none;\n padding: 10px;\n margin-bottom: 10px;\n width: auto;\n border-radius: 4px;\n cursor: pointer;\n }\n .btn-cancel {\n background-color: #000;\n color: white;\n }\n .btn-submit {\n background-color: ${modalSubmitButton};\n color: white;\n }\n .footer {\n text-align: center;\n margin-top: 10px;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n }\n .sorting-icon {\n height: 15px;\n vertical-align: baseline;\n cursor: pointer;\n }\n `;\n }\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { CSSResultGroup, LitElement, TemplateResult } from 'lit';
|
|
2
|
+
export declare class MoreFacetsPagination extends LitElement {
|
|
3
|
+
/**
|
|
4
|
+
* Total number of pages
|
|
5
|
+
*/
|
|
6
|
+
size: number;
|
|
7
|
+
/**
|
|
8
|
+
* Number of pages can be moved in back/forward
|
|
9
|
+
*/
|
|
10
|
+
step: number;
|
|
11
|
+
currentPage: number;
|
|
12
|
+
pages?: number[];
|
|
13
|
+
firstUpdated(): void;
|
|
14
|
+
updated(changed: Map<string, any>): void;
|
|
15
|
+
/** creates `this.pages` array that notes which pages to draw
|
|
16
|
+
* - `0` is elipses marker
|
|
17
|
+
* - rule: selected page is centered between -2/+2 pages
|
|
18
|
+
* - outlier: first page selected, show _1_ 2 3 ... N
|
|
19
|
+
* - outlier: second page selected, show 1 _2_ 3 4 ... N
|
|
20
|
+
* - outlier: last page selected, show 1 ... N-2 N-1 _N_
|
|
21
|
+
* - outlier: if page count = 7, & selected is either [2, 3, 4, 5, 6], show all pages
|
|
22
|
+
*/
|
|
23
|
+
observePageCount(): void;
|
|
24
|
+
private createFirstNode;
|
|
25
|
+
private createMiddelNode;
|
|
26
|
+
private createLastNode;
|
|
27
|
+
private get getEllipsisTemplate();
|
|
28
|
+
emitPageClick(): void;
|
|
29
|
+
private onRewind;
|
|
30
|
+
private onForward;
|
|
31
|
+
private onChange;
|
|
32
|
+
private getPageTemplate;
|
|
33
|
+
private get getPagesTemplate();
|
|
34
|
+
render(): TemplateResult<1>;
|
|
35
|
+
static get styles(): CSSResultGroup;
|
|
36
|
+
}
|