@iamproperty/components 5.6.1-beta2 → 5.6.1-beta21
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/address-lookup.css +1 -1
- package/assets/css/components/address-lookup.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/carousel.css +1 -1
- package/assets/css/components/carousel.css.map +1 -1
- package/assets/css/components/collapsible-side.css +1 -1
- package/assets/css/components/collapsible-side.css.map +1 -1
- package/assets/css/components/fileupload.css +1 -1
- package/assets/css/components/fileupload.css.map +1 -1
- package/assets/css/components/multiselect.css +1 -1
- package/assets/css/components/multiselect.css.map +1 -1
- package/assets/css/components/pagination.css +1 -1
- package/assets/css/components/pagination.css.map +1 -1
- package/assets/css/components/table.global.css +1 -1
- package/assets/css/components/table.global.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 +7 -7
- package/assets/js/components/actionbar/actionbar.component.min.js +10 -10
- package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
- package/assets/js/components/address-lookup/address-lookup.component.js +24 -13
- package/assets/js/components/address-lookup/address-lookup.component.min.js +9 -8
- package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
- package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
- package/assets/js/components/card/card.component.js +40 -20
- package/assets/js/components/card/card.component.min.js +19 -19
- package/assets/js/components/card/card.component.min.js.map +1 -1
- package/assets/js/components/carousel/carousel.component.js +17 -4
- package/assets/js/components/carousel/carousel.component.min.js +8 -8
- package/assets/js/components/carousel/carousel.component.min.js.map +1 -1
- package/assets/js/components/collapsible-side/collapsible-side.component.js +5 -5
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js +7 -7
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js.map +1 -1
- package/assets/js/components/fileupload/fileupload.component.js +19 -3
- package/assets/js/components/fileupload/fileupload.component.min.js +10 -8
- package/assets/js/components/fileupload/fileupload.component.min.js.map +1 -1
- package/assets/js/components/filterlist/filterlist.component.js +2 -2
- package/assets/js/components/filterlist/filterlist.component.min.js +5 -5
- package/assets/js/components/filterlist/filterlist.component.min.js.map +1 -1
- package/assets/js/components/header/header.component.min.js +1 -1
- package/assets/js/components/inline-edit/inline-edit.component.js +3 -3
- package/assets/js/components/inline-edit/inline-edit.component.min.js +4 -4
- package/assets/js/components/inline-edit/inline-edit.component.min.js.map +1 -1
- package/assets/js/components/marketing/marketing.component.min.js +1 -1
- package/assets/js/components/multiselect/multiselect.component.js +4 -3
- package/assets/js/components/multiselect/multiselect.component.min.js +6 -6
- package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
- package/assets/js/components/nav/nav.component.min.js +1 -1
- package/assets/js/components/notification/notification.component.js +1 -1
- package/assets/js/components/notification/notification.component.min.js +2 -2
- package/assets/js/components/notification/notification.component.min.js.map +1 -1
- package/assets/js/components/pagination/pagination.component.min.js +3 -3
- 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/slider/slider.component.min.js +1 -1
- package/assets/js/components/table/table.component.js +16 -1
- package/assets/js/components/table/table.component.min.js +5 -5
- package/assets/js/components/table/table.component.min.js.map +1 -1
- package/assets/js/components/tabs/tabs.component.min.js +1 -1
- package/assets/js/dynamic.min.js +5 -5
- package/assets/js/dynamic.min.js.map +1 -1
- package/assets/js/modules/carousel.js +30 -8
- package/assets/js/modules/dialogs.js +7 -1
- package/assets/js/modules/dynamicEvents.js +3 -0
- package/assets/js/modules/fileupload.js +44 -19
- package/assets/js/modules/helpers.js +4 -0
- package/assets/js/modules/inputs.js +1 -1
- package/assets/js/modules/table.js +6 -1
- package/assets/js/scripts.bundle.js +29 -29
- 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 +54 -0
- package/assets/sass/components/address-lookup.scss +4 -0
- package/assets/sass/components/card.scss +88 -1
- package/assets/sass/components/carousel.scss +31 -7
- package/assets/sass/components/collapsible-side.scss +8 -1
- package/assets/sass/components/fileupload.scss +1 -10
- package/assets/sass/components/multiselect.scss +5 -1
- package/assets/sass/components/pagination.scss +11 -16
- package/assets/sass/components/table.global.scss +4 -19
- package/assets/sass/elements/dialog.scss +1 -1
- package/assets/sass/elements/forms.scss +39 -10
- package/assets/sass/elements/progress.scss +159 -17
- package/assets/ts/components/actionbar/actionbar.component.ts +7 -7
- package/assets/ts/components/address-lookup/address-lookup.component.ts +28 -14
- package/assets/ts/components/card/card.component.ts +51 -23
- package/assets/ts/components/carousel/carousel.component.ts +20 -4
- package/assets/ts/components/collapsible-side/collapsible-side.component.ts +5 -5
- package/assets/ts/components/fileupload/fileupload.component.ts +29 -3
- package/assets/ts/components/filterlist/filterlist.component.ts +2 -2
- package/assets/ts/components/inline-edit/inline-edit.component.ts +3 -3
- package/assets/ts/components/multiselect/multiselect.component.ts +4 -3
- package/assets/ts/components/notification/notification.component.ts +1 -1
- package/assets/ts/components/table/table.component.ts +24 -1
- package/assets/ts/modules/carousel.ts +40 -9
- package/assets/ts/modules/dialogs.ts +9 -1
- package/assets/ts/modules/dynamicEvents.ts +3 -0
- package/assets/ts/modules/fileupload.ts +64 -31
- package/assets/ts/modules/helpers.ts +6 -0
- package/assets/ts/modules/inputs.ts +1 -1
- package/assets/ts/modules/table.ts +8 -2
- package/dist/components.es.js +546 -611
- package/dist/components.umd.js +98 -95
- package/dist/style.css +1 -1
- package/package.json +3 -3
- package/src/components/Card/README.md +1 -0
- package/src/components/Carousel/Carousel.vue +5 -1
- package/src/components/CollapsibleSideMenu/CollapsibleSideMenu.vue +1 -1
- package/src/components/FileUpload/FileUpload.vue +29 -6
|
@@ -242,7 +242,10 @@ class iamTable extends HTMLElement {
|
|
|
242
242
|
|
|
243
243
|
|
|
244
244
|
tableModule.makeTableFunctional(this.table, this.form, this.pagination, this);
|
|
245
|
-
|
|
245
|
+
|
|
246
|
+
if(!this.hasAttribute('data-no-submit'))
|
|
247
|
+
tableModule.filterTable(this.table, this.form,this);
|
|
248
|
+
|
|
246
249
|
tableModule.populateDataQueries(this.table, this.form);
|
|
247
250
|
}
|
|
248
251
|
|
|
@@ -256,6 +259,22 @@ class iamTable extends HTMLElement {
|
|
|
256
259
|
|
|
257
260
|
});
|
|
258
261
|
|
|
262
|
+
// Push up the pagination events
|
|
263
|
+
this.pagination.addEventListener('update-show', (event) => {
|
|
264
|
+
|
|
265
|
+
let show = event.detail.show;
|
|
266
|
+
|
|
267
|
+
const updateEvent = new CustomEvent("update-show", { detail: { show: show } });
|
|
268
|
+
this.dispatchEvent(updateEvent);
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
this.pagination.addEventListener('update-page', (event) => {
|
|
272
|
+
|
|
273
|
+
let page = event.detail.page;
|
|
274
|
+
|
|
275
|
+
const updateEvent = new CustomEvent("update-page", { detail: { page: page } });
|
|
276
|
+
this.dispatchEvent(updateEvent);
|
|
277
|
+
});
|
|
259
278
|
}
|
|
260
279
|
|
|
261
280
|
|
|
@@ -265,6 +284,10 @@ class iamTable extends HTMLElement {
|
|
|
265
284
|
|
|
266
285
|
attributeChangedCallback(attrName, oldVal, newVal) {
|
|
267
286
|
|
|
287
|
+
if(this.hasAttribute('data-no-submit')){
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
|
|
268
291
|
this.pagination = this.shadowRoot.querySelector('iam-pagination');
|
|
269
292
|
|
|
270
293
|
switch (attrName) {
|
|
@@ -5,8 +5,8 @@ function carousel(carouselElement, row) {
|
|
|
5
5
|
|
|
6
6
|
let carouselInner = carouselElement.querySelector('.carousel__inner');
|
|
7
7
|
let carouselControls = carouselElement.querySelector('.carousel__controls');
|
|
8
|
-
let itemCount = row.querySelectorAll('.col').length;
|
|
9
|
-
|
|
8
|
+
let itemCount = row.querySelectorAll(':scope > .col').length;
|
|
9
|
+
|
|
10
10
|
// On scroll we need to make sure the buttons get corrected and the next testimonial is shown
|
|
11
11
|
carouselInner.addEventListener('scroll', function(e){
|
|
12
12
|
clearTimeout(scrollTimeout);
|
|
@@ -16,11 +16,21 @@ function carousel(carouselElement, row) {
|
|
|
16
16
|
let scrollWidth = carouselInner.scrollWidth;
|
|
17
17
|
let scrollLeft = carouselInner.scrollLeft;
|
|
18
18
|
let targetSlide = Math.round((scrollLeft / scrollWidth) * itemCount) + 1;
|
|
19
|
-
|
|
19
|
+
|
|
20
|
+
let itemWidth = row.querySelector(':scope > .col').scrollWidth;
|
|
21
|
+
let lastItemOffset = row.querySelector(':scope > .col:last-child').offsetLeft;
|
|
22
|
+
//+60px here is to account for when the next offscreen slide is visible beneath the next arrow
|
|
23
|
+
let lastItemInView = carouselInner.scrollLeft + scrollArea + carouselInner.getBoundingClientRect().left >= (lastItemOffset + 60);
|
|
24
|
+
|
|
25
|
+
let visibleItems = Math.round(scrollArea / itemWidth);
|
|
20
26
|
|
|
21
|
-
if
|
|
22
|
-
|
|
27
|
+
//Check if theres room for more slides than we have
|
|
28
|
+
let leftOverSpace = (Math.ceil(itemCount / visibleItems) * visibleItems) - itemCount;
|
|
23
29
|
|
|
30
|
+
if(leftOverSpace > 0 && lastItemInView){
|
|
31
|
+
targetSlide = (Math.floor(itemCount / visibleItems) * visibleItems) + 1;
|
|
32
|
+
}
|
|
33
|
+
|
|
24
34
|
Array.from(carouselElement.querySelectorAll('.carousel__controls button')).forEach((button, index) => {
|
|
25
35
|
button.removeAttribute('aria-current');
|
|
26
36
|
});
|
|
@@ -34,7 +44,7 @@ function carousel(carouselElement, row) {
|
|
|
34
44
|
carouselElement.querySelector('.btn-prev').removeAttribute('disabled');
|
|
35
45
|
|
|
36
46
|
// Disable the next button if the last item is in view
|
|
37
|
-
if(targetSlide
|
|
47
|
+
if(targetSlide > (itemCount - visibleItems))
|
|
38
48
|
carouselElement.querySelector('.btn-next').setAttribute('disabled','disabled');
|
|
39
49
|
else
|
|
40
50
|
carouselElement.querySelector('.btn-next').removeAttribute('disabled');
|
|
@@ -56,11 +66,11 @@ function carousel(carouselElement, row) {
|
|
|
56
66
|
});
|
|
57
67
|
target.setAttribute('aria-current', true);
|
|
58
68
|
|
|
59
|
-
const el = row.querySelector(
|
|
69
|
+
const el = row.querySelector(`:scope > *:nth-child(${target.getAttribute('data-slide')})`);
|
|
60
70
|
|
|
61
71
|
carouselInner.scroll({
|
|
62
72
|
top: 0,
|
|
63
|
-
left: el.offsetLeft,
|
|
73
|
+
left: el.offsetLeft - carouselInner.getBoundingClientRect().left,
|
|
64
74
|
behavior: 'smooth'
|
|
65
75
|
});
|
|
66
76
|
|
|
@@ -71,11 +81,32 @@ function carousel(carouselElement, row) {
|
|
|
71
81
|
|
|
72
82
|
carouselElement.addEventListener('click', function(e){
|
|
73
83
|
|
|
84
|
+
let scrollArea = carouselInner.clientWidth;
|
|
85
|
+
let scrollWidth = carouselInner.scrollWidth;
|
|
86
|
+
let itemWidth = row.querySelector(':scope > .col').scrollWidth;
|
|
87
|
+
|
|
88
|
+
let visibleItems = Math.round(scrollArea / itemWidth);
|
|
89
|
+
|
|
90
|
+
let lastItemOffset = row.querySelector(':scope > .col:last-child').offsetLeft;
|
|
91
|
+
let lastItemInView = carouselInner.scrollLeft + scrollArea + carouselInner.getBoundingClientRect().left >= (lastItemOffset + 60);
|
|
92
|
+
|
|
93
|
+
//Check if theres room for more slides than we have
|
|
94
|
+
let leftOverSpace = (Math.ceil(itemCount / visibleItems) * visibleItems) - itemCount;
|
|
95
|
+
|
|
96
|
+
/*
|
|
97
|
+
When the last slide isn't filled with items, we only want to move back the number of items on the slide,
|
|
98
|
+
rather than the total number of possible visible items
|
|
99
|
+
*/
|
|
100
|
+
let spacesToMove = visibleItems - leftOverSpace;
|
|
101
|
+
|
|
102
|
+
//Only want to change the amount of movement if the last item is visible
|
|
103
|
+
let movement = lastItemInView && leftOverSpace > 0 ? spacesToMove * itemWidth : carouselInner.clientWidth;
|
|
104
|
+
|
|
74
105
|
for (var target = e.target; target && target != this; target = target.parentNode) {
|
|
75
106
|
if (typeof target.matches == "function" && target.matches('.btn-next, .btn-prev')) {
|
|
76
107
|
|
|
77
108
|
e.preventDefault();
|
|
78
|
-
let scrollTo = target.classList.contains('btn-prev') ? carouselInner.scrollLeft -
|
|
109
|
+
let scrollTo = target.classList.contains('btn-prev') ? carouselInner.scrollLeft - movement : carouselInner.scrollLeft + carouselInner.clientWidth;
|
|
79
110
|
|
|
80
111
|
carouselInner.scroll({
|
|
81
112
|
top: 0,
|
|
@@ -72,6 +72,14 @@ const extendDialogs = (body) => {
|
|
|
72
72
|
btnElement.classList.remove('active');
|
|
73
73
|
});
|
|
74
74
|
|
|
75
|
+
let closeEvent = new CustomEvent('dialog-closed', {
|
|
76
|
+
bubbles: true,
|
|
77
|
+
cancelable: true,
|
|
78
|
+
detail: { modalId: dialog.id }
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
event.target.dispatchEvent(closeEvent);
|
|
82
|
+
|
|
75
83
|
window.dataLayer = window.dataLayer || [];
|
|
76
84
|
window.dataLayer.push({
|
|
77
85
|
"event": "closeModal",
|
|
@@ -111,7 +119,7 @@ const extendDialogs = (body) => {
|
|
|
111
119
|
|
|
112
120
|
if (event.clientX < dialogDimensions.left || event.clientX > dialogDimensions.right || event.clientY < dialogDimensions.top || event.clientY > dialogDimensions.bottom) {
|
|
113
121
|
|
|
114
|
-
if(!event.target.closest('
|
|
122
|
+
if(!event.target.closest('dialog *')) // Weird bug when interacting with radio input fields within dialogs cuases it to close
|
|
115
123
|
dialog.close()
|
|
116
124
|
|
|
117
125
|
window.dataLayer = window.dataLayer || [];
|
|
@@ -115,6 +115,9 @@ const runEvent = (element,event,eventType) => {
|
|
|
115
115
|
element.setAttribute(event['attribute'],event['value']);
|
|
116
116
|
});
|
|
117
117
|
break;
|
|
118
|
+
case "focus":
|
|
119
|
+
document.querySelector(`${event['target']}`).focus();
|
|
120
|
+
break;
|
|
118
121
|
case "removeAttribute":
|
|
119
122
|
Array.from(document.querySelectorAll(`${event['target']}`)).forEach(function(element,index){
|
|
120
123
|
element.removeAttribute(event['attribute']);
|
|
@@ -5,11 +5,27 @@ function fileupload(fileupload: Element, wrapper: Element) {
|
|
|
5
5
|
const dropArea = wrapper.querySelector('.drop-area');
|
|
6
6
|
const input = fileupload.querySelector('input');
|
|
7
7
|
const maxSize = fileupload.hasAttribute('data-maxsize') ? fileupload.getAttribute('data-maxsize') : 0;
|
|
8
|
+
const errorMsgSize = wrapper.querySelector('.invalid-feedback.size');
|
|
9
|
+
const errorMsgExt = wrapper.querySelector('.invalid-feedback.ext');
|
|
8
10
|
|
|
9
11
|
// We clone the input field to work as a buffer input field, this allows us to add new files without losing the old ones
|
|
10
12
|
const cloneInput = input.cloneNode();
|
|
11
13
|
dropArea.append(cloneInput);
|
|
12
14
|
|
|
15
|
+
let checkFileExt = function(filename){
|
|
16
|
+
|
|
17
|
+
if(!input.hasAttribute('accept'))
|
|
18
|
+
return true;
|
|
19
|
+
|
|
20
|
+
const nameExtension = filename.split('.').pop();
|
|
21
|
+
const acceptedTypes = input.getAttribute('accept');
|
|
22
|
+
|
|
23
|
+
if(acceptedTypes.includes(nameExtension))
|
|
24
|
+
return true;
|
|
25
|
+
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
|
|
13
29
|
wrapper.addEventListener('click', (event) => {
|
|
14
30
|
|
|
15
31
|
if (event && event.target instanceof HTMLElement && event.target.closest('.btn-primary')){
|
|
@@ -17,6 +33,9 @@ function fileupload(fileupload: Element, wrapper: Element) {
|
|
|
17
33
|
const button = event.target.closest('.btn-primary');
|
|
18
34
|
|
|
19
35
|
// If the input allows multiples then use the buffer clone input
|
|
36
|
+
|
|
37
|
+
errorMsgExt.classList.remove('d-block');
|
|
38
|
+
errorMsgSize.classList.remove('d-block');
|
|
20
39
|
const inputTrigger = input.hasAttribute('multiple') ? cloneInput : input;
|
|
21
40
|
|
|
22
41
|
inputTrigger.click();
|
|
@@ -27,7 +46,6 @@ function fileupload(fileupload: Element, wrapper: Element) {
|
|
|
27
46
|
|
|
28
47
|
if (event && event.target instanceof HTMLElement && event.target.closest('.files button')){
|
|
29
48
|
|
|
30
|
-
|
|
31
49
|
const dt = new DataTransfer();
|
|
32
50
|
const { files } = input;
|
|
33
51
|
const button = event.target.closest('.files button');
|
|
@@ -42,12 +60,6 @@ function fileupload(fileupload: Element, wrapper: Element) {
|
|
|
42
60
|
|
|
43
61
|
input.files = dt.files // Assign the updates list
|
|
44
62
|
|
|
45
|
-
|
|
46
|
-
if(input.files.length == 0){
|
|
47
|
-
const emptyEvent = new Event('empty');
|
|
48
|
-
fileupload.dispatchEvent(emptyEvent);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
63
|
const changeEvent = new Event('change');
|
|
52
64
|
input.dispatchEvent(changeEvent);
|
|
53
65
|
}
|
|
@@ -57,6 +69,7 @@ function fileupload(fileupload: Element, wrapper: Element) {
|
|
|
57
69
|
cloneInput.addEventListener('change', (event) => {
|
|
58
70
|
|
|
59
71
|
if(input.hasAttribute('multiple')){
|
|
72
|
+
|
|
60
73
|
const filesArray = [...input.files, ...cloneInput.files];
|
|
61
74
|
|
|
62
75
|
let fileNames = [];
|
|
@@ -68,8 +81,17 @@ function fileupload(fileupload: Element, wrapper: Element) {
|
|
|
68
81
|
|
|
69
82
|
const size = file.size/1000;
|
|
70
83
|
|
|
71
|
-
if(!fileNames.includes(file.name) && (maxSize == 0 || size < maxSize))
|
|
84
|
+
if(!fileNames.includes(file.name) && (maxSize == 0 || size < maxSize) && checkFileExt(file.name))
|
|
72
85
|
dt.items.add(file) // here you exclude the file. thus removing it.
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
if(!checkFileExt(file.name)){
|
|
89
|
+
errorMsgExt.classList.add('d-block');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if(size > maxSize){
|
|
93
|
+
errorMsgSize.classList.add('d-block');
|
|
94
|
+
}
|
|
73
95
|
|
|
74
96
|
fileNames.push(file.name);
|
|
75
97
|
}
|
|
@@ -80,12 +102,9 @@ function fileupload(fileupload: Element, wrapper: Element) {
|
|
|
80
102
|
|
|
81
103
|
input.files = cloneInput.files;
|
|
82
104
|
}
|
|
83
|
-
|
|
105
|
+
|
|
84
106
|
const changeEvent = new Event('change');
|
|
85
107
|
input.dispatchEvent(changeEvent);
|
|
86
|
-
|
|
87
|
-
const elementChangeEvent = new Event('elementChange');
|
|
88
|
-
fileupload.dispatchEvent(elementChangeEvent);
|
|
89
108
|
});
|
|
90
109
|
|
|
91
110
|
|
|
@@ -106,11 +125,40 @@ function fileupload(fileupload: Element, wrapper: Element) {
|
|
|
106
125
|
|
|
107
126
|
input.addEventListener('change', (event) => {
|
|
108
127
|
|
|
128
|
+
if(input.files.length == 1) {
|
|
129
|
+
|
|
130
|
+
let file = input.files[0];
|
|
131
|
+
|
|
132
|
+
const size = file.size/1000;
|
|
133
|
+
|
|
134
|
+
if(!checkFileExt(file.name)){
|
|
135
|
+
errorMsgExt.classList.add('d-block');
|
|
136
|
+
|
|
137
|
+
const dt = new DataTransfer();
|
|
138
|
+
input.files = dt.files;
|
|
139
|
+
}
|
|
140
|
+
if(size > maxSize){
|
|
141
|
+
errorMsgSize.classList.add('d-block');
|
|
142
|
+
|
|
143
|
+
const dt = new DataTransfer();
|
|
144
|
+
input.files = dt.files;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
109
148
|
// Reset
|
|
110
149
|
filesWrapper.innerHTML = '';
|
|
111
150
|
|
|
112
|
-
for (const file of input.files)
|
|
113
|
-
filesWrapper.innerHTML += `<span class="file">${file.name} <button data-file="${file.name}">Remove</button></span>`;
|
|
151
|
+
for (const file of input.files){
|
|
152
|
+
filesWrapper.innerHTML += `<span class="file" part="file">${file.name} <button data-file="${file.name}">Remove</button></span>`;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const elementChangeEvent = new CustomEvent('elementchange', {detail: {"files": input.files}});
|
|
156
|
+
fileupload.dispatchEvent(elementChangeEvent);
|
|
157
|
+
|
|
158
|
+
if(input.files.length == 0){
|
|
159
|
+
const emptyEvent = new CustomEvent('empty');
|
|
160
|
+
fileupload.dispatchEvent(emptyEvent);
|
|
161
|
+
}
|
|
114
162
|
});
|
|
115
163
|
|
|
116
164
|
if(fileupload.hasAttribute('data-filename')){
|
|
@@ -118,23 +166,8 @@ function fileupload(fileupload: Element, wrapper: Element) {
|
|
|
118
166
|
let filename = fileupload.getAttribute('data-filename');
|
|
119
167
|
|
|
120
168
|
if(filename)
|
|
121
|
-
filesWrapper.innerHTML
|
|
169
|
+
filesWrapper.innerHTML = `<span class="file">${filename} <button data-file="${filename}">Remove</button></span>`;
|
|
122
170
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
// Change the filename
|
|
126
|
-
wrapper.addEventListener('click', (event) => {
|
|
127
|
-
|
|
128
|
-
if (event && event.target instanceof HTMLElement && event.target.closest('.btn-primary')){
|
|
129
|
-
|
|
130
|
-
const button = event.target.closest('.btn-primary');
|
|
131
|
-
|
|
132
|
-
// If the input allows multiples then use the buffer clone input
|
|
133
|
-
const inputTrigger = input.hasAttribute('multiple') ? cloneInput : input;
|
|
134
|
-
|
|
135
|
-
inputTrigger.click();
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
171
|
}
|
|
139
172
|
|
|
140
|
-
export default fileupload;
|
|
173
|
+
export default fileupload;
|
|
@@ -100,6 +100,12 @@ export const addGlobalEvents = (body) => {
|
|
|
100
100
|
}
|
|
101
101
|
});
|
|
102
102
|
|
|
103
|
+
Array.from(document.querySelectorAll('label progress')).forEach((progress,index) => {
|
|
104
|
+
let label = progress.closest('label');
|
|
105
|
+
|
|
106
|
+
label.setAttribute('data-percent',progress.getAttribute('value'));
|
|
107
|
+
});
|
|
108
|
+
|
|
103
109
|
return null
|
|
104
110
|
}
|
|
105
111
|
|
|
@@ -5,7 +5,7 @@ const extendInputs = (body) => {
|
|
|
5
5
|
|
|
6
6
|
function loadInput(){
|
|
7
7
|
// maxlength counter init
|
|
8
|
-
Array.from(document.querySelectorAll('input[maxlength]')).forEach((input,index) => {
|
|
8
|
+
Array.from(document.querySelectorAll('input[maxlength],textarea[maxlength]')).forEach((input,index) => {
|
|
9
9
|
let wrapper = input.parentElement;
|
|
10
10
|
setMaxlengthVars(input,wrapper);
|
|
11
11
|
});
|
|
@@ -149,7 +149,9 @@ 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
|
-
|
|
152
|
+
if(wrapper.hasAttribute('data-no-submit')){
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
153
155
|
|
|
154
156
|
if(form.classList.contains('processing'))
|
|
155
157
|
return false;
|
|
@@ -848,6 +850,10 @@ export const populateDataQueries = (table,form,wrapper) => {
|
|
|
848
850
|
// Pagination
|
|
849
851
|
export const addPaginationEventListeners = function(table, form, pagination, wrapper){
|
|
850
852
|
|
|
853
|
+
if(wrapper.hasAttribute('data-no-submit')){
|
|
854
|
+
return false;
|
|
855
|
+
}
|
|
856
|
+
|
|
851
857
|
pagination.addEventListener('update-page', (event) => {
|
|
852
858
|
|
|
853
859
|
let paginationInput = form.querySelector('[data-pagination]');
|
|
@@ -1007,7 +1013,7 @@ const filterFilters = function(form){
|
|
|
1007
1013
|
}
|
|
1008
1014
|
|
|
1009
1015
|
export const loadAjaxTable = async function (table, form, pagination, wrapper){
|
|
1010
|
-
|
|
1016
|
+
|
|
1011
1017
|
let formData = new FormData(form);
|
|
1012
1018
|
let queryString = new URLSearchParams(formData).toString();
|
|
1013
1019
|
let columns = table.querySelectorAll('thead tr th:not(.expand-button-heading)');
|