@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,267 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { css, html, LitElement, nothing, } from 'lit';
|
|
3
|
+
import { customElement, property, state } from 'lit/decorators.js';
|
|
4
|
+
import arrowLeftIcon from '../assets/img/icons/arrow-left';
|
|
5
|
+
import arrowRightIcon from '../assets/img/icons/arrow-right';
|
|
6
|
+
let MoreFacetsPagination = class MoreFacetsPagination extends LitElement {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(...arguments);
|
|
9
|
+
/**
|
|
10
|
+
* Number of pages can be moved in back/forward
|
|
11
|
+
*/
|
|
12
|
+
this.step = 2;
|
|
13
|
+
this.currentPage = 1;
|
|
14
|
+
this.pages = [];
|
|
15
|
+
}
|
|
16
|
+
firstUpdated() {
|
|
17
|
+
this.observePageCount();
|
|
18
|
+
}
|
|
19
|
+
updated(changed) {
|
|
20
|
+
if (changed.has('size')) {
|
|
21
|
+
this.observePageCount();
|
|
22
|
+
}
|
|
23
|
+
if (changed.has('currentPage')) {
|
|
24
|
+
this.observePageCount();
|
|
25
|
+
this.emitPageClick();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** creates `this.pages` array that notes which pages to draw
|
|
29
|
+
* - `0` is elipses marker
|
|
30
|
+
* - rule: selected page is centered between -2/+2 pages
|
|
31
|
+
* - outlier: first page selected, show _1_ 2 3 ... N
|
|
32
|
+
* - outlier: second page selected, show 1 _2_ 3 4 ... N
|
|
33
|
+
* - outlier: last page selected, show 1 ... N-2 N-1 _N_
|
|
34
|
+
* - outlier: if page count = 7, & selected is either [2, 3, 4, 5, 6], show all pages
|
|
35
|
+
*/
|
|
36
|
+
observePageCount() {
|
|
37
|
+
this.pages = []; /* `0` is elipses marker */
|
|
38
|
+
const paginatorMaxPagesToShow = 7;
|
|
39
|
+
const atMinThreshold = this.size <= paginatorMaxPagesToShow;
|
|
40
|
+
/** Display outliers */
|
|
41
|
+
if (this.size <= 5) {
|
|
42
|
+
// display all pages
|
|
43
|
+
this.pages = [...Array(this.size).keys()].map(i => i + 1);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (this.size === paginatorMaxPagesToShow) {
|
|
47
|
+
// edge: 7 pages
|
|
48
|
+
if (this.currentPage === 2) {
|
|
49
|
+
this.pages = [1, 2, 3, 4, 0, this.size];
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (this.currentPage === this.size - 1) {
|
|
53
|
+
this.pages = [1, 0, 4, 5, this.size - 1, this.size];
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (this.currentPage === 1) {
|
|
58
|
+
// first page
|
|
59
|
+
this.pages = [1, 2, 3, 0, this.size];
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (this.currentPage === this.size) {
|
|
63
|
+
// last page
|
|
64
|
+
this.pages = [1, 0, this.size - 2, this.size - 1, this.size];
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (this.currentPage === this.size - 1) {
|
|
68
|
+
// second last page
|
|
69
|
+
this.pages = [
|
|
70
|
+
1,
|
|
71
|
+
0,
|
|
72
|
+
this.size - 3,
|
|
73
|
+
this.size - 2,
|
|
74
|
+
this.size - 1,
|
|
75
|
+
this.size,
|
|
76
|
+
];
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (atMinThreshold &&
|
|
80
|
+
this.currentPage > 1 &&
|
|
81
|
+
this.currentPage < paginatorMaxPagesToShow) {
|
|
82
|
+
this.pages = [...Array(this.size).keys()].map(i => i + 1);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
/* The rest here calculates the range to display in "page window" */
|
|
86
|
+
let startPage = this.currentPage - this.step;
|
|
87
|
+
let endPage = this.currentPage + this.step;
|
|
88
|
+
if (startPage <= 0) {
|
|
89
|
+
endPage += -startPage + 1;
|
|
90
|
+
startPage = 1;
|
|
91
|
+
}
|
|
92
|
+
if (endPage >= this.size) {
|
|
93
|
+
startPage = Math.max(startPage - (endPage - this.size), 1);
|
|
94
|
+
endPage = this.size;
|
|
95
|
+
}
|
|
96
|
+
if (startPage === 2) {
|
|
97
|
+
endPage -= 1;
|
|
98
|
+
}
|
|
99
|
+
if (endPage === this.size - 1) {
|
|
100
|
+
startPage += 1;
|
|
101
|
+
}
|
|
102
|
+
// create first page node
|
|
103
|
+
this.createFirstNode(startPage);
|
|
104
|
+
// create middle pages node
|
|
105
|
+
this.createMiddelNode(startPage, endPage);
|
|
106
|
+
// create last page node
|
|
107
|
+
this.createLastNode(endPage);
|
|
108
|
+
}
|
|
109
|
+
createFirstNode(startPage) {
|
|
110
|
+
var _a, _b;
|
|
111
|
+
if (startPage > 1) {
|
|
112
|
+
(_a = this.pages) === null || _a === void 0 ? void 0 : _a.push(1);
|
|
113
|
+
}
|
|
114
|
+
if (startPage > 2) {
|
|
115
|
+
(_b = this.pages) === null || _b === void 0 ? void 0 : _b.push(0); // let's asssume 0 is for ellipsis template
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
createMiddelNode(startPage, endPage) {
|
|
119
|
+
var _a;
|
|
120
|
+
for (let page = startPage; page <= endPage; page += 1) {
|
|
121
|
+
(_a = this.pages) === null || _a === void 0 ? void 0 : _a.push(page);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
createLastNode(endPage) {
|
|
125
|
+
var _a, _b;
|
|
126
|
+
if (endPage < this.size - 1) {
|
|
127
|
+
(_a = this.pages) === null || _a === void 0 ? void 0 : _a.push(0); // let's asssume 0 is for ellipsis template
|
|
128
|
+
}
|
|
129
|
+
if (endPage < this.size) {
|
|
130
|
+
(_b = this.pages) === null || _b === void 0 ? void 0 : _b.push(this.size);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
get getEllipsisTemplate() {
|
|
134
|
+
return html `<i class="ellipses">...</i>`;
|
|
135
|
+
}
|
|
136
|
+
emitPageClick() {
|
|
137
|
+
this.dispatchEvent(new CustomEvent('pageNumberClicked', {
|
|
138
|
+
detail: { page: this.currentPage },
|
|
139
|
+
bubbles: true,
|
|
140
|
+
composed: true,
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
143
|
+
onRewind() {
|
|
144
|
+
this.currentPage -= 1;
|
|
145
|
+
if (this.currentPage < 1) {
|
|
146
|
+
this.currentPage = 1;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
onForward() {
|
|
150
|
+
this.currentPage += 1;
|
|
151
|
+
if (this.currentPage > this.size) {
|
|
152
|
+
this.currentPage = this.size;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
onChange(page) {
|
|
156
|
+
this.currentPage = page;
|
|
157
|
+
}
|
|
158
|
+
getPageTemplate(page) {
|
|
159
|
+
return html `
|
|
160
|
+
<button
|
|
161
|
+
@click=${() => this.onChange(page)}
|
|
162
|
+
class=${this.currentPage === page ? 'current' : ''}
|
|
163
|
+
data-page=${page}
|
|
164
|
+
>
|
|
165
|
+
${page}
|
|
166
|
+
</button>
|
|
167
|
+
`;
|
|
168
|
+
}
|
|
169
|
+
get getPagesTemplate() {
|
|
170
|
+
var _a;
|
|
171
|
+
if (!this.pages || !this.pages.length) {
|
|
172
|
+
return nothing;
|
|
173
|
+
}
|
|
174
|
+
return html `
|
|
175
|
+
${(_a = this.pages) === null || _a === void 0 ? void 0 : _a.map(page => html `${page !== 0
|
|
176
|
+
? this.getPageTemplate(page)
|
|
177
|
+
: this.getEllipsisTemplate}`)}
|
|
178
|
+
`;
|
|
179
|
+
}
|
|
180
|
+
render() {
|
|
181
|
+
return html `
|
|
182
|
+
<div class="facets-pagination">
|
|
183
|
+
<button class="arrow-icon rewind" @click=${this.onRewind}>
|
|
184
|
+
<span class="sr-only">Rewind pagination:</span>
|
|
185
|
+
${arrowLeftIcon}
|
|
186
|
+
</button>
|
|
187
|
+
<div class="page-numbers">${this.getPagesTemplate}</div>
|
|
188
|
+
<button class="arrow-icon forward" @click=${this.onForward}>
|
|
189
|
+
<span class="sr-only">Forward pagination:</span>
|
|
190
|
+
${arrowRightIcon}
|
|
191
|
+
</button>
|
|
192
|
+
</div>
|
|
193
|
+
`;
|
|
194
|
+
}
|
|
195
|
+
static get styles() {
|
|
196
|
+
return css `
|
|
197
|
+
.facets-pagination {
|
|
198
|
+
user-select: none;
|
|
199
|
+
margin-top: 10px;
|
|
200
|
+
background-color: #eee;
|
|
201
|
+
text-align: center;
|
|
202
|
+
}
|
|
203
|
+
.facets-pagination button {
|
|
204
|
+
border: none;
|
|
205
|
+
background: none;
|
|
206
|
+
}
|
|
207
|
+
.facets-pagination .arrow-icon {
|
|
208
|
+
width: 2.5rem;
|
|
209
|
+
vertical-align: middle;
|
|
210
|
+
}
|
|
211
|
+
.facets-pagination .arrow-icon svg {
|
|
212
|
+
height: 14px;
|
|
213
|
+
}
|
|
214
|
+
.facets-pagination button,
|
|
215
|
+
.facets-pagination i {
|
|
216
|
+
background: none;
|
|
217
|
+
border: 0;
|
|
218
|
+
cursor: pointer;
|
|
219
|
+
border-radius: 100%;
|
|
220
|
+
margin: 10px 5px;
|
|
221
|
+
padding: 5px;
|
|
222
|
+
font-size: 1.4rem;
|
|
223
|
+
vertical-align: middle;
|
|
224
|
+
display: inline-block;
|
|
225
|
+
min-width: 2.5rem;
|
|
226
|
+
}
|
|
227
|
+
.facets-pagination i {
|
|
228
|
+
cursor: auto;
|
|
229
|
+
display: inline;
|
|
230
|
+
}
|
|
231
|
+
.facets-pagination button.current {
|
|
232
|
+
background: black;
|
|
233
|
+
color: white;
|
|
234
|
+
}
|
|
235
|
+
.page-numbers {
|
|
236
|
+
display: inline-block;
|
|
237
|
+
}
|
|
238
|
+
.sr-only {
|
|
239
|
+
position: absolute;
|
|
240
|
+
width: 1px;
|
|
241
|
+
height: 1px;
|
|
242
|
+
padding: 0;
|
|
243
|
+
margin: -1px;
|
|
244
|
+
overflow: hidden;
|
|
245
|
+
clip: rect(0, 0, 0, 0);
|
|
246
|
+
border: 0;
|
|
247
|
+
}
|
|
248
|
+
`;
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
__decorate([
|
|
252
|
+
property({ type: Number })
|
|
253
|
+
], MoreFacetsPagination.prototype, "size", void 0);
|
|
254
|
+
__decorate([
|
|
255
|
+
property({ type: Number })
|
|
256
|
+
], MoreFacetsPagination.prototype, "step", void 0);
|
|
257
|
+
__decorate([
|
|
258
|
+
property({ type: Number })
|
|
259
|
+
], MoreFacetsPagination.prototype, "currentPage", void 0);
|
|
260
|
+
__decorate([
|
|
261
|
+
state()
|
|
262
|
+
], MoreFacetsPagination.prototype, "pages", void 0);
|
|
263
|
+
MoreFacetsPagination = __decorate([
|
|
264
|
+
customElement('more-facets-pagination')
|
|
265
|
+
], MoreFacetsPagination);
|
|
266
|
+
export { MoreFacetsPagination };
|
|
267
|
+
//# sourceMappingURL=more-facets-pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"more-facets-pagination.js","sourceRoot":"","sources":["../../../src/collection-facets/more-facets-pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n CSSResultGroup,\n html,\n LitElement,\n nothing,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport arrowLeftIcon from '../assets/img/icons/arrow-left';\nimport arrowRightIcon from '../assets/img/icons/arrow-right';\n\n@customElement('more-facets-pagination')\nexport class MoreFacetsPagination extends LitElement {\n /**\n * Total number of pages\n */\n @property({ type: Number }) size!: number;\n\n /**\n * Number of pages can be moved in back/forward\n */\n @property({ type: Number }) step = 2;\n\n @property({ type: Number }) currentPage: number = 1;\n\n @state() pages?: number[] = [];\n\n firstUpdated() {\n this.observePageCount();\n }\n\n override updated(changed: Map<string, any>) {\n if (changed.has('size')) {\n this.observePageCount();\n }\n if (changed.has('currentPage')) {\n this.observePageCount();\n this.emitPageClick();\n }\n }\n\n /** creates `this.pages` array that notes which pages to draw\n * - `0` is elipses marker\n * - rule: selected page is centered between -2/+2 pages\n * - outlier: first page selected, show _1_ 2 3 ... N\n * - outlier: second page selected, show 1 _2_ 3 4 ... N\n * - outlier: last page selected, show 1 ... N-2 N-1 _N_\n * - outlier: if page count = 7, & selected is either [2, 3, 4, 5, 6], show all pages\n */\n observePageCount() {\n this.pages = []; /* `0` is elipses marker */\n\n const paginatorMaxPagesToShow = 7;\n const atMinThreshold = this.size <= paginatorMaxPagesToShow;\n\n /** Display outliers */\n if (this.size <= 5) {\n // display all pages\n this.pages = [...Array(this.size).keys()].map(i => i + 1);\n return;\n }\n\n if (this.size === paginatorMaxPagesToShow) {\n // edge: 7 pages\n if (this.currentPage === 2) {\n this.pages = [1, 2, 3, 4, 0, this.size];\n return;\n }\n\n if (this.currentPage === this.size - 1) {\n this.pages = [1, 0, 4, 5, this.size - 1, this.size];\n return;\n }\n }\n\n if (this.currentPage === 1) {\n // first page\n this.pages = [1, 2, 3, 0, this.size];\n return;\n }\n\n if (this.currentPage === this.size) {\n // last page\n this.pages = [1, 0, this.size - 2, this.size - 1, this.size];\n return;\n }\n\n if (this.currentPage === this.size - 1) {\n // second last page\n this.pages = [\n 1,\n 0,\n this.size - 3,\n this.size - 2,\n this.size - 1,\n this.size,\n ];\n return;\n }\n\n if (\n atMinThreshold &&\n this.currentPage > 1 &&\n this.currentPage < paginatorMaxPagesToShow\n ) {\n this.pages = [...Array(this.size).keys()].map(i => i + 1);\n return;\n }\n\n /* The rest here calculates the range to display in \"page window\" */\n let startPage = this.currentPage - this.step;\n let endPage = this.currentPage + this.step;\n\n if (startPage <= 0) {\n endPage += -startPage + 1;\n startPage = 1;\n }\n\n if (endPage >= this.size) {\n startPage = Math.max(startPage - (endPage - this.size), 1);\n endPage = this.size;\n }\n\n if (startPage === 2) {\n endPage -= 1;\n }\n\n if (endPage === this.size - 1) {\n startPage += 1;\n }\n\n // create first page node\n this.createFirstNode(startPage);\n\n // create middle pages node\n this.createMiddelNode(startPage, endPage);\n\n // create last page node\n this.createLastNode(endPage);\n }\n\n private createFirstNode(startPage: number) {\n if (startPage > 1) {\n this.pages?.push(1);\n }\n if (startPage > 2) {\n this.pages?.push(0); // let's asssume 0 is for ellipsis template\n }\n }\n\n private createMiddelNode(startPage: number, endPage: number) {\n for (let page = startPage; page <= endPage; page += 1) {\n this.pages?.push(page);\n }\n }\n\n private createLastNode(endPage: number) {\n if (endPage < this.size - 1) {\n this.pages?.push(0); // let's asssume 0 is for ellipsis template\n }\n if (endPage < this.size) {\n this.pages?.push(this.size);\n }\n }\n\n private get getEllipsisTemplate() {\n return html`<i class=\"ellipses\">...</i>`;\n }\n\n emitPageClick() {\n this.dispatchEvent(\n new CustomEvent('pageNumberClicked', {\n detail: { page: this.currentPage },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private onRewind() {\n this.currentPage -= 1;\n if (this.currentPage < 1) {\n this.currentPage = 1;\n }\n }\n\n private onForward() {\n this.currentPage += 1;\n if (this.currentPage > this.size) {\n this.currentPage = this.size;\n }\n }\n\n private onChange(page: number) {\n this.currentPage = page;\n }\n\n private getPageTemplate(page: number) {\n return html`\n <button\n @click=${() => this.onChange(page)}\n class=${this.currentPage === page ? 'current' : ''}\n data-page=${page}\n >\n ${page}\n </button>\n `;\n }\n\n private get getPagesTemplate(): TemplateResult | typeof nothing {\n if (!this.pages || !this.pages.length) {\n return nothing;\n }\n\n return html`\n ${this.pages?.map(\n page =>\n html`${page !== 0\n ? this.getPageTemplate(page)\n : this.getEllipsisTemplate}`\n )}\n `;\n }\n\n render() {\n return html`\n <div class=\"facets-pagination\">\n <button class=\"arrow-icon rewind\" @click=${this.onRewind}>\n <span class=\"sr-only\">Rewind pagination:</span>\n ${arrowLeftIcon}\n </button>\n <div class=\"page-numbers\">${this.getPagesTemplate}</div>\n <button class=\"arrow-icon forward\" @click=${this.onForward}>\n <span class=\"sr-only\">Forward pagination:</span>\n ${arrowRightIcon}\n </button>\n </div>\n `;\n }\n\n static get styles(): CSSResultGroup {\n return css`\n .facets-pagination {\n user-select: none;\n margin-top: 10px;\n background-color: #eee;\n text-align: center;\n }\n .facets-pagination button {\n border: none;\n background: none;\n }\n .facets-pagination .arrow-icon {\n width: 2.5rem;\n vertical-align: middle;\n }\n .facets-pagination .arrow-icon svg {\n height: 14px;\n }\n .facets-pagination button,\n .facets-pagination i {\n background: none;\n border: 0;\n cursor: pointer;\n border-radius: 100%;\n margin: 10px 5px;\n padding: 5px;\n font-size: 1.4rem;\n vertical-align: middle;\n display: inline-block;\n min-width: 2.5rem;\n }\n .facets-pagination i {\n cursor: auto;\n display: inline;\n }\n .facets-pagination button.current {\n background: black;\n color: white;\n }\n .page-numbers {\n display: inline-block;\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 `;\n }\n}\n"]}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { LitElement, PropertyValues, TemplateResult } from 'lit';
|
|
2
|
-
import type { Aggregation } from '@internetarchive/search-service';
|
|
2
|
+
import type { Aggregation, SearchServiceInterface } from '@internetarchive/search-service';
|
|
3
3
|
import '@internetarchive/histogram-date-range';
|
|
4
4
|
import '@internetarchive/feature-feedback';
|
|
5
5
|
import '@internetarchive/collection-name-cache';
|
|
6
6
|
import type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';
|
|
7
|
-
import {
|
|
7
|
+
import { ModalManagerInterface } from '@internetarchive/modal-manager';
|
|
8
|
+
import { FacetOption, SelectedFacets, FacetGroup } from './models';
|
|
8
9
|
import type { LanguageCodeHandlerInterface } from './language-code-handler/language-code-handler';
|
|
10
|
+
import './collection-facets/more-facets-content';
|
|
11
|
+
import './collection-facets/facets-template';
|
|
9
12
|
export declare class CollectionFacets extends LitElement {
|
|
13
|
+
searchService?: SearchServiceInterface;
|
|
10
14
|
aggregations?: Record<string, Aggregation>;
|
|
11
15
|
fullYearsHistogramAggregation?: Aggregation;
|
|
12
16
|
minSelectedDate?: string;
|
|
@@ -16,11 +20,17 @@ export declare class CollectionFacets extends LitElement {
|
|
|
16
20
|
selectedFacets?: SelectedFacets;
|
|
17
21
|
collapsableFacets: boolean;
|
|
18
22
|
showHistogramDatePicker: boolean;
|
|
23
|
+
fullQuery?: string;
|
|
24
|
+
modalManager?: ModalManagerInterface;
|
|
19
25
|
languageCodeHandler?: LanguageCodeHandlerInterface;
|
|
20
26
|
collectionNameCache?: CollectionNameCacheInterface;
|
|
21
27
|
/** Fires when a facet is clicked */
|
|
22
28
|
onFacetClick?: (name: FacetOption, facetChecked: boolean, negative: boolean) => void;
|
|
23
29
|
openFacets: Record<FacetOption, boolean>;
|
|
30
|
+
/**
|
|
31
|
+
* render number of facet items
|
|
32
|
+
*/
|
|
33
|
+
private allowedFacetCount;
|
|
24
34
|
render(): TemplateResult<1>;
|
|
25
35
|
updated(changed: PropertyValues): void;
|
|
26
36
|
private dispatchFacetsChangedEvent;
|
|
@@ -45,13 +55,17 @@ export declare class CollectionFacets extends LitElement {
|
|
|
45
55
|
* chevron for the mobile view
|
|
46
56
|
*/
|
|
47
57
|
private getFacetGroupTemplate;
|
|
58
|
+
/**
|
|
59
|
+
* Generate the More... link button just below the facets group
|
|
60
|
+
*
|
|
61
|
+
* TODO: want to fire analytics?
|
|
62
|
+
*/
|
|
63
|
+
private searchMoreFacetsLink;
|
|
64
|
+
showMoreFacetsModal(facetGroup: FacetGroup, sortedBy: string): Promise<void>;
|
|
48
65
|
/**
|
|
49
66
|
* Generate the list template for each bucket in a facet group
|
|
50
67
|
*/
|
|
51
68
|
private getFacetTemplate;
|
|
52
|
-
private facetClicked;
|
|
53
|
-
private facetChecked;
|
|
54
|
-
private facetUnchecked;
|
|
55
69
|
/**
|
|
56
70
|
* Parse the aggregate key title into the human readable title
|
|
57
71
|
*
|