@iamproperty/components 5.5.1-beta-1 → 5.5.1-beta-4

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 (124) hide show
  1. package/assets/css/components/actionbar.css +1 -1
  2. package/assets/css/components/actionbar.css.map +1 -1
  3. package/assets/css/components/applied-filters.css +1 -1
  4. package/assets/css/components/applied-filters.css.map +1 -1
  5. package/assets/css/components/card.css +1 -1
  6. package/assets/css/components/card.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/charts.css +1 -1
  10. package/assets/css/components/charts.css.map +1 -1
  11. package/assets/css/components/fileupload.css.map +1 -1
  12. package/assets/css/components/inline-edit.css +1 -0
  13. package/assets/css/components/inline-edit.css.map +1 -0
  14. package/assets/css/components/inline-edit.preload.css +1 -0
  15. package/assets/css/components/inline-edit.preload.css.map +1 -0
  16. package/assets/css/components/multiselect.css +1 -0
  17. package/assets/css/components/multiselect.css.map +1 -0
  18. package/assets/css/components/multiselect.preload.css +1 -0
  19. package/assets/css/components/multiselect.preload.css.map +1 -0
  20. package/assets/css/components/nav.css.map +1 -1
  21. package/assets/css/components/nav.global.css +1 -1
  22. package/assets/css/components/nav.global.css.map +1 -1
  23. package/assets/css/components/slider.css.map +1 -1
  24. package/assets/css/components/tabs.css +1 -1
  25. package/assets/css/components/tabs.css.map +1 -1
  26. package/assets/css/core.min.css +1 -1
  27. package/assets/css/core.min.css.map +1 -1
  28. package/assets/css/style.min.css +1 -1
  29. package/assets/css/style.min.css.map +1 -1
  30. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  31. package/assets/js/components/actionbar/actionbar.component.js +12 -3
  32. package/assets/js/components/actionbar/actionbar.component.min.js +6 -6
  33. package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
  34. package/assets/js/components/address-lookup/address-lookup.component.min.js +1 -1
  35. package/assets/js/components/applied-filters/applied-filters.component.min.js +6 -6
  36. package/assets/js/components/applied-filters/applied-filters.component.min.js.map +1 -1
  37. package/assets/js/components/card/card.component.min.js +3 -3
  38. package/assets/js/components/chart/chart.component.js +71 -0
  39. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
  40. package/assets/js/components/fileupload/fileupload.component.js +1 -1
  41. package/assets/js/components/fileupload/fileupload.component.min.js +5 -5
  42. package/assets/js/components/fileupload/fileupload.component.min.js.map +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/inline-edit/inline-edit.component.js +148 -0
  46. package/assets/js/components/inline-edit/inline-edit.component.min.js +22 -0
  47. package/assets/js/components/inline-edit/inline-edit.component.min.js.map +1 -0
  48. package/assets/js/components/multiselect/multiselect.component.js +221 -0
  49. package/assets/js/components/multiselect/multiselect.component.min.js +25 -0
  50. package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -0
  51. package/assets/js/components/nav/nav.component.min.js +2 -2
  52. package/assets/js/components/notification/notification.component.min.js +1 -1
  53. package/assets/js/components/pagination/pagination.component.min.js +1 -1
  54. package/assets/js/components/search/search.component.min.js +1 -1
  55. package/assets/js/components/search/search.component.min.js.map +1 -1
  56. package/assets/js/components/table/table.component.js +2 -2
  57. package/assets/js/components/table/table.component.min.js +6 -6
  58. package/assets/js/components/table/table.component.min.js.map +1 -1
  59. package/assets/js/components/tabs/tabs.component.min.js +2 -2
  60. package/assets/js/dynamic.min.js +5 -5
  61. package/assets/js/dynamic.min.js.map +1 -1
  62. package/assets/js/modules/applied-filters.js +39 -7
  63. package/assets/js/modules/chart.js +613 -111
  64. package/assets/js/modules/fileupload.js +11 -0
  65. package/assets/js/modules/helpers.js +20 -0
  66. package/assets/js/modules/inputs.js +6 -2
  67. package/assets/js/modules/table.js +62 -11
  68. package/assets/js/scripts.bundle.js +31 -31
  69. package/assets/js/scripts.bundle.js.map +1 -1
  70. package/assets/js/scripts.bundle.min.js +2 -2
  71. package/assets/js/scripts.bundle.min.js.map +1 -1
  72. package/assets/sass/_components.scss +5 -0
  73. package/assets/sass/_elements.scss +1 -1
  74. package/assets/sass/_functions/variables.scss +80 -0
  75. package/assets/sass/_utilities.scss +1 -0
  76. package/assets/sass/components/actionbar.scss +16 -0
  77. package/assets/sass/components/applied-filters.scss +6 -48
  78. package/assets/sass/components/card.global.scss +4 -0
  79. package/assets/sass/components/card.scss +1 -1
  80. package/assets/sass/components/charts.scss +981 -234
  81. package/assets/sass/components/inline-edit.preload.scss +98 -0
  82. package/assets/sass/components/inline-edit.scss +32 -0
  83. package/assets/sass/components/multiselect.preload.scss +37 -0
  84. package/assets/sass/components/multiselect.scss +186 -0
  85. package/assets/sass/components/nav.global.scss +2 -0
  86. package/assets/sass/components/tabs.scss +10 -1
  87. package/assets/sass/elements/admin-panel.scss +0 -3
  88. package/assets/sass/elements/badge-tag.scss +92 -0
  89. package/assets/sass/elements/buttons.scss +13 -1
  90. package/assets/sass/elements/details.scss +94 -5
  91. package/assets/sass/elements/dialog.scss +2 -0
  92. package/assets/sass/elements/forms.scss +42 -25
  93. package/assets/sass/elements/tooltips.scss +4 -3
  94. package/assets/sass/foundations/root.scss +11 -0
  95. package/assets/sass/helpers/wider-colours.scss +11 -0
  96. package/assets/ts/components/actionbar/actionbar.component.ts +14 -3
  97. package/assets/ts/components/chart/README.md +37 -0
  98. package/assets/ts/components/chart/chart.component.ts +98 -0
  99. package/assets/ts/components/fileupload/fileupload.component.ts +1 -1
  100. package/assets/ts/components/inline-edit/README.md +30 -0
  101. package/assets/ts/components/inline-edit/inline-edit.component.ts +211 -0
  102. package/assets/ts/components/multiselect/README.md +35 -0
  103. package/assets/ts/components/multiselect/multiselect.component.ts +304 -0
  104. package/assets/ts/components/search/README.md +36 -0
  105. package/assets/ts/components/table/table.component.ts +2 -2
  106. package/assets/ts/modules/applied-filters.ts +61 -7
  107. package/assets/ts/modules/chart.ts +808 -119
  108. package/assets/ts/modules/fileupload.ts +19 -0
  109. package/assets/ts/modules/helpers.ts +29 -1
  110. package/assets/ts/modules/inputs.ts +8 -2
  111. package/assets/ts/modules/table.ts +86 -12
  112. package/dist/components.es.js +348 -329
  113. package/dist/components.umd.js +59 -63
  114. package/dist/style.css +1 -1
  115. package/package.json +1 -1
  116. package/src/components/AppliedFilters/AppliedFilters.vue +1 -1
  117. package/src/components/Chart/Chart.vue +26 -96
  118. package/src/components/InlineEdit/InlineEdit.vue +45 -0
  119. package/src/components/InlineEdit/README.md +7 -0
  120. package/src/components/Multiselect/Multiselect.vue +24 -0
  121. package/src/components/Multiselect/README.md +12 -0
  122. package/src/components/Search/README.md +11 -0
  123. package/src/components/Search/Search.vue +1 -1
  124. package/assets/sass/elements/badge.scss +0 -29
