@iamproperty/components 7.8.2--beta2 → 7.8.2--beta4
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/assets/css/components/actionbar.component.css +1 -1
- package/assets/css/components/actionbar.component.css.map +1 -1
- package/assets/css/components/address-lookup.component.css +1 -1
- package/assets/css/components/address-lookup.component.css.map +1 -1
- package/assets/css/components/advanced-select.component.css +1 -1
- package/assets/css/components/advanced-select.component.css.map +1 -1
- package/assets/css/components/applied-filters.css +1 -1
- package/assets/css/components/applied-filters.css.map +1 -1
- package/assets/css/components/banner.preload.css +1 -0
- package/assets/css/components/banner.preload.css.map +1 -0
- package/assets/css/components/calendar.component.css +1 -1
- package/assets/css/components/calendar.component.css.map +1 -1
- package/assets/css/components/card.component.css +1 -1
- package/assets/css/components/card.component.css.map +1 -1
- package/assets/css/components/card.module.css +1 -1
- package/assets/css/components/card.module.css.map +1 -1
- package/assets/css/components/card.preload.css +1 -0
- package/assets/css/components/card.preload.css.map +1 -0
- package/assets/css/components/carousel.component.css +1 -1
- package/assets/css/components/carousel.component.css.map +1 -1
- package/assets/css/components/carousel.config.css +1 -1
- package/assets/css/components/carousel.config.css.map +1 -1
- package/assets/css/components/config.component.css +1 -1
- package/assets/css/components/config.component.css.map +1 -1
- package/assets/css/components/content.component.css +1 -1
- package/assets/css/components/content.component.css.map +1 -1
- package/assets/css/components/fileupload.css +1 -1
- package/assets/css/components/fileupload.css.map +1 -1
- package/assets/css/components/filter-card.component.css +1 -1
- package/assets/css/components/filter-card.component.css.map +1 -1
- package/assets/css/components/multiselect.css +1 -1
- package/assets/css/components/multiselect.css.map +1 -1
- package/assets/css/components/nav.component.css +1 -1
- package/assets/css/components/nav.component.css.map +1 -1
- package/assets/css/components/pagination.css +1 -1
- package/assets/css/components/pagination.css.map +1 -1
- package/assets/css/components/record-card.component.css +1 -1
- package/assets/css/components/record-card.component.css.map +1 -1
- package/assets/css/components/search.component.css +1 -1
- package/assets/css/components/search.component.css.map +1 -1
- package/assets/css/components/skeleton.global.css +1 -1
- package/assets/css/components/skeleton.global.css.map +1 -1
- package/assets/css/components/slider.css +1 -1
- package/assets/css/components/slider.css.map +1 -1
- package/assets/css/components/split-button.component.css +1 -1
- package/assets/css/components/split-button.component.css.map +1 -1
- package/assets/css/components/std-nav-standalone.component.css +1 -1
- package/assets/css/components/std-nav-standalone.component.css.map +1 -1
- package/assets/css/components/tabs.component.css +1 -1
- package/assets/css/components/tabs.component.css.map +1 -1
- package/assets/css/components/tag.component.css +1 -1
- package/assets/css/components/tag.component.css.map +1 -1
- package/assets/css/components/video-card.component.css +1 -1
- package/assets/css/components/video-card.component.css.map +1 -1
- package/assets/css/core.min.css +1 -1
- package/assets/css/core.min.css.map +1 -1
- package/assets/css/elements/badge-tag.css +1 -1
- package/assets/css/elements/badge-tag.css.map +1 -1
- package/assets/css/elements/dropdown.css +1 -1
- package/assets/css/elements/dropdown.css.map +1 -1
- package/assets/css/elements/forms.css +1 -1
- package/assets/css/elements/forms.css.map +1 -1
- package/assets/css/elements/links--global.css +1 -1
- package/assets/css/elements/links--global.css.map +1 -1
- package/assets/css/elements/links.css +1 -1
- package/assets/css/elements/links.css.map +1 -1
- package/assets/css/style.min.css +1 -1
- package/assets/css/style.min.css.map +1 -1
- package/assets/js/components/accordion/accordion.component.min.js +1 -1
- package/assets/js/components/actionbar/actionbar.component.min.js +2 -2
- package/assets/js/components/address-lookup/address-lookup.component.min.js +4 -4
- package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
- package/assets/js/components/advanced-select/advanced-select.component.min.js +2 -2
- package/assets/js/components/applied-filters/applied-filters.component.min.js +2 -2
- package/assets/js/components/banner/banner.component.min.js +1 -1
- package/assets/js/components/barchart/barchart.component.min.js +1 -1
- package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
- package/assets/js/components/bone/bone.component.min.js +1 -1
- package/assets/js/components/button/button.component.min.js +1 -1
- package/assets/js/components/calendar/calendar.component.min.js +2 -2
- package/assets/js/components/card/card.component.js +114 -125
- package/assets/js/components/card/card.component.min.js +7 -7
- package/assets/js/components/card/card.component.min.js.map +1 -1
- package/assets/js/components/carousel/carousel.component.js +83 -29
- package/assets/js/components/carousel/carousel.component.min.js +16 -11
- package/assets/js/components/carousel/carousel.component.min.js.map +1 -1
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
- package/assets/js/components/config/config.component.min.js +7 -7
- package/assets/js/components/config/config.component.min.js.map +1 -1
- package/assets/js/components/content/content.component.js +28 -69
- package/assets/js/components/content/content.component.min.js +4 -4
- package/assets/js/components/content/content.component.min.js.map +1 -1
- package/assets/js/components/darkmode/darkmode.component.min.js +1 -1
- package/assets/js/components/doughnutchart/doughnutchart.component.min.js +1 -1
- package/assets/js/components/fileupload/fileupload.component.min.js +2 -2
- package/assets/js/components/filter-card/filter-card.component.min.js +5 -5
- package/assets/js/components/filter-card/filter-card.component.min.js.map +1 -1
- package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
- package/assets/js/components/form/form.component.min.js +1 -1
- package/assets/js/components/header/header.component.min.js +1 -1
- package/assets/js/components/inline-edit/inline-edit.component.min.js +1 -1
- package/assets/js/components/input/input.component.min.js +1 -1
- package/assets/js/components/input-range/input-range.component.min.js +1 -1
- package/assets/js/components/marketing/marketing.component.min.js +1 -1
- package/assets/js/components/menu/menu.component.min.js +1 -1
- package/assets/js/components/milestone/milestone.component.min.js +1 -1
- package/assets/js/components/milestone-group/milestone-group.component.min.js +1 -1
- package/assets/js/components/modal/modal.component.min.js +1 -1
- package/assets/js/components/multi-step/multi-step.component.min.js +1 -1
- package/assets/js/components/multi-step-modal/multi-step-modal.component.min.js +1 -1
- package/assets/js/components/multiselect/multiselect.component.min.js +4 -4
- package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
- package/assets/js/components/nav/nav.component.min.js +2 -2
- package/assets/js/components/notification/notification.component.min.js +1 -1
- package/assets/js/components/pagination/pagination.component.min.js +5 -5
- package/assets/js/components/password/password.component.min.js +1 -1
- package/assets/js/components/popover/popover.component.min.js +1 -1
- package/assets/js/components/rank/rank.component.min.js +1 -1
- package/assets/js/components/rankings/rankings.component.min.js +1 -1
- package/assets/js/components/rating/rating.component.min.js +1 -1
- package/assets/js/components/record-card/record-card.component.min.js +6 -6
- package/assets/js/components/record-card/record-card.component.min.js.map +1 -1
- package/assets/js/components/search/search.component.js +234 -186
- package/assets/js/components/search/search.component.min.js +12 -7
- package/assets/js/components/search/search.component.min.js.map +1 -1
- package/assets/js/components/skeleton/skeleton.component.min.js +1 -1
- package/assets/js/components/slider/slider.component.min.js +2 -2
- package/assets/js/components/split-button/split-button.component.min.js +2 -2
- package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js +5 -5
- package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js.map +1 -1
- package/assets/js/components/std-nav/std-nav.component.js +10 -9
- package/assets/js/components/std-nav/std-nav.component.min.js +9 -12
- package/assets/js/components/std-nav/std-nav.component.min.js.map +1 -1
- package/assets/js/components/std-nav-standalone/std-nav-standalone.component.min.js +5 -5
- package/assets/js/components/std-nav-standalone/std-nav-standalone.component.min.js.map +1 -1
- package/assets/js/components/table/table.component.min.js +1 -1
- package/assets/js/components/table-ajax/table-ajax.component.min.js +1 -1
- package/assets/js/components/table-basic/table-basic.component.min.js +1 -1
- package/assets/js/components/table-no-submit/table-no-submit.component.min.js +1 -1
- package/assets/js/components/table-submit/table-submit.component.min.js +1 -1
- package/assets/js/components/tabs/tabs.component.min.js +4 -4
- package/assets/js/components/tag/tag.component.min.js +3 -3
- package/assets/js/components/tag/tag.component.min.js.map +1 -1
- package/assets/js/components/tooltip/tooltip.component.min.js +1 -1
- package/assets/js/components/video/video.component.min.js +1 -1
- package/assets/js/components/video-card/video-card.component.min.js +9 -9
- package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
- package/assets/js/components/video-modal/video-modal.component.min.js +1 -1
- package/assets/js/components/word-count/word-count.component.min.js +1 -1
- package/assets/js/modules/card.module.js +12 -11
- package/assets/js/modules/content.js +40 -8
- package/assets/js/modules/content.test.js +62 -12
- package/assets/js/modules/data-layer.js +7 -6
- package/assets/js/modules/dropdown.js +0 -1
- package/assets/js/modules/nav.js +10 -3
- package/assets/js/modules/search.js +153 -0
- package/assets/js/modules/search.test.js +125 -0
- package/assets/js/modules/tabs.test.js +64 -12
- package/assets/js/modules/testimonial.test.js +44 -6
- package/assets/js/modules/videos.test.js +61 -13
- package/assets/js/scripts.bundle.js +3 -3
- package/assets/js/scripts.bundle.js.map +1 -1
- package/assets/js/scripts.bundle.min.js +2 -2
- package/assets/js/scripts.bundle.min.js.map +1 -1
- package/assets/sass/_components.scss +2 -63
- package/assets/sass/components/banner.preload.scss +26 -0
- package/assets/sass/components/card.component.scss +1 -7
- package/assets/sass/components/card.module.scss +6 -6
- package/assets/sass/components/card.preload.scss +80 -0
- package/assets/sass/components/carousel.component.scss +165 -0
- package/assets/sass/components/carousel.config.scss +85 -249
- package/assets/sass/components/content.component.scss +0 -7
- package/assets/sass/components/nav.component.scss +2 -1
- package/assets/sass/components/search.component.scss +89 -7
- package/assets/sass/components/skeleton.global.scss +4 -0
- package/assets/sass/elements/badge-tag.css +1 -1
- package/assets/sass/elements/dropdown.css +2 -0
- package/assets/sass/elements/forms.scss +0 -27
- package/assets/sass/elements/links--global.scss +40 -2
- package/assets/sass/foundations/root.scss +0 -1
- package/assets/sass/utilities/border.css +1 -1
- package/assets/sass/utilities/js-display.css +2 -3
- package/assets/ts/components/card/card.component.ts +72 -62
- package/assets/ts/components/carousel/carousel.component.ts +84 -19
- package/assets/ts/components/content/content.component.ts +36 -100
- package/assets/ts/components/search/search.component.ts +257 -185
- package/assets/ts/components/std-nav/std-nav.component.ts +17 -16
- package/assets/ts/html.d.ts +6 -0
- package/assets/ts/modules/card.module.ts +20 -12
- package/assets/ts/modules/content.test.ts +84 -12
- package/assets/ts/modules/content.ts +56 -9
- package/assets/ts/modules/data-layer.ts +7 -11
- package/assets/ts/modules/dropdown.ts +0 -2
- package/assets/ts/modules/nav.ts +12 -3
- package/assets/ts/modules/search.test.ts +142 -0
- package/assets/ts/modules/search.ts +206 -0
- package/assets/ts/modules/tabs.test.ts +79 -12
- package/assets/ts/modules/testimonial.test.ts +45 -6
- package/assets/ts/modules/videos.test.ts +74 -14
- package/dist/components.es.js +25 -25
- package/dist/components.umd.js +164 -157
- package/package.json +1 -1
- package/assets/js/modules/carousel.js +0 -214
- package/assets/js/modules/carousel.test.js +0 -18
- package/assets/ts/modules/carousel.test.ts +0 -27
- package/assets/ts/modules/carousel.ts +0 -301
|
@@ -1,27 +1,94 @@
|
|
|
1
1
|
import { describe, expect, it } from './test.ts';
|
|
2
2
|
import { createElement, installTestDom } from './test-dom.ts';
|
|
3
3
|
import { append } from './test-utils.ts';
|
|
4
|
-
import { openFirstTab, toggleTab } from './tabs.ts';
|
|
4
|
+
import { createTabsLinks, openFirstTab, setTabsEventHandlers, toggleTab } from './tabs.ts';
|
|
5
5
|
|
|
6
|
-
installTestDom();
|
|
6
|
+
const { window } = installTestDom();
|
|
7
|
+
|
|
8
|
+
const createDetail = (id, title, isOpen = false) => {
|
|
9
|
+
const detail = createElement('details', { id });
|
|
10
|
+
const summary = createElement('summary', {}, title);
|
|
11
|
+
|
|
12
|
+
if (isOpen) detail.setAttribute('open', 'true');
|
|
13
|
+
|
|
14
|
+
append(detail, summary, createElement('p', {}, `${title} content`));
|
|
15
|
+
|
|
16
|
+
return detail;
|
|
17
|
+
};
|
|
7
18
|
|
|
8
19
|
describe('Tabs module', () => {
|
|
9
|
-
it('
|
|
20
|
+
it('creates tab buttons and dropdown options from direct details', () => {
|
|
21
|
+
const tabs = createElement('iam-tabs', { class: 'tabs--toggle-tags' });
|
|
22
|
+
const first = createDetail('first', 'First tab', true);
|
|
23
|
+
const second = createDetail('second', 'Second tab');
|
|
24
|
+
append(tabs, first, second);
|
|
25
|
+
|
|
26
|
+
createTabsLinks(tabs);
|
|
27
|
+
|
|
28
|
+
const buttons = tabs.querySelectorAll('.tabs__links > button');
|
|
29
|
+
const options = tabs.querySelectorAll('.tabs__dropdown > option');
|
|
30
|
+
|
|
31
|
+
expect(buttons.length === 2);
|
|
32
|
+
expect(buttons[0].textContent === 'First tab');
|
|
33
|
+
expect(buttons[0].getAttribute('aria-pressed') === 'true');
|
|
34
|
+
expect(buttons[0].classList.contains('tag'));
|
|
35
|
+
expect(buttons[0].getAttribute('data-id') === 'first');
|
|
36
|
+
expect(first.getAttribute('tabindex') === '-1');
|
|
37
|
+
expect(first.querySelector('summary').classList.contains('visually-hidden'));
|
|
38
|
+
expect(options[0].value === 'first-tab');
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('toggles matching detail panels and records tab open events', () => {
|
|
42
|
+
window.dataLayer = [];
|
|
43
|
+
const tabs = createElement('iam-tabs');
|
|
44
|
+
const first = createDetail('first', 'First tab', true);
|
|
45
|
+
const second = createDetail('second', 'Second tab');
|
|
46
|
+
const linksWrapper = createElement('div');
|
|
47
|
+
const links = createElement('div', { class: 'tabs__links' });
|
|
48
|
+
const dropdownWrapper = createElement('div');
|
|
49
|
+
const dropdown = createElement('select', { class: 'tabs__dropdown' });
|
|
50
|
+
append(links, createElement('button', { ariaPressed: 'true', dataIndex: '0' }, 'First tab'));
|
|
51
|
+
append(links, createElement('button', { dataIndex: '1' }, 'Second tab'));
|
|
52
|
+
append(linksWrapper, links);
|
|
53
|
+
append(dropdownWrapper, dropdown);
|
|
54
|
+
append(tabs, linksWrapper, dropdownWrapper, first, second);
|
|
55
|
+
|
|
56
|
+
setTabsEventHandlers(tabs);
|
|
57
|
+
|
|
58
|
+
const buttons = tabs.querySelectorAll('.tabs__links > button');
|
|
59
|
+
buttons[1].click();
|
|
60
|
+
|
|
61
|
+
expect(!first.hasAttribute('open'));
|
|
62
|
+
expect(second.getAttribute('open') === 'true');
|
|
63
|
+
expect(buttons[1].getAttribute('aria-pressed') === 'true');
|
|
64
|
+
expect(window.dataLayer[0].event === 'openTab');
|
|
65
|
+
expect(window.dataLayer[0].tabTitle === 'Second tab');
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('opens the tab matching the current location hash', () => {
|
|
10
69
|
const tabs = createElement('iam-tabs');
|
|
11
|
-
const first = createElement('details');
|
|
12
|
-
const second = createElement('details');
|
|
13
|
-
const buttonOne = createElement('button', { dataIndex: '0' });
|
|
14
|
-
const buttonTwo = createElement('button', { dataIndex: '1' });
|
|
15
70
|
tabs.shadowRoot = createElement('shadow-root');
|
|
16
71
|
const links = createElement('div', { class: 'tabs__links' });
|
|
17
|
-
append(links,
|
|
72
|
+
append(links, createElement('button', { dataId: 'first' }), createElement('button', { dataId: 'second' }));
|
|
18
73
|
append(tabs.shadowRoot, links);
|
|
19
|
-
append(tabs, first, second);
|
|
74
|
+
append(tabs, createDetail('first', 'First tab'), createDetail('second', 'Second tab'));
|
|
75
|
+
window.location.hash = '#second';
|
|
20
76
|
|
|
21
|
-
toggleTab([first, second], buttonTwo);
|
|
22
77
|
openFirstTab(tabs);
|
|
23
78
|
|
|
24
|
-
expect(
|
|
25
|
-
expect(second.
|
|
79
|
+
expect(tabs.querySelector('details[id="second"]').getAttribute('open') === 'true');
|
|
80
|
+
expect(tabs.shadowRoot.querySelector('[data-id="second"]').getAttribute('aria-pressed') === 'true');
|
|
81
|
+
|
|
82
|
+
window.location.hash = '';
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('toggles detail panels directly from a selected tab button', () => {
|
|
86
|
+
const details = [createDetail('first', 'First tab'), createDetail('second', 'Second tab')];
|
|
87
|
+
const button = createElement('button', { dataIndex: '1' });
|
|
88
|
+
|
|
89
|
+
toggleTab(details, button);
|
|
90
|
+
|
|
91
|
+
expect(!details[0].hasAttribute('open'));
|
|
92
|
+
expect(details[1].getAttribute('open') === 'true');
|
|
26
93
|
});
|
|
27
94
|
});
|
|
@@ -5,13 +5,52 @@ import testimonial from './testimonial.ts';
|
|
|
5
5
|
|
|
6
6
|
installTestDom();
|
|
7
7
|
|
|
8
|
+
const createTestimonial = (imageCount) => {
|
|
9
|
+
const component = createElement('section');
|
|
10
|
+
const images = createElement('div', { class: 'testimonial__images' });
|
|
11
|
+
const previousButton = createElement('button', { class: 'btn-prev' });
|
|
12
|
+
const nextButton = createElement('button', { class: 'btn-next' });
|
|
13
|
+
|
|
14
|
+
for (let index = 0; index < imageCount; index++) {
|
|
15
|
+
append(images, createElement('img', { alt: `Person ${index + 1}` }));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
append(component, images, previousButton, nextButton);
|
|
19
|
+
|
|
20
|
+
return { component, images, nextButton, previousButton };
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const dispatchClickFrom = (component, target) => {
|
|
24
|
+
const event = new Event('click', { bubbles: true, cancelable: true });
|
|
25
|
+
Object.defineProperty(event, 'target', { value: target });
|
|
26
|
+
component.dispatchEvent(event);
|
|
27
|
+
};
|
|
28
|
+
|
|
8
29
|
describe('Testimonial module', () => {
|
|
9
|
-
it('does not
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
30
|
+
it('does not enable carousel behaviour for a single testimonial', () => {
|
|
31
|
+
const { component } = createTestimonial(1);
|
|
32
|
+
|
|
33
|
+
const result = testimonial(component);
|
|
34
|
+
|
|
35
|
+
expect(result === false);
|
|
36
|
+
expect(!component.classList.contains('testimonial--multi'));
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('enables multi-testimonial controls and updates state after scrolling', async () => {
|
|
40
|
+
const { component, images, nextButton, previousButton } = createTestimonial(2);
|
|
41
|
+
images.scrollWidth = 400;
|
|
42
|
+
images.scrollHeight = 100;
|
|
43
|
+
nextButton.setAttribute('data-go', '2');
|
|
44
|
+
|
|
45
|
+
testimonial(component);
|
|
46
|
+
dispatchClickFrom(component, nextButton);
|
|
47
|
+
|
|
48
|
+
await new Promise((resolve) => setTimeout(resolve, 350));
|
|
14
49
|
|
|
15
|
-
expect(testimonial
|
|
50
|
+
expect(component.classList.contains('testimonial--multi'));
|
|
51
|
+
expect(images.scrollLeft === 200);
|
|
52
|
+
expect(component.getAttribute('data-show') === '2');
|
|
53
|
+
expect(previousButton.getAttribute('data-go') === '1');
|
|
54
|
+
expect(nextButton.hasAttribute('disabled'));
|
|
16
55
|
});
|
|
17
56
|
});
|
|
@@ -1,33 +1,93 @@
|
|
|
1
|
-
/* eslint-disable */
|
|
2
|
-
|
|
3
1
|
import { describe, expect, it } from './test.ts';
|
|
4
2
|
import { createElement, installTestDom } from './test-dom.ts';
|
|
5
|
-
import { append } from './test-utils.ts';
|
|
6
|
-
import { createYoutTubeVideo, openVimeoVideo } from './videos.ts';
|
|
3
|
+
import { append, silenceConsole } from './test-utils.ts';
|
|
4
|
+
import { createYoutTubeVideo, loadYouTubeScripts, openVimeoVideo, videoHTML } from './videos.ts';
|
|
5
|
+
|
|
6
|
+
const { document, window } = installTestDom();
|
|
7
|
+
|
|
8
|
+
if (typeof globalThis.CustomEvent === 'undefined') {
|
|
9
|
+
globalThis.CustomEvent = class extends Event {
|
|
10
|
+
detail;
|
|
7
11
|
|
|
8
|
-
|
|
12
|
+
constructor(type, options = {}) {
|
|
13
|
+
super(type, options);
|
|
14
|
+
this.detail = options.detail;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
9
18
|
|
|
10
19
|
describe('Videos module', () => {
|
|
11
|
-
it('
|
|
20
|
+
it('provides the expected base video markup', () => {
|
|
21
|
+
expect(videoHTML.includes('<slot name="video"></slot>'));
|
|
22
|
+
expect(videoHTML.includes('fa-play'));
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('loads the YouTube iframe script once the favicon probe succeeds', async () => {
|
|
26
|
+
append(document.body, createElement('script'));
|
|
27
|
+
|
|
28
|
+
await loadYouTubeScripts();
|
|
29
|
+
|
|
30
|
+
expect(document.body.classList.contains('youtubeLoaded'));
|
|
31
|
+
expect(document.getElementsByTagName('script').length === 2);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('reuses an existing YouTube player instead of creating another one', async () => {
|
|
12
35
|
let played = false;
|
|
13
36
|
window.player = {
|
|
14
|
-
|
|
37
|
+
existing: {
|
|
15
38
|
pauseVideo: () => {},
|
|
16
39
|
playVideo: () => {
|
|
17
40
|
played = true;
|
|
18
41
|
},
|
|
19
42
|
},
|
|
20
43
|
};
|
|
44
|
+
|
|
45
|
+
const result = await createYoutTubeVideo(createElement('div'), 'existing');
|
|
46
|
+
|
|
47
|
+
expect(result === false);
|
|
48
|
+
expect(played);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('creates a YouTube player and marks the embed ready when playback starts', async () => {
|
|
52
|
+
const embed = createElement('div', { id: 'youtube-alpha' });
|
|
53
|
+
append(document.body, embed);
|
|
54
|
+
window.player = undefined;
|
|
55
|
+
globalThis.YT = {
|
|
56
|
+
PlayerState: { PLAYING: 1 },
|
|
57
|
+
Player: class {
|
|
58
|
+
constructor(id, config) {
|
|
59
|
+
this.id = id;
|
|
60
|
+
this.config = config;
|
|
61
|
+
setTimeout(() => {
|
|
62
|
+
config.events.onReady({ target: { playVideo: () => {} } });
|
|
63
|
+
config.events.onStateChange({ data: 1 });
|
|
64
|
+
}, 0);
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
await silenceConsole(() => createYoutTubeVideo(embed, 'youtube-alpha'));
|
|
70
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
71
|
+
|
|
72
|
+
expect(window.player['youtube-alpha']);
|
|
73
|
+
expect(embed.classList.contains('player-ready'));
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('opens a Vimeo iframe and dispatches video analytics details', async () => {
|
|
21
77
|
window.dataLayer = [];
|
|
22
|
-
const
|
|
23
|
-
const
|
|
78
|
+
const component = createElement('iam-video', { dataVimeo: '12345' });
|
|
79
|
+
const embed = createElement('div', { class: 'embed' });
|
|
80
|
+
let selectedDetail;
|
|
81
|
+
component.addEventListener('play-video', (event) => {
|
|
82
|
+
selectedDetail = event.detail;
|
|
83
|
+
});
|
|
84
|
+
append(component, embed);
|
|
24
85
|
|
|
25
|
-
const component = createElement('iam-video', { dataVimeo: '98765' });
|
|
26
|
-
append(component, createElement('div', { class: 'embed' }));
|
|
27
86
|
await openVimeoVideo(component);
|
|
28
87
|
|
|
29
|
-
expect(
|
|
30
|
-
expect(
|
|
31
|
-
expect(
|
|
88
|
+
expect(embed.innerHTML.includes('https://player.vimeo.com/video/12345?autoplay=1'));
|
|
89
|
+
expect(selectedDetail['Video Type'] === 'Vimeo');
|
|
90
|
+
expect(selectedDetail.ID === '12345');
|
|
91
|
+
expect(window.dataLayer[0].ID === '12345');
|
|
32
92
|
});
|
|
33
93
|
});
|