@iamproperty/components 3.9.0-beta-1 → 4.1.0-beta

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 (98) 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 +1 -0
  13. package/assets/css/components/collapsible-side.css.map +1 -0
  14. package/assets/css/components/dialog.css +1 -1
  15. package/assets/css/components/dialog.css.map +1 -1
  16. package/assets/css/components/fileupload.css.map +1 -1
  17. package/assets/css/components/header.css.map +1 -1
  18. package/assets/css/components/lists.css.map +1 -1
  19. package/assets/css/components/nav-global.css +1 -1
  20. package/assets/css/components/nav-global.css.map +1 -1
  21. package/assets/css/components/nav.css.map +1 -1
  22. package/assets/css/components/nav.old.css.map +1 -1
  23. package/assets/css/components/notification.css.map +1 -1
  24. package/assets/css/components/pagination.css.map +1 -1
  25. package/assets/css/components/property-searchbar.css.map +1 -1
  26. package/assets/css/components/table.css +1 -1
  27. package/assets/css/components/table.css.map +1 -1
  28. package/assets/css/core.min.css +1 -1
  29. package/assets/css/core.min.css.map +1 -1
  30. package/assets/css/style.min.css +1 -1
  31. package/assets/css/style.min.css.map +1 -1
  32. package/assets/js/components/accordion/accordion.component.min.js +2 -2
  33. package/assets/js/components/actionbar/actionbar.component.js +45 -0
  34. package/assets/js/components/actionbar/actionbar.component.min.js +4 -4
  35. package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
  36. package/assets/js/components/applied-filters/applied-filters.component.min.js +3 -3
  37. package/assets/js/components/applied-filters/applied-filters.component.min.js.map +1 -1
  38. package/assets/js/components/card/card.component.js +9 -1
  39. package/assets/js/components/card/card.component.min.js +7 -5
  40. package/assets/js/components/card/card.component.min.js.map +1 -1
  41. package/assets/js/components/collapsible-side/collapsible-side.component.js +96 -0
  42. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +27 -0
  43. package/assets/js/components/collapsible-side/collapsible-side.component.min.js.map +1 -0
  44. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  45. package/assets/js/components/header/header.component.min.js +1 -1
  46. package/assets/js/components/nav/nav.component.min.js +1 -1
  47. package/assets/js/components/notification/notification.component.min.js +1 -1
  48. package/assets/js/components/pagination/pagination.component.min.js +1 -1
  49. package/assets/js/components/table/table.component.js +3 -0
  50. package/assets/js/components/table/table.component.min.js +10 -10
  51. package/assets/js/components/table/table.component.min.js.map +1 -1
  52. package/assets/js/components/tabs/tabs.component.min.js +1 -1
  53. package/assets/js/dynamic.min.js +3 -3
  54. package/assets/js/dynamic.min.js.map +1 -1
  55. package/assets/js/modules/applied-filters.js +3 -3
  56. package/assets/js/modules/dialogs.js +12 -0
  57. package/assets/js/modules/helpers.js +0 -13
  58. package/assets/js/modules/table.js +68 -13
  59. package/assets/js/scripts.bundle.js +15 -13
  60. package/assets/js/scripts.bundle.js.map +1 -1
  61. package/assets/js/scripts.bundle.min.js +2 -2
  62. package/assets/js/scripts.bundle.min.js.map +1 -1
  63. package/assets/sass/_corefiles.scss +0 -1
  64. package/assets/sass/_func.scss +1 -0
  65. package/assets/sass/_functions/mixins.scss +22 -0
  66. package/assets/sass/components/actionbar-global.scss +69 -7
  67. package/assets/sass/components/actionbar.scss +13 -7
  68. package/assets/sass/components/admin-panel.scss +47 -2
  69. package/assets/sass/components/card-global.scss +46 -1
  70. package/assets/sass/components/card.scss +14 -12
  71. package/assets/sass/components/charts.scss +1 -1
  72. package/assets/sass/components/collapsible-side.scss +327 -0
  73. package/assets/sass/components/dialog.scss +6 -23
  74. package/assets/sass/components/fileupload.scss +1 -1
  75. package/assets/sass/components/nav-global.scss +26 -9
  76. package/assets/sass/components/nav.scss +9 -10
  77. package/assets/sass/components/notification.scss +1 -1
  78. package/assets/sass/components/table.scss +85 -4
  79. package/assets/sass/core.scss +1 -0
  80. package/assets/sass/error.scss +2 -1
  81. package/assets/sass/foundations/root.scss +3 -3
  82. package/assets/sass/main.scss +4 -3
  83. package/assets/ts/components/actionbar/actionbar.component.ts +67 -2
  84. package/assets/ts/components/card/card.component.ts +12 -2
  85. package/assets/ts/components/collapsible-side/README.md +38 -0
  86. package/assets/ts/components/collapsible-side/collapsible-side.component.ts +134 -0
  87. package/assets/ts/components/table/table.component.ts +4 -0
  88. package/assets/ts/modules/applied-filters.ts +6 -5
  89. package/assets/ts/modules/dialogs.ts +17 -0
  90. package/assets/ts/modules/helpers.ts +0 -17
  91. package/assets/ts/modules/table.ts +82 -13
  92. package/dist/components.es.js +1414 -836
  93. package/dist/components.umd.js +134 -38
  94. package/dist/style.css +1 -1
  95. package/package.json +1 -1
  96. package/src/components/CollapsibleSideMenu/CollapsibleSideMenu.vue +20 -0
  97. package/src/components/CollapsibleSideMenu/README.md +23 -0
  98. package/src/index.js +8 -0
