@internetarchive/ia-item-navigator 1.1.0 → 2.0.0-alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. package/demo/app-root.ts +190 -28
  2. package/dist/demo/app-root.d.ts +7 -3
  3. package/dist/demo/app-root.js +158 -22
  4. package/dist/demo/app-root.js.map +1 -1
  5. package/dist/index.d.ts +4 -1
  6. package/dist/index.js +5 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/src/{item-navigator.js → iaux-item-navigator.js} +3 -10
  9. package/dist/src/iaux-item-navigator.js.map +1 -0
  10. package/dist/src/menu-slider/ia-menu-slider.js +1 -1
  11. package/dist/src/menu-slider/ia-menu-slider.js.map +1 -1
  12. package/dist/src/menus/iaux-sharing-options.d.ts +28 -0
  13. package/dist/src/menus/iaux-sharing-options.js +277 -0
  14. package/dist/src/menus/iaux-sharing-options.js.map +1 -0
  15. package/dist/src/menus/iaux-viewable-files.d.ts +32 -0
  16. package/dist/src/menus/iaux-viewable-files.js +367 -0
  17. package/dist/src/menus/iaux-viewable-files.js.map +1 -0
  18. package/dist/src/menus/share-providers/email.d.ts +11 -0
  19. package/dist/src/menus/share-providers/email.js +15 -0
  20. package/dist/src/menus/share-providers/email.js.map +1 -0
  21. package/dist/src/menus/share-providers/facebook.d.ts +11 -0
  22. package/dist/src/menus/share-providers/facebook.js +15 -0
  23. package/dist/src/menus/share-providers/facebook.js.map +1 -0
  24. package/dist/src/menus/share-providers/pinterest.d.ts +11 -0
  25. package/dist/src/menus/share-providers/pinterest.js +15 -0
  26. package/dist/src/menus/share-providers/pinterest.js.map +1 -0
  27. package/dist/src/menus/share-providers/provider.d.ts +20 -0
  28. package/dist/src/menus/share-providers/provider.js +37 -0
  29. package/dist/src/menus/share-providers/provider.js.map +1 -0
  30. package/dist/src/menus/share-providers/share-provider-interface.d.ts +13 -0
  31. package/dist/src/menus/share-providers/share-provider-interface.js +2 -0
  32. package/dist/src/menus/share-providers/share-provider-interface.js.map +1 -0
  33. package/dist/src/menus/share-providers/tumblr.d.ts +11 -0
  34. package/dist/src/menus/share-providers/tumblr.js +15 -0
  35. package/dist/src/menus/share-providers/tumblr.js.map +1 -0
  36. package/dist/src/menus/share-providers/twitter.d.ts +11 -0
  37. package/dist/src/menus/share-providers/twitter.js +15 -0
  38. package/dist/src/menus/share-providers/twitter.js.map +1 -0
  39. package/dist/test/iaux-item-navigator.test.d.ts +1 -0
  40. package/dist/test/{ia-item-navigator.test.js → iaux-item-navigator.test.js} +49 -27
  41. package/dist/test/iaux-item-navigator.test.js.map +1 -0
  42. package/dist/test/iaux-sharing-options.test.d.ts +1 -0
  43. package/dist/test/iaux-sharing-options.test.js +64 -0
  44. package/dist/test/iaux-sharing-options.test.js.map +1 -0
  45. package/index.ts +9 -1
  46. package/package.json +11 -4
  47. package/src/{item-navigator.ts → iaux-item-navigator.ts} +2 -10
  48. package/src/menu-slider/ia-menu-slider.ts +1 -1
  49. package/src/menus/foo.json +84 -0
  50. package/src/menus/iaux-sharing-options.ts +281 -0
  51. package/src/menus/iaux-viewable-files.ts +377 -0
  52. package/src/menus/share-providers/email.ts +23 -0
  53. package/src/menus/share-providers/facebook.ts +23 -0
  54. package/src/menus/share-providers/pinterest.ts +23 -0
  55. package/src/menus/share-providers/provider.ts +63 -0
  56. package/src/menus/share-providers/share-provider-interface.ts +17 -0
  57. package/src/menus/share-providers/tumblr.ts +23 -0
  58. package/src/menus/share-providers/twitter.ts +23 -0
  59. package/test/ia-sharing-options.test.js +78 -0
  60. package/test/{ia-item-navigator.test.ts → iaux-item-navigator.test.ts} +49 -27
  61. package/test/iaux-sharing-options.test.ts +84 -0
  62. package/dist/src/item-navigator.js.map +0 -1
  63. package/dist/test/ia-item-navigator.test.d.ts +0 -1
  64. package/dist/test/ia-item-navigator.test.js.map +0 -1
  65. /package/dist/src/{item-navigator.d.ts → iaux-item-navigator.d.ts} +0 -0
