@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.
Files changed (113) hide show
  1. package/assets/css/components/accordion.css.map +1 -1
  2. package/assets/css/components/admin-panel.css +1 -1
  3. package/assets/css/components/admin-panel.css.map +1 -1
  4. package/assets/css/components/applied-filters.css +1 -1
  5. package/assets/css/components/applied-filters.css.map +1 -1
  6. package/assets/css/components/card.css +1 -1
  7. package/assets/css/components/card.css.map +1 -1
  8. package/assets/css/components/charts.css +1 -1
  9. package/assets/css/components/charts.css.map +1 -1
  10. package/assets/css/components/dialog.css +1 -1
  11. package/assets/css/components/dialog.css.map +1 -1
  12. package/assets/css/components/forms.css +1 -1
  13. package/assets/css/components/forms.css.map +1 -1
  14. package/assets/css/components/header.css +1 -1
  15. package/assets/css/components/header.css.map +1 -1
  16. package/assets/css/components/lists.css +1 -1
  17. package/assets/css/components/lists.css.map +1 -1
  18. package/assets/css/components/nav.css +1 -1
  19. package/assets/css/components/nav.css.map +1 -1
  20. package/assets/css/components/pagination.css +1 -1
  21. package/assets/css/components/pagination.css.map +1 -1
  22. package/assets/css/components/property-searchbar.css +1 -1
  23. package/assets/css/components/property-searchbar.css.map +1 -1
  24. package/assets/css/components/table.css +1 -1
  25. package/assets/css/components/table.css.map +1 -1
  26. package/assets/css/components/tabs.css +1 -1
  27. package/assets/css/components/tabs.css.map +1 -1
  28. package/assets/css/components/tooltips.css +1 -1
  29. package/assets/css/components/tooltips.css.map +1 -1
  30. package/assets/css/core.min.css +1 -1
  31. package/assets/css/core.min.css.map +1 -1
  32. package/assets/css/style.min.css +1 -1
  33. package/assets/css/style.min.css.map +1 -1
  34. package/assets/js/bundle.js +2 -0
  35. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  36. package/assets/js/components/card/card.component.js +2 -2
  37. package/assets/js/components/card/card.component.min.js +5 -5
  38. package/assets/js/components/card/card.component.min.js.map +1 -1
  39. package/assets/js/components/filterlist/filterlist.component.js +13 -9
  40. package/assets/js/components/filterlist/filterlist.component.min.js +14 -5
  41. package/assets/js/components/filterlist/filterlist.component.min.js.map +1 -1
  42. package/assets/js/components/header/header.component.min.js +5 -5
  43. package/assets/js/components/table/table.component.js +23 -9
  44. package/assets/js/components/table/table.component.min.js +21 -11
  45. package/assets/js/components/table/table.component.min.js.map +1 -1
  46. package/assets/js/components/tabs/tabs.component.js +6 -2
  47. package/assets/js/components/tabs/tabs.component.min.js +7 -5
  48. package/assets/js/components/tabs/tabs.component.min.js.map +1 -1
  49. package/assets/js/dynamic.js +3 -1
  50. package/assets/js/dynamic.min.js +2 -2
  51. package/assets/js/dynamic.min.js.map +1 -1
  52. package/assets/js/flat-components.js +2 -0
  53. package/assets/js/modules/applied-filters.js +6 -2
  54. package/assets/js/modules/dialogs.js +173 -0
  55. package/assets/js/modules/helpers.js +1 -84
  56. package/assets/js/modules/table.js +35 -21
  57. package/assets/js/modules/tabs.js +2 -2
  58. package/assets/js/scripts.bundle.js +53 -31
  59. package/assets/js/scripts.bundle.js.map +1 -1
  60. package/assets/js/scripts.bundle.min.js +2 -2
  61. package/assets/js/scripts.bundle.min.js.map +1 -1
  62. package/assets/js/tests/table.spec.js +16 -2
  63. package/assets/sass/_corefiles.scss +3 -0
  64. package/assets/sass/_functions/functions.scss +2 -3
  65. package/assets/sass/_functions/mixins.scss +2 -18
  66. package/assets/sass/_functions/utilities.scss +35 -3
  67. package/assets/sass/_functions/variables.scss +70 -82
  68. package/assets/sass/_tests/colours.spec.scss +8 -8
  69. package/assets/sass/_tests/func.spec.scss +1 -1
  70. package/assets/sass/components/admin-panel.scss +95 -37
  71. package/assets/sass/components/applied-filters.scss +4 -0
  72. package/assets/sass/components/card.scss +39 -28
  73. package/assets/sass/components/charts.scss +2 -2
  74. package/assets/sass/components/dialog.scss +342 -30
  75. package/assets/sass/components/forms.scss +2 -2
  76. package/assets/sass/components/lists.scss +16 -33
  77. package/assets/sass/components/pagination.scss +4 -0
  78. package/assets/sass/components/table.scss +160 -39
  79. package/assets/sass/components/tabs.scss +54 -98
  80. package/assets/sass/components/tooltips.scss +1 -1
  81. package/assets/sass/foundations/buttons.scss +69 -58
  82. package/assets/sass/foundations/icons.scss +14 -69
  83. package/assets/sass/foundations/reboot.scss +17 -8
  84. package/assets/sass/foundations/root.scss +51 -48
  85. package/assets/sass/foundations/type.scss +4 -0
  86. package/assets/sass/helpers/max-height.scss +18 -0
  87. package/assets/ts/bundle.ts +2 -0
  88. package/assets/ts/components/card/README.md +2 -1
  89. package/assets/ts/components/card/card.component.ts +2 -2
  90. package/assets/ts/components/filterlist/filterlist.component.ts +13 -11
  91. package/assets/ts/components/table/table.component.ts +24 -10
  92. package/assets/ts/components/tabs/tabs.component.ts +7 -2
  93. package/assets/ts/dynamic.ts +3 -1
  94. package/assets/ts/flat-components.ts +2 -0
  95. package/assets/ts/html.d.ts +7 -1
  96. package/assets/ts/modules/applied-filters.ts +9 -3
  97. package/assets/ts/modules/dialogs.ts +237 -0
  98. package/assets/ts/modules/helpers.ts +1 -115
  99. package/assets/ts/modules/table.ts +47 -26
  100. package/assets/ts/modules/tabs.ts +3 -2
  101. package/assets/ts/tests/table.spec.ts +16 -4
  102. package/dist/components.es.js +1027 -1017
  103. package/dist/components.umd.js +50 -24
  104. package/dist/style.css +1 -1
  105. package/package.json +2 -3
  106. package/src/components/Card/Card.vue +2 -2
  107. package/src/components/Card/README.md +1 -1
  108. package/src/components/Nav/Nav.vue +1 -3
  109. package/src/index.js +0 -1
  110. package/assets/svg/icons.svg +0 -599
  111. package/src/foundations/Icon/Icon.spec.js +0 -24
  112. package/src/foundations/Icon/Icon.vue +0 -24
  113. 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
- firstCol.innerHTML = `<span class="td__content">${colContent}</span><button type="button" class="d-none">${colContent}</button>`;
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
- if (Math.ceil(matched / showRows) == parseInt(page))
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:not(.filtered)').length : table.querySelectorAll('tbody tr').length;
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:not([class*="filtered"]) td[data-label="${queryParts[0]}"], tbody tr[data-filtered-by="${queryParts[0]}"] td[data-label="${queryParts[0]}"]`)).filter(function (element) {
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
- const url = new URL(location);
409
- url.searchParams.set("page", newPage);
410
- history.pushState({ 'type': 'pagination', 'form': form.getAttribute('id'), 'page': newPage }, "", url);
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 > .tabs__links > button, .tabs__links > a');
35
+ let buttons = tabsElement.querySelectorAll(':scope .tabs__links > .link');
36
36
  if (tabsElement.shadowRoot)
37
- buttons = tabsElement.shadowRoot.querySelectorAll('.tabs__links > button, .tabs__links > a');
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) => {