@iamproperty/components 3.5.0 → 3.7.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/accordion.css.map +1 -1
- package/assets/css/components/admin-panel.css +1 -1
- package/assets/css/components/admin-panel.css.map +1 -1
- package/assets/css/components/applied-filters.css +1 -1
- package/assets/css/components/applied-filters.css.map +1 -1
- package/assets/css/components/card.css +1 -1
- package/assets/css/components/card.css.map +1 -1
- package/assets/css/components/charts.css +1 -1
- package/assets/css/components/charts.css.map +1 -1
- package/assets/css/components/dialog.css +1 -1
- package/assets/css/components/dialog.css.map +1 -1
- package/assets/css/components/forms.css +1 -1
- package/assets/css/components/forms.css.map +1 -1
- package/assets/css/components/header.css +1 -1
- package/assets/css/components/header.css.map +1 -1
- package/assets/css/components/lists.css +1 -1
- package/assets/css/components/lists.css.map +1 -1
- package/assets/css/components/nav.css +1 -1
- package/assets/css/components/nav.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/property-searchbar.css +1 -1
- package/assets/css/components/property-searchbar.css.map +1 -1
- package/assets/css/components/table.css +1 -1
- package/assets/css/components/table.css.map +1 -1
- package/assets/css/components/tabs.css +1 -1
- package/assets/css/components/tabs.css.map +1 -1
- package/assets/css/components/tooltips.css +1 -1
- package/assets/css/components/tooltips.css.map +1 -1
- package/assets/css/core.min.css +1 -1
- package/assets/css/core.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/bundle.js +2 -0
- package/assets/js/components/accordion/accordion.component.min.js +1 -1
- package/assets/js/components/card/card.component.js +2 -2
- package/assets/js/components/card/card.component.min.js +5 -5
- package/assets/js/components/card/card.component.min.js.map +1 -1
- package/assets/js/components/filterlist/filterlist.component.js +13 -9
- package/assets/js/components/filterlist/filterlist.component.min.js +14 -5
- package/assets/js/components/filterlist/filterlist.component.min.js.map +1 -1
- package/assets/js/components/header/header.component.min.js +5 -5
- package/assets/js/components/table/table.component.js +23 -9
- package/assets/js/components/table/table.component.min.js +21 -11
- package/assets/js/components/table/table.component.min.js.map +1 -1
- package/assets/js/components/tabs/tabs.component.js +6 -2
- package/assets/js/components/tabs/tabs.component.min.js +7 -5
- package/assets/js/components/tabs/tabs.component.min.js.map +1 -1
- package/assets/js/dynamic.js +3 -1
- package/assets/js/dynamic.min.js +2 -2
- package/assets/js/dynamic.min.js.map +1 -1
- package/assets/js/flat-components.js +2 -0
- package/assets/js/modules/applied-filters.js +6 -2
- package/assets/js/modules/dialogs.js +173 -0
- package/assets/js/modules/helpers.js +1 -84
- package/assets/js/modules/table.js +35 -21
- package/assets/js/modules/tabs.js +2 -2
- package/assets/js/scripts.bundle.js +53 -31
- 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/tests/table.spec.js +16 -2
- package/assets/sass/_corefiles.scss +3 -0
- package/assets/sass/_functions/functions.scss +2 -3
- package/assets/sass/_functions/mixins.scss +2 -18
- package/assets/sass/_functions/utilities.scss +35 -3
- package/assets/sass/_functions/variables.scss +70 -82
- package/assets/sass/_tests/colours.spec.scss +8 -8
- package/assets/sass/_tests/func.spec.scss +1 -1
- package/assets/sass/components/admin-panel.scss +95 -37
- package/assets/sass/components/applied-filters.scss +4 -0
- package/assets/sass/components/card.scss +39 -28
- package/assets/sass/components/charts.scss +2 -2
- package/assets/sass/components/dialog.scss +342 -30
- package/assets/sass/components/forms.scss +2 -2
- package/assets/sass/components/lists.scss +16 -33
- package/assets/sass/components/pagination.scss +4 -0
- package/assets/sass/components/table.scss +160 -39
- package/assets/sass/components/tabs.scss +54 -98
- package/assets/sass/components/tooltips.scss +1 -1
- package/assets/sass/foundations/buttons.scss +69 -58
- package/assets/sass/foundations/icons.scss +14 -69
- package/assets/sass/foundations/reboot.scss +17 -8
- package/assets/sass/foundations/root.scss +51 -48
- package/assets/sass/foundations/type.scss +4 -0
- package/assets/sass/helpers/max-height.scss +18 -0
- package/assets/ts/bundle.ts +2 -0
- package/assets/ts/components/card/README.md +2 -1
- package/assets/ts/components/card/card.component.ts +2 -2
- package/assets/ts/components/filterlist/filterlist.component.ts +13 -11
- package/assets/ts/components/table/table.component.ts +24 -10
- package/assets/ts/components/tabs/tabs.component.ts +7 -2
- package/assets/ts/dynamic.ts +3 -1
- package/assets/ts/flat-components.ts +2 -0
- package/assets/ts/html.d.ts +7 -1
- package/assets/ts/modules/applied-filters.ts +9 -3
- package/assets/ts/modules/dialogs.ts +237 -0
- package/assets/ts/modules/helpers.ts +1 -115
- package/assets/ts/modules/table.ts +47 -26
- package/assets/ts/modules/tabs.ts +3 -2
- package/assets/ts/tests/table.spec.ts +16 -4
- package/dist/components.es.js +1027 -1017
- package/dist/components.umd.js +50 -24
- package/dist/style.css +1 -1
- package/package.json +2 -3
- package/src/components/Card/Card.vue +2 -2
- package/src/components/Card/README.md +1 -1
- package/src/components/Nav/Nav.vue +1 -3
- package/src/index.js +0 -1
- package/assets/svg/icons.svg +0 -599
- package/src/foundations/Icon/Icon.spec.js +0 -24
- package/src/foundations/Icon/Icon.vue +0 -24
- package/src/foundations/Icon/README.md +0 -11
package/assets/ts/dynamic.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
2
|
// Modules
|
|
3
3
|
import * as helpers from '../js/modules/helpers'
|
|
4
|
+
import extendDialogs from '../js/modules/dialogs'
|
|
4
5
|
import createDataLayer from '../js/modules/data-layer'
|
|
5
6
|
import nav from '../js/modules/nav'
|
|
6
7
|
import table from '../js/modules/table'
|
|
@@ -16,7 +17,7 @@ const options = {
|
|
|
16
17
|
rootMargin: '50px',
|
|
17
18
|
threshold: 0.1
|
|
18
19
|
}
|
|
19
|
-
const componentExt = ".component.js";
|
|
20
|
+
const componentExt = ".component.min.js";
|
|
20
21
|
|
|
21
22
|
// Load components - Each component will load once the first of its type has been loaded
|
|
22
23
|
components.forEach((component) => {
|
|
@@ -59,6 +60,7 @@ document.addEventListener("DOMContentLoaded", function() {
|
|
|
59
60
|
helpers.addBodyClasses(document.body);
|
|
60
61
|
helpers.addGlobalEvents(document.body);
|
|
61
62
|
//helpers.checkElements(document.body);
|
|
63
|
+
extendDialogs(document.body);
|
|
62
64
|
|
|
63
65
|
// ANav
|
|
64
66
|
Array.from(document.querySelectorAll('.nav')).forEach((arrayElement) => {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
2
|
// Modules
|
|
3
3
|
import * as helpers from '../js/modules/helpers'
|
|
4
|
+
import extendDialogs from '../js/modules/dialogs'
|
|
4
5
|
import createDataLayer from '../js/modules/data-layer'
|
|
5
6
|
import nav from '../js/modules/nav'
|
|
6
7
|
import * as tableModule from './modules/table'
|
|
@@ -22,6 +23,7 @@ document.addEventListener("DOMContentLoaded", function() {
|
|
|
22
23
|
helpers.addBodyClasses(document.body);
|
|
23
24
|
helpers.addGlobalEvents(document.body);
|
|
24
25
|
//helpers.checkElements(document.body);
|
|
26
|
+
extendDialogs(document.body);
|
|
25
27
|
|
|
26
28
|
// ANav
|
|
27
29
|
Array.from(document.querySelectorAll('.nav')).forEach((arrayElement) => {
|
package/assets/ts/html.d.ts
CHANGED
|
@@ -103,7 +103,7 @@ function createAppliedFilters(container,filters) {
|
|
|
103
103
|
|
|
104
104
|
let input = event.target.closest('input[data-filter-text]');
|
|
105
105
|
|
|
106
|
-
addFilterButton (filters, input)
|
|
106
|
+
addFilterButton (filters, input);
|
|
107
107
|
};
|
|
108
108
|
|
|
109
109
|
}, false);
|
|
@@ -125,13 +125,19 @@ function createAppliedFilters(container,filters) {
|
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
let inputs = container.querySelectorAll(selector);
|
|
128
|
+
|
|
128
129
|
for(var i=0;i<inputs.length;i++){
|
|
129
130
|
let input = inputs[i];
|
|
130
131
|
|
|
132
|
+
|
|
131
133
|
if(input.getAttribute('type') != 'radio' && input.getAttribute('type') != 'checkbox')
|
|
132
|
-
|
|
134
|
+
input.value = "";
|
|
135
|
+
else {
|
|
136
|
+
input.checked = false;
|
|
133
137
|
|
|
134
|
-
|
|
138
|
+
var event = new Event('force');
|
|
139
|
+
input.closest('form').dispatchEvent(event);
|
|
140
|
+
}
|
|
135
141
|
}
|
|
136
142
|
}
|
|
137
143
|
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import { createEmbed } from "./youtubevideo";
|
|
3
|
+
|
|
4
|
+
const extendDialogs = (body) => {
|
|
5
|
+
|
|
6
|
+
// Dialogs/modals
|
|
7
|
+
body.addEventListener('click', (event) => {
|
|
8
|
+
|
|
9
|
+
// Modal
|
|
10
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('[data-modal]')){
|
|
11
|
+
|
|
12
|
+
const button = event.target.closest('[data-modal]');
|
|
13
|
+
const modalID = button.hasAttribute('data-modal') ? button.getAttribute('data-modal') : button.getAttribute('data-filter');
|
|
14
|
+
const dialog = document.querySelector(`dialog#${modalID}`);
|
|
15
|
+
|
|
16
|
+
createDialog(dialog);
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
// Prevent the user from escaping the model when transactional
|
|
20
|
+
if(dialog.querySelector(':scope > .mh-lg > form:last-child > button:last-child, :scope > .mh-lg > button:last-child') && !dialog.classList.contains('dialog--multi')) {
|
|
21
|
+
dialog.addEventListener("cancel", (e) => {
|
|
22
|
+
e.preventDefault();
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Create the video embed
|
|
27
|
+
let videoButton = dialog.querySelector('.youtube-embed a');
|
|
28
|
+
if (videoButton){
|
|
29
|
+
createEmbed(videoButton)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Open the modal!
|
|
33
|
+
dialog.showModal();
|
|
34
|
+
|
|
35
|
+
dialog.focus();
|
|
36
|
+
|
|
37
|
+
console.log(dialog.querySelector('button'));
|
|
38
|
+
|
|
39
|
+
window.dataLayer = window.dataLayer || [];
|
|
40
|
+
window.dataLayer.push({
|
|
41
|
+
"event": "openModal",
|
|
42
|
+
"id": modalID
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// Close modal
|
|
47
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('button.dialog__close')){
|
|
48
|
+
const dialog = event.target.closest('dialog[open]');
|
|
49
|
+
|
|
50
|
+
event.preventDefault();
|
|
51
|
+
dialog.close()
|
|
52
|
+
|
|
53
|
+
window.dataLayer = window.dataLayer || [];
|
|
54
|
+
window.dataLayer.push({
|
|
55
|
+
"event": "closeModal",
|
|
56
|
+
"id": dialog.getAttribute('id')
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Track default close buttons
|
|
61
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('button[formmethod="dialog"]')){
|
|
62
|
+
const dialog = event.target.closest('dialog[open]');
|
|
63
|
+
|
|
64
|
+
window.dataLayer = window.dataLayer || [];
|
|
65
|
+
window.dataLayer.push({
|
|
66
|
+
"event": "closeModal",
|
|
67
|
+
"id": dialog.getAttribute('id')
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Close the modal when clicked on the backdrop
|
|
72
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('dialog[open]')){
|
|
73
|
+
const dialog = event.target.closest('dialog[open]');
|
|
74
|
+
|
|
75
|
+
// Dont allow the backdrop to be clicked when transactional
|
|
76
|
+
if(!dialog.querySelector(':scope > .mh-lg > form:last-child > button:last-child, :scope > .mh-lg > button:last-child') || dialog.classList.contains('dialog--multi')){
|
|
77
|
+
|
|
78
|
+
const dialogDimensions = dialog.getBoundingClientRect()
|
|
79
|
+
|
|
80
|
+
if (event.clientX < dialogDimensions.left || event.clientX > dialogDimensions.right || event.clientY < dialogDimensions.top || event.clientY > dialogDimensions.bottom) {
|
|
81
|
+
|
|
82
|
+
dialog.close()
|
|
83
|
+
|
|
84
|
+
window.dataLayer = window.dataLayer || [];
|
|
85
|
+
window.dataLayer.push({
|
|
86
|
+
"event": "closeModal",
|
|
87
|
+
"id": dialog.getAttribute('id')
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Popover
|
|
94
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('.dialog__wrapper > button')){
|
|
95
|
+
|
|
96
|
+
// Close existing open popover
|
|
97
|
+
|
|
98
|
+
let btn = event.target.closest('.dialog__wrapper > button');
|
|
99
|
+
let parent = event.target.closest('.dialog__wrapper > button').parentNode;
|
|
100
|
+
let dataEvent = "openPopover"
|
|
101
|
+
let popover = parent.querySelector(':scope > dialog');
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
if(document.querySelector('dialog[open]') && document.querySelector('dialog[open]') != popover)
|
|
105
|
+
document.querySelector('dialog[open]').close();
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
if(popover.hasAttribute('open')){
|
|
109
|
+
|
|
110
|
+
popover.close();
|
|
111
|
+
dataEvent = "closePopover"
|
|
112
|
+
|
|
113
|
+
popover.removeAttribute('style');
|
|
114
|
+
btn.classList.remove('active');
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
|
|
118
|
+
popover.show();
|
|
119
|
+
btn.classList.add('active');
|
|
120
|
+
|
|
121
|
+
var position = btn.getBoundingClientRect();
|
|
122
|
+
let topOffset = position.top;
|
|
123
|
+
let leftOffset = position.left;
|
|
124
|
+
|
|
125
|
+
if(btn.closest('iam-table')){
|
|
126
|
+
|
|
127
|
+
let container = btn.closest('iam-table').parentNode.getBoundingClientRect();
|
|
128
|
+
|
|
129
|
+
topOffset -= container.top;
|
|
130
|
+
leftOffset -= container.left;
|
|
131
|
+
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if(popover.classList.contains('dialog--fix')){
|
|
135
|
+
popover.setAttribute('style',`position:fixed;top: ${topOffset}px; left: ${leftOffset}px; margin: 3rem 0 0 0;`)
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// When the dialog is fixed it could dip under the viewport
|
|
140
|
+
// Lets check the dimensions and transform it to appear above
|
|
141
|
+
let boundingRec = popover.getBoundingClientRect();
|
|
142
|
+
let popoverBottom = boundingRec.bottom - window.scrollY;
|
|
143
|
+
let windowPos = window.innerHeight - window.scrollY;
|
|
144
|
+
if(popoverBottom > windowPos){
|
|
145
|
+
|
|
146
|
+
let currentStyle = popover.getAttribute('style');
|
|
147
|
+
|
|
148
|
+
popover.setAttribute('style',currentStyle+`transform: translate(0, calc(-100% - 4rem))`);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
window.dataLayer = window.dataLayer || [];
|
|
152
|
+
|
|
153
|
+
window.dataLayer.push({
|
|
154
|
+
"event": dataEvent,
|
|
155
|
+
"id": btn.textContent
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
return null
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export const createDialog = (dialog) => {
|
|
164
|
+
|
|
165
|
+
// Multi dialog
|
|
166
|
+
if(dialog.classList.contains('dialog--multi') && !dialog.querySelector(':scope > .steps')) {
|
|
167
|
+
createMultiFormDialog(dialog);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if(!dialog.querySelector(':scope > .mh-lg') && !dialog.classList.contains('dialog--multi')){
|
|
171
|
+
dialog.innerHTML = `<div class="mh-lg">${dialog.innerHTML}</div>`;
|
|
172
|
+
|
|
173
|
+
let dialogContent = dialog.querySelector('.mh-lg');
|
|
174
|
+
let titleElement = dialog.querySelector('.mh-lg :is(.h1,.h2,.h3,.h4,.h5,.h6)');
|
|
175
|
+
|
|
176
|
+
if(titleElement){
|
|
177
|
+
|
|
178
|
+
let optionalElement = titleElement.previousSibling;
|
|
179
|
+
|
|
180
|
+
dialogContent.before(titleElement);
|
|
181
|
+
|
|
182
|
+
if(optionalElement)
|
|
183
|
+
titleElement.before(optionalElement);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Create close button is needed
|
|
188
|
+
if(!dialog.querySelector(':scope > button:first-child'))
|
|
189
|
+
dialog.innerHTML = `<button class="dialog__close">Close</button>${dialog.innerHTML}`;
|
|
190
|
+
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const createMultiFormDialog = (dialog) => {
|
|
194
|
+
let buttons = "";
|
|
195
|
+
let fieldsets = Array.from(dialog.querySelectorAll('fieldset[data-title]'));
|
|
196
|
+
fieldsets.forEach((fieldset,index) => {
|
|
197
|
+
buttons += `<button data-title="${fieldset.getAttribute('data-title')}" type="button" class="${index == 0 ? "active":""}">${fieldset.getAttribute('data-title')}</button>`;
|
|
198
|
+
|
|
199
|
+
const btnWrapper = document.createElement("div");
|
|
200
|
+
btnWrapper.classList.add('btn--wrapper');
|
|
201
|
+
fieldset.appendChild(btnWrapper);
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
if(index != 0)
|
|
205
|
+
btnWrapper.innerHTML += `<button data-title="${fieldsets[index-1].getAttribute('data-title')}" class="btn btn-secondary mb-0" type="button">Previous</button>`;
|
|
206
|
+
|
|
207
|
+
if(index != fieldsets.length - 1)
|
|
208
|
+
btnWrapper.innerHTML += `<button data-title="${fieldsets[index+1].getAttribute('data-title')}" class="btn btn-primary mb-0" type="button">Next</button>`;
|
|
209
|
+
|
|
210
|
+
if(index == fieldsets.length - 1)
|
|
211
|
+
btnWrapper.innerHTML += `<button class="btn btn-primary mb-0">Submit</button>`;
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
dialog.innerHTML = `<div class="steps bg-primary">${buttons}</div>${dialog.innerHTML}`;
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
dialog.addEventListener('click', (event) => {
|
|
218
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('button[data-title]')){
|
|
219
|
+
const button = event.target.closest('button[data-title]');
|
|
220
|
+
const fieldset = dialog.querySelector(`fieldset[data-title="${button.getAttribute('data-title')}"]`);
|
|
221
|
+
const step = dialog.querySelector(`.steps button[data-title="${button.getAttribute('data-title')}"]`);
|
|
222
|
+
|
|
223
|
+
Array.from(dialog.querySelectorAll('button')).forEach((button, index) => {
|
|
224
|
+
button.classList.remove('active');
|
|
225
|
+
});
|
|
226
|
+
Array.from(dialog.querySelectorAll('fieldset')).forEach((button, index) => {
|
|
227
|
+
button.classList.remove('active');
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
step.classList.add('active');
|
|
231
|
+
fieldset.classList.add('active');
|
|
232
|
+
};
|
|
233
|
+
return null
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export default extendDialogs;
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
-
import { createEmbed } from "./youtubevideo";
|
|
3
|
-
|
|
4
2
|
/**
|
|
5
3
|
* Global helper functions to help maintain and enhance framework elements.
|
|
6
4
|
* @module Helpers
|
|
@@ -49,7 +47,7 @@ export const addGlobalEvents = (body) => {
|
|
|
49
47
|
|
|
50
48
|
addEventListener("popstate", (event) => {
|
|
51
49
|
|
|
52
|
-
if(event.state.type == "pagination"){
|
|
50
|
+
if(event && event.state.type && event.state.type == "pagination"){
|
|
53
51
|
let form = document.querySelector(`#${event.state.form}`);
|
|
54
52
|
let pageInput = document.querySelector(`#${event.state.form} [data-pagination]`);
|
|
55
53
|
|
|
@@ -62,118 +60,6 @@ export const addGlobalEvents = (body) => {
|
|
|
62
60
|
}
|
|
63
61
|
});
|
|
64
62
|
|
|
65
|
-
// Dialogs/modals
|
|
66
|
-
document.addEventListener('click', (event) => {
|
|
67
|
-
|
|
68
|
-
// Modal
|
|
69
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('[data-modal]')){
|
|
70
|
-
|
|
71
|
-
const button = event.target.closest('[data-modal]');
|
|
72
|
-
const modalID = button.hasAttribute('data-modal') ? button.getAttribute('data-modal') : button.getAttribute('data-filter');
|
|
73
|
-
const dialog = document.querySelector(`dialog#${modalID}`);
|
|
74
|
-
|
|
75
|
-
// Create close button is needed
|
|
76
|
-
dialog.innerHTML = `<button class="dialog__close">Close</button>${dialog.innerHTML}`;
|
|
77
|
-
|
|
78
|
-
let videoButton = dialog.querySelector('.youtube-embed a');
|
|
79
|
-
|
|
80
|
-
if (videoButton){
|
|
81
|
-
createEmbed(videoButton)
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
dialog.showModal();
|
|
85
|
-
|
|
86
|
-
window.dataLayer = window.dataLayer || [];
|
|
87
|
-
window.dataLayer.push({
|
|
88
|
-
"event": "openModal",
|
|
89
|
-
"id": modalID
|
|
90
|
-
});
|
|
91
|
-
};
|
|
92
|
-
// Close modal
|
|
93
|
-
|
|
94
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('button.dialog__close')){
|
|
95
|
-
const dialog = event.target.closest('dialog[open]');
|
|
96
|
-
|
|
97
|
-
event.preventDefault();
|
|
98
|
-
dialog.close()
|
|
99
|
-
|
|
100
|
-
window.dataLayer = window.dataLayer || [];
|
|
101
|
-
window.dataLayer.push({
|
|
102
|
-
"event": "closeModal",
|
|
103
|
-
"id": dialog.getAttribute('id')
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('dialog[open]')){
|
|
108
|
-
const dialog = event.target.closest('dialog[open]');
|
|
109
|
-
const dialogDimensions = dialog.getBoundingClientRect()
|
|
110
|
-
if (event.clientX < dialogDimensions.left || event.clientX > dialogDimensions.right || event.clientY < dialogDimensions.top || event.clientY > dialogDimensions.bottom) {
|
|
111
|
-
dialog.close()
|
|
112
|
-
|
|
113
|
-
window.dataLayer = window.dataLayer || [];
|
|
114
|
-
window.dataLayer.push({
|
|
115
|
-
"event": "closeModal",
|
|
116
|
-
"id": dialog.getAttribute('id')
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Popover
|
|
122
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('.dialog__wrapper > button')){
|
|
123
|
-
|
|
124
|
-
// Close existing open popover
|
|
125
|
-
|
|
126
|
-
let btn = event.target.closest('.dialog__wrapper > button');
|
|
127
|
-
let parent = event.target.closest('.dialog__wrapper > button').parentNode;
|
|
128
|
-
let dataEvent = "openPopover"
|
|
129
|
-
let popover = parent.querySelector(':scope > dialog');
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
if(document.querySelector('dialog[open]') && document.querySelector('dialog[open]') != popover)
|
|
133
|
-
document.querySelector('dialog[open]').close();
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
if(popover.hasAttribute('open')){
|
|
137
|
-
|
|
138
|
-
popover.close();
|
|
139
|
-
dataEvent = "closePopover"
|
|
140
|
-
|
|
141
|
-
popover.removeAttribute('style');
|
|
142
|
-
btn.classList.remove('active');
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
|
|
146
|
-
popover.show();
|
|
147
|
-
btn.classList.add('active');
|
|
148
|
-
|
|
149
|
-
var position = btn.getBoundingClientRect();
|
|
150
|
-
let topOffset = position.top;
|
|
151
|
-
let leftOffset = position.left;
|
|
152
|
-
|
|
153
|
-
if(btn.closest('iam-table')){
|
|
154
|
-
|
|
155
|
-
let container = btn.closest('iam-table').parentNode.getBoundingClientRect();
|
|
156
|
-
|
|
157
|
-
topOffset -= container.top;
|
|
158
|
-
leftOffset -= container.left;
|
|
159
|
-
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if(popover.classList.contains('dialog--fix')){
|
|
163
|
-
popover.setAttribute('style',`position:fixed;top: ${topOffset}px; left: ${leftOffset}px; margin: 3rem 0 0 0;`)
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
window.dataLayer = window.dataLayer || [];
|
|
169
|
-
|
|
170
|
-
window.dataLayer.push({
|
|
171
|
-
"event": dataEvent,
|
|
172
|
-
"id": btn.textContent
|
|
173
|
-
});
|
|
174
|
-
};
|
|
175
|
-
});
|
|
176
|
-
|
|
177
63
|
return null
|
|
178
64
|
}
|
|
179
65
|
|
|
@@ -23,8 +23,8 @@ export const addDataAttributes = (table) => {
|
|
|
23
23
|
let headingText = tempDiv.textContent || tempDiv.innerText || "";
|
|
24
24
|
cell.setAttribute('data-label',headingText);
|
|
25
25
|
|
|
26
|
-
if(heading.hasAttribute('class'))
|
|
27
|
-
cell.setAttribute('class',heading.getAttribute('class'))
|
|
26
|
+
if(heading.hasAttribute('data-td-class'))
|
|
27
|
+
cell.setAttribute('class',heading.getAttribute('data-td-class'))
|
|
28
28
|
|
|
29
29
|
if(heading.hasAttribute('data-format')){
|
|
30
30
|
cell.setAttribute('data-format',heading.getAttribute('data-format'))
|
|
@@ -67,10 +67,21 @@ export const createMobileButton = (table) => {
|
|
|
67
67
|
if(table.closest('.table--fullwidth'))
|
|
68
68
|
return false;
|
|
69
69
|
|
|
70
|
+
if(table.querySelectorAll('thead tr th').length < 4)
|
|
71
|
+
return false;
|
|
72
|
+
|
|
70
73
|
Array.from(table.querySelectorAll('tbody tr')).forEach((row, index) => {
|
|
71
74
|
let firstCol = row.querySelector(':scope > :is(td,th):first-child');
|
|
75
|
+
|
|
72
76
|
let colContent = firstCol.textContent;
|
|
73
|
-
|
|
77
|
+
|
|
78
|
+
if(colContent != "")
|
|
79
|
+
firstCol.innerHTML =`<span class="td__content">${colContent}</span><button type="button" class="d-none">${colContent}</button>`;
|
|
80
|
+
else {
|
|
81
|
+
let secondCol = row.querySelector(':scope > :is(td,th):nth-child(2)');
|
|
82
|
+
let secondColContent = secondCol.textContent;
|
|
83
|
+
secondCol.innerHTML =`<span class="td__content">${secondColContent}</span><button type="button" class="d-none">${secondColContent}</button>`;
|
|
84
|
+
}
|
|
74
85
|
});
|
|
75
86
|
}
|
|
76
87
|
|
|
@@ -140,6 +151,7 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
|
|
|
140
151
|
else {
|
|
141
152
|
filterTable(table, form, wrapper);
|
|
142
153
|
createPaginationButttons(wrapper,pagination);
|
|
154
|
+
populateDataQueries(table,form);
|
|
143
155
|
}
|
|
144
156
|
}
|
|
145
157
|
|
|
@@ -172,6 +184,11 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
|
|
|
172
184
|
formSubmit();
|
|
173
185
|
}
|
|
174
186
|
|
|
187
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter]') && event.target.closest('form .dialog__wrapper > dialog')){
|
|
188
|
+
|
|
189
|
+
formSubmit();
|
|
190
|
+
}
|
|
191
|
+
|
|
175
192
|
if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter]') && !event.target.closest('form dialog')){
|
|
176
193
|
|
|
177
194
|
formSubmit();
|
|
@@ -223,6 +240,11 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
|
|
|
223
240
|
|
|
224
241
|
formSubmit();
|
|
225
242
|
});
|
|
243
|
+
|
|
244
|
+
form.addEventListener('force', (event) => {
|
|
245
|
+
|
|
246
|
+
formSubmit();
|
|
247
|
+
});
|
|
226
248
|
}
|
|
227
249
|
|
|
228
250
|
export const sortTable = (table, form, savedTableBody) => {
|
|
@@ -301,6 +323,15 @@ export const filterTable = (table, form, wrapper) => {
|
|
|
301
323
|
let page = form.querySelector('[data-pagination]') ? parseInt(form.querySelector('[data-pagination]').value) : 1;
|
|
302
324
|
let showRows = form.querySelector('[data-show]') ? parseInt(form.querySelector('[data-show]').value) : 15;
|
|
303
325
|
|
|
326
|
+
// Reset
|
|
327
|
+
Array.from(table.querySelectorAll('tbody tr')).forEach((row, index) => {
|
|
328
|
+
row.classList.remove('filtered');
|
|
329
|
+
row.classList.remove('filtered--matched');
|
|
330
|
+
row.classList.remove('filtered--show');
|
|
331
|
+
|
|
332
|
+
row.removeAttribute('data-filtered-by');
|
|
333
|
+
});
|
|
334
|
+
|
|
304
335
|
// Filter
|
|
305
336
|
let filterInputs = Array.from(form.querySelectorAll('[data-filter]'));
|
|
306
337
|
|
|
@@ -348,30 +379,16 @@ export const filterTable = (table, form, wrapper) => {
|
|
|
348
379
|
Array.from(form.querySelectorAll('[data-filter-count]')).forEach((element, index) => {
|
|
349
380
|
element.innerHTML = '';
|
|
350
381
|
});
|
|
382
|
+
|
|
351
383
|
if(filters.length) {
|
|
352
384
|
|
|
353
385
|
Array.from(form.querySelectorAll('[data-filter-count]')).forEach((element, index) => {
|
|
354
386
|
element.innerHTML += `(${filters.length})`;
|
|
355
387
|
});
|
|
356
388
|
}
|
|
357
|
-
|
|
358
|
-
// Stop function if no filters identified
|
|
359
|
-
if(!Object.keys(searches).length && !Object.keys(filters).length)
|
|
360
|
-
return false;
|
|
361
389
|
|
|
362
|
-
table.classList.add('table--filtered');
|
|
363
|
-
|
|
364
|
-
// Reset
|
|
365
|
-
Array.from(table.querySelectorAll('tbody tr')).forEach((row, index) => {
|
|
366
|
-
row.classList.remove('filtered');
|
|
367
|
-
row.classList.remove('filtered--matched');
|
|
368
|
-
row.classList.remove('filtered--show');
|
|
369
|
-
|
|
370
|
-
row.removeAttribute('data-filtered-by');
|
|
371
|
-
});
|
|
372
|
-
|
|
373
390
|
// Filter the table
|
|
374
|
-
|
|
391
|
+
table.classList.add('table--filtered');
|
|
375
392
|
for (const [key, filterValue] of Object.entries(filters)) {
|
|
376
393
|
|
|
377
394
|
Array.from(table.querySelectorAll('tbody tr:not(.filtered)')).forEach((row, index) => {
|
|
@@ -483,8 +500,10 @@ export const filterTable = (table, form, wrapper) => {
|
|
|
483
500
|
matched++;
|
|
484
501
|
|
|
485
502
|
row.classList.add('filtered--matched');
|
|
503
|
+
|
|
486
504
|
// pagination bit
|
|
487
|
-
|
|
505
|
+
let matchesPage = Math.ceil(matched/showRows);
|
|
506
|
+
if(matchesPage == parseInt(page))
|
|
488
507
|
row.classList.add('filtered--show');
|
|
489
508
|
});
|
|
490
509
|
|
|
@@ -495,7 +514,6 @@ export const filterTable = (table, form, wrapper) => {
|
|
|
495
514
|
wrapper.setAttribute('data-show',showRows);
|
|
496
515
|
}
|
|
497
516
|
|
|
498
|
-
populateDataQueries(table,form);
|
|
499
517
|
}
|
|
500
518
|
|
|
501
519
|
export const populateDataQueries = (table,form) => {
|
|
@@ -508,7 +526,7 @@ export const populateDataQueries = (table,form) => {
|
|
|
508
526
|
let numberOfMatchedRows: 0;
|
|
509
527
|
|
|
510
528
|
if(query == 'total'){
|
|
511
|
-
numberOfMatchedRows = table.classList.contains('table--filtered') ? table.querySelectorAll('tbody tr
|
|
529
|
+
numberOfMatchedRows = table.classList.contains('table--filtered') ? table.querySelectorAll('tbody tr').length : table.querySelectorAll('tbody tr').length;
|
|
512
530
|
}
|
|
513
531
|
else if(!query.includes(' == ') && query.includes(' & ')){
|
|
514
532
|
|
|
@@ -548,7 +566,7 @@ export const populateDataQueries = (table,form) => {
|
|
|
548
566
|
else {
|
|
549
567
|
|
|
550
568
|
let queryParts = query.split(' == ');
|
|
551
|
-
numberOfMatchedRows = Array.from(table.querySelectorAll(`tbody tr
|
|
569
|
+
numberOfMatchedRows = Array.from(table.querySelectorAll(`tbody tr.filtered--matched td[data-label="${queryParts[0]}"], tbody tr[data-filtered-by="${queryParts[0]}"] td[data-label="${queryParts[0]}"]`)).filter(function(element){
|
|
552
570
|
return element.textContent === queryParts[1];
|
|
553
571
|
}).length;
|
|
554
572
|
}
|
|
@@ -575,9 +593,12 @@ export const addPaginationEventListeners = function(table, form, pagination, wra
|
|
|
575
593
|
wrapper.setAttribute('data-page', newPage);
|
|
576
594
|
form.dispatchEvent(new Event("submit"));
|
|
577
595
|
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
596
|
+
if(table.hasAttribute('data-show-history')){
|
|
597
|
+
|
|
598
|
+
const url = new URL(location);
|
|
599
|
+
url.searchParams.set("page", newPage);
|
|
600
|
+
history.pushState({'type':'pagination','form':form.getAttribute('id'),'page':newPage}, "", url)
|
|
601
|
+
}
|
|
581
602
|
}
|
|
582
603
|
|
|
583
604
|
if (event && event.target instanceof HTMLElement && event.target.closest('[data-show]')){
|
|
@@ -46,15 +46,16 @@ export const setTabsEventHandlers = function(tabsElement: Element){
|
|
|
46
46
|
|
|
47
47
|
let details = tabsElement.querySelectorAll(':scope > details');
|
|
48
48
|
let summaries = tabsElement.querySelectorAll(':scope > details > summary');
|
|
49
|
-
let buttons = tabsElement.querySelectorAll(':scope
|
|
49
|
+
let buttons = tabsElement.querySelectorAll(':scope .tabs__links > .link');
|
|
50
50
|
|
|
51
51
|
if(tabsElement.shadowRoot)
|
|
52
|
-
buttons = tabsElement.shadowRoot.querySelectorAll('.tabs__links >
|
|
52
|
+
buttons = tabsElement.shadowRoot.querySelectorAll('.tabs__links > .link');
|
|
53
53
|
|
|
54
54
|
// Set the on click for the tab buttons, these will open the details box it matches too
|
|
55
55
|
buttons.forEach((button) => {
|
|
56
56
|
|
|
57
57
|
button.addEventListener("click", (e) => {
|
|
58
|
+
|
|
58
59
|
e.preventDefault();
|
|
59
60
|
buttons.forEach((buttonLoopItem) => {
|
|
60
61
|
|