@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,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) => {
@@ -1,4 +1,10 @@
1
1
  declare module '*.html' {
2
2
  const value: string;
3
3
  export default value
4
- }
4
+ }
5
+
6
+ type WindowWithDataLayer = Window & {
7
+ dataLayer: Record<string, any>[];
8
+ };
9
+
10
+ declare const window: WindowWithDataLayer;
@@ -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
- inputs[i].value = "";
134
+ input.value = "";
135
+ else {
136
+ input.checked = false;
133
137
 
134
- inputs[i].checked = false;
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
- firstCol.innerHTML =`<span class="td__content">${colContent}</span><button type="button" class="d-none">${colContent}</button>`;
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
- if(Math.ceil(matched/showRows) == parseInt(page))
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:not(.filtered)').length : table.querySelectorAll('tbody tr').length;
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:not([class*="filtered"]) td[data-label="${queryParts[0]}"], tbody tr[data-filtered-by="${queryParts[0]}"] td[data-label="${queryParts[0]}"]`)).filter(function(element){
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
- const url = new URL(location);
579
- url.searchParams.set("page", newPage);
580
- history.pushState({'type':'pagination','form':form.getAttribute('id'),'page':newPage}, "", url)
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 > .tabs__links > button, .tabs__links > a');
49
+ let buttons = tabsElement.querySelectorAll(':scope .tabs__links > .link');
50
50
 
51
51
  if(tabsElement.shadowRoot)
52
- buttons = tabsElement.shadowRoot.querySelectorAll('.tabs__links > button, .tabs__links > a');
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