@iamproperty/components 7.8.2--beta6 → 7.8.2--beta7

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 (238) hide show
  1. package/assets/css/components/actionbar.component.css +1 -1
  2. package/assets/css/components/actionbar.component.css.map +1 -1
  3. package/assets/css/components/address-lookup.component.css +1 -1
  4. package/assets/css/components/address-lookup.component.css.map +1 -1
  5. package/assets/css/components/advanced-select.component.css +1 -1
  6. package/assets/css/components/advanced-select.component.css.map +1 -1
  7. package/assets/css/components/banner.component.css +1 -1
  8. package/assets/css/components/banner.component.css.map +1 -1
  9. package/assets/css/components/barchart.component.css +1 -1
  10. package/assets/css/components/barchart.component.css.map +1 -1
  11. package/assets/css/components/branch-selector.css +1 -0
  12. package/assets/css/components/branch-selector.css.map +1 -0
  13. package/assets/css/components/calendar.component.css +1 -1
  14. package/assets/css/components/calendar.component.css.map +1 -1
  15. package/assets/css/components/card.component.css +1 -1
  16. package/assets/css/components/card.component.css.map +1 -1
  17. package/assets/css/components/card.module.css +1 -1
  18. package/assets/css/components/card.module.css.map +1 -1
  19. package/assets/css/components/card.preload.css +1 -1
  20. package/assets/css/components/card.preload.css.map +1 -1
  21. package/assets/css/components/carousel.component.css +1 -1
  22. package/assets/css/components/carousel.component.css.map +1 -1
  23. package/assets/css/components/charts.config.css +1 -1
  24. package/assets/css/components/charts.config.css.map +1 -1
  25. package/assets/css/components/collapsible-side.css +1 -1
  26. package/assets/css/components/collapsible-side.css.map +1 -1
  27. package/assets/css/components/config.component.css +1 -1
  28. package/assets/css/components/config.component.css.map +1 -1
  29. package/assets/css/components/doughnutchart.component.css +1 -1
  30. package/assets/css/components/doughnutchart.component.css.map +1 -1
  31. package/assets/css/components/fileupload.css +1 -1
  32. package/assets/css/components/fileupload.css.map +1 -1
  33. package/assets/css/components/filter-card.component.css +1 -1
  34. package/assets/css/components/filter-card.component.css.map +1 -1
  35. package/assets/css/components/inline-edit.css +1 -1
  36. package/assets/css/components/inline-edit.css.map +1 -1
  37. package/assets/css/components/menu.component.css +1 -1
  38. package/assets/css/components/menu.component.css.map +1 -1
  39. package/assets/css/components/modal.component.css +1 -1
  40. package/assets/css/components/modal.component.css.map +1 -1
  41. package/assets/css/components/multi-step-modal.component.css +1 -1
  42. package/assets/css/components/multi-step-modal.component.css.map +1 -1
  43. package/assets/css/components/multiselect.css +1 -1
  44. package/assets/css/components/multiselect.css.map +1 -1
  45. package/assets/css/components/nav-standalone.component.css +1 -0
  46. package/assets/css/components/nav-standalone.component.css.map +1 -0
  47. package/assets/css/components/nav.component.css +1 -1
  48. package/assets/css/components/nav.component.css.map +1 -1
  49. package/assets/css/components/nav.global.css +1 -1
  50. package/assets/css/components/nav.global.css.map +1 -1
  51. package/assets/css/components/nav.preload.css +1 -1
  52. package/assets/css/components/nav.preload.css.map +1 -1
  53. package/assets/css/components/notification.css +1 -1
  54. package/assets/css/components/notification.css.map +1 -1
  55. package/assets/css/components/pagination.css +1 -1
  56. package/assets/css/components/pagination.css.map +1 -1
  57. package/assets/css/components/record-card.component.css +1 -1
  58. package/assets/css/components/record-card.component.css.map +1 -1
  59. package/assets/css/components/search.component.css +1 -1
  60. package/assets/css/components/search.component.css.map +1 -1
  61. package/assets/css/components/slider.css +1 -1
  62. package/assets/css/components/slider.css.map +1 -1
  63. package/assets/css/components/split-button.component.css +1 -1
  64. package/assets/css/components/split-button.component.css.map +1 -1
  65. package/assets/css/components/tabs.component.css +1 -1
  66. package/assets/css/components/tabs.component.css.map +1 -1
  67. package/assets/css/components/tag.component.css +1 -1
  68. package/assets/css/components/tag.component.css.map +1 -1
  69. package/assets/css/components/video-card.component.css +1 -1
  70. package/assets/css/components/video-card.component.css.map +1 -1
  71. package/assets/css/components/video-modal.component.css +1 -1
  72. package/assets/css/components/video-modal.component.css.map +1 -1
  73. package/assets/css/components/video.component.css +1 -1
  74. package/assets/css/components/video.component.css.map +1 -1
  75. package/assets/css/core.min.css +1 -1
  76. package/assets/css/core.min.css.map +1 -1
  77. package/assets/css/elements/buttons--action.css +1 -1
  78. package/assets/css/elements/buttons--action.css.map +1 -1
  79. package/assets/css/elements/buttons--compact.css +1 -1
  80. package/assets/css/elements/buttons--compact.css.map +1 -1
  81. package/assets/css/elements/buttons--global.css +1 -1
  82. package/assets/css/elements/buttons--global.css.map +1 -1
  83. package/assets/css/elements/buttons--secondary.css +1 -1
  84. package/assets/css/elements/buttons--secondary.css.map +1 -1
  85. package/assets/css/elements/buttons--tertiary.css +1 -1
  86. package/assets/css/elements/buttons--tertiary.css.map +1 -1
  87. package/assets/css/elements/buttons.css +1 -1
  88. package/assets/css/elements/buttons.css.map +1 -1
  89. package/assets/css/elements/dropdown.css +1 -1
  90. package/assets/css/elements/dropdown.css.map +1 -1
  91. package/assets/css/elements/forms.css +1 -1
  92. package/assets/css/elements/forms.css.map +1 -1
  93. package/assets/css/elements/links--global.css +1 -1
  94. package/assets/css/elements/links--global.css.map +1 -1
  95. package/assets/css/elements/links.css +1 -1
  96. package/assets/css/elements/links.css.map +1 -1
  97. package/assets/css/elements/popover.css +1 -1
  98. package/assets/css/elements/popover.css.map +1 -1
  99. package/assets/css/elements/select.css +1 -1
  100. package/assets/css/elements/select.css.map +1 -1
  101. package/assets/css/elements/tooltips.css +1 -1
  102. package/assets/css/elements/tooltips.css.map +1 -1
  103. package/assets/css/style.min.css +1 -1
  104. package/assets/css/style.min.css.map +1 -1
  105. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  106. package/assets/js/components/actionbar/actionbar.component.min.js +3 -3
  107. package/assets/js/components/address-lookup/address-lookup.component.js +1 -1
  108. package/assets/js/components/address-lookup/address-lookup.component.min.js +5 -5
  109. package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
  110. package/assets/js/components/advanced-select/advanced-select.component.min.js +4 -4
  111. package/assets/js/components/advanced-select/advanced-select.component.min.js.map +1 -1
  112. package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
  113. package/assets/js/components/banner/banner.component.min.js +2 -2
  114. package/assets/js/components/barchart/barchart.component.min.js +2 -2
  115. package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
  116. package/assets/js/components/bone/bone.component.min.js +1 -1
  117. package/assets/js/components/branch-selector/branch-selector.component.js +69 -0
  118. package/assets/js/components/branch-selector/branch-selector.component.min.js +22 -0
  119. package/assets/js/components/branch-selector/branch-selector.component.min.js.map +1 -0
  120. package/assets/js/components/button/button.component.min.js +1 -1
  121. package/assets/js/components/calendar/calendar.component.min.js +2 -2
  122. package/assets/js/components/card/card.component.min.js +3 -3
  123. package/assets/js/components/carousel/carousel.component.min.js +3 -3
  124. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +2 -2
  125. package/assets/js/components/config/config.component.min.js +3 -3
  126. package/assets/js/components/config/config.component.min.js.map +1 -1
  127. package/assets/js/components/content/content.component.min.js +1 -1
  128. package/assets/js/components/darkmode/darkmode.component.min.js +1 -1
  129. package/assets/js/components/doughnutchart/doughnutchart.component.min.js +4 -4
  130. package/assets/js/components/fileupload/fileupload.component.min.js +4 -4
  131. package/assets/js/components/filter-card/filter-card.component.min.js +5 -5
  132. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  133. package/assets/js/components/form/form.component.min.js +1 -1
  134. package/assets/js/components/header/header.component.min.js +1 -1
  135. package/assets/js/components/inline-edit/inline-edit.component.min.js +2 -2
  136. package/assets/js/components/input/input.component.min.js +1 -1
  137. package/assets/js/components/input-range/input-range.component.min.js +1 -1
  138. package/assets/js/components/marketing/marketing.component.min.js +1 -1
  139. package/assets/js/components/menu/menu.component.min.js +2 -2
  140. package/assets/js/components/milestone/milestone.component.min.js +1 -1
  141. package/assets/js/components/milestone-group/milestone-group.component.min.js +1 -1
  142. package/assets/js/components/modal/modal.component.js +2 -0
  143. package/assets/js/components/modal/modal.component.min.js +4 -4
  144. package/assets/js/components/modal/modal.component.min.js.map +1 -1
  145. package/assets/js/components/multi-step/multi-step.component.min.js +1 -1
  146. package/assets/js/components/multi-step-modal/multi-step-modal.component.min.js +4 -4
  147. package/assets/js/components/multiselect/multiselect.component.js +14 -18
  148. package/assets/js/components/multiselect/multiselect.component.min.js +14 -14
  149. package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
  150. package/assets/js/components/nav/nav.component.js +30 -255
  151. package/assets/js/components/nav/nav.component.min.js +46 -30
  152. package/assets/js/components/nav/nav.component.min.js.map +1 -1
  153. package/assets/js/components/nav-standalone/nav-standalone.component.js +51 -0
  154. package/assets/js/components/nav-standalone/nav-standalone.component.min.js +80 -0
  155. package/assets/js/components/nav-standalone/nav-standalone.component.min.js.map +1 -0
  156. package/assets/js/components/notification/notification.component.min.js +2 -2
  157. package/assets/js/components/pagination/pagination.component.min.js +2 -2
  158. package/assets/js/components/password/password.component.min.js +1 -1
  159. package/assets/js/components/popover/popover.component.min.js +1 -1
  160. package/assets/js/components/rank/rank.component.min.js +1 -1
  161. package/assets/js/components/rankings/rankings.component.min.js +1 -1
  162. package/assets/js/components/rating/rating.component.min.js +1 -1
  163. package/assets/js/components/record-card/record-card.component.min.js +6 -6
  164. package/assets/js/components/search/search.component.min.js +2 -2
  165. package/assets/js/components/skeleton/skeleton.component.min.js +1 -1
  166. package/assets/js/components/slider/slider.component.min.js +2 -2
  167. package/assets/js/components/split-button/split-button.component.min.js +4 -4
  168. package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js +5 -5
  169. package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js.map +1 -1
  170. package/assets/js/components/std-nav/std-nav.component.js +32 -58
  171. package/assets/js/components/std-nav/std-nav.component.min.js +9 -54
  172. package/assets/js/components/std-nav/std-nav.component.min.js.map +1 -1
  173. package/assets/js/components/table/table.component.min.js +2 -2
  174. package/assets/js/components/table-ajax/table-ajax.component.min.js +2 -2
  175. package/assets/js/components/table-basic/table-basic.component.min.js +1 -1
  176. package/assets/js/components/table-no-submit/table-no-submit.component.min.js +2 -2
  177. package/assets/js/components/table-submit/table-submit.component.min.js +2 -2
  178. package/assets/js/components/tabs/tabs.component.min.js +2 -2
  179. package/assets/js/components/tag/tag.component.min.js +4 -4
  180. package/assets/js/components/tag/tag.component.min.js.map +1 -1
  181. package/assets/js/components/tooltip/tooltip.component.min.js +1 -1
  182. package/assets/js/components/video/video.component.min.js +2 -2
  183. package/assets/js/components/video-card/video-card.component.min.js +6 -6
  184. package/assets/js/components/video-modal/video-modal.component.min.js +5 -5
  185. package/assets/js/components/word-count/word-count.component.min.js +1 -1
  186. package/assets/js/modules/advanced-select.js +13 -5
  187. package/assets/js/modules/nav.js +183 -64
  188. package/assets/js/modules/nav.test.js +4 -1
  189. package/assets/js/scripts.bundle.js +1 -1
  190. package/assets/js/scripts.bundle.min.js +1 -1
  191. package/assets/sass/components/branch-selector.scss +112 -0
  192. package/assets/sass/components/card.module.scss +11 -1
  193. package/assets/sass/components/card.preload.scss +0 -15
  194. package/assets/sass/components/charts.config.scss +3 -3
  195. package/assets/sass/components/menu.component.scss +2 -1
  196. package/assets/sass/components/multiselect.scss +0 -1
  197. package/assets/sass/components/nav-standalone.component.scss +50 -0
  198. package/assets/sass/components/nav.component.scss +142 -116
  199. package/assets/sass/components/nav.global.scss +26 -198
  200. package/assets/sass/components/nav.preload.scss +1 -7
  201. package/assets/sass/elements/buttons--action.css +1 -1
  202. package/assets/sass/elements/buttons--compact.css +8 -4
  203. package/assets/sass/elements/buttons--global.css +3 -6
  204. package/assets/sass/elements/buttons--secondary.css +1 -1
  205. package/assets/sass/elements/buttons--tertiary.css +1 -1
  206. package/assets/sass/elements/dropdown.css +16 -2
  207. package/assets/sass/elements/links--global.scss +29 -3
  208. package/assets/sass/elements/popover.scss +1 -0
  209. package/assets/sass/elements/select.scss +1 -1
  210. package/assets/sass/elements/tooltips.scss +54 -0
  211. package/assets/sass/foundations/root.scss +4 -0
  212. package/assets/sass/templates/form.scss +26 -3
  213. package/assets/ts/components/address-lookup/address-lookup.component.ts +2 -1
  214. package/assets/ts/components/branch-selector/branch-selector.component.ts +93 -0
  215. package/assets/ts/components/modal/modal.component.ts +3 -0
  216. package/assets/ts/components/multiselect/multiselect.component.ts +20 -23
  217. package/assets/ts/components/nav/nav.component.ts +30 -285
  218. package/assets/ts/components/nav-standalone/nav-standalone.component.ts +69 -0
  219. package/assets/ts/components/std-nav/std-nav.component.ts +38 -81
  220. package/assets/ts/modules/advanced-select.ts +12 -11
  221. package/assets/ts/modules/nav.test.ts +4 -1
  222. package/assets/ts/modules/nav.ts +221 -78
  223. package/dist/components.es.js +1130 -1095
  224. package/dist/components.umd.js +290 -242
  225. package/package.json +2 -2
  226. package/src/components/BranchSelector/BranchSelector.vue +20 -0
  227. package/src/components/{STDNavStandalone/STDNavStandalone.vue → NavStandalone/NavStandalone.vue} +3 -3
  228. package/src/index.js +1 -0
  229. package/assets/css/components/nav.docs.css +0 -1
  230. package/assets/css/components/nav.docs.css.map +0 -1
  231. package/assets/css/components/std-nav-standalone.component.css +0 -1
  232. package/assets/css/components/std-nav-standalone.component.css.map +0 -1
  233. package/assets/js/components/std-nav-standalone/std-nav-standalone.component.js +0 -70
  234. package/assets/js/components/std-nav-standalone/std-nav-standalone.component.min.js +0 -20
  235. package/assets/js/components/std-nav-standalone/std-nav-standalone.component.min.js.map +0 -1
  236. package/assets/sass/components/nav.docs.scss +0 -54
  237. package/assets/sass/components/std-nav-standalone.component.scss +0 -229
  238. package/assets/ts/components/std-nav-standalone/std-nav-standalone.component.ts +0 -94
