@iamproperty/components 4.0.0 → 4.0.1

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 (90) hide show
  1. package/assets/css/components/actionbar-global.css +1 -1
  2. package/assets/css/components/actionbar-global.css.map +1 -1
  3. package/assets/css/components/actionbar.css +1 -1
  4. package/assets/css/components/actionbar.css.map +1 -1
  5. package/assets/css/components/admin-panel.css +1 -1
  6. package/assets/css/components/admin-panel.css.map +1 -1
  7. package/assets/css/components/card-global.css +1 -1
  8. package/assets/css/components/card-global.css.map +1 -1
  9. package/assets/css/components/card.css +1 -1
  10. package/assets/css/components/card.css.map +1 -1
  11. package/assets/css/components/charts.css.map +1 -1
  12. package/assets/css/components/collapsible-side.css.map +1 -1
  13. package/assets/css/components/dialog.css +1 -1
  14. package/assets/css/components/dialog.css.map +1 -1
  15. package/assets/css/components/fileupload.css.map +1 -1
  16. package/assets/css/components/forms.css +1 -1
  17. package/assets/css/components/forms.css.map +1 -1
  18. package/assets/css/components/header.css.map +1 -1
  19. package/assets/css/components/lists.css.map +1 -1
  20. package/assets/css/components/nav-global.css +1 -1
  21. package/assets/css/components/nav-global.css.map +1 -1
  22. package/assets/css/components/nav.css.map +1 -1
  23. package/assets/css/components/nav.old.css.map +1 -1
  24. package/assets/css/components/notification.css.map +1 -1
  25. package/assets/css/components/pagination.css.map +1 -1
  26. package/assets/css/components/property-searchbar.css.map +1 -1
  27. package/assets/css/components/table.css +1 -1
  28. package/assets/css/components/table.css.map +1 -1
  29. package/assets/css/core.min.css +1 -1
  30. package/assets/css/core.min.css.map +1 -1
  31. package/assets/css/style.min.css +1 -1
  32. package/assets/css/style.min.css.map +1 -1
  33. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  34. package/assets/js/components/actionbar/actionbar.component.js +45 -0
  35. package/assets/js/components/actionbar/actionbar.component.min.js +4 -4
  36. package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
  37. package/assets/js/components/applied-filters/applied-filters.component.min.js +3 -3
  38. package/assets/js/components/applied-filters/applied-filters.component.min.js.map +1 -1
  39. package/assets/js/components/card/card.component.js +9 -1
  40. package/assets/js/components/card/card.component.min.js +7 -5
  41. package/assets/js/components/card/card.component.min.js.map +1 -1
  42. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
  43. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  44. package/assets/js/components/header/header.component.min.js +1 -1
  45. package/assets/js/components/nav/nav.component.min.js +1 -1
  46. package/assets/js/components/notification/notification.component.min.js +1 -1
  47. package/assets/js/components/pagination/pagination.component.min.js +1 -1
  48. package/assets/js/components/table/table.component.js +3 -0
  49. package/assets/js/components/table/table.component.min.js +10 -10
  50. package/assets/js/components/table/table.component.min.js.map +1 -1
  51. package/assets/js/components/tabs/tabs.component.min.js +1 -1
  52. package/assets/js/dynamic.min.js +4 -4
  53. package/assets/js/dynamic.min.js.map +1 -1
  54. package/assets/js/modules/applied-filters.js +6 -7
  55. package/assets/js/modules/dialogs.js +32 -4
  56. package/assets/js/modules/table.js +68 -13
  57. package/assets/js/scripts.bundle.js +18 -16
  58. package/assets/js/scripts.bundle.js.map +1 -1
  59. package/assets/js/scripts.bundle.min.js +2 -2
  60. package/assets/js/scripts.bundle.min.js.map +1 -1
  61. package/assets/sass/_corefiles.scss +0 -1
  62. package/assets/sass/_func.scss +1 -0
  63. package/assets/sass/_functions/mixins.scss +22 -0
  64. package/assets/sass/components/actionbar-global.scss +69 -7
  65. package/assets/sass/components/actionbar.scss +20 -8
  66. package/assets/sass/components/admin-panel.scss +47 -2
  67. package/assets/sass/components/card-global.scss +53 -1
  68. package/assets/sass/components/card.scss +14 -12
  69. package/assets/sass/components/charts.scss +1 -1
  70. package/assets/sass/components/collapsible-side.scss +1 -1
  71. package/assets/sass/components/dialog.scss +62 -61
  72. package/assets/sass/components/fileupload.scss +1 -1
  73. package/assets/sass/components/forms.scss +112 -102
  74. package/assets/sass/components/nav-global.scss +15 -9
  75. package/assets/sass/components/nav.scss +9 -10
  76. package/assets/sass/components/notification.scss +1 -1
  77. package/assets/sass/components/table.scss +85 -4
  78. package/assets/sass/core.scss +1 -0
  79. package/assets/sass/error.scss +2 -1
  80. package/assets/sass/foundations/root.scss +3 -3
  81. package/assets/sass/main.scss +4 -3
  82. package/assets/ts/components/actionbar/actionbar.component.ts +67 -2
  83. package/assets/ts/components/card/card.component.ts +12 -2
  84. package/assets/ts/components/table/table.component.ts +4 -0
  85. package/assets/ts/modules/applied-filters.ts +8 -10
  86. package/assets/ts/modules/dialogs.ts +42 -5
  87. package/assets/ts/modules/table.ts +82 -13
  88. package/dist/components.es.js +914 -838
  89. package/dist/components.umd.js +47 -45
  90. package/package.json +1 -1