@@ -0,0 +1,134 @@
1
+ // @ts-nocheck
2
+ // Data layer Web component created
3
+ window.dataLayer = window.dataLayer || [];
4
+ window.dataLayer.push({
5
+ "event": "customElementRegistered",
6
+ "element": "collapsible side menu"
7
+ });
8
+
9
+ class iamCollapsibleSideMenu extends HTMLElement {
10
+
11
+ constructor(){
12
+ super();
13
+ this.attachShadow({ mode: 'open'});
14
+
15
+ const assetLocation = document.body.hasAttribute('data-assets-location') ? document.body.getAttribute('data-assets-location') : '/assets'
16
+ const coreCSS = document.body.hasAttribute('data-core-css') ? document.body.getAttribute('data-core-css') : `${assetLocation}/css/core.min.css`;
17
+ const loadCSS = `@import "${assetLocation}/css/components/collapsible-side.css";`;
18
+
19
+ const template = document.createElement('template');
20
+ template.innerHTML = `
21
+ <style class="styles">
22
+ @import "${coreCSS}";
23
+ ${loadCSS}
24
+ ${this.hasAttribute('css') ? `@import "${this.getAttribute('css')}";` : ``}
25
+ </style>
26
+ <link rel="stylesheet" href="https://kit.fontawesome.com/26fdbf0179.css" crossorigin="anonymous">
27
+ <div class="container">
28
+
29
+ <div class="side-menu">
30
+ <button class="btn btn-compact fa-chevron-right btn-secondary btn-sm">Open or close Collapsible menu</button>
31
+ <div class="side-menu-content closed">
32
+ <slot name="menu"></slot>
33
+ </div>
34
+ </div>
35
+
36
+ <div class="main-content">
37
+ <slot></slot>
38
+ </div>
39
+
40
+ </div>
41
+ `;
42
+ this.shadowRoot.appendChild(template.content.cloneNode(true));
43
+ }
44
+
45
+ connectedCallback() {
46
+
47
+ const sideMenu = this.shadowRoot.querySelector('.side-menu');
48
+ const sideMenuContent = this.shadowRoot.querySelector('.side-menu-content');
49
+ const mainContent = this.shadowRoot.querySelector('.main-content')
50
+ const button = this.shadowRoot.querySelector('.side-menu > .btn');
51
+
52
+ // Load external CSS if needed
53
+ if(this.hasAttribute('data-css'))
54
+ this.shadowRoot.querySelector('.styles').insertAdjacentHTML('beforeend', `@import "${this.getAttribute('data-css')}";`);
55
+
56
+ // Set sde nav title
57
+ if(!this.hasAttribute('data-title'))
58
+ this.setAttribute('data-title','configuration')
59
+
60
+ sideMenuContent.insertAdjacentHTML('afterbegin',`<span class="h3">${this.getAttribute('data-title')}</span>`);
61
+ mainContent.insertAdjacentHTML('afterbegin',`<span class="h3">${this.getAttribute('data-title')}</span>`);
62
+
63
+
64
+ if(this.querySelector(':scope > :is(h1,h2,h3,h4,h5,h6)')){
65
+ this.querySelector(':scope > :is(h1,h2,h3,h4,h5,h6)').classList.add('h4');
66
+ this.querySelector(':scope > :is(h1,h2,h3,h4,h5,h6)').classList.add('main-content__title');
67
+ }
68
+
69
+ // Open the menu
70
+ button.addEventListener('click', (event) => {
71
+
72
+
73
+ if(!sideMenu.classList.contains('open')){
74
+
75
+ sideMenuContent.classList.remove('closed');
76
+
77
+
78
+ setTimeout(function(){
79
+ sideMenu.classList.add('open');
80
+ }, 100);
81
+
82
+
83
+ }
84
+ else {
85
+
86
+ sideMenu.classList.remove('open');
87
+ setTimeout(function(){ sideMenuContent.classList.add('closed') }, 1000); // Delay until its close so the animation is broken
88
+
89
+ // While the menu is closing dont allow the hover to re-open it until its fully closed.
90
+ sideMenu.classList.add('pe-none');
91
+ setTimeout(function(){ sideMenu.classList.remove('pe-none')}, 1000);
92
+ }
93
+ });
94
+
95
+ // Mimic hover event on desktop so that we can control when classes are set and which order
96
+ sideMenu.addEventListener('mouseenter', (event) => {
97
+
98
+ if(window.innerWidth > 992){
99
+
100
+ if(!sideMenu.classList.contains('open'))
101
+ sideMenuContent.classList.remove('closed');
102
+
103
+ sideMenu.classList.add('hover');
104
+
105
+ }
106
+ });
107
+
108
+ sideMenu.addEventListener('mousemove', (event) => {
109
+
110
+ if(window.innerWidth > 992){
111
+
112
+ if(!sideMenu.classList.contains('open'))
113
+ sideMenuContent.classList.remove('closed');
114
+ }
115
+ });
116
+
117
+ sideMenu.addEventListener('mouseleave', (event) => {
118
+
119
+ if(window.innerWidth > 992){
120
+
121
+ sideMenu.classList.remove('hover');
122
+
123
+ if(!sideMenu.classList.contains('open'))
124
+ setTimeout(function(){ sideMenuContent.classList.add('closed') }, 1000); // Delay until its close so the animation is broken
125
+ }
126
+ });
127
+
128
+
129
+
130
+ }
131
+
132
+ }
133
+
134
+ export default iamCollapsibleSideMenu;
@@ -65,6 +65,10 @@ class iamTable extends HTMLElement {
65
65
  classList = classList.replace('table--loading','');
66
66
  this.shadowRoot.querySelector('.table__wrapper').className += ` ${classList}`;
67
67
 
68
+ // set actionbar class if needed
69
+ if(this.querySelector('.actionbar__sticky'))
70
+ this.shadowRoot.querySelector('.table__wrapper').classList.add('has-actionbar');
71
+
68
72
  this.table = this.querySelector('table');
69
73
  this.savedTableBody = this.table.querySelector('tbody').cloneNode(true);
70
74
  this.pagination = this.shadowRoot.querySelector('.table__pagination');
@@ -96,7 +96,8 @@ function createAppliedFilters(container,filters) {
96
96
  Array.from(container.querySelectorAll('input[type="checkbox"]:checked')).forEach((input, index) => {
97
97
  addFilterButton(filters, input)
98
98
  });
99
-
99
+
100
+
100
101
  container.addEventListener('change', function(event){
101
102
 
102
103
  if (event && event.target instanceof HTMLElement && event.target.closest('input[data-filter-text]')){
@@ -104,9 +105,8 @@ function createAppliedFilters(container,filters) {
104
105
  let input = event.target.closest('input[data-filter-text]');
105
106
 
106
107
  addFilterButton (filters, input);
107
- };
108
-
109
- }, false);
108
+ }
109
+ });
110
110
 
