@iamproperty/components 5.5.0 → 5.5.1-beta-2

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 (96) 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/header.css +1 -1
  13. package/assets/css/components/header.css.map +1 -1
  14. package/assets/css/components/nav.css.map +1 -1
  15. package/assets/css/components/slider.css.map +1 -1
  16. package/assets/css/components/tabs.css +1 -1
  17. package/assets/css/components/tabs.css.map +1 -1
  18. package/assets/css/core.min.css +1 -1
  19. package/assets/css/core.min.css.map +1 -1
  20. package/assets/css/style.min.css +1 -1
  21. package/assets/css/style.min.css.map +1 -1
  22. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  23. package/assets/js/components/actionbar/actionbar.component.js +12 -3
  24. package/assets/js/components/actionbar/actionbar.component.min.js +6 -6
  25. package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
  26. package/assets/js/components/address-lookup/address-lookup.component.js +7 -0
  27. package/assets/js/components/address-lookup/address-lookup.component.min.js +4 -4
  28. package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
  29. package/assets/js/components/applied-filters/applied-filters.component.min.js +6 -6
  30. package/assets/js/components/applied-filters/applied-filters.component.min.js.map +1 -1
  31. package/assets/js/components/card/card.component.min.js +3 -3
  32. package/assets/js/components/chart/chart.component.js +71 -0
  33. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
  34. package/assets/js/components/fileupload/fileupload.component.js +1 -1
  35. package/assets/js/components/fileupload/fileupload.component.min.js +5 -5
  36. package/assets/js/components/fileupload/fileupload.component.min.js.map +1 -1
  37. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  38. package/assets/js/components/header/header.component.min.js +2 -2
  39. package/assets/js/components/nav/nav.component.min.js +1 -1
  40. package/assets/js/components/notification/notification.component.min.js +1 -1
  41. package/assets/js/components/pagination/pagination.component.min.js +1 -1
  42. package/assets/js/components/search/search.component.min.js +1 -1
  43. package/assets/js/components/search/search.component.min.js.map +1 -1
  44. package/assets/js/components/table/table.component.js +2 -2
  45. package/assets/js/components/table/table.component.min.js +6 -6
  46. package/assets/js/components/table/table.component.min.js.map +1 -1
  47. package/assets/js/components/tabs/tabs.component.min.js +2 -2
  48. package/assets/js/dynamic.min.js +1 -1
  49. package/assets/js/dynamic.min.js.map +1 -1
  50. package/assets/js/modules/applied-filters.js +39 -7
  51. package/assets/js/modules/chart.js +613 -111
  52. package/assets/js/modules/fileupload.js +11 -0
  53. package/assets/js/modules/helpers.js +16 -0
  54. package/assets/js/modules/table.js +62 -11
  55. package/assets/js/scripts.bundle.js +31 -31
  56. package/assets/js/scripts.bundle.js.map +1 -1
  57. package/assets/js/scripts.bundle.min.js +2 -2
  58. package/assets/js/scripts.bundle.min.js.map +1 -1
  59. package/assets/sass/_elements.scss +1 -1
  60. package/assets/sass/_functions/variables.scss +80 -0
  61. package/assets/sass/_utilities.scss +1 -0
  62. package/assets/sass/components/actionbar.scss +16 -0
  63. package/assets/sass/components/applied-filters.scss +6 -48
  64. package/assets/sass/components/card.global.scss +4 -0
  65. package/assets/sass/components/card.scss +1 -1
  66. package/assets/sass/components/charts.scss +981 -234
  67. package/assets/sass/components/header.scss +8 -1
  68. package/assets/sass/components/tabs.scss +10 -1
  69. package/assets/sass/elements/badge-tag.scss +82 -0
  70. package/assets/sass/elements/buttons.scss +13 -1
  71. package/assets/sass/elements/details.scss +94 -5
  72. package/assets/sass/elements/dialog.scss +2 -0
  73. package/assets/sass/elements/forms.scss +26 -22
  74. package/assets/sass/elements/tooltips.scss +4 -3
  75. package/assets/sass/foundations/root.scss +11 -0
  76. package/assets/sass/helpers/wider-colours.scss +11 -0
  77. package/assets/ts/components/actionbar/actionbar.component.ts +14 -3
  78. package/assets/ts/components/address-lookup/address-lookup.component.ts +9 -0
  79. package/assets/ts/components/chart/README.md +37 -0
  80. package/assets/ts/components/chart/chart.component.ts +98 -0
  81. package/assets/ts/components/fileupload/fileupload.component.ts +1 -1
  82. package/assets/ts/components/table/table.component.ts +2 -2
  83. package/assets/ts/modules/applied-filters.ts +61 -7
  84. package/assets/ts/modules/chart.ts +808 -119
  85. package/assets/ts/modules/fileupload.ts +19 -0
  86. package/assets/ts/modules/helpers.ts +23 -1
  87. package/assets/ts/modules/table.ts +86 -12
  88. package/dist/components.es.js +397 -381
  89. package/dist/components.umd.js +60 -78
  90. package/dist/style.css +1 -1
  91. package/package.json +1 -1
  92. package/src/components/AppliedFilters/AppliedFilters.vue +1 -1
  93. package/src/components/Chart/Chart.vue +26 -96
  94. package/src/components/Header/Header.vue +1 -1
  95. package/src/components/Table/Table.vue +2 -2
  96. package/assets/sass/elements/badge.scss +0 -29
