@internetarchive/collection-browser 0.0.1-alpha.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/.editorconfig +29 -0
- package/.github/workflows/ci.yml +26 -0
- package/.husky/pre-commit +4 -0
- package/LICENSE +661 -0
- package/README.md +68 -0
- package/demo/app-root.ts +414 -0
- package/demo/index.html +26 -0
- package/dist/demo/app-root.d.ts +43 -0
- package/dist/demo/app-root.js +385 -0
- package/dist/demo/app-root.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/src/assets/img/icons/audio.d.ts +1 -0
- package/dist/src/assets/img/icons/audio.js +9 -0
- package/dist/src/assets/img/icons/audio.js.map +1 -0
- package/dist/src/assets/img/icons/collection.d.ts +1 -0
- package/dist/src/assets/img/icons/collection.js +9 -0
- package/dist/src/assets/img/icons/collection.js.map +1 -0
- package/dist/src/assets/img/icons/etree.d.ts +1 -0
- package/dist/src/assets/img/icons/etree.js +9 -0
- package/dist/src/assets/img/icons/etree.js.map +1 -0
- package/dist/src/assets/img/icons/images.d.ts +1 -0
- package/dist/src/assets/img/icons/images.js +10 -0
- package/dist/src/assets/img/icons/images.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/account.d.ts +2 -0
- package/dist/src/assets/img/icons/mediatype/account.js +12 -0
- package/dist/src/assets/img/icons/mediatype/account.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/audio.js +11 -0
- package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/collection.js +9 -0
- package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/etree copy.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/etree copy.js +9 -0
- package/dist/src/assets/img/icons/mediatype/etree copy.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/etree.js +9 -0
- package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/film.js +13 -0
- package/dist/src/assets/img/icons/mediatype/film.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/images.js +10 -0
- package/dist/src/assets/img/icons/mediatype/images.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/livemusic.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/livemusic.js +7 -0
- package/dist/src/assets/img/icons/mediatype/livemusic.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/photos.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/photos.js +7 -0
- package/dist/src/assets/img/icons/mediatype/photos.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/software.js +10 -0
- package/dist/src/assets/img/icons/mediatype/software.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/texts.js +10 -0
- package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/tv.js +9 -0
- package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/video.js +10 -0
- package/dist/src/assets/img/icons/mediatype/video.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/web.js +10 -0
- package/dist/src/assets/img/icons/mediatype/web.js.map +1 -0
- package/dist/src/assets/img/icons/software.d.ts +1 -0
- package/dist/src/assets/img/icons/software.js +10 -0
- package/dist/src/assets/img/icons/software.js.map +1 -0
- package/dist/src/assets/img/icons/texts.d.ts +1 -0
- package/dist/src/assets/img/icons/texts.js +10 -0
- package/dist/src/assets/img/icons/texts.js.map +1 -0
- package/dist/src/assets/img/icons/tv.d.ts +1 -0
- package/dist/src/assets/img/icons/tv.js +9 -0
- package/dist/src/assets/img/icons/tv.js.map +1 -0
- package/dist/src/assets/img/icons/video.d.ts +1 -0
- package/dist/src/assets/img/icons/video.js +10 -0
- package/dist/src/assets/img/icons/video.js.map +1 -0
- package/dist/src/assets/img/icons/web.d.ts +1 -0
- package/dist/src/assets/img/icons/web.js +10 -0
- package/dist/src/assets/img/icons/web.js.map +1 -0
- package/dist/src/circular-activity-indicator.d.ts +5 -0
- package/dist/src/circular-activity-indicator.js +66 -0
- package/dist/src/circular-activity-indicator.js.map +1 -0
- package/dist/src/collection-browser.d.ts +151 -0
- package/dist/src/collection-browser.js +697 -0
- package/dist/src/collection-browser.js.map +1 -0
- package/dist/src/collection-facets.d.ts +34 -0
- package/dist/src/collection-facets.js +245 -0
- package/dist/src/collection-facets.js.map +1 -0
- package/dist/src/mediatype-icon.d.ts +9 -0
- package/dist/src/mediatype-icon.js +89 -0
- package/dist/src/mediatype-icon.js.map +1 -0
- package/dist/src/models.d.ts +23 -0
- package/dist/src/models.js +2 -0
- package/dist/src/models.js.map +1 -0
- package/dist/src/sort-filter-bar/alpha-bar.d.ts +10 -0
- package/dist/src/sort-filter-bar/alpha-bar.js +88 -0
- package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -0
- package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +24 -0
- package/dist/src/sort-filter-bar/sort-filter-bar.js +257 -0
- package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -0
- package/dist/src/tiles/grid/account-tile.d.ts +7 -0
- package/dist/src/tiles/grid/account-tile.js +144 -0
- package/dist/src/tiles/grid/account-tile.js.map +1 -0
- package/dist/src/tiles/grid/collection-tile.d.ts +7 -0
- package/dist/src/tiles/grid/collection-tile.js +160 -0
- package/dist/src/tiles/grid/collection-tile.js.map +1 -0
- package/dist/src/tiles/grid/icons/account.d.ts +1 -0
- package/dist/src/tiles/grid/icons/account.js +12 -0
- package/dist/src/tiles/grid/icons/account.js.map +1 -0
- package/dist/src/tiles/grid/icons/favorite-filled.d.ts +1 -0
- package/dist/src/tiles/grid/icons/favorite-filled.js +11 -0
- package/dist/src/tiles/grid/icons/favorite-filled.js.map +1 -0
- package/dist/src/tiles/grid/icons/reviews.d.ts +1 -0
- package/dist/src/tiles/grid/icons/reviews.js +11 -0
- package/dist/src/tiles/grid/icons/reviews.js.map +1 -0
- package/dist/src/tiles/grid/icons/upload.d.ts +1 -0
- package/dist/src/tiles/grid/icons/upload.js +12 -0
- package/dist/src/tiles/grid/icons/upload.js.map +1 -0
- package/dist/src/tiles/grid/icons/views.d.ts +2 -0
- package/dist/src/tiles/grid/icons/views.js +11 -0
- package/dist/src/tiles/grid/icons/views.js.map +1 -0
- package/dist/src/tiles/grid/item-tile.d.ts +9 -0
- package/dist/src/tiles/grid/item-tile.js +240 -0
- package/dist/src/tiles/grid/item-tile.js.map +1 -0
- package/dist/src/tiles/list/tile-list-compact.d.ts +16 -0
- package/dist/src/tiles/list/tile-list-compact.js +125 -0
- package/dist/src/tiles/list/tile-list-compact.js.map +1 -0
- package/dist/src/tiles/list/tile-list-detail.d.ts +17 -0
- package/dist/src/tiles/list/tile-list-detail.js +181 -0
- package/dist/src/tiles/list/tile-list-detail.js.map +1 -0
- package/dist/src/tiles/list/tile-list.d.ts +21 -0
- package/dist/src/tiles/list/tile-list.js +229 -0
- package/dist/src/tiles/list/tile-list.js.map +1 -0
- package/dist/src/tiles/loading-tile.d.ts +5 -0
- package/dist/src/tiles/loading-tile.js +73 -0
- package/dist/src/tiles/loading-tile.js.map +1 -0
- package/dist/src/tiles/tile-dispatcher.d.ts +27 -0
- package/dist/src/tiles/tile-dispatcher.js +160 -0
- package/dist/src/tiles/tile-dispatcher.js.map +1 -0
- package/dist/src/utils/format-count.d.ts +7 -0
- package/dist/src/utils/format-count.js +76 -0
- package/dist/src/utils/format-count.js.map +1 -0
- package/dist/src/utils/format-date.d.ts +2 -0
- package/dist/src/utils/format-date.js +24 -0
- package/dist/src/utils/format-date.js.map +1 -0
- package/dist/src/utils/format-string.d.ts +2 -0
- package/dist/src/utils/format-string.js +7 -0
- package/dist/src/utils/format-string.js.map +1 -0
- package/dist/test/collection-browser.test.d.ts +0 -0
- package/dist/test/collection-browser.test.js +3 -0
- package/dist/test/collection-browser.test.js.map +1 -0
- package/dist/test/utils/format-count.test.d.ts +1 -0
- package/dist/test/utils/format-count.test.js +24 -0
- package/dist/test/utils/format-count.test.js.map +1 -0
- package/dist/test/utils/format-date.test.d.ts +1 -0
- package/dist/test/utils/format-date.test.js +18 -0
- package/dist/test/utils/format-date.test.js.map +1 -0
- package/dist/test/utils/format-string.test.d.ts +1 -0
- package/dist/test/utils/format-string.test.js +17 -0
- package/dist/test/utils/format-string.test.js.map +1 -0
- package/index.ts +3 -0
- package/package.json +95 -0
- package/src/assets/img/icons/mediatype/account.ts +12 -0
- package/src/assets/img/icons/mediatype/audio.ts +11 -0
- package/src/assets/img/icons/mediatype/collection.ts +9 -0
- package/src/assets/img/icons/mediatype/etree.ts +9 -0
- package/src/assets/img/icons/mediatype/film.ts +13 -0
- package/src/assets/img/icons/mediatype/foo.svg +5 -0
- package/src/assets/img/icons/mediatype/images.ts +10 -0
- package/src/assets/img/icons/mediatype/software.ts +10 -0
- package/src/assets/img/icons/mediatype/texts.ts +10 -0
- package/src/assets/img/icons/mediatype/tv.ts +9 -0
- package/src/assets/img/icons/mediatype/video.ts +10 -0
- package/src/assets/img/icons/mediatype/web.ts +10 -0
- package/src/circular-activity-indicator.ts +64 -0
- package/src/collection-browser.ts +756 -0
- package/src/collection-facets.ts +285 -0
- package/src/mediatype-icon.ts +83 -0
- package/src/models.ts +25 -0
- package/src/sort-filter-bar/alpha-bar.ts +86 -0
- package/src/sort-filter-bar/sort-filter-bar.ts +256 -0
- package/src/tiles/grid/account-tile.ts +141 -0
- package/src/tiles/grid/collection-tile.ts +157 -0
- package/src/tiles/grid/icons/account.ts +12 -0
- package/src/tiles/grid/icons/favorite-filled.ts +11 -0
- package/src/tiles/grid/icons/reviews.ts +11 -0
- package/src/tiles/grid/icons/upload.ts +12 -0
- package/src/tiles/grid/icons/views.ts +11 -0
- package/src/tiles/grid/item-tile.ts +254 -0
- package/src/tiles/list/tile-list.ts +227 -0
- package/src/tiles/loading-tile.ts +70 -0
- package/src/tiles/tile-dispatcher.ts +160 -0
- package/src/utils/format-count.ts +95 -0
- package/src/utils/format-date.ts +36 -0
- package/test/collection-browser.test.ts +1 -0
- package/test/utils/format-count.test.ts +32 -0
- package/test/utils/format-date.test.ts +22 -0
- package/tsconfig.json +20 -0
- package/web-dev-server.config.mjs +28 -0
- package/web-test-runner.config.mjs +41 -0
package/README.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+

