@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
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
-
import { createEmbed } from "./youtubevideo.js";
|
|
3
2
|
/**
|
|
4
3
|
* Global helper functions to help maintain and enhance framework elements.
|
|
5
4
|
* @module Helpers
|
|
@@ -35,7 +34,7 @@ export const addGlobalEvents = (body) => {
|
|
|
35
34
|
checkElements(location.hash);
|
|
36
35
|
window.addEventListener('hashchange', function () { checkElements(location.hash); }, false);
|
|
37
36
|
addEventListener("popstate", (event) => {
|
|
38
|
-
if (event.state.type == "pagination") {
|
|
37
|
+
if (event && event.state.type && event.state.type == "pagination") {
|
|
39
38
|
let form = document.querySelector(`#${event.state.form}`);
|
|
40
39
|
let pageInput = document.querySelector(`#${event.state.form} [data-pagination]`);
|
|
41
40
|
if (pageInput)
|
|
@@ -45,88 +44,6 @@ export const addGlobalEvents = (body) => {
|
|
|
45
44
|
form.dispatchEvent(new Event("submit"));
|
|
46
45
|
}
|
|
47
46
|
});
|
|
48
|
-
// Dialogs/modals
|
|
49
|
-
document.addEventListener('click', (event) => {
|
|
50
|
-
// Modal
|
|
51
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('[data-modal]')) {
|
|
52
|
-
const button = event.target.closest('[data-modal]');
|
|
53
|
-
const modalID = button.hasAttribute('data-modal') ? button.getAttribute('data-modal') : button.getAttribute('data-filter');
|
|
54
|
-
const dialog = document.querySelector(`dialog#${modalID}`);
|
|
55
|
-
// Create close button is needed
|
|
56
|
-
dialog.innerHTML = `<button class="dialog__close">Close</button>${dialog.innerHTML}`;
|
|
57
|
-
let videoButton = dialog.querySelector('.youtube-embed a');
|
|
58
|
-
if (videoButton) {
|
|
59
|
-
createEmbed(videoButton);
|
|
60
|
-
}
|
|
61
|
-
dialog.showModal();
|
|
62
|
-
window.dataLayer = window.dataLayer || [];
|
|
63
|
-
window.dataLayer.push({
|
|
64
|
-
"event": "openModal",
|
|
65
|
-
"id": modalID
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
;
|
|
69
|
-
// Close modal
|
|
70
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('button.dialog__close')) {
|
|
71
|
-
const dialog = event.target.closest('dialog[open]');
|
|
72
|
-
event.preventDefault();
|
|
73
|
-
dialog.close();
|
|
74
|
-
window.dataLayer = window.dataLayer || [];
|
|
75
|
-
window.dataLayer.push({
|
|
76
|
-
"event": "closeModal",
|
|
77
|
-
"id": dialog.getAttribute('id')
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('dialog[open]')) {
|
|
81
|
-
const dialog = event.target.closest('dialog[open]');
|
|
82
|
-
const dialogDimensions = dialog.getBoundingClientRect();
|
|
83
|
-
if (event.clientX < dialogDimensions.left || event.clientX > dialogDimensions.right || event.clientY < dialogDimensions.top || event.clientY > dialogDimensions.bottom) {
|
|
84
|
-
dialog.close();
|
|
85
|
-
window.dataLayer = window.dataLayer || [];
|
|
86
|
-
window.dataLayer.push({
|
|
87
|
-
"event": "closeModal",
|
|
88
|
-
"id": dialog.getAttribute('id')
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
// Popover
|
|
93
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('.dialog__wrapper > button')) {
|
|
94
|
-
// Close existing open popover
|
|
95
|
-
let btn = event.target.closest('.dialog__wrapper > button');
|
|
96
|
-
let parent = event.target.closest('.dialog__wrapper > button').parentNode;
|
|
97
|
-
let dataEvent = "openPopover";
|
|
98
|
-
let popover = parent.querySelector(':scope > dialog');
|
|
99
|
-
if (document.querySelector('dialog[open]') && document.querySelector('dialog[open]') != popover)
|
|
100
|
-
document.querySelector('dialog[open]').close();
|
|
101
|
-
if (popover.hasAttribute('open')) {
|
|
102
|
-
popover.close();
|
|
103
|
-
dataEvent = "closePopover";
|
|
104
|
-
popover.removeAttribute('style');
|
|
105
|
-
btn.classList.remove('active');
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
popover.show();
|
|
109
|
-
btn.classList.add('active');
|
|
110
|
-
var position = btn.getBoundingClientRect();
|
|
111
|
-
let topOffset = position.top;
|
|
112
|
-
let leftOffset = position.left;
|
|
113
|
-
if (btn.closest('iam-table')) {
|
|
114
|
-
let container = btn.closest('iam-table').parentNode.getBoundingClientRect();
|
|
115
|
-
topOffset -= container.top;
|
|
116
|
-
leftOffset -= container.left;
|
|
117
|
-
}
|
|
118
|
-
if (popover.classList.contains('dialog--fix')) {
|
|
119
|
-
popover.setAttribute('style', `position:fixed;top: ${topOffset}px; left: ${leftOffset}px; margin: 3rem 0 0 0;`);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
window.dataLayer = window.dataLayer || [];
|
|
123
|
-
window.dataLayer.push({
|
|
124
|
-
"event": dataEvent,
|
|
125
|
-
"id": btn.textContent
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
;
|
|
129
|
-
});
|
|
130
47
|
return null;
|
|
131
48
|
};
|
|
132
49
|
export const isNumeric = function (str) {
|
|
@@ -15,8 +15,8 @@ export const addDataAttributes = (table) => {
|
|
|
15
15
|
tempDiv.innerHTML = heading.innerHTML;
|
|
16
16
|
let headingText = tempDiv.textContent || tempDiv.innerText || "";
|
|
17
17
|
cell.setAttribute('data-label', headingText);
|
|
18
|
-
if (heading.hasAttribute('class'))
|
|
19
|
-
cell.setAttribute('class', heading.getAttribute('class'));
|
|
18
|
+
if (heading.hasAttribute('data-td-class'))
|
|
19
|
+
cell.setAttribute('class', heading.getAttribute('data-td-class'));
|
|
20
20
|
if (heading.hasAttribute('data-format')) {
|
|
21
21
|
cell.setAttribute('data-format', heading.getAttribute('data-format'));
|
|
22
22
|
cell.innerHTML = formatCell('date', cell.textContent.trim()); //Make sure date format is consistent
|
|
@@ -46,10 +46,18 @@ export const getLargestLastColWidth = (table) => {
|
|
|
46
46
|
export const createMobileButton = (table) => {
|
|
47
47
|
if (table.closest('.table--fullwidth'))
|
|
48
48
|
return false;
|
|
49
|
+
if (table.querySelectorAll('thead tr th').length < 4)
|
|
50
|
+
return false;
|
|
49
51
|
Array.from(table.querySelectorAll('tbody tr')).forEach((row, index) => {
|
|
50
52
|
let firstCol = row.querySelector(':scope > :is(td,th):first-child');
|
|
51
53
|
let colContent = firstCol.textContent;
|
|
52
|
-
|
|
54
|
+
if (colContent != "")
|
|
55
|
+
firstCol.innerHTML = `<span class="td__content">${colContent}</span><button type="button" class="d-none">${colContent}</button>`;
|
|
56
|
+
else {
|
|
57
|
+
let secondCol = row.querySelector(':scope > :is(td,th):nth-child(2)');
|
|
58
|
+
let secondColContent = secondCol.textContent;
|
|
59
|
+
secondCol.innerHTML = `<span class="td__content">${secondColContent}</span><button type="button" class="d-none">${secondColContent}</button>`;
|
|
60
|
+
}
|
|
53
61
|
});
|
|
54
62
|
};
|
|
55
63
|
export const addTableEventListeners = (table) => {
|
|
@@ -100,6 +108,7 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
|
|
|
100
108
|
else {
|
|
101
109
|
filterTable(table, form, wrapper);
|
|
102
110
|
createPaginationButttons(wrapper, pagination);
|
|
111
|
+
populateDataQueries(table, form);
|
|
103
112
|
}
|
|
104
113
|
};
|
|
105
114
|
form.addEventListener('keyup', (event) => {
|
|
@@ -121,6 +130,9 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
|
|
|
121
130
|
if (event && event.target instanceof HTMLElement && event.target.closest('[data-search]')) {
|
|
122
131
|
formSubmit();
|
|
123
132
|
}
|
|
133
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter]') && event.target.closest('form .dialog__wrapper > dialog')) {
|
|
134
|
+
formSubmit();
|
|
135
|
+
}
|
|
124
136
|
if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter]') && !event.target.closest('form dialog')) {
|
|
125
137
|
formSubmit();
|
|
126
138
|
}
|
|
@@ -153,6 +165,9 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
|
|
|
153
165
|
event.preventDefault();
|
|
154
166
|
formSubmit();
|
|
155
167
|
});
|
|
168
|
+
form.addEventListener('force', (event) => {
|
|
169
|
+
formSubmit();
|
|
170
|
+
});
|
|
156
171
|
};
|
|
157
172
|
export const sortTable = (table, form, savedTableBody) => {
|
|
158
173
|
if (form.getAttribute('data-ajax')) {
|
|
@@ -211,6 +226,13 @@ export const filterTable = (table, form, wrapper) => {
|
|
|
211
226
|
let matched = 0;
|
|
212
227
|
let page = form.querySelector('[data-pagination]') ? parseInt(form.querySelector('[data-pagination]').value) : 1;
|
|
213
228
|
let showRows = form.querySelector('[data-show]') ? parseInt(form.querySelector('[data-show]').value) : 15;
|
|
229
|
+
// Reset
|
|
230
|
+
Array.from(table.querySelectorAll('tbody tr')).forEach((row, index) => {
|
|
231
|
+
row.classList.remove('filtered');
|
|
232
|
+
row.classList.remove('filtered--matched');
|
|
233
|
+
row.classList.remove('filtered--show');
|
|
234
|
+
row.removeAttribute('data-filtered-by');
|
|
235
|
+
});
|
|
214
236
|
// Filter
|
|
215
237
|
let filterInputs = Array.from(form.querySelectorAll('[data-filter]'));
|
|
216
238
|
filterInputs.forEach((filterInput, index) => {
|
|
@@ -249,18 +271,8 @@ export const filterTable = (table, form, wrapper) => {
|
|
|
249
271
|
element.innerHTML += `(${filters.length})`;
|
|
250
272
|
});
|
|
251
273
|
}
|
|
252
|
-
// Stop function if no filters identified
|
|
253
|
-
if (!Object.keys(searches).length && !Object.keys(filters).length)
|
|
254
|
-
return false;
|
|
255
|
-
table.classList.add('table--filtered');
|
|
256
|
-
// Reset
|
|
257
|
-
Array.from(table.querySelectorAll('tbody tr')).forEach((row, index) => {
|
|
258
|
-
row.classList.remove('filtered');
|
|
259
|
-
row.classList.remove('filtered--matched');
|
|
260
|
-
row.classList.remove('filtered--show');
|
|
261
|
-
row.removeAttribute('data-filtered-by');
|
|
262
|
-
});
|
|
263
274
|
// Filter the table
|
|
275
|
+
table.classList.add('table--filtered');
|
|
264
276
|
for (const [key, filterValue] of Object.entries(filters)) {
|
|
265
277
|
Array.from(table.querySelectorAll('tbody tr:not(.filtered)')).forEach((row, index) => {
|
|
266
278
|
let isMatched = false;
|
|
@@ -341,7 +353,8 @@ export const filterTable = (table, form, wrapper) => {
|
|
|
341
353
|
matched++;
|
|
342
354
|
row.classList.add('filtered--matched');
|
|
343
355
|
// pagination bit
|
|
344
|
-
|
|
356
|
+
let matchesPage = Math.ceil(matched / showRows);
|
|
357
|
+
if (matchesPage == parseInt(page))
|
|
345
358
|
row.classList.add('filtered--show');
|
|
346
359
|
});
|
|
347
360
|
if (wrapper) {
|
|
@@ -350,7 +363,6 @@ export const filterTable = (table, form, wrapper) => {
|
|
|
350
363
|
wrapper.setAttribute('data-total', matched);
|
|
351
364
|
wrapper.setAttribute('data-show', showRows);
|
|
352
365
|
}
|
|
353
|
-
populateDataQueries(table, form);
|
|
354
366
|
};
|
|
355
367
|
export const populateDataQueries = (table, form) => {
|
|
356
368
|
const dataQueries = Array.from(form.querySelectorAll('[data-query]'));
|
|
@@ -358,7 +370,7 @@ export const populateDataQueries = (table, form) => {
|
|
|
358
370
|
let query = queryElement.getAttribute('data-query');
|
|
359
371
|
let numberOfMatchedRows;
|
|
360
372
|
if (query == 'total') {
|
|
361
|
-
numberOfMatchedRows = table.classList.contains('table--filtered') ? table.querySelectorAll('tbody tr
|
|
373
|
+
numberOfMatchedRows = table.classList.contains('table--filtered') ? table.querySelectorAll('tbody tr').length : table.querySelectorAll('tbody tr').length;
|
|
362
374
|
}
|
|
363
375
|
else if (!query.includes(' == ') && query.includes(' & ')) {
|
|
364
376
|
let queries = query.split(' & ');
|
|
@@ -385,7 +397,7 @@ export const populateDataQueries = (table, form) => {
|
|
|
385
397
|
}
|
|
386
398
|
else {
|
|
387
399
|
let queryParts = query.split(' == ');
|
|
388
|
-
numberOfMatchedRows = Array.from(table.querySelectorAll(`tbody tr
|
|
400
|
+
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) {
|
|
389
401
|
return element.textContent === queryParts[1];
|
|
390
402
|
}).length;
|
|
391
403
|
}
|
|
@@ -405,9 +417,11 @@ export const addPaginationEventListeners = function (table, form, pagination, wr
|
|
|
405
417
|
paginationInput.value = newPage;
|
|
406
418
|
wrapper.setAttribute('data-page', newPage);
|
|
407
419
|
form.dispatchEvent(new Event("submit"));
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
420
|
+
if (table.hasAttribute('data-show-history')) {
|
|
421
|
+
const url = new URL(location);
|
|
422
|
+
url.searchParams.set("page", newPage);
|
|
423
|
+
history.pushState({ 'type': 'pagination', 'form': form.getAttribute('id'), 'page': newPage }, "", url);
|
|
424
|
+
}
|
|
411
425
|
}
|
|
412
426
|
if (event && event.target instanceof HTMLElement && event.target.closest('[data-show]')) {
|
|
413
427
|
event.preventDefault();
|
|
@@ -32,9 +32,9 @@ export const createTabsLinks = function (tabsElement) {
|
|
|
32
32
|
export const setTabsEventHandlers = function (tabsElement) {
|
|
33
33
|
let details = tabsElement.querySelectorAll(':scope > details');
|
|
34
34
|
let summaries = tabsElement.querySelectorAll(':scope > details > summary');
|
|
35
|
-
let buttons = tabsElement.querySelectorAll(':scope
|
|
35
|
+
let buttons = tabsElement.querySelectorAll(':scope .tabs__links > .link');
|
|
36
36
|
if (tabsElement.shadowRoot)
|
|
37
|
-
buttons = tabsElement.shadowRoot.querySelectorAll('.tabs__links >
|
|
37
|
+
buttons = tabsElement.shadowRoot.querySelectorAll('.tabs__links > .link');
|
|
38
38
|
// Set the on click for the tab buttons, these will open the details box it matches too
|
|
39
39
|
buttons.forEach((button) => {
|
|
40
40
|
button.addEventListener("click", (e) => {
|