@iamproperty/components 7.8.2--beta1 → 7.8.2--beta2

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.
Files changed (153) hide show
  1. package/assets/css/components/modal.component.css +1 -1
  2. package/assets/css/components/modal.component.css.map +1 -1
  3. package/assets/css/components/video-card.component.css +1 -1
  4. package/assets/css/components/video-card.component.css.map +1 -1
  5. package/assets/css/components/video-modal.component.css +1 -1
  6. package/assets/css/components/video-modal.component.css.map +1 -1
  7. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  8. package/assets/js/components/actionbar/actionbar.component.min.js +1 -1
  9. package/assets/js/components/address-lookup/address-lookup.component.min.js +3 -3
  10. package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
  11. package/assets/js/components/advanced-select/advanced-select.component.min.js +3 -3
  12. package/assets/js/components/advanced-select/advanced-select.component.min.js.map +1 -1
  13. package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
  14. package/assets/js/components/banner/banner.component.min.js +1 -1
  15. package/assets/js/components/barchart/barchart.component.min.js +1 -1
  16. package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
  17. package/assets/js/components/bone/bone.component.min.js +1 -1
  18. package/assets/js/components/button/button.component.min.js +1 -1
  19. package/assets/js/components/calendar/calendar.component.min.js +1 -1
  20. package/assets/js/components/card/card.component.min.js +6 -6
  21. package/assets/js/components/card/card.component.min.js.map +1 -1
  22. package/assets/js/components/carousel/carousel.component.min.js +1 -1
  23. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
  24. package/assets/js/components/config/config.component.min.js +1 -1
  25. package/assets/js/components/content/content.component.min.js +1 -1
  26. package/assets/js/components/darkmode/darkmode.component.min.js +1 -1
  27. package/assets/js/components/doughnutchart/doughnutchart.component.min.js +1 -1
  28. package/assets/js/components/fileupload/fileupload.component.min.js +1 -1
  29. package/assets/js/components/filter-card/filter-card.component.min.js +4 -4
  30. package/assets/js/components/filter-card/filter-card.component.min.js.map +1 -1
  31. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  32. package/assets/js/components/form/form.component.min.js +1 -1
  33. package/assets/js/components/header/header.component.min.js +1 -1
  34. package/assets/js/components/inline-edit/inline-edit.component.min.js +1 -1
  35. package/assets/js/components/input/input.component.min.js +1 -1
  36. package/assets/js/components/input-range/input-range.component.min.js +1 -1
  37. package/assets/js/components/marketing/marketing.component.min.js +1 -1
  38. package/assets/js/components/menu/menu.component.min.js +1 -1
  39. package/assets/js/components/milestone/milestone.component.min.js +1 -1
  40. package/assets/js/components/milestone-group/milestone-group.component.min.js +1 -1
  41. package/assets/js/components/modal/modal.component.min.js +2 -2
  42. package/assets/js/components/multi-step/multi-step.component.min.js +1 -1
  43. package/assets/js/components/multi-step-modal/multi-step-modal.component.min.js +1 -1
  44. package/assets/js/components/multiselect/multiselect.component.js +14 -1
  45. package/assets/js/components/multiselect/multiselect.component.min.js +3 -3
  46. package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
  47. package/assets/js/components/nav/nav.component.min.js +1 -1
  48. package/assets/js/components/notification/notification.component.min.js +1 -1
  49. package/assets/js/components/pagination/pagination.component.min.js +1 -1
  50. package/assets/js/components/password/password.component.min.js +1 -1
  51. package/assets/js/components/popover/popover.component.min.js +1 -1
  52. package/assets/js/components/rank/rank.component.min.js +1 -1
  53. package/assets/js/components/rankings/rankings.component.min.js +1 -1
  54. package/assets/js/components/rating/rating.component.min.js +1 -1
  55. package/assets/js/components/record-card/record-card.component.min.js +4 -4
  56. package/assets/js/components/record-card/record-card.component.min.js.map +1 -1
  57. package/assets/js/components/search/search.component.min.js +5 -5
  58. package/assets/js/components/search/search.component.min.js.map +1 -1
  59. package/assets/js/components/skeleton/skeleton.component.min.js +1 -1
  60. package/assets/js/components/slider/slider.component.min.js +1 -1
  61. package/assets/js/components/split-button/split-button.component.min.js +1 -1
  62. package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js +4 -4
  63. package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js.map +1 -1
  64. package/assets/js/components/std-nav/std-nav.component.min.js +1 -1
  65. package/assets/js/components/std-nav-standalone/std-nav-standalone.component.min.js +1 -1
  66. package/assets/js/components/table/table.component.min.js +1 -1
  67. package/assets/js/components/table-ajax/table-ajax.component.min.js +1 -1
  68. package/assets/js/components/table-basic/table-basic.component.min.js +1 -1
  69. package/assets/js/components/table-no-submit/table-no-submit.component.min.js +1 -1
  70. package/assets/js/components/table-submit/table-submit.component.min.js +1 -1
  71. package/assets/js/components/tabs/tabs.component.min.js +1 -1
  72. package/assets/js/components/tag/tag.component.min.js +1 -1
  73. package/assets/js/components/tooltip/tooltip.component.min.js +1 -1
  74. package/assets/js/components/video/video.component.min.js +1 -1
  75. package/assets/js/components/video-card/video-card.component.min.js +6 -6
  76. package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
  77. package/assets/js/components/video-modal/video-modal.component.min.js +2 -2
  78. package/assets/js/components/word-count/word-count.component.min.js +1 -1
  79. package/assets/js/modules/advanced-select.js +6 -3
  80. package/assets/js/modules/advanced-select.test.js +28 -0
  81. package/assets/js/modules/applied-filters.test.js +21 -0
  82. package/assets/js/modules/card.module.js +3 -2
  83. package/assets/js/modules/card.module.test.js +20 -0
  84. package/assets/js/modules/carousel.test.js +18 -0
  85. package/assets/js/modules/chart.module.test.js +22 -0
  86. package/assets/js/modules/chart.test.js +15 -0
  87. package/assets/js/modules/content.test.js +20 -0
  88. package/assets/js/modules/data-layer.test.js +12 -0
  89. package/assets/js/modules/dialogs.test.js +13 -0
  90. package/assets/js/modules/drawer.test.js +16 -0
  91. package/assets/js/modules/dropdown.test.js +31 -0
  92. package/assets/js/modules/dynamicEvents.test.js +19 -0
  93. package/assets/js/modules/fileupload.test.js +17 -0
  94. package/assets/js/modules/filterlist.test.js +18 -0
  95. package/assets/js/modules/{helper.test.js → helpers.test.js} +42 -2
  96. package/assets/js/modules/integration-tests.test.js +12 -0
  97. package/assets/js/modules/milestone-group.test.js +18 -0
  98. package/assets/js/modules/milestone.test.js +31 -0
  99. package/assets/js/modules/modal.test.js +18 -0
  100. package/assets/js/modules/nav.test.js +37 -0
  101. package/assets/js/modules/notification.test.js +11 -0
  102. package/assets/js/modules/orderablelist.test.js +15 -0
  103. package/assets/js/modules/pagination.test.js +21 -0
  104. package/assets/js/modules/password.test.js +33 -0
  105. package/assets/js/modules/table.test.js +42 -0
  106. package/assets/js/modules/tabs.test.js +23 -0
  107. package/assets/js/modules/test-dom.js +725 -0
  108. package/assets/js/modules/test-globals.js +7 -0
  109. package/assets/js/modules/test-utils.js +26 -0
  110. package/assets/js/modules/test.js +20 -1
  111. package/assets/js/modules/testimonial.test.js +14 -0
  112. package/assets/js/modules/videos.test.js +37 -0
  113. package/assets/js/scripts.bundle.js +1 -1
  114. package/assets/js/scripts.bundle.min.js +1 -1
  115. package/assets/sass/components/modal.component.scss +1 -2
  116. package/assets/ts/components/multiselect/multiselect.component.ts +20 -1
  117. package/assets/ts/modules/advanced-select.test.ts +33 -0
  118. package/assets/ts/modules/advanced-select.ts +6 -2
  119. package/assets/ts/modules/applied-filters.test.ts +25 -0
  120. package/assets/ts/modules/card.module.test.ts +24 -0
  121. package/assets/ts/modules/card.module.ts +2 -1
  122. package/assets/ts/modules/carousel.test.ts +27 -0
  123. package/assets/ts/modules/chart.module.test.ts +26 -0
  124. package/assets/ts/modules/chart.test.ts +19 -0
  125. package/assets/ts/modules/content.test.ts +24 -0
  126. package/assets/ts/modules/data-layer.test.ts +15 -0
  127. package/assets/ts/modules/dialogs.test.ts +17 -0
  128. package/assets/ts/modules/drawer.test.ts +20 -0
  129. package/assets/ts/modules/dropdown.test.ts +38 -0
  130. package/assets/ts/modules/dynamicEvents.test.ts +23 -0
  131. package/assets/ts/modules/fileupload.test.ts +21 -0
  132. package/assets/ts/modules/filterlist.test.ts +22 -0
  133. package/assets/ts/modules/{helper.test.ts → helpers.test.ts} +63 -2
  134. package/assets/ts/modules/integration-tests.test.ts +15 -0
  135. package/assets/ts/modules/milestone-group.test.ts +22 -0
  136. package/assets/ts/modules/milestone.test.ts +35 -0
  137. package/assets/ts/modules/modal.test.ts +22 -0
  138. package/assets/ts/modules/nav.test.ts +41 -0
  139. package/assets/ts/modules/notification.test.ts +15 -0
  140. package/assets/ts/modules/orderablelist.test.ts +19 -0
  141. package/assets/ts/modules/pagination.test.ts +25 -0
  142. package/assets/ts/modules/password.test.ts +40 -0
  143. package/assets/ts/modules/table.test.ts +57 -0
  144. package/assets/ts/modules/tabs.test.ts +27 -0
  145. package/assets/ts/modules/test-dom.ts +798 -0
  146. package/assets/ts/modules/test-globals.ts +7 -0
  147. package/assets/ts/modules/test-utils.ts +29 -0
  148. package/assets/ts/modules/test.ts +28 -1
  149. package/assets/ts/modules/testimonial.test.ts +17 -0
  150. package/assets/ts/modules/videos.test.ts +33 -0
  151. package/dist/components.es.js +24 -24
  152. package/dist/components.umd.js +109 -109
  153. package/package.json +1 -1
