@iamproperty/components 7.3.0 → 7.4.0
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/actionbar.global.css +1 -1
- package/assets/css/components/actionbar.global.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/calendar.component.css +1 -0
- package/assets/css/components/calendar.component.css.map +1 -0
- package/assets/css/components/calendar.config.css +1 -0
- package/assets/css/components/calendar.config.css.map +1 -0
- package/assets/css/components/card.component.css +1 -1
- package/assets/css/components/card.component.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/collapsible-side.css +1 -1
- package/assets/css/components/collapsible-side.css.map +1 -1
- package/assets/css/components/content.component.css +1 -0
- package/assets/css/components/content.component.css.map +1 -0
- 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.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/marketing.component.css +1 -0
- package/assets/css/components/marketing.component.css.map +1 -0
- package/assets/css/components/menu.component.css.map +1 -1
- package/assets/css/components/milestone.css +1 -0
- package/assets/css/components/milestone.css.map +1 -0
- package/assets/css/components/multiselect.css +1 -1
- package/assets/css/components/multiselect.css.map +1 -1
- package/assets/css/components/nav.component.css +1 -1
- package/assets/css/components/nav.component.css.map +1 -1
- package/assets/css/components/nav.global.css +1 -1
- package/assets/css/components/nav.global.css.map +1 -1
- package/assets/css/components/pagination.css.map +1 -1
- package/assets/css/components/rank.component.css +1 -1
- package/assets/css/components/rank.component.css.map +1 -1
- package/assets/css/components/rankings.component.css +1 -1
- package/assets/css/components/rankings.component.css.map +1 -1
- package/assets/css/components/rankings.global.css +1 -1
- package/assets/css/components/rankings.global.css.map +1 -1
- package/assets/css/components/slider.css.map +1 -1
- package/assets/css/components/split-button.component.css +1 -0
- package/assets/css/components/split-button.component.css.map +1 -0
- package/assets/css/core.min.css +1 -1
- package/assets/css/core.min.css.map +1 -1
- package/assets/css/mobile-core.min.css +1 -1
- package/assets/css/mobile-core.min.css.map +1 -1
- package/assets/css/mobile.min.css +1 -1
- package/assets/css/mobile.min.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.js +51 -31
- package/assets/js/components/actionbar/actionbar.component.min.js +17 -17
- package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
- package/assets/js/components/address-lookup/address-lookup.component.min.js +1 -1
- package/assets/js/components/advanced-select/advanced-select.component.js +63 -0
- package/assets/js/components/advanced-select/advanced-select.component.min.js +23 -0
- package/assets/js/components/advanced-select/advanced-select.component.min.js.map +1 -0
- package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
- 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/calendar/calendar.component.js +1083 -0
- package/assets/js/components/calendar/calendar.component.min.js +170 -0
- package/assets/js/components/calendar/calendar.component.min.js.map +1 -0
- package/assets/js/components/card/card.component.js +20 -8
- package/assets/js/components/card/card.component.min.js +10 -10
- package/assets/js/components/card/card.component.min.js.map +1 -1
- package/assets/js/components/carousel/carousel.component.min.js +2 -2
- package/assets/js/components/collapsible-side/collapsible-side.component.js +47 -12
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js +6 -5
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js.map +1 -1
- package/assets/js/components/content/content.component.js +66 -0
- package/assets/js/components/content/content.component.min.js +15 -0
- package/assets/js/components/content/content.component.min.js.map +1 -0
- package/assets/js/components/doughnutchart/doughnutchart.component.min.js +2 -2
- package/assets/js/components/fileupload/fileupload.component.min.js +1 -1
- package/assets/js/components/filter-card/filter-card.component.min.js +1 -1
- package/assets/js/components/filterlist/filterlist.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 +5 -5
- package/assets/js/components/marketing/marketing.component.js +1 -1
- package/assets/js/components/marketing/marketing.component.min.js +2 -2
- package/assets/js/components/marketing/marketing.component.min.js.map +1 -1
- package/assets/js/components/menu/menu.component.js +10 -2
- package/assets/js/components/menu/menu.component.min.js +2 -2
- package/assets/js/components/menu/menu.component.min.js.map +1 -1
- package/assets/js/components/milestone/milestone.component.js +38 -0
- package/assets/js/components/milestone/milestone.component.min.js +15 -0
- package/assets/js/components/milestone/milestone.component.min.js.map +1 -0
- package/assets/js/components/milestone-group/milestone-group.component.js +35 -0
- package/assets/js/components/milestone-group/milestone-group.component.min.js +13 -0
- package/assets/js/components/milestone-group/milestone-group.component.min.js.map +1 -0
- package/assets/js/components/multi-step/multi-step.component.min.js +1 -1
- package/assets/js/components/multiselect/multiselect.component.js +54 -2
- package/assets/js/components/multiselect/multiselect.component.min.js +5 -5
- package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
- package/assets/js/components/nav/nav.component.js +19 -0
- package/assets/js/components/nav/nav.component.min.js +6 -6
- package/assets/js/components/nav/nav.component.min.js.map +1 -1
- package/assets/js/components/notification/notification.component.js +17 -11
- package/assets/js/components/notification/notification.component.min.js +4 -4
- package/assets/js/components/notification/notification.component.min.js.map +1 -1
- package/assets/js/components/pagination/pagination.component.min.js +1 -1
- package/assets/js/components/rank/rank.component.js +346 -210
- package/assets/js/components/rank/rank.component.min.js +346 -211
- package/assets/js/components/rank/rank.component.min.js.map +1 -1
- package/assets/js/components/rankings/rankings.component.js +17 -8
- package/assets/js/components/rankings/rankings.component.min.js +14 -8
- package/assets/js/components/rankings/rankings.component.min.js.map +1 -1
- package/assets/js/components/record-card/record-card.component.min.js +1 -1
- package/assets/js/components/search/search.component.js +5 -3
- package/assets/js/components/search/search.component.min.js +6 -6
- package/assets/js/components/search/search.component.min.js.map +1 -1
- package/assets/js/components/slider/slider.component.min.js +1 -1
- package/assets/js/components/split-button/split-button.component.js +60 -0
- package/assets/js/components/split-button/split-button.component.min.js +34 -0
- package/assets/js/components/split-button/split-button.component.min.js.map +1 -0
- package/assets/js/components/table/table.component.js +12 -0
- package/assets/js/components/table/table.component.min.js +3 -3
- package/assets/js/components/table/table.component.min.js.map +1 -1
- package/assets/js/components/table-ajax/table-ajax.component.js +12 -0
- package/assets/js/components/table-ajax/table-ajax.component.min.js +3 -3
- package/assets/js/components/table-ajax/table-ajax.component.min.js.map +1 -1
- package/assets/js/components/table-basic/table-basic.component.min.js +1 -1
- package/assets/js/components/table-basic/table-basic.component.min.js.map +1 -1
- package/assets/js/components/table-no-submit/table-no-submit.component.js +12 -0
- package/assets/js/components/table-no-submit/table-no-submit.component.min.js +3 -3
- package/assets/js/components/table-no-submit/table-no-submit.component.min.js.map +1 -1
- package/assets/js/components/table-submit/table-submit.component.js +12 -0
- package/assets/js/components/table-submit/table-submit.component.min.js +3 -3
- package/assets/js/components/table-submit/table-submit.component.min.js.map +1 -1
- package/assets/js/components/tabs/tabs.component.min.js +1 -1
- package/assets/js/components/video-card/video-card.component.min.js +1 -1
- package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
- package/assets/js/components.js +58 -0
- package/assets/js/modules/advanced-select.js +106 -0
- package/assets/js/modules/dialogs.js +53 -51
- package/assets/js/modules/dynamicEvents.js +7 -0
- package/assets/js/modules/milestone-group.js +30 -0
- package/assets/js/modules/milestone.js +89 -0
- package/assets/js/modules/table.js +11 -1
- package/assets/js/modules/videos.js +1 -1
- package/assets/js/scripts.bundle.js +3 -3
- package/assets/js/scripts.bundle.js.map +1 -1
- package/assets/js/scripts.bundle.min.js +2 -2
- package/assets/js/scripts.bundle.min.js.map +1 -1
- package/assets/js/scripts.js +4 -0
- package/assets/sass/_components.scss +11 -0
- package/assets/sass/_functions/utility-mixins.scss +41 -0
- package/assets/sass/_functions/variables.scss +11 -5
- package/assets/sass/components/actionbar.component.scss +1 -1
- package/assets/sass/components/actionbar.global.scss +4 -4
- package/assets/sass/components/calendar.component.scss +1380 -0
- package/assets/sass/components/calendar.config.scss +476 -0
- package/assets/sass/components/card.component.scss +4 -34
- package/assets/sass/components/carousel.component.scss +5 -0
- package/assets/sass/components/collapsible-side.scss +91 -95
- package/assets/sass/components/content.component.scss +18 -0
- package/assets/sass/components/inline-edit.scss +2 -0
- package/assets/sass/components/{marketing.scss → marketing.component.scss} +2 -6
- package/assets/sass/components/menu.component.scss +3 -8
- package/assets/sass/components/milestone.scss +207 -0
- package/assets/sass/components/multiselect.scss +3 -0
- package/assets/sass/components/nav.component.scss +1 -0
- package/assets/sass/components/nav.global.scss +30 -0
- package/assets/sass/components/rank.component.scss +197 -24
- package/assets/sass/components/rankings.component.scss +38 -28
- package/assets/sass/components/rankings.global.scss +64 -2
- package/assets/sass/components/split-button.component.scss +77 -0
- package/assets/sass/elements/badge-tag.scss +5 -1
- package/assets/sass/elements/buttons--compact.scss +4 -0
- package/assets/sass/elements/details.scss +0 -1
- package/assets/sass/elements/forms.scss +130 -8
- package/assets/sass/elements/links.scss +132 -4
- package/assets/sass/elements/lists.scss +61 -0
- package/assets/sass/elements/popover.scss +64 -10
- package/assets/sass/elements/toggle-button.scss +7 -8
- package/assets/sass/elements/type.scss +7 -10
- package/assets/sass/templates/form.scss +0 -2
- package/assets/ts/components/actionbar/actionbar.component.ts +49 -23
- package/assets/ts/components/advanced-select/advanced-select.component.ts +74 -0
- package/assets/ts/components/calendar/calendar.component.ts +1460 -0
- package/assets/ts/components/card/card.component.ts +22 -14
- package/assets/ts/components/collapsible-side/collapsible-side.component.ts +53 -12
- package/assets/ts/components/content/content.component.ts +78 -0
- package/assets/ts/components/marketing/marketing.component.ts +1 -1
- package/assets/ts/components/menu/menu.component.ts +16 -8
- package/assets/ts/components/milestone/milestone.component.ts +45 -0
- package/assets/ts/components/milestone-group/milestone-group.component.ts +41 -0
- package/assets/ts/components/multiselect/multiselect.component.ts +69 -3
- package/assets/ts/components/nav/nav.component.ts +25 -0
- package/assets/ts/components/notification/notification.component.ts +34 -11
- package/assets/ts/components/rank/rank.component.ts +345 -209
- package/assets/ts/components/rankings/rankings.component.ts +27 -8
- package/assets/ts/components/search/search.component.ts +6 -4
- package/assets/ts/components/split-button/split-button.component.ts +69 -0
- package/assets/ts/components/table/table.component.ts +14 -0
- package/assets/ts/components/table-ajax/table-ajax.component.ts +14 -0
- package/assets/ts/components/table-no-submit/table-no-submit.component.ts +14 -0
- package/assets/ts/components/table-submit/table-submit.component.ts +14 -0
- package/assets/ts/components/video-card/video-card.component.ts +2 -3
- package/assets/ts/components.ts +63 -0
- package/assets/ts/modules/advanced-select.ts +125 -0
- package/assets/ts/modules/dialogs.ts +64 -61
- package/assets/ts/modules/dynamicEvents.ts +12 -1
- package/assets/ts/modules/milestone-group.ts +42 -0
- package/assets/ts/modules/milestone.ts +122 -0
- package/assets/ts/modules/table.ts +15 -1
- package/assets/ts/modules/videos.ts +19 -37
- package/assets/ts/scripts.ts +5 -3
- package/dist/components.es.js +41 -1923
- package/dist/components.umd.js +126 -105
- package/package.json +1 -1
- package/src/components/AdvancedSelect/AdvancedSelect.vue +23 -0
- package/src/components/Calendar/Calendar.vue +26 -0
- package/src/components/Card/Card.vue +1 -1
- package/src/components/CollapsibleSideMenu/CollapsibleSideMenu.vue +7 -13
- package/src/components/Content/Content.vue +23 -0
- package/src/components/Milestones/Milestone.vue +27 -0
- package/src/components/Milestones/MilestoneGroup.vue +27 -0
- package/src/components/SplitButton/README.md +19 -0
- package/src/components/SplitButton/SplitButton.vue +26 -0
- package/src/index.js +44 -41
- package/assets/css/components/marketing.css +0 -1
- package/assets/css/components/marketing.css.map +0 -1
- package/assets/css/components/nav.old.css +0 -1
- package/assets/css/components/nav.old.css.map +0 -1
- package/assets/sass/components/nav.old.scss +0 -891
|
@@ -32,6 +32,20 @@ class iamCard extends HTMLElement {
|
|
|
32
32
|
const cardComponent = this;
|
|
33
33
|
const cardBody = cardComponent.shadowRoot.querySelector('.card__body');
|
|
34
34
|
|
|
35
|
+
const assetLocation = document.body.hasAttribute('data-assets-location')
|
|
36
|
+
? document.body.getAttribute('data-assets-location')
|
|
37
|
+
: '/assets';
|
|
38
|
+
|
|
39
|
+
if (!window.customElements.get(`iam-menu`)) {
|
|
40
|
+
import(/* @vite-ignore */ `${assetLocation}/js/components/menu/menu.component.js`)
|
|
41
|
+
.then((module) => {
|
|
42
|
+
window.customElements.define(`iam-menu`, module.default);
|
|
43
|
+
})
|
|
44
|
+
.catch((err) => {
|
|
45
|
+
console.log(err.message);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
35
49
|
setupCard(cardComponent);
|
|
36
50
|
|
|
37
51
|
// Add Illustration HTML
|
|
@@ -51,22 +65,19 @@ class iamCard extends HTMLElement {
|
|
|
51
65
|
|
|
52
66
|
// Add the dialog wrapper HTML
|
|
53
67
|
if (cardComponent.querySelector('[slot="btns"]')) {
|
|
54
|
-
cardComponent.shadowRoot.innerHTML += `<div class="
|
|
55
|
-
<button class="btn btn-secondary btn-compact fa-ellipsis-vertical" popovertarget="actions" title="Further actions" type="button">Open further actions</button>
|
|
56
|
-
<
|
|
68
|
+
cardComponent.shadowRoot.innerHTML += `<div class="menu__wrapper">
|
|
69
|
+
<button class="btn btn-secondary btn-compact fa-ellipsis-vertical m-0" popovertarget="actions" style="anchor-name: --anchor-el;" title="Further actions" type="button">Open further actions</button>
|
|
70
|
+
<iam-menu class="dialog--fix dialog--list" id="actions" style="position-anchor: --anchor-el;" popover>
|
|
57
71
|
<slot name="btns"></slot>
|
|
58
|
-
</
|
|
72
|
+
</iam-menu>
|
|
59
73
|
</div>`;
|
|
60
74
|
|
|
61
75
|
// safari and firefox anchor fix for cards
|
|
62
76
|
if (!CSS.supports('top', 'anchor(top)')) {
|
|
63
|
-
|
|
64
|
-
|
|
65
77
|
const actionButton = this.shadowRoot?.querySelector('[popovertarget="actions"]');
|
|
66
78
|
const actionPopover = this.shadowRoot?.querySelector('[popover]');
|
|
67
79
|
|
|
68
80
|
actionButton?.addEventListener('click', (event) => {
|
|
69
|
-
|
|
70
81
|
this.style.setProperty('overflow', 'visible');
|
|
71
82
|
this.style.setProperty('z-index', '999999');
|
|
72
83
|
|
|
@@ -76,18 +87,15 @@ class iamCard extends HTMLElement {
|
|
|
76
87
|
|
|
77
88
|
actionPopover.style.setProperty('display', 'block');
|
|
78
89
|
actionPopover.style.setProperty('top', top + 'px');
|
|
79
|
-
actionPopover.style.setProperty('left',
|
|
90
|
+
actionPopover.style.setProperty('left', left - 100 + 'px');
|
|
80
91
|
});
|
|
81
92
|
|
|
82
|
-
document.addEventListener(
|
|
83
|
-
|
|
93
|
+
document.addEventListener('scroll', (event) => {
|
|
84
94
|
actionPopover.style.setProperty('display', 'none');
|
|
85
95
|
});
|
|
86
|
-
|
|
87
96
|
}
|
|
88
97
|
}
|
|
89
98
|
|
|
90
|
-
|
|
91
99
|
// Make sure slotted buttons and links have correct button classes
|
|
92
100
|
Array.from(cardComponent.querySelectorAll('[slot="btns"]')).forEach((button) => {
|
|
93
101
|
button.classList.add('btn');
|
|
@@ -107,8 +115,8 @@ class iamCard extends HTMLElement {
|
|
|
107
115
|
});
|
|
108
116
|
}
|
|
109
117
|
|
|
110
|
-
if (cardComponent.shadowRoot.querySelector('.
|
|
111
|
-
const element = cardComponent.shadowRoot.querySelector('.
|
|
118
|
+
if (cardComponent.shadowRoot.querySelector('.menu__wrapper')) {
|
|
119
|
+
const element = cardComponent.shadowRoot.querySelector('.menu__wrapper');
|
|
112
120
|
|
|
113
121
|
element.addEventListener('mouseenter', () => {
|
|
114
122
|
cardComponent.classList.add('prevent-hover');
|
|
@@ -30,6 +30,7 @@ class iamCollapsibleSideMenu extends HTMLElement {
|
|
|
30
30
|
|
|
31
31
|
<div class="side-menu" part="side-menu">
|
|
32
32
|
<button class="btn btn-compact fa-chevron-right btn-secondary btn-sm btn-collapse" part="btn">Open or close Collapsible menu</button>
|
|
33
|
+
|
|
33
34
|
<div class="side-menu-content closed" part="side-menu-content">
|
|
34
35
|
<slot name="menu"></slot>
|
|
35
36
|
</div>
|
|
@@ -41,35 +42,55 @@ class iamCollapsibleSideMenu extends HTMLElement {
|
|
|
41
42
|
|
|
42
43
|
</div>
|
|
43
44
|
`;
|
|
44
|
-
|
|
45
|
+
|
|
46
|
+
if (this.shadowRoot) {
|
|
47
|
+
this.shadowRoot.appendChild(template.content.cloneNode(true));
|
|
48
|
+
}
|
|
45
49
|
}
|
|
46
50
|
|
|
47
51
|
connectedCallback(): void {
|
|
52
|
+
if (!this.shadowRoot) return;
|
|
53
|
+
|
|
54
|
+
const container = this.shadowRoot.querySelector('.container');
|
|
48
55
|
const sideMenu = this.shadowRoot.querySelector('.side-menu');
|
|
49
56
|
const sideMenuContent = this.shadowRoot.querySelector('.side-menu-content');
|
|
50
57
|
const mainContent = this.shadowRoot.querySelector('.main-content');
|
|
51
58
|
const button = this.shadowRoot.querySelector('.side-menu > .btn');
|
|
52
59
|
|
|
60
|
+
if (!sideMenu || !sideMenuContent || !mainContent || !button) return;
|
|
61
|
+
|
|
53
62
|
// Load external CSS if needed
|
|
54
|
-
if (this.hasAttribute('data-css'))
|
|
55
|
-
this.shadowRoot
|
|
56
|
-
|
|
57
|
-
.insertAdjacentHTML('beforeend', `@import "${this.getAttribute('data-css')}";`);
|
|
63
|
+
if (this.hasAttribute('data-css')) {
|
|
64
|
+
const styles = this.shadowRoot.querySelector('.styles') as HTMLStyleElement;
|
|
65
|
+
if (styles) {
|
|
66
|
+
styles.insertAdjacentHTML('beforeend', `@import "${this.getAttribute('data-css')}";`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
58
69
|
|
|
59
|
-
// Set
|
|
60
|
-
if (!this.hasAttribute('data-title'))
|
|
70
|
+
// Set side nav title
|
|
71
|
+
if (!this.hasAttribute('data-title')) {
|
|
72
|
+
this.setAttribute('data-title', 'configuration');
|
|
73
|
+
}
|
|
61
74
|
|
|
62
75
|
sideMenuContent.insertAdjacentHTML('afterbegin', `<span class="h3">${this.getAttribute('data-title')}</span>`);
|
|
63
76
|
mainContent.insertAdjacentHTML('afterbegin', `<span class="h3">${this.getAttribute('data-title')}</span>`);
|
|
64
77
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
78
|
+
const titleElement = this.querySelector(':scope > :is(h1,h2,h3,h4,h5,h6)') as HTMLElement;
|
|
79
|
+
if (titleElement) {
|
|
80
|
+
titleElement.classList.add('h4', 'main-content__title');
|
|
68
81
|
}
|
|
69
82
|
|
|
70
83
|
if (this.hasAttribute('open') && window.innerWidth > 992) {
|
|
71
84
|
sideMenu.classList.add('open');
|
|
72
|
-
button.setAttribute('aria-expanded', true);
|
|
85
|
+
button.setAttribute('aria-expanded', 'true');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (this.hasAttribute('inline')) {
|
|
89
|
+
container.classList.add('inline');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (this.hasAttribute('menu-right')) {
|
|
93
|
+
sideMenu.classList.add('menu-right');
|
|
73
94
|
}
|
|
74
95
|
|
|
75
96
|
// Open the menu
|
|
@@ -79,7 +100,7 @@ class iamCollapsibleSideMenu extends HTMLElement {
|
|
|
79
100
|
|
|
80
101
|
setTimeout(function () {
|
|
81
102
|
sideMenu.classList.add('open');
|
|
82
|
-
button.setAttribute('aria-expanded', true);
|
|
103
|
+
button.setAttribute('aria-expanded', 'true');
|
|
83
104
|
}, 100);
|
|
84
105
|
} else {
|
|
85
106
|
sideMenu.classList.remove('open');
|
|
@@ -122,6 +143,26 @@ class iamCollapsibleSideMenu extends HTMLElement {
|
|
|
122
143
|
}, 1000); // Delay until its close so the animation is broken
|
|
123
144
|
}
|
|
124
145
|
});
|
|
146
|
+
|
|
147
|
+
const sideMenuParentGroups = this.querySelectorAll('.parent');
|
|
148
|
+
const sideMenuParentGroupsTopLinks = this.querySelectorAll('.parent > li:first-of-type');
|
|
149
|
+
|
|
150
|
+
sideMenuParentGroupsTopLinks?.forEach((parentLink) => {
|
|
151
|
+
parentLink.addEventListener('click', () => {
|
|
152
|
+
if (!parentLink || !parentLink.parentElement) return false; // make sure elements exist
|
|
153
|
+
|
|
154
|
+
if (parentLink.parentElement.classList.contains('reveal')) {
|
|
155
|
+
parentLink.parentElement.classList.remove('reveal'); // remove if clicking a revealed parent
|
|
156
|
+
} else {
|
|
157
|
+
// remove other reveals and add reveal to this one
|
|
158
|
+
sideMenuParentGroups?.forEach((parentGroup) => {
|
|
159
|
+
parentGroup.classList.remove('reveal');
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
parentLink.parentElement.classList.add('reveal');
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
});
|
|
125
166
|
}
|
|
126
167
|
}
|
|
127
168
|
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
class iamContent extends HTMLElement {
|
|
2
|
+
constructor() {
|
|
3
|
+
super();
|
|
4
|
+
this.attachShadow({ mode: 'open' });
|
|
5
|
+
const assetLocation = document.body.hasAttribute('data-assets-location')
|
|
6
|
+
? document.body.getAttribute('data-assets-location')
|
|
7
|
+
: '/assets';
|
|
8
|
+
|
|
9
|
+
const loadCSS = `@import "${assetLocation}/css/components/content.component.css";`;
|
|
10
|
+
|
|
11
|
+
const template = document.createElement('template');
|
|
12
|
+
template.innerHTML = `
|
|
13
|
+
<style>
|
|
14
|
+
${loadCSS}
|
|
15
|
+
|
|
16
|
+
${this.hasAttribute('css') ? `@import "${this.getAttribute('css')}";` : ``}
|
|
17
|
+
</style>
|
|
18
|
+
<div class="content__container">
|
|
19
|
+
<slot></slot>
|
|
20
|
+
</div>
|
|
21
|
+
`;
|
|
22
|
+
this.shadowRoot.appendChild(template.content.cloneNode(true));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
connectedCallback(): void {
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
27
|
+
const component = this;
|
|
28
|
+
const url = this.getAttribute('data-url');
|
|
29
|
+
|
|
30
|
+
const registerComponents = (contentComponent): void => {
|
|
31
|
+
const components = ['card', 'marketing', 'notification'];
|
|
32
|
+
|
|
33
|
+
const assetLocation = document.body.hasAttribute('data-assets-location')
|
|
34
|
+
? document.body.getAttribute('data-assets-location')
|
|
35
|
+
: '/assets';
|
|
36
|
+
|
|
37
|
+
// Load components - Each component will load once the first of its type has been loaded
|
|
38
|
+
components.forEach((component) => {
|
|
39
|
+
if (component == 'notification') {
|
|
40
|
+
document.querySelectorAll('[data-notification]').forEach((element) => {
|
|
41
|
+
element.outerHTML = element.outerHTML
|
|
42
|
+
.replace(/<div/g, '<iam-notification')
|
|
43
|
+
.replace(/<\/div>/g, '</iam-notification>');
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (contentComponent.getElementsByTagName(`iam-${component}`).length === 0) return;
|
|
48
|
+
|
|
49
|
+
import(/* @vite-ignore */ `${assetLocation}/js/components/${component}/${component}.component.js`)
|
|
50
|
+
.then((module) => {
|
|
51
|
+
if (!window.customElements.get(`iam-${component}`))
|
|
52
|
+
window.customElements.define(`iam-${component}`, module.default);
|
|
53
|
+
})
|
|
54
|
+
.catch((err) => {
|
|
55
|
+
console.log(err.message);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
if (url) {
|
|
61
|
+
const newXHRRequest = new XMLHttpRequest();
|
|
62
|
+
newXHRRequest.open('GET', url, true);
|
|
63
|
+
|
|
64
|
+
newXHRRequest.onload = function (): void {
|
|
65
|
+
if (this.status === 200) {
|
|
66
|
+
const response = JSON.parse(this.responseText);
|
|
67
|
+
component.innerHTML = `${response.content.rendered}`;
|
|
68
|
+
|
|
69
|
+
registerComponents(component);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
newXHRRequest.send();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export default iamContent;
|
|
@@ -16,7 +16,7 @@ class iamMarketing extends HTMLElement {
|
|
|
16
16
|
const coreCSS = document.body.hasAttribute('data-core-css')
|
|
17
17
|
? document.body.getAttribute('data-core-css')
|
|
18
18
|
: `${assetLocation}/css/core.min.css`;
|
|
19
|
-
const loadCSS = `@import "${assetLocation}/css/components/marketing.css";`;
|
|
19
|
+
const loadCSS = `@import "${assetLocation}/css/components/marketing.component.css";`;
|
|
20
20
|
|
|
21
21
|
const template = document.createElement('template');
|
|
22
22
|
template.innerHTML = `
|
|
@@ -24,8 +24,14 @@ class iamMenu extends HTMLElement {
|
|
|
24
24
|
const menuID = this.hasAttribute('id') ? this.getAttribute('id') : false;
|
|
25
25
|
const menuButton = document.querySelector(`[popovertarget="${menuID}"]`);
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
let topLevelmenuItems = this.querySelectorAll(':scope > a, :scope > button, :scope > details > summary');
|
|
28
|
+
let menuItems = this.querySelectorAll('a, button');
|
|
29
|
+
|
|
30
|
+
if (this.closest('.menu__wrapper')) {
|
|
31
|
+
menuItems = this.shadowRoot.querySelector('slot').assignedElements({ flatten: true });
|
|
32
|
+
topLevelmenuItems = menuItems;
|
|
33
|
+
}
|
|
34
|
+
|
|
29
35
|
const subMenus = this.querySelectorAll('details');
|
|
30
36
|
|
|
31
37
|
let subNextIndex;
|
|
@@ -136,19 +142,21 @@ class iamMenu extends HTMLElement {
|
|
|
136
142
|
const updateEvent = new CustomEvent(e.newState, { detail: { id: this.getAttribute('id'), target: e.target } });
|
|
137
143
|
this.dispatchEvent(updateEvent);
|
|
138
144
|
|
|
145
|
+
// Fix the focus
|
|
146
|
+
if (this.closest('.menu__wrapper')) {
|
|
147
|
+
menuItems[0].focus();
|
|
148
|
+
}
|
|
149
|
+
|
|
139
150
|
if (this.hasAttribute('popover-open')) {
|
|
140
151
|
e.preventDefault();
|
|
141
152
|
this.removeAttribute('popover-open');
|
|
142
153
|
this.hidePopover();
|
|
143
154
|
}
|
|
144
155
|
|
|
145
|
-
if(this.matches(':popover-open') && document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)){
|
|
146
|
-
|
|
147
|
-
document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)?.setAttribute('aria-pressed','true');
|
|
156
|
+
if (this.matches(':popover-open') && document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)) {
|
|
157
|
+
document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)?.setAttribute('aria-pressed', 'true');
|
|
148
158
|
document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)?.classList.add('active');
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
|
|
159
|
+
} else {
|
|
152
160
|
document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)?.removeAttribute('aria-pressed');
|
|
153
161
|
document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)?.classList.remove('active');
|
|
154
162
|
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { trackComponent, trackComponentRegistered } from '../_global';
|
|
2
|
+
import milestone from '../../modules/milestone';
|
|
3
|
+
|
|
4
|
+
trackComponentRegistered('iam-milestone');
|
|
5
|
+
|
|
6
|
+
class iamMilestone extends HTMLElement {
|
|
7
|
+
constructor() {
|
|
8
|
+
super();
|
|
9
|
+
this.attachShadow({ mode: 'open' });
|
|
10
|
+
|
|
11
|
+
const assetLocation = document.body.hasAttribute('data-assets-location')
|
|
12
|
+
? document.body.getAttribute('data-assets-location')
|
|
13
|
+
: '/assets';
|
|
14
|
+
const coreCSS = document.body.hasAttribute('data-core-css')
|
|
15
|
+
? document.body.getAttribute('data-core-css')
|
|
16
|
+
: `${assetLocation}/css/core.min.css`;
|
|
17
|
+
|
|
18
|
+
const template = document.createElement('template');
|
|
19
|
+
template.innerHTML = `
|
|
20
|
+
<style>
|
|
21
|
+
@import "${coreCSS}";
|
|
22
|
+
</style>
|
|
23
|
+
<div class="milestone-wrap" part="milestone-wrap">
|
|
24
|
+
<slot name="milestone-intro" class="milestone-intro" part="milestone-intro"></slot>
|
|
25
|
+
<slot>
|
|
26
|
+
<div class="task-wrap" part="milestone-task-wrap"></div>
|
|
27
|
+
</slot>
|
|
28
|
+
</div>
|
|
29
|
+
`;
|
|
30
|
+
this.shadowRoot?.appendChild(template.content.cloneNode(true));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
connectedCallback(): void {
|
|
34
|
+
const milestoneComponent = this;
|
|
35
|
+
|
|
36
|
+
trackComponent(milestoneComponent, 'iam-milestone', [
|
|
37
|
+
'milestone-item-closed',
|
|
38
|
+
'milestone-item-opened',
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
milestone(this);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export default iamMilestone;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { trackComponent, trackComponentRegistered } from '../_global';
|
|
2
|
+
import milestoneGroup from '../../modules/milestone-group';
|
|
3
|
+
|
|
4
|
+
trackComponentRegistered('iam-milestone-group');
|
|
5
|
+
|
|
6
|
+
class iamMilestoneGroup extends HTMLElement {
|
|
7
|
+
constructor() {
|
|
8
|
+
super();
|
|
9
|
+
const assetLocation = document.body.hasAttribute('data-assets-location')
|
|
10
|
+
? document.body.getAttribute('data-assets-location')
|
|
11
|
+
: '/assets';
|
|
12
|
+
const coreCSS = document.body.hasAttribute('data-core-css')
|
|
13
|
+
? document.body.getAttribute('data-core-css')
|
|
14
|
+
: `${assetLocation}/css/core.min.css`;
|
|
15
|
+
|
|
16
|
+
const template = document.createElement('template');
|
|
17
|
+
template.innerHTML = `
|
|
18
|
+
<style>
|
|
19
|
+
@import "${coreCSS}";
|
|
20
|
+
</style>
|
|
21
|
+
<div class="milestone-group" part="milestone-group">
|
|
22
|
+
<slot>
|
|
23
|
+
</slot>
|
|
24
|
+
</div>
|
|
25
|
+
`;
|
|
26
|
+
this.shadowRoot?.appendChild(template.content.cloneNode(true));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
connectedCallback(): void {
|
|
30
|
+
const milestoneGroupComponent = this;
|
|
31
|
+
|
|
32
|
+
trackComponent(milestoneGroupComponent, 'iam-milestone-group', [
|
|
33
|
+
'hide-future-items',
|
|
34
|
+
'show-future-items'
|
|
35
|
+
]);
|
|
36
|
+
|
|
37
|
+
milestoneGroup(this);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export default iamMilestoneGroup;
|
|
@@ -67,8 +67,6 @@ class iamMultiselect extends HTMLElement {
|
|
|
67
67
|
mutations.forEach(function (mutationRecord) {
|
|
68
68
|
const targetElement = mutationRecord.target as HTMLElement;
|
|
69
69
|
|
|
70
|
-
console.log(targetElement);
|
|
71
|
-
|
|
72
70
|
if (targetElement.classList.contains('was-validated')) {
|
|
73
71
|
wrapper.classList.add('was-validated');
|
|
74
72
|
} else {
|
|
@@ -149,9 +147,30 @@ class iamMultiselect extends HTMLElement {
|
|
|
149
147
|
clearTimeout(hoverTimeout);
|
|
150
148
|
});
|
|
151
149
|
|
|
152
|
-
search.addEventListener('blur', () => {
|
|
150
|
+
search.addEventListener('blur', (event) => {
|
|
151
|
+
|
|
152
|
+
setTimeout(function () {
|
|
153
|
+
const activeElement = document.activeElement;
|
|
154
|
+
|
|
155
|
+
if(activeElement.getAttribute('type') != 'checkbox'){
|
|
156
|
+
|
|
157
|
+
if(multiselect.querySelector(`input[type="checkbox"][value="${search.value}" i]`)){
|
|
158
|
+
|
|
159
|
+
multiselect.querySelector(`input[type="checkbox"][value="${search.value}" i]`).checked = true;
|
|
160
|
+
setItem(multiselect.querySelector(`input[type="checkbox"][value="${search.value}" i]`));
|
|
161
|
+
}
|
|
162
|
+
search.value = "";
|
|
163
|
+
|
|
164
|
+
Array.from(multiselect.querySelectorAll(`label input[type="checkbox"]`)).forEach((checkbox) => {
|
|
165
|
+
setItem(checkbox);
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
}, 200);
|
|
170
|
+
|
|
153
171
|
clearTimeout(hoverTimeout);
|
|
154
172
|
hoverTimeout = setTimeout(function () {
|
|
173
|
+
|
|
155
174
|
multiselect.classList.remove('hover');
|
|
156
175
|
}, 1000);
|
|
157
176
|
});
|
|
@@ -163,6 +182,7 @@ class iamMultiselect extends HTMLElement {
|
|
|
163
182
|
|
|
164
183
|
setItem(checkbox);
|
|
165
184
|
|
|
185
|
+
search.value = "";
|
|
166
186
|
search.focus();
|
|
167
187
|
clearTimeout(hoverTimeout);
|
|
168
188
|
multiselect.classList.add('hover');
|
|
@@ -190,6 +210,43 @@ class iamMultiselect extends HTMLElement {
|
|
|
190
210
|
switch (
|
|
191
211
|
event.key // change to event.key to key to use the above variable
|
|
192
212
|
) {
|
|
213
|
+
case 'ArrowLeft':
|
|
214
|
+
// Up pressed
|
|
215
|
+
event.preventDefault();
|
|
216
|
+
|
|
217
|
+
if (activeElement.hasAttribute('type') && activeElement.getAttribute('type') == 'checkbox') {
|
|
218
|
+
const arrCheckboxes = multiselect.querySelectorAll(`label[slot="checked"][slot="checked"]`);
|
|
219
|
+
|
|
220
|
+
const activeIndex = Array.from(arrCheckboxes).indexOf(activeElement.closest('label'));
|
|
221
|
+
const prevCheckbox = Array.from(arrCheckboxes)[activeIndex - 1];
|
|
222
|
+
|
|
223
|
+
if (prevCheckbox) prevCheckbox.focus();
|
|
224
|
+
else search.focus();
|
|
225
|
+
}
|
|
226
|
+
else if (activeElement == multiselect){
|
|
227
|
+
|
|
228
|
+
const options = Array.from(multiselect.querySelectorAll('label[slot="checked"]')).sort(function(a, b) {
|
|
229
|
+
return +a.dataset.order - +b.dataset.order;
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
options.pop().focus();
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
break;
|
|
236
|
+
case 'ArrowRight':
|
|
237
|
+
// Up pressed
|
|
238
|
+
event.preventDefault();
|
|
239
|
+
|
|
240
|
+
if (activeElement.hasAttribute('type') && activeElement.getAttribute('type') == 'checkbox') {
|
|
241
|
+
const arrCheckboxes = multiselect.querySelectorAll(`label[slot="checked"][slot="checked"]`);
|
|
242
|
+
|
|
243
|
+
const activeIndex = Array.from(arrCheckboxes).indexOf(activeElement.closest('label'));
|
|
244
|
+
const nextCheckbox = Array.from(arrCheckboxes)[activeIndex + 1];
|
|
245
|
+
|
|
246
|
+
if (nextCheckbox) nextCheckbox.focus();
|
|
247
|
+
else search.focus();
|
|
248
|
+
}
|
|
249
|
+
break;
|
|
193
250
|
case 'ArrowUp':
|
|
194
251
|
// Up pressed
|
|
195
252
|
event.preventDefault();
|
|
@@ -234,6 +291,14 @@ class iamMultiselect extends HTMLElement {
|
|
|
234
291
|
setItem(activeElement);
|
|
235
292
|
search.focus();
|
|
236
293
|
|
|
294
|
+
break;
|
|
295
|
+
case 'Backspace':
|
|
296
|
+
if (activeElement.hasAttribute('type') && activeElement.getAttribute('type') == 'checkbox') {
|
|
297
|
+
|
|
298
|
+
activeElement.checked = false;
|
|
299
|
+
setItem(activeElement);
|
|
300
|
+
search.focus();
|
|
301
|
+
}
|
|
237
302
|
break;
|
|
238
303
|
}
|
|
239
304
|
});
|
|
@@ -250,6 +315,7 @@ class iamMultiselect extends HTMLElement {
|
|
|
250
315
|
return lastTag;
|
|
251
316
|
}
|
|
252
317
|
|
|
318
|
+
|
|
253
319
|
search.addEventListener('keydown', function (event) {
|
|
254
320
|
switch (
|
|
255
321
|
event.key // change to event.key to key to use the above variable
|
|
@@ -347,6 +347,31 @@ class iamNav extends HTMLElement {
|
|
|
347
347
|
searchButton.removeAttribute('aria-expanded');
|
|
348
348
|
});
|
|
349
349
|
}
|
|
350
|
+
|
|
351
|
+
if(this.classList.contains('nav--sticky')){
|
|
352
|
+
|
|
353
|
+
console.log('hey');
|
|
354
|
+
|
|
355
|
+
let oldScrollY = window.scrollY;
|
|
356
|
+
window.onscroll = function(e) {
|
|
357
|
+
if(oldScrollY < window.scrollY){
|
|
358
|
+
document.body.setAttribute('data-direction', "down");
|
|
359
|
+
} else {
|
|
360
|
+
document.body.setAttribute('data-direction', "up");
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
if(window.scrollY > 100){
|
|
364
|
+
document.body.classList.add('past100');
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
|
|
368
|
+
document.body.classList.remove('past100');
|
|
369
|
+
}
|
|
370
|
+
oldScrollY = window.scrollY;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
}
|
|
374
|
+
|
|
350
375
|
}
|
|
351
376
|
}
|
|
352
377
|
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import setupNotification, { closeNotification } from '../../modules/notification';
|
|
2
|
+
import { trackComponent, trackComponentRegistered } from '../_global';
|
|
3
|
+
|
|
4
|
+
trackComponentRegistered('iam-notification');
|
|
2
5
|
|
|
3
|
-
// Data layer Web component created
|
|
4
|
-
window.dataLayer = window.dataLayer || [];
|
|
5
|
-
window.dataLayer.push({
|
|
6
|
-
event: 'customElementRegistered',
|
|
7
|
-
element: 'Notification',
|
|
8
|
-
});
|
|
9
6
|
|
|
10
7
|
class iamNotification extends HTMLElement {
|
|
11
8
|
constructor() {
|
|
@@ -44,7 +41,8 @@ class iamNotification extends HTMLElement {
|
|
|
44
41
|
connectedCallback(): void {
|
|
45
42
|
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
46
43
|
const wrapper = this;
|
|
47
|
-
const
|
|
44
|
+
const defaultStatusBG = this.hasAttribute('data-type') ? 'white' : 'info';
|
|
45
|
+
const statusBG = this.hasAttribute('data-status') ? this.getAttribute('data-status') : defaultStatusBG;
|
|
48
46
|
|
|
49
47
|
if (this.hasAttribute('data-type')) this.classList.add(`bg-${statusBG}`);
|
|
50
48
|
else {
|
|
@@ -54,16 +52,28 @@ class iamNotification extends HTMLElement {
|
|
|
54
52
|
if (!this.querySelector('i')) {
|
|
55
53
|
switch (statusBG) {
|
|
56
54
|
case 'danger':
|
|
57
|
-
this.
|
|
55
|
+
this.insertAdjacentHTML(
|
|
56
|
+
'beforeend',
|
|
57
|
+
'<i class="fa-solid fa-circle-exclamation" aria-hidden="true" slot="icon"></i>'
|
|
58
|
+
);
|
|
58
59
|
break;
|
|
59
60
|
case 'warning':
|
|
60
|
-
this.
|
|
61
|
+
this.insertAdjacentHTML(
|
|
62
|
+
'beforeend',
|
|
63
|
+
'<i class="fa-solid fa-triangle-exclamation" aria-hidden="true" slot="icon"></i>'
|
|
64
|
+
);
|
|
61
65
|
break;
|
|
62
66
|
case 'success':
|
|
63
|
-
this.
|
|
67
|
+
this.insertAdjacentHTML(
|
|
68
|
+
'beforeend',
|
|
69
|
+
'<i class="fa-solid fa-check-circle" aria-hidden="true" slot="icon"></i>'
|
|
70
|
+
);
|
|
64
71
|
break;
|
|
65
72
|
default:
|
|
66
|
-
this.
|
|
73
|
+
this.insertAdjacentHTML(
|
|
74
|
+
'beforeend',
|
|
75
|
+
'<i class="fa-solid fa-circle-info" aria-hidden="true" slot="icon"></i>'
|
|
76
|
+
);
|
|
67
77
|
}
|
|
68
78
|
}
|
|
69
79
|
|
|
@@ -92,12 +102,25 @@ class iamNotification extends HTMLElement {
|
|
|
92
102
|
'click',
|
|
93
103
|
function () {
|
|
94
104
|
closeNotification(wrapper);
|
|
105
|
+
|
|
106
|
+
const customEvent = new CustomEvent('dismiss', {
|
|
107
|
+
detail: {
|
|
108
|
+
class: this.classList,
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
this.dispatchEvent(customEvent);
|
|
113
|
+
|
|
95
114
|
},
|
|
96
115
|
false
|
|
97
116
|
);
|
|
98
117
|
}
|
|
99
118
|
|
|
100
119
|
setupNotification(this);
|
|
120
|
+
|
|
121
|
+
trackComponent(this, 'iam-notification', [
|
|
122
|
+
'dismiss'
|
|
123
|
+
]);
|
|
101
124
|
}
|
|
102
125
|
}
|
|
103
126
|
|