@@ -14,6 +14,7 @@ window.dataLayer.push({
14
14
  element: 'Address Lookup',
15
15
  });
16
16
 
17
+
17
18
  class iamAddressLookup extends HTMLElement {
18
19
  constructor() {
19
20
  super();
@@ -56,7 +57,7 @@ class iamAddressLookup extends HTMLElement {
56
57
 
57
58
  <div class="datalist__wrapper dropdown ${this.hasAttribute('data-list-class') ? this.getAttribute('data-list-class') : ''}" tabindex="0" part="list-wrapper">
58
59
  <slot name="beforeList"></slot>
59
-
60
+
60
61
  <datalist id="address-lookup__addressess" class=""></datalist>
61
62
  <div id="paginationWrapper"></div>
62
63
  <slot name="afterList"></slot>
@@ -0,0 +1,93 @@
1
+
2
+ class iamBranchSelector extends HTMLElement {
3
+ constructor() {
4
+ super();
5
+ this.attachShadow({ mode: 'open' });
6
+
7
+ const assetLocation = document.body.hasAttribute('data-assets-location')
8
+ ? document.body.getAttribute('data-assets-location')
9
+ : '/assets';
10
+ const loadCSS = `@import "${assetLocation}/css/components/branch-selector.component.css";`;
11
+
12
+ const template = document.createElement('template');
13
+ template.innerHTML = /* HTML */ `
14
+ <style>
15
+ ${loadCSS}
16
+ </style>
17
+ <link rel="stylesheet" href="https://kit.fontawesome.com/8bd0fca975.css" crossorigin="anonymous">
18
+ <div class="wrapper">
19
+
20
+ <button id="menuButton" class="btn btn-action" popovertarget="branches" aria-haspopup="true" aria-controls="branches" style="anchor-name: --branches;">
21
+ <i class="fa-regular fa-building-circle-check"></i>
22
+ <span class="indicator"></span>
23
+ <span class="selected">Branch</span>
24
+ </button>
25
+ <div class="dropdown" part="dropdown" id="branches" style="position-anchor: --branches;" role="menu" popover="auto">
26
+ <slot></slot>
27
+ </div>
28
+ </div>
29
+ `;
30
+ this.shadowRoot?.appendChild(template.content.cloneNode(true));
31
+ }
32
+
33
+
34
+ connectedCallback(): void {
35
+
36
+
37
+ const menuButton = this.shadowRoot?.querySelector('#menuButton');
38
+
39
+ let selected = this.querySelector('input:checked') ? this.querySelector('input:checked') : this.querySelector('input'); // By default the first input is checked if an input hasn't been checked on load
40
+ selected.checked = true;
41
+
42
+
43
+ menuButton?.querySelector('span.selected').textContent = selected?.closest('label').textContent;
44
+ menuButton?.setAttribute('data-checked-count',this.querySelectorAll('input:checked').length - 1);
45
+
46
+ if(this.hasAttribute('data-indicator'))
47
+ menuButton?.querySelector('span.indicator').setAttribute('data-indicator',this.getAttribute('data-indicator'));
48
+
49
+
50
+
51
+ // Make sure the correct classes and attributes are set on each item
52
+ Array.from(this.querySelectorAll(':scope > label:has(input)')).forEach(item => {
53
+ item.classList.add('dropdown__option');
54
+ item.setAttribute('title',item.textContent);// Set a title on all labels
55
+ });
56
+
57
+
58
+
59
+ // If all of the inputs are disabled then disable the button
60
+ if(this.querySelectorAll('input:disabled').length && !this.querySelectorAll('input:not(:disabled)').length)
61
+ menuButton?.setAttribute('disabled', 'disabled');
62
+
63
+ this.addEventListener('change', ():void => {
64
+
65
+ selected = this.querySelector('input:checked') ? this.querySelector('input:checked') : this.querySelector('input');
66
+ selected.checked = true;
67
+
68
+ menuButton?.querySelector('span.selected').innerHTML = selected?.closest('label').textContent;
69
+ menuButton?.setAttribute('data-checked-count',this.querySelectorAll('input:checked').length - 1);
70
+
71
+
72
+ if(this.querySelectorAll('input[type="checkbox"]:checked').length == 1){
73
+ selected?.closest('label').classList.add('pe-none');
74
+ }
75
+ else if(this.querySelectorAll('input[type="checkbox"]:checked').length > 1){
76
+ this.querySelector('label.pe-none')?.classList.remove('pe-none');
77
+ }
78
+
79
+ });
80
+
81
+ // Desktop menu button
82
+ menuButton?.addEventListener('click', (e) => {
83
+
84
+
85
+ if(this.hasAttribute('slot') && this.getAttribute('slot') == "account"){
86
+ e.preventDefault();
87
+ this.classList.toggle('branch-selector-inline');
88
+ }
89
+ });
90
+ }
91
+ }
92
+
93
+ export default iamBranchSelector;
@@ -106,6 +106,9 @@ class iamModal extends HTMLElement {
106
106
 
107
107
  // Move the submit button so that the slot functionality works
108
108
  if(originalDialog) {
109
+ if(originalDialog.hasAttribute('open'))
110
+ dialog?.showModal();
111
+
109
112
  Array.from(originalDialog?.querySelectorAll('[slot]')).forEach((element) => {
110
113
  this.moveBefore(element, originalDialog);
111
114
  });
@@ -1,12 +1,5 @@
1
1
  import { searchAjax, filterList, addKeyboardEvents } from '../../modules/dropdown';
2
2
 
3
- // Data layer Web component created
4
- window.dataLayer = window.dataLayer || [];
5
- window.dataLayer.push({
6
- event: 'customElementRegistered',
7
- element: 'mutliselect',
8
- });
9
-
10
3
  class iamMultiselect extends HTMLElement {
11
4
  constructor() {
12
5
  super();
@@ -15,28 +8,28 @@ class iamMultiselect extends HTMLElement {
15
8
  const assetLocation = document.body.hasAttribute('data-assets-location')
16
9
  ? document.body.getAttribute('data-assets-location')
17
10
  : '/assets';
18
-
11
+
19
12
  const loadCSS = `@import "${assetLocation}/css/components/multiselect.css";`;
20
13
 
21
14
  const template = document.createElement('template');
22
15
  template.innerHTML = `
23
16
  <style>
24
-
17
+
25
18
  ${loadCSS}
26
19
  ${this.hasAttribute('css') ? `@import "${this.getAttribute('css')}";` : ``}
27
20
  </style>
28
21
  <label for="search" class="mb-0"><span class="inner-label label"></span> <slot name="feedback"></slot>
29
22
  <div class="outer">
30
- <div class="wrapper">
31
-
32
- <slot name="checked"></slot>
33
- <input name="search" id="search" autocomplete="off" required part="search-input"/>
34
- <span class="admin-panel feedback">This field is required</span>
35
- <div class="admin-panel dropdown" part="dropdown">
36
- <slot></slot>
23
+ <div class="wrapper">
24
+
25
+ <slot name="checked"></slot>
26
+ <input name="search" id="search" autocomplete="off" required part="search-input"/>
27
+ <span class="admin-panel feedback">This field is required</span>
28
+ <div class="admin-panel dropdown" part="dropdown">
29
+ <slot></slot>
30
+ </div>
31
+ <button id="clear" class="btn btn-action "><span class="visually-hidden">Clear</span></button>
37
32
  </div>
38
- <button id="clear" class="btn btn-action "><span class="visually-hidden">Clear</span></button>
39
- </div>
40
33
  </div>
41
34
  </label>
42
35
  `;
@@ -49,7 +42,7 @@ class iamMultiselect extends HTMLElement {
49
42
  const form = this.closest('form');
50
43
  const wrapper = this.shadowRoot.querySelector('.wrapper');
51
44
  const search = multiselect.shadowRoot.querySelector('#search');
52
- const button = multiselect.shadowRoot.querySelector('#clear');
45
+ const clearButton = multiselect.shadowRoot.querySelector('#clear');
53
46
  let order = 0;
54
47
  const innerLabel = multiselect.shadowRoot.querySelector('label .inner-label');
55
48
  const ajaxURL = this.getAttribute('data-url');
@@ -139,10 +132,10 @@ class iamMultiselect extends HTMLElement {
139
132
  search.addEventListener('input', () => {
140
133
 
141
134
  if (multiselect.hasAttribute('data-url') && search.value.length == minLength) {
142
-
135
+
143
136
  searchAjax(multiselect, search, filterList);
144
137
  } else {
145
-
138
+
146
139
  filterList(multiselect, search);
147
140
  }
148
141
  });
@@ -218,7 +211,7 @@ class iamMultiselect extends HTMLElement {
218
211
  });
219
212
 
220
213
  // Clear all
221
- button.addEventListener('click', function () {
214
+ clearButton.addEventListener('click', () => {
222
215
  Array.from(multiselect.querySelectorAll(`label input[type="checkbox"]`)).forEach((checkbox) => {
223
216
  checkbox.checked = false;
224
217
 
@@ -226,6 +219,10 @@ class iamMultiselect extends HTMLElement {
226
219
  });
227
220
 
228
221
  search.focus();
222
+
223
+ const clearEvent = new CustomEvent('clear');
224
+
225
+ this.dispatchEvent(clearEvent);
229
226
  });
230
227
 
231
228
  // Add some keyboard features to keep it accessible
@@ -295,7 +292,7 @@ class iamMultiselect extends HTMLElement {
295
292
  });
296
293
  }
297
294
  else {
298
-
295
+
299
296
  setItem(activeElement);
300
297
  }
301
298
 
@@ -1,9 +1,4 @@
1
- // Data layer Web component created
2
- window.dataLayer = window.dataLayer || [];
3
- window.dataLayer.push({
4
- event: 'customElementRegistered',
5
- element: 'nav',
6
- });
1
+ import { navTemplate, branchSelector, menuEvents, megaMenuTitles, megaMenusEvents, accountMenuEvents, backdropEvents } from '../../modules/nav';
7
2
 
8
3
  class iamNav extends HTMLElement {
9
4
  constructor() {
@@ -13,42 +8,17 @@ class iamNav extends HTMLElement {
13
8
  const assetLocation = document.body.hasAttribute('data-assets-location')
14
9
  ? document.body.getAttribute('data-assets-location')
15
10
  : '/assets';
16
- const loadCSS = `@import "${assetLocation}/css/components/nav.component.css";`;
11
+ const navCSS = `@import "${assetLocation}/css/components/nav.component.css";`;
17
12
  const loadExtraCSS = `@import "${assetLocation}/css/components/nav.global.css";`;
18
13
 
19
14
  const template = document.createElement('template');
20
- template.innerHTML = `
15
+ template.innerHTML = /* HTML */`
21
16
  <style class="styles">
22
-
23
- ${loadCSS}
24
- </style>
25
- <style class="doc-styles">
17
+ ${navCSS}
26
18
  </style>
27
- <link rel="stylesheet" href="https://kit.fontawesome.com/8bd0fca975.css" crossorigin="anonymous">
28
- <div class="container">
29
- <slot name="logo"></slot>
30
- <div class="buttons-holder"></div>
31
- <button class="btn-menu" part="btn-menu">Menu<i class="fa-regular fa-bars"></i><i class="fa-regular fa-xmark-large"></i></button>
32
-
33
- <div class="menu__outer">
34
- <div class="menu closed">
35
19
 
36
- <div class="menu__primary">
37
- <slot></slot>
38
- <slot name="dual"></slot>
39
- </div>
40
- <div class="dialog__wrapper d-none" id="search-wrapper"></div>
41
- <slot name="actions"></slot>
42
- <div class="menu__secondary bg-light">
43
- <div class="container">
44
- <slot name="secondary"></slot>
45
- </div>
46
- </div>
47
- </div>
48
- <slot name="menus"></slot>
49
- </div>
50
- </div>
51
- <div class="backdrop" part="backdrop"></div>
20
+ <link rel="stylesheet" href="https://kit.fontawesome.com/8bd0fca975.css" crossorigin="anonymous">
21
+ ${navTemplate}
52
22
  `;
53
23
 
54
24
  shadowRoot.appendChild(template.content.cloneNode(true));
@@ -59,255 +29,45 @@ class iamNav extends HTMLElement {
59
29
  }
60
30
 
61
31
  connectedCallback(): void {
62
- // Load external CSS if needed
63
- if (this.hasAttribute('data-css'))
64
- this.shadowRoot
65
- .querySelector('.doc-styles')
66
- .insertAdjacentHTML('beforeend', `@import "${this.getAttribute('data-css')}";`);
67
32
 
68
- const menuButton = this.shadowRoot.querySelector('.btn-menu');
69
- const menu = this.shadowRoot.querySelector('.menu');
70
- // eslint-disable-next-line @typescript-eslint/no-this-alias
71
- const iamNav = this;
72
33
  const backdrop = this.shadowRoot.querySelector('.backdrop');
73
- const buttonsHolder = this.shadowRoot.querySelector('.buttons-holder');
74
-
75
- // Check the content
76
- const createNavMenu = (component) => {
77
-
78
- buttonsHolder.innerHTML = '';
79
- component.querySelectorAll(':scope > *').forEach(function (element) {
80
- const tagname = element.tagName;
81
-
82
- switch (tagname) {
83
- case 'BUTTON':
84
- if (!element.hasAttribute('slot')) {
85
- element.setAttribute('slot', 'actions');
86
- menu.classList.add('has-actions');
87
- }
88
- break;
89
- }
90
-
91
34
 
92
- // Create menu button
93
- if (
94
- element.classList.contains('nav--menu') &&
95
- element.hasAttribute('data-title') &&
96
- element.hasAttribute('data-icon')
97
- ) {
98
- const title = element.getAttribute('data-title');
99
- const iconClass = element.getAttribute('data-icon');
100
-
101
- // Create the menu button that sits seperately to the menu
102
- const button = document.createElement('button');
103
- button.setAttribute('slot', title);
104
- button.classList.add('btn-menu');
105
- button.setAttribute('part', 'btn-menu');
106
- button.innerHTML = `<span class="btn btn-primary"><span>${title}</span><i class="${iconClass}"></i><i class="fa-regular fa-xmark-large"></i></span>`;
107
- buttonsHolder.insertAdjacentElement('beforeend', button);
108
-
109
- const mdButton = button.querySelector('.btn-primary');
110
-
111
- // Make sure the menu is added to the right part of the component
112
- element.setAttribute('slot', 'menus');
113
-
114
- // If open we need to make sure the main mobile menu is closed, the new button has the right state and the backdrop is shown
115
- if (element.classList.contains('open')) {
116
- button.setAttribute('aria-expanded', true);
117
- mdButton.classList.toggle('active');
118
- component.classList.add('open');
119
- backdrop.classList.add('show');
120
- } else {
121
- element.classList.add('closed'); // closed class is added to prevent the elements being tabbed into, this causes visual issues
122
- }
123
-
124
- // Click event
125
- button.addEventListener(
126
- 'click',
127
- function (e) {
128
- e.preventDefault();
129
- button.toggleAttribute('aria-expanded');
130
-
131
- console.log(element);
132
- element.classList.toggle('open');
133
- mdButton.classList.toggle('active');
134
-
135
- // Close desktop menus
136
- const openMenu = component.querySelector(':scope > details[open]');
137
-
138
- if (openMenu) openMenu.removeAttribute('open');
139
-
140
- // Close the main menu and fix states on the button, iamNav component and backdrop
141
- if (element.classList.contains('open')) {
142
- menu.classList.remove('open');
143
- menuButton.removeAttribute('aria-expanded');
144
- setTimeout(function () {
145
- menu.classList.add('closed');
146
- }, 1000); // Delay until its close so the animation is broken
147
- component.classList.add('open');
148
- backdrop.classList.add('show');
149
- element.classList.remove('closed');
150
- } else {
151
- component.classList.remove('open');
152
- backdrop.classList.remove('show');
153
- setTimeout(function () {
154
- element.classList.add('closed');
155
- }, 1000);
156
- }
157
-
158
- // Close any open menus
159
- component.querySelectorAll('.nav--menu.open').forEach(function (openmenu) {
160
- if (openmenu != element) {
161
- openmenu.classList.remove('open');
162
- }
163
- });
164
-
165
- component.shadowRoot
166
- .querySelectorAll('.buttons-holder .btn-menu[aria-expanded]')
167
- .forEach(function (selectedButton) {
168
- if (selectedButton != button) {
169
- selectedButton.removeAttribute('aria-expanded');
170
- const innerBtn = selectedButton.querySelector('.btn-primary');
171
- innerBtn.classList.remove('active');
172
- }
173
- });
174
- },
175
- false
176
- );
177
- }
178
- });
179
-
180
- component.querySelectorAll('details').forEach(function (element) {
181
- element.classList.add('details--revert');
182
- });
183
- }
184
- createNavMenu(this);
185
-
186
- this.addEventListener('rebuilt', () => {
187
- console.log('rebuilt nav');
188
- createNavMenu(this);
189
- });
35
+ const menuButton = this.shadowRoot.querySelector('#btn-menu');
36
+ const menu = this.shadowRoot.querySelector('.menu');
37
+ const accountMenuButton = this.shadowRoot.querySelector('#btn-menu-account');
38
+ const accountMenu = this.shadowRoot.querySelector('.nav--menu');
39
+ const accountBtnTitle = this.shadowRoot?.querySelector('#account-btn-title');
190
40
 
41
+ // #region Add Helper classes
191
42
  // Has secondary link
192
43
  if (this.querySelector('[slot="secondary"]')) {
193
- menu.classList.add('has-secondary');
44
+ this.classList.add('has-secondary');
194
45
  }
46
+ // #endregion
195
47
 
196
- // Open and close the menu
197
- menuButton.addEventListener(
198
- 'click',
199
- function (e) {
200
- e.preventDefault();
201
- //menuButton.toggleAttribute('aria-expanded');
202
- menu.classList.toggle('open');
48
+ accountBtnTitle.innerHTML = this.hasAttribute('data-account-btn-title') ? this.getAttribute('data-account-btn-title') : 'My account';
203
49
 
204
- // Close any other menus
205
- iamNav.querySelectorAll('.nav--menu.open').forEach(function (element) {
206
- element.classList.remove('open');
207
- setTimeout(function () {
208
- element.classList.add('closed');
209
- }, 1000);
210
- });
211
- iamNav.shadowRoot.querySelectorAll('.buttons-holder .btn-menu[aria-expanded]').forEach(function (element) {
212
- element.removeAttribute('aria-expanded');
213
- const innerBtn = element.querySelector('.btn-primary');
214
- innerBtn.classList.remove('active');
215
- });
216
-
217
- if (menu.classList.contains('open')) {
218
- iamNav.classList.add('open');
219
- menu.classList.remove('closed');
220
- } else {
221
- iamNav.classList.remove('open');
222
- setTimeout(function () {
223
- menu.classList.add('closed');
224
- }, 1000);
225
- }
226
- },
227
- false
228
- );
50
+ if(!this.querySelector('[slot="account"]')){
51
+ accountMenuButton?.remove();
52
+ accountMenu?.remove();
53
+ accountBtnTitle?.remove();
54
+ }
229
55
 
230
56
  // Allow outside JS to close the menu
231
57
  this.addEventListener('request-close', () => {
232
58
  menuButton.removeAttribute('aria-expanded');
233
59
  menu.classList.remove('open');
234
- iamNav.classList.remove('open');
235
- });
236
-
237
- // Close the menu on the click of the backdrop on desktop
238
- backdrop.addEventListener('click', () => {
239
- const openMenu = this.querySelector('details[open] summary');
240
-
241
- if (openMenu) openMenu.click();
242
-
243
- iamNav.classList.toggle('open');
244
- iamNav.querySelectorAll('.nav--menu.open').forEach(function (element) {
245
- element.classList.remove('open');
246
- });
247
- iamNav.shadowRoot.querySelectorAll('.buttons-holder .btn-menu[aria-expanded]').forEach(function (element) {
248
- element.removeAttribute('aria-expanded');
249
- const innerBtn = element.querySelector('.btn-primary');
250
- innerBtn.classList.remove('active');
251
- });
252
-
253
- backdrop.classList.remove('show');
60
+ this.classList.remove('open');
254
61
  });
255
62
 
256
- // On desktop close other menu's (details) when one is clicked
257
- this.addEventListener('click', (event) => {
258
- if (event && event.target instanceof HTMLElement && event.target.closest('summary')) {
259
- if (window.innerWidth > 992 && !event.target.closest('.nav--menu')) {
260
- const summary = event.target.closest('summary');
261
- const details = summary.closest('details');
262
- const wrapper = details.parentNode;
263
-
264
- if (details.hasAttribute('open')) details.removeAttribute('open');
265
- else details.setAttribute('open', 'true');
63
+ menuEvents(this,menu,menuButton,accountMenu,accountMenuButton);
64
+ megaMenuTitles(this);
65
+ megaMenusEvents(this,menu,menuButton,accountMenu,accountMenuButton,backdrop);
66
+ accountMenuEvents(this,menu,menuButton,accountMenu,accountMenuButton,backdrop);
67
+ backdropEvents(this,menu,menuButton,accountMenu,accountMenuButton,backdrop);
68
+ branchSelector(this);
266
69
 
267
- // Close any bespoke menus
268
- iamNav.querySelectorAll('.nav--menu.open').forEach(function (element) {
269
- element.classList.remove('open');
270
- setTimeout(function () {
271
- menu.classList.add('closed');
272
- }, 1000);
273
- });
274
- iamNav.shadowRoot.querySelectorAll('.buttons-holder .btn-menu[aria-expanded]').forEach(function (element) {
275
- element.removeAttribute('aria-expanded');
276
- const innerBtn = element.querySelector('.btn-primary');
277
- innerBtn.classList.remove('active');
278
- });
279
-
280
- // Close any other dropdowns on the same level
281
- Array.from(wrapper.querySelectorAll(':scope > details')).forEach((detailsArrayElement) => {
282
- if (detailsArrayElement != details) detailsArrayElement.removeAttribute('open');
283
- });
284
-
285
- if (this.querySelectorAll(':scope > details[open]').length) {
286
- backdrop.classList.add('show');
287
- iamNav.classList.add('open');
288
-
289
- if(this.querySelectorAll(':scope > details[open][slot="secondary"]').length)
290
- iamNav.classList.add('open-secondary');
291
- } else {
292
- backdrop.classList.remove('show');
293
- iamNav.classList.remove('open');
294
- iamNav.classList.remove('open-secondary');
295
- }
296
-
297
- event.preventDefault();
298
- }
299
- }
300
- });
301
-
302
- // Mega menu title
303
- this.querySelectorAll('details').forEach((detailsElement) => {
304
- const summary = detailsElement.querySelector('summary');
305
- const containerDiv = detailsElement.querySelector(':Scope > div');
306
-
307
- containerDiv.setAttribute('data-title', summary.textContent);
308
- });
309
-
310
- // Search
70
+ // #region Search
311
71
  if (this.querySelector('[slot="search"]')) {
312
72
  menu.classList.add('has-search');
313
73
  const searchWrapper = this.shadowRoot.querySelector('#search-wrapper');
@@ -355,25 +115,10 @@ class iamNav extends HTMLElement {
355
115
  searchButton.removeAttribute('aria-expanded');
356
116
  });
357
117
  }
118
+ // #endregion
358
119
 
359
- if (this.classList.contains('nav--sticky')) {
360
- let oldScrollY = window.scrollY;
361
- window.onscroll = function (e): void {
362
- if (oldScrollY < window.scrollY) {
363
- document.body.setAttribute('data-direction', 'down');
364
- } else {
365
- document.body.setAttribute('data-direction', 'up');
366
- }
367
-
368
- if (window.scrollY > 100) {
369
- document.body.classList.add('past100');
370
- } else {
371
- document.body.classList.remove('past100');
372
- }
373
- oldScrollY = window.scrollY;
374
- };
375
- }
376
120
  }
377
121
  }
378
122
 
123
+
379
124
  export default iamNav;
@@ -0,0 +1,69 @@
1
+ import iamNav from "../nav/nav.component";
2
+
3
+ class iamNavStandalone extends HTMLElement {
4
+ constructor() {
5
+ super();
6
+ const shadowRoot = this.attachShadow({ mode: 'open' });
7
+
8
+ const assetLocation = document.body.hasAttribute('data-assets-location')
9
+ ? document.body.getAttribute('data-assets-location')
10
+ : '/assets';
11
+ const loadCSS = `@import "${assetLocation}/css/components/nav-standalone.component.css";`;
12
+ //const loadExtraCSS = `@import "${assetLocation}/css/components/nav.global.css";`;
13
+
14
+ const template = document.createElement('template');
15
+ template.innerHTML = /* HTML */`
16
+ <style class="styles">
17
+ ${loadCSS}
18
+ </style>
19
+
20
+ <link rel="stylesheet" href="https://kit.fontawesome.com/8bd0fca975.css" crossorigin="anonymous">
21
+ <div class="wrapper">
22
+ <iam-nav class="iam-nav">
23
+ <slot></slot>
24
+ <slot name="account"></slot>
25
+ <slot name="secondary"></slot>
26
+ </iam-nav>
27
+ </div>
28
+ `;
29
+
30
+ shadowRoot.appendChild(template.content.cloneNode(true));
31
+
32
+ // insert extra CSS
33
+ if (!document.getElementById('navGlobal'))
34
+ document.head.insertAdjacentHTML('beforeend', `<style id="navGlobal">${loadExtraCSS}</style>`);
35
+ }
36
+
37
+ connectedCallback(): void {
38
+
39
+ if (!window.customElements.get(`iam-nav`))
40
+ window.customElements.define(`iam-nav`, iamNav);
41
+
42
+
43
+ const wrapper = this.shadowRoot.querySelector('.wrapper');
44
+
45
+ wrapper?.innerHTML = `<iam-nav class="iam-nav">${this.innerHTML}</iam-nav>`;
46
+
47
+ const iamNavElement = wrapper?.querySelector(':scope > iam-nav');
48
+
49
+ if (iamNavElement.querySelector('[slot="secondary"]')) {
50
+ iamNavElement.classList.add('has-secondary');
51
+ }
52
+
53
+ wrapper?.addEventListener('change', (e) => {
54
+
55
+ const event = new CustomEvent("change", e);
56
+ this.dispatchEvent(event)
57
+ });
58
+
59
+ wrapper?.addEventListener('click', (e) => {
60
+
61
+ console.log(e);
62
+ const event = new CustomEvent("click", e);
63
+ this.dispatchEvent(event)
64
+ });
65
+ }
66
+ }
67
+
68
+
69
+ export default iamNavStandalone;