111
111
  filters.addEventListener('click', function(event){
112
112
 
@@ -136,7 +136,8 @@ function createAppliedFilters(container,filters) {
136
136
  input.checked = false;
137
137
 
138
138
  var event = new Event('force');
139
- input.closest('form').dispatchEvent(event);
139
+ if(!container.hasAttribute('data-nosubmit'))
140
+ input.closest('form').dispatchEvent(event);
140
141
  }
141
142
  }
142
143
  }
@@ -36,6 +36,23 @@ const extendDialogs = (body) => {
36
36
  dialog.showModal();
37
37
  dialog.focus();
38
38
 
39
+ let firstWidth = dialog.offsetWidth;
40
+ dialog.setAttribute('style',`max-width: ${firstWidth}px;`);
41
+
42
+ // When the modal is opened we want to make sure any duplicate checkboxes are matching the originals
43
+ Array.from(dialog.querySelectorAll('[data-duplicate]')).forEach((element,index) => {
44
+
45
+ const id = element.getAttribute('data-duplicate');
46
+ const originalInput = document.getElementById(id);
47
+
48
+ if(element.checked != originalInput.checked){
49
+
50
+ element.checked = originalInput.checked;
51
+ let changeEvent = new Event('change');
52
+ element.dispatchEvent(changeEvent);
53
+ }
54
+ });
55
+
39
56
  window.dataLayer = window.dataLayer || [];
40
57
  window.dataLayer.push({
41
58
  "event": "openModal",
@@ -17,23 +17,6 @@ export const addBodyClasses = (body) => {
17
17
  body.classList.add("ie");
18
18
  }
19
19
 
20
- let nav = document.querySelector('nav');
21
- if(nav) {
22
- let navHeight = nav.offsetHeight;
23
- document.querySelector('body').style.setProperty("--nav-height", `${navHeight}px`);
24
-
25
- function outputsize() {
26
-
27
- navHeight = nav.offsetHeight;
28
- document.querySelector('body').style.setProperty("--nav-height", `${navHeight}px`);
29
- }
30
-
31
- new ResizeObserver(outputsize).observe(nav);
32
- }
33
- else {
34
- document.querySelector('body').style.setProperty("--nav-height", `0px`);
35
- }
36
-
37
20
  return null
38
21
  }
39
22
 
@@ -140,7 +140,35 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
140
140
  var timer;
141
141
 
142
142
  // Check what conditions are set on the table to see what the form actions are
143
- let formSubmit = function(paginate = false){
143
+ let formSubmit = function(event, paginate = false){
144
+
145
+ if(form.classList.contains('processing'))
146
+ return false;
147
+
148
+
149
+ // Before submitting check if any duplicate checkboxes within the filters dialog needs to upset the original input
150
+ if(event.type == "submit"){
151
+ form.classList.add('processing');
152
+ Array.from(form.querySelectorAll('[data-duplicate]')).forEach((element,index) => {
153
+
154
+ const id = element.getAttribute('data-duplicate');
155
+ const input = document.getElementById(id);
156
+ const card = document.querySelector(`[for="${id}"] iam-card`);
157
+
158
+
159
+ if(input.checked != element.checked){
160
+
161
+ if(card){
162
+ let clickEvent = new Event('click');
163
+ card.dispatchEvent(clickEvent);
164
+ }
165
+ else {
166
+ input.checked = element.checked;
167
+ }
168
+ }
169
+ });
170
+ form.classList.remove('processing');
171
+ }
144
172
 
145
173
  if(form.hasAttribute('data-ajax')){
146
174
 
@@ -179,7 +207,7 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
179
207
  if (event && event.target instanceof HTMLElement && event.target.closest('[data-search]')){
180
208
 
181
209
  timer = setTimeout(function(){
182
- formSubmit();
210
+ formSubmit(event);
183
211
  }, 500);
184
212
  };
185
213
  });
@@ -193,12 +221,12 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
193
221
  if(!form.hasAttribute('data-submit'))
194
222
  sortTable(table, form, savedTableBody);
195
223
 
196
- formSubmit();
224
+ formSubmit(event);
197
225
  }
198
226
 
199
227
  if (event && event.target instanceof HTMLElement && event.target.closest('[data-search]')){
200
228
 
201
- formSubmit();
229
+ formSubmit(event);
202
230
  }
203
231
 
204
232
  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
@@ -209,21 +237,21 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
209
237
  }
210
238
  else if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter]') && event.target.closest('form .dialog__wrapper > dialog')){