@@ -27,10 +27,12 @@ function fileupload(fileupload: Element, wrapper: Element) {
27
27
 
28
28
  if (event && event.target instanceof HTMLElement && event.target.closest('.files button')){
29
29
 
30
+
30
31
  const dt = new DataTransfer();
31
32
  const { files } = input;
32
33
  const button = event.target.closest('.files button');
33
34
 
35
+
34
36
  for (let i = 0; i < files.length; i++) {
35
37
  const file = files[i]
36
38
 
@@ -40,6 +42,12 @@ function fileupload(fileupload: Element, wrapper: Element) {
40
42
 
41
43
  input.files = dt.files // Assign the updates list
42
44
 
45
+
46
+ if(input.files.length == 0){
47
+ const emptyEvent = new Event('empty');
48
+ fileupload.dispatchEvent(emptyEvent);
49
+ }
50
+
43
51
  const changeEvent = new Event('change');
44
52
  input.dispatchEvent(changeEvent);
45
53
  }
@@ -75,6 +83,9 @@ function fileupload(fileupload: Element, wrapper: Element) {
75
83
 
76
84
  const changeEvent = new Event('change');
77
85
  input.dispatchEvent(changeEvent);
86
+
87
+ const elementChangeEvent = new Event('elementChange');
88
+ fileupload.dispatchEvent(elementChangeEvent);
78
89
  });
79
90
 
80
91
 
@@ -101,6 +112,14 @@ function fileupload(fileupload: Element, wrapper: Element) {
101
112
  for (const file of input.files)
102
113
  filesWrapper.innerHTML += `<span class="file">${file.name} <button data-file="${file.name}">Remove</button></span>`;
103
114
  });
115
+
116
+ if(fileupload.hasAttribute('data-filename')){
117
+
118
+ let filename = fileupload.getAttribute('data-filename');
119
+
120
+ if(filename)
121
+ filesWrapper.innerHTML += `<span class="file">${filename} <button data-file="${filename}">Remove</button></span>`;
122
+ }
104
123
  }