@@ -23,6 +23,18 @@ const extendDialogs = (body) => {
23
23
  // Open the modal!
24
24
  dialog.showModal();
25
25
  dialog.focus();
26
+ let firstWidth = dialog.offsetWidth;
27
+ dialog.setAttribute('style', `max-width: ${firstWidth}px;`);
28
+ // When the modal is opened we want to make sure any duplicate checkboxes are matching the originals
29
+ Array.from(dialog.querySelectorAll('[data-duplicate]')).forEach((element, index) => {
30
+ const id = element.getAttribute('data-duplicate');
31
+ const originalInput = document.getElementById(id);
32
+ if (element.checked != originalInput.checked) {
33
+ element.checked = originalInput.checked;
34
+ let changeEvent = new Event('change');
35
+ element.dispatchEvent(changeEvent);
36
+ }
37
+ });
26
38
  window.dataLayer = window.dataLayer || [];
27
39
  window.dataLayer.push({
28
40
  "event": "openModal",
@@ -180,6 +192,7 @@ export const createDialog = (dialog) => {
180
192
  export const createMultiFormDialog = (dialog) => {
181
193
  let buttons = "";
182
194
  let fieldsets = Array.from(dialog.querySelectorAll('fieldset[data-title]'));
195
+ let form = dialog.querySelector('form');
183
196
  fieldsets.forEach((fieldset, index) => {
184
197
  buttons += `<button data-title="${fieldset.getAttribute('data-title')}" type="button" class="${index == 0 ? "active" : ""}" tabindex="-1">${fieldset.getAttribute('data-title')}</button>`;
185
198
  const btnWrapper = document.createElement("div");
@@ -189,8 +202,16 @@ export const createMultiFormDialog = (dialog) => {
189
202
  btnWrapper.innerHTML += `<button data-title="${fieldsets[index - 1].getAttribute('data-title')}" class="btn btn-secondary mb-0" data-previous type="button">Previous</button>`;
190
203
  if (index != fieldsets.length - 1)
191
204
  btnWrapper.innerHTML += `<button data-title="${fieldsets[index + 1].getAttribute('data-title')}" class="btn btn-primary mb-0" data-next type="button">Next</button>`;
192
- if (index == fieldsets.length - 1)
193
- btnWrapper.innerHTML += `<button data-title="${fieldsets[index].getAttribute('data-title')}" class="btn btn-primary mb-0" data-next type="submit">Submit</button>`;
205
+ // Last fieldset
206
+ if (index == fieldsets.length - 1) {
207
+ if (form && form.querySelector(':scope > button[type="submit"]')) {
208
+ let existingButton = form.querySelector(':scope > button[type="submit"]');
209
+ existingButton.classList.add('mb-0');
210
+ btnWrapper.insertAdjacentElement('beforeend', existingButton);
211
+ }
212
+ else
213
+ btnWrapper.innerHTML += `<button data-title="${fieldsets[index].getAttribute('data-title')}" class="btn btn-primary mb-0" data-next type="submit">Submit</button>`;
214
+ }
194
215
  });
195
216
  dialog.insertAdjacentHTML('afterbegin', `<div class="steps bg-primary">${buttons}</div>`);
196
217
  // Open the fieldset with an error inside
@@ -258,7 +279,7 @@ export const createMultiFormDialog = (dialog) => {
258
279
  dialog.addEventListener('keydown', (event) => {
259
280
  if (event && event.target instanceof HTMLElement && event.target.closest('button')) {
260
281
  const button = event.target.closest('button');
261
- if (event.keyCode == 13) {
282
+ if (event.keyCode == 13 && button.getAttribute('type') != "submit") {
262
283
  event.preventDefault();
263
284
  validateFieldset(button);
264
285
  }
@@ -266,10 +287,17 @@ export const createMultiFormDialog = (dialog) => {
266
287
  if (event && event.target instanceof HTMLElement && event.target.closest('input')) {
267
288
  const input = event.target.closest('input');
268
289
  input.classList.remove('is-invalid');
290
+ if (event.keyCode == 13) {
291
+ event.preventDefault();
292
+ }
269
293
  }
270
294
  });
271
295
  dialog.addEventListener('click', (event) => {
272
- if (event && event.target instanceof HTMLElement && event.target.closest('button[data-title]')) {
296
+ if (event && event.target instanceof HTMLElement && event.target.closest('button[type="submit"]')) {
297
+ const form = event.target.closest('form');
298
+ form.classList.add('was-validated');
299
+ }
300
+ else if (event && event.target instanceof HTMLElement && event.target.closest('button[data-title]')) {
273
301
  const button = event.target.closest('button[data-title]');
274
302
  validateFieldset(button);
275
303
  }
@@ -108,7 +108,28 @@ export const createSearchDataList = (table, form) => {
108
108
  export const addFilterEventListeners = (table, form, pagination, wrapper, savedTableBody) => {
109
109
  var timer;
110
110
  // Check what conditions are set on the table to see what the form actions are
111
- let formSubmit = function (paginate = false) {
111
+ let formSubmit = function (event, paginate = false) {
112
+ if (form.classList.contains('processing'))
113
+ return false;
114
+ // Before submitting check if any duplicate checkboxes within the filters dialog needs to upset the original input
115
+ if (event.type == "submit") {
116
+ form.classList.add('processing');
117
+ Array.from(form.querySelectorAll('[data-duplicate]')).forEach((element, index) => {
118
+ const id = element.getAttribute('data-duplicate');
119
+ const input = document.getElementById(id);
120
+ const card = document.querySelector(`[for="${id}"] iam-card`);
121
+ if (input.checked != element.checked) {
122
+ if (card) {
123
+ let clickEvent = new Event('click');
124
+ card.dispatchEvent(clickEvent);
125
+ }
126
+ else {
127
+ input.checked = element.checked;
128
+ }
129
+ }
130
+ });
131
+ form.classList.remove('processing');
132
+ }
112
133
  if (form.hasAttribute('data-ajax')) {
113
134
  // Default back to page 1
114
135
  if (!paginate) {
@@ -138,7 +159,7 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
138
159
  clearTimeout(timer);
139
160
  if (event && event.target instanceof HTMLElement && event.target.closest('[data-search]')) {
140
161
  timer = setTimeout(function () {
141
- formSubmit();
162
+ formSubmit(event);
142
163
  }, 500);
143
164
  }
144
165
  ;
@@ -148,10 +169,10 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
148
169
  if (event && event.target instanceof HTMLElement && event.target.closest('[data-sort]')) {
149
170
  if (!form.hasAttribute('data-submit'))
150
171
  sortTable(table, form, savedTableBody);
151
- formSubmit();
172
+ formSubmit(event);
152
173
  }
153
174
  if (event && event.target instanceof HTMLElement && event.target.closest('[data-search]')) {
154
- formSubmit();
175
+ formSubmit(event);
155
176
  }
156
177
  if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter][data-no-ajax]')) { // Allow for input fields to filter the current results without a new ajax call
157
178
  filterTable(table, form, wrapper);
@@ -159,16 +180,16 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
159
180
  populateDataQueries(table, form);
160
181
  }
161
182
  else if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter]') && event.target.closest('form .dialog__wrapper > dialog')) {
162
- formSubmit();
183
+ formSubmit(event);
163
184
  }
164
185
  else if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter]') && !event.target.closest('form dialog')) {
165
- formSubmit();
186
+ formSubmit(event);
166
187
  }
167
188
  if (event && event.target instanceof HTMLElement && event.target.closest('[data-show]')) {
168
- formSubmit();
189
+ formSubmit(event);
169
190
  }
170
191
  if (event && event.target instanceof HTMLElement && event.target.closest('[data-mimic]')) {
171
- formSubmit();
192
+ formSubmit(event);
172
193
  }
173
194
  });
174
195
  form.addEventListener('click', (event) => {
@@ -184,23 +205,57 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
184
205
  event.stopPropagation();
185
206
  }
186
207
  if (event && event.target instanceof HTMLElement && event.target.closest('[data-clear]')) {
187
- form.reset();
208
+ form.classList.add('processing');
209
+ // Make sure any applied filters have been removed
210
+ Array.from(form.querySelectorAll('.applied-filters')).forEach((filters, index) => {
211
+ filters.innerHTML = "";
212
+ });
213
+ // Make sure cards are unlicked
214
+ let frm_elements = form.elements;
215
+ for (let i = 0; i < frm_elements.length; i++) {
216
+ let field_type = frm_elements[i].type.toLowerCase() ? frm_elements[i].type.toLowerCase() : "text";
217
+ switch (field_type) {
218
+ case "text":
219
+ case "password":
220
+ case "textarea":
221
+ frm_elements[i].value = "";
222
+ break;
223
+ case "radio":
224
+ case "checkbox":
225
+ if (frm_elements[i].checked) {
226
+ frm_elements[i].checked = false;
227
+ }
228
+ break;
229
+ case "select-one":
230
+ case "select-multi":
231
+ frm_elements[i].selectedIndex = -1;
232
+ break;
233
+ case "hidden":
234
+ default:
235
+ break;
236
+ }
237
+ }
238
+ Array.from(form.querySelectorAll('label iam-card')).forEach((card, index) => {
239
+ let clickEvent = new Event('click');
240
+ card.dispatchEvent(clickEvent);
241
+ });
242
+ form.classList.remove('processing');
188
243
  if (!form.hasAttribute('data-submit'))
189
244
  sortTable(table, form, savedTableBody);
190
- formSubmit();
245
+ formSubmit(event);
191
246
  }
192
247
  });
193
248
  form.addEventListener('submit', (event) => {
194
249
  clearTimeout(timer);
195
250
  if (!form.hasAttribute('data-submit'))
196
251
  event.preventDefault();
197
- formSubmit();
252
+ formSubmit(event);
198
253
  });
199
254
  form.addEventListener('force', (event) => {
200
- formSubmit();
255
+ formSubmit(event);
201
256
  });
202
257
  form.addEventListener('paginate', (event) => {
203
- formSubmit(true);
258
+ formSubmit(event, true);
204
259
  });
205
260
  // Mmimic fields
206
261
  let forms = [];