@internetarchive/collection-browser 0.0.1-alpha.8 → 0.1.1
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/README.md +8 -11
- package/demo/app-root.ts +16 -92
- package/dist/demo/app-root.d.ts +3 -5
- package/dist/demo/app-root.js +13 -83
- package/dist/demo/app-root.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/src/assets/img/icons/chevron.d.ts +2 -0
- package/dist/src/assets/img/icons/chevron.js +4 -0
- package/dist/src/assets/img/icons/chevron.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -2
- package/dist/src/assets/img/icons/mediatype/account.js +6 -4
- package/dist/src/assets/img/icons/mediatype/account.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/audio.js +7 -4
- package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/collection.js +7 -4
- package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/data.js +15 -0
- package/dist/src/assets/img/icons/mediatype/data.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/etree.js +10 -5
- package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/film.js +2 -1
- package/dist/src/assets/img/icons/mediatype/film.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/images.js +9 -6
- package/dist/src/assets/img/icons/mediatype/images.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/radio.js +15 -0
- package/dist/src/assets/img/icons/mediatype/radio.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/software.js +9 -6
- package/dist/src/assets/img/icons/mediatype/software.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/texts.js +9 -6
- package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/tv.js +10 -5
- package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/video.js +10 -6
- package/dist/src/assets/img/icons/mediatype/video.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/web.js +9 -6
- package/dist/src/assets/img/icons/mediatype/web.js.map +1 -1
- package/dist/src/collection-browser.d.ts +53 -31
- package/dist/src/collection-browser.js +504 -166
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets.d.ts +28 -13
- package/dist/src/collection-facets.js +276 -160
- package/dist/src/collection-facets.js.map +1 -1
- package/dist/src/helpers.d.ts +1 -0
- package/dist/src/helpers.js +20 -0
- package/dist/src/helpers.js.map +1 -0
- package/dist/src/language-code-handler/language-code-handler.d.ts +37 -0
- package/dist/src/language-code-handler/language-code-handler.js +27 -0
- package/dist/src/language-code-handler/language-code-handler.js.map +1 -0
- package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -0
- package/dist/src/language-code-handler/language-code-mapping.js +563 -0
- package/dist/src/language-code-handler/language-code-mapping.js.map +1 -0
- package/dist/src/mediatype/mediatype-color.d.ts +3 -0
- package/dist/src/mediatype/mediatype-color.js +15 -0
- package/dist/src/mediatype/mediatype-color.js.map +1 -0
- package/dist/src/mediatype/mediatype-config.d.ts +3 -0
- package/dist/src/mediatype/mediatype-config.js +86 -0
- package/dist/src/mediatype/mediatype-config.js.map +1 -0
- package/dist/src/mediatype/mediatype-display.d.ts +3 -0
- package/dist/src/mediatype/mediatype-display.js +86 -0
- package/dist/src/mediatype/mediatype-display.js.map +1 -0
- package/dist/src/mediatype/mediatype-icon.d.ts +10 -0
- package/dist/src/mediatype/mediatype-icon.js +105 -0
- package/dist/src/mediatype/mediatype-icon.js.map +1 -0
- package/dist/src/mediatype/mediatype-text.d.ts +3 -0
- package/dist/src/mediatype/mediatype-text.js +17 -0
- package/dist/src/mediatype/mediatype-text.js.map +1 -0
- package/dist/src/mediatype/mediatypeConfig.d.ts +3 -0
- package/dist/src/mediatype/mediatypeConfig.js +86 -0
- package/dist/src/mediatype/mediatypeConfig.js.map +1 -0
- package/dist/src/mediatype-icon.d.ts +2 -2
- package/dist/src/mediatype-icon.js +35 -46
- package/dist/src/mediatype-icon.js.map +1 -1
- package/dist/src/models.d.ts +72 -13
- package/dist/src/models.js +57 -1
- package/dist/src/models.js.map +1 -1
- package/dist/src/restoration-state-handler.d.ts +38 -0
- package/dist/src/restoration-state-handler.js +204 -0
- package/dist/src/restoration-state-handler.js.map +1 -0
- package/dist/src/sort-filter-bar/alpha-bar.d.ts +1 -1
- package/dist/src/sort-filter-bar/alpha-bar.js +9 -2
- package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
- package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
- package/dist/src/sort-filter-bar/img/compact.js +5 -0
- package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
- package/dist/src/sort-filter-bar/img/list.js +1 -1
- package/dist/src/sort-filter-bar/img/list.js.map +1 -1
- package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
- package/dist/src/sort-filter-bar/img/tile.js +5 -0
- package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
- package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +71 -14
- package/dist/src/sort-filter-bar/sort-filter-bar.js +499 -216
- package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
- package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -0
- package/dist/src/tiles/collection-browser-loading-tile.js +32 -0
- package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -0
- package/dist/src/tiles/grid/account-tile.d.ts +1 -1
- package/dist/src/tiles/grid/account-tile.js +5 -5
- package/dist/src/tiles/grid/account-tile.js.map +1 -1
- package/dist/src/tiles/grid/collection-tile.js +1 -2
- package/dist/src/tiles/grid/collection-tile.js.map +1 -1
- package/dist/src/tiles/grid/icons/views.d.ts +1 -1
- package/dist/src/tiles/grid/icons/views.js +2 -2
- package/dist/src/tiles/grid/icons/views.js.map +1 -1
- package/dist/src/tiles/grid/item-tile.d.ts +2 -2
- package/dist/src/tiles/grid/item-tile.js +58 -150
- package/dist/src/tiles/grid/item-tile.js.map +1 -1
- package/dist/src/tiles/item-image.d.ts +21 -0
- package/dist/src/tiles/item-image.js +215 -0
- package/dist/src/tiles/item-image.js.map +1 -0
- package/dist/src/tiles/list/account-label.d.ts +1 -0
- package/dist/src/tiles/list/account-label.js +7 -0
- package/dist/src/tiles/list/account-label.js.map +1 -0
- package/dist/src/tiles/list/date-label.d.ts +1 -0
- package/dist/src/tiles/list/date-label.js +13 -0
- package/dist/src/tiles/list/date-label.js.map +1 -0
- package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -0
- package/dist/src/tiles/list/tile-list-compact-header.js +84 -0
- package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
- package/dist/src/tiles/list/tile-list-compact.d.ts +12 -0
- package/dist/src/tiles/list/tile-list-compact.js +203 -6
- package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
- package/dist/src/tiles/list/tile-list.d.ts +35 -10
- package/dist/src/tiles/list/tile-list.js +368 -104
- package/dist/src/tiles/list/tile-list.js.map +1 -1
- package/dist/src/tiles/loading-tile.js +1 -42
- package/dist/src/tiles/loading-tile.js.map +1 -1
- package/dist/src/tiles/mediatype-icon.d.ts +9 -0
- package/dist/src/tiles/mediatype-icon.js +78 -0
- package/dist/src/tiles/mediatype-icon.js.map +1 -0
- package/dist/src/tiles/tile-dispatcher.d.ts +11 -4
- package/dist/src/tiles/tile-dispatcher.js +56 -19
- package/dist/src/tiles/tile-dispatcher.js.map +1 -1
- package/dist/src/utils/format-date.js +2 -2
- package/dist/src/utils/format-date.js.map +1 -1
- package/dist/src/waveform-thumbnail.d.ts +7 -0
- package/dist/src/waveform-thumbnail.js +106 -0
- package/dist/src/waveform-thumbnail.js.map +1 -0
- package/dist/{demo/icon-provider-icon.d.ts → src/waveform-view.d.ts} +0 -0
- package/dist/src/waveform-view.js +2 -0
- package/dist/src/waveform-view.js.map +1 -0
- package/dist/src/your-webcomponent.d.ts +8 -0
- package/dist/src/your-webcomponent.js +38 -0
- package/dist/src/your-webcomponent.js.map +1 -0
- package/dist/test/collection-browser.test.d.ts +1 -0
- package/dist/test/collection-browser.test.js +16 -2
- package/dist/test/collection-browser.test.js.map +1 -1
- package/dist/test/mediatype-config.test.d.ts +1 -0
- package/dist/test/mediatype-config.test.js +17 -0
- package/dist/test/mediatype-config.test.js.map +1 -0
- package/dist/{src/assets/img/icons/eye-hidden.d.ts → test/mediatype-icon.test.d.ts} +0 -0
- package/dist/test/mediatype-icon.test.js +3 -0
- package/dist/test/mediatype-icon.test.js.map +1 -0
- package/dist/test/mediatypeConfig.test.d.ts +1 -0
- package/dist/test/mediatypeConfig.test.js +17 -0
- package/dist/test/mediatypeConfig.test.js.map +1 -0
- package/dist/test/utils/format-date.test.js +1 -1
- package/dist/test/utils/format-date.test.js.map +1 -1
- package/dist/test/your-webcomponent.test.d.ts +1 -0
- package/dist/test/your-webcomponent.test.js +23 -0
- package/dist/test/your-webcomponent.test.js.map +1 -0
- package/index.ts +6 -0
- package/local.archive.org.cert +86 -0
- package/local.archive.org.key +27 -0
- package/package.json +9 -5
- package/src/assets/img/icons/chevron.ts +4 -0
- package/src/assets/img/icons/mediatype/account.ts +6 -4
- package/src/assets/img/icons/mediatype/audio.ts +7 -4
- package/src/assets/img/icons/mediatype/collection.ts +7 -4
- package/src/assets/img/icons/mediatype/data.ts +15 -0
- package/src/assets/img/icons/mediatype/etree.ts +10 -5
- package/src/assets/img/icons/mediatype/film.ts +2 -1
- package/src/assets/img/icons/mediatype/images.ts +9 -6
- package/src/assets/img/icons/mediatype/radio.ts +15 -0
- package/src/assets/img/icons/mediatype/software.ts +9 -6
- package/src/assets/img/icons/mediatype/texts.ts +9 -6
- package/src/assets/img/icons/mediatype/tv.ts +10 -5
- package/src/assets/img/icons/mediatype/video.ts +10 -6
- package/src/assets/img/icons/mediatype/web.ts +9 -6
- package/src/collection-browser.ts +529 -163
- package/src/collection-facets.ts +307 -205
- package/src/language-code-handler/language-code-handler.ts +64 -0
- package/src/language-code-handler/language-code-mapping.ts +564 -0
- package/src/mediatype/mediatype-config.ts +86 -0
- package/src/models.ts +141 -13
- package/src/restoration-state-handler.ts +266 -0
- package/src/sort-filter-bar/alpha-bar.ts +9 -3
- package/src/sort-filter-bar/img/compact.ts +5 -0
- package/src/sort-filter-bar/img/list.ts +1 -1
- package/src/sort-filter-bar/img/tile.ts +5 -0
- package/src/sort-filter-bar/sort-filter-bar.ts +557 -225
- package/src/tiles/collection-browser-loading-tile.ts +29 -0
- package/src/tiles/grid/account-tile.ts +1 -1
- package/src/tiles/grid/collection-tile.ts +1 -2
- package/src/tiles/grid/icons/views.ts +2 -2
- package/src/tiles/grid/item-tile.ts +57 -162
- package/src/tiles/item-image.ts +218 -0
- package/src/tiles/list/account-label.ts +6 -0
- package/src/tiles/list/date-label.ts +12 -0
- package/src/tiles/list/tile-list-compact-header.ts +77 -0
- package/src/tiles/list/tile-list-compact.ts +218 -0
- package/src/tiles/list/tile-list.ts +412 -107
- package/src/tiles/mediatype-icon.ts +75 -0
- package/src/tiles/tile-dispatcher.ts +66 -18
- package/src/utils/format-date.ts +2 -2
- package/test/collection-browser.test.ts +20 -1
- package/test/mediatype-config.test.ts +18 -0
- package/test/utils/format-date.test.ts +1 -1
- package/web-dev-server.config.mjs +3 -1
- package/dist/demo/icon-provider/icon-provider-icon.d.ts +0 -10
- package/dist/demo/icon-provider/icon-provider-icon.js +0 -32
- package/dist/demo/icon-provider/icon-provider-icon.js.map +0 -1
- package/dist/demo/icon-provider/icon-provider.d.ts +0 -10
- package/dist/demo/icon-provider/icon-provider.js +0 -9
- package/dist/demo/icon-provider/icon-provider.js.map +0 -1
- package/dist/demo/icon-provider-icon.js +0 -2
- package/dist/demo/icon-provider-icon.js.map +0 -1
- package/dist/demo/icon-provider.d.ts +0 -10
- package/dist/demo/icon-provider.js +0 -12
- package/dist/demo/icon-provider.js.map +0 -1
- package/dist/src/assets/img/icons/audio.d.ts +0 -1
- package/dist/src/assets/img/icons/audio.js +0 -9
- package/dist/src/assets/img/icons/audio.js.map +0 -1
- package/dist/src/assets/img/icons/collection.d.ts +0 -1
- package/dist/src/assets/img/icons/collection.js +0 -9
- package/dist/src/assets/img/icons/collection.js.map +0 -1
- package/dist/src/assets/img/icons/etree.d.ts +0 -1
- package/dist/src/assets/img/icons/etree.js +0 -9
- package/dist/src/assets/img/icons/etree.js.map +0 -1
- package/dist/src/assets/img/icons/eye-hidden.js +0 -2
- package/dist/src/assets/img/icons/eye-hidden.js.map +0 -1
- package/dist/src/assets/img/icons/images.d.ts +0 -1
- package/dist/src/assets/img/icons/images.js +0 -10
- package/dist/src/assets/img/icons/images.js.map +0 -1
- package/dist/src/assets/img/icons/mediatype/etree copy.d.ts +0 -1
- package/dist/src/assets/img/icons/mediatype/etree copy.js +0 -9
- package/dist/src/assets/img/icons/mediatype/etree copy.js.map +0 -1
- package/dist/src/assets/img/icons/software.d.ts +0 -1
- package/dist/src/assets/img/icons/software.js +0 -10
- package/dist/src/assets/img/icons/software.js.map +0 -1
- package/dist/src/assets/img/icons/texts.d.ts +0 -1
- package/dist/src/assets/img/icons/texts.js +0 -10
- package/dist/src/assets/img/icons/texts.js.map +0 -1
- package/dist/src/assets/img/icons/tv.d.ts +0 -1
- package/dist/src/assets/img/icons/tv.js +0 -9
- package/dist/src/assets/img/icons/tv.js.map +0 -1
- package/dist/src/assets/img/icons/video.d.ts +0 -1
- package/dist/src/assets/img/icons/video.js +0 -10
- package/dist/src/assets/img/icons/video.js.map +0 -1
- package/dist/src/assets/img/icons/web.d.ts +0 -1
- package/dist/src/assets/img/icons/web.js +0 -10
- package/dist/src/assets/img/icons/web.js.map +0 -1
- package/dist/src/search-handler.d.ts +0 -11
- package/dist/src/search-handler.js +0 -34
- package/dist/src/search-handler.js.map +0 -1
- package/src/mediatype-icon.ts +0 -83
- package/src/sort-filter-bar/img/grid.ts +0 -5
- package/src/tiles/loading-tile.ts +0 -70
|
@@ -1,174 +1,85 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import {
|
|
2
|
+
LitElement,
|
|
3
|
+
html,
|
|
4
|
+
css,
|
|
5
|
+
nothing,
|
|
6
|
+
PropertyValues,
|
|
7
|
+
TemplateResult,
|
|
8
|
+
} from 'lit';
|
|
9
|
+
import { customElement, property, query, state } from 'lit/decorators.js';
|
|
10
|
+
import {
|
|
11
|
+
SharedResizeObserverInterface,
|
|
12
|
+
SharedResizeObserverResizeHandlerInterface,
|
|
13
|
+
} from '@internetarchive/shared-resize-observer';
|
|
14
|
+
import {
|
|
15
|
+
CollectionDisplayMode,
|
|
16
|
+
SortField,
|
|
17
|
+
SortFieldDisplayName,
|
|
18
|
+
} from '../models';
|
|
4
19
|
import './alpha-bar';
|
|
5
20
|
|
|
6
21
|
import { sortIcon } from './img/sort-triangle';
|
|
7
|
-
import {
|
|
22
|
+
import { tileIcon } from './img/tile';
|
|
8
23
|
import { listIcon } from './img/list';
|
|
24
|
+
import { compactIcon } from './img/compact';
|
|
9
25
|
|
|
10
|
-
|
|
11
|
-
publicdate = 'Date Archived',
|
|
12
|
-
date = 'Date Published',
|
|
13
|
-
reviewdate = 'Date Reviewed',
|
|
14
|
-
addeddate = 'Date Added',
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
type SortField = 'relevance' | 'views' | 'title' | 'date' | 'creator';
|
|
26
|
+
type AlphaSelector = 'creator' | 'title';
|
|
18
27
|
|
|
19
28
|
@customElement('sort-filter-bar')
|
|
20
|
-
export class SortFilterBar
|
|
21
|
-
|
|
29
|
+
export class SortFilterBar
|
|
30
|
+
extends LitElement
|
|
31
|
+
implements SharedResizeObserverResizeHandlerInterface
|
|
32
|
+
{
|
|
33
|
+
@property({ type: String }) displayMode?: CollectionDisplayMode;
|
|
34
|
+
|
|
35
|
+
@property({ type: String }) sortDirection: 'asc' | 'desc' | null = null;
|
|
22
36
|
|
|
23
|
-
@property({ type: String })
|
|
37
|
+
@property({ type: String }) selectedSort: SortField = SortField.relevance;
|
|
24
38
|
|
|
25
|
-
@property({ type: String })
|
|
39
|
+
@property({ type: String }) selectedTitleFilter: string | null = null;
|
|
26
40
|
|
|
27
|
-
@property({ type: String })
|
|
41
|
+
@property({ type: String }) selectedCreatorFilter: string | null = null;
|
|
28
42
|
|
|
29
|
-
@
|
|
43
|
+
@property({ type: Boolean }) showRelevance: boolean = true;
|
|
30
44
|
|
|
31
|
-
@
|
|
45
|
+
@property({ type: Object }) resizeObserver?: SharedResizeObserverInterface;
|
|
46
|
+
|
|
47
|
+
@state() alphaSelectorVisible: AlphaSelector | null = null;
|
|
32
48
|
|
|
33
49
|
@state() dateSortSelectorVisible = false;
|
|
34
50
|
|
|
51
|
+
@state() desktopSelectorBarWidth = 0;
|
|
52
|
+
|
|
53
|
+
@state() selectorBarContainerWidth = 0;
|
|
54
|
+
|
|
55
|
+
@state() hoveringOverDateSortOptions = false;
|
|
56
|
+
|
|
57
|
+
@query('#desktop-sort-selector')
|
|
58
|
+
private desktopSortSelector!: HTMLUListElement;
|
|
59
|
+
|
|
60
|
+
@query('#sort-selector-container')
|
|
61
|
+
private sortSelectorContainer!: HTMLDivElement;
|
|
62
|
+
|
|
35
63
|
render() {
|
|
36
64
|
return html`
|
|
37
65
|
<div id="container">
|
|
38
|
-
${this.titleSelectorVisible ? this.titleSelectorBar : nothing}
|
|
39
|
-
${this.creatorSelectorVisible ? this.creatorSelectorBar : nothing}
|
|
40
|
-
|
|
41
66
|
<div id="sort-bar">
|
|
42
|
-
<div id="sort-
|
|
43
|
-
|
|
44
|
-
<li>
|
|
45
|
-
<div id="sort-direction-container">
|
|
46
|
-
<button
|
|
47
|
-
id="sort-ascending-btn"
|
|
48
|
-
class="sort-button"
|
|
49
|
-
@click=${() => {
|
|
50
|
-
this.sortDirection = 'asc';
|
|
51
|
-
}}
|
|
52
|
-
>
|
|
53
|
-
${sortIcon}
|
|
54
|
-
</button>
|
|
55
|
-
<button
|
|
56
|
-
id="sort-descending-btn"
|
|
57
|
-
class="sort-button"
|
|
58
|
-
@click=${() => {
|
|
59
|
-
this.sortDirection = 'desc';
|
|
60
|
-
}}
|
|
61
|
-
>
|
|
62
|
-
${sortIcon}
|
|
63
|
-
</button>
|
|
64
|
-
</div>
|
|
65
|
-
</li>
|
|
66
|
-
<li id="sort-by-text">Sort By</li>
|
|
67
|
-
<li>
|
|
68
|
-
<a
|
|
69
|
-
href="#"
|
|
70
|
-
@click=${(e: Event) => {
|
|
71
|
-
e.preventDefault();
|
|
72
|
-
this.sortField = null;
|
|
73
|
-
this.selectedSort = 'relevance';
|
|
74
|
-
}}
|
|
75
|
-
class=${this.selectedSort === 'relevance' ? 'selected' : ''}
|
|
76
|
-
>
|
|
77
|
-
Relevance
|
|
78
|
-
</a>
|
|
79
|
-
</li>
|
|
80
|
-
<li>
|
|
81
|
-
<a
|
|
82
|
-
href="#"
|
|
83
|
-
@click=${(e: Event) => {
|
|
84
|
-
e.preventDefault();
|
|
85
|
-
this.sortField = 'week';
|
|
86
|
-
this.selectedSort = 'views';
|
|
87
|
-
}}
|
|
88
|
-
class=${this.selectedSort === 'views' ? 'selected' : ''}
|
|
89
|
-
>
|
|
90
|
-
Views
|
|
91
|
-
</a>
|
|
92
|
-
</li>
|
|
93
|
-
<li>
|
|
94
|
-
<a
|
|
95
|
-
href="#"
|
|
96
|
-
@click=${(e: Event) => {
|
|
97
|
-
e.preventDefault();
|
|
98
|
-
this.titleSelectorVisible = !this.titleSelectorVisible;
|
|
99
|
-
this.sortField = 'titleSorter';
|
|
100
|
-
this.selectedSort = 'title';
|
|
101
|
-
}}
|
|
102
|
-
class=${this.selectedSort === 'title' ? 'selected' : ''}
|
|
103
|
-
>
|
|
104
|
-
Title
|
|
105
|
-
</a>
|
|
106
|
-
</li>
|
|
107
|
-
<li>
|
|
108
|
-
<a
|
|
109
|
-
href="#"
|
|
110
|
-
@click=${(e: Event) => {
|
|
111
|
-
e.preventDefault();
|
|
112
|
-
this.dateSortSelectorVisible =
|
|
113
|
-
!this.dateSortSelectorVisible;
|
|
114
|
-
this.selectedSort = 'date';
|
|
115
|
-
}}
|
|
116
|
-
class=${this.selectedSort === 'date' ? 'selected' : ''}
|
|
117
|
-
>
|
|
118
|
-
${this.dateSortField}
|
|
119
|
-
</a>
|
|
120
|
-
</li>
|
|
121
|
-
<li>
|
|
122
|
-
<a
|
|
123
|
-
href="#"
|
|
124
|
-
@click=${(e: Event) => {
|
|
125
|
-
e.preventDefault();
|
|
126
|
-
this.creatorSelectorVisible = !this.creatorSelectorVisible;
|
|
127
|
-
this.sortField = 'creatorSorter';
|
|
128
|
-
this.selectedSort = 'creator';
|
|
129
|
-
}}
|
|
130
|
-
class=${this.selectedSort === 'creator' ? 'selected' : ''}
|
|
131
|
-
>
|
|
132
|
-
Creator
|
|
133
|
-
</a>
|
|
134
|
-
</li>
|
|
135
|
-
</ul>
|
|
67
|
+
<div id="sort-direction-container">
|
|
68
|
+
${this.sortDirectionSelectorTemplate}
|
|
136
69
|
</div>
|
|
137
70
|
|
|
138
|
-
<div id="
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
? html`<li>
|
|
142
|
-
<label id="show-details">
|
|
143
|
-
<input type="checkbox" @click=${this.detailSelected} />
|
|
144
|
-
Show Details
|
|
145
|
-
</label>
|
|
146
|
-
</li>`
|
|
147
|
-
: nothing}
|
|
148
|
-
|
|
149
|
-
<li>
|
|
150
|
-
<button
|
|
151
|
-
id="grid-button"
|
|
152
|
-
@click=${this.gridSelected}
|
|
153
|
-
class=${this.displayMode === 'grid' ? 'active' : ''}
|
|
154
|
-
>
|
|
155
|
-
${gridIcon}
|
|
156
|
-
</button>
|
|
157
|
-
</li>
|
|
158
|
-
<li>
|
|
159
|
-
<button
|
|
160
|
-
id="list-button"
|
|
161
|
-
@click=${this.listSelected}
|
|
162
|
-
class=${this.displayMode !== 'grid' ? 'active' : ''}
|
|
163
|
-
>
|
|
164
|
-
${listIcon}
|
|
165
|
-
</button>
|
|
166
|
-
</li>
|
|
167
|
-
</ul>
|
|
71
|
+
<div id="sort-selector-container">
|
|
72
|
+
${this.mobileSortSelectorTemplate}
|
|
73
|
+
${this.desktopSortSelectorTemplate}
|
|
168
74
|
</div>
|
|
75
|
+
|
|
76
|
+
<div id="display-style-selector">${this.displayOptionTemplate}</div>
|
|
169
77
|
</div>
|
|
170
78
|
|
|
171
|
-
${this.dateSortSelectorVisible
|
|
79
|
+
${this.dateSortSelectorVisible && !this.mobileSelectorVisible
|
|
80
|
+
? this.dateSortSelector
|
|
81
|
+
: nothing}
|
|
82
|
+
${this.alphaBarTemplate}
|
|
172
83
|
|
|
173
84
|
<div id="bottom-shadow"></div>
|
|
174
85
|
</div>
|
|
@@ -180,75 +91,400 @@ export class SortFilterBar extends LitElement {
|
|
|
180
91
|
this.displayModeChanged();
|
|
181
92
|
}
|
|
182
93
|
|
|
183
|
-
if (changed.has('
|
|
184
|
-
this.
|
|
94
|
+
if (changed.has('selectedSort') && this.sortDirection === null) {
|
|
95
|
+
this.sortDirection = 'desc';
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (changed.has('selectedTitleFilter') && this.selectedTitleFilter) {
|
|
99
|
+
this.alphaSelectorVisible = 'title';
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (changed.has('selectedCreatorFilter') && this.selectedCreatorFilter) {
|
|
103
|
+
this.alphaSelectorVisible = 'creator';
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (changed.has('dateSortSelectorVisible')) {
|
|
107
|
+
this.setupEscapeListeners();
|
|
185
108
|
}
|
|
109
|
+
|
|
110
|
+
if (changed.has('resizeObserver')) {
|
|
111
|
+
const oldObserver = changed.get(
|
|
112
|
+
'resizeObserver'
|
|
113
|
+
) as SharedResizeObserverInterface;
|
|
114
|
+
if (oldObserver) this.disconnectResizeObserver(oldObserver);
|
|
115
|
+
this.setupResizeObserver();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
private setupEscapeListeners() {
|
|
120
|
+
if (this.dateSortSelectorVisible) {
|
|
121
|
+
document.addEventListener(
|
|
122
|
+
'keydown',
|
|
123
|
+
this.boundDateSelectorEscapeListener
|
|
124
|
+
);
|
|
125
|
+
} else {
|
|
126
|
+
document.removeEventListener(
|
|
127
|
+
'keydown',
|
|
128
|
+
this.boundDateSelectorEscapeListener
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
private boundDateSelectorEscapeListener = (e: KeyboardEvent) => {
|
|
134
|
+
if (e.key === 'Escape') {
|
|
135
|
+
this.dateSortSelectorVisible = false;
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
disconnectedCallback(): void {
|
|
140
|
+
if (this.resizeObserver) {
|
|
141
|
+
this.disconnectResizeObserver(this.resizeObserver);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
private disconnectResizeObserver(
|
|
146
|
+
resizeObserver: SharedResizeObserverInterface
|
|
147
|
+
) {
|
|
148
|
+
resizeObserver.removeObserver({
|
|
149
|
+
target: this.sortSelectorContainer,
|
|
150
|
+
handler: this,
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
resizeObserver.removeObserver({
|
|
154
|
+
target: this.desktopSortSelector,
|
|
155
|
+
handler: this,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
private setupResizeObserver() {
|
|
160
|
+
if (!this.resizeObserver) return;
|
|
161
|
+
this.resizeObserver.addObserver({
|
|
162
|
+
target: this.sortSelectorContainer,
|
|
163
|
+
handler: this,
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
this.resizeObserver.addObserver({
|
|
167
|
+
target: this.desktopSortSelector,
|
|
168
|
+
handler: this,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
private get mobileSelectorVisible() {
|
|
173
|
+
return this.selectorBarContainerWidth - 10 < this.desktopSelectorBarWidth;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
private get alphaBarTemplate(): TemplateResult | typeof nothing {
|
|
177
|
+
if (!['title', 'creator'].includes(this.selectedSort)) return nothing;
|
|
178
|
+
|
|
179
|
+
if (this.alphaSelectorVisible === null) {
|
|
180
|
+
if (this.selectedSort === 'creator') return this.creatorSelectorBar;
|
|
181
|
+
if (this.selectedSort === 'title') return this.titleSelectorBar;
|
|
182
|
+
} else {
|
|
183
|
+
return this.alphaSelectorVisible === 'creator'
|
|
184
|
+
? this.creatorSelectorBar
|
|
185
|
+
: this.titleSelectorBar;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return nothing;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
handleResize(entry: ResizeObserverEntry): void {
|
|
192
|
+
if (entry.target === this.desktopSortSelector) {
|
|
193
|
+
this.desktopSelectorBarWidth = entry.contentRect.width;
|
|
194
|
+
} else if (entry.target === this.sortSelectorContainer) {
|
|
195
|
+
this.selectorBarContainerWidth = entry.contentRect.width;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private get sortDirectionSelectorTemplate() {
|
|
200
|
+
return html`
|
|
201
|
+
<div id="sort-direction-selector">
|
|
202
|
+
<button
|
|
203
|
+
id="sort-ascending-btn"
|
|
204
|
+
class="sort-button ${this.sortDirection === 'asc' ? 'selected' : ''}"
|
|
205
|
+
?disabled=${this.selectedSort === 'relevance'}
|
|
206
|
+
@click=${() => {
|
|
207
|
+
this.setSortDirections('asc');
|
|
208
|
+
}}
|
|
209
|
+
>
|
|
210
|
+
${sortIcon}
|
|
211
|
+
</button>
|
|
212
|
+
<button
|
|
213
|
+
id="sort-descending-btn"
|
|
214
|
+
class="sort-button ${this.sortDirection === 'desc' ? 'selected' : ''}"
|
|
215
|
+
?disabled=${this.selectedSort === 'relevance'}
|
|
216
|
+
@click=${() => {
|
|
217
|
+
this.setSortDirections('desc');
|
|
218
|
+
}}
|
|
219
|
+
>
|
|
220
|
+
${sortIcon}
|
|
221
|
+
</button>
|
|
222
|
+
</div>
|
|
223
|
+
`;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
private get desktopSortSelectorTemplate() {
|
|
227
|
+
return html`
|
|
228
|
+
<ul
|
|
229
|
+
id="desktop-sort-selector"
|
|
230
|
+
class=${this.mobileSelectorVisible ? 'hidden' : 'visible'}
|
|
231
|
+
>
|
|
232
|
+
<li id="sort-by-text">Sort By</li>
|
|
233
|
+
<li>
|
|
234
|
+
${this.showRelevance
|
|
235
|
+
? this.getSortDisplayOption(SortField.relevance)
|
|
236
|
+
: nothing}
|
|
237
|
+
</li>
|
|
238
|
+
<li>${this.getSortDisplayOption(SortField.views)}</li>
|
|
239
|
+
<li>
|
|
240
|
+
${this.getSortDisplayOption(SortField.title, {
|
|
241
|
+
clickEvent: () => {
|
|
242
|
+
this.alphaSelectorVisible = 'title';
|
|
243
|
+
this.selectedCreatorFilter = null;
|
|
244
|
+
this.dateSortSelectorVisible = false;
|
|
245
|
+
this.setSelectedSort(SortField.title);
|
|
246
|
+
this.emitCreatorLetterChangedEvent();
|
|
247
|
+
},
|
|
248
|
+
})}
|
|
249
|
+
</li>
|
|
250
|
+
<li>
|
|
251
|
+
${this.getSortDisplayOption(SortField.date, {
|
|
252
|
+
clickEvent: () => {
|
|
253
|
+
if (!this.dateOptionSelected)
|
|
254
|
+
this.setSelectedSort(SortField.date);
|
|
255
|
+
this.dateSortSelectorVisible = !this.dateSortSelectorVisible;
|
|
256
|
+
this.alphaSelectorVisible = null;
|
|
257
|
+
this.selectedTitleFilter = null;
|
|
258
|
+
this.selectedCreatorFilter = null;
|
|
259
|
+
this.emitTitleLetterChangedEvent();
|
|
260
|
+
this.emitCreatorLetterChangedEvent();
|
|
261
|
+
},
|
|
262
|
+
displayName: html`${this.dateSortField}`,
|
|
263
|
+
isSelected: () => this.dateOptionSelected,
|
|
264
|
+
})}
|
|
265
|
+
</li>
|
|
266
|
+
<li>
|
|
267
|
+
${this.getSortDisplayOption(SortField.creator, {
|
|
268
|
+
clickEvent: () => {
|
|
269
|
+
this.alphaSelectorVisible = 'creator';
|
|
270
|
+
this.selectedTitleFilter = null;
|
|
271
|
+
this.dateSortSelectorVisible = false;
|
|
272
|
+
this.setSelectedSort(SortField.creator);
|
|
273
|
+
this.emitTitleLetterChangedEvent();
|
|
274
|
+
},
|
|
275
|
+
})}
|
|
276
|
+
</li>
|
|
277
|
+
</ul>
|
|
278
|
+
`;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* This generates each of the sort option links.
|
|
283
|
+
*
|
|
284
|
+
* It manages the display value and the selected state of the option.
|
|
285
|
+
*
|
|
286
|
+
* @param sortField
|
|
287
|
+
* @param options {
|
|
288
|
+
* additionalClickEvent?: () => void; If this is provided, it will also be called when the option is clicked.
|
|
289
|
+
* displayName?: TemplateResult; The name to display for the option. Defaults to the sortField display name.
|
|
290
|
+
* isSelected?: () => boolean; A function that returns true if the option is selected. Defaults to the selectedSort === sortField.
|
|
291
|
+
* }
|
|
292
|
+
* @returns
|
|
293
|
+
*/
|
|
294
|
+
private getSortDisplayOption(
|
|
295
|
+
sortField: SortField,
|
|
296
|
+
options?: {
|
|
297
|
+
clickEvent?: (e: Event) => void;
|
|
298
|
+
isSelected?: () => boolean;
|
|
299
|
+
displayName?: TemplateResult;
|
|
300
|
+
}
|
|
301
|
+
): TemplateResult {
|
|
302
|
+
const isSelected =
|
|
303
|
+
options?.isSelected ?? (() => this.selectedSort === sortField);
|
|
304
|
+
const displayName = options?.displayName ?? SortFieldDisplayName[sortField];
|
|
305
|
+
return html`
|
|
306
|
+
<a
|
|
307
|
+
href="#"
|
|
308
|
+
@click=${(e: Event) => {
|
|
309
|
+
e.preventDefault();
|
|
310
|
+
if (options?.clickEvent) {
|
|
311
|
+
options.clickEvent(e);
|
|
312
|
+
} else {
|
|
313
|
+
this.alphaSelectorVisible = null;
|
|
314
|
+
this.dateSortSelectorVisible = false;
|
|
315
|
+
this.selectedTitleFilter = null;
|
|
316
|
+
this.selectedCreatorFilter = null;
|
|
317
|
+
this.setSelectedSort(sortField);
|
|
318
|
+
this.emitTitleLetterChangedEvent();
|
|
319
|
+
this.emitCreatorLetterChangedEvent();
|
|
320
|
+
}
|
|
321
|
+
}}
|
|
322
|
+
class=${isSelected() ? 'selected' : ''}
|
|
323
|
+
>
|
|
324
|
+
${displayName}
|
|
325
|
+
</a>
|
|
326
|
+
`;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
private get mobileSortSelectorTemplate() {
|
|
330
|
+
return html`
|
|
331
|
+
<select
|
|
332
|
+
id="mobile-sort-selector"
|
|
333
|
+
@change=${this.mobileSortChanged}
|
|
334
|
+
class=${this.mobileSelectorVisible ? 'visible' : 'hidden'}
|
|
335
|
+
>
|
|
336
|
+
${Object.keys(SortField).map(
|
|
337
|
+
field => html`
|
|
338
|
+
<option value="${field}" ?selected=${this.selectedSort === field}>
|
|
339
|
+
${SortFieldDisplayName[field as SortField]}
|
|
340
|
+
</option>
|
|
341
|
+
`
|
|
342
|
+
)}
|
|
343
|
+
</select>
|
|
344
|
+
`;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
private mobileSortChanged(e: Event) {
|
|
348
|
+
const target = e.target as HTMLSelectElement;
|
|
349
|
+
this.setSelectedSort(target.value as SortField);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
private get displayOptionTemplate() {
|
|
353
|
+
return html`
|
|
354
|
+
<ul>
|
|
355
|
+
<li>
|
|
356
|
+
<button
|
|
357
|
+
id="grid-button"
|
|
358
|
+
@click=${() => {
|
|
359
|
+
this.displayMode = 'grid';
|
|
360
|
+
}}
|
|
361
|
+
class=${this.displayMode === 'grid' ? 'active' : ''}
|
|
362
|
+
>
|
|
363
|
+
${tileIcon}
|
|
364
|
+
</button>
|
|
365
|
+
</li>
|
|
366
|
+
<li>
|
|
367
|
+
<button
|
|
368
|
+
id="grid-button"
|
|
369
|
+
@click=${() => {
|
|
370
|
+
this.displayMode = 'list-detail';
|
|
371
|
+
}}
|
|
372
|
+
class=${this.displayMode === 'list-detail' ? 'active' : ''}
|
|
373
|
+
>
|
|
374
|
+
${listIcon}
|
|
375
|
+
</button>
|
|
376
|
+
</li>
|
|
377
|
+
<li>
|
|
378
|
+
<button
|
|
379
|
+
id="list-button"
|
|
380
|
+
@click=${() => {
|
|
381
|
+
this.displayMode = 'list-compact';
|
|
382
|
+
}}
|
|
383
|
+
class=${this.displayMode === 'list-compact' ? 'active' : ''}
|
|
384
|
+
>
|
|
385
|
+
${compactIcon}
|
|
386
|
+
</button>
|
|
387
|
+
</li>
|
|
388
|
+
</ul>
|
|
389
|
+
`;
|
|
186
390
|
}
|
|
187
391
|
|
|
188
392
|
private get dateSortSelector() {
|
|
189
393
|
return html`
|
|
394
|
+
<div
|
|
395
|
+
id="date-sort-selector-backdrop"
|
|
396
|
+
@keyup=${() => {
|
|
397
|
+
this.dateSortSelectorVisible = false;
|
|
398
|
+
}}
|
|
399
|
+
@click=${() => {
|
|
400
|
+
this.dateSortSelectorVisible = false;
|
|
401
|
+
}}
|
|
402
|
+
></div>
|
|
190
403
|
<div id="date-sort-selector">
|
|
191
404
|
<ul>
|
|
192
|
-
<li>
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
this.dateSortSelectorVisible = false;
|
|
197
|
-
}}
|
|
198
|
-
>
|
|
199
|
-
Date Archived
|
|
200
|
-
</button>
|
|
201
|
-
</li>
|
|
202
|
-
<li>
|
|
203
|
-
<button
|
|
204
|
-
@click=${() => {
|
|
205
|
-
this.sortField = 'date';
|
|
206
|
-
this.dateSortSelectorVisible = false;
|
|
207
|
-
}}
|
|
208
|
-
>
|
|
209
|
-
Date Published
|
|
210
|
-
</button>
|
|
211
|
-
</li>
|
|
212
|
-
<li>
|
|
213
|
-
<button
|
|
214
|
-
@click=${() => {
|
|
215
|
-
this.sortField = 'reviewdate';
|
|
216
|
-
this.dateSortSelectorVisible = false;
|
|
217
|
-
}}
|
|
218
|
-
>
|
|
219
|
-
Date Reviewed
|
|
220
|
-
</button>
|
|
221
|
-
</li>
|
|
222
|
-
<li>
|
|
223
|
-
<button
|
|
224
|
-
@click=${() => {
|
|
225
|
-
this.sortField = 'addeddate';
|
|
226
|
-
this.dateSortSelectorVisible = false;
|
|
227
|
-
}}
|
|
228
|
-
>
|
|
229
|
-
Date Added
|
|
230
|
-
</button>
|
|
231
|
-
</li>
|
|
405
|
+
<li>${this.getDateSortButton(SortField.datearchived)}</li>
|
|
406
|
+
<li>${this.getDateSortButton(SortField.date)}</li>
|
|
407
|
+
<li>${this.getDateSortButton(SortField.datereviewed)}</li>
|
|
408
|
+
<li>${this.getDateSortButton(SortField.dateadded)}</li>
|
|
232
409
|
</ul>
|
|
233
410
|
</div>
|
|
234
411
|
`;
|
|
235
412
|
}
|
|
236
413
|
|
|
414
|
+
private getDateSortButton(sortField: SortField) {
|
|
415
|
+
return html`
|
|
416
|
+
<button
|
|
417
|
+
@click=${() => {
|
|
418
|
+
this.selectDateSort(sortField);
|
|
419
|
+
}}
|
|
420
|
+
class=${this.selectedSort === sortField ? 'selected' : ''}
|
|
421
|
+
>
|
|
422
|
+
${SortFieldDisplayName[sortField]}
|
|
423
|
+
</button>
|
|
424
|
+
`;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
private selectDateSort(sortField: SortField) {
|
|
428
|
+
this.dateSortSelectorVisible = false;
|
|
429
|
+
this.setSelectedSort(sortField);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
private setSortDirections(sortDirection: 'asc' | 'desc') {
|
|
433
|
+
this.sortDirection = sortDirection;
|
|
434
|
+
this.emitSortChangedEvent();
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
private setSelectedSort(sort: SortField) {
|
|
438
|
+
this.selectedSort = sort;
|
|
439
|
+
this.emitSortChangedEvent();
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* There are four date sort options.
|
|
444
|
+
*
|
|
445
|
+
* This checks to see if the current sort is one of them.
|
|
446
|
+
*
|
|
447
|
+
* @readonly
|
|
448
|
+
* @private
|
|
449
|
+
* @type {boolean}
|
|
450
|
+
* @memberof SortFilterBar
|
|
451
|
+
*/
|
|
452
|
+
private get dateOptionSelected(): boolean {
|
|
453
|
+
const dateSortFields: SortField[] = [
|
|
454
|
+
SortField.datearchived,
|
|
455
|
+
SortField.date,
|
|
456
|
+
SortField.datereviewed,
|
|
457
|
+
SortField.dateadded,
|
|
458
|
+
];
|
|
459
|
+
return dateSortFields.includes(this.selectedSort);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* The display name of the current date field
|
|
464
|
+
*
|
|
465
|
+
* @readonly
|
|
466
|
+
* @private
|
|
467
|
+
* @type {string}
|
|
468
|
+
* @memberof SortFilterBar
|
|
469
|
+
*/
|
|
237
470
|
private get dateSortField(): string {
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
471
|
+
const defaultSort = SortFieldDisplayName[SortField.date];
|
|
472
|
+
const name = this.dateOptionSelected
|
|
473
|
+
? SortFieldDisplayName[this.selectedSort] ?? defaultSort
|
|
474
|
+
: defaultSort;
|
|
475
|
+
return name;
|
|
242
476
|
}
|
|
243
477
|
|
|
244
478
|
private get titleSelectorBar() {
|
|
245
479
|
return html` <alpha-bar
|
|
480
|
+
.selectedLetter=${this.selectedTitleFilter}
|
|
246
481
|
@letterChanged=${this.titleLetterChanged}
|
|
247
482
|
></alpha-bar>`;
|
|
248
483
|
}
|
|
249
484
|
|
|
250
485
|
private get creatorSelectorBar() {
|
|
251
486
|
return html` <alpha-bar
|
|
487
|
+
.selectedLetter=${this.selectedCreatorFilter}
|
|
252
488
|
@letterChanged=${this.creatorLetterChanged}
|
|
253
489
|
></alpha-bar>`;
|
|
254
490
|
}
|
|
@@ -256,33 +492,35 @@ export class SortFilterBar extends LitElement {
|
|
|
256
492
|
private titleLetterChanged(
|
|
257
493
|
e: CustomEvent<{ selectedLetter: string | undefined }>
|
|
258
494
|
) {
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
});
|
|
262
|
-
this.dispatchEvent(event);
|
|
495
|
+
this.selectedTitleFilter = e.detail.selectedLetter ?? null;
|
|
496
|
+
this.emitTitleLetterChangedEvent();
|
|
263
497
|
}
|
|
264
498
|
|
|
265
499
|
private creatorLetterChanged(
|
|
266
500
|
e: CustomEvent<{ selectedLetter: string | undefined }>
|
|
267
501
|
) {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
});
|
|
271
|
-
this.dispatchEvent(event);
|
|
502
|
+
this.selectedCreatorFilter = e.detail.selectedLetter ?? null;
|
|
503
|
+
this.emitCreatorLetterChangedEvent();
|
|
272
504
|
}
|
|
273
505
|
|
|
274
|
-
private
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
506
|
+
private emitTitleLetterChangedEvent() {
|
|
507
|
+
const event = new CustomEvent<{ selectedLetter: string | null }>(
|
|
508
|
+
'titleLetterChanged',
|
|
509
|
+
{
|
|
510
|
+
detail: { selectedLetter: this.selectedTitleFilter },
|
|
511
|
+
}
|
|
512
|
+
);
|
|
513
|
+
this.dispatchEvent(event);
|
|
280
514
|
}
|
|
281
515
|
|
|
282
|
-
private
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
516
|
+
private emitCreatorLetterChangedEvent() {
|
|
517
|
+
const event = new CustomEvent<{ selectedLetter: string | null }>(
|
|
518
|
+
'creatorLetterChanged',
|
|
519
|
+
{
|
|
520
|
+
detail: { selectedLetter: this.selectedCreatorFilter },
|
|
521
|
+
}
|
|
522
|
+
);
|
|
523
|
+
this.dispatchEvent(event);
|
|
286
524
|
}
|
|
287
525
|
|
|
288
526
|
private displayModeChanged() {
|
|
@@ -292,10 +530,13 @@ export class SortFilterBar extends LitElement {
|
|
|
292
530
|
this.dispatchEvent(event);
|
|
293
531
|
}
|
|
294
532
|
|
|
295
|
-
private
|
|
296
|
-
const event = new CustomEvent
|
|
533
|
+
private emitSortChangedEvent() {
|
|
534
|
+
const event = new CustomEvent<{
|
|
535
|
+
selectedSort: SortField;
|
|
536
|
+
sortDirection: 'asc' | 'desc' | null;
|
|
537
|
+
}>('sortChanged', {
|
|
297
538
|
detail: {
|
|
298
|
-
|
|
539
|
+
selectedSort: this.selectedSort,
|
|
299
540
|
sortDirection: this.sortDirection,
|
|
300
541
|
},
|
|
301
542
|
});
|
|
@@ -304,7 +545,7 @@ export class SortFilterBar extends LitElement {
|
|
|
304
545
|
|
|
305
546
|
static styles = css`
|
|
306
547
|
#container {
|
|
307
|
-
|
|
548
|
+
position: relative;
|
|
308
549
|
}
|
|
309
550
|
|
|
310
551
|
#sort-bar {
|
|
@@ -315,6 +556,10 @@ export class SortFilterBar extends LitElement {
|
|
|
315
556
|
padding: 0.5rem 1.5rem;
|
|
316
557
|
}
|
|
317
558
|
|
|
559
|
+
#sort-direction-container {
|
|
560
|
+
flex: 0;
|
|
561
|
+
}
|
|
562
|
+
|
|
318
563
|
#sort-by-text {
|
|
319
564
|
text-transform: uppercase;
|
|
320
565
|
}
|
|
@@ -347,53 +592,140 @@ export class SortFilterBar extends LitElement {
|
|
|
347
592
|
outline: inherit;
|
|
348
593
|
width: 12px;
|
|
349
594
|
height: 12px;
|
|
595
|
+
opacity: 0.5;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
.sort-button.selected {
|
|
599
|
+
opacity: 1;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
.sort-button:disabled {
|
|
603
|
+
opacity: 0.25;
|
|
604
|
+
cursor: default;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
#date-sort-selector {
|
|
608
|
+
position: absolute;
|
|
609
|
+
left: 150px;
|
|
610
|
+
top: 45px;
|
|
611
|
+
|
|
612
|
+
z-index: 1;
|
|
613
|
+
padding: 1rem;
|
|
614
|
+
background-color: white;
|
|
615
|
+
border-radius: 2.5rem;
|
|
616
|
+
border: 1px solid #404142;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
#date-sort-selector button {
|
|
620
|
+
background: none;
|
|
621
|
+
border-radius: 15px;
|
|
622
|
+
color: #404142;
|
|
623
|
+
border: none;
|
|
624
|
+
appearance: none;
|
|
625
|
+
cursor: pointer;
|
|
626
|
+
-webkit-appearance: none;
|
|
627
|
+
font-size: 1.4rem;
|
|
628
|
+
font-weight: 400;
|
|
629
|
+
padding: 0.5rem 1.2rem;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
#date-sort-selector button.selected {
|
|
633
|
+
background-color: #404142;
|
|
634
|
+
color: white;
|
|
350
635
|
}
|
|
351
636
|
|
|
352
637
|
#show-details {
|
|
353
638
|
text-transform: uppercase;
|
|
354
639
|
cursor: pointer;
|
|
640
|
+
display: flex;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
#show-details input {
|
|
644
|
+
margin-right: 0.5rem;
|
|
645
|
+
flex: 0 0 12px;
|
|
355
646
|
}
|
|
356
647
|
|
|
357
648
|
#sort-descending-btn {
|
|
358
649
|
transform: rotate(180deg);
|
|
359
650
|
}
|
|
360
651
|
|
|
361
|
-
#sort-direction-
|
|
652
|
+
#sort-direction-selector {
|
|
362
653
|
display: flex;
|
|
363
654
|
flex-direction: column;
|
|
655
|
+
gap: 3px;
|
|
656
|
+
margin-right: 1rem;
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
#sort-selector-container {
|
|
660
|
+
flex: 1;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
/*
|
|
664
|
+
we move the desktop sort selector offscreen instead of display: none
|
|
665
|
+
because we need to observe the width of it vs its container to determine
|
|
666
|
+
if it's wide enough to display the desktop version and if you displY: none,
|
|
667
|
+
the width becomes 0
|
|
668
|
+
*/
|
|
669
|
+
#desktop-sort-selector.hidden {
|
|
670
|
+
position: absolute;
|
|
671
|
+
top: -9999px;
|
|
672
|
+
left: -9999px;
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
#mobile-sort-selector.hidden {
|
|
676
|
+
display: none;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
#date-sort-selector-backdrop {
|
|
680
|
+
position: fixed;
|
|
681
|
+
top: 0;
|
|
682
|
+
left: 0;
|
|
683
|
+
width: 100%;
|
|
684
|
+
height: 100%;
|
|
685
|
+
z-index: 1;
|
|
686
|
+
background-color: rgba(255, 255, 255, 0.5);
|
|
364
687
|
}
|
|
365
688
|
|
|
366
|
-
#sort-selector
|
|
689
|
+
#desktop-sort-selector {
|
|
690
|
+
display: inline-flex;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
#desktop-sort-selector li {
|
|
367
694
|
display: flex;
|
|
368
695
|
align-items: center;
|
|
369
696
|
}
|
|
370
697
|
|
|
371
|
-
#sort-selector li a {
|
|
698
|
+
#desktop-sort-selector li a {
|
|
372
699
|
text-decoration: none;
|
|
373
700
|
text-transform: uppercase;
|
|
374
701
|
font-size: 1.4rem;
|
|
375
702
|
color: #333;
|
|
703
|
+
line-height: 2.5;
|
|
376
704
|
}
|
|
377
705
|
|
|
378
|
-
#sort-selector li a.selected {
|
|
706
|
+
#desktop-sort-selector li a.selected {
|
|
379
707
|
font-weight: bold;
|
|
380
708
|
}
|
|
381
709
|
|
|
382
|
-
#sort-selector li::after {
|
|
710
|
+
#desktop-sort-selector li::after {
|
|
383
711
|
content: '•';
|
|
384
712
|
padding-left: 1rem;
|
|
385
713
|
padding-right: 1rem;
|
|
386
714
|
}
|
|
387
715
|
|
|
388
|
-
#sort-selector li:first-child::after {
|
|
716
|
+
#desktop-sort-selector li:first-child::after {
|
|
389
717
|
content: '';
|
|
390
718
|
}
|
|
391
719
|
|
|
392
|
-
#sort-selector li:last-child::after {
|
|
720
|
+
#desktop-sort-selector li:last-child::after {
|
|
393
721
|
content: '';
|
|
394
722
|
}
|
|
395
723
|
|
|
396
|
-
#display-style
|
|
724
|
+
#display-style-selector {
|
|
725
|
+
flex: 0;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
#display-style-selector button {
|
|
397
729
|
background: none;
|
|
398
730
|
color: inherit;
|
|
399
731
|
border: none;
|
|
@@ -403,11 +735,11 @@ export class SortFilterBar extends LitElement {
|
|
|
403
735
|
opacity: 0.5;
|
|
404
736
|
}
|
|
405
737
|
|
|
406
|
-
#display-style button.active {
|
|
738
|
+
#display-style-selector button.active {
|
|
407
739
|
opacity: 1;
|
|
408
740
|
}
|
|
409
741
|
|
|
410
|
-
#display-style button svg {
|
|
742
|
+
#display-style-selector button svg {
|
|
411
743
|
width: 24px;
|
|
412
744
|
height: 24px;
|
|
413
745
|
}
|