@@ -0,0 +1,21 @@
1
+ import { describe, expect, it } from './test.ts';
2
+ import { createElement, installTestDom } from './test-dom.ts';
3
+ import { append } from './test-utils.ts';
4
+ import fileupload from './fileupload.ts';
5
+
6
+ installTestDom();
7
+
8
+ describe('File upload module', () => {
9
+ it('renders an existing uploaded filename', () => {
10
+ const component = createElement('iam-fileupload', { dataFilename: 'contract.pdf' });
11
+ const input = createElement('input', { type: 'file' });
12
+ const wrapper = createElement('div');
13
+ append(wrapper, createElement('div', { class: 'files' }), createElement('div', { class: 'drop-area' }));
14
+ append(wrapper, createElement('div', { class: 'invalid-feedback size' }), createElement('div', { class: 'invalid-feedback ext' }));
15
+ append(component, input);
16
+
17
+ fileupload(component, wrapper);
18
+
19
+ expect(wrapper.querySelector('.files').innerHTML.includes('contract.pdf'));
20
+ });
21
+ });
@@ -0,0 +1,22 @@
1
+ import { describe, expect, it } from './test.ts';
2
+ import { createElement, installTestDom } from './test-dom.ts';
3
+ import { append } from './test-utils.ts';
4
+ import { filterTheList } from './filterlist.ts';
5
+
6
+ const { window } = installTestDom();
7
+
8
+ describe('Filter list module', () => {
9
+ it('filters list items and records the search term', () => {
10
+ window.dataLayer = [];
11
+ const list = createElement('ul');
12
+ const one = createElement('li', {}, 'Alpha');
13
+ const two = createElement('li', {}, 'Beta');
14
+ append(list, one, two);
15
+
16
+ filterTheList(list, 'alp');
17
+
18
+ expect(!one.classList.contains('d-none'));
19
+ expect(two.classList.contains('d-none'));
20
+ expect(window.dataLayer[0].event === 'Filtered list');
21
+ });
22
+ });
@@ -1,5 +1,19 @@
1
- import {describe, it, expect} from './test.ts';
2
- import { isValidPostcode } from './helpers.ts';
1
+ import {describe, it, expect} from './test.js';
2
+ import {
3
+ getSwipeDirection,
4
+ isNumeric,
5
+ isTraversable,
6
+ isValidPostcode,
7
+ numberOfDays,
8
+ resolvePath,
9
+ safeID,
10
+ snake,
11
+ ucfirst,
12
+ ucwords,
13
+ unsnake,
14
+ zeroPad,
15
+ } from './helpers.js';
16
+ import { installTestDom } from './test-dom.js';
3
17
 