105
124
 
106
125
  export default fileupload;
@@ -79,6 +79,12 @@ export const addGlobalEvents = (body) => {
79
79
  form.classList.add('was-validated');
80
80
  event.preventDefault();
81
81
  }
82
+
83
+ if(form.querySelector('iam-multiselect[data-is-required][data-error]')){
84
+
85
+ form.classList.add('was-validated');
86
+ event.preventDefault();
87
+ }
82
88
  }
83
89
 
84
90
  });
@@ -118,8 +124,30 @@ export const safeID = function(str){
118
124
  return str;
119
125
  }
120
126
 
127
+ export const numberOfDays = function(startDateString:string,endDateString:string){
128
+
129
+ let convertStart = startDateString.split('/');
130
+ let convertEnd = endDateString.split('/');
131
+ let dateStart:any = new Date(convertStart[1]+'/'+convertStart[0]+'/'+convertStart[2]);
132
+ let dateEnd:any = new Date(convertEnd[1]+'/'+convertEnd[0]+'/'+convertEnd[2]);
133
+
134
+ if(dateStart == "Invalid Date")
135
+ throw "Start date is not a valid date"
136
+
137
+ if(dateEnd == "Invalid Date")
138
+ throw "End date is not a valid date"
139
+
140
+ // To calculate the time difference of two dates
141
+ let diffTime = dateEnd.getTime() - dateStart.getTime();
142
+ let numberOfDays = (diffTime / (1000 * 3600 * 24) + 1);
143
+
144
+ if(numberOfDays < 0)
145
+ throw "The start date should be before the end date";
146
+
147
+ return numberOfDays;
148
+ }
121
149
  // Used to get values from nested json objects
