@internetarchive/collection-browser 0.4.4-alpha → 0.4.4
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 +17 -2
- package/dist/src/app-root.js.map +1 -1
- package/dist/src/collection-browser.d.ts +2 -40
- package/dist/src/collection-browser.js +45 -118
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/sort-filter-bar/sort-filter-bar.js +11 -1
- package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
- package/dist/src/styles/item-image-styles.js +5 -1
- package/dist/src/styles/item-image-styles.js.map +1 -1
- package/dist/src/tiles/grid/item-tile.js +15 -2
- package/dist/src/tiles/grid/item-tile.js.map +1 -1
- package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +6 -6
- package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js.map +1 -1
- package/dist/src/tiles/grid/tile-stats.js +15 -7
- package/dist/src/tiles/grid/tile-stats.js.map +1 -1
- package/dist/src/tiles/hover/hover-pane-controller.d.ts +197 -0
- package/dist/src/tiles/hover/hover-pane-controller.js +349 -0
- package/dist/src/tiles/hover/hover-pane-controller.js.map +1 -0
- package/dist/src/tiles/hover/tile-hover-pane.d.ts +15 -0
- package/dist/src/tiles/hover/tile-hover-pane.js +88 -0
- package/dist/src/tiles/hover/tile-hover-pane.js.map +1 -0
- package/dist/src/tiles/image-block.js +4 -0
- package/dist/src/tiles/image-block.js.map +1 -1
- package/dist/src/tiles/list/date-label.js +3 -3
- package/dist/src/tiles/list/date-label.js.map +1 -1
- package/dist/src/tiles/list/tile-list-compact-header.js +4 -3
- package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -1
- package/dist/src/tiles/list/tile-list-compact.js +15 -5
- package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
- package/dist/src/tiles/list/tile-list.d.ts +2 -0
- package/dist/src/tiles/list/tile-list.js +63 -5
- package/dist/src/tiles/list/tile-list.js.map +1 -1
- package/dist/src/tiles/text-snippet-block.js +4 -4
- package/dist/src/tiles/text-snippet-block.js.map +1 -1
- package/dist/src/tiles/tile-dispatcher.d.ts +21 -2
- package/dist/src/tiles/tile-dispatcher.js +79 -9
- package/dist/src/tiles/tile-dispatcher.js.map +1 -1
- package/dist/test/collection-browser.test.js +6 -72
- package/dist/test/collection-browser.test.js.map +1 -1
- package/dist/test/sort-filter-bar/sort-filter-bar.test.js +64 -0
- package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +1 -1
- package/dist/test/tiles/grid/account-tile.test.js +1 -1
- package/dist/test/tiles/grid/account-tile.test.js.map +1 -1
- package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +1 -0
- package/dist/test/tiles/hover/hover-pane-controller.test.js +279 -0
- package/dist/test/tiles/hover/hover-pane-controller.test.js.map +1 -0
- package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +1 -0
- package/dist/test/tiles/hover/tile-hover-pane.test.js +14 -0
- package/dist/test/tiles/hover/tile-hover-pane.test.js.map +1 -0
- package/dist/test/tiles/list/tile-list.test.js +46 -1
- package/dist/test/tiles/list/tile-list.test.js.map +1 -1
- package/index.html +1 -0
- package/package.json +2 -2
- package/src/app-root.ts +17 -2
- package/src/collection-browser.ts +42 -140
- package/src/sort-filter-bar/sort-filter-bar.ts +12 -1
- package/src/styles/item-image-styles.ts +5 -1
- package/src/tiles/grid/item-tile.ts +15 -2
- package/src/tiles/grid/styles/tile-grid-shared-styles.ts +6 -6
- package/src/tiles/grid/tile-stats.ts +15 -7
- package/src/tiles/hover/hover-pane-controller.ts +469 -0
- package/src/tiles/hover/tile-hover-pane.ts +79 -0
- package/src/tiles/image-block.ts +4 -0
- package/src/tiles/list/date-label.ts +3 -3
- package/src/tiles/list/tile-list-compact-header.ts +4 -3
- package/src/tiles/list/tile-list-compact.ts +15 -5
- package/src/tiles/list/tile-list.ts +67 -5
- package/src/tiles/text-snippet-block.ts +4 -4
- package/src/tiles/tile-dispatcher.ts +95 -7
- package/test/collection-browser.test.ts +7 -101
- package/test/sort-filter-bar/sort-filter-bar.test.ts +89 -0
- package/test/tiles/grid/account-tile.test.ts +1 -1
- package/test/tiles/hover/hover-pane-controller.test.ts +349 -0
- package/test/tiles/hover/tile-hover-pane.test.ts +19 -0
- package/test/tiles/list/tile-list.test.ts +58 -1
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { expect, fixture } from '@open-wc/testing';
|
|
3
|
+
import { html, LitElement, nothing } from 'lit';
|
|
4
|
+
import { customElement, property, query } from 'lit/decorators.js';
|
|
5
|
+
import { HoverPaneController, } from '../../../src/tiles/hover/hover-pane-controller';
|
|
6
|
+
let HostElement = class HostElement extends LitElement {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(...arguments);
|
|
9
|
+
this.suppressHoverPane = false;
|
|
10
|
+
}
|
|
11
|
+
render() {
|
|
12
|
+
var _a;
|
|
13
|
+
return html ` ${(_a = this.controller) === null || _a === void 0 ? void 0 : _a.getTemplate()} `;
|
|
14
|
+
}
|
|
15
|
+
firstUpdated() {
|
|
16
|
+
this.controller = new HoverPaneController(this, this.controllerOptions);
|
|
17
|
+
}
|
|
18
|
+
getHoverPane() {
|
|
19
|
+
return this.suppressHoverPane ? undefined : this.hoverPane;
|
|
20
|
+
}
|
|
21
|
+
getHoverPaneProps() {
|
|
22
|
+
return {
|
|
23
|
+
model: {
|
|
24
|
+
collectionFilesCount: 1,
|
|
25
|
+
collections: ['foo', 'bar'],
|
|
26
|
+
collectionSize: 1,
|
|
27
|
+
commentCount: 1,
|
|
28
|
+
contentWarning: false,
|
|
29
|
+
creators: ['foo', 'bar'],
|
|
30
|
+
favCount: 1,
|
|
31
|
+
identifier: 'foo',
|
|
32
|
+
itemCount: 1,
|
|
33
|
+
loginRequired: false,
|
|
34
|
+
mediatype: 'data',
|
|
35
|
+
subjects: ['foo', 'bar'],
|
|
36
|
+
title: 'foo',
|
|
37
|
+
viewCount: 1,
|
|
38
|
+
},
|
|
39
|
+
loggedIn: false,
|
|
40
|
+
sortParam: null,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
__decorate([
|
|
45
|
+
property({ type: Object })
|
|
46
|
+
], HostElement.prototype, "controllerOptions", void 0);
|
|
47
|
+
__decorate([
|
|
48
|
+
property({ type: Boolean })
|
|
49
|
+
], HostElement.prototype, "suppressHoverPane", void 0);
|
|
50
|
+
__decorate([
|
|
51
|
+
query('tile-hover-pane')
|
|
52
|
+
], HostElement.prototype, "hoverPane", void 0);
|
|
53
|
+
HostElement = __decorate([
|
|
54
|
+
customElement('host-element')
|
|
55
|
+
], HostElement);
|
|
56
|
+
describe('Hover Pane Controller', () => {
|
|
57
|
+
let oldMatchMedia;
|
|
58
|
+
let oldOnTouchStart;
|
|
59
|
+
before(() => {
|
|
60
|
+
oldMatchMedia = window.matchMedia;
|
|
61
|
+
oldOnTouchStart = window.ontouchstart;
|
|
62
|
+
window.matchMedia = () => ({ matches: true });
|
|
63
|
+
window.ontouchstart = () => { };
|
|
64
|
+
});
|
|
65
|
+
after(() => {
|
|
66
|
+
window.matchMedia = oldMatchMedia;
|
|
67
|
+
window.ontouchstart = oldOnTouchStart;
|
|
68
|
+
});
|
|
69
|
+
it('should initially provide empty template', async () => {
|
|
70
|
+
var _a;
|
|
71
|
+
const host = await fixture(html `<host-element></host-element>`);
|
|
72
|
+
expect((_a = host.controller) === null || _a === void 0 ? void 0 : _a.getTemplate()).to.equal(nothing);
|
|
73
|
+
});
|
|
74
|
+
it('should produce a hover pane template after mousemove, and hide it after mouseleave', async () => {
|
|
75
|
+
var _a, _b;
|
|
76
|
+
const host = await fixture(html `<host-element
|
|
77
|
+
.controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
|
|
78
|
+
></host-element>`);
|
|
79
|
+
host.dispatchEvent(new MouseEvent('mousemove'));
|
|
80
|
+
// Need to wait a tick for the event handlers to run
|
|
81
|
+
await new Promise(resolve => {
|
|
82
|
+
setTimeout(resolve, 0);
|
|
83
|
+
});
|
|
84
|
+
expect((_a = host.controller) === null || _a === void 0 ? void 0 : _a.getTemplate()).not.to.equal(nothing); // Is a TemplateResult
|
|
85
|
+
host.dispatchEvent(new MouseEvent('mouseleave'));
|
|
86
|
+
// Need to wait for the fade out transition
|
|
87
|
+
await new Promise(resolve => {
|
|
88
|
+
setTimeout(resolve, 150);
|
|
89
|
+
});
|
|
90
|
+
expect((_b = host.controller) === null || _b === void 0 ? void 0 : _b.getTemplate()).to.equal(nothing);
|
|
91
|
+
});
|
|
92
|
+
it('should produce a hover pane template after mouseenter, even without mousemove', async () => {
|
|
93
|
+
var _a;
|
|
94
|
+
const host = await fixture(html `<host-element
|
|
95
|
+
.controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
|
|
96
|
+
></host-element>`);
|
|
97
|
+
host.dispatchEvent(new MouseEvent('mouseenter'));
|
|
98
|
+
// Need to wait a tick for the event handlers to run
|
|
99
|
+
await new Promise(resolve => {
|
|
100
|
+
setTimeout(resolve, 0);
|
|
101
|
+
});
|
|
102
|
+
expect((_a = host.controller) === null || _a === void 0 ? void 0 : _a.getTemplate()).not.to.equal(nothing); // Is a TemplateResult
|
|
103
|
+
});
|
|
104
|
+
it('should immediately fade back in if mouse enters while fading out', async () => {
|
|
105
|
+
var _a;
|
|
106
|
+
const host = await fixture(html `<host-element
|
|
107
|
+
.controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
|
|
108
|
+
></host-element>`);
|
|
109
|
+
// Enter the host element and wait for the show handlers to run
|
|
110
|
+
host.dispatchEvent(new MouseEvent('mousemove'));
|
|
111
|
+
await new Promise(resolve => {
|
|
112
|
+
setTimeout(resolve, 0);
|
|
113
|
+
});
|
|
114
|
+
// Leave the host element so it begins fading out, but not all the way
|
|
115
|
+
host.dispatchEvent(new MouseEvent('mouseleave'));
|
|
116
|
+
await new Promise(resolve => {
|
|
117
|
+
setTimeout(resolve, 20);
|
|
118
|
+
});
|
|
119
|
+
// Re-enter the host element and wait long enough that it would disappear
|
|
120
|
+
// if the hide were not cancelled
|
|
121
|
+
host.dispatchEvent(new MouseEvent('mousemove'));
|
|
122
|
+
await new Promise(resolve => {
|
|
123
|
+
setTimeout(resolve, 150);
|
|
124
|
+
});
|
|
125
|
+
expect((_a = host.controller) === null || _a === void 0 ? void 0 : _a.getTemplate()).not.to.equal(nothing);
|
|
126
|
+
});
|
|
127
|
+
it('should flip hover pane if it would overflow the viewport', async () => {
|
|
128
|
+
var _a, _b, _c, _d, _e;
|
|
129
|
+
const host = await fixture(html `<host-element
|
|
130
|
+
.controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
|
|
131
|
+
></host-element>`);
|
|
132
|
+
host.dispatchEvent(new MouseEvent('mousemove', { clientX: 800, clientY: 600 }));
|
|
133
|
+
// Need to wait a tick for the event handlers to run
|
|
134
|
+
await new Promise(resolve => {
|
|
135
|
+
setTimeout(resolve, 0);
|
|
136
|
+
});
|
|
137
|
+
await host.updateComplete;
|
|
138
|
+
expect((_a = host.controller) === null || _a === void 0 ? void 0 : _a.getTemplate()).not.to.equal(nothing);
|
|
139
|
+
expect((_c = (_b = host.getHoverPane()) === null || _b === void 0 ? void 0 : _b.getBoundingClientRect()) === null || _c === void 0 ? void 0 : _c.right).to.be.lessThan(window.innerWidth);
|
|
140
|
+
expect((_e = (_d = host.getHoverPane()) === null || _d === void 0 ? void 0 : _d.getBoundingClientRect()) === null || _e === void 0 ? void 0 : _e.bottom).to.be.lessThan(window.innerHeight);
|
|
141
|
+
});
|
|
142
|
+
it('should gracefully handle undefined hover pane from host element', async () => {
|
|
143
|
+
var _a, _b;
|
|
144
|
+
const host = await fixture(html `<host-element
|
|
145
|
+
.controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
|
|
146
|
+
?suppressHoverPane=${true}
|
|
147
|
+
></host-element>`);
|
|
148
|
+
host.dispatchEvent(new MouseEvent('mousemove'));
|
|
149
|
+
// Need to wait a tick for the event handlers to run
|
|
150
|
+
await new Promise(resolve => {
|
|
151
|
+
setTimeout(resolve, 0);
|
|
152
|
+
});
|
|
153
|
+
expect((_a = host.controller) === null || _a === void 0 ? void 0 : _a.getTemplate()).not.to.equal(nothing);
|
|
154
|
+
host.dispatchEvent(new MouseEvent('mouseleave'));
|
|
155
|
+
await new Promise(resolve => {
|
|
156
|
+
setTimeout(resolve, 20);
|
|
157
|
+
});
|
|
158
|
+
host.dispatchEvent(new MouseEvent('mousemove'));
|
|
159
|
+
await new Promise(resolve => {
|
|
160
|
+
setTimeout(resolve, 0);
|
|
161
|
+
});
|
|
162
|
+
host.dispatchEvent(new MouseEvent('mouseleave'));
|
|
163
|
+
// Need to wait for the fade out transition
|
|
164
|
+
await new Promise(resolve => {
|
|
165
|
+
setTimeout(resolve, 150);
|
|
166
|
+
});
|
|
167
|
+
expect((_b = host.controller) === null || _b === void 0 ? void 0 : _b.getTemplate()).to.equal(nothing);
|
|
168
|
+
});
|
|
169
|
+
describe('Touch & long-press', () => {
|
|
170
|
+
const getTouchStartEvent = (host) => new TouchEvent('touchstart', {
|
|
171
|
+
touches: [new Touch({ identifier: 0, target: host })],
|
|
172
|
+
});
|
|
173
|
+
it('should produce a hover pane after long press', async () => {
|
|
174
|
+
var _a;
|
|
175
|
+
const host = await fixture(html `<host-element
|
|
176
|
+
.controllerOptions=${{
|
|
177
|
+
showDelay: 0,
|
|
178
|
+
longPressDelay: 0,
|
|
179
|
+
enableLongPress: true,
|
|
180
|
+
}}
|
|
181
|
+
></host-element>`);
|
|
182
|
+
// Touch the host element and wait for the long press handlers to run
|
|
183
|
+
host.dispatchEvent(getTouchStartEvent(host));
|
|
184
|
+
await new Promise(resolve => {
|
|
185
|
+
setTimeout(resolve, 0);
|
|
186
|
+
});
|
|
187
|
+
expect((_a = host.controller) === null || _a === void 0 ? void 0 : _a.getTemplate()).not.to.equal(nothing); // Is a TemplateResult
|
|
188
|
+
});
|
|
189
|
+
it('should cancel a long press by moving', async () => {
|
|
190
|
+
var _a;
|
|
191
|
+
const host = await fixture(html `<host-element
|
|
192
|
+
.controllerOptions=${{
|
|
193
|
+
showDelay: 0,
|
|
194
|
+
longPressDelay: 100,
|
|
195
|
+
enableLongPress: true,
|
|
196
|
+
}}
|
|
197
|
+
></host-element>`);
|
|
198
|
+
// Touch the host element
|
|
199
|
+
host.dispatchEvent(getTouchStartEvent(host));
|
|
200
|
+
await new Promise(resolve => {
|
|
201
|
+
setTimeout(resolve, 0);
|
|
202
|
+
});
|
|
203
|
+
// Move the touch point, cancelling the long press
|
|
204
|
+
host.dispatchEvent(new TouchEvent('touchmove'));
|
|
205
|
+
await new Promise(resolve => {
|
|
206
|
+
setTimeout(resolve, 150);
|
|
207
|
+
});
|
|
208
|
+
expect((_a = host.controller) === null || _a === void 0 ? void 0 : _a.getTemplate()).to.equal(nothing);
|
|
209
|
+
});
|
|
210
|
+
it('should cancel a long press by ending touch', async () => {
|
|
211
|
+
var _a;
|
|
212
|
+
const host = await fixture(html `<host-element
|
|
213
|
+
.controllerOptions=${{
|
|
214
|
+
showDelay: 0,
|
|
215
|
+
longPressDelay: 100,
|
|
216
|
+
enableLongPress: true,
|
|
217
|
+
}}
|
|
218
|
+
></host-element>`);
|
|
219
|
+
// Touch the host element
|
|
220
|
+
host.dispatchEvent(getTouchStartEvent(host));
|
|
221
|
+
await new Promise(resolve => {
|
|
222
|
+
setTimeout(resolve, 0);
|
|
223
|
+
});
|
|
224
|
+
// Lift the touch point, cancelling the long press
|
|
225
|
+
host.dispatchEvent(new TouchEvent('touchend'));
|
|
226
|
+
await new Promise(resolve => {
|
|
227
|
+
setTimeout(resolve, 150);
|
|
228
|
+
});
|
|
229
|
+
expect((_a = host.controller) === null || _a === void 0 ? void 0 : _a.getTemplate()).to.equal(nothing);
|
|
230
|
+
});
|
|
231
|
+
it('should cancel a long press by cancelling touch (e.g., too many touch points)', async () => {
|
|
232
|
+
var _a;
|
|
233
|
+
const host = await fixture(html `<host-element
|
|
234
|
+
.controllerOptions=${{
|
|
235
|
+
showDelay: 0,
|
|
236
|
+
longPressDelay: 100,
|
|
237
|
+
enableLongPress: true,
|
|
238
|
+
}}
|
|
239
|
+
></host-element>`);
|
|
240
|
+
// Touch the host element
|
|
241
|
+
host.dispatchEvent(getTouchStartEvent(host));
|
|
242
|
+
await new Promise(resolve => {
|
|
243
|
+
setTimeout(resolve, 0);
|
|
244
|
+
});
|
|
245
|
+
// Cancel the touch point, also cancelling the long press
|
|
246
|
+
host.dispatchEvent(new TouchEvent('touchcancel'));
|
|
247
|
+
await new Promise(resolve => {
|
|
248
|
+
setTimeout(resolve, 150);
|
|
249
|
+
});
|
|
250
|
+
expect((_a = host.controller) === null || _a === void 0 ? void 0 : _a.getTemplate()).to.equal(nothing);
|
|
251
|
+
});
|
|
252
|
+
it('should close the hover pane on mobile when touching the backdrop', async () => {
|
|
253
|
+
var _a, _b, _c, _d;
|
|
254
|
+
const host = await fixture(html `<host-element
|
|
255
|
+
.controllerOptions=${{
|
|
256
|
+
showDelay: 0,
|
|
257
|
+
hideDelay: 0,
|
|
258
|
+
longPressDelay: 0,
|
|
259
|
+
enableLongPress: true,
|
|
260
|
+
mobileBreakpoint: 9999, // Ensure we get the mobile view
|
|
261
|
+
}}
|
|
262
|
+
></host-element>`);
|
|
263
|
+
// Touch the host element
|
|
264
|
+
host.dispatchEvent(getTouchStartEvent(host));
|
|
265
|
+
await new Promise(resolve => {
|
|
266
|
+
setTimeout(resolve, 0);
|
|
267
|
+
});
|
|
268
|
+
expect((_a = host.controller) === null || _a === void 0 ? void 0 : _a.getTemplate()).not.to.equal(nothing);
|
|
269
|
+
await host.updateComplete;
|
|
270
|
+
// Touch the backdrop
|
|
271
|
+
(_c = (_b = host.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#touch-backdrop')) === null || _c === void 0 ? void 0 : _c.dispatchEvent(new TouchEvent('touchstart'));
|
|
272
|
+
await new Promise(resolve => {
|
|
273
|
+
setTimeout(resolve, 150);
|
|
274
|
+
});
|
|
275
|
+
expect((_d = host.controller) === null || _d === void 0 ? void 0 : _d.getTemplate()).to.equal(nothing);
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
//# sourceMappingURL=hover-pane-controller.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hover-pane-controller.test.js","sourceRoot":"","sources":["../../../../test/tiles/hover/hover-pane-controller.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing';\nimport { html, LitElement, nothing, TemplateResult } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport {\n HoverPaneController,\n HoverPaneControllerInterface,\n HoverPaneControllerOptions,\n HoverPaneProperties,\n HoverPaneProviderInterface,\n} from '../../../src/tiles/hover/hover-pane-controller';\nimport type { TileHoverPane } from '../../../src/tiles/hover/tile-hover-pane';\n\n@customElement('host-element')\nclass HostElement extends LitElement implements HoverPaneProviderInterface {\n @property({ type: Object }) controllerOptions?: HoverPaneControllerOptions;\n\n @property({ type: Boolean }) suppressHoverPane: boolean = false;\n\n @query('tile-hover-pane') hoverPane?: TileHoverPane;\n\n controller?: HoverPaneControllerInterface;\n\n render(): TemplateResult {\n return html` ${this.controller?.getTemplate()} `;\n }\n\n protected firstUpdated(): void {\n this.controller = new HoverPaneController(this, this.controllerOptions);\n }\n\n getHoverPane(): HTMLElement | undefined {\n return this.suppressHoverPane ? undefined : this.hoverPane;\n }\n\n getHoverPaneProps(): HoverPaneProperties {\n return {\n model: {\n collectionFilesCount: 1,\n collections: ['foo', 'bar'],\n collectionSize: 1,\n commentCount: 1,\n contentWarning: false,\n creators: ['foo', 'bar'],\n favCount: 1,\n identifier: 'foo',\n itemCount: 1,\n loginRequired: false,\n mediatype: 'data',\n subjects: ['foo', 'bar'],\n title: 'foo',\n viewCount: 1,\n },\n loggedIn: false,\n sortParam: null,\n };\n }\n}\n\ndescribe('Hover Pane Controller', () => {\n let oldMatchMedia: typeof window.matchMedia;\n let oldOnTouchStart: typeof window.ontouchstart;\n\n before(() => {\n oldMatchMedia = window.matchMedia;\n oldOnTouchStart = window.ontouchstart;\n window.matchMedia = () => ({ matches: true } as MediaQueryList);\n window.ontouchstart = () => {};\n });\n\n after(() => {\n window.matchMedia = oldMatchMedia;\n window.ontouchstart = oldOnTouchStart;\n });\n\n it('should initially provide empty template', async () => {\n const host = await fixture<HostElement>(\n html`<host-element></host-element>`\n );\n expect(host.controller?.getTemplate()).to.equal(nothing);\n });\n\n it('should produce a hover pane template after mousemove, and hide it after mouseleave', async () => {\n const host = await fixture<HostElement>(\n html`<host-element\n .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}\n ></host-element>`\n );\n\n host.dispatchEvent(new MouseEvent('mousemove'));\n // Need to wait a tick for the event handlers to run\n await new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n\n expect(host.controller?.getTemplate()).not.to.equal(nothing); // Is a TemplateResult\n\n host.dispatchEvent(new MouseEvent('mouseleave'));\n // Need to wait for the fade out transition\n await new Promise(resolve => {\n setTimeout(resolve, 150);\n });\n\n expect(host.controller?.getTemplate()).to.equal(nothing);\n });\n\n it('should produce a hover pane template after mouseenter, even without mousemove', async () => {\n const host = await fixture<HostElement>(\n html`<host-element\n .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}\n ></host-element>`\n );\n\n host.dispatchEvent(new MouseEvent('mouseenter'));\n // Need to wait a tick for the event handlers to run\n await new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n\n expect(host.controller?.getTemplate()).not.to.equal(nothing); // Is a TemplateResult\n });\n\n it('should immediately fade back in if mouse enters while fading out', async () => {\n const host = await fixture<HostElement>(\n html`<host-element\n .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}\n ></host-element>`\n );\n\n // Enter the host element and wait for the show handlers to run\n host.dispatchEvent(new MouseEvent('mousemove'));\n await new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n\n // Leave the host element so it begins fading out, but not all the way\n host.dispatchEvent(new MouseEvent('mouseleave'));\n await new Promise(resolve => {\n setTimeout(resolve, 20);\n });\n\n // Re-enter the host element and wait long enough that it would disappear\n // if the hide were not cancelled\n host.dispatchEvent(new MouseEvent('mousemove'));\n await new Promise(resolve => {\n setTimeout(resolve, 150);\n });\n\n expect(host.controller?.getTemplate()).not.to.equal(nothing);\n });\n\n it('should flip hover pane if it would overflow the viewport', async () => {\n const host = await fixture<HostElement>(\n html`<host-element\n .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}\n ></host-element>`\n );\n\n host.dispatchEvent(\n new MouseEvent('mousemove', { clientX: 800, clientY: 600 })\n );\n // Need to wait a tick for the event handlers to run\n await new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n await host.updateComplete;\n\n expect(host.controller?.getTemplate()).not.to.equal(nothing);\n expect(host.getHoverPane()?.getBoundingClientRect()?.right).to.be.lessThan(\n window.innerWidth\n );\n expect(host.getHoverPane()?.getBoundingClientRect()?.bottom).to.be.lessThan(\n window.innerHeight\n );\n });\n\n it('should gracefully handle undefined hover pane from host element', async () => {\n const host = await fixture<HostElement>(\n html`<host-element\n .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}\n ?suppressHoverPane=${true}\n ></host-element>`\n );\n\n host.dispatchEvent(new MouseEvent('mousemove'));\n // Need to wait a tick for the event handlers to run\n await new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n\n expect(host.controller?.getTemplate()).not.to.equal(nothing);\n\n host.dispatchEvent(new MouseEvent('mouseleave'));\n await new Promise(resolve => {\n setTimeout(resolve, 20);\n });\n\n host.dispatchEvent(new MouseEvent('mousemove'));\n await new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n\n host.dispatchEvent(new MouseEvent('mouseleave'));\n // Need to wait for the fade out transition\n await new Promise(resolve => {\n setTimeout(resolve, 150);\n });\n\n expect(host.controller?.getTemplate()).to.equal(nothing);\n });\n\n describe('Touch & long-press', () => {\n const getTouchStartEvent = (host: EventTarget) =>\n new TouchEvent('touchstart', {\n touches: [new Touch({ identifier: 0, target: host })],\n });\n\n it('should produce a hover pane after long press', async () => {\n const host = await fixture<HostElement>(\n html`<host-element\n .controllerOptions=${{\n showDelay: 0,\n longPressDelay: 0,\n enableLongPress: true,\n }}\n ></host-element>`\n );\n\n // Touch the host element and wait for the long press handlers to run\n host.dispatchEvent(getTouchStartEvent(host));\n await new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n\n expect(host.controller?.getTemplate()).not.to.equal(nothing); // Is a TemplateResult\n });\n\n it('should cancel a long press by moving', async () => {\n const host = await fixture<HostElement>(\n html`<host-element\n .controllerOptions=${{\n showDelay: 0,\n longPressDelay: 100,\n enableLongPress: true,\n }}\n ></host-element>`\n );\n\n // Touch the host element\n host.dispatchEvent(getTouchStartEvent(host));\n await new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n\n // Move the touch point, cancelling the long press\n host.dispatchEvent(new TouchEvent('touchmove'));\n await new Promise(resolve => {\n setTimeout(resolve, 150);\n });\n\n expect(host.controller?.getTemplate()).to.equal(nothing);\n });\n\n it('should cancel a long press by ending touch', async () => {\n const host = await fixture<HostElement>(\n html`<host-element\n .controllerOptions=${{\n showDelay: 0,\n longPressDelay: 100,\n enableLongPress: true,\n }}\n ></host-element>`\n );\n\n // Touch the host element\n host.dispatchEvent(getTouchStartEvent(host));\n await new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n\n // Lift the touch point, cancelling the long press\n host.dispatchEvent(new TouchEvent('touchend'));\n await new Promise(resolve => {\n setTimeout(resolve, 150);\n });\n\n expect(host.controller?.getTemplate()).to.equal(nothing);\n });\n\n it('should cancel a long press by cancelling touch (e.g., too many touch points)', async () => {\n const host = await fixture<HostElement>(\n html`<host-element\n .controllerOptions=${{\n showDelay: 0,\n longPressDelay: 100,\n enableLongPress: true,\n }}\n ></host-element>`\n );\n\n // Touch the host element\n host.dispatchEvent(getTouchStartEvent(host));\n await new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n\n // Cancel the touch point, also cancelling the long press\n host.dispatchEvent(new TouchEvent('touchcancel'));\n await new Promise(resolve => {\n setTimeout(resolve, 150);\n });\n\n expect(host.controller?.getTemplate()).to.equal(nothing);\n });\n\n it('should close the hover pane on mobile when touching the backdrop', async () => {\n const host = await fixture<HostElement>(\n html`<host-element\n .controllerOptions=${{\n showDelay: 0,\n hideDelay: 0,\n longPressDelay: 0,\n enableLongPress: true,\n mobileBreakpoint: 9999, // Ensure we get the mobile view\n }}\n ></host-element>`\n );\n\n // Touch the host element\n host.dispatchEvent(getTouchStartEvent(host));\n await new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n\n expect(host.controller?.getTemplate()).not.to.equal(nothing);\n\n await host.updateComplete;\n\n // Touch the backdrop\n host.shadowRoot\n ?.querySelector('#touch-backdrop')\n ?.dispatchEvent(new TouchEvent('touchstart'));\n await new Promise(resolve => {\n setTimeout(resolve, 150);\n });\n\n expect(host.controller?.getTemplate()).to.equal(nothing);\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '../../../src/tiles/hover/tile-hover-pane';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { expect, fixture } from '@open-wc/testing';
|
|
2
|
+
import { html } from 'lit';
|
|
3
|
+
import '../../../src/tiles/hover/tile-hover-pane';
|
|
4
|
+
describe('Tile Hover Pane', () => {
|
|
5
|
+
it('should render initial component', async () => {
|
|
6
|
+
var _a, _b;
|
|
7
|
+
const el = await fixture(html `<tile-hover-pane></tile-hover-pane>`);
|
|
8
|
+
const container = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#container');
|
|
9
|
+
const listView = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('tile-list');
|
|
10
|
+
expect(container).to.exist;
|
|
11
|
+
expect(listView).to.exist;
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=tile-hover-pane.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tile-hover-pane.test.js","sourceRoot":"","sources":["../../../../test/tiles/hover/tile-hover-pane.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAG3B,OAAO,0CAA0C,CAAC;AAElD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;;QAC/C,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA,qCAAqC,CAC1C,CAAC;QAEF,MAAM,SAAS,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAAC,YAAY,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAAC,WAAW,CAAC,CAAC;QAE3D,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC3B,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport type { TileHoverPane } from '../../../src/tiles/hover/tile-hover-pane';\n\nimport '../../../src/tiles/hover/tile-hover-pane';\n\ndescribe('Tile Hover Pane', () => {\n it('should render initial component', async () => {\n const el = await fixture<TileHoverPane>(\n html`<tile-hover-pane></tile-hover-pane>`\n );\n\n const container = el.shadowRoot?.querySelector('#container');\n const listView = el.shadowRoot?.querySelector('tile-list');\n\n expect(container).to.exist;\n expect(listView).to.exist;\n });\n});\n"]}
|
|
@@ -6,7 +6,7 @@ import { MockCollectionNameCache } from '../../mocks/mock-collection-name-cache'
|
|
|
6
6
|
describe('List Tile', () => {
|
|
7
7
|
it('should render initial component', async () => {
|
|
8
8
|
var _a, _b, _c;
|
|
9
|
-
const el = await fixture(html `<tile-list></tile-list>`);
|
|
9
|
+
const el = await fixture(html `<tile-list .model=${{}}></tile-list>`);
|
|
10
10
|
const listContainer = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#list-line');
|
|
11
11
|
const itemTitle = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#title');
|
|
12
12
|
const imageBlock = (_c = el.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('image-block');
|
|
@@ -145,6 +145,51 @@ describe('List Tile', () => {
|
|
|
145
145
|
expect(descriptionBlock).to.exist;
|
|
146
146
|
expect((_b = descriptionBlock === null || descriptionBlock === void 0 ? void 0 : descriptionBlock.textContent) === null || _b === void 0 ? void 0 : _b.trim()).to.equal('line1 line2'); // line break replaced by space
|
|
147
147
|
});
|
|
148
|
+
it('should render mediatype icon as link to corresponding mediatype collection details', async () => {
|
|
149
|
+
var _a;
|
|
150
|
+
const model = {
|
|
151
|
+
mediatype: 'texts',
|
|
152
|
+
};
|
|
153
|
+
const el = await fixture(html `
|
|
154
|
+
<tile-list
|
|
155
|
+
.baseNavigationUrl=${'https://archive.org'}
|
|
156
|
+
.model=${model}
|
|
157
|
+
></tile-list>
|
|
158
|
+
`);
|
|
159
|
+
const mediatypeLink = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('a#icon-right');
|
|
160
|
+
expect(mediatypeLink).to.exist;
|
|
161
|
+
expect(mediatypeLink === null || mediatypeLink === void 0 ? void 0 : mediatypeLink.getAttribute('href')).to.equal(`https://archive.org/details/texts`);
|
|
162
|
+
});
|
|
163
|
+
it('should render collection mediatype icon as link to search page', async () => {
|
|
164
|
+
var _a;
|
|
165
|
+
const model = {
|
|
166
|
+
mediatype: 'collection',
|
|
167
|
+
};
|
|
168
|
+
const el = await fixture(html `
|
|
169
|
+
<tile-list
|
|
170
|
+
.baseNavigationUrl=${'https://archive.org'}
|
|
171
|
+
.model=${model}
|
|
172
|
+
></tile-list>
|
|
173
|
+
`);
|
|
174
|
+
const mediatypeLink = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('a#icon-right');
|
|
175
|
+
expect(mediatypeLink).to.exist;
|
|
176
|
+
expect(mediatypeLink === null || mediatypeLink === void 0 ? void 0 : mediatypeLink.getAttribute('href')).to.equal(`https://archive.org/search?query=mediatype:collection&sort=-downloads`);
|
|
177
|
+
});
|
|
178
|
+
it('should not render account mediatype icon as link', async () => {
|
|
179
|
+
var _a;
|
|
180
|
+
const model = {
|
|
181
|
+
mediatype: 'account',
|
|
182
|
+
};
|
|
183
|
+
const el = await fixture(html `
|
|
184
|
+
<tile-list
|
|
185
|
+
.baseNavigationUrl=${'https://archive.org'}
|
|
186
|
+
.model=${model}
|
|
187
|
+
></tile-list>
|
|
188
|
+
`);
|
|
189
|
+
const mediatypeLink = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('a#icon-right');
|
|
190
|
+
expect(mediatypeLink).to.exist;
|
|
191
|
+
expect(mediatypeLink === null || mediatypeLink === void 0 ? void 0 : mediatypeLink.getAttribute('href')).not.to.exist;
|
|
192
|
+
});
|
|
148
193
|
it('should render date added for accounts', async () => {
|
|
149
194
|
var _a, _b;
|
|
150
195
|
const el = await fixture(html `
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tile-list.test.js","sourceRoot":"","sources":["../../../../test/tiles/list/tile-list.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport { expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport type { TileList } from '../../../src/tiles/list/tile-list';\n\nimport '../../../src/tiles/list/tile-list';\nimport { MockCollectionNameCache } from '../../mocks/mock-collection-name-cache';\nimport type { TileModel } from '../../../src/models';\n\ndescribe('List Tile', () => {\n it('should render initial component', async () => {\n const el = await fixture<TileList>(html`<tile-list></tile-list>`);\n\n const listContainer = el.shadowRoot?.querySelector('#list-line');\n const itemTitle = el.shadowRoot?.querySelector('#title');\n const imageBlock = el.shadowRoot?.querySelector('image-block');\n\n expect(listContainer).to.exist;\n expect(itemTitle).to.exist;\n expect(imageBlock).to.exist;\n });\n\n it('should render the mobile template if below mobile breakpoint', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .mobileBreakpoint=${500} .currentWidth=${400}> </tile-list>\n `);\n\n const listContainer = el.shadowRoot?.getElementById('list-line');\n const topLine = el.shadowRoot?.getElementById('list-line-top');\n const bottomLine = el.shadowRoot?.getElementById('list-line-bottom');\n\n expect(listContainer).to.exist;\n expect(listContainer?.classList.contains('mobile')).to.be.true;\n expect(topLine).to.exist;\n expect(bottomLine).to.exist;\n });\n\n it('should render with creator element but not dates', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .model=${{ creators: ['someone'] }}></tile-list>\n `);\n\n const creator = el.shadowRoot?.querySelector('#creator');\n const datesLine = el.shadowRoot?.querySelector('#dates-line');\n\n expect(creator).to.exist;\n expect(datesLine?.children.length).to.equal(0);\n });\n\n it('should render with snippet block when it has snippets', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .model=${{ snippets: ['some {{{snippet}}} text'] }}>\n </tile-list>\n `);\n\n const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');\n\n expect(snippetBlock).to.exist;\n });\n\n it('should not render snippet block when no snippets are present', async () => {\n const el = await fixture<TileList>(html`<tile-list></tile-list>`);\n\n const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');\n\n expect(snippetBlock).to.not.exist;\n });\n\n it('should not render suppressed collections', async () => {\n const collectionNameCache = new MockCollectionNameCache();\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{ collections: ['deemphasize', 'community', 'foo'] }}\n .collectionNameCache=${collectionNameCache}\n >\n </tile-list>\n `);\n\n const collectionsRow = el.shadowRoot?.getElementById('collections');\n expect(collectionsRow).to.exist;\n\n const collectionLinks = collectionsRow?.querySelectorAll('a[href]');\n expect(collectionLinks?.length).to.equal(1);\n expect(collectionLinks?.item(0).getAttribute('href')).to.equal(\n '/details/foo'\n );\n });\n\n it('should not render fav- collections', async () => {\n const collectionNameCache = new MockCollectionNameCache();\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{ collections: ['fav-foo', 'bar'] }}\n .collectionNameCache=${collectionNameCache}\n >\n </tile-list>\n `);\n\n const collectionsRow = el.shadowRoot?.getElementById('collections');\n expect(collectionsRow).to.exist;\n\n const collectionLinks = collectionsRow?.querySelectorAll('a[href]');\n expect(collectionLinks?.length).to.equal(1);\n expect(collectionLinks?.item(0).getAttribute('href')).to.equal(\n '/details/bar'\n );\n });\n\n it('should render weekly views when sorting by week', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{ viewCount: 50, weeklyViewCount: 10 }}\n .sortParam=${{ field: 'week', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const viewsRow = el.shadowRoot?.getElementById('views-line');\n expect(viewsRow).to.exist;\n expect(viewsRow?.textContent?.trim()).to.equal('Views: 10');\n });\n\n it('should render added date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date('2010-01-01'),\n dateArchived: new Date('2011-01-01'),\n datePublished: new Date('2012-01-01'),\n dateReviewed: new Date('2013-01-01'),\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${model}\n .sortParam=${{ field: 'addeddate', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Added: Jan 01, 2010');\n });\n\n it('should render links to /search pages (not search.php) for subject, creator, and source', async () => {\n const model: Partial<TileModel> = {\n subjects: ['foo'],\n creators: ['bar'],\n source: 'baz',\n };\n\n const el = await fixture<TileList>(html`\n <tile-list .model=${model}></tile-list>\n `);\n\n const subjectLink = el.shadowRoot?.querySelector('#topics a[href]');\n expect(subjectLink).to.exist;\n expect(subjectLink?.getAttribute('href')).to.equal(\n `/search?query=${encodeURIComponent('subject:\"foo\"')}`\n );\n\n const creatorLink = el.shadowRoot?.querySelector('#creator a[href]');\n expect(creatorLink).to.exist;\n expect(creatorLink?.getAttribute('href')).to.equal(\n `/search?query=${encodeURIComponent('creator:\"bar\"')}`\n );\n\n const sourceLink = el.shadowRoot?.querySelector('#source a[href]');\n expect(sourceLink).to.exist;\n expect(sourceLink?.getAttribute('href')).to.equal(\n `/search?query=${encodeURIComponent('source:\"baz\"')}`\n );\n });\n\n it('should render multi-line descriptions with spaces b/w lines', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .model=${{ description: 'line1\\nline2' }}> </tile-list>\n `);\n\n const descriptionBlock = el.shadowRoot?.getElementById('description');\n expect(descriptionBlock).to.exist;\n expect(descriptionBlock?.textContent?.trim()).to.equal('line1 line2'); // line break replaced by space\n });\n\n it('should render date added for accounts', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{\n mediatype: 'account',\n dateAdded: new Date('2015-05-05T00:00:00'),\n }}\n >\n </tile-list>\n `);\n\n const creatorBlock = el.shadowRoot?.getElementById('creator');\n expect(creatorBlock).to.exist;\n expect(creatorBlock?.textContent?.trim()).to.equal('Archivist since 2015');\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"tile-list.test.js","sourceRoot":"","sources":["../../../../test/tiles/list/tile-list.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport { expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport type { TileList } from '../../../src/tiles/list/tile-list';\n\nimport '../../../src/tiles/list/tile-list';\nimport { MockCollectionNameCache } from '../../mocks/mock-collection-name-cache';\nimport type { TileModel } from '../../../src/models';\n\ndescribe('List Tile', () => {\n it('should render initial component', async () => {\n const el = await fixture<TileList>(\n html`<tile-list .model=${{}}></tile-list>`\n );\n\n const listContainer = el.shadowRoot?.querySelector('#list-line');\n const itemTitle = el.shadowRoot?.querySelector('#title');\n const imageBlock = el.shadowRoot?.querySelector('image-block');\n\n expect(listContainer).to.exist;\n expect(itemTitle).to.exist;\n expect(imageBlock).to.exist;\n });\n\n it('should render the mobile template if below mobile breakpoint', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .mobileBreakpoint=${500} .currentWidth=${400}> </tile-list>\n `);\n\n const listContainer = el.shadowRoot?.getElementById('list-line');\n const topLine = el.shadowRoot?.getElementById('list-line-top');\n const bottomLine = el.shadowRoot?.getElementById('list-line-bottom');\n\n expect(listContainer).to.exist;\n expect(listContainer?.classList.contains('mobile')).to.be.true;\n expect(topLine).to.exist;\n expect(bottomLine).to.exist;\n });\n\n it('should render with creator element but not dates', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .model=${{ creators: ['someone'] }}></tile-list>\n `);\n\n const creator = el.shadowRoot?.querySelector('#creator');\n const datesLine = el.shadowRoot?.querySelector('#dates-line');\n\n expect(creator).to.exist;\n expect(datesLine?.children.length).to.equal(0);\n });\n\n it('should render with snippet block when it has snippets', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .model=${{ snippets: ['some {{{snippet}}} text'] }}>\n </tile-list>\n `);\n\n const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');\n\n expect(snippetBlock).to.exist;\n });\n\n it('should not render snippet block when no snippets are present', async () => {\n const el = await fixture<TileList>(html`<tile-list></tile-list>`);\n\n const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');\n\n expect(snippetBlock).to.not.exist;\n });\n\n it('should not render suppressed collections', async () => {\n const collectionNameCache = new MockCollectionNameCache();\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{ collections: ['deemphasize', 'community', 'foo'] }}\n .collectionNameCache=${collectionNameCache}\n >\n </tile-list>\n `);\n\n const collectionsRow = el.shadowRoot?.getElementById('collections');\n expect(collectionsRow).to.exist;\n\n const collectionLinks = collectionsRow?.querySelectorAll('a[href]');\n expect(collectionLinks?.length).to.equal(1);\n expect(collectionLinks?.item(0).getAttribute('href')).to.equal(\n '/details/foo'\n );\n });\n\n it('should not render fav- collections', async () => {\n const collectionNameCache = new MockCollectionNameCache();\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{ collections: ['fav-foo', 'bar'] }}\n .collectionNameCache=${collectionNameCache}\n >\n </tile-list>\n `);\n\n const collectionsRow = el.shadowRoot?.getElementById('collections');\n expect(collectionsRow).to.exist;\n\n const collectionLinks = collectionsRow?.querySelectorAll('a[href]');\n expect(collectionLinks?.length).to.equal(1);\n expect(collectionLinks?.item(0).getAttribute('href')).to.equal(\n '/details/bar'\n );\n });\n\n it('should render weekly views when sorting by week', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{ viewCount: 50, weeklyViewCount: 10 }}\n .sortParam=${{ field: 'week', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const viewsRow = el.shadowRoot?.getElementById('views-line');\n expect(viewsRow).to.exist;\n expect(viewsRow?.textContent?.trim()).to.equal('Views: 10');\n });\n\n it('should render added date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date('2010-01-01'),\n dateArchived: new Date('2011-01-01'),\n datePublished: new Date('2012-01-01'),\n dateReviewed: new Date('2013-01-01'),\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${model}\n .sortParam=${{ field: 'addeddate', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Added: Jan 01, 2010');\n });\n\n it('should render links to /search pages (not search.php) for subject, creator, and source', async () => {\n const model: Partial<TileModel> = {\n subjects: ['foo'],\n creators: ['bar'],\n source: 'baz',\n };\n\n const el = await fixture<TileList>(html`\n <tile-list .model=${model}></tile-list>\n `);\n\n const subjectLink = el.shadowRoot?.querySelector('#topics a[href]');\n expect(subjectLink).to.exist;\n expect(subjectLink?.getAttribute('href')).to.equal(\n `/search?query=${encodeURIComponent('subject:\"foo\"')}`\n );\n\n const creatorLink = el.shadowRoot?.querySelector('#creator a[href]');\n expect(creatorLink).to.exist;\n expect(creatorLink?.getAttribute('href')).to.equal(\n `/search?query=${encodeURIComponent('creator:\"bar\"')}`\n );\n\n const sourceLink = el.shadowRoot?.querySelector('#source a[href]');\n expect(sourceLink).to.exist;\n expect(sourceLink?.getAttribute('href')).to.equal(\n `/search?query=${encodeURIComponent('source:\"baz\"')}`\n );\n });\n\n it('should render multi-line descriptions with spaces b/w lines', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .model=${{ description: 'line1\\nline2' }}> </tile-list>\n `);\n\n const descriptionBlock = el.shadowRoot?.getElementById('description');\n expect(descriptionBlock).to.exist;\n expect(descriptionBlock?.textContent?.trim()).to.equal('line1 line2'); // line break replaced by space\n });\n\n it('should render mediatype icon as link to corresponding mediatype collection details', async () => {\n const model: Partial<TileModel> = {\n mediatype: 'texts',\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .baseNavigationUrl=${'https://archive.org'}\n .model=${model}\n ></tile-list>\n `);\n\n const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');\n expect(mediatypeLink).to.exist;\n expect(mediatypeLink?.getAttribute('href')).to.equal(\n `https://archive.org/details/texts`\n );\n });\n\n it('should render collection mediatype icon as link to search page', async () => {\n const model: Partial<TileModel> = {\n mediatype: 'collection',\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .baseNavigationUrl=${'https://archive.org'}\n .model=${model}\n ></tile-list>\n `);\n\n const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');\n expect(mediatypeLink).to.exist;\n expect(mediatypeLink?.getAttribute('href')).to.equal(\n `https://archive.org/search?query=mediatype:collection&sort=-downloads`\n );\n });\n\n it('should not render account mediatype icon as link', async () => {\n const model: Partial<TileModel> = {\n mediatype: 'account',\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .baseNavigationUrl=${'https://archive.org'}\n .model=${model}\n ></tile-list>\n `);\n\n const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');\n expect(mediatypeLink).to.exist;\n expect(mediatypeLink?.getAttribute('href')).not.to.exist;\n });\n\n it('should render date added for accounts', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{\n mediatype: 'account',\n dateAdded: new Date('2015-05-05T00:00:00'),\n }}\n >\n </tile-list>\n `);\n\n const creatorBlock = el.shadowRoot?.getElementById('creator');\n expect(creatorBlock).to.exist;\n expect(creatorBlock?.textContent?.trim()).to.equal('Archivist since 2015');\n });\n});\n"]}
|
package/index.html
CHANGED
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"description": "The Internet Archive Collection Browser.",
|
|
4
4
|
"license": "AGPL-3.0-only",
|
|
5
5
|
"author": "Internet Archive",
|
|
6
|
-
"version": "0.4.4
|
|
6
|
+
"version": "0.4.4",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
8
|
"module": "dist/index.js",
|
|
9
9
|
"scripts": {
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"@internetarchive/collection-name-cache": "^0.2.3",
|
|
27
27
|
"@internetarchive/feature-feedback": "^0.1.4",
|
|
28
28
|
"@internetarchive/field-parsers": "^0.1.3",
|
|
29
|
-
"@internetarchive/histogram-date-range": "^0.1.
|
|
29
|
+
"@internetarchive/histogram-date-range": "^0.1.8",
|
|
30
30
|
"@internetarchive/ia-activity-indicator": "^0.0.3",
|
|
31
31
|
"@internetarchive/infinite-scroller": "^0.1.3",
|
|
32
32
|
"@internetarchive/local-cache": "^0.2.1",
|
package/src/app-root.ts
CHANGED
|
@@ -125,7 +125,7 @@ export class AppRoot extends LitElement {
|
|
|
125
125
|
<div id="dev-tools" class=${this.getClass}>
|
|
126
126
|
<div id="search-and-page-inputs">
|
|
127
127
|
<form @submit=${this.searchPressed}>
|
|
128
|
-
Query:
|
|
128
|
+
<label for="base-query-field"> Query: </label>
|
|
129
129
|
<input
|
|
130
130
|
type="text"
|
|
131
131
|
id="base-query-field"
|
|
@@ -134,7 +134,8 @@ export class AppRoot extends LitElement {
|
|
|
134
134
|
<input type="submit" value="Search" />
|
|
135
135
|
</form>
|
|
136
136
|
<form @submit=${this.changePagePressed}>
|
|
137
|
-
|
|
137
|
+
<label for="page-number-input"> Page: </label>
|
|
138
|
+
<input type="number" value="1" id="page-number-input" />
|
|
138
139
|
<input type="submit" value="Go" />
|
|
139
140
|
</form>
|
|
140
141
|
</div>
|
|
@@ -587,10 +588,24 @@ export class AppRoot extends LitElement {
|
|
|
587
588
|
cursor: pointer;
|
|
588
589
|
}
|
|
589
590
|
|
|
591
|
+
#search-and-page-inputs {
|
|
592
|
+
flex-wrap: wrap;
|
|
593
|
+
row-gap: 2px;
|
|
594
|
+
}
|
|
595
|
+
|
|
590
596
|
#search-and-page-inputs > form {
|
|
591
597
|
margin-right: 1rem;
|
|
592
598
|
}
|
|
593
599
|
|
|
600
|
+
#search-and-page-inputs label {
|
|
601
|
+
display: inline-block;
|
|
602
|
+
min-width: 50px;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
#page-number-input {
|
|
606
|
+
width: 75px;
|
|
607
|
+
}
|
|
608
|
+
|
|
594
609
|
.search-type {
|
|
595
610
|
margin-right: 1rem;
|
|
596
611
|
}
|