@@ -0,0 +1,15 @@
1
+ import '@internetarchive/icon-twitter/icon-twitter';
2
+ import { html } from 'lit';
3
+ import Provider from './provider';
4
+ export default class TwitterProvider extends Provider {
5
+ constructor(params) {
6
+ super(params);
7
+ this.name = 'Twitter';
8
+ this.icon = html `<ia-icon-twitter></ia-icon-twitter>`;
9
+ this.class = 'twitter';
10
+ }
11
+ get url() {
12
+ return `https://twitter.com/intent/tweet?url=https://${this.baseHost}/details/${this.itemPath}&via=internetarchive&text=${this.encodedDescription}+%3A+${this.encodedCreator}${this.encodedPromoCopy}`;
13
+ }
14
+ }
15
+ //# sourceMappingURL=twitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twitter.js","sourceRoot":"","sources":["../../../../src/menus/share-providers/twitter.ts"],"names":[],"mappings":"AAAA,OAAO,4CAA4C,CAAC;AACpD,OAAO,EAAkB,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3C,OAAO,QAAQ,MAAM,YAAY,CAAC;AAGlC,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,QAAQ;IAOnD,YAAY,MAAsB;QAChC,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA,qCAAqC,CAAC;QACtD,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,IAAa,GAAG;QACd,OAAO,gDAAgD,IAAI,CAAC,QAAQ,YAAY,IAAI,CAAC,QAAQ,6BAA6B,IAAI,CAAC,kBAAkB,QAAQ,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACzM,CAAC;CACF","sourcesContent":["import '@internetarchive/icon-twitter/icon-twitter';\nimport { TemplateResult, html } from 'lit';\nimport Provider from './provider';\nimport { ProviderParams } from './share-provider-interface';\n\nexport default class TwitterProvider extends Provider {\n name: string;\n\n icon: TemplateResult;\n\n class: string;\n\n constructor(params: ProviderParams) {\n super(params);\n this.name = 'Twitter';\n this.icon = html`<ia-icon-twitter></ia-icon-twitter>`;\n this.class = 'twitter';\n }\n\n override get url(): string {\n return `https://twitter.com/intent/tweet?url=https://${this.baseHost}/details/${this.itemPath}&via=internetarchive&text=${this.encodedDescription}+%3A+${this.encodedCreator}${this.encodedPromoCopy}`;\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ import '../src/iaux-item-navigator';
@@ -3,8 +3,8 @@ import { html, fixture, expect } from '@open-wc/testing';
3
3
  import Sinon from 'sinon';
4
4
  import { SharedResizeObserver } from '@internetarchive/shared-resize-observer';
5
5
  import { ModalManager } from '@internetarchive/modal-manager';
6
- import '../src/item-navigator';
7
- import { ItemStub, menuProvider, shortcut } from '../test/ia-stub';
6
+ import '../src/iaux-item-navigator';
7
+ import { ItemStub, menuProvider, shortcut } from './ia-stub';
8
8
  afterEach(() => {
9
9
  Sinon.restore();
10
10
  });