@@ -26,6 +26,10 @@ function fileupload(fileupload, wrapper) {
26
26
  dt.items.add(file); // here you exclude the file. thus removing it.
27
27
  }
28
28
  input.files = dt.files; // Assign the updates list
29
+ if (input.files.length == 0) {
30
+ const emptyEvent = new Event('empty');
31
+ fileupload.dispatchEvent(emptyEvent);
32
+ }
29
33
  const changeEvent = new Event('change');
30
34
  input.dispatchEvent(changeEvent);
31
35
  }
@@ -50,6 +54,8 @@ function fileupload(fileupload, wrapper) {
50
54
  }
51
55
  const changeEvent = new Event('change');
52
56
  input.dispatchEvent(changeEvent);
57
+ const elementChangeEvent = new Event('elementChange');
58
+ fileupload.dispatchEvent(elementChangeEvent);
53
59
  });
54
60
  cloneInput.addEventListener('dragenter', (event) => {
55
61
  cloneInput.classList.add('focus');
@@ -66,5 +72,10 @@ function fileupload(fileupload, wrapper) {
66
72
  for (const file of input.files)
67
73
  filesWrapper.innerHTML += `<span class="file">${file.name} <button data-file="${file.name}">Remove</button></span>`;
68
74
  });
75
+ if (fileupload.hasAttribute('data-filename')) {
76
+ let filename = fileupload.getAttribute('data-filename');
77
+ if (filename)
78
+ filesWrapper.innerHTML += `<span class="file">${filename} <button data-file="${filename}">Remove</button></span>`;
79
+ }
69
80
  }
70
81
  export default fileupload;
@@ -87,6 +87,22 @@ export const safeID = function (str) {
87
87
  str = str.replace(/\W/g, '');
88
88
  return str;
89
89
  };
90
+ export const numberOfDays = function (startDateString, endDateString) {
91
+ let convertStart = startDateString.split('/');
92
+ let convertEnd = endDateString.split('/');
93
+ let dateStart = new Date(convertStart[1] + '/' + convertStart[0] + '/' + convertStart[2]);
94
+ let dateEnd = new Date(convertEnd[1] + '/' + convertEnd[0] + '/' + convertEnd[2]);
95
+ if (dateStart == "Invalid Date")
96
+ throw "Start date is not a valid date";
97
+ if (dateEnd == "Invalid Date")
98
+ throw "End date is not a valid date";
99
+ // To calculate the time difference of two dates
100
+ let diffTime = dateEnd.getTime() - dateStart.getTime();
101
+ let numberOfDays = (diffTime / (1000 * 3600 * 24) + 1);
102
+ if (numberOfDays < 0)
103
+ throw "The start date should be before the end date";
104
+ return numberOfDays;
105
+ };
90
106
  // Used to get values from nested json objects
