@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.
Files changed (70) hide show
  1. package/dist/src/app-root.d.ts +1 -0
  2. package/dist/src/app-root.js +34 -4
  3. package/dist/src/app-root.js.map +1 -1
  4. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -0
  5. package/dist/src/assets/img/icons/arrow-left.js +10 -0
  6. package/dist/src/assets/img/icons/arrow-left.js.map +1 -0
  7. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -0
  8. package/dist/src/assets/img/icons/arrow-right.js +10 -0
  9. package/dist/src/assets/img/icons/arrow-right.js.map +1 -0
  10. package/dist/src/collection-browser.d.ts +2 -0
  11. package/dist/src/collection-browser.js +10 -2
  12. package/dist/src/collection-browser.js.map +1 -1
  13. package/dist/src/collection-facets/facets-template.d.ts +16 -0
  14. package/dist/src/collection-facets/facets-template.js +266 -0
  15. package/dist/src/collection-facets/facets-template.js.map +1 -0
  16. package/dist/src/collection-facets/facets-util.d.ts +10 -0
  17. package/dist/src/collection-facets/facets-util.js +20 -0
  18. package/dist/src/collection-facets/facets-util.js.map +1 -0
  19. package/dist/src/collection-facets/more-facets-content.d.ts +83 -0
  20. package/dist/src/collection-facets/more-facets-content.js +475 -0
  21. package/dist/src/collection-facets/more-facets-content.js.map +1 -0
  22. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -0
  23. package/dist/src/collection-facets/more-facets-pagination.js +267 -0
  24. package/dist/src/collection-facets/more-facets-pagination.js.map +1 -0
  25. package/dist/src/collection-facets.d.ts +19 -5
  26. package/dist/src/collection-facets.js +138 -239
  27. package/dist/src/collection-facets.js.map +1 -1
  28. package/dist/src/models.d.ts +4 -1
  29. package/dist/src/models.js +24 -0
  30. package/dist/src/models.js.map +1 -1
  31. package/dist/src/restoration-state-handler.js +5 -6
  32. package/dist/src/restoration-state-handler.js.map +1 -1
  33. package/dist/src/tiles/collection-browser-loading-tile.js +2 -5
  34. package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -1
  35. package/dist/test/collection-browser.test.js +5 -3
  36. package/dist/test/collection-browser.test.js.map +1 -1
  37. package/dist/test/collection-facets/facets-template.test.d.ts +1 -0
  38. package/dist/test/collection-facets/facets-template.test.js +75 -0
  39. package/dist/test/collection-facets/facets-template.test.js.map +1 -0
  40. package/dist/test/collection-facets/facets-util.test.d.ts +1 -0
  41. package/dist/test/collection-facets/facets-util.test.js +13 -0
  42. package/dist/test/collection-facets/facets-util.test.js.map +1 -0
  43. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -0
  44. package/dist/test/collection-facets/more-facets-content.test.js +104 -0
  45. package/dist/test/collection-facets/more-facets-content.test.js.map +1 -0
  46. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -0
  47. package/dist/test/collection-facets/more-facets-pagination.test.js +133 -0
  48. package/dist/test/collection-facets/more-facets-pagination.test.js.map +1 -0
  49. package/dist/test/collection-facets.test.d.ts +1 -0
  50. package/dist/test/collection-facets.test.js +98 -33
  51. package/dist/test/collection-facets.test.js.map +1 -1
  52. package/package.json +11 -4
  53. package/src/app-root.ts +34 -4
  54. package/src/assets/img/icons/arrow-left.ts +10 -0
  55. package/src/assets/img/icons/arrow-right.ts +10 -0
  56. package/src/collection-browser.ts +9 -2
  57. package/src/collection-facets/facets-template.ts +284 -0
  58. package/src/collection-facets/facets-util.ts +22 -0
  59. package/src/collection-facets/more-facets-content.ts +529 -0
  60. package/src/collection-facets/more-facets-pagination.ts +297 -0
  61. package/src/collection-facets.ts +175 -261
  62. package/src/models.ts +28 -1
  63. package/src/restoration-state-handler.ts +7 -6
  64. package/src/tiles/collection-browser-loading-tile.ts +2 -5
  65. package/test/collection-browser.test.ts +6 -3
  66. package/test/collection-facets/facets-template.test.ts +103 -0
  67. package/test/collection-facets/facets-util.test.ts +18 -0
  68. package/test/collection-facets/more-facets-content.test.ts +146 -0
  69. package/test/collection-facets/more-facets-pagination.test.ts +202 -0
  70. 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 { FacetOption, SelectedFacets } from './models';
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
  *