211
239
 
212
- formSubmit();
240
+ formSubmit(event);
213
241
  }
214
242
  else if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter]') && !event.target.closest('form dialog')){
215
243
 
216
- formSubmit();
244
+ formSubmit(event);
217
245
  }
218
246
 
219
247
  if (event && event.target instanceof HTMLElement && event.target.closest('[data-show]')){
220
248
 
221
- formSubmit();
249
+ formSubmit(event);
222
250
  }
223
251
 
224
252
  if (event && event.target instanceof HTMLElement && event.target.closest('[data-mimic]')){
225
253
 
226
- formSubmit();
254
+ formSubmit(event);
227
255
  }
228
256
  });
229
257
 
@@ -249,12 +277,53 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
249
277
 
250
278
  if (event && event.target instanceof HTMLElement && event.target.closest('[data-clear]')){
251
279
 
252
- form.reset();
280
+ form.classList.add('processing');
281
+ // Make sure any applied filters have been removed
282
+ Array.from(form.querySelectorAll('.applied-filters')).forEach((filters,index) => {
283
+ filters.innerHTML = "";
284
+ });
285
+
286
+ // Make sure cards are unlicked
287
+ let frm_elements = form.elements;
288
+
289
+ for (let i = 0; i < frm_elements.length; i++)
290
+ {
291
+ let field_type = frm_elements[i].type.toLowerCase() ? frm_elements[i].type.toLowerCase() : "text";
292
+ switch (field_type)
293
+ {
294
+ case "text":
295
+ case "password":
296
+ case "textarea":
297
+ frm_elements[i].value = "";
298
+ break;
299
+ case "radio":
300
+ case "checkbox":
301
+ if (frm_elements[i].checked)
302
+ {
303
+ frm_elements[i].checked = false;
304
+ }
305
+ break;
306
+ case "select-one":
307
+ case "select-multi":
308
+ frm_elements[i].selectedIndex = -1;
309
+ break;
310
+ case "hidden":
311
+ default:
312
+ break;
313
+ }
314
+ }
315
+
316
+ Array.from(form.querySelectorAll('label iam-card')).forEach((card,index) => {
317
+ let clickEvent = new Event('click');
318
+ card.dispatchEvent(clickEvent);
319
+ });
320
+
321
+ form.classList.remove('processing');
253
322
 
254
323
  if(!form.hasAttribute('data-submit'))
255
324
  sortTable(table, form, savedTableBody);
256
325
 
257
- formSubmit();
326
+ formSubmit(event);
258
327
  }
259
328
  });
260
329
 
@@ -265,17 +334,17 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
265
334
  if(!form.hasAttribute('data-submit'))
266
335
  event.preventDefault();
267
336
 
268
- formSubmit();
337
+ formSubmit(event);
269
338
  });
270
339
 
271
340
  form.addEventListener('force', (event) => {
272
341
 
273
- formSubmit();
342
+ formSubmit(event);
274
343
  });
275
344
 
276
345
  form.addEventListener('paginate', (event) => {
277
346
 
278
- formSubmit(true);
347
+ formSubmit(event,true);
279
348
  });
280
349
 
281
350