@internetarchive/collection-browser 3.1.1-alpha-webdev6778.7 → 3.1.1-alpha-webdev6778.9
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.js +606 -606
- package/dist/src/app-root.js.map +1 -1
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets/facet-row.js +140 -140
- package/dist/src/collection-facets/facet-row.js.map +1 -1
- package/dist/src/collection-facets/models.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-bar.js +75 -75
- package/dist/src/collection-facets/smart-facets/smart-facet-bar.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js +54 -54
- package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js.map +1 -1
- package/dist/src/data-source/collection-browser-data-source-interface.js.map +1 -1
- package/dist/src/data-source/collection-browser-data-source.js +1 -3
- package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
- package/dist/src/data-source/models.js.map +1 -1
- package/dist/src/expanded-date-picker.js +52 -52
- package/dist/src/expanded-date-picker.js.map +1 -1
- package/dist/src/manage/manage-bar.js +77 -77
- package/dist/src/manage/manage-bar.js.map +1 -1
- package/dist/src/models.js.map +1 -1
- package/dist/src/sort-filter-bar/sort-filter-bar.js +376 -376
- package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
- package/dist/src/tiles/base-tile-component.js.map +1 -1
- package/dist/src/tiles/grid/account-tile.js +36 -36
- package/dist/src/tiles/grid/account-tile.js.map +1 -1
- package/dist/src/tiles/grid/search-tile.js +42 -42
- package/dist/src/tiles/grid/search-tile.js.map +1 -1
- package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +119 -119
- package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js.map +1 -1
- package/dist/src/tiles/list/tile-list-compact.js +97 -97
- package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
- package/dist/src/utils/analytics-events.js.map +1 -1
- package/dist/src/utils/format-date.js.map +1 -1
- package/dist/test/collection-browser.test.js +187 -187
- package/dist/test/collection-browser.test.js.map +1 -1
- package/dist/test/collection-facets/facet-row.test.js +23 -23
- package/dist/test/collection-facets/facet-row.test.js.map +1 -1
- package/dist/test/collection-facets.test.js +20 -20
- package/dist/test/collection-facets.test.js.map +1 -1
- package/dist/test/sort-filter-bar/sort-filter-bar.test.js +37 -37
- package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +1 -1
- package/dist/test/tiles/grid/item-tile.test.js +64 -64
- package/dist/test/tiles/grid/item-tile.test.js.map +1 -1
- package/dist/test/tiles/list/tile-list-compact.test.js +57 -57
- package/dist/test/tiles/list/tile-list-compact.test.js.map +1 -1
- package/dist/test/utils/format-date.test.js.map +1 -1
- package/package.json +2 -2
- package/src/app-root.ts +1140 -1140
- package/src/collection-browser.ts +1 -1
- package/src/collection-facets/facet-row.ts +296 -296
- package/src/collection-facets/models.ts +10 -10
- package/src/collection-facets/smart-facets/smart-facet-bar.ts +437 -437
- package/src/collection-facets/smart-facets/smart-facet-dropdown.ts +185 -185
- package/src/data-source/collection-browser-data-source-interface.ts +333 -333
- package/src/data-source/collection-browser-data-source.ts +2 -4
- package/src/data-source/models.ts +43 -43
- package/src/expanded-date-picker.ts +191 -191
- package/src/manage/manage-bar.ts +247 -247
- package/src/models.ts +870 -870
- package/src/sort-filter-bar/sort-filter-bar.ts +1283 -1283
- package/src/tiles/base-tile-component.ts +53 -53
- package/src/tiles/grid/account-tile.ts +112 -112
- package/src/tiles/grid/search-tile.ts +90 -90
- package/src/tiles/grid/styles/tile-grid-shared-styles.ts +130 -130
- package/src/tiles/list/tile-list-compact.ts +236 -236
- package/src/utils/analytics-events.ts +29 -29
- package/src/utils/format-date.ts +42 -42
- package/test/collection-browser.test.ts +2359 -2359
- package/test/collection-facets/facet-row.test.ts +375 -375
- package/test/collection-facets.test.ts +928 -928
- package/test/sort-filter-bar/sort-filter-bar.test.ts +885 -885
- package/test/tiles/grid/item-tile.test.ts +464 -464
- package/test/tiles/list/tile-list-compact.test.ts +228 -228
- package/test/utils/format-date.test.ts +39 -39
|
@@ -33,8 +33,8 @@ let FacetRow = FacetRow_1 = class FacetRow extends LitElement {
|
|
|
33
33
|
// For other facet types, we just have a static value to use.
|
|
34
34
|
const bucketTextDisplay = facetType !== 'collection'
|
|
35
35
|
? html `${(_a = bucket.displayText) !== null && _a !== void 0 ? _a : bucket.key} ${extraNoteSpan}`
|
|
36
|
-
: html `<a href="/details/${bucket.key}">
|
|
37
|
-
${(_c = (_b = this.collectionTitles) === null || _b === void 0 ? void 0 : _b.get(bucket.key)) !== null && _c !== void 0 ? _c : bucket.key}
|
|
36
|
+
: html `<a href="/details/${bucket.key}">
|
|
37
|
+
${(_c = (_b = this.collectionTitles) === null || _b === void 0 ? void 0 : _b.get(bucket.key)) !== null && _c !== void 0 ? _c : bucket.key}
|
|
38
38
|
</a> `;
|
|
39
39
|
const facetHidden = bucket.state === 'hidden';
|
|
40
40
|
const facetSelected = bucket.state === 'selected';
|
|
@@ -47,56 +47,56 @@ let FacetRow = FacetRow_1 = class FacetRow extends LitElement {
|
|
|
47
47
|
const showHideText = facetHidden ? unhideText : hideText;
|
|
48
48
|
const ariaLabel = `${titleText}, ${bucket.count} results`;
|
|
49
49
|
// Added data-testid for Playwright testing
|
|
50
|
-
return html `
|
|
51
|
-
<div class="facet-row-container">
|
|
52
|
-
<div class="facet-checkboxes">
|
|
53
|
-
<input
|
|
54
|
-
type="checkbox"
|
|
55
|
-
.name=${facetType}
|
|
56
|
-
.value=${bucket.key}
|
|
50
|
+
return html `
|
|
51
|
+
<div class="facet-row-container">
|
|
52
|
+
<div class="facet-checkboxes">
|
|
53
|
+
<input
|
|
54
|
+
type="checkbox"
|
|
55
|
+
.name=${facetType}
|
|
56
|
+
.value=${bucket.key}
|
|
57
57
|
@click=${(e) => {
|
|
58
58
|
this.facetClicked(e, false);
|
|
59
|
-
}}
|
|
60
|
-
.checked=${facetSelected}
|
|
61
|
-
class="select-facet-checkbox"
|
|
62
|
-
title=${onlyShowText}
|
|
63
|
-
id=${showOnlyCheckboxId}
|
|
64
|
-
data-testid=${showOnlyCheckboxId}
|
|
65
|
-
/>
|
|
66
|
-
<div class="hide-facet-container">
|
|
67
|
-
<input
|
|
68
|
-
type="checkbox"
|
|
69
|
-
id=${negativeCheckboxId}
|
|
70
|
-
.name=${facetType}
|
|
71
|
-
.value=${bucket.key}
|
|
59
|
+
}}
|
|
60
|
+
.checked=${facetSelected}
|
|
61
|
+
class="select-facet-checkbox"
|
|
62
|
+
title=${onlyShowText}
|
|
63
|
+
id=${showOnlyCheckboxId}
|
|
64
|
+
data-testid=${showOnlyCheckboxId}
|
|
65
|
+
/>
|
|
66
|
+
<div class="hide-facet-container">
|
|
67
|
+
<input
|
|
68
|
+
type="checkbox"
|
|
69
|
+
id=${negativeCheckboxId}
|
|
70
|
+
.name=${facetType}
|
|
71
|
+
.value=${bucket.key}
|
|
72
72
|
@click=${(e) => {
|
|
73
73
|
this.facetClicked(e, true);
|
|
74
|
-
}}
|
|
75
|
-
.checked=${facetHidden}
|
|
76
|
-
class="hide-facet-checkbox"
|
|
77
|
-
/>
|
|
78
|
-
<label
|
|
79
|
-
for=${negativeCheckboxId}
|
|
80
|
-
class="hide-facet-icon${facetHidden ? ' active' : ''}"
|
|
81
|
-
title=${showHideText}
|
|
82
|
-
data-testid=${negativeCheckboxId}
|
|
83
|
-
>
|
|
84
|
-
<span class="sr-only">${showHideText}</span>
|
|
85
|
-
<span class="eye eye-open">${eyeIcon}</span>
|
|
86
|
-
<span class="eye eye-closed">${eyeClosedIcon}</span>
|
|
87
|
-
</label>
|
|
88
|
-
</div>
|
|
89
|
-
</div>
|
|
90
|
-
<label
|
|
91
|
-
for=${showOnlyCheckboxId}
|
|
92
|
-
class="facet-info-display"
|
|
93
|
-
title=${onlyShowText}
|
|
94
|
-
aria-label=${ariaLabel}
|
|
95
|
-
>
|
|
96
|
-
<div class="facet-title">${bucketTextDisplay}</div>
|
|
97
|
-
<div class="facet-count">${bucket.count.toLocaleString()}</div>
|
|
98
|
-
</label>
|
|
99
|
-
</div>
|
|
74
|
+
}}
|
|
75
|
+
.checked=${facetHidden}
|
|
76
|
+
class="hide-facet-checkbox"
|
|
77
|
+
/>
|
|
78
|
+
<label
|
|
79
|
+
for=${negativeCheckboxId}
|
|
80
|
+
class="hide-facet-icon${facetHidden ? ' active' : ''}"
|
|
81
|
+
title=${showHideText}
|
|
82
|
+
data-testid=${negativeCheckboxId}
|
|
83
|
+
>
|
|
84
|
+
<span class="sr-only">${showHideText}</span>
|
|
85
|
+
<span class="eye eye-open">${eyeIcon}</span>
|
|
86
|
+
<span class="eye eye-closed">${eyeClosedIcon}</span>
|
|
87
|
+
</label>
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
<label
|
|
91
|
+
for=${showOnlyCheckboxId}
|
|
92
|
+
class="facet-info-display"
|
|
93
|
+
title=${onlyShowText}
|
|
94
|
+
aria-label=${ariaLabel}
|
|
95
|
+
>
|
|
96
|
+
<div class="facet-title">${bucketTextDisplay}</div>
|
|
97
|
+
<div class="facet-count">${bucket.count.toLocaleString()}</div>
|
|
98
|
+
</label>
|
|
99
|
+
</div>
|
|
100
100
|
`;
|
|
101
101
|
}
|
|
102
102
|
//
|
|
@@ -153,98 +153,98 @@ let FacetRow = FacetRow_1 = class FacetRow extends LitElement {
|
|
|
153
153
|
const facetRowBorderTop = css `var(--facet-row-border-top, 1px solid transparent)`;
|
|
154
154
|
const facetRowBorderBottom = css `var(--facet-row-border-bottom, 1px solid transparent)`;
|
|
155
155
|
const checkboxHeight = css `15px`;
|
|
156
|
-
const ownCss = css `
|
|
157
|
-
.facet-checkboxes {
|
|
158
|
-
margin: 0 5px 0 0;
|
|
159
|
-
display: flex;
|
|
160
|
-
height: ${checkboxHeight};
|
|
161
|
-
}
|
|
162
|
-
.facet-checkboxes input:first-child {
|
|
163
|
-
margin-right: 5px;
|
|
164
|
-
}
|
|
165
|
-
.facet-checkboxes input {
|
|
166
|
-
height: ${checkboxHeight};
|
|
167
|
-
width: ${checkboxHeight};
|
|
168
|
-
margin: 0;
|
|
169
|
-
}
|
|
170
|
-
.facet-row-container {
|
|
171
|
-
display: flex;
|
|
172
|
-
font-weight: 500;
|
|
173
|
-
font-size: 1.2rem;
|
|
174
|
-
margin: 0 auto;
|
|
175
|
-
padding: 0.25rem 0;
|
|
176
|
-
height: auto;
|
|
177
|
-
border-top: ${facetRowBorderTop};
|
|
178
|
-
border-bottom: ${facetRowBorderBottom};
|
|
179
|
-
}
|
|
180
|
-
.facet-info-display {
|
|
181
|
-
display: flex;
|
|
182
|
-
flex: 1 1 0%;
|
|
183
|
-
cursor: pointer;
|
|
184
|
-
flex-wrap: wrap;
|
|
185
|
-
}
|
|
186
|
-
.facet-title {
|
|
187
|
-
word-break: break-word;
|
|
188
|
-
display: inline-block;
|
|
189
|
-
flex: 1 1 0%;
|
|
190
|
-
}
|
|
191
|
-
.facet-note {
|
|
192
|
-
color: #bbb;
|
|
193
|
-
}
|
|
194
|
-
.facet-count {
|
|
195
|
-
text-align: right;
|
|
196
|
-
}
|
|
197
|
-
.select-facet-checkbox {
|
|
198
|
-
cursor: pointer;
|
|
199
|
-
display: inline-block;
|
|
200
|
-
}
|
|
201
|
-
.hide-facet-checkbox {
|
|
202
|
-
position: absolute;
|
|
203
|
-
clip: rect(0, 0, 0, 0);
|
|
204
|
-
pointer-events: none;
|
|
205
|
-
}
|
|
206
|
-
.hide-facet-checkbox:focus-visible + .hide-facet-icon {
|
|
207
|
-
outline-style: auto;
|
|
208
|
-
outline-offset: 2px;
|
|
209
|
-
}
|
|
210
|
-
.hide-facet-icon {
|
|
211
|
-
width: ${checkboxHeight};
|
|
212
|
-
height: ${checkboxHeight};
|
|
213
|
-
cursor: pointer;
|
|
214
|
-
display: flex;
|
|
215
|
-
}
|
|
216
|
-
.eye {
|
|
217
|
-
width: ${checkboxHeight};
|
|
218
|
-
height: ${checkboxHeight};
|
|
219
|
-
opacity: 0.3;
|
|
220
|
-
}
|
|
221
|
-
.hide-facet-icon:hover .eye,
|
|
222
|
-
.active .eye {
|
|
223
|
-
opacity: 1;
|
|
224
|
-
}
|
|
225
|
-
.hide-facet-icon:hover .eye-open,
|
|
226
|
-
.hide-facet-icon .eye-closed {
|
|
227
|
-
display: none;
|
|
228
|
-
}
|
|
229
|
-
.hide-facet-icon:hover .eye-closed,
|
|
230
|
-
.hide-facet-icon.active .eye-closed {
|
|
231
|
-
display: inline;
|
|
232
|
-
}
|
|
233
|
-
.hide-facet-icon.active .eye-open {
|
|
234
|
-
display: none;
|
|
235
|
-
}
|
|
236
|
-
.sorting-icon {
|
|
237
|
-
cursor: pointer;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
a:link,
|
|
241
|
-
a:visited {
|
|
242
|
-
text-decoration: none;
|
|
243
|
-
color: var(--ia-theme-link-color, #4b64ff);
|
|
244
|
-
}
|
|
245
|
-
a:hover {
|
|
246
|
-
text-decoration: underline;
|
|
247
|
-
}
|
|
156
|
+
const ownCss = css `
|
|
157
|
+
.facet-checkboxes {
|
|
158
|
+
margin: 0 5px 0 0;
|
|
159
|
+
display: flex;
|
|
160
|
+
height: ${checkboxHeight};
|
|
161
|
+
}
|
|
162
|
+
.facet-checkboxes input:first-child {
|
|
163
|
+
margin-right: 5px;
|
|
164
|
+
}
|
|
165
|
+
.facet-checkboxes input {
|
|
166
|
+
height: ${checkboxHeight};
|
|
167
|
+
width: ${checkboxHeight};
|
|
168
|
+
margin: 0;
|
|
169
|
+
}
|
|
170
|
+
.facet-row-container {
|
|
171
|
+
display: flex;
|
|
172
|
+
font-weight: 500;
|
|
173
|
+
font-size: 1.2rem;
|
|
174
|
+
margin: 0 auto;
|
|
175
|
+
padding: 0.25rem 0;
|
|
176
|
+
height: auto;
|
|
177
|
+
border-top: ${facetRowBorderTop};
|
|
178
|
+
border-bottom: ${facetRowBorderBottom};
|
|
179
|
+
}
|
|
180
|
+
.facet-info-display {
|
|
181
|
+
display: flex;
|
|
182
|
+
flex: 1 1 0%;
|
|
183
|
+
cursor: pointer;
|
|
184
|
+
flex-wrap: wrap;
|
|
185
|
+
}
|
|
186
|
+
.facet-title {
|
|
187
|
+
word-break: break-word;
|
|
188
|
+
display: inline-block;
|
|
189
|
+
flex: 1 1 0%;
|
|
190
|
+
}
|
|
191
|
+
.facet-note {
|
|
192
|
+
color: #bbb;
|
|
193
|
+
}
|
|
194
|
+
.facet-count {
|
|
195
|
+
text-align: right;
|
|
196
|
+
}
|
|
197
|
+
.select-facet-checkbox {
|
|
198
|
+
cursor: pointer;
|
|
199
|
+
display: inline-block;
|
|
200
|
+
}
|
|
201
|
+
.hide-facet-checkbox {
|
|
202
|
+
position: absolute;
|
|
203
|
+
clip: rect(0, 0, 0, 0);
|
|
204
|
+
pointer-events: none;
|
|
205
|
+
}
|
|
206
|
+
.hide-facet-checkbox:focus-visible + .hide-facet-icon {
|
|
207
|
+
outline-style: auto;
|
|
208
|
+
outline-offset: 2px;
|
|
209
|
+
}
|
|
210
|
+
.hide-facet-icon {
|
|
211
|
+
width: ${checkboxHeight};
|
|
212
|
+
height: ${checkboxHeight};
|
|
213
|
+
cursor: pointer;
|
|
214
|
+
display: flex;
|
|
215
|
+
}
|
|
216
|
+
.eye {
|
|
217
|
+
width: ${checkboxHeight};
|
|
218
|
+
height: ${checkboxHeight};
|
|
219
|
+
opacity: 0.3;
|
|
220
|
+
}
|
|
221
|
+
.hide-facet-icon:hover .eye,
|
|
222
|
+
.active .eye {
|
|
223
|
+
opacity: 1;
|
|
224
|
+
}
|
|
225
|
+
.hide-facet-icon:hover .eye-open,
|
|
226
|
+
.hide-facet-icon .eye-closed {
|
|
227
|
+
display: none;
|
|
228
|
+
}
|
|
229
|
+
.hide-facet-icon:hover .eye-closed,
|
|
230
|
+
.hide-facet-icon.active .eye-closed {
|
|
231
|
+
display: inline;
|
|
232
|
+
}
|
|
233
|
+
.hide-facet-icon.active .eye-open {
|
|
234
|
+
display: none;
|
|
235
|
+
}
|
|
236
|
+
.sorting-icon {
|
|
237
|
+
cursor: pointer;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
a:link,
|
|
241
|
+
a:visited {
|
|
242
|
+
text-decoration: none;
|
|
243
|
+
color: var(--ia-theme-link-color, #4b64ff);
|
|
244
|
+
}
|
|
245
|
+
a:hover {
|
|
246
|
+
text-decoration: underline;
|
|
247
|
+
}
|
|
248
248
|
`;
|
|
249
249
|
return [srOnlyStyle, ownCss];
|
|
250
250
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facet-row.js","sourceRoot":"","sources":["../../../src/collection-facets/facet-row.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n css,\r\n html,\r\n LitElement,\r\n TemplateResult,\r\n CSSResultGroup,\r\n nothing,\r\n} from 'lit';\r\nimport { customElement, property } from 'lit/decorators.js';\r\nimport eyeIcon from '../assets/img/icons/eye';\r\nimport eyeClosedIcon from '../assets/img/icons/eye-closed';\r\nimport type {\r\n FacetOption,\r\n FacetBucket,\r\n FacetEventDetails,\r\n FacetState,\r\n} from '../models';\r\nimport type { CollectionTitles } from '../data-source/models';\r\nimport { srOnlyStyle } from '../styles/sr-only';\r\n\r\n@customElement('facet-row')\r\nexport class FacetRow extends LitElement {\r\n //\r\n // UI STATE\r\n //\r\n\r\n /** The name of the facet group to which this facet belongs (e.g., \"mediatype\") */\r\n @property({ type: String }) facetType?: FacetOption;\r\n\r\n /** The facet bucket containing details about the state, count, and key for this row */\r\n @property({ type: Object }) bucket?: FacetBucket;\r\n\r\n /** The collection name cache for converting collection identifiers to titles */\r\n @property({ type: Object })\r\n collectionTitles?: CollectionTitles;\r\n\r\n //\r\n // COMPONENT LIFECYCLE METHODS\r\n //\r\n\r\n render() {\r\n return html`${this.facetRowTemplate}`;\r\n }\r\n\r\n //\r\n // TEMPLATE GETTERS\r\n //\r\n\r\n /**\r\n * Template for the full facet row, including the positive/negative checks,\r\n * the display name, and the count.\r\n */\r\n private get facetRowTemplate(): TemplateResult | typeof nothing {\r\n const { bucket, facetType } = this;\r\n if (!bucket || !facetType) return nothing;\r\n\r\n const showOnlyCheckboxId = `${facetType}:${bucket.key}-show-only`;\r\n const negativeCheckboxId = `${facetType}:${bucket.key}-negative`;\r\n\r\n const extraNoteSpan = bucket.extraNote\r\n ? html`<span class=\"facet-note\">${bucket.extraNote}</span>`\r\n : nothing;\r\n\r\n // For collections, we render the collection title as a link.\r\n // For other facet types, we just have a static value to use.\r\n const bucketTextDisplay =\r\n facetType !== 'collection'\r\n ? html`${bucket.displayText ?? bucket.key} ${extraNoteSpan}`\r\n : html`<a href=\"/details/${bucket.key}\">\r\n ${this.collectionTitles?.get(bucket.key) ?? bucket.key}\r\n </a> `;\r\n\r\n const facetHidden = bucket.state === 'hidden';\r\n const facetSelected = bucket.state === 'selected';\r\n\r\n const titleText = `${facetType}: ${bucket.displayText ?? bucket.key}`;\r\n const onlyShowText = facetSelected\r\n ? `Show all ${facetType}s`\r\n : `Only show ${titleText}`;\r\n const hideText = `Hide ${titleText}`;\r\n const unhideText = `Unhide ${titleText}`;\r\n const showHideText = facetHidden ? unhideText : hideText;\r\n const ariaLabel = `${titleText}, ${bucket.count} results`;\r\n\r\n // Added data-testid for Playwright testing\r\n return html`\r\n <div class=\"facet-row-container\">\r\n <div class=\"facet-checkboxes\">\r\n <input\r\n type=\"checkbox\"\r\n .name=${facetType}\r\n .value=${bucket.key}\r\n @click=${(e: Event) => {\r\n this.facetClicked(e, false);\r\n }}\r\n .checked=${facetSelected}\r\n class=\"select-facet-checkbox\"\r\n title=${onlyShowText}\r\n id=${showOnlyCheckboxId}\r\n data-testid=${showOnlyCheckboxId}\r\n />\r\n <div class=\"hide-facet-container\">\r\n <input\r\n type=\"checkbox\"\r\n id=${negativeCheckboxId}\r\n .name=${facetType}\r\n .value=${bucket.key}\r\n @click=${(e: Event) => {\r\n this.facetClicked(e, true);\r\n }}\r\n .checked=${facetHidden}\r\n class=\"hide-facet-checkbox\"\r\n />\r\n <label\r\n for=${negativeCheckboxId}\r\n class=\"hide-facet-icon${facetHidden ? ' active' : ''}\"\r\n title=${showHideText}\r\n data-testid=${negativeCheckboxId}\r\n >\r\n <span class=\"sr-only\">${showHideText}</span>\r\n <span class=\"eye eye-open\">${eyeIcon}</span>\r\n <span class=\"eye eye-closed\">${eyeClosedIcon}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <label\r\n for=${showOnlyCheckboxId}\r\n class=\"facet-info-display\"\r\n title=${onlyShowText}\r\n aria-label=${ariaLabel}\r\n >\r\n <div class=\"facet-title\">${bucketTextDisplay}</div>\r\n <div class=\"facet-count\">${bucket.count.toLocaleString()}</div>\r\n </label>\r\n </div>\r\n `;\r\n }\r\n\r\n //\r\n // EVENT HANDLERS & DISPATCHERS\r\n //\r\n\r\n /**\r\n * Handler for whenever this facet is clicked & its state changes\r\n */\r\n private facetClicked(e: Event, negative: boolean) {\r\n const { bucket, facetType } = this;\r\n if (!bucket || !facetType) return;\r\n\r\n const target = e.target as HTMLInputElement;\r\n const { checked } = target;\r\n this.bucket = {\r\n ...bucket,\r\n state: FacetRow.getFacetState(checked, negative),\r\n };\r\n\r\n this.dispatchFacetClickEvent({\r\n facetType,\r\n bucket: this.bucket,\r\n negative,\r\n });\r\n }\r\n\r\n /**\r\n * Emits a `facetClick` event with details about this facet & its current state\r\n */\r\n private dispatchFacetClickEvent(detail: FacetEventDetails) {\r\n const event = new CustomEvent<FacetEventDetails>('facetClick', {\r\n detail,\r\n });\r\n this.dispatchEvent(event);\r\n }\r\n\r\n //\r\n // OTHER METHODS\r\n //\r\n\r\n /**\r\n * Returns the composed facet state corresponding to a positive or negative facet's checked state\r\n */\r\n static getFacetState(checked: boolean, negative: boolean): FacetState {\r\n let state: FacetState;\r\n if (checked) {\r\n state = negative ? 'hidden' : 'selected';\r\n } else {\r\n state = 'none';\r\n }\r\n return state;\r\n }\r\n\r\n //\r\n // STYLES\r\n //\r\n\r\n static get styles(): CSSResultGroup {\r\n const facetRowBorderTop = css`var(--facet-row-border-top, 1px solid transparent)`;\r\n const facetRowBorderBottom = css`var(--facet-row-border-bottom, 1px solid transparent)`;\r\n const checkboxHeight = css`15px`;\r\n\r\n const ownCss = css`\r\n .facet-checkboxes {\r\n margin: 0 5px 0 0;\r\n display: flex;\r\n height: ${checkboxHeight};\r\n }\r\n .facet-checkboxes input:first-child {\r\n margin-right: 5px;\r\n }\r\n .facet-checkboxes input {\r\n height: ${checkboxHeight};\r\n width: ${checkboxHeight};\r\n margin: 0;\r\n }\r\n .facet-row-container {\r\n display: flex;\r\n font-weight: 500;\r\n font-size: 1.2rem;\r\n margin: 0 auto;\r\n padding: 0.25rem 0;\r\n height: auto;\r\n border-top: ${facetRowBorderTop};\r\n border-bottom: ${facetRowBorderBottom};\r\n }\r\n .facet-info-display {\r\n display: flex;\r\n flex: 1 1 0%;\r\n cursor: pointer;\r\n flex-wrap: wrap;\r\n }\r\n .facet-title {\r\n word-break: break-word;\r\n display: inline-block;\r\n flex: 1 1 0%;\r\n }\r\n .facet-note {\r\n color: #bbb;\r\n }\r\n .facet-count {\r\n text-align: right;\r\n }\r\n .select-facet-checkbox {\r\n cursor: pointer;\r\n display: inline-block;\r\n }\r\n .hide-facet-checkbox {\r\n position: absolute;\r\n clip: rect(0, 0, 0, 0);\r\n pointer-events: none;\r\n }\r\n .hide-facet-checkbox:focus-visible + .hide-facet-icon {\r\n outline-style: auto;\r\n outline-offset: 2px;\r\n }\r\n .hide-facet-icon {\r\n width: ${checkboxHeight};\r\n height: ${checkboxHeight};\r\n cursor: pointer;\r\n display: flex;\r\n }\r\n .eye {\r\n width: ${checkboxHeight};\r\n height: ${checkboxHeight};\r\n opacity: 0.3;\r\n }\r\n .hide-facet-icon:hover .eye,\r\n .active .eye {\r\n opacity: 1;\r\n }\r\n .hide-facet-icon:hover .eye-open,\r\n .hide-facet-icon .eye-closed {\r\n display: none;\r\n }\r\n .hide-facet-icon:hover .eye-closed,\r\n .hide-facet-icon.active .eye-closed {\r\n display: inline;\r\n }\r\n .hide-facet-icon.active .eye-open {\r\n display: none;\r\n }\r\n .sorting-icon {\r\n cursor: pointer;\r\n }\r\n\r\n a:link,\r\n a:visited {\r\n text-decoration: none;\r\n color: var(--ia-theme-link-color, #4b64ff);\r\n }\r\n a:hover {\r\n text-decoration: underline;\r\n }\r\n `;\r\n\r\n return [srOnlyStyle, ownCss];\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"facet-row.js","sourceRoot":"","sources":["../../../src/collection-facets/facet-row.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n html,\n LitElement,\n TemplateResult,\n CSSResultGroup,\n nothing,\n} from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport eyeIcon from '../assets/img/icons/eye';\nimport eyeClosedIcon from '../assets/img/icons/eye-closed';\nimport type {\n FacetOption,\n FacetBucket,\n FacetEventDetails,\n FacetState,\n} from '../models';\nimport type { CollectionTitles } from '../data-source/models';\nimport { srOnlyStyle } from '../styles/sr-only';\n\n@customElement('facet-row')\nexport class FacetRow extends LitElement {\n //\n // UI STATE\n //\n\n /** The name of the facet group to which this facet belongs (e.g., \"mediatype\") */\n @property({ type: String }) facetType?: FacetOption;\n\n /** The facet bucket containing details about the state, count, and key for this row */\n @property({ type: Object }) bucket?: FacetBucket;\n\n /** The collection name cache for converting collection identifiers to titles */\n @property({ type: Object })\n collectionTitles?: CollectionTitles;\n\n //\n // COMPONENT LIFECYCLE METHODS\n //\n\n render() {\n return html`${this.facetRowTemplate}`;\n }\n\n //\n // TEMPLATE GETTERS\n //\n\n /**\n * Template for the full facet row, including the positive/negative checks,\n * the display name, and the count.\n */\n private get facetRowTemplate(): TemplateResult | typeof nothing {\n const { bucket, facetType } = this;\n if (!bucket || !facetType) return nothing;\n\n const showOnlyCheckboxId = `${facetType}:${bucket.key}-show-only`;\n const negativeCheckboxId = `${facetType}:${bucket.key}-negative`;\n\n const extraNoteSpan = bucket.extraNote\n ? html`<span class=\"facet-note\">${bucket.extraNote}</span>`\n : nothing;\n\n // For collections, we render the collection title as a link.\n // For other facet types, we just have a static value to use.\n const bucketTextDisplay =\n facetType !== 'collection'\n ? html`${bucket.displayText ?? bucket.key} ${extraNoteSpan}`\n : html`<a href=\"/details/${bucket.key}\">\n ${this.collectionTitles?.get(bucket.key) ?? bucket.key}\n </a> `;\n\n const facetHidden = bucket.state === 'hidden';\n const facetSelected = bucket.state === 'selected';\n\n const titleText = `${facetType}: ${bucket.displayText ?? bucket.key}`;\n const onlyShowText = facetSelected\n ? `Show all ${facetType}s`\n : `Only show ${titleText}`;\n const hideText = `Hide ${titleText}`;\n const unhideText = `Unhide ${titleText}`;\n const showHideText = facetHidden ? unhideText : hideText;\n const ariaLabel = `${titleText}, ${bucket.count} results`;\n\n // Added data-testid for Playwright testing\n return html`\n <div class=\"facet-row-container\">\n <div class=\"facet-checkboxes\">\n <input\n type=\"checkbox\"\n .name=${facetType}\n .value=${bucket.key}\n @click=${(e: Event) => {\n this.facetClicked(e, false);\n }}\n .checked=${facetSelected}\n class=\"select-facet-checkbox\"\n title=${onlyShowText}\n id=${showOnlyCheckboxId}\n data-testid=${showOnlyCheckboxId}\n />\n <div class=\"hide-facet-container\">\n <input\n type=\"checkbox\"\n id=${negativeCheckboxId}\n .name=${facetType}\n .value=${bucket.key}\n @click=${(e: Event) => {\n this.facetClicked(e, true);\n }}\n .checked=${facetHidden}\n class=\"hide-facet-checkbox\"\n />\n <label\n for=${negativeCheckboxId}\n class=\"hide-facet-icon${facetHidden ? ' active' : ''}\"\n title=${showHideText}\n data-testid=${negativeCheckboxId}\n >\n <span class=\"sr-only\">${showHideText}</span>\n <span class=\"eye eye-open\">${eyeIcon}</span>\n <span class=\"eye eye-closed\">${eyeClosedIcon}</span>\n </label>\n </div>\n </div>\n <label\n for=${showOnlyCheckboxId}\n class=\"facet-info-display\"\n title=${onlyShowText}\n aria-label=${ariaLabel}\n >\n <div class=\"facet-title\">${bucketTextDisplay}</div>\n <div class=\"facet-count\">${bucket.count.toLocaleString()}</div>\n </label>\n </div>\n `;\n }\n\n //\n // EVENT HANDLERS & DISPATCHERS\n //\n\n /**\n * Handler for whenever this facet is clicked & its state changes\n */\n private facetClicked(e: Event, negative: boolean) {\n const { bucket, facetType } = this;\n if (!bucket || !facetType) return;\n\n const target = e.target as HTMLInputElement;\n const { checked } = target;\n this.bucket = {\n ...bucket,\n state: FacetRow.getFacetState(checked, negative),\n };\n\n this.dispatchFacetClickEvent({\n facetType,\n bucket: this.bucket,\n negative,\n });\n }\n\n /**\n * Emits a `facetClick` event with details about this facet & its current state\n */\n private dispatchFacetClickEvent(detail: FacetEventDetails) {\n const event = new CustomEvent<FacetEventDetails>('facetClick', {\n detail,\n });\n this.dispatchEvent(event);\n }\n\n //\n // OTHER METHODS\n //\n\n /**\n * Returns the composed facet state corresponding to a positive or negative facet's checked state\n */\n static getFacetState(checked: boolean, negative: boolean): FacetState {\n let state: FacetState;\n if (checked) {\n state = negative ? 'hidden' : 'selected';\n } else {\n state = 'none';\n }\n return state;\n }\n\n //\n // STYLES\n //\n\n static get styles(): CSSResultGroup {\n const facetRowBorderTop = css`var(--facet-row-border-top, 1px solid transparent)`;\n const facetRowBorderBottom = css`var(--facet-row-border-bottom, 1px solid transparent)`;\n const checkboxHeight = css`15px`;\n\n const ownCss = css`\n .facet-checkboxes {\n margin: 0 5px 0 0;\n display: flex;\n height: ${checkboxHeight};\n }\n .facet-checkboxes input:first-child {\n margin-right: 5px;\n }\n .facet-checkboxes input {\n height: ${checkboxHeight};\n width: ${checkboxHeight};\n margin: 0;\n }\n .facet-row-container {\n display: flex;\n font-weight: 500;\n font-size: 1.2rem;\n margin: 0 auto;\n padding: 0.25rem 0;\n height: auto;\n border-top: ${facetRowBorderTop};\n border-bottom: ${facetRowBorderBottom};\n }\n .facet-info-display {\n display: flex;\n flex: 1 1 0%;\n cursor: pointer;\n flex-wrap: wrap;\n }\n .facet-title {\n word-break: break-word;\n display: inline-block;\n flex: 1 1 0%;\n }\n .facet-note {\n color: #bbb;\n }\n .facet-count {\n text-align: right;\n }\n .select-facet-checkbox {\n cursor: pointer;\n display: inline-block;\n }\n .hide-facet-checkbox {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n }\n .hide-facet-checkbox:focus-visible + .hide-facet-icon {\n outline-style: auto;\n outline-offset: 2px;\n }\n .hide-facet-icon {\n width: ${checkboxHeight};\n height: ${checkboxHeight};\n cursor: pointer;\n display: flex;\n }\n .eye {\n width: ${checkboxHeight};\n height: ${checkboxHeight};\n opacity: 0.3;\n }\n .hide-facet-icon:hover .eye,\n .active .eye {\n opacity: 1;\n }\n .hide-facet-icon:hover .eye-open,\n .hide-facet-icon .eye-closed {\n display: none;\n }\n .hide-facet-icon:hover .eye-closed,\n .hide-facet-icon.active .eye-closed {\n display: inline;\n }\n .hide-facet-icon.active .eye-open {\n display: none;\n }\n .sorting-icon {\n cursor: pointer;\n }\n\n a:link,\n a:visited {\n text-decoration: none;\n color: var(--ia-theme-link-color, #4b64ff);\n }\n a:hover {\n text-decoration: underline;\n }\n `;\n\n return [srOnlyStyle, ownCss];\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/collection-facets/models.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,KAAK,CAAC;AAEnD;;;GAGG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAC","sourcesContent":["/**\
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/collection-facets/models.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,KAAK,CAAC;AAEnD;;;GAGG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAC","sourcesContent":["/**\n * Maximum number of aggregations to include in the More... facet dialogs.\n */\nexport const MORE_FACETS__MAX_AGGREGATIONS = 10000;\n\n/**\n * Default number of facets to show per page of the More... facet dialogs.\n * Can be overridden via component property.\n */\nexport const MORE_FACETS__DEFAULT_PAGE_SIZE = 35;\n"]}
|
|
@@ -33,14 +33,14 @@ let SmartFacetBar = class SmartFacetBar extends LitElement {
|
|
|
33
33
|
if (!this.query)
|
|
34
34
|
return nothing;
|
|
35
35
|
const shouldShowLabel = !!this.label && this.smartFacets.length > 0;
|
|
36
|
-
return html `
|
|
37
|
-
<div id="smart-facets-container">
|
|
38
|
-
${this.filtersToggleTemplate}
|
|
36
|
+
return html `
|
|
37
|
+
<div id="smart-facets-container">
|
|
38
|
+
${this.filtersToggleTemplate}
|
|
39
39
|
${shouldShowLabel
|
|
40
40
|
? html `<p id="filters-label">${this.label}</p>`
|
|
41
|
-
: nothing}
|
|
42
|
-
${repeat(this.smartFacets, f => `${f[0].label}|${f[0].facets[0].facetType}|${f[0].facets[0].bucketKey}`, facet => this.makeSmartFacet(facet))}
|
|
43
|
-
</div>
|
|
41
|
+
: nothing}
|
|
42
|
+
${repeat(this.smartFacets, f => `${f[0].label}|${f[0].facets[0].facetType}|${f[0].facets[0].bucketKey}`, facet => this.makeSmartFacet(facet))}
|
|
43
|
+
</div>
|
|
44
44
|
`;
|
|
45
45
|
}
|
|
46
46
|
willUpdate(changed) {
|
|
@@ -99,38 +99,38 @@ let SmartFacetBar = class SmartFacetBar extends LitElement {
|
|
|
99
99
|
}
|
|
100
100
|
smartFacetButton(facet) {
|
|
101
101
|
var _a;
|
|
102
|
-
return html `
|
|
103
|
-
<smart-facet-button
|
|
104
|
-
.facetInfo=${facet}
|
|
105
|
-
.labelPrefix=${fieldPrefixes[facet.facets[0].facetType]}
|
|
106
|
-
.selected=${(_a = facet.selected) !== null && _a !== void 0 ? _a : false}
|
|
107
|
-
@facetClick=${this.facetClicked}
|
|
108
|
-
></smart-facet-button>
|
|
102
|
+
return html `
|
|
103
|
+
<smart-facet-button
|
|
104
|
+
.facetInfo=${facet}
|
|
105
|
+
.labelPrefix=${fieldPrefixes[facet.facets[0].facetType]}
|
|
106
|
+
.selected=${(_a = facet.selected) !== null && _a !== void 0 ? _a : false}
|
|
107
|
+
@facetClick=${this.facetClicked}
|
|
108
|
+
></smart-facet-button>
|
|
109
109
|
`;
|
|
110
110
|
}
|
|
111
111
|
smartFacetDropdown(facets) {
|
|
112
|
-
return html `
|
|
113
|
-
<smart-facet-dropdown
|
|
114
|
-
.facetInfo=${facets}
|
|
115
|
-
.labelPrefix=${fieldPrefixes[facets[0].facets[0].facetType]}
|
|
116
|
-
.activeFacetRef=${facets[0].facets[0]}
|
|
117
|
-
@facetClick=${this.dropdownOptionClicked}
|
|
118
|
-
@dropdownClick=${this.dropdownClicked}
|
|
119
|
-
></smart-facet-dropdown>
|
|
112
|
+
return html `
|
|
113
|
+
<smart-facet-dropdown
|
|
114
|
+
.facetInfo=${facets}
|
|
115
|
+
.labelPrefix=${fieldPrefixes[facets[0].facets[0].facetType]}
|
|
116
|
+
.activeFacetRef=${facets[0].facets[0]}
|
|
117
|
+
@facetClick=${this.dropdownOptionClicked}
|
|
118
|
+
@dropdownClick=${this.dropdownClicked}
|
|
119
|
+
></smart-facet-dropdown>
|
|
120
120
|
`;
|
|
121
121
|
}
|
|
122
122
|
get filtersToggleTemplate() {
|
|
123
123
|
if (!this.filterToggleShown)
|
|
124
124
|
return nothing;
|
|
125
|
-
return html `
|
|
126
|
-
<button
|
|
127
|
-
id="filters-toggle"
|
|
128
|
-
class=${this.filterToggleActive ? 'active' : ''}
|
|
129
|
-
title="${this.filterToggleActive ? 'Hide' : 'Show'} filters pane"
|
|
130
|
-
@click=${this.filterToggleClicked}
|
|
131
|
-
>
|
|
132
|
-
${filterIcon}
|
|
133
|
-
</button>
|
|
125
|
+
return html `
|
|
126
|
+
<button
|
|
127
|
+
id="filters-toggle"
|
|
128
|
+
class=${this.filterToggleActive ? 'active' : ''}
|
|
129
|
+
title="${this.filterToggleActive ? 'Hide' : 'Show'} filters pane"
|
|
130
|
+
@click=${this.filterToggleClicked}
|
|
131
|
+
>
|
|
132
|
+
${filterIcon}
|
|
133
|
+
</button>
|
|
134
134
|
`;
|
|
135
135
|
}
|
|
136
136
|
get facetsToDisplay() {
|
|
@@ -298,51 +298,51 @@ let SmartFacetBar = class SmartFacetBar extends LitElement {
|
|
|
298
298
|
// STYLES
|
|
299
299
|
//
|
|
300
300
|
static get styles() {
|
|
301
|
-
return css `
|
|
302
|
-
#smart-facets-container {
|
|
303
|
-
display: flex;
|
|
304
|
-
align-items: center;
|
|
305
|
-
gap: 5px 10px;
|
|
306
|
-
padding: 10px 0;
|
|
307
|
-
white-space: nowrap;
|
|
308
|
-
overflow: scroll hidden;
|
|
309
|
-
scrollbar-width: none;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
#filters-toggle {
|
|
313
|
-
margin: 0;
|
|
314
|
-
border: 0;
|
|
315
|
-
padding: 5px 8px;
|
|
316
|
-
border-radius: 5px;
|
|
317
|
-
background: white;
|
|
318
|
-
color: #2c2c2c;
|
|
319
|
-
border: 1px solid #194880;
|
|
320
|
-
font-size: 1.4rem;
|
|
321
|
-
font-family: inherit;
|
|
322
|
-
text-decoration: none;
|
|
323
|
-
cursor: pointer;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
#filters-toggle.active {
|
|
327
|
-
background: #194880;
|
|
328
|
-
color: white;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
#filters-toggle > svg {
|
|
332
|
-
width: 12px;
|
|
333
|
-
filter: invert(0.16667);
|
|
334
|
-
vertical-align: -1px;
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
#filters-toggle.active > svg {
|
|
338
|
-
filter: invert(1);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
#filters-label {
|
|
342
|
-
font-size: 1.4rem;
|
|
343
|
-
font-weight: var(--smartFacetLabelFontWeight, normal);
|
|
344
|
-
margin: 0 -5px 0 0;
|
|
345
|
-
}
|
|
301
|
+
return css `
|
|
302
|
+
#smart-facets-container {
|
|
303
|
+
display: flex;
|
|
304
|
+
align-items: center;
|
|
305
|
+
gap: 5px 10px;
|
|
306
|
+
padding: 10px 0;
|
|
307
|
+
white-space: nowrap;
|
|
308
|
+
overflow: scroll hidden;
|
|
309
|
+
scrollbar-width: none;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
#filters-toggle {
|
|
313
|
+
margin: 0;
|
|
314
|
+
border: 0;
|
|
315
|
+
padding: 5px 8px;
|
|
316
|
+
border-radius: 5px;
|
|
317
|
+
background: white;
|
|
318
|
+
color: #2c2c2c;
|
|
319
|
+
border: 1px solid #194880;
|
|
320
|
+
font-size: 1.4rem;
|
|
321
|
+
font-family: inherit;
|
|
322
|
+
text-decoration: none;
|
|
323
|
+
cursor: pointer;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
#filters-toggle.active {
|
|
327
|
+
background: #194880;
|
|
328
|
+
color: white;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
#filters-toggle > svg {
|
|
332
|
+
width: 12px;
|
|
333
|
+
filter: invert(0.16667);
|
|
334
|
+
vertical-align: -1px;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
#filters-toggle.active > svg {
|
|
338
|
+
filter: invert(1);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
#filters-label {
|
|
342
|
+
font-size: 1.4rem;
|
|
343
|
+
font-weight: var(--smartFacetLabelFontWeight, normal);
|
|
344
|
+
margin: 0 -5px 0 0;
|
|
345
|
+
}
|
|
346
346
|
`;
|
|
347
347
|
}
|
|
348
348
|
};
|