@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.
- package/assets/css/components/actionbar.css +1 -1
- package/assets/css/components/actionbar.css.map +1 -1
- package/assets/css/components/applied-filters.css +1 -1
- package/assets/css/components/applied-filters.css.map +1 -1
- package/assets/css/components/card.css +1 -1
- package/assets/css/components/card.css.map +1 -1
- package/assets/css/components/card.global.css +1 -1
- package/assets/css/components/card.global.css.map +1 -1
- package/assets/css/components/charts.css +1 -1
- package/assets/css/components/charts.css.map +1 -1
- package/assets/css/components/fileupload.css.map +1 -1
- package/assets/css/components/inline-edit.css +1 -0
- package/assets/css/components/inline-edit.css.map +1 -0
- package/assets/css/components/inline-edit.preload.css +1 -0
- package/assets/css/components/inline-edit.preload.css.map +1 -0
- package/assets/css/components/multiselect.css +1 -0
- package/assets/css/components/multiselect.css.map +1 -0
- package/assets/css/components/multiselect.preload.css +1 -0
- package/assets/css/components/multiselect.preload.css.map +1 -0
- package/assets/css/components/nav.css.map +1 -1
- package/assets/css/components/nav.global.css +1 -1
- package/assets/css/components/nav.global.css.map +1 -1
- package/assets/css/components/slider.css.map +1 -1
- package/assets/css/components/tabs.css +1 -1
- package/assets/css/components/tabs.css.map +1 -1
- package/assets/css/core.min.css +1 -1
- package/assets/css/core.min.css.map +1 -1
- package/assets/css/style.min.css +1 -1
- package/assets/css/style.min.css.map +1 -1
- package/assets/js/components/accordion/accordion.component.min.js +1 -1
- package/assets/js/components/actionbar/actionbar.component.js +12 -3
- package/assets/js/components/actionbar/actionbar.component.min.js +6 -6
- package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
- package/assets/js/components/address-lookup/address-lookup.component.min.js +1 -1
- package/assets/js/components/applied-filters/applied-filters.component.min.js +6 -6
- package/assets/js/components/applied-filters/applied-filters.component.min.js.map +1 -1
- package/assets/js/components/card/card.component.min.js +3 -3
- package/assets/js/components/chart/chart.component.js +71 -0
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
- package/assets/js/components/fileupload/fileupload.component.js +1 -1
- package/assets/js/components/fileupload/fileupload.component.min.js +5 -5
- package/assets/js/components/fileupload/fileupload.component.min.js.map +1 -1
- package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
- package/assets/js/components/header/header.component.min.js +1 -1
- package/assets/js/components/inline-edit/inline-edit.component.js +148 -0
- package/assets/js/components/inline-edit/inline-edit.component.min.js +22 -0
- package/assets/js/components/inline-edit/inline-edit.component.min.js.map +1 -0
- package/assets/js/components/multiselect/multiselect.component.js +221 -0
- package/assets/js/components/multiselect/multiselect.component.min.js +25 -0
- package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -0
- package/assets/js/components/nav/nav.component.min.js +2 -2
- package/assets/js/components/notification/notification.component.min.js +1 -1
- package/assets/js/components/pagination/pagination.component.min.js +1 -1
- package/assets/js/components/search/search.component.min.js +1 -1
- package/assets/js/components/search/search.component.min.js.map +1 -1
- package/assets/js/components/table/table.component.js +2 -2
- package/assets/js/components/table/table.component.min.js +6 -6
- package/assets/js/components/table/table.component.min.js.map +1 -1
- package/assets/js/components/tabs/tabs.component.min.js +2 -2
- package/assets/js/dynamic.min.js +5 -5
- package/assets/js/dynamic.min.js.map +1 -1
- package/assets/js/modules/applied-filters.js +39 -7
- package/assets/js/modules/chart.js +613 -111
- package/assets/js/modules/fileupload.js +11 -0
- package/assets/js/modules/helpers.js +20 -0
- package/assets/js/modules/inputs.js +6 -2
- package/assets/js/modules/table.js +62 -11
- package/assets/js/scripts.bundle.js +31 -31
- package/assets/js/scripts.bundle.js.map +1 -1
- package/assets/js/scripts.bundle.min.js +2 -2
- package/assets/js/scripts.bundle.min.js.map +1 -1
- package/assets/sass/_components.scss +5 -0
- package/assets/sass/_elements.scss +1 -1
- package/assets/sass/_functions/variables.scss +80 -0
- package/assets/sass/_utilities.scss +1 -0
- package/assets/sass/components/actionbar.scss +16 -0
- package/assets/sass/components/applied-filters.scss +6 -48
- package/assets/sass/components/card.global.scss +4 -0
- package/assets/sass/components/card.scss +1 -1
- package/assets/sass/components/charts.scss +981 -234
- package/assets/sass/components/inline-edit.preload.scss +98 -0
- package/assets/sass/components/inline-edit.scss +32 -0
- package/assets/sass/components/multiselect.preload.scss +37 -0
- package/assets/sass/components/multiselect.scss +186 -0
- package/assets/sass/components/nav.global.scss +2 -0
- package/assets/sass/components/tabs.scss +10 -1
- package/assets/sass/elements/admin-panel.scss +0 -3
- package/assets/sass/elements/badge-tag.scss +92 -0
- package/assets/sass/elements/buttons.scss +13 -1
- package/assets/sass/elements/details.scss +94 -5
- package/assets/sass/elements/dialog.scss +2 -0
- package/assets/sass/elements/forms.scss +42 -25
- package/assets/sass/elements/tooltips.scss +4 -3
- package/assets/sass/foundations/root.scss +11 -0
- package/assets/sass/helpers/wider-colours.scss +11 -0
- package/assets/ts/components/actionbar/actionbar.component.ts +14 -3
- package/assets/ts/components/chart/README.md +37 -0
- package/assets/ts/components/chart/chart.component.ts +98 -0
- package/assets/ts/components/fileupload/fileupload.component.ts +1 -1
- package/assets/ts/components/inline-edit/README.md +30 -0
- package/assets/ts/components/inline-edit/inline-edit.component.ts +211 -0
- package/assets/ts/components/multiselect/README.md +35 -0
- package/assets/ts/components/multiselect/multiselect.component.ts +304 -0
- package/assets/ts/components/search/README.md +36 -0
- package/assets/ts/components/table/table.component.ts +2 -2
- package/assets/ts/modules/applied-filters.ts +61 -7
- package/assets/ts/modules/chart.ts +808 -119
- package/assets/ts/modules/fileupload.ts +19 -0
- package/assets/ts/modules/helpers.ts +29 -1
- package/assets/ts/modules/inputs.ts +8 -2
- package/assets/ts/modules/table.ts +86 -12
- package/dist/components.es.js +348 -329
- package/dist/components.umd.js +59 -63
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/components/AppliedFilters/AppliedFilters.vue +1 -1
- package/src/components/Chart/Chart.vue +26 -96
- package/src/components/InlineEdit/InlineEdit.vue +45 -0
- package/src/components/InlineEdit/README.md +7 -0
- package/src/components/Multiselect/Multiselect.vue +24 -0
- package/src/components/Multiselect/README.md +12 -0
- package/src/components/Search/README.md +11 -0
- package/src/components/Search/Search.vue +1 -1
- 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
|
-
|
|
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
|
-
|
|
444
|
-
|
|
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(
|
|
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', {
|
|
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
|
}
|