91
107
  export const resolvePath = (object, path, defaultValue) => path.split(/[\.\[\]\'\"]/).filter(p => p).reduce((o, p) => o ? o[p] : defaultValue, object);
92
108
  export const isTraversable = o => Array.isArray(o) || o !== null && ['function', 'object'].includes(typeof o);
@@ -83,7 +83,7 @@ export const addTableEventListeners = (table) => {
83
83
  };
84
84
  // Filters
85
85
  export const createSearchDataList = (table, form) => {
86
- let searchInput = form.querySelector('[data-search]');
86
+ let searchInput = form.querySelector('input[data-search]');
87
87
  if (!searchInput)
88
88
  return false;
89
89
  const searchID = searchInput.getAttribute('id');
@@ -108,8 +108,13 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
108
108
  var timer;
109
109
  // Check what conditions are set on the table to see what the form actions are
110
110
  let formSubmit = function (event, paginate = false) {
111
+ console.log('submit');
111
112
  if (form.classList.contains('processing'))
112
113
  return false;
114
+ Array.from(form.querySelectorAll('iam-applied-filters')).forEach((element, index) => {
115
+ var event = new Event('tags-set');
116
+ element.dispatchEvent(event);
117
+ });
113
118
  // Before submitting check if any duplicate checkboxes within the filters dialog needs to upset the original input
114
119
  if (event.type == "submit") {
115
120
  form.classList.add('processing');
@@ -153,9 +158,21 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
153
158
  http.send();
154
159
  }
155
160
  };
161
+ if (form.querySelector('iam-actionbar[data-search]')) {
162
+ form.querySelector('iam-actionbar[data-search]').addEventListener('search-submit', (event) => {
163
+ if (form.querySelector('input[data-search]')) {
164
+ form.querySelector('input[data-search]').value = event.detail.search;
165
+ }
166
+ else {
167
+ form.insertAdjacentHTML('beforeend', `<input type="hidden" name="search" data-search="${form.querySelector('iam-actionbar[data-search]').getAttribute('data-search')}" value="${event.detail.search}"/>`);
168
+ }
169
+ clearTimeout(timer);
170
+ formSubmit(event);
171
+ });
172
+ }
156
173
  form.addEventListener('keyup', (event) => {
157
174
  clearTimeout(timer);
158
- if (event && event.target instanceof HTMLElement && event.target.closest('[data-search]')) {
175
+ if (event && event.target instanceof HTMLElement && event.target.closest('input[data-search]')) {
159
176
  timer = setTimeout(function () {
160
177
  formSubmit(event);
161
178
  }, 500);
@@ -169,7 +186,7 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
169
186
  sortTable(table, form, savedTableBody);
170
187
  formSubmit(event);
171
188
  }
172
- if (event && event.target instanceof HTMLElement && event.target.closest('[data-search]')) {
189
+ if (event && event.target instanceof HTMLElement && event.target.closest('input[data-search]')) {
173
190
  formSubmit(event);
174
191
  }
175
192
  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
@@ -313,8 +330,11 @@ export const sortTable = (table, form, savedTableBody) => {
313
330
  return false;
314
331
  }
315
332
  let tbody = table.querySelector('tbody');
316
- let select = form.querySelector('[data-sort]');
317
- let selectedOption = select.querySelector(`option:nth-child(${select.selectedIndex + 1})`);
333
+ let selectedOption = form.querySelector(`input[type="radio"][data-sort]:checked`);
334
+ if (form.querySelector('select[data-sort]')) {
335
+ let select = form.querySelector('select[data-sort]');
336
+ selectedOption = form.querySelector(`select[data-sort] option:nth-child(${select.selectedIndex + 1})`);
337
+ }
318
338
  let sortBy = selectedOption.getAttribute('data-sort');
319
339
  let order = selectedOption.getAttribute('data-order');
320
340
  let format = selectedOption.getAttribute('data-format');
@@ -375,9 +395,9 @@ export const filterTable = (table, form, wrapper) => {
375
395
  row.removeAttribute('data-filtered-by');
376
396
  });
377
397
  // Add search columns too
378
- if (form.querySelector('[data-search]')) {
379
- let searchInput = form.querySelector('[data-search]');
380
- let searchColumns = form.querySelector('[data-search]').getAttribute('data-search').split(',');
398
+ if (form.querySelector('input[data-search]')) {
399
+ let searchInput = form.querySelector('input[data-search]');
400
+ let searchColumns = form.querySelector('input[data-search]').getAttribute('data-search').split(',');
381
401
  searchColumns.forEach((column, index) => {
382
402
  searches.push({ 'column': `${column.trim()}`, 'value': `${searchInput.value}` });
383
403
  });
@@ -407,6 +427,32 @@ export const filterTable = (table, form, wrapper) => {
407
427
  let isMatched = false;
408
428
  filterValue.forEach((filter, index) => {
409
429
  let filterTd = row.querySelector(`[data-label="${key}"]`);
430
+ if (filter.includes('-date-from')) {
431
+ let fromDate = new Date(filter.replace('-date-from', ''));
432
+ let checkDate = new Date(filterTd.textContent.toLowerCase());
433
+ fromDate.setHours(0, 0, 0, 0);
434
+ checkDate.setHours(0, 0, 0, 0);
435
+ if (checkDate < fromDate) {
436
+ row.classList.add('less-than-from-date');
437
+ isMatched = false;
438
+ }
439
+ else if (!row.classList.contains('less-than-from-date') && !row.classList.contains('greater-than-to-date')) {
440
+ isMatched = true;
441
+ }
442
+ }
443
+ else if (filter.includes('-date-to')) {
444
+ let toDate = new Date(filter.replace('-date-to', ''));
445
+ let checkDate = new Date(filterTd.textContent.toLowerCase());
446
+ toDate.setHours(0, 0, 0, 0);
447
+ checkDate.setHours(0, 0, 0, 0);
448
+ if (checkDate > toDate) {
449
+ row.classList.add('greater-than-to-date');
450
+ isMatched = false;
451
+ }
452
+ else if (!row.classList.contains('less-than-from-date') && !row.classList.contains('greater-than-to-date')) {
453
+ isMatched = true;
454
+ }
455
+ }
410
456
  // Dynamic values
411
457
  if (filter && filter == "$today")
412
458
  filter = formatCell('date', new Date());
@@ -455,7 +501,7 @@ export const filterTable = (table, form, wrapper) => {
455
501
  checkDate.setHours(0, 0, 0, 0);
456
502
  isMatched = (checkDate >= firstDayLastMonth && checkDate <= lastDayLastMonth);
457
503
  }
458
- if (filterTd && filterTd.textContent.toLowerCase().includes(filter.toLowerCase())) {
504
+ if (filterTd && filterTd.textContent.toLowerCase().includes(filter.replace('-', ' ').toLowerCase())) {
459
505
  isMatched = true;
460
506
  }
461
507
  });
@@ -642,9 +688,14 @@ const filterFilters = function (form) {
642
688
  }
643
689
  if (filterInput && filterInput.value) {
644
690
  let dataFilter = filterInput.getAttribute('data-filter');
691
+ let filterValue = filterInput.value;
692
+ if (filterInput.hasAttribute('data-date-from'))
693
+ filterValue += '-date-from';
694
+ if (filterInput.hasAttribute('data-date-to'))
695
+ filterValue += '-date-to';
645
696
  if (!filters[dataFilter])
646
697
  filters[dataFilter] = new Array();
647
- filters[dataFilter].push(filterInput.value);
698
+ filters[dataFilter].push(filterValue);
648
699
  }
649
700
  });
650
701
  return filters;
@@ -792,7 +843,7 @@ export const formatCell = (format, cellOutput) => {
792
843
  case 'datetime':
793
844
  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" });
794
845
  case 'date':
795
- return new Date(cellOutput).toLocaleDateString('en-gb', { year: "2-digit", month: "long", day: "numeric" });
846
+ return new Date(cellOutput).toLocaleDateString('en-gb', { day: "numeric", month: "long", year: "2-digit" });
796
847
  case 'capitalise':
797
848
  return cellOutput = ucfirst(cellOutput);
798
849
  }