|
|
2
|
+
|
|
3
|
+
# Internet Archive Typescript WebComponent Template
|
|
4
|
+
|
|
5
|
+
This is a base template for creating Typescript WebComponents. It is based off of the [Open WebComponents generator](https://open-wc.org/docs/development/generator/) with some IA-specific customizations and some development niceities.
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
|
|
9
|
+
1. Click the "Use this Template" button in GitHub to create a new repository based on this one.
|
|
10
|
+
2. Clone your new repo and update the things below:
|
|
11
|
+
|
|
12
|
+
### Things to update in your copy
|
|
13
|
+
1. Remove this section
|
|
14
|
+
2. Search for the strings `your-webcomponent` and `YourWebComponent` and those are most of the spots that need to be updated.
|
|
15
|
+
3. `README.md` (this file). Update the readme in general, but also the badge URLs
|
|
16
|
+
4. `package.json` Update the name and description
|
|
17
|
+
5. Rename the `your-webcomponent.ts` and its associated `.test` file
|
|
18
|
+
|
|
19
|
+
## Local Demo with `web-dev-server`
|
|
20
|
+
```bash
|
|
21
|
+
yarn start
|
|
22
|
+
```
|
|
23
|
+
To run a local development server that serves the basic demo located in `demo/index.html`
|
|
24
|
+
|
|
25
|
+
## Testing with Web Test Runner
|
|
26
|
+
To run the suite of Web Test Runner tests, run
|
|
27
|
+
```bash
|
|
28
|
+
yarn run test
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
To run the tests in watch mode (for <abbr title="test driven development">TDD</abbr>, for example), run
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
yarn run test:watch
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Linting with ESLint, Prettier, and Types
|
|
38
|
+
To scan the project for linting errors, run
|
|
39
|
+
```bash
|
|
40
|
+
yarn run lint
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
You can lint with ESLint and Prettier individually as well
|
|
44
|
+
```bash
|
|
45
|
+
yarn run lint:eslint
|
|
46
|
+
```
|
|
47
|
+
```bash
|
|
48
|
+
yarn run lint:prettier
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
To automatically fix many linting errors, run
|
|
52
|
+
```bash
|
|
53
|
+
yarn run format
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
You can format using ESLint and Prettier individually as well
|
|
57
|
+
```bash
|
|
58
|
+
yarn run format:eslint
|
|
59
|
+
```
|
|
60
|
+
```bash
|
|
61
|
+
yarn run format:prettier
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Tooling configs
|
|
65
|
+
|
|
66
|
+
For most of the tools, the configuration is in the `package.json` to reduce the amount of files in your project.
|
|
67
|
+
|
|
68
|
+
If you customize the configuration a lot, you can consider moving them to individual files.
|
package/demo/app-root.ts
ADDED
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
import { SearchService } from '@internetarchive/search-service';
|
|
2
|
+
import { html, css, LitElement, PropertyValues } from 'lit';
|
|
3
|
+
import { customElement, query, state } from 'lit/decorators.js';
|
|
4
|
+
import {
|
|
5
|
+
SortDirection,
|
|
6
|
+
SortParam,
|
|
7
|
+
} from '@internetarchive/search-service/dist/src/search-params';
|
|
8
|
+
import { SharedResizeObserver } from '@internetarchive/shared-resize-observer';
|
|
9
|
+
import type { CollectionBrowser } from '../src/collection-browser';
|
|
10
|
+
import '../src/collection-browser';
|
|
11
|
+
import { CollectionDisplayMode } from '../src/models';
|
|
12
|
+
import { SortFilterBar } from '../src/sort-filter-bar/sort-filter-bar';
|
|
13
|
+
|
|
14
|
+
@customElement('app-root')
|
|
15
|
+
export class AppRoot extends LitElement {
|
|
16
|
+
private searchService = SearchService.default;
|
|
17
|
+
|
|
18
|
+
private resizeObserver = new SharedResizeObserver();
|
|
19
|
+
|
|
20
|
+
@state() private currentPage?: number;
|
|
21
|
+
|
|
22
|
+
@state() private searchQuery?: string;
|
|
23
|
+
|
|
24
|
+
@state() private sortParam?: SortParam;
|
|
25
|
+
|
|
26
|
+
@state() private cellWidth: number = 18;
|
|
27
|
+
|
|
28
|
+
@state() private cellHeight: number = 29;
|
|
29
|
+
|
|
30
|
+
@state() private rowGap: number = 1.7;
|
|
31
|
+
|
|
32
|
+
@state() private colGap: number = 1.7;
|
|
33
|
+
|
|
34
|
+
@query('#base-query-field') private baseQueryField!: HTMLInputElement;
|
|
35
|
+
|
|
36
|
+
@query('#page-number-input') private pageNumberInput!: HTMLInputElement;
|
|
37
|
+
|
|
38
|
+
@query('collection-browser') private collectionBrowser!: CollectionBrowser;
|
|
39
|
+
|
|
40
|
+
@query('sort-filter-bar') private sortFilterBar!: SortFilterBar;
|
|
41
|
+
|
|
42
|
+
private searchPressed(e: Event) {
|
|
43
|
+
e.preventDefault();
|
|
44
|
+
this.searchQuery = this.baseQueryField.value;
|
|
45
|
+
if ((this.currentPage ?? 1) > 1) {
|
|
46
|
+
this.collectionBrowser.goToPage(this.currentPage ?? 1);
|
|
47
|
+
}
|
|
48
|
+
this.currentPage = 1;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private changePagePressed(e: Event) {
|
|
52
|
+
e.preventDefault();
|
|
53
|
+
this.currentPage = this.pageNumberInput.valueAsNumber;
|
|
54
|
+
this.collectionBrowser.goToPage(this.currentPage);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
protected firstUpdated(): void {
|
|
58
|
+
this.loadStateFromUrl();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
protected updated(changed: PropertyValues): void {
|
|
62
|
+
if (changed.has('currentPage') && this.currentPage) {
|
|
63
|
+
this.pageNumberInput.value = this.currentPage.toString();
|
|
64
|
+
this.updateUrl();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (changed.has('searchQuery')) {
|
|
68
|
+
this.queryUpdated();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (changed.has('sortParam')) {
|
|
72
|
+
this.sortParamUpdated();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
private loadStateFromUrl() {
|
|
77
|
+
const url = new URL(window.location.href);
|
|
78
|
+
const pageNumber = url.searchParams.get('page');
|
|
79
|
+
const searchQuery = url.searchParams.get('query');
|
|
80
|
+
const sortQuery = url.searchParams.get('sort');
|
|
81
|
+
if (pageNumber) {
|
|
82
|
+
const parsed = parseInt(pageNumber, 10);
|
|
83
|
+
this.currentPage = parsed;
|
|
84
|
+
if (parsed > 1) {
|
|
85
|
+
this.collectionBrowser.goToPage(parsed);
|
|
86
|
+
}
|
|
87
|
+
} else {
|
|
88
|
+
this.currentPage = 1;
|
|
89
|
+
}
|
|
90
|
+
if (searchQuery) {
|
|
91
|
+
this.searchQuery = searchQuery;
|
|
92
|
+
} else {
|
|
93
|
+
this.searchQuery = 'collection:etree';
|
|
94
|
+
}
|
|
95
|
+
if (sortQuery) {
|
|
96
|
+
const [field, direction] = sortQuery.split(' ');
|
|
97
|
+
this.sortParam = new SortParam(field, direction as SortDirection);
|
|
98
|
+
} else {
|
|
99
|
+
this.sortParam = new SortParam('date', 'desc');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
private queryUpdated() {
|
|
104
|
+
this.collectionBrowser.baseQuery = this.searchQuery;
|
|
105
|
+
this.updateUrl();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private sortParamUpdated() {
|
|
109
|
+
if (!this.sortParam) return;
|
|
110
|
+
this.collectionBrowser.sortParam = this.sortParam;
|
|
111
|
+
this.sortFilterBar.sortDirection = this.sortParam.direction;
|
|
112
|
+
this.updateUrl();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private updateUrl() {
|
|
116
|
+
const url = new URL(window.location.href);
|
|
117
|
+
if (this.sortParam) {
|
|
118
|
+
url.searchParams.set('sort', this.sortParam.asString);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (this.searchQuery) {
|
|
122
|
+
url.searchParams.set('query', this.searchQuery);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (this.currentPage) {
|
|
126
|
+
if (this.currentPage > 1) {
|
|
127
|
+
url.searchParams.set('page', this.currentPage.toString());
|
|
128
|
+
} else {
|
|
129
|
+
url.searchParams.delete('page');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
window.history.pushState(
|
|
134
|
+
{
|
|
135
|
+
page: this.currentPage,
|
|
136
|
+
query: this.searchQuery,
|
|
137
|
+
},
|
|
138
|
+
'',
|
|
139
|
+
url.toString()
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
render() {
|
|
144
|
+
return html`
|
|
145
|
+
<div id="dev-tools">
|
|
146
|
+
<form @submit=${this.searchPressed}>
|
|
147
|
+
Query:
|
|
148
|
+
<input type="text" id="base-query-field" .value=${this.searchQuery} />
|
|
149
|
+
<input type="submit" value="Search" />
|
|
150
|
+
</form>
|
|
151
|
+
|
|
152
|
+
<form @submit=${this.changePagePressed}>
|
|
153
|
+
Page: <input type="number" value="1" id="page-number-input" />
|
|
154
|
+
<input type="submit" value="Go" />
|
|
155
|
+
</form>
|
|
156
|
+
|
|
157
|
+
<button
|
|
158
|
+
@click=${() => {
|
|
159
|
+
this.collectionBrowser.showDeleteButtons =
|
|
160
|
+
!this.collectionBrowser.showDeleteButtons;
|
|
161
|
+
}}
|
|
162
|
+
>
|
|
163
|
+
Toggle Delete Mode
|
|
164
|
+
</button>
|
|
165
|
+
|
|
166
|
+
<sort-filter-bar
|
|
167
|
+
@sortChanged=${this.sortChanged}
|
|
168
|
+
@displayModeChanged=${this.displayModeChanged}
|
|
169
|
+
@titleLetterChanged=${this.titleLetterChanged}
|
|
170
|
+
@creatorLetterChanged=${this.creatorLetterChanged}
|
|
171
|
+
></sort-filter-bar>
|
|
172
|
+
|
|
173
|
+
<div id="cell-controls">
|
|
174
|
+
<div id="cell-size-control">
|
|
175
|
+
<div>
|
|
176
|
+
<label for="cell-width-slider">Minimum cell width:</label>
|
|
177
|
+
<input
|
|
178
|
+
type="range"
|
|
179
|
+
min="10"
|
|
180
|
+
max="100"
|
|
181
|
+
value="18"
|
|
182
|
+
step="0.1"
|
|
183
|
+
id="cell-width-slider"
|
|
184
|
+
@input=${this.widthChanged}
|
|
185
|
+
/>
|
|
186
|
+
<span>${this.cellWidth}rem</span>
|
|
187
|
+
</div>
|
|
188
|
+
<div>
|
|
189
|
+
<label for="cell-height-slider">Cell height:</label>
|
|
190
|
+
<input
|
|
191
|
+
type="range"
|
|
192
|
+
min="10"
|
|
193
|
+
max="100"
|
|
194
|
+
value="29"
|
|
195
|
+
step="0.1"
|
|
196
|
+
id="cell-height-slider"
|
|
197
|
+
@input=${this.heightChanged}
|
|
198
|
+
/>
|
|
199
|
+
<span>${this.cellHeight}rem</span>
|
|
200
|
+
</div>
|
|
201
|
+
<div>
|
|
202
|
+
<label for="show-outline-check">Show outlines:</label>
|
|
203
|
+
<input
|
|
204
|
+
type="checkbox"
|
|
205
|
+
id="show-outline-check"
|
|
206
|
+
@click=${this.outlineChanged}
|
|
207
|
+
/>
|
|
208
|
+
</div>
|
|
209
|
+
</div>
|
|
210
|
+
<div id="cell-gap-control">
|
|
211
|
+
<div>
|
|
212
|
+
<label for="cell-row-gap-slider">Row gap:</label>
|
|
213
|
+
<input
|
|
214
|
+
type="range"
|
|
215
|
+
min="0"
|
|
216
|
+
max="5"
|
|
217
|
+
value="1.7"
|
|
218
|
+
step="0.1"
|
|
219
|
+
id="cell-row-gap-slider"
|
|
220
|
+
@input=${this.rowGapChanged}
|
|
221
|
+
/>
|
|
222
|
+
<span>${this.rowGap}rem</span>
|
|
223
|
+
</div>
|
|
224
|
+
<div>
|
|
225
|
+
<label for="cell-col-gap-slider">Col gap:</label>
|
|
226
|
+
<input
|
|
227
|
+
type="range"
|
|
228
|
+
min="0"
|
|
229
|
+
max="5"
|
|
230
|
+
value="1.7"
|
|
231
|
+
step="0.1"
|
|
232
|
+
id="cell-col-gap-slider"
|
|
233
|
+
@input=${this.colGapChanged}
|
|
234
|
+
/>
|
|
235
|
+
<span>${this.colGap}rem</span>
|
|
236
|
+
</div>
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
</div>
|
|
240
|
+
|
|
241
|
+
<collection-browser
|
|
242
|
+
.baseNavigationUrl=${'https://archive.org'}
|
|
243
|
+
.searchService=${this.searchService}
|
|
244
|
+
.additionalQueryClause=${this.sortFilterQueries}
|
|
245
|
+
.resizeObserver=${this.resizeObserver}
|
|
246
|
+
@visiblePageChanged=${this.visiblePageChanged}
|
|
247
|
+
>
|
|
248
|
+
</collection-browser>
|
|
249
|
+
`;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
private outlineChanged(e: Event) {
|
|
253
|
+
const target = e.target as HTMLInputElement;
|
|
254
|
+
if (target.checked) {
|
|
255
|
+
this.collectionBrowser.style.setProperty(
|
|
256
|
+
'--infiniteScrollerCellOutline',
|
|
257
|
+
'1px solid #33D1FF'
|
|
258
|
+
);
|
|
259
|
+
} else {
|
|
260
|
+
this.collectionBrowser.style.removeProperty(
|
|
261
|
+
'--infiniteScrollerCellOutline'
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
private titleSelectorVisibilityChanged(e: CustomEvent<{ visible: boolean }>) {
|
|
267
|
+
console.debug('titleSelectorVisibleChanged', e.detail);
|
|
268
|
+
if (e.detail.visible) {
|
|
269
|
+
this.sortParam = new SortParam('titleSorter', 'asc');
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
private sortByViewsPressed() {
|
|
274
|
+
this.sortParam = new SortParam('week', 'desc');
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
private creatorSelectorVisibilityChanged(
|
|
278
|
+
e: CustomEvent<{ visible: boolean }>
|
|
279
|
+
) {
|
|
280
|
+
if (e.detail.visible) {
|
|
281
|
+
this.sortParam = new SortParam('creatorSorter', 'asc');
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
private rowGapChanged(e: Event) {
|
|
286
|
+
const input = e.target as HTMLInputElement;
|
|
287
|
+
this.rowGap = parseFloat(input.value);
|
|
288
|
+
this.collectionBrowser.style.setProperty(
|
|
289
|
+
'--collectionBrowserRowGap',
|
|
290
|
+
`${input.value}rem`
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
private colGapChanged(e: Event) {
|
|
295
|
+
const input = e.target as HTMLInputElement;
|
|
296
|
+
this.colGap = parseFloat(input.value);
|
|
297
|
+
this.collectionBrowser.style.setProperty(
|
|
298
|
+
'--collectionBrowserColGap',
|
|
299
|
+
`${input.value}rem`
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
private widthChanged(e: Event) {
|
|
304
|
+
const input = e.target as HTMLInputElement;
|
|
305
|
+
this.cellWidth = parseFloat(input.value);
|
|
306
|
+
this.collectionBrowser.style.setProperty(
|
|
307
|
+
'--collectionBrowserCellMinWidth',
|
|
308
|
+
`${input.value}rem`
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
private heightChanged(e: Event) {
|
|
313
|
+
const input = e.target as HTMLInputElement;
|
|
314
|
+
this.cellHeight = parseFloat(input.value);
|
|
315
|
+
this.collectionBrowser.style.setProperty(
|
|
316
|
+
'--collectionBrowserCellMinHeight',
|
|
317
|
+
`${input.value}rem`
|
|
318
|
+
);
|
|
319
|
+
this.collectionBrowser.style.setProperty(
|
|
320
|
+
'--collectionBrowserCellMaxHeight',
|
|
321
|
+
`${input.value}rem`
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
private visiblePageChanged(e: CustomEvent<{ pageNumber: number }>) {
|
|
326
|
+
const { pageNumber } = e.detail;
|
|
327
|
+
if (pageNumber === this.currentPage) return;
|
|
328
|
+
this.currentPage = pageNumber;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
private sortChanged(e: CustomEvent<{ sort: SortParam }>) {
|
|
332
|
+
this.sortParam = e.detail.sort;
|
|
333
|
+
if ((this.currentPage ?? 1) > 1) {
|
|
334
|
+
this.collectionBrowser.goToPage(1);
|
|
335
|
+
}
|
|
336
|
+
this.currentPage = 1;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
private displayModeChanged(
|
|
340
|
+
e: CustomEvent<{ displayMode: CollectionDisplayMode }>
|
|
341
|
+
) {
|
|
342
|
+
this.collectionBrowser.displayMode = e.detail.displayMode;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
@state() titleQuery?: string;
|
|
346
|
+
|
|
347
|
+
@state() creatorQuery?: string;
|
|
348
|
+
|
|
349
|
+
private get sortFilterQueries(): string {
|
|
350
|
+
const queries = [this.titleQuery, this.creatorQuery];
|
|
351
|
+
return queries.filter(q => q).join(' AND ');
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
private titleLetterChanged(e: CustomEvent<{ selectedLetter: string }>) {
|
|
355
|
+
const letter = e.detail.selectedLetter;
|
|
356
|
+
if (letter) {
|
|
357
|
+
this.titleQuery = `firstTitle:${letter}`;
|
|
358
|
+
} else {
|
|
359
|
+
this.titleQuery = undefined;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
private creatorLetterChanged(e: CustomEvent<{ selectedLetter: string }>) {
|
|
364
|
+
const letter = e.detail.selectedLetter;
|
|
365
|
+
if (letter) {
|
|
366
|
+
this.creatorQuery = `firstCreator:${letter}`;
|
|
367
|
+
} else {
|
|
368
|
+
this.creatorQuery = undefined;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
static styles = css`
|
|
373
|
+
:host {
|
|
374
|
+
display: block;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
input,
|
|
378
|
+
button {
|
|
379
|
+
font-size: 1.6rem;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
collection-browser {
|
|
383
|
+
margin-top: 30rem;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
#base-query-field {
|
|
387
|
+
width: 300px;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
#dev-tools {
|
|
391
|
+
position: fixed;
|
|
392
|
+
top: 0;
|
|
393
|
+
left: 0;
|
|
394
|
+
z-index: 10;
|
|
395
|
+
-webkit-backdrop-filter: blur(10px);
|
|
396
|
+
backdrop-filter: blur(10px);
|
|
397
|
+
padding: 0.5rem 1rem;
|
|
398
|
+
border: 1px solid black;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
#cell-controls {
|
|
402
|
+
display: flex;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
#cell-controls label {
|
|
406
|
+
display: inline-block;
|
|
407
|
+
width: 10rem;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
#cell-gap-control {
|
|
411
|
+
margin-left: 1rem;
|
|
412
|
+
}
|
|
413
|
+
`;
|
|
414
|
+
}
|
package/demo/index.html
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en-GB">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<style>
|
|
6
|
+
html {
|
|
7
|
+
font-size: 10px; /* This is to match petabox's base font size */
|
|
8
|
+
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
body {
|
|
12
|
+
background: #fff;
|
|
13
|
+
color: #2C2C2C;
|
|
14
|
+
}
|
|
15
|
+
</style>
|
|
16
|
+
<script
|
|
17
|
+
src="https://polyfill.archive.org/v3/polyfill.min.js?features=scrollIntoView%2CElement.prototype.scrollIntoView"></script>
|
|
18
|
+
|
|
19
|
+
</head>
|
|
20
|
+
<body>
|
|
21
|
+
<app-root></app-root>
|
|
22
|
+
|
|
23
|
+
<script type="module" src="../dist/demo/app-root.js">
|
|
24
|
+
</script>
|
|
25
|
+
</body>
|
|
26
|
+
</html>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { LitElement, PropertyValues } from 'lit';
|
|
2
|
+
import '../src/collection-browser';
|
|
3
|
+
export declare class AppRoot extends LitElement {
|
|
4
|
+
private searchService;
|
|
5
|
+
private resizeObserver;
|
|
6
|
+
private currentPage?;
|
|
7
|
+
private searchQuery?;
|
|
8
|
+
private sortParam?;
|
|
9
|
+
private cellWidth;
|
|
10
|
+
private cellHeight;
|
|
11
|
+
private rowGap;
|
|
12
|
+
private colGap;
|
|
13
|
+
private baseQueryField;
|
|
14
|
+
private pageNumberInput;
|
|
15
|
+
private collectionBrowser;
|
|
16
|
+
private sortFilterBar;
|
|
17
|
+
private searchPressed;
|
|
18
|
+
private changePagePressed;
|
|
19
|
+
protected firstUpdated(): void;
|
|
20
|
+
protected updated(changed: PropertyValues): void;
|
|
21
|
+
private loadStateFromUrl;
|
|
22
|
+
private queryUpdated;
|
|
23
|
+
private sortParamUpdated;
|
|
24
|
+
private updateUrl;
|
|
25
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
26
|
+
private outlineChanged;
|
|
27
|
+
private titleSelectorVisibilityChanged;
|
|
28
|
+
private sortByViewsPressed;
|
|
29
|
+
private creatorSelectorVisibilityChanged;
|
|
30
|
+
private rowGapChanged;
|
|
31
|
+
private colGapChanged;
|
|
32
|
+
private widthChanged;
|
|
33
|
+
private heightChanged;
|
|
34
|
+
private visiblePageChanged;
|
|
35
|
+
private sortChanged;
|
|
36
|
+
private displayModeChanged;
|
|
37
|
+
titleQuery?: string;
|
|
38
|
+
creatorQuery?: string;
|
|
39
|
+
private get sortFilterQueries();
|
|
40
|
+
private titleLetterChanged;
|
|
41
|
+
private creatorLetterChanged;
|
|
42
|
+
static styles: import("lit").CSSResult;
|
|
43
|
+
}
|