122
150
  export const resolvePath = (object, path, defaultValue) => path.split(/[\.\[\]\'\"]/).filter(p => p).reduce((o, p) => o ? o[p] : defaultValue, object);
123
151
 
124
152
 
125
- export const isTraversable = o => Array.isArray(o) || o !== null && ['function', 'object'].includes(typeof o);
153
+ export const isTraversable = o => Array.isArray(o) || o !== null && ['function', 'object'].includes(typeof o);
@@ -11,8 +11,14 @@ const extendInputs = (body) => {
11
11
  });
12
12
 
13
13
  Array.from(document.querySelectorAll('label input')).forEach((input,index) => {
14
- if(!input.closest('label').querySelector('.optional-text') && !input.hasAttribute('required'))
15
- input.insertAdjacentHTML("beforebegin", `<span class="optional-text"></span>`);
14
+ if(!input.closest('label').querySelector('.optional-text') && !input.hasAttribute('required')){
15
+
16
+ if(input.parentNode.tagName.toLowerCase() == 'span')
17
+ input.parentElement.insertAdjacentHTML("beforebegin", `<span class="optional-text"></span>`);
18
+ else
19
+ input.insertAdjacentHTML("beforebegin", `<span class="optional-text"></span>`);
20
+ }
21
+
16
22
  });
17
23
 
18
24
  // Date restrictions
@@ -112,7 +112,7 @@ export const addTableEventListeners = (table) => {
112
112
  // Filters
113
113
  export const createSearchDataList = (table, form) => {
114
114
 
115
- let searchInput = form.querySelector('[data-search]');
115
+ let searchInput = form.querySelector('input[data-search]');
116
116
 
117
117
  if(!searchInput)
118
118
  return false;
@@ -149,9 +149,16 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
149
149
  // Check what conditions are set on the table to see what the form actions are
150
150
  let formSubmit = function(event, paginate = false){
151
151
 
152
+ console.log('submit');
153
+
152
154
  if(form.classList.contains('processing'))
153
155
  return false;
154
156
 
157
+ Array.from(form.querySelectorAll('iam-applied-filters')).forEach((element,index) => {
158
+
159
+ var event = new Event('tags-set');
160
+ element.dispatchEvent(event);
161
+ });
155
162
 
156
163
  // Before submitting check if any duplicate checkboxes within the filters dialog needs to upset the original input
157
164
  if(event.type == "submit"){
@@ -206,11 +213,27 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
206
213
  }
207
214
  }
208
215
 
216
+ if(form.querySelector('iam-actionbar[data-search]')){
217
+ form.querySelector('iam-actionbar[data-search]').addEventListener('search-submit', (event) => {
218
+
219
+ if(form.querySelector('input[data-search]')){
220
+ form.querySelector('input[data-search]').value = event.detail.search;
221
+ }
222
+ else {
223
+ form.insertAdjacentHTML('beforeend',`<input type="hidden" name="search" data-search="${form.querySelector('iam-actionbar[data-search]').getAttribute('data-search')}" value="${event.detail.search}"/>`);
224
+ }
225
+
226
+ clearTimeout(timer);
227
+ formSubmit(event);
228
+ });
229
+ }
230
+
231
+
209
232
  form.addEventListener('keyup', (event) => {
210
233
 
211
234
  clearTimeout(timer);
212
235
 
213
- if (event && event.target instanceof HTMLElement && event.target.closest('[data-search]')){
236
+ if (event && event.target instanceof HTMLElement && event.target.closest('input[data-search]')){
214
237
 
215
238
  timer = setTimeout(function(){
216
239
  formSubmit(event);
@@ -230,7 +253,7 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
230
253
  formSubmit(event);
231
254
  }
232
255
 
233
- if (event && event.target instanceof HTMLElement && event.target.closest('[data-search]')){
256
+ if (event && event.target instanceof HTMLElement && event.target.closest('input[data-search]')){
234
257
 
235
258
  formSubmit(event);
236
259
  }
@@ -440,8 +463,15 @@ export const sortTable = (table, form, savedTableBody) => {
440
463
  }
441
464
 
442
465
  let tbody = table.querySelector('tbody');
443
- let select = form.querySelector('[data-sort]');
444
- let selectedOption = select.querySelector(`option:nth-child(${select.selectedIndex + 1})`);
466
+
467
+
468
+ let selectedOption = form.querySelector(`input[type="radio"][data-sort]:checked`);
469
+
470
+ if(form.querySelector('select[data-sort]')){
471
+
472
+ let select = form.querySelector('select[data-sort]');
473
+ selectedOption = form.querySelector(`select[data-sort] option:nth-child(${select.selectedIndex + 1})`);
474
+ }
445
475
 
446
476
  let sortBy = selectedOption.getAttribute('data-sort');
447
477
  let order = selectedOption.getAttribute('data-order');
@@ -522,9 +552,9 @@ export const filterTable = (table, form, wrapper) => {
522
552
  });
523
553
 
524
554
  // Add search columns too
525
- if(form.querySelector('[data-search]')){
526
- let searchInput = form.querySelector('[data-search]');
527
- let searchColumns = form.querySelector('[data-search]').getAttribute('data-search').split(',');
555
+ if(form.querySelector('input[data-search]')){
556
+ let searchInput = form.querySelector('input[data-search]');
557
+ let searchColumns = form.querySelector('input[data-search]').getAttribute('data-search').split(',');
528
558
 
529
559
  searchColumns.forEach((column, index) => {
530
560
 
@@ -566,6 +596,43 @@ export const filterTable = (table, form, wrapper) => {
566
596
 
567
597
  let filterTd = row.querySelector(`[data-label="${key}"]`)
568
598
 
599
+ if(filter.includes('-date-from')){
600
+
601
+ let fromDate = new Date(filter.replace('-date-from',''));
602
+ let checkDate = new Date(filterTd.textContent.toLowerCase());
603
+
604
+ fromDate.setHours(0, 0, 0, 0);
605
+ checkDate.setHours(0, 0, 0, 0);
606
+
607
+ if(checkDate < fromDate){
608
+
609
+ row.classList.add('less-than-from-date');
610
+ isMatched = false;
611
+ }
612
+ else if(!row.classList.contains('less-than-from-date') && !row.classList.contains('greater-than-to-date')) {
613
+
614
+ isMatched = true;
615
+ }
616
+ }
617
+ else if(filter.includes('-date-to')){
618
+
619
+ let toDate = new Date(filter.replace('-date-to',''));
620
+ let checkDate = new Date(filterTd.textContent.toLowerCase());
621
+
622
+ toDate.setHours(0, 0, 0, 0);
623
+ checkDate.setHours(0, 0, 0, 0);
624
+
625
+ if(checkDate > toDate){
626
+
627
+ row.classList.add('greater-than-to-date');
628
+ isMatched = false;
629
+ }
630
+ else if(!row.classList.contains('less-than-from-date') && !row.classList.contains('greater-than-to-date')) {
631
+
632
+ isMatched = true;
633
+ }
634
+ }
635
+
569
636
  // Dynamic values
570
637
  if(filter && filter == "$today")
571
638
  filter = formatCell('date', new Date());
@@ -629,13 +696,13 @@ export const filterTable = (table, form, wrapper) => {
629
696
  isMatched = (checkDate >= firstDayLastMonth && checkDate <= lastDayLastMonth);
630
697
  }
631
698
 
632
- if(filterTd && filterTd.textContent.toLowerCase().includes(filter.toLowerCase())){
699
+ if(filterTd && filterTd.textContent.toLowerCase().includes(filter.replace('-',' ').toLowerCase())){
633
700
  isMatched = true;
634
701
  }
635
702
 
636
703
  });
637
704
 
638
- if(!isMatched){
705
+ if(!isMatched) {
639
706
 
640
707
  row.classList.add('filtered');
641
708
  row.setAttribute('data-filtered-by',key)
@@ -890,11 +957,18 @@ const filterFilters = function(form){
890
957
  if (filterInput && filterInput.value) {
891
958
 
892
959
  let dataFilter = filterInput.getAttribute('data-filter');
960
+ let filterValue = filterInput.value;
961
+
962
+ if(filterInput.hasAttribute('data-date-from'))
963
+ filterValue += '-date-from'
964
+
965
+ if(filterInput.hasAttribute('data-date-to'))
966
+ filterValue += '-date-to'
893
967
 
894
968
  if(!filters[dataFilter])
895
969
  filters[dataFilter] = new Array();
896
970
 
897
- filters[dataFilter].push(filterInput.value);
971
+ filters[dataFilter].push(filterValue);
898
972
  }
899
973
  });
900
974
 
@@ -1088,7 +1162,7 @@ export const formatCell = (format, cellOutput) => {
1088
1162
  case 'datetime':
1089
1163
  return new Date(cellOutput).toLocaleDateString('en-gb', { weekday: 'short', year:"2-digit", month:"long", day: "numeric", }) + " " + new Date(cellOutput).toLocaleTimeString("en-gb", { hour: "2-digit", minute: "2-digit"});
1090
1164
  case 'date':
1091
- return new Date(cellOutput).toLocaleDateString('en-gb', { year:"2-digit", month:"long", day: "numeric"});
1165
+ return new Date(cellOutput).toLocaleDateString('en-gb', {day: "numeric", month:"long", year:"2-digit" });
1092
1166
  case 'capitalise':
1093
1167
  return cellOutput = ucfirst(cellOutput);
1094
1168
  }