@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.
Files changed (114) hide show
  1. package/assets/css/components/address-lookup.css +1 -1
  2. package/assets/css/components/address-lookup.css.map +1 -1
  3. package/assets/css/components/card.css +1 -1
  4. package/assets/css/components/card.css.map +1 -1
  5. package/assets/css/components/carousel.css +1 -1
  6. package/assets/css/components/carousel.css.map +1 -1
  7. package/assets/css/components/collapsible-side.css +1 -1
  8. package/assets/css/components/collapsible-side.css.map +1 -1
  9. package/assets/css/components/fileupload.css +1 -1
  10. package/assets/css/components/fileupload.css.map +1 -1
  11. package/assets/css/components/multiselect.css +1 -1
  12. package/assets/css/components/multiselect.css.map +1 -1
  13. package/assets/css/components/pagination.css +1 -1
  14. package/assets/css/components/pagination.css.map +1 -1
  15. package/assets/css/components/table.global.css +1 -1
  16. package/assets/css/components/table.global.css.map +1 -1
  17. package/assets/css/core.min.css +1 -1
  18. package/assets/css/core.min.css.map +1 -1
  19. package/assets/css/style.min.css +1 -1
  20. package/assets/css/style.min.css.map +1 -1
  21. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  22. package/assets/js/components/actionbar/actionbar.component.js +7 -7
  23. package/assets/js/components/actionbar/actionbar.component.min.js +10 -10
  24. package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
  25. package/assets/js/components/address-lookup/address-lookup.component.js +24 -13
  26. package/assets/js/components/address-lookup/address-lookup.component.min.js +9 -8
  27. package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
  28. package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
  29. package/assets/js/components/card/card.component.js +40 -20
  30. package/assets/js/components/card/card.component.min.js +19 -19
  31. package/assets/js/components/card/card.component.min.js.map +1 -1
  32. package/assets/js/components/carousel/carousel.component.js +17 -4
  33. package/assets/js/components/carousel/carousel.component.min.js +8 -8
  34. package/assets/js/components/carousel/carousel.component.min.js.map +1 -1
  35. package/assets/js/components/collapsible-side/collapsible-side.component.js +5 -5
  36. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +7 -7
  37. package/assets/js/components/collapsible-side/collapsible-side.component.min.js.map +1 -1
  38. package/assets/js/components/fileupload/fileupload.component.js +19 -3
  39. package/assets/js/components/fileupload/fileupload.component.min.js +10 -8
  40. package/assets/js/components/fileupload/fileupload.component.min.js.map +1 -1
  41. package/assets/js/components/filterlist/filterlist.component.js +2 -2
  42. package/assets/js/components/filterlist/filterlist.component.min.js +5 -5
  43. package/assets/js/components/filterlist/filterlist.component.min.js.map +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 +3 -3
  46. package/assets/js/components/inline-edit/inline-edit.component.min.js +4 -4
  47. package/assets/js/components/inline-edit/inline-edit.component.min.js.map +1 -1
  48. package/assets/js/components/marketing/marketing.component.min.js +1 -1
  49. package/assets/js/components/multiselect/multiselect.component.js +4 -3
  50. package/assets/js/components/multiselect/multiselect.component.min.js +6 -6
  51. package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
  52. package/assets/js/components/nav/nav.component.min.js +1 -1
  53. package/assets/js/components/notification/notification.component.js +1 -1
  54. package/assets/js/components/notification/notification.component.min.js +2 -2
  55. package/assets/js/components/notification/notification.component.min.js.map +1 -1
  56. package/assets/js/components/pagination/pagination.component.min.js +3 -3
  57. package/assets/js/components/search/search.component.min.js +1 -1
  58. package/assets/js/components/search/search.component.min.js.map +1 -1
  59. package/assets/js/components/slider/slider.component.min.js +1 -1
  60. package/assets/js/components/table/table.component.js +16 -1
  61. package/assets/js/components/table/table.component.min.js +5 -5
  62. package/assets/js/components/table/table.component.min.js.map +1 -1
  63. package/assets/js/components/tabs/tabs.component.min.js +1 -1
  64. package/assets/js/dynamic.min.js +5 -5
  65. package/assets/js/dynamic.min.js.map +1 -1
  66. package/assets/js/modules/carousel.js +30 -8
  67. package/assets/js/modules/dialogs.js +7 -1
  68. package/assets/js/modules/dynamicEvents.js +3 -0
  69. package/assets/js/modules/fileupload.js +44 -19
  70. package/assets/js/modules/helpers.js +4 -0
  71. package/assets/js/modules/inputs.js +1 -1
  72. package/assets/js/modules/table.js +6 -1
  73. package/assets/js/scripts.bundle.js +29 -29
  74. package/assets/js/scripts.bundle.js.map +1 -1
  75. package/assets/js/scripts.bundle.min.js +2 -2
  76. package/assets/js/scripts.bundle.min.js.map +1 -1
  77. package/assets/sass/_components.scss +54 -0
  78. package/assets/sass/components/address-lookup.scss +4 -0
  79. package/assets/sass/components/card.scss +88 -1
  80. package/assets/sass/components/carousel.scss +31 -7
  81. package/assets/sass/components/collapsible-side.scss +8 -1
  82. package/assets/sass/components/fileupload.scss +1 -10
  83. package/assets/sass/components/multiselect.scss +5 -1
  84. package/assets/sass/components/pagination.scss +11 -16
  85. package/assets/sass/components/table.global.scss +4 -19
  86. package/assets/sass/elements/dialog.scss +1 -1
  87. package/assets/sass/elements/forms.scss +39 -10
  88. package/assets/sass/elements/progress.scss +159 -17
  89. package/assets/ts/components/actionbar/actionbar.component.ts +7 -7
  90. package/assets/ts/components/address-lookup/address-lookup.component.ts +28 -14
  91. package/assets/ts/components/card/card.component.ts +51 -23
  92. package/assets/ts/components/carousel/carousel.component.ts +20 -4
  93. package/assets/ts/components/collapsible-side/collapsible-side.component.ts +5 -5
  94. package/assets/ts/components/fileupload/fileupload.component.ts +29 -3
  95. package/assets/ts/components/filterlist/filterlist.component.ts +2 -2
  96. package/assets/ts/components/inline-edit/inline-edit.component.ts +3 -3
  97. package/assets/ts/components/multiselect/multiselect.component.ts +4 -3
  98. package/assets/ts/components/notification/notification.component.ts +1 -1
  99. package/assets/ts/components/table/table.component.ts +24 -1
  100. package/assets/ts/modules/carousel.ts +40 -9
  101. package/assets/ts/modules/dialogs.ts +9 -1
  102. package/assets/ts/modules/dynamicEvents.ts +3 -0
  103. package/assets/ts/modules/fileupload.ts +64 -31
  104. package/assets/ts/modules/helpers.ts +6 -0
  105. package/assets/ts/modules/inputs.ts +1 -1
  106. package/assets/ts/modules/table.ts +8 -2
  107. package/dist/components.es.js +546 -611
  108. package/dist/components.umd.js +98 -95
  109. package/dist/style.css +1 -1
  110. package/package.json +3 -3
  111. package/src/components/Card/README.md +1 -0
  112. package/src/components/Carousel/Carousel.vue +5 -1
  113. package/src/components/CollapsibleSideMenu/CollapsibleSideMenu.vue +1 -1
  114. 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
- tableModule.filterTable(this.table, this.form,this);
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
- let lastItemOffset = row.querySelector('.col:last-child').offsetLeft + 50;
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(carouselInner.scrollLeft + scrollArea >= lastItemOffset)
22
- targetSlide = itemCount;
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 == itemCount)
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(`*:nth-child(${target.getAttribute('data-slide')})`);
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 - carouselInner.clientWidth : carouselInner.scrollLeft + carouselInner.clientWidth;
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('input[type="radio"]')) // Weird bug when interacting with radio input fields within dialogs cuases it to close
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 += `<span class="file">${filename} <button data-file="${filename}">Remove</button></span>`;
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
- console.log('submit');
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)');