@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.
- package/assets/css/components/actionbar.component.css +1 -1
- package/assets/css/components/actionbar.component.css.map +1 -1
- package/assets/css/components/address-lookup.component.css +1 -1
- package/assets/css/components/address-lookup.component.css.map +1 -1
- package/assets/css/components/advanced-select.component.css +1 -1
- package/assets/css/components/advanced-select.component.css.map +1 -1
- package/assets/css/components/banner.component.css +1 -1
- package/assets/css/components/banner.component.css.map +1 -1
- package/assets/css/components/barchart.component.css +1 -1
- package/assets/css/components/barchart.component.css.map +1 -1
- package/assets/css/components/branch-selector.css +1 -0
- package/assets/css/components/branch-selector.css.map +1 -0
- package/assets/css/components/calendar.component.css +1 -1
- package/assets/css/components/calendar.component.css.map +1 -1
- package/assets/css/components/card.component.css +1 -1
- package/assets/css/components/card.component.css.map +1 -1
- package/assets/css/components/card.module.css +1 -1
- package/assets/css/components/card.module.css.map +1 -1
- package/assets/css/components/card.preload.css +1 -1
- package/assets/css/components/card.preload.css.map +1 -1
- package/assets/css/components/carousel.component.css +1 -1
- package/assets/css/components/carousel.component.css.map +1 -1
- package/assets/css/components/charts.config.css +1 -1
- package/assets/css/components/charts.config.css.map +1 -1
- package/assets/css/components/collapsible-side.css +1 -1
- package/assets/css/components/collapsible-side.css.map +1 -1
- package/assets/css/components/config.component.css +1 -1
- package/assets/css/components/config.component.css.map +1 -1
- package/assets/css/components/doughnutchart.component.css +1 -1
- package/assets/css/components/doughnutchart.component.css.map +1 -1
- package/assets/css/components/fileupload.css +1 -1
- package/assets/css/components/fileupload.css.map +1 -1
- package/assets/css/components/filter-card.component.css +1 -1
- package/assets/css/components/filter-card.component.css.map +1 -1
- package/assets/css/components/inline-edit.css +1 -1
- package/assets/css/components/inline-edit.css.map +1 -1
- package/assets/css/components/menu.component.css +1 -1
- package/assets/css/components/menu.component.css.map +1 -1
- package/assets/css/components/modal.component.css +1 -1
- package/assets/css/components/modal.component.css.map +1 -1
- package/assets/css/components/multi-step-modal.component.css +1 -1
- package/assets/css/components/multi-step-modal.component.css.map +1 -1
- package/assets/css/components/multiselect.css +1 -1
- package/assets/css/components/multiselect.css.map +1 -1
- package/assets/css/components/nav-standalone.component.css +1 -0
- package/assets/css/components/nav-standalone.component.css.map +1 -0
- package/assets/css/components/nav.component.css +1 -1
- package/assets/css/components/nav.component.css.map +1 -1
- package/assets/css/components/nav.global.css +1 -1
- package/assets/css/components/nav.global.css.map +1 -1
- package/assets/css/components/nav.preload.css +1 -1
- package/assets/css/components/nav.preload.css.map +1 -1
- package/assets/css/components/notification.css +1 -1
- package/assets/css/components/notification.css.map +1 -1
- package/assets/css/components/pagination.css +1 -1
- package/assets/css/components/pagination.css.map +1 -1
- package/assets/css/components/record-card.component.css +1 -1
- package/assets/css/components/record-card.component.css.map +1 -1
- package/assets/css/components/search.component.css +1 -1
- package/assets/css/components/search.component.css.map +1 -1
- package/assets/css/components/slider.css +1 -1
- package/assets/css/components/slider.css.map +1 -1
- package/assets/css/components/split-button.component.css +1 -1
- package/assets/css/components/split-button.component.css.map +1 -1
- package/assets/css/components/tabs.component.css +1 -1
- package/assets/css/components/tabs.component.css.map +1 -1
- package/assets/css/components/tag.component.css +1 -1
- package/assets/css/components/tag.component.css.map +1 -1
- package/assets/css/components/video-card.component.css +1 -1
- package/assets/css/components/video-card.component.css.map +1 -1
- package/assets/css/components/video-modal.component.css +1 -1
- package/assets/css/components/video-modal.component.css.map +1 -1
- package/assets/css/components/video.component.css +1 -1
- package/assets/css/components/video.component.css.map +1 -1
- package/assets/css/core.min.css +1 -1
- package/assets/css/core.min.css.map +1 -1
- package/assets/css/elements/buttons--action.css +1 -1
- package/assets/css/elements/buttons--action.css.map +1 -1
- package/assets/css/elements/buttons--compact.css +1 -1
- package/assets/css/elements/buttons--compact.css.map +1 -1
- package/assets/css/elements/buttons--global.css +1 -1
- package/assets/css/elements/buttons--global.css.map +1 -1
- package/assets/css/elements/buttons--secondary.css +1 -1
- package/assets/css/elements/buttons--secondary.css.map +1 -1
- package/assets/css/elements/buttons--tertiary.css +1 -1
- package/assets/css/elements/buttons--tertiary.css.map +1 -1
- package/assets/css/elements/buttons.css +1 -1
- package/assets/css/elements/buttons.css.map +1 -1
- package/assets/css/elements/dropdown.css +1 -1
- package/assets/css/elements/dropdown.css.map +1 -1
- package/assets/css/elements/forms.css +1 -1
- package/assets/css/elements/forms.css.map +1 -1
- package/assets/css/elements/links--global.css +1 -1
- package/assets/css/elements/links--global.css.map +1 -1
- package/assets/css/elements/links.css +1 -1
- package/assets/css/elements/links.css.map +1 -1
- package/assets/css/elements/popover.css +1 -1
- package/assets/css/elements/popover.css.map +1 -1
- package/assets/css/elements/select.css +1 -1
- package/assets/css/elements/select.css.map +1 -1
- package/assets/css/elements/tooltips.css +1 -1
- package/assets/css/elements/tooltips.css.map +1 -1
- package/assets/css/style.min.css +1 -1
- package/assets/css/style.min.css.map +1 -1
- package/assets/js/components/accordion/accordion.component.min.js +1 -1
- package/assets/js/components/actionbar/actionbar.component.min.js +3 -3
- package/assets/js/components/address-lookup/address-lookup.component.js +1 -1
- package/assets/js/components/address-lookup/address-lookup.component.min.js +5 -5
- package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
- package/assets/js/components/advanced-select/advanced-select.component.min.js +4 -4
- package/assets/js/components/advanced-select/advanced-select.component.min.js.map +1 -1
- package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
- package/assets/js/components/banner/banner.component.min.js +2 -2
- package/assets/js/components/barchart/barchart.component.min.js +2 -2
- package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
- package/assets/js/components/bone/bone.component.min.js +1 -1
- package/assets/js/components/branch-selector/branch-selector.component.js +69 -0
- package/assets/js/components/branch-selector/branch-selector.component.min.js +22 -0
- package/assets/js/components/branch-selector/branch-selector.component.min.js.map +1 -0
- package/assets/js/components/button/button.component.min.js +1 -1
- package/assets/js/components/calendar/calendar.component.min.js +2 -2
- package/assets/js/components/card/card.component.min.js +3 -3
- package/assets/js/components/carousel/carousel.component.min.js +3 -3
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js +2 -2
- package/assets/js/components/config/config.component.min.js +3 -3
- package/assets/js/components/config/config.component.min.js.map +1 -1
- package/assets/js/components/content/content.component.min.js +1 -1
- package/assets/js/components/darkmode/darkmode.component.min.js +1 -1
- package/assets/js/components/doughnutchart/doughnutchart.component.min.js +4 -4
- package/assets/js/components/fileupload/fileupload.component.min.js +4 -4
- package/assets/js/components/filter-card/filter-card.component.min.js +5 -5
- package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
- package/assets/js/components/form/form.component.min.js +1 -1
- package/assets/js/components/header/header.component.min.js +1 -1
- package/assets/js/components/inline-edit/inline-edit.component.min.js +2 -2
- package/assets/js/components/input/input.component.min.js +1 -1
- package/assets/js/components/input-range/input-range.component.min.js +1 -1
- package/assets/js/components/marketing/marketing.component.min.js +1 -1
- package/assets/js/components/menu/menu.component.min.js +2 -2
- package/assets/js/components/milestone/milestone.component.min.js +1 -1
- package/assets/js/components/milestone-group/milestone-group.component.min.js +1 -1
- package/assets/js/components/modal/modal.component.js +2 -0
- package/assets/js/components/modal/modal.component.min.js +4 -4
- package/assets/js/components/modal/modal.component.min.js.map +1 -1
- package/assets/js/components/multi-step/multi-step.component.min.js +1 -1
- package/assets/js/components/multi-step-modal/multi-step-modal.component.min.js +4 -4
- package/assets/js/components/multiselect/multiselect.component.js +14 -18
- package/assets/js/components/multiselect/multiselect.component.min.js +14 -14
- package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
- package/assets/js/components/nav/nav.component.js +30 -255
- package/assets/js/components/nav/nav.component.min.js +46 -30
- package/assets/js/components/nav/nav.component.min.js.map +1 -1
- package/assets/js/components/nav-standalone/nav-standalone.component.js +51 -0
- package/assets/js/components/nav-standalone/nav-standalone.component.min.js +80 -0
- package/assets/js/components/nav-standalone/nav-standalone.component.min.js.map +1 -0
- package/assets/js/components/notification/notification.component.min.js +2 -2
- package/assets/js/components/pagination/pagination.component.min.js +2 -2
- package/assets/js/components/password/password.component.min.js +1 -1
- package/assets/js/components/popover/popover.component.min.js +1 -1
- package/assets/js/components/rank/rank.component.min.js +1 -1
- package/assets/js/components/rankings/rankings.component.min.js +1 -1
- package/assets/js/components/rating/rating.component.min.js +1 -1
- package/assets/js/components/record-card/record-card.component.min.js +6 -6
- package/assets/js/components/search/search.component.min.js +2 -2
- package/assets/js/components/skeleton/skeleton.component.min.js +1 -1
- package/assets/js/components/slider/slider.component.min.js +2 -2
- package/assets/js/components/split-button/split-button.component.min.js +4 -4
- package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js +5 -5
- package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js.map +1 -1
- package/assets/js/components/std-nav/std-nav.component.js +32 -58
- package/assets/js/components/std-nav/std-nav.component.min.js +9 -54
- package/assets/js/components/std-nav/std-nav.component.min.js.map +1 -1
- package/assets/js/components/table/table.component.min.js +2 -2
- package/assets/js/components/table-ajax/table-ajax.component.min.js +2 -2
- package/assets/js/components/table-basic/table-basic.component.min.js +1 -1
- package/assets/js/components/table-no-submit/table-no-submit.component.min.js +2 -2
- package/assets/js/components/table-submit/table-submit.component.min.js +2 -2
- package/assets/js/components/tabs/tabs.component.min.js +2 -2
- package/assets/js/components/tag/tag.component.min.js +4 -4
- package/assets/js/components/tag/tag.component.min.js.map +1 -1
- package/assets/js/components/tooltip/tooltip.component.min.js +1 -1
- package/assets/js/components/video/video.component.min.js +2 -2
- package/assets/js/components/video-card/video-card.component.min.js +6 -6
- package/assets/js/components/video-modal/video-modal.component.min.js +5 -5
- package/assets/js/components/word-count/word-count.component.min.js +1 -1
- package/assets/js/modules/advanced-select.js +13 -5
- package/assets/js/modules/nav.js +183 -64
- package/assets/js/modules/nav.test.js +4 -1
- package/assets/js/scripts.bundle.js +1 -1
- package/assets/js/scripts.bundle.min.js +1 -1
- package/assets/sass/components/branch-selector.scss +112 -0
- package/assets/sass/components/card.module.scss +11 -1
- package/assets/sass/components/card.preload.scss +0 -15
- package/assets/sass/components/charts.config.scss +3 -3
- package/assets/sass/components/menu.component.scss +2 -1
- package/assets/sass/components/multiselect.scss +0 -1
- package/assets/sass/components/nav-standalone.component.scss +50 -0
- package/assets/sass/components/nav.component.scss +142 -116
- package/assets/sass/components/nav.global.scss +26 -198
- package/assets/sass/components/nav.preload.scss +1 -7
- package/assets/sass/elements/buttons--action.css +1 -1
- package/assets/sass/elements/buttons--compact.css +8 -4
- package/assets/sass/elements/buttons--global.css +3 -6
- package/assets/sass/elements/buttons--secondary.css +1 -1
- package/assets/sass/elements/buttons--tertiary.css +1 -1
- package/assets/sass/elements/dropdown.css +16 -2
- package/assets/sass/elements/links--global.scss +29 -3
- package/assets/sass/elements/popover.scss +1 -0
- package/assets/sass/elements/select.scss +1 -1
- package/assets/sass/elements/tooltips.scss +54 -0
- package/assets/sass/foundations/root.scss +4 -0
- package/assets/sass/templates/form.scss +26 -3
- package/assets/ts/components/address-lookup/address-lookup.component.ts +2 -1
- package/assets/ts/components/branch-selector/branch-selector.component.ts +93 -0
- package/assets/ts/components/modal/modal.component.ts +3 -0
- package/assets/ts/components/multiselect/multiselect.component.ts +20 -23
- package/assets/ts/components/nav/nav.component.ts +30 -285
- package/assets/ts/components/nav-standalone/nav-standalone.component.ts +69 -0
- package/assets/ts/components/std-nav/std-nav.component.ts +38 -81
- package/assets/ts/modules/advanced-select.ts +12 -11
- package/assets/ts/modules/nav.test.ts +4 -1
- package/assets/ts/modules/nav.ts +221 -78
- package/dist/components.es.js +1130 -1095
- package/dist/components.umd.js +290 -242
- package/package.json +2 -2
- package/src/components/BranchSelector/BranchSelector.vue +20 -0
- package/src/components/{STDNavStandalone/STDNavStandalone.vue → NavStandalone/NavStandalone.vue} +3 -3
- package/src/index.js +1 -0
- package/assets/css/components/nav.docs.css +0 -1
- package/assets/css/components/nav.docs.css.map +0 -1
- package/assets/css/components/std-nav-standalone.component.css +0 -1
- package/assets/css/components/std-nav-standalone.component.css.map +0 -1
- package/assets/js/components/std-nav-standalone/std-nav-standalone.component.js +0 -70
- package/assets/js/components/std-nav-standalone/std-nav-standalone.component.min.js +0 -20
- package/assets/js/components/std-nav-standalone/std-nav-standalone.component.min.js.map +0 -1
- package/assets/sass/components/nav.docs.scss +0 -54
- package/assets/sass/components/std-nav-standalone.component.scss +0 -229
- 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
|
-
|
|
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
|
-
|
|
61
|
-
|
|
11
|
+
const nav = this.closest('iam-nav');
|
|
12
|
+
const mode = this.hasAttribute('data-mode') ? this.getAttribute('data-mode') : 'dev';
|
|
62
13
|
|
|
63
|
-
|
|
64
|
-
});
|
|
14
|
+
// if not an sso use load default from component
|
|
65
15
|
|
|
66
|
-
|
|
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
|
-
|
|
18
|
+
if(this.hasAttribute('slot') && this.getAttribute('slot') == "secondary"){
|
|
71
19
|
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
76
|
-
|
|
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
|
-
|
|
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.
|
|
46
|
+
this.outerHTML = populateNav(filteredData);
|
|
102
47
|
}
|
|
103
48
|
else {
|
|
104
|
-
|
|
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
|
|
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
|
-
|
|
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: {
|
|
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
|
});
|
package/assets/ts/modules/nav.ts
CHANGED
|
@@ -1,43 +1,59 @@
|
|
|
1
|
-
const
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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-
|
|
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(
|
|
76
|
-
|
|
77
|
-
const ajaxURL = 'https://dev.hub.iamproperty.group/data/ecosystem-switcher.json';
|
|
91
|
+
export const loadNavData = async(mode): any => {
|
|
78
92
|
|
|
79
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
159
|
-
element.
|
|
160
|
-
|
|
161
|
-
element.
|
|
162
|
-
|
|
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
|
|
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
|
+
}
|