@@ -12,7 +12,9 @@ describe('ItemNavigator', () => {
12
12
  describe('Theaters', () => {
13
13
  it('shows <ia-no-theater-available> if told', async () => {
14
14
  var _a;
15
- const el = await fixture(html `<ia-item-navigator .item=${new ItemStub()}></ia-item-navigator>`);
15
+ const el = await fixture(html `<iaux-item-navigator
16
+ .item=${new ItemStub()}
17
+ ></iaux-item-navigator>`);
16
18
  el.viewAvailable = false;
17
19
  await el.updateComplete;
18
20
  expect(el.viewAvailable).to.be.false;
@@ -20,7 +22,9 @@ describe('ItemNavigator', () => {
20
22
  });
21
23
  it('opens main slot by default', async () => {
22
24
  var _a, _b;
23
- const el = await fixture(html `<ia-item-navigator .item=${new ItemStub()}></ia-item-navigator>`);
25
+ const el = await fixture(html `<iaux-item-navigator
26
+ .item=${new ItemStub()}
27
+ ></iaux-item-navigator>`);
24
28
  expect(el.viewAvailable).to.be.true;
25
29
  expect((_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('ia-no-theater-available')).to.be
26
30
  .null;
@@ -30,18 +34,20 @@ describe('ItemNavigator', () => {
30
34
  describe('`el.loaded`', () => {
31
35
  it('toggles the spinning loader', async () => {
32
36
  var _a;
33
- const el = await fixture(html `<ia-item-navigator></ia-item-navigator>`);
37
+ const el = await fixture(html `<iaux-item-navigator></iaux-item-navigator>`);
34
38
  expect(el.loaded).to.be.null; // initial load
35
39
  expect((_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('ia-itemnav-loader')).to.exist;
36
40
  });
37
41
  it('hides reader section if `!loaded`', async () => {
38
42
  var _a, _b;
39
- const el = await fixture(html `<ia-item-navigator></ia-item-navigator>`);
43
+ const el = await fixture(html `<iaux-item-navigator></iaux-item-navigator>`);
40
44
  expect((_b = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#reader')) === null || _b === void 0 ? void 0 : _b.getAttribute('class')).to.contain('hidden');
41
45
  });
42
46
  it('shows reader when `loaded` ', async () => {
43
47
  var _a, _b;
44
- const el = await fixture(html `<ia-item-navigator .item=${new ItemStub()}></ia-item-navigator>`);
48
+ const el = await fixture(html `<iaux-item-navigator
49
+ .item=${new ItemStub()}
50
+ ></iaux-item-navigator>`);
45
51
  el.loaded = true;
46
52
  await el.updateComplete;
47
53
  const mainTheaterSection = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#reader');
@@ -52,7 +58,7 @@ describe('ItemNavigator', () => {
52
58
  expect((_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('slot[name="main"]')).to.exist;
53
59
  });
54
60
  it('listens to `@loadingStateUpdated` to update `loaded` for <no-theater-available>', async () => {
55
- const el = await fixture(html `<ia-item-navigator></ia-item-navigator>`);
61
+ const el = await fixture(html `<iaux-item-navigator></iaux-item-navigator>`);
56
62
  await el.updateComplete;
57
63
  const spy = Sinon.spy();
58
64
  el.loadingStateUpdated = spy;
@@ -70,32 +76,32 @@ describe('ItemNavigator', () => {
70
76
  describe('`el.sharedObserver`', () => {
71
77
  it('uses one', async () => {
72
78
  const sharedObserver = new SharedResizeObserver();
73
- const el = await fixture(html `<ia-item-navigator
79
+ const el = await fixture(html `<iaux-item-navigator
74
80
  .sharedObserver=${sharedObserver}
75
- ></ia-item-navigator>`);
81
+ ></iaux-item-navigator>`);
76
82
  expect(el.sharedObserver).to.equal(sharedObserver);
77
83
  expect(typeof el.handleResize).to.equal('function');
78
84
  });
79
85
  it('freshly registers handlers', async () => {
80
86
  const sharedObserver = new SharedResizeObserver();
81
87
  const addObserverSpy = Sinon.spy(sharedObserver, 'addObserver');
82
- await fixture(html `<ia-item-navigator
88
+ await fixture(html `<iaux-item-navigator
83
89
  .sharedObserver=${sharedObserver}
84
- ></ia-item-navigator>`);
90
+ ></iaux-item-navigator>`);
85
91
  expect(addObserverSpy.callCount).to.equal(2);
86
92
  });
87
93
  it('removes handler when component disconnects', async () => {
88
94
  const sharedObserver = new SharedResizeObserver();
89
95
  const removeObserverSpy = Sinon.spy(sharedObserver, 'removeObserver');
90
- const el = await fixture(html `<ia-item-navigator
96
+ const el = await fixture(html `<iaux-item-navigator
91
97
  .sharedObserver=${sharedObserver}
92
- ></ia-item-navigator>`);
98
+ ></iaux-item-navigator>`);
93
99
  el.disconnectedCallback();
94
100
  await el.updateComplete;
95
101
  expect(removeObserverSpy.callCount).to.equal(1);
96
102
  });
97
103
  it('sets menu to overlay if container width is <= 600px', async () => {
98
- const el = await fixture(html `<ia-item-navigator></ia-item-navigator>`);
104
+ const el = await fixture(html `<iaux-item-navigator></iaux-item-navigator>`);
99
105
  expect(el.openMenuState).to.equal('shift'); // as starting point
100
106
  const overlaySize = {
101
107
  contentRect: { width: 600 },
@@ -114,21 +120,21 @@ describe('ItemNavigator', () => {
114
120
  describe('`el.modal`', () => {
115
121
  it('uses one', async () => {
116
122
  const modal = new ModalManager();
117
- const el = await fixture(html `<ia-item-navigator .modal=${modal}></ia-item-navigator>`);
123
+ const el = await fixture(html `<iaux-item-navigator .modal=${modal}></iaux-item-navigator>`);
118
124
  expect(el.modal).to.equal(modal);
119
125
  });
120
126
  });
121
127
  describe('full browser window immersion "fullscreen"', () => {
122
128
  it('creates reflected attribute `viewportinfullscreen`', async () => {
123
129
  /** to help with external styling adjustmnents */
124
- const el = await fixture(html `<ia-item-navigator></ia-item-navigator>`);
130
+ const el = await fixture(html `<iaux-item-navigator></iaux-item-navigator>`);
125
131
  expect(el.getAttribute('viewportinfullscreen')).to.be.null;
126
132
  el.viewportInFullscreen = true;
127
133
  await el.updateComplete;
128
134
  expect(el.getAttribute('viewportinfullscreen')).to.exist;
129
135
  });
130
136
  it('@ViewportInFullScreen', async () => {
131
- const el = await fixture(html `<ia-item-navigator></ia-item-navigator>`);
137
+ const el = await fixture(html `<iaux-item-navigator></iaux-item-navigator>`);
132
138
  expect(el.viewportInFullscreen).to.be.null;
133
139
  const yesFullscreenEvent = {
134
140
  detail: {
@@ -152,7 +158,9 @@ describe('ItemNavigator', () => {
152
158
  describe('el.menuOpened', () => {
153
159
  it('toggles side menu open', async () => {
154
160
  var _a, _b, _c;
155
- const el = await fixture(html `<ia-item-navigator .item=${new ItemStub()}></ia-item-navigator>`);
161
+ const el = await fixture(html `<iaux-item-navigator
162
+ .item=${new ItemStub()}
163
+ ></iaux-item-navigator>`);
156
164
  el.menuContents = [menuProvider];
157
165
  await el.updateComplete;
158
166
  const nav = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('nav');
@@ -168,7 +176,9 @@ describe('ItemNavigator', () => {
168
176
  });
169
177
  it('opens menu shortcut with `@manageSideMenuEvents`', async () => {
170
178
  var _a;
171
- const el = await fixture(html `<ia-item-navigator .item=${new ItemStub()}></ia-item-navigator>`);
179
+ const el = await fixture(html `<iaux-item-navigator
180
+ .item=${new ItemStub()}
181
+ ></iaux-item-navigator>`);
172
182
  const detail = {
173
183
  menuId: 'fullscreen',
174
184
  action: 'open',
@@ -219,7 +229,9 @@ describe('ItemNavigator', () => {
219
229
  describe('el.menuContents', () => {
220
230
  it('draws side menu when populated', async () => {
221
231
  var _a;
222
- const el = await fixture(html `<ia-item-navigator .item=${new ItemStub()}></ia-item-navigator>`);
232
+ const el = await fixture(html `<iaux-item-navigator
233
+ .item=${new ItemStub()}
234
+ ></iaux-item-navigator>`);
223
235
  el.menuContents = [menuProvider];
224
236
  await el.updateComplete;
225
237
  expect(el.menuContents.length).to.exist;
@@ -235,7 +247,9 @@ describe('ItemNavigator', () => {
235
247
  describe('`el.menuShortcuts`', () => {
236
248
  it('displays shortcut & toggle side menu button', async () => {
237
249
  var _a;
238
- const el = await fixture(html `<ia-item-navigator .item=${new ItemStub()}></ia-item-navigator>`);
250
+ const el = await fixture(html `<iaux-item-navigator
251
+ .item=${new ItemStub()}
252
+ ></iaux-item-navigator>`);
239
253
  const anotherShortcut = {
240
254
  id: 'foo',
241
255
  icon: html `<i class="foo-shortcut"></i>`,
@@ -255,7 +269,9 @@ describe('ItemNavigator', () => {
255
269
  });
256
270
  describe('Menu events', () => {
257
271
  it('`el.setMenuShortcuts`', async () => {
258
- const el = await fixture(html `<ia-item-navigator .item=${new ItemStub()}></ia-item-navigator>`);
272
+ const el = await fixture(html `<iaux-item-navigator
273
+ .item=${new ItemStub()}
274
+ ></iaux-item-navigator>`);
259
275
  expect(el.menuShortcuts.length).to.equal(0);
260
276
  const menuShortcuts = [shortcut];
261
277
  el.setMenuShortcuts({
@@ -265,7 +281,9 @@ describe('ItemNavigator', () => {
265
281
  expect(el.menuShortcuts.length).to.equal(1);
266
282
  });
267
283
  it('`el.setMenuContents`', async () => {
268
- const el = await fixture(html `<ia-item-navigator .item=${new ItemStub()}></ia-item-navigator>`);
284
+ const el = await fixture(html `<iaux-item-navigator
285
+ .item=${new ItemStub()}
286
+ ></iaux-item-navigator>`);
269
287
  expect(el.menuContents.length).to.equal(0);
270
288
  el.setMenuShortcuts({
271
289
  detail: [menuProvider],
@@ -274,7 +292,9 @@ describe('ItemNavigator', () => {
274
292
  expect(el.menuShortcuts.length).to.equal(1);
275
293
  });
276
294
  it('`el.setOpenMenu`', async () => {
277
- const el = await fixture(html `<ia-item-navigator .item=${new ItemStub()}></ia-item-navigator>`);
295
+ const el = await fixture(html `<iaux-item-navigator
296
+ .item=${new ItemStub()}
297
+ ></iaux-item-navigator>`);
278
298
  el.setOpenMenu({
279
299
  detail: { id: 'foo' },
280
300
  });
@@ -290,7 +310,9 @@ describe('ItemNavigator', () => {
290
310
  expect(el.selectedMenuId).to.equal('');
291
311
  });
292
312
  it('`el.closeMenu`', async () => {
293
- const el = await fixture(html `<ia-item-navigator .item=${new ItemStub()}></ia-item-navigator>`);
313
+ const el = await fixture(html `<iaux-item-navigator
314
+ .item=${new ItemStub()}
315
+ ></iaux-item-navigator>`);
294
316
  el.menuOpened = true;
295
317
  await el.updateComplete;
296
318
  expect(el.menuOpened).to.be.true;
@@ -300,4 +322,4 @@ describe('ItemNavigator', () => {
300
322
  });
301
323
  });
302
324
  });
303
- //# sourceMappingURL=ia-item-navigator.test.js.map
325
+ //# sourceMappingURL=iaux-item-navigator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iaux-item-navigator.test.js","sourceRoot":"","sources":["../../test/iaux-item-navigator.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable camelcase */\nimport { html, fixture, expect } from '@open-wc/testing';\nimport Sinon from 'sinon';\n\nimport { SharedResizeObserver } from '@internetarchive/shared-resize-observer';\nimport { ModalManager } from '@internetarchive/modal-manager';\nimport { ItemNavigator } from '../src/iaux-item-navigator';\nimport '../src/iaux-item-navigator';\n\nimport { ItemStub, menuProvider, shortcut } from './ia-stub';\nimport {\n ManageFullscreenEvent,\n ToggleSideMenuOpenEvent,\n SetSideMenuContentsEvent,\n SetSideMenuShortcutsEvent,\n ToggleSidePanelOpenEvent,\n} from '../src/interfaces/event-interfaces';\n\nafterEach(() => {\n Sinon.restore();\n});\n\ndescribe('ItemNavigator', () => {\n describe('Theaters', () => {\n it('shows <ia-no-theater-available> if told', async () => {\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator\n .item=${new ItemStub()}\n ></iaux-item-navigator>`,\n );\n el.viewAvailable = false;\n await el.updateComplete;\n expect(el.viewAvailable).to.be.false;\n expect(el.shadowRoot?.querySelector('ia-no-theater-available')).to.exist;\n });\n it('opens main slot by default', async () => {\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator\n .item=${new ItemStub()}\n ></iaux-item-navigator>`,\n );\n\n expect(el.viewAvailable).to.be.true;\n expect(el.shadowRoot?.querySelector('ia-no-theater-available')).to.be\n .null;\n expect(el.shadowRoot?.querySelector('slot[name=\"main\"]')).to.exist;\n });\n });\n describe('`el.loaded`', () => {\n it('toggles the spinning loader', async () => {\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator></iaux-item-navigator>`,\n );\n expect(el.loaded).to.be.null; // initial load\n expect(el.shadowRoot?.querySelector('ia-itemnav-loader')).to.exist;\n });\n it('hides reader section if `!loaded`', async () => {\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator></iaux-item-navigator>`,\n );\n\n expect(\n el.shadowRoot?.querySelector('#reader')?.getAttribute('class'),\n ).to.contain('hidden');\n });\n it('shows reader when `loaded` ', async () => {\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator\n .item=${new ItemStub()}\n ></iaux-item-navigator>`,\n );\n\n el.loaded = true;\n await el.updateComplete;\n const mainTheaterSection = el.shadowRoot?.querySelector('#reader');\n expect(mainTheaterSection?.classList.contains('hide')).to.be.false;\n expect(el.loaded).to.be.true;\n // `loaded` property is reflected as DOM attribute\n expect(el.hasAttribute('loaded')).to.equal(true);\n expect(el.shadowRoot?.querySelector('slot[name=\"main\"]')).to.exist;\n });\n it('listens to `@loadingStateUpdated` to update `loaded` for <no-theater-available>', async () => {\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator></iaux-item-navigator>`,\n );\n\n await el.updateComplete;\n const spy = Sinon.spy();\n el.loadingStateUpdated = spy;\n el.loaded = null;\n el.viewAvailable = false;\n await el.updateComplete;\n // check base properties\n expect(el.loaded).to.equal(null);\n expect(el.item).to.be.undefined;\n\n // spy fires\n expect(spy.called).to.equal(true);\n expect(spy.callCount).to.equal(1);\n });\n });\n\n describe('`el.sharedObserver`', () => {\n it('uses one', async () => {\n const sharedObserver = new SharedResizeObserver();\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator\n .sharedObserver=${sharedObserver}\n ></iaux-item-navigator>`,\n );\n\n expect(el.sharedObserver).to.equal(sharedObserver);\n expect(typeof el.handleResize).to.equal('function');\n });\n it('freshly registers handlers', async () => {\n const sharedObserver = new SharedResizeObserver();\n const addObserverSpy = Sinon.spy(sharedObserver, 'addObserver');\n\n await fixture<ItemNavigator>(\n html`<iaux-item-navigator\n .sharedObserver=${sharedObserver}\n ></iaux-item-navigator>`,\n );\n\n expect(addObserverSpy.callCount).to.equal(2);\n });\n it('removes handler when component disconnects', async () => {\n const sharedObserver = new SharedResizeObserver();\n const removeObserverSpy = Sinon.spy(sharedObserver, 'removeObserver');\n\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator\n .sharedObserver=${sharedObserver}\n ></iaux-item-navigator>`,\n );\n\n el.disconnectedCallback();\n await el.updateComplete;\n\n expect(removeObserverSpy.callCount).to.equal(1);\n });\n it('sets menu to overlay if container width is <= 600px', async () => {\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator></iaux-item-navigator>`,\n );\n\n expect(el.openMenuState).to.equal('shift'); // as starting point\n\n const overlaySize = {\n contentRect: { width: 600 },\n } as ResizeObserverEntry;\n el.handleResize(overlaySize);\n await el.updateComplete;\n\n expect(el.openMenuState).to.equal('overlay'); // changes open menu display to an overlay\n\n const shiftSize = {\n contentRect: { width: 601 },\n } as ResizeObserverEntry;\n el.handleResize(shiftSize);\n await el.updateComplete;\n\n expect(el.openMenuState).to.equal('shift');\n });\n });\n\n describe('`el.modal`', () => {\n it('uses one', async () => {\n const modal = new ModalManager();\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator .modal=${modal}></iaux-item-navigator>`,\n );\n expect(el.modal).to.equal(modal);\n });\n });\n\n describe('full browser window immersion \"fullscreen\"', () => {\n it('creates reflected attribute `viewportinfullscreen`', async () => {\n /** to help with external styling adjustmnents */\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator></iaux-item-navigator>`,\n );\n expect(el.getAttribute('viewportinfullscreen')).to.be.null;\n\n el.viewportInFullscreen = true;\n await el.updateComplete;\n\n expect(el.getAttribute('viewportinfullscreen')).to.exist;\n });\n it('@ViewportInFullScreen', async () => {\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator></iaux-item-navigator>`,\n );\n expect(el.viewportInFullscreen).to.be.null;\n\n const yesFullscreenEvent = {\n detail: {\n isFullScreen: true,\n },\n } as ManageFullscreenEvent;\n el.manageViewportFullscreen(yesFullscreenEvent);\n await el.updateComplete;\n expect(el.viewportInFullscreen).to.be.true;\n\n const noFullscreenEvent = {\n detail: {\n isFullScreen: false,\n },\n } as ManageFullscreenEvent;\n el.manageViewportFullscreen(noFullscreenEvent);\n await el.updateComplete;\n expect(el.viewportInFullscreen).to.be.null;\n });\n });\n\n /* Side menu & shortcuts tests */\n describe('el.menuOpened', () => {\n it('toggles side menu open', async () => {\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator\n .item=${new ItemStub()}\n ></iaux-item-navigator>`,\n );\n\n el.menuContents = [menuProvider];\n await el.updateComplete;\n\n const nav = el.shadowRoot?.querySelector('nav');\n\n expect(nav?.querySelector('#menu')).to.exist;\n // side menu starts closed\n expect(el.menuOpened).to.be.false;\n expect(nav?.querySelector('#menu')?.getAttribute('class')).to.contain(\n 'hidden',\n );\n\n // let's open menu\n el.toggleMenu();\n await el.updateComplete;\n\n expect(el.menuOpened).to.be.true;\n expect(nav?.querySelector('#menu')?.getAttribute('class')).to.not.contain(\n 'hidden',\n );\n });\n\n it('opens menu shortcut with `@manageSideMenuEvents`', async () => {\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator\n .item=${new ItemStub()}\n ></iaux-item-navigator>`,\n );\n const detail = {\n menuId: 'fullscreen',\n action: 'open',\n };\n\n el.menuContents = [menuProvider];\n await el.updateComplete;\n const frame = el.shadowRoot?.querySelector('#frame');\n // default menu open behavior is to side menu open, not overlay\n expect(frame?.getAttribute('class')).to.contain('shift');\n\n expect(el.menuOpened).to.be.false;\n expect(el.openMenu).to.be.undefined;\n expect(frame?.getAttribute('class')).to.not.contain('open');\n\n const event = new CustomEvent('updateSideMenu', {\n detail,\n }) as ToggleSideMenuOpenEvent;\n el.manageSideMenuEvents(event);\n await el.updateComplete;\n\n expect(el.shouldRenderMenu).to.be.true;\n expect(el.menuOpened).to.be.true;\n expect(el.openMenu).to.equal(detail.menuId);\n\n expect(frame?.getAttribute('class')).to.contain('open');\n\n // no menu provided\n const openShortcutSpy = Sinon.spy(el, 'openShortcut');\n const toggleMenuSpy = Sinon.spy(el, 'toggleMenu');\n\n const noMenuProvidedEvent = new CustomEvent('updateSideMenu', {\n detail: {},\n }) as any;\n el.manageSideMenuEvents(noMenuProvidedEvent);\n await el.updateComplete;\n\n expect(openShortcutSpy.called).to.be.false;\n expect(toggleMenuSpy.called).to.be.false;\n\n // toggle menu\n const toggleMenuEvent = new CustomEvent('updateSideMenu', {\n detail: { action: 'toggle', menuId: 'fullscreen' },\n }) as any;\n el.manageSideMenuEvents(toggleMenuEvent);\n await el.updateComplete;\n\n expect(toggleMenuSpy.callCount).to.equal(1);\n\n // open menu\n const openMenuEvent = new CustomEvent('updateSideMenu', {\n detail: { action: 'open', menuId: 'fullscreen' },\n }) as any;\n el.manageSideMenuEvents(openMenuEvent);\n await el.updateComplete;\n\n expect(openShortcutSpy.callCount).to.equal(1);\n });\n });\n\n describe('el.menuContents', () => {\n it('draws side menu when populated', async () => {\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator\n .item=${new ItemStub()}\n ></iaux-item-navigator>`,\n );\n\n el.menuContents = [menuProvider];\n await el.updateComplete;\n expect(el.menuContents.length).to.exist;\n expect(el.shouldRenderMenu).to.be.true;\n\n const nav = el.shadowRoot?.querySelector('nav');\n expect(nav).to.exist;\n\n const menuSlider = nav?.querySelector('ia-menu-slider');\n expect(menuSlider).to.exist;\n expect(menuSlider?.getAttribute('manuallyhandleclose')).to.exist;\n expect(menuSlider?.getAttribute('open')).to.exist;\n });\n });\n\n describe('`el.menuShortcuts`', () => {\n it('displays shortcut & toggle side menu button', async () => {\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator\n .item=${new ItemStub()}\n ></iaux-item-navigator>`,\n );\n\n const anotherShortcut = {\n id: 'foo',\n icon: html`<i class=\"foo-shortcut\"></i>`,\n };\n el.menuContents = [menuProvider];\n el.menuShortcuts = [shortcut, anotherShortcut];\n await el.updateComplete;\n\n const nav = el.shadowRoot?.querySelector('nav');\n\n const shortcutsContainer = nav?.querySelector('.shortcuts');\n expect(el.menuShortcuts.length).to.exist;\n expect(nav).to.exist;\n expect(shortcutsContainer).to.exist;\n expect(shortcutsContainer?.querySelector('i.fullscreen-test')).to.exist;\n expect(shortcutsContainer?.querySelector('button.shortcut.foo')).to.exist;\n expect(nav?.querySelector('.toggle-menu')).to.exist;\n });\n });\n\n describe('Menu events', () => {\n it('`el.setMenuShortcuts`', async () => {\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator\n .item=${new ItemStub()}\n ></iaux-item-navigator>`,\n );\n expect(el.menuShortcuts.length).to.equal(0);\n\n const menuShortcuts = [shortcut];\n\n el.setMenuShortcuts({\n detail: menuShortcuts,\n } as SetSideMenuShortcutsEvent);\n await el.updateComplete;\n\n expect(el.menuShortcuts.length).to.equal(1);\n });\n it('`el.setMenuContents`', async () => {\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator\n .item=${new ItemStub()}\n ></iaux-item-navigator>`,\n );\n expect(el.menuContents.length).to.equal(0);\n\n el.setMenuShortcuts({\n detail: [menuProvider],\n } as SetSideMenuContentsEvent);\n await el.updateComplete;\n\n expect(el.menuShortcuts.length).to.equal(1);\n });\n it('`el.setOpenMenu`', async () => {\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator\n .item=${new ItemStub()}\n ></iaux-item-navigator>`,\n );\n\n el.setOpenMenu({\n detail: { id: 'foo' },\n } as ToggleSidePanelOpenEvent);\n await el.updateComplete;\n\n expect(el.openMenu).to.equal('foo');\n expect(el.selectedMenuId).to.equal('foo');\n\n // toggles it off\n el.setOpenMenu({\n detail: { id: 'foo' },\n } as ToggleSidePanelOpenEvent);\n await el.updateComplete;\n\n expect(el.openMenu).to.be.undefined;\n expect(el.selectedMenuId).to.equal('');\n });\n it('`el.closeMenu`', async () => {\n const el = await fixture<ItemNavigator>(\n html`<iaux-item-navigator\n .item=${new ItemStub()}\n ></iaux-item-navigator>`,\n );\n\n el.menuOpened = true;\n await el.updateComplete;\n\n expect(el.menuOpened).to.be.true;\n\n el.closeMenu();\n await el.updateComplete;\n\n expect(el.menuOpened).to.be.false;\n });\n });\n});\n"]}
@@ -0,0 +1 @@
1
+ import '../src/menus/iaux-sharing-options';
@@ -0,0 +1,64 @@
1
+ import { html, fixture, expect } from '@open-wc/testing';
2
+ import sinon from 'sinon';
3
+ import '../src/menus/iaux-sharing-options';
4
+ const identifier = 'goody';
5
+ const itemType = 'book';
6
+ const creator = 'Welsh, Charles';
7
+ const description = 'The history of Little Goody Two-Shoes : otherwise called Mrs. Margery Two-Shoes ... [1766 edition]';
8
+ const container = (optionalFileSubprefix = '') => html `<iaux-sharing-options
9
+ identifier="${identifier}"
10
+ type="${itemType}"
11
+ creator="${creator}"
12
+ description="${description}"
13
+ baseHost="archive.org"
14
+ fileSubPrefix="${optionalFileSubprefix}"
15
+ ></iaux-sharing-options>`;
16
+ describe('<iaux-sharing-options>', () => {
17
+ afterEach(() => {
18
+ sinon.restore();
19
+ });
20
+ it('sets default properties', async () => {
21
+ const el = (await fixture(container()));
22
+ expect(el.identifier).to.equal(identifier);
23
+ expect(el.type).to.equal(itemType);
24
+ expect(el.creator).to.equal(creator);
25
+ expect(el.description).to.equal(description);
26
+ });
27
+ it('renders buttons for each sharing method', async () => {
28
+ const el = (await fixture(container()));
29
+ await el.updateComplete;
30
+ el.sharingOptions.forEach(option => {
31
+ const button = el.shadowRoot && el.shadowRoot.querySelector(`a.${option.class}`);
32
+ expect(button).to.exist;
33
+ expect(button === null || button === void 0 ? void 0 : button.getAttribute('href')).to.equal(option.url);
34
+ });
35
+ });
36
+ it('toggles visibility of embed options', async () => {
37
+ const el = (await fixture(container()));
38
+ el.toggleEmbedOptions(new Event('click'));
39
+ await el.updateComplete;
40
+ expect(el.embedOptionsVisible).to.equal(true);
41
+ });
42
+ it('does not show internal header by default', async () => {
43
+ var _a;
44
+ const el = (await fixture(container()));
45
+ expect((_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('header')).to.be.null;
46
+ });
47
+ it('does shows internal header when requested', async () => {
48
+ var _a;
49
+ const el = (await fixture(container()));
50
+ el.renderHeader = true;
51
+ await el.updateComplete;
52
+ expect((_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('header')).to.not.be.null;
53
+ });
54
+ it('sets file subprefix to end of share URLs if present', async () => {
55
+ const optionalFileSubprefix = 'foo- bar - 123-';
56
+ const el = (await fixture(container(optionalFileSubprefix)));
57
+ el.sharingOptions.forEach(option => {
58
+ if (option.name !== 'Tumblr') {
59
+ expect(option.url).to.contain(encodeURIComponent(optionalFileSubprefix));
60
+ }
61
+ });
62
+ });
63
+ });
64
+ //# sourceMappingURL=iaux-sharing-options.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iaux-sharing-options.test.js","sourceRoot":"","sources":["../../test/iaux-sharing-options.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, fixture, expect } from '@open-wc/testing';\nimport sinon from 'sinon';\nimport '../src/menus/iaux-sharing-options';\nimport type { IauxSharingOptions } from '../src/menus/iaux-sharing-options';\n\nconst identifier = 'goody';\nconst itemType = 'book';\nconst creator = 'Welsh, Charles';\nconst description =\n 'The history of Little Goody Two-Shoes : otherwise called Mrs. Margery Two-Shoes ... [1766 edition]';\n\nconst container = (optionalFileSubprefix = '') =>\n html`<iaux-sharing-options\n identifier=\"${identifier}\"\n type=\"${itemType}\"\n creator=\"${creator}\"\n description=\"${description}\"\n baseHost=\"archive.org\"\n fileSubPrefix=\"${optionalFileSubprefix}\"\n ></iaux-sharing-options>`;\n\ndescribe('<iaux-sharing-options>', () => {\n afterEach(() => {\n sinon.restore();\n });\n\n it('sets default properties', async () => {\n const el = (await fixture(container())) as IauxSharingOptions;\n\n expect(el.identifier).to.equal(identifier);\n expect(el.type).to.equal(itemType);\n expect(el.creator).to.equal(creator);\n expect(el.description).to.equal(description);\n });\n\n it('renders buttons for each sharing method', async () => {\n const el = (await fixture(container())) as IauxSharingOptions;\n\n await el.updateComplete;\n\n el.sharingOptions.forEach(option => {\n const button =\n el.shadowRoot && el.shadowRoot.querySelector(`a.${option.class}`);\n expect(button).to.exist;\n expect(button?.getAttribute('href')).to.equal(option.url);\n });\n });\n\n it('toggles visibility of embed options', async () => {\n const el = (await fixture(container())) as IauxSharingOptions;\n\n el.toggleEmbedOptions(new Event('click'));\n await el.updateComplete;\n\n expect(el.embedOptionsVisible).to.equal(true);\n });\n\n it('does not show internal header by default', async () => {\n const el = (await fixture(container())) as IauxSharingOptions;\n expect(el.shadowRoot?.querySelector('header')).to.be.null;\n });\n\n it('does shows internal header when requested', async () => {\n const el = (await fixture(container())) as IauxSharingOptions;\n el.renderHeader = true;\n await el.updateComplete;\n expect(el.shadowRoot?.querySelector('header')).to.not.be.null;\n });\n\n it('sets file subprefix to end of share URLs if present', async () => {\n const optionalFileSubprefix = 'foo- bar - 123-';\n const el = (await fixture(\n container(optionalFileSubprefix),\n )) as IauxSharingOptions;\n\n el.sharingOptions.forEach(option => {\n if (option.name !== 'Tumblr') {\n expect(option.url).to.contain(\n encodeURIComponent(optionalFileSubprefix),\n );\n }\n });\n });\n});\n"]}
package/index.ts CHANGED
@@ -1,3 +1,11 @@
1
- export { ItemNavigator } from './src/item-navigator';
1
+ export { ItemNavigator } from './src/iaux-item-navigator';
2
2
  export { MenuButton } from './src/menu-slider/menu-button';
3
3
  export { IaMenuSlider } from './src/menu-slider/ia-menu-slider';
4
+
5
+ // side menus
6
+ export {
7
+ IauxSharingOptions,
8
+ iauxShareIcon,
9
+ } from './src/menus/iaux-sharing-options';
10
+ export { IauxViewableFiles } from './src/menus/iaux-viewable-files';
11
+ export { IauxSortFilesButton } from './src/menus/iaux-viewable-files';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@internetarchive/ia-item-navigator",
3
- "version": "1.1.0",
3
+ "version": "v2.0.0-alpha1",
4
4
  "description": "Internet Archive's Item Navigator, visually explore an item's contents.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -31,7 +31,13 @@
31
31
  "dependencies": {
32
32
  "@internetarchive/icon-collapse-sidebar": "^1.3.4",
33
33
  "@internetarchive/icon-ellipses": "^1.3.4",
34
+ "@internetarchive/icon-email": "^1.3.4",
35
+ "@internetarchive/icon-facebook": "^1.3.4",
36
+ "@internetarchive/icon-link": "^1.3.4",
37
+ "@internetarchive/icon-pinterest": "^1.3.4",
34
38
  "@internetarchive/icon-share": "^1.3.4",
39
+ "@internetarchive/icon-tumblr": "^1.3.4",
40
+ "@internetarchive/icon-twitter": "^1.3.4",
35
41
  "@internetarchive/icon-visual-adjustment": "^1.3.4",
36
42
  "@internetarchive/modal-manager": "^0.2.7",
37
43
  "@internetarchive/search-service": "^0.1.2",
@@ -71,14 +77,13 @@
71
77
  "eslintConfig": {
72
78
  "parser": "@typescript-eslint/parser",
73
79
  "extends": [
74
- "@open-wc/eslint-config",
75
- "eslint-config-prettier"
80
+ "@open-wc",
81
+ "prettier"
76
82
  ],
77
83
  "plugins": [
78
84
  "@typescript-eslint"
79
85
  ],
80
86
  "rules": {
81
- "class-methods-use-this": "off",
82
87
  "no-unused-vars": "off",
83
88
  "@typescript-eslint/no-unused-vars": [
84
89
  "error"
@@ -87,9 +92,11 @@
87
92
  "@typescript-eslint/no-shadow": [
88
93
  "error"
89
94
  ],
95
+ "class-methods-use-this": "off",
90
96
  "import/no-unresolved": "off",
91
97
  "import/extensions": [
92
98
  "off",
99
+ "ignorePackages",
93
100
  {
94
101
  "js": "never",
95
102
  "ts": "never"
@@ -35,7 +35,7 @@ import {
35
35
  } from './interfaces/menu-interfaces';
36
36
  import './no-theater-available';
37
37
 
38
- @customElement('ia-item-navigator')
38
+ @customElement('iaux-item-navigator')
39
39
  export class ItemNavigator
40
40
  extends LitElement
41
41
  implements SharedResizeObserverResizeHandlerInterface
@@ -55,15 +55,7 @@ export class ItemNavigator
55
55
 
56
56
  @property({ type: String }) baseHost = 'archive.org';
57
57
 
58
- @property({
59
- converter: (arg: string | boolean | null) => {
60
- if (typeof arg === 'boolean') {
61
- return arg;
62
- }
63
- return arg === 'true';
64
- },
65
- })
66
- signedIn = false;
58
+ @property({ type: Boolean }) signedIn = false;
67
59
 
68
60
  @property({ type: Array }) menuContents: MenuProviderInterface[] = [];
69
61
 
@@ -96,7 +96,7 @@ export class IaMenuSlider extends LitElement {
96
96
  .icon=${menu.icon}
97
97
  .label=${menu.label}
98
98
  .menuDetails=${menu.menuDetails}
99
- .id=${menu.id}
99
+ .buttonId=${menu.id}
100
100
  .selected=${menu.id === this.selectedMenu}
101
101
  .followable=${menu.followable}
102
102
  .href=${menu.href}
@@ -0,0 +1,84 @@
1
+ [
2
+ /* This is a whole user list */
3
+ {
4
+ "list_name": "My Great List",
5
+ "description": "The greatest list of all",
6
+ "private": true,
7
+ "date_created": "2020-01-01T01:23:45Z",
8
+ "date_updated": "2020-01-01T01:23:45Z",
9
+ "members": [
10
+ /* This is a member of the user list */
11
+ {
12
+ "identifier": "BettyWhiteShow",
13
+ "date_added": "2020-01-01T01:23:45Z"
14
+ },
15
+ {
16
+ "identifier": "masterbookofamericanfolksong00shep",
17
+ "file": "04-Letters%20to%20Riley%20Shepard",
18
+ "date_added": "2020-01-01T01:23:45Z"
19
+ },
20
+ {
21
+ "identifier": "inlibrary",
22
+ "search-term": "?not%5B%5D=lending%3A%22available_to_borrow%22",
23
+ "date_added": "2020-01-01T01:23:45Z"
24
+ },
25
+ {
26
+ "type": "search",
27
+ "search-term": "?query=San+Francisco%2C+ca&not%5B%5D=mediatype%3A%22audio%22",
28
+ "date_added": "2020-01-01T01:23:45Z"
29
+ },
30
+
31
+ /* More members ... */
32
+ ]
33
+ },
34
+ /* More lists ... */
35
+ ]
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+ {
44
+ 'foo': {
45
+ 'date-added': datetime,
46
+ items: [
47
+ {
48
+ id: 'goody',
49
+ subprefix: '/subdi/subdir/tooshoes',
50
+ date-added: datetime,
51
+ }
52
+ ]
53
+ }
54
+
55
+ }
56
+
57
+ [
58
+ {
59
+ list-name: 'foo-list',
60
+ date-created: datetime,
61
+ date-updated: datetime,
62
+ items: [
63
+ {
64
+ id: 'goody',
65
+ subprefix: '/subdi/subdir/tooshoes',
66
+ date-added: datetime,
67
+ }
68
+ ]
69
+ },
70
+ {
71
+ list-name: 'uncategorized',
72
+ date-created: datetime,
73
+ date-updated: datetime,
74
+ items: [
75
+ {
76
+ id: 'goody',
77
+ subprefix: '/subdi/subdir/tooshoes',
78
+ date-added: datetime,
79
+ }
80
+ ]
81
+ }
82
+ ]
83
+
84
+ q:items='goody','good'