4
18
  describe("MathUtils Tests", function () {
5
19
  it('should pass', function() {
@@ -8,6 +22,53 @@ describe("MathUtils Tests", function () {
8
22
 
9
23
  });
10
24
 
25
+ describe('The general helper functions', () => {
26
+ installTestDom();
27
+
28
+ it('should identify numeric strings only', () => {
29
+ expect(isNumeric('12.5'));
30
+ expect(!isNumeric(''));
31
+ expect(!isNumeric('abc'));
32
+ expect(!isNumeric(12));
33
+ });
34
+
35
+ it('should format simple string values', () => {
36
+ expect(zeroPad(7, 3) === '007');
37
+ expect(ucfirst('hello') === 'Hello');
38
+ expect(ucwords('hello world') === 'Hello World');
39
+ expect(unsnake('hello_world') === 'hello world');
40
+ expect(snake('hello world') === 'hello_world');
41
+ expect(safeID('Hello world!') === 'hello_world');
42
+ });
43
+
44
+ it('should count inclusive date ranges', () => {
45
+ expect(numberOfDays('01/01/2026', '03/01/2026') === 3);
46
+ });
47
+
48
+ it('should resolve nested object paths', () => {
49
+ const data = { user: { name: 'Ada', roles: ['admin'] } };
50
+
51
+ expect(resolvePath(data, 'user.name', '') === 'Ada');
52
+ expect(resolvePath(data, 'user.roles[0]', '') === 'admin');
53
+ expect(resolvePath(data, 'account.name', 'fallback') === 'fallback');
54
+ });
55
+
56
+ it('should identify traversable values', () => {
57
+ expect(isTraversable([]));
58
+ expect(isTraversable({}));
59
+ expect(!isTraversable(null));
60
+ expect(!isTraversable('value'));
61
+ });
62
+
63
+ it('should detect swipe direction', () => {
64
+ expect(getSwipeDirection(100, 100, 20, 100) === 'left');
65
+ expect(getSwipeDirection(100, 100, 180, 100) === 'right');
66
+ expect(getSwipeDirection(100, 100, 100, 20) === 'top');
67
+ expect(getSwipeDirection(100, 100, 100, 180) === 'bottom');
68
+ expect(getSwipeDirection(100, 100, 101, 101) === 'tap');
69
+ });
70
+ });
71
+
11
72
 
12
73
  describe('The postcode helper function', () => {
13
74
 
@@ -0,0 +1,15 @@
1
+ import { describe, expect, it } from './test.ts';
2
+ import { installTestDom } from './test-dom.ts';
3
+ import { silenceConsole } from './test-utils.ts';
4
+ import integrationTests from './integration-tests.ts';
5
+
6
+ const { window } = installTestDom();
7
+
8
+ describe('Integration tests module', () => {
9
+ it('runs integration checks against an empty document', () => {
10
+ silenceConsole(() => integrationTests());
11
+
12
+ expect(window.integrationTestsIntro.includes('component or element'));
13
+ expect(Array.isArray(window.integrationTests));
14
+ });
15
+ });
@@ -0,0 +1,22 @@
1
+ import { describe, expect, it } from './test.ts';
2
+ import { createElement, installTestDom } from './test-dom.ts';
3
+ import milestoneGroup from './milestone-group.ts';
4
+
5
+ installTestDom();
6
+
7
+ describe('Milestone group module', () => {
8
+ it('toggles future milestone visibility', () => {
9
+ const group = createElement('iam-milestone-group', { dataShowAllToggle: 'true' });
10
+ let opened = false;
11
+ group.addEventListener('show-future-items', () => {
12
+ opened = true;
13
+ });
14
+
15
+ milestoneGroup(group);
16
+ group.children[0].click();
17
+
18
+ expect(group.classList.contains('show-all'));
19
+ expect(group.children[0].innerHTML === 'Hide next steps');
20
+ expect(opened);
21
+ });
22
+ });
@@ -0,0 +1,35 @@
1
+ import { describe, expect, it } from './test.ts';
2
+ import { createElement, installTestDom } from './test-dom.ts';
3
+ import { append } from './test-utils.ts';
4
+ import milestone from './milestone.ts';
5
+
6
+ installTestDom();
7
+
8
+ describe('Milestone module', () => {
9
+ it('adds milestone status and task details', () => {
10
+ const milestoneElement = createElement('iam-milestone', {
11
+ dataStatus: 'Current',
12
+ dataItems: JSON.stringify([
13
+ {
14
+ name: 'Checks',
15
+ description: 'Run checks',
16
+ date_completed: '2026-01-01',
17
+ actions: [
18
+ { action: 'One', date_completed: '2026-01-01' },
19
+ { action: 'Two' },
20
+ ],
21
+ },
22
+ ]),
23
+ });
24
+ milestoneElement.shadowRoot = createElement('shadow-root');
25
+ const wrap = createElement('div', { class: 'milestone-wrap' });
26
+ const tasks = createElement('div', { class: 'task-wrap' });
27
+ append(milestoneElement.shadowRoot, wrap, tasks);
28
+
29
+ milestone(milestoneElement);
30
+
31
+ expect(milestoneElement.classList.contains('current'));
32
+ expect(wrap.children[0].innerHTML === 'Current Step');
33
+ expect(tasks.children[0].querySelector('summary').innerHTML.includes('(1/2)'));
34
+ });
35
+ });
@@ -0,0 +1,22 @@
1
+ import { describe, expect, it } from './test.ts';
2
+ import { createElement, installTestDom } from './test-dom.ts';
3
+ import { append } from './test-utils.ts';
4
+ import { closeModal, openModal } from './modal.ts';
5
+
6
+ const { window } = installTestDom();
7
+
8
+ describe('Modal module', () => {
9
+ it('opens and closes modal dialogs with data layer events', () => {
10
+ window.dataLayer = [];
11
+ const dialog = createElement('dialog');
12
+ const modal = createElement('iam-modal', { id: 'confirm' });
13
+ append(dialog, modal);
14
+
15
+ openModal(modal);
16
+ closeModal(modal);
17
+
18
+ expect(dialog.open === false);
19
+ expect(window.dataLayer[0].event === 'openModal');
20
+ expect(window.dataLayer[1].event === 'closeModal');
21
+ });
22
+ });
@@ -0,0 +1,41 @@
1
+ import { describe, expect, it } from './test.ts';
2
+ import { createElement, installTestDom } from './test-dom.ts';
3
+ import { append } from './test-utils.ts';
4
+ import { populateLinks, setEnabledLinks } from './nav.ts';
5
+
6
+ installTestDom();
7
+
8
+ describe('Navigation module', () => {
9
+ it('builds navigation links and enables linked destinations', () => {
10
+ const links = [
11
+ {
12
+ title: 'Sales',
13
+ productKey: 'sales',
14
+ featureKey: 'dashboard',
15
+ destinations: {
16
+ unlinked: '/sales',
17
+ linkedEnabled: '/linked',
18
+ linkedDisabled: '/disabled',
19
+ },
20
+ },
21
+ ];
22
+ const component = createElement('nav');
23
+ component.innerHTML = populateLinks(links);
24
+ const link = createElement('a', {
25
+ dataProduct: 'sales',
26
+ dataFeature: 'dashboard',
27
+ dataEnabled: '/linked',
28
+ href: '/sales',
29
+ target: '_blank',
30
+ });
31
+ append(component, link);
32
+
33
+ setEnabledLinks(component, {
34
+ attributes: { products: { sales: { features: { dashboard: true } } } },
35
+ });
36
+
37
+ expect(populateLinks(links).includes('data-product="sales"'));
38
+ expect(link.getAttribute('href') === '/linked');
39
+ expect(!link.hasAttribute('target'));
40
+ });
41
+ });
@@ -0,0 +1,15 @@
1
+ import { describe, expect, it } from './test.ts';
2
+ import { createElement, installTestDom } from './test-dom.ts';
3
+ import { closeNotification } from './notification.ts';
4
+
5
+ installTestDom();
6
+
7
+ describe('Notification module', () => {
8
+ it('hides notifications', () => {
9
+ const notification = createElement('div');
10
+
11
+ closeNotification(notification);
12
+
13
+ expect(notification.classList.contains('d-none'));
14
+ });
15
+ });
@@ -0,0 +1,19 @@
1
+ import { describe, expect, it } from './test.ts';
2
+ import { createElement, installTestDom } from './test-dom.ts';
3
+ import { append } from './test-utils.ts';
4
+ import orderlist from './orderablelist.ts';
5
+
6
+ installTestDom();
7
+
8
+ describe('Orderable list module', () => {
9
+ it('sets sortable list semantics', () => {
10
+ const list = createElement('ol');
11
+ append(list, createElement('li', {}, 'First'), createElement('li', {}, 'Second'));
12
+
13
+ orderlist(list);
14
+
15
+ expect(list.getAttribute('role') === 'list');
16
+ expect(list.children[0].getAttribute('draggable') === 'true');
17
+ expect(list.children[1].getAttribute('data-order') === '2');
18
+ });
19
+ });
@@ -0,0 +1,25 @@
1
+ import { describe, expect, it } from './test.ts';
2
+ import { createElement, installTestDom } from './test-dom.ts';
3
+ import createPaginationButtons from './pagination.ts';
4
+
5
+ installTestDom();
6
+
7
+ describe('Pagination module', () => {
8
+ it('renders pagination controls from controller attributes', () => {
9
+ const controller = createElement('iam-table', {
10
+ dataPages: '3',
11
+ dataPage: '2',
12
+ dataTotal: '30',
13
+ dataShow: '10',
14
+ dataIncrement: '10',
15
+ });
16
+ const pagination = createElement('div');
17
+
18
+ const result = createPaginationButtons(controller, pagination);
19
+
20
+ expect(result === true);
21
+ expect(pagination.innerHTML.includes('<option value="2" selected>2</option>'));
22
+ expect(pagination.innerHTML.includes('data-page="1"'));
23
+ expect(pagination.innerHTML.includes('data-page="3"'));
24
+ });
25
+ });
@@ -0,0 +1,40 @@
1
+ import { describe, expect, it } from './test.ts';
2
+ import { createElement, installTestDom } from './test-dom.ts';
3
+ import { append } from './test-utils.ts';
4
+ import { changeType, checkPWDStrength } from './password.ts';
5
+
6
+ const { document } = installTestDom();
7
+
8
+ describe('Password module', () => {
9
+ it('toggles password input visibility', () => {
10
+ const wrapper = createElement('div');
11
+ const input = createElement('input', { type: 'password' });
12
+ input.type = 'password';
13
+ const toggle = createElement('span', { dataAltClass: 'is-visible' });
14
+ const button = createElement('button', { class: 'is-hidden' });
15
+ append(toggle, button);
16
+ append(wrapper, input, toggle);
17
+
18
+ changeType(toggle);
19
+ toggle.dispatchEvent(new Event('click'));
20
+
21
+ expect(input.getAttribute('type') === 'text');
22
+ expect(button.getAttribute('class') === 'is-visible');
23
+ });
24
+
25
+ it('writes password strength feedback without the breach check when already checked', () => {
26
+ const input = createElement('input', {
27
+ dataStrengthChecker: 'strength',
28
+ minlength: '8',
29
+ value: 'Aa1!aaaa',
30
+ });
31
+ const feedback = createElement('div', { id: 'strength', class: 'invalid-feedback' });
32
+ append(document.body, input, feedback);
33
+
34
+ checkPWDStrength(input, 'success');
35
+
36
+ expect(feedback.getAttribute('data-strength') === '5');
37
+ expect(feedback.innerHTML.includes('Very strong'));
38
+ expect(!feedback.classList.contains('invalid-feedback'));
39
+ });
40
+ });
@@ -0,0 +1,57 @@
1
+ /* eslint-disable */
2
+
3
+ import { describe, expect, it } from './test.ts';
4
+ import { createElement, installTestDom } from './test-dom.ts';
5
+ import { append } from './test-utils.ts';
6
+ import { addDataAttributes, formatCell, sortTableByValues } from './table.ts';
7
+
8
+ installTestDom();
9
+
10
+ const makeTable = () => {
11
+ const table = createElement('table');
12
+ const thead = createElement('thead');
13
+ const headRow = createElement('tr');
14
+ const tbody = createElement('tbody');
15
+
16
+ append(thead, append(headRow, createElement('th', {}, 'Name'), createElement('th', {}, 'Score')));
17
+ append(
18
+ tbody,
19
+ append(createElement('tr'), createElement('td', { dataLabel: 'Name' }, 'Bravo'), createElement('td', { dataLabel: 'Score' }, '2')),
20
+ append(createElement('tr'), createElement('td', { dataLabel: 'Name' }, 'Alpha'), createElement('td', { dataLabel: 'Score' }, '10'))
21
+ );
22
+ append(table, thead, tbody);
23
+
24
+ return { table, tbody };
25
+ };
26
+
27
+ describe('Table module', () => {
28
+ it('formats and sorts table data', () => {
29
+ const { table, tbody } = makeTable();
30
+
31
+ sortTableByValues(table, 'Score', 'asc');
32
+
33
+ expect(formatCell('capitalise', 'alpha') === 'Alpha');
34
+ expect(tbody.innerHTML.indexOf('2') < tbody.innerHTML.indexOf('10'));
35
+ });
36
+
37
+ it('adds data labels and content markers to table cells', () => {
38
+ const table = createElement('table');
39
+ const thead = createElement('thead');
40
+ const headRow = createElement('tr');
41
+ const statusHeading = createElement('th', {}, 'Status');
42
+ const dateHeading = createElement('th', { dataFormat: 'capitalise' }, 'Name');
43
+ const tbody = createElement('tbody');
44
+ const row = createElement('tr');
45
+ append(headRow, statusHeading, dateHeading);
46
+ append(thead, headRow);
47
+ append(row, createElement('td', {}, 'Complete'), createElement('td', {}, 'alpha'));
48
+ append(tbody, row);
49
+ append(table, thead, tbody);
50
+
51
+ addDataAttributes(table);
52
+
53
+ expect(row.children[0].getAttribute('data-label') === 'Status');
54
+ expect(row.children[0].getAttribute('data-content') === 'complete');
55
+ expect(row.children[1].innerHTML === 'Alpha');
56
+ });
57
+ });
@@ -0,0 +1,27 @@
1
+ import { describe, expect, it } from './test.ts';
2
+ import { createElement, installTestDom } from './test-dom.ts';
3
+ import { append } from './test-utils.ts';
4
+ import { openFirstTab, toggleTab } from './tabs.ts';
5
+
6
+ installTestDom();
7
+
8
+ describe('Tabs module', () => {
9
+ it('toggles tabs and opens the first tab by default', () => {
10
+ 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
+ tabs.shadowRoot = createElement('shadow-root');
16
+ const links = createElement('div', { class: 'tabs__links' });
17
+ append(links, buttonOne, buttonTwo);
18
+ append(tabs.shadowRoot, links);
19
+ append(tabs, first, second);
20
+
21
+ toggleTab([first, second], buttonTwo);
22
+ openFirstTab(tabs);
23
+
24
+ expect(!first.hasAttribute('open'));
25
+ expect(second.hasAttribute('open'));
26
+ });
27
+ });