@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
@@ -1,91 +1,34 @@
1
- import Cookies from '../../../../node_modules/js-cookie/dist/js.cookie.mjs';
2
1
  import {populateNav,loadNavData,loadUserData,setEnabledLinks} from '../../modules/nav';
3
- import iamNav from '../nav/nav.component';
4
-
5
- // Data layer Web component created
6
- declare global {
7
- interface Window {
8
- dataLayer: Array<object>;
9
- }
10
- }
11
2
 
12
3
  class iamSTDNav extends HTMLElement {
13
4
  constructor() {
14
5
  super();
15
6
  }
16
7
 
17
- defaultToNav = ():void => {
18
-
19
- const defaultContent = this.innerHTML;
20
- this.innerHTML = `<iam-nav ${(this.hasAttribute('class') ? `class="${this.getAttribute('class')}"`:'')}>
21
- ${defaultContent}
22
- </iam-nav>`;
23
- }
24
-
25
- transformToNav = (data):void => {
26
-
27
- const navElement = this.querySelector('iam-nav') ?? this;
28
-
29
- // Remove current links
30
- navElement.querySelectorAll(`:scope > *`).forEach((element) => {
31
-
32
- if(!element.hasAttribute('slot'))
33
- element.remove();
34
- });
35
-
36
- const defaultContent = navElement.innerHTML;
37
-
38
- navElement.innerHTML = `${defaultContent}${populateNav(data)}`;
39
-
40
- const customEvent = new CustomEvent('rebuilt');
41
- navElement.dispatchEvent(customEvent);
42
- }
43
-
44
- defaultToSecondary = (): void => {
45
-
46
- // Set links and details to secondary slot
47
- Array.from(this.querySelectorAll(':scope > a, :scope > details')).forEach((element) => {
48
-
49
- element.setAttribute('slot','secondary');
50
- });
51
-
52
- const defaultContent = this.innerHTML;
53
- this.outerHTML = `${defaultContent}`;
54
- }
55
-
56
- transformToSecondary = (data):void => {
8
+ async connectedCallback(): void {
57
9
 
58
- this.innerHTML = populateNav(data);
59
10
 
60
- // Set links and details to secondary slot
61
- Array.from(this.querySelectorAll(':scope > a, :scope > details')).forEach((element) => {
11
+ const nav = this.closest('iam-nav');
12
+ const mode = this.hasAttribute('data-mode') ? this.getAttribute('data-mode') : 'dev';
62
13
 
63
- element.setAttribute('slot','secondary');
64
- });
14
+ // if not an sso use load default from component
65
15
 
66
- const defaultContent = this.innerHTML;
67
- this.outerHTML = `${defaultContent}`;
68
- }
16
+ if(!this.hasAttribute('data-sso-subject') || this.getAttribute('data-sso-subject') == 'false' || this.getAttribute('data-sso-subject') == false || this.getAttribute('data-sso-subject') == null){
69
17
 
70
- async connectedCallback(): void {
18
+ if(this.hasAttribute('slot') && this.getAttribute('slot') == "secondary"){
71
19
 
72
- const component = this;
73
- this.wrapper = this.shadowRoot?.querySelector('.wrapper');
20
+ this.outerHTML = `<a href="https://my.iamproperty.com" slot="secondary">iamproperty</a>
21
+ <a href="https://crm.iamproperty.com/MyDay" slot="secondary">CRM</a>
22
+ <a href="https://my.iamproperty.com/ic/dashboard" slot="secondary">movebutler</a>
23
+ <a href="https://my.iamproperty.com/auction" slot="secondary">iamsold</a>`;
74
24
 
75
- if (!window.customElements.get(`iam-nav`))
76
- window.customElements.define(`iam-nav`, iamNav);
77
-
78
- if(this.hasAttribute('data-hub')){
79
- this.defaultToNav();
80
-
81
- this.querySelector('.nav--menu.js-show')?.classList.remove('js-show');
82
- }
83
- else {
84
- //this.defaultToSecondary(); TODO: change this to show default content but still be able to update
25
+ document.querySelector(`a[href*='${window.location.hostname}'][slot="secondary"]`)?.classList.add('selected');
26
+ }
27
+ return;
85
28
  }
86
29
 
30
+ const data = await loadNavData(mode).then(
87
31
 
88
- const data = await loadNavData(Cookies).then(
89
32
  (data) => {
90
33
 
91
34
  if(typeof data == 'string'){
@@ -93,26 +36,41 @@ class iamSTDNav extends HTMLElement {
93
36
  return data;
94
37
  }
95
38
 
96
- //console.log(data);
97
- if(this.hasAttribute('data-hub')){
39
+ if(!this.hasAttribute('slot')){ // This is the nav on the hub page
98
40
 
99
- const filteredData = data.filter(section => section.attributes.title != "Learning and support");
41
+ const filteredData = data.filter(section => section.attributes.title != "Learning and support"); // Not needed for the hub page
42
+ this.closest('iam-nav').querySelectorAll(`:scope > *:not([slot]):not(iam-std-nav)`).forEach((element) => {
43
+ element.remove(); // Remove the default links
44
+ });
100
45
 
101
- this.transformToNav(filteredData);
46
+ this.outerHTML = populateNav(filteredData);
102
47
  }
103
48
  else {
104
- this.transformToSecondary(data);
49
+
50
+ this.closest('iam-nav').querySelectorAll(`:scope > *[slot="secondary"]:not(iam-std-nav):not(iam-branch-selector)`).forEach((element) => {
51
+ element.remove(); // Remove the default links
52
+ });
53
+
54
+ this.outerHTML = populateNav(data, 'secondary');
105
55
  }
106
56
 
107
57
  return true;
108
58
  }
109
59
  );
110
60
 
61
+ if(!this.hasAttribute('data-sso-subject') && !this.hasAttribute('data-product'))
62
+ return;
111
63
 
112
- const userData = await loadUserData(Cookies).then(
64
+ const subject = this.getAttribute('data-sso-subject');
65
+ const product = this.getAttribute('data-product');
66
+
67
+ const userData = await loadUserData(mode, subject, product).then(
113
68
  (data) => {
114
69
 
115
- setEnabledLinks(component,data);
70
+ if(!data.attributes)
71
+ return false;
72
+
73
+ setEnabledLinks(nav,data);
116
74
 
117
75
  Array.from(document.querySelectorAll('[data-variable]')).forEach((element) => {
118
76
 
@@ -122,7 +80,6 @@ class iamSTDNav extends HTMLElement {
122
80
 
123
81
  Array.from(document.querySelectorAll('[data-save-variable]')).forEach((element) => {
124
82
 
125
- //console.log(element);
126
83
  if(data.attributes[element.getAttribute('data-save-variable')])
127
84
  element.setAttribute('data-variable-value', data.attributes[element.getAttribute('data-save-variable')]);
128
85
  });
@@ -131,9 +88,9 @@ class iamSTDNav extends HTMLElement {
131
88
  }
132
89
  );
133
90
 
134
-
135
91
  }
136
-
137
92
  }
138
93
 
94
+
95
+
139
96
  export default iamSTDNav;
@@ -26,7 +26,7 @@ function advancedSelect(advancedSelect, displayInputField, datalist, isSearch =
26
26
  if(displayInputField.hasAttribute('placeholder'))
27
27
  displayInputField.setAttribute('data-original-placeholder', displayInputField.getAttribute('placeholder'));
28
28
 
29
-
29
+
30
30
 
31
31
  const checkIfEmpty = (): void => {
32
32
 
@@ -40,13 +40,13 @@ function advancedSelect(advancedSelect, displayInputField, datalist, isSearch =
40
40
  }
41
41
 
42
42
  };
43
-
43
+
44
44
  checkIfEmpty();
45
45
 
46
46
  displayInputField.addEventListener('focus', function () {
47
-
47
+
48
48
  if(displayInputField.value != ""){
49
-
49
+
50
50
  displayInputField.setAttribute('placeholder', displayInputField.value);
51
51
  displayInputField.setAttribute('data-value', displayInputField.value);
52
52
  }
@@ -91,7 +91,7 @@ function advancedSelect(advancedSelect, displayInputField, datalist, isSearch =
91
91
  }
92
92
 
93
93
  option.classList.add('active');
94
-
94
+
95
95
  checkIfEmpty();
96
96
  setTimeout(() => {
97
97
  advancedSelect.dispatchEvent(new CustomEvent('update-value', {
@@ -108,7 +108,7 @@ function advancedSelect(advancedSelect, displayInputField, datalist, isSearch =
108
108
  displayInputField.addEventListener('input', function () {
109
109
  displayInputField.removeAttribute('data-value');
110
110
  currentFocus = -1;
111
-
111
+
112
112
  checkIfEmpty();
113
113
 
114
114
  if (advancedSelect.tagName != "IAM-ADDRESS-LOOKUP") {
@@ -129,7 +129,7 @@ function advancedSelect(advancedSelect, displayInputField, datalist, isSearch =
129
129
  });
130
130
 
131
131
  advancedSelect.addEventListener('keydown', function (e) {
132
-
132
+
133
133
  if (e.keyCode == 40) {
134
134
  currentFocus++;
135
135
  addActive(datalist.options);
@@ -161,6 +161,7 @@ function advancedSelect(advancedSelect, displayInputField, datalist, isSearch =
161
161
  }
162
162
 
163
163
  // Add the empty button
164
+ /*
164
165
  if(displayInputField.closest('.input__wrapper')){
165
166
  displayInputField.closest('.input__wrapper').insertAdjacentHTML(
166
167
  'beforeend',
@@ -174,7 +175,7 @@ function advancedSelect(advancedSelect, displayInputField, datalist, isSearch =
174
175
  '<button class="clear-search btn btn-action" type="button"><i class="fa-light fa-times me-0"></i></button>'
175
176
  );
176
177
  }
177
-
178
+ */
178
179
  const emptyField = (): void => {
179
180
  const originalInput = advancedSelect.querySelector('input[type="hidden"]') as HTMLInputElement | null;
180
181
 
@@ -187,8 +188,8 @@ function advancedSelect(advancedSelect, displayInputField, datalist, isSearch =
187
188
 
188
189
  if(displayInputField.hasAttribute('data-original-placeholder'))
189
190
  displayInputField.setAttribute('placeholder', displayInputField.getAttribute('data-original-placeholder'));
190
-
191
-
191
+
192
+
192
193
  displayInputField.removeAttribute('data-value');
193
194
  displayInputField.value = '';
194
195
  displayInputField.classList.add('empty');
@@ -210,7 +211,7 @@ function advancedSelect(advancedSelect, displayInputField, datalist, isSearch =
210
211
  },
211
212
  }));
212
213
 
213
-
214
+
214
215
  checkIfEmpty();
215
216
  }
216
217
 
@@ -26,16 +26,19 @@ describe('Navigation module', () => {
26
26
  dataFeature: 'dashboard',
27
27
  dataEnabled: '/linked',
28
28
  href: '/sales',
29
+ title: 'Learn more',
29
30
  target: '_blank',
30
31
  });
31
32
  append(component, link);
32
33
 
33
34
  setEnabledLinks(component, {
34
- attributes: { products: { sales: { features: { dashboard: true } } } },
35
+ attributes: { features: { sales: ['dashboard'] } },
35
36
  });
36
37
 
37
38
  expect(populateLinks(links).includes('data-product="sales"'));
39
+ expect(link.getAttribute('data-is-enabled') === 'true');
38
40
  expect(link.getAttribute('href') === '/linked');
39
41
  expect(!link.hasAttribute('target'));
42
+ expect(!link.hasAttribute('title'));
40
43
  });
41
44
  });
@@ -1,43 +1,59 @@
1
- const navbar = (element): void => {
2
- Array.from(element.querySelectorAll('details')).forEach((detail) => {
3
- detail.addEventListener(
4
- 'mouseenter',
5
- function () {
6
- if (window.matchMedia('(min-width: 62em)').matches) detail.setAttribute('open', 'true');
7
- },
8
- false
9
- );
10
-
11
- detail.addEventListener(
12
- 'mouseleave',
13
- function () {
14
- if (window.matchMedia('(min-width: 62em)').matches) detail.removeAttribute('open');
15
- },
16
- false
17
- );
18
- });
19
-
20
- if ('IntersectionObserver' in window) {
21
- const observer = new IntersectionObserver(([e]) => e.target.classList.toggle('is-stuck', e.intersectionRatio < 1), {
22
- threshold: [1],
23
- });
24
-
25
- observer.observe(element);
26
- }
27
- };
28
-
29
- export const populateNav = (data):void => {
1
+ export const navTemplate = /* HTML */`<div class="container">
2
+ <slot name="logo"></slot>
3
+
4
+ <div class="buttons-holder">
5
+ <button class="btn-menu" part="btn-menu-account" id="btn-menu-account">
6
+ <span class="btn btn-primary">
7
+ <span id="account-btn-title"></span>
8
+ <i class="fa-user fa-solid"></i>
9
+ <i class="fa-regular fa-xmark-large"></i>
10
+ </span>
11
+ </button>
12
+ <button class="btn-menu" part="btn-menu" id="btn-menu">
13
+ Menu
14
+ <i class="fa-regular fa-bars"></i>
15
+ <i class="fa-regular fa-xmark-large"></i>
16
+ </button>
17
+ </div>
18
+
19
+ <div class="menu__outer" part="menu__outer">
20
+ <div class="menu closed" part="menu">
21
+
22
+ <div class="menu__primary">
23
+ <slot></slot>
24
+ <slot name="dual"></slot>
25
+ </div>
26
+ <div class="dialog__wrapper d-none" id="search-wrapper"></div>
27
+
28
+ <slot name="actions"></slot>
29
+
30
+ <div class="menu__secondary bg-light">
31
+ <div class="container">
32
+
33
+ <slot name="secondary"></slot>
34
+ </div>
35
+ </div>
36
+ </div>
37
+ <div class="nav--menu" part="nav--menu">
38
+ <slot name="account"></slot>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ <div class="backdrop" part="backdrop"></div>`;
43
+
44
+ // #region Standadised Nav
45
+ export const populateNav = (data, slot = ''):void => {
30
46
 
31
47
  let html = ``;
32
48
 
33
49
  data.forEach((feature) => {
34
50
 
35
51
  if(feature.attributes.sections.length)
36
- html += `<details name="megamenu"><summary>${feature.attributes.title}</summary><div data-title="${feature.attributes.title}">${populateSections(feature.attributes.sections)}</div></details>`;
52
+ html += `<details name="megamenu" ${slot != '' ? `slot="${slot}"` : ''}><summary>${feature.attributes.title}</summary><div data-title="${feature.attributes.title}">${populateSections(feature.attributes.sections)}</div></details>`;
37
53
  else if(feature.attributes.links)
38
- html += `<details name="megamenu"><summary>${feature.attributes.title}</summary><div data-title="${feature.attributes.title}">${populateLinks(feature.attributes.links)}</div></details>`;
39
- else
40
- html += `<a href="/">${feature.attributes.title}</a>`;
54
+ html += `<details name="megamenu" ${slot != '' ? `slot="${slot}"` : ''}><summary>${feature.attributes.title}</summary><div data-title="${feature.attributes.title}">${populateLinks(feature.attributes.links)}</div></details>`;
55
+ else
56
+ html += `<a href="/" ${slot != '' ? `slot="${slot}"` : ''}>${feature.attributes.title}</a>`;
41
57
  });
42
58
 
43
59
  return html;
@@ -51,7 +67,7 @@ export const populateSections = (data):void => {
51
67
 
52
68
  html += `<span class="section section--${section.layout}">
53
69
  ${section.title ? `<span class="lead section-title" data-product="${section.id}" data-title>${section.title}:</span>` : ''}
54
- ${section.description ? `<span class="lead section-desc" data-product="${section.id}"><i class="fa-solid fa-sparkles colour-warning"></i> ${section.description}</span>` : ''}
70
+ ${section.description ? `<span class="lead section-desc text-body" data-product="${section.id}"><i class="fa-solid fa-rocket colour-warning"></i> ${section.description}</span>` : ''}
55
71
  ${populateLinks(section.links)}
56
72
  </span>`;
57
73
  });
@@ -65,32 +81,19 @@ export const populateLinks = (data):void => {
65
81
  data.forEach((link) => {
66
82
 
67
83
 
68
- html += `<a href="${link.destinations.unlinked}" target="_blank" data-product="${link.productKey}" data-feature="${link.featureKey}" data-enabled="${link.destinations.linkedEnabled}" data-disabled="${link.destinations.linkedDisabled}">${link.title}</a>`;
84
+ html += `<a href="${link.destinations.unlinked}" title="Learn more about this features product" target="_blank" data-product="${link.productKey}" data-feature="${link.featureKey}" data-enabled="${link.destinations.linkedEnabled}" data-disabled="${link.destinations.linkedDisabled}">${link.title}</a>`;
69
85
 
70
86
  });
71
87
 
72
88
  return html;
73
89
  }
74
90
 
75
- export const loadNavData = async(Cookies): any => {
76
-
77
- const ajaxURL = 'https://dev.hub.iamproperty.group/data/ecosystem-switcher.json';
91
+ export const loadNavData = async(mode): any => {
78
92
 
79
- //const ajaxURL = '/nav.json';
80
-
81
- // Setup controller vars if not already set
82
- if (!window.controller) window.controller = [];
83
-
84
- // Abort if controller already present for this url
85
- if (window.controller[ajaxURL]) window.controller[ajaxURL].abort();
86
-
87
- // Create a new controller so it can be aborted if new fetch made
88
- window.controller[ajaxURL] = new AbortController();
89
- const { signal } = window.controller[ajaxURL];
93
+ const ajaxURL = mode != 'dev' ? 'https://hub.iamproperty.group/data/ecosystem-switcher.json' : 'https://dev.hub.iamproperty.group/data/ecosystem-switcher.json';
90
94
 
91
95
  try {
92
96
  const response = await fetch(ajaxURL, {
93
- signal,
94
97
  method: 'GET',
95
98
  headers: {
96
99
  Accept: 'application/json',
@@ -109,27 +112,28 @@ export const loadNavData = async(Cookies): any => {
109
112
  }
110
113
  }
111
114
 
112
- export const loadUserData = async(Cookies): any => {
113
-
114
- const ajaxURL = '/user.json';
115
-
116
- // Setup controller vars if not already set
117
- if (!window.controller) window.controller = [];
115
+ export const loadUserData = async(mode, subject, product): any => {
118
116
 
119
- // Abort if controller already present for this url
120
- if (window.controller[ajaxURL]) window.controller[ajaxURL].abort();
121
-
122
- // Create a new controller so it can be aborted if new fetch made
123
- window.controller[ajaxURL] = new AbortController();
124
- const { signal } = window.controller[ajaxURL];
117
+ const ajaxURL = mode != 'dev' ? 'https://api.sso.iamproperty.group/navigation/access-context' : 'https://api.dev.sso.iamproperty.group/navigation/access-context';
125
118
 
126
119
  try {
120
+
127
121
  const response = await fetch(ajaxURL, {
128
- signal,
129
- method: 'GET',
122
+ method: 'post',
130
123
  headers: {
131
- Accept: 'application/json',
124
+ Accept: 'application/vnd.api+json',
125
+ 'Content-Type': 'application/vnd.api+json'
132
126
  },
127
+ body: JSON.stringify({
128
+ "data": {
129
+ "type": "navigation-access-context-request",
130
+ "attributes": {
131
+ "subject": subject,
132
+ "requestingProduct": product,
133
+ "navigationSchemaVersion": "2026-04-16"
134
+ }
135
+ }
136
+ })
133
137
  });
134
138
 
135
139
  const json = await response.json();
@@ -146,23 +150,162 @@ export const loadUserData = async(Cookies): any => {
146
150
 
147
151
  export const setEnabledLinks = (component,data):void => {
148
152
 
149
- const selector = `[data-product][data-feature]`;
150
- const elements = component
151
- ? [
152
- ...component.querySelectorAll(selector),
153
- ...(component.shadowRoot ? component.shadowRoot.querySelectorAll(selector) : []),
154
- ]
155
- : document.querySelectorAll(`iam-nav ${selector}`);
153
+ const elements = component.querySelectorAll('[data-product][data-feature]');
156
154
 
157
155
  elements.forEach((element) => {
158
- const isEnabled = data.attributes.products[element.getAttribute('data-product')].features[element.getAttribute('data-feature')];
159
- element.setAttribute('data-is-enabled',isEnabled);
160
- if(isEnabled && element.getAttribute('data-enabled')){
161
- element.setAttribute('href',element.getAttribute('data-enabled'));
162
- element.removeAttribute('target');
156
+
157
+ if(data.attributes.features[element.getAttribute('data-product')]){
158
+
159
+ const isEnabled = data.attributes.features[element.getAttribute('data-product')].includes(element.getAttribute('data-feature'));
160
+
161
+ element.setAttribute('data-is-enabled',isEnabled);
162
+ if(isEnabled && element.getAttribute('data-enabled')){
163
+ element.setAttribute('href',element.getAttribute('data-enabled'));
164
+ element.removeAttribute('target');
165
+ element.removeAttribute('title');
166
+ }
167
+
168
+ }
169
+ });
170
+
171
+ }
172
+ // #endregion
173
+
174
+ export const branchSelector = (component):void => {
175
+ const branchSelector = component.querySelector("iam-branch-selector");
176
+ const mql = window.matchMedia("(width > 62em)");
177
+
178
+ if (mql.matches)
179
+ branchSelector?.setAttribute('slot','secondary');
180
+
181
+ mql.addEventListener("change", (e) => {
182
+
183
+ if (e.matches && component.classList.contains('has-secondary'))
184
+ branchSelector?.setAttribute('slot','secondary');
185
+ else
186
+ branchSelector?.setAttribute('slot','account');
187
+ });
188
+ }
189
+
190
+ export const menuEvents = (component,menu,menuButton,accountMenu,accountMenuButton):void => {
191
+
192
+ menuButton.addEventListener ('click', (e) => {
193
+ e.preventDefault();
194
+
195
+ menu.classList.toggle('open');
196
+ accountMenu.classList.remove('open');
197
+
198
+
199
+ if (menu.classList.contains('open')) {
200
+ component.classList.add('open');
201
+ } else {
202
+ component.classList.remove('open');
163
203
  }
204
+
205
+ accountMenuButton?.querySelector('.btn-primary').classList.remove('active');
206
+ accountMenuButton?.removeAttribute('aria-expanded');
207
+
208
+ component.querySelector(':scope > details[open]')?.removeAttribute('open');
209
+
210
+ }, false);
211
+ }
212
+
213
+ export const megaMenuTitles = (component):void => {
214
+
215
+ // Mega menu title
216
+ component.querySelectorAll('details').forEach((detailsElement) => {
217
+ const summary = detailsElement.querySelector('summary');
218
+ const containerDiv = detailsElement.querySelector(':Scope > div');
219
+
220
+ if(containerDiv)
221
+ containerDiv.setAttribute('data-title', summary.textContent);
164
222
  });
223
+ }
224
+
225
+ export const megaMenusEvents = (component,menu,menuButton,accountMenu,accountMenuButton,backdrop):void => {
226
+
227
+ component.addEventListener('click', (event) => {
228
+ if (event && event.target instanceof HTMLElement && event.target.closest('summary')) {
229
+
230
+ const summary = event.target.closest('summary');
231
+ const details = summary.closest('details');
232
+
233
+ if (window.innerWidth > 992 && !event.target.closest('.nav--menu')) {
234
+
235
+
236
+ if (details?.hasAttribute('open')) { // Is open before the user clicks on the details summary
237
+
238
+ backdrop.classList.remove('show');
239
+ component.classList.remove('open');
240
+ component.classList.remove('open-secondary');
241
+ } else {
242
+ backdrop.classList.add('show');
243
+ component.classList.add('open');
244
+
245
+ if(details?.hasAttribute('slot') && details?.getAttribute('slot') == "secondary")
246
+ component.classList.add('open-secondary');
247
+
248
+ // Open the first details element if one isn't open
249
+ if(!details.querySelector('details[open]') && details.querySelector('details'))
250
+ details.querySelector('details').setAttribute('open', true);
251
+ }
252
+
253
+ // Close all other siblings of details
254
+ details?.parentNode.querySelectorAll(':scope > details').forEach(element => {
165
255
 
256
+ if(element != details)
257
+ element.removeAttribute('open');
258
+ });
259
+
260
+
261
+ menu.classList.remove('open');
262
+ accountMenu.classList.remove('open');
263
+ accountMenuButton?.querySelector('.btn-primary').classList.remove('active');
264
+ menuButton?.removeAttribute('aria-expanded');
265
+ accountMenuButton?.removeAttribute('aria-expanded');
266
+ }
267
+ }
268
+ });
269
+ }
270
+
271
+ export const accountMenuEvents = (component,menu,menuButton,accountMenu,accountMenuButton,backdrop):void => {
272
+
273
+ accountMenuButton.addEventListener ('click', () => {
274
+
275
+ // Close the main menu
276
+ menu.classList.remove('open');
277
+ accountMenu.classList.toggle('open');
278
+
279
+ if (accountMenu.classList.contains('open')) {
280
+ component.classList.add('open');
281
+ accountMenuButton?.querySelector('.btn-primary').classList.add('active');
282
+ accountMenuButton?.setAttribute('aria-expanded', true);
283
+ } else {
284
+ component.classList.remove('open');
285
+ accountMenuButton?.querySelector('.btn-primary').classList.remove('active');
286
+ accountMenuButton?.removeAttribute('aria-expanded');
287
+ }
288
+
289
+ component.querySelector(':scope > details[open]')?.removeAttribute('open');
290
+ menuButton?.removeAttribute('aria-expanded');
291
+ });
166
292
  }
167
293
 
168
- export default navbar;
294
+ export const backdropEvents = (component,menu,menuButton,accountMenu,accountMenuButton,backdrop):void => {
295
+
296
+ // Close the menu on the click of the backdrop on desktop
297
+ backdrop.addEventListener('click', () => {
298
+ const openMenu = component.querySelector(':scope > details[open]');
299
+
300
+ if (openMenu) openMenu.removeAttribute('open');
301
+
302
+ component.classList.remove('open');
303
+ menu.classList.remove('open');
304
+ menuButton?.removeAttribute('aria-expanded');
305
+ accountMenu.classList.remove('open');
306
+ accountMenuButton?.querySelector('.btn-primary').classList.remove('active');
307
+ accountMenuButton?.removeAttribute('aria-expanded');
308
+
309
+ backdrop.classList.remove('show');
310
+ });
311
+ }