@iamproperty/components 5.6.1-beta9 → 5.7.0

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 (92) 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/carousel.css +1 -1
  4. package/assets/css/components/carousel.css.map +1 -1
  5. package/assets/css/components/fileupload.css +1 -1
  6. package/assets/css/components/fileupload.css.map +1 -1
  7. package/assets/css/components/pagination.css +1 -1
  8. package/assets/css/components/pagination.css.map +1 -1
  9. package/assets/css/components/tabs.css +1 -1
  10. package/assets/css/components/tabs.css.map +1 -1
  11. package/assets/css/core.min.css +1 -1
  12. package/assets/css/core.min.css.map +1 -1
  13. package/assets/css/style.min.css +1 -1
  14. package/assets/css/style.min.css.map +1 -1
  15. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  16. package/assets/js/components/actionbar/actionbar.component.min.js +3 -3
  17. package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
  18. package/assets/js/components/address-lookup/address-lookup.component.js +21 -10
  19. package/assets/js/components/address-lookup/address-lookup.component.min.js +6 -5
  20. package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
  21. package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
  22. package/assets/js/components/card/card.component.js +39 -20
  23. package/assets/js/components/card/card.component.min.js +19 -19
  24. package/assets/js/components/card/card.component.min.js.map +1 -1
  25. package/assets/js/components/carousel/carousel.component.js +14 -1
  26. package/assets/js/components/carousel/carousel.component.min.js +5 -5
  27. package/assets/js/components/carousel/carousel.component.min.js.map +1 -1
  28. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
  29. package/assets/js/components/fileupload/fileupload.component.js +16 -0
  30. package/assets/js/components/fileupload/fileupload.component.min.js +7 -5
  31. package/assets/js/components/fileupload/fileupload.component.min.js.map +1 -1
  32. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  33. package/assets/js/components/header/header.component.min.js +1 -1
  34. package/assets/js/components/inline-edit/inline-edit.component.js +2 -2
  35. package/assets/js/components/inline-edit/inline-edit.component.min.js +3 -3
  36. package/assets/js/components/inline-edit/inline-edit.component.min.js.map +1 -1
  37. package/assets/js/components/marketing/marketing.component.min.js +1 -1
  38. package/assets/js/components/multiselect/multiselect.component.min.js +1 -1
  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 +3 -3
  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/slider/slider.component.min.js +1 -1
  45. package/assets/js/components/table/table.component.js +16 -1
  46. package/assets/js/components/table/table.component.min.js +4 -4
  47. package/assets/js/components/table/table.component.min.js.map +1 -1
  48. package/assets/js/components/tabs/tabs.component.js +3 -1
  49. package/assets/js/components/tabs/tabs.component.min.js +8 -6
  50. package/assets/js/components/tabs/tabs.component.min.js.map +1 -1
  51. package/assets/js/dynamic.min.js +4 -4
  52. package/assets/js/dynamic.min.js.map +1 -1
  53. package/assets/js/modules/carousel.js +30 -8
  54. package/assets/js/modules/dialogs.js +6 -0
  55. package/assets/js/modules/fileupload.js +44 -12
  56. package/assets/js/modules/helpers.js +30 -0
  57. package/assets/js/modules/inputs.js +1 -1
  58. package/assets/js/modules/table.js +6 -1
  59. package/assets/js/modules/tabs.js +84 -1
  60. package/assets/js/scripts.bundle.js +34 -32
  61. package/assets/js/scripts.bundle.js.map +1 -1
  62. package/assets/js/scripts.bundle.min.js +2 -2
  63. package/assets/js/scripts.bundle.min.js.map +1 -1
  64. package/assets/sass/_components.scss +14 -0
  65. package/assets/sass/components/address-lookup.scss +4 -0
  66. package/assets/sass/components/carousel.scss +31 -7
  67. package/assets/sass/components/fileupload.scss +0 -10
  68. package/assets/sass/components/pagination.scss +11 -16
  69. package/assets/sass/components/tabs.scss +38 -3
  70. package/assets/sass/elements/admin-panel.scss +44 -6
  71. package/assets/sass/elements/dialog.scss +1 -1
  72. package/assets/sass/elements/forms.scss +3 -2
  73. package/assets/ts/components/address-lookup/address-lookup.component.ts +25 -11
  74. package/assets/ts/components/card/card.component.ts +49 -23
  75. package/assets/ts/components/carousel/carousel.component.ts +17 -1
  76. package/assets/ts/components/fileupload/fileupload.component.ts +26 -0
  77. package/assets/ts/components/inline-edit/inline-edit.component.ts +2 -2
  78. package/assets/ts/components/table/table.component.ts +24 -1
  79. package/assets/ts/components/tabs/tabs.component.ts +3 -1
  80. package/assets/ts/modules/carousel.ts +40 -9
  81. package/assets/ts/modules/dialogs.ts +8 -0
  82. package/assets/ts/modules/fileupload.ts +64 -20
  83. package/assets/ts/modules/helpers.ts +29 -0
  84. package/assets/ts/modules/inputs.ts +1 -1
  85. package/assets/ts/modules/table.ts +8 -2
  86. package/assets/ts/modules/tabs.ts +116 -1
  87. package/dist/components.es.js +199 -193
  88. package/dist/components.umd.js +78 -68
  89. package/dist/style.css +1 -1
  90. package/package.json +1 -1
  91. package/src/components/Card/Card.vue +1 -1
  92. package/src/components/Carousel/Carousel.vue +5 -1
@@ -4,13 +4,26 @@ function fileupload(fileupload, wrapper) {
4
4
  const dropArea = wrapper.querySelector('.drop-area');
5
5
  const input = fileupload.querySelector('input');
6
6
  const maxSize = fileupload.hasAttribute('data-maxsize') ? fileupload.getAttribute('data-maxsize') : 0;
7
+ const errorMsgSize = wrapper.querySelector('.invalid-feedback.size');
8
+ const errorMsgExt = wrapper.querySelector('.invalid-feedback.ext');
7
9
  // We clone the input field to work as a buffer input field, this allows us to add new files without losing the old ones
8
10
  const cloneInput = input.cloneNode();
9
11
  dropArea.append(cloneInput);
12
+ let checkFileExt = function (filename) {
13
+ if (!input.hasAttribute('accept'))
14
+ return true;
15
+ const nameExtension = filename.split('.').pop();
16
+ const acceptedTypes = input.getAttribute('accept');
17
+ if (acceptedTypes.includes(nameExtension))
18
+ return true;
19
+ return false;
20
+ };
10
21
  wrapper.addEventListener('click', (event) => {
11
22
  if (event && event.target instanceof HTMLElement && event.target.closest('.btn-primary')) {
12
23
  const button = event.target.closest('.btn-primary');
13
24
  // If the input allows multiples then use the buffer clone input
25
+ errorMsgExt.classList.remove('d-block');
26
+ errorMsgSize.classList.remove('d-block');
14
27
  const inputTrigger = input.hasAttribute('multiple') ? cloneInput : input;
15
28
  inputTrigger.click();
16
29
  }
@@ -26,14 +39,8 @@ function fileupload(fileupload, wrapper) {
26
39
  dt.items.add(file); // here you exclude the file. thus removing it.
27
40
  }
28
41
  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
- }
33
42
  const changeEvent = new Event('change');
34
43
  input.dispatchEvent(changeEvent);
35
- const elementChangeEvent = new Event('elementChange');
36
- fileupload.dispatchEvent(elementChangeEvent);
37
44
  }
38
45
  });
39
46
  // Buffer input change event
@@ -45,8 +52,14 @@ function fileupload(fileupload, wrapper) {
45
52
  for (let i = 0; i < filesArray.length; i++) {
46
53
  const file = filesArray[i];
47
54
  const size = file.size / 1000;
48
- if (!fileNames.includes(file.name) && (maxSize == 0 || size < maxSize))
55
+ if (!fileNames.includes(file.name) && (maxSize == 0 || size < maxSize) && checkFileExt(file.name))
49
56
  dt.items.add(file); // here you exclude the file. thus removing it.
57
+ if (!checkFileExt(file.name)) {
58
+ errorMsgExt.classList.add('d-block');
59
+ }
60
+ if (size > maxSize) {
61
+ errorMsgSize.classList.add('d-block');
62
+ }
50
63
  fileNames.push(file.name);
51
64
  }
52
65
  input.files = dt.files;
@@ -56,8 +69,6 @@ function fileupload(fileupload, wrapper) {
56
69
  }
57
70
  const changeEvent = new Event('change');
58
71
  input.dispatchEvent(changeEvent);
59
- const elementChangeEvent = new Event('elementChange');
60
- fileupload.dispatchEvent(elementChangeEvent);
61
72
  });
62
73
  cloneInput.addEventListener('dragenter', (event) => {
63
74
  cloneInput.classList.add('focus');
@@ -69,15 +80,36 @@ function fileupload(fileupload, wrapper) {
69
80
  cloneInput.classList.remove('focus');
70
81
  });
71
82
  input.addEventListener('change', (event) => {
83
+ if (input.files.length == 1) {
84
+ let file = input.files[0];
85
+ const size = file.size / 1000;
86
+ if (!checkFileExt(file.name)) {
87
+ errorMsgExt.classList.add('d-block');
88
+ const dt = new DataTransfer();
89
+ input.files = dt.files;
90
+ }
91
+ if (size > maxSize) {
92
+ errorMsgSize.classList.add('d-block');
93
+ const dt = new DataTransfer();
94
+ input.files = dt.files;
95
+ }
96
+ }
72
97
  // Reset
73
98
  filesWrapper.innerHTML = '';
74
- for (const file of input.files)
75
- filesWrapper.innerHTML += `<span class="file">${file.name} <button data-file="${file.name}">Remove</button></span>`;
99
+ for (const file of input.files) {
100
+ filesWrapper.innerHTML += `<span class="file" part="file">${file.name} <button data-file="${file.name}">Remove</button></span>`;
101
+ }
102
+ const elementChangeEvent = new CustomEvent('elementchange', { detail: { "files": input.files } });
103
+ fileupload.dispatchEvent(elementChangeEvent);
104
+ if (input.files.length == 0) {
105
+ const emptyEvent = new CustomEvent('empty');
106
+ fileupload.dispatchEvent(emptyEvent);
107
+ }
76
108
  });
77
109
  if (fileupload.hasAttribute('data-filename')) {
78
110
  let filename = fileupload.getAttribute('data-filename');
79
111
  if (filename)
80
- filesWrapper.innerHTML += `<span class="file">${filename} <button data-file="${filename}">Remove</button></span>`;
112
+ filesWrapper.innerHTML = `<span class="file">${filename} <button data-file="${filename}">Remove</button></span>`;
81
113
  }
82
114
  }
83
115
  export default fileupload;
@@ -114,3 +114,33 @@ export const numberOfDays = function (startDateString, endDateString) {
114
114
  // Used to get values from nested json objects
115
115
  export const resolvePath = (object, path, defaultValue) => path.split(/[\.\[\]\'\"]/).filter(p => p).reduce((o, p) => o ? o[p] : defaultValue, object);
116
116
  export const isTraversable = o => Array.isArray(o) || o !== null && ['function', 'object'].includes(typeof o);
117
+ export const getSwipeDirection = (touchstartX, touchstartY, touchendX, touchendY) => {
118
+ const limit = Math.tan(45 * 1.5 / 180 * Math.PI);
119
+ let pageWidth = window.innerWidth || document.body.clientWidth;
120
+ let treshold = Math.max(1, Math.floor(0.01 * (pageWidth)));
121
+ let x = touchendX - touchstartX;
122
+ let y = touchendY - touchstartY;
123
+ let xy = Math.abs(x / y);
124
+ let yx = Math.abs(y / x);
125
+ if (Math.abs(x) > treshold || Math.abs(y) > treshold) {
126
+ if (yx <= limit) {
127
+ if (x < 0) {
128
+ return "left";
129
+ }
130
+ else {
131
+ return "right";
132
+ }
133
+ }
134
+ if (xy <= limit) {
135
+ if (y < 0) {
136
+ return "top";
137
+ }
138
+ else {
139
+ return "bottom";
140
+ }
141
+ }
142
+ }
143
+ else {
144
+ return "tap";
145
+ }
146
+ };
@@ -3,7 +3,7 @@ import hibpCheck from '../vendor/hibp.js';
3
3
  const extendInputs = (body) => {
4
4
  function loadInput() {
5
5
  // maxlength counter init
6
- Array.from(document.querySelectorAll('input[maxlength]')).forEach((input, index) => {
6
+ Array.from(document.querySelectorAll('input[maxlength],textarea[maxlength]')).forEach((input, index) => {
7
7
  let wrapper = input.parentElement;
8
8
  setMaxlengthVars(input, wrapper);
9
9
  });
@@ -108,7 +108,9 @@ 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
+ if (wrapper.hasAttribute('data-no-submit')) {
112
+ return false;
113
+ }
112
114
  if (form.classList.contains('processing'))
113
115
  return false;
114
116
  Array.from(form.querySelectorAll('iam-applied-filters')).forEach((element, index) => {
@@ -609,6 +611,9 @@ export const populateDataQueries = (table, form, wrapper) => {
609
611
  };
610
612
  // Pagination
611
613
  export const addPaginationEventListeners = function (table, form, pagination, wrapper) {
614
+ if (wrapper.hasAttribute('data-no-submit')) {
615
+ return false;
616
+ }
612
617
  pagination.addEventListener('update-page', (event) => {
613
618
  let paginationInput = form.querySelector('[data-pagination]');
614
619
  let newPage = event.detail.page;
@@ -1,4 +1,5 @@
1
1
  // @ts-nocheck
2
+ import { getSwipeDirection } from './helpers.js';
2
3
  export const createTabsLinks = function (tabsElement) {
3
4
  const details = tabsElement.querySelectorAll(':scope > details');
4
5
  const detailsORLinks = tabsElement.querySelectorAll(':scope > details, :scope > a');
@@ -46,19 +47,56 @@ export const createTabsLinks = function (tabsElement) {
46
47
  export const setTabsEventHandlers = function (tabsElement) {
47
48
  let details = tabsElement.querySelectorAll(':scope > details');
48
49
  let summaries = tabsElement.querySelectorAll(':scope > details > summary');
50
+ let buttonWrapper = tabsElement.querySelector(':scope .tabs__links');
49
51
  let buttons = tabsElement.querySelectorAll(':scope .tabs__links > button');
50
- if (tabsElement.shadowRoot)
52
+ let nextButton = tabsElement.querySelector(':scope .tabs__next');
53
+ var scrollTimeout;
54
+ let isScrolled = false;
55
+ let isClicked = false;
56
+ if (tabsElement.shadowRoot) {
51
57
  buttons = tabsElement.shadowRoot.querySelectorAll('.tabs__links > button');
58
+ buttonWrapper = tabsElement.shadowRoot.querySelector('.tabs__links');
59
+ nextButton = tabsElement.shadowRoot.querySelector(':scope .tabs__next');
60
+ }
61
+ buttonWrapper.addEventListener('scroll', function (e) {
62
+ if (isClicked) {
63
+ isClicked = false;
64
+ return false;
65
+ }
66
+ clearTimeout(scrollTimeout);
67
+ let buttonToClick = buttons[0];
68
+ scrollTimeout = setTimeout(function () {
69
+ let closestOffset = Math.abs(buttonToClick.getBoundingClientRect().left);
70
+ buttons.forEach((button) => {
71
+ if (Math.abs(button.getBoundingClientRect().left) < closestOffset) {
72
+ closestOffset = Math.abs(button.getBoundingClientRect().left);
73
+ buttonToClick = button;
74
+ }
75
+ });
76
+ isScrolled = true;
77
+ buttonToClick.click();
78
+ buttonToClick.focus();
79
+ }, 100);
80
+ }, false);
52
81
  // Set the on click for the tab buttons, these will open the details box it matches too
53
82
  buttons.forEach((button) => {
54
83
  button.addEventListener("click", (e) => {
55
84
  e.preventDefault();
85
+ isClicked = true;
56
86
  if (button.classList.contains('disabled'))
57
87
  return false;
58
88
  buttons.forEach((buttonLoopItem) => {
59
89
  let buttonPressed = buttonLoopItem == button ? true : false;
60
90
  buttonLoopItem.setAttribute('aria-pressed', buttonPressed);
61
91
  });
92
+ if (!isScrolled) {
93
+ buttonWrapper.scroll({
94
+ top: 0,
95
+ left: button.offsetLeft,
96
+ behavior: 'smooth'
97
+ });
98
+ }
99
+ isScrolled = false;
62
100
  details.forEach((detail, detailsIndex) => {
63
101
  let detailsOpen = button.getAttribute('data-index') == detailsIndex ? true : false;
64
102
  if (detailsOpen)
@@ -66,6 +104,12 @@ export const setTabsEventHandlers = function (tabsElement) {
66
104
  else
67
105
  detail.removeAttribute('open');
68
106
  });
107
+ if (button.matches(':last-child')) {
108
+ nextButton.setAttribute('disabled', 'disabled');
109
+ }
110
+ else {
111
+ nextButton.removeAttribute('disabled');
112
+ }
69
113
  // Data layer Open Event
70
114
  window.dataLayer = window.dataLayer || [];
71
115
  window.dataLayer.push({
@@ -81,6 +125,45 @@ export const setTabsEventHandlers = function (tabsElement) {
81
125
  buttons[index].click();
82
126
  });
83
127
  });
128
+ nextButton.addEventListener("click", (e) => {
129
+ e.preventDefault();
130
+ let currentTab = buttonWrapper.querySelector('[aria-pressed="true"]');
131
+ let nextTab = currentTab.nextSibling;
132
+ if (nextTab)
133
+ nextTab.click();
134
+ });
135
+ if (tabsElement.classList.contains('tabs--guided')) {
136
+ var touchstartX = 0;
137
+ var touchstartY = 0;
138
+ var touchendX = 0;
139
+ var touchendY = 0;
140
+ details.forEach((detail) => {
141
+ detail.addEventListener("touchstart", (event) => {
142
+ event.stopPropagation();
143
+ touchstartX = event.changedTouches[0].screenX;
144
+ touchstartY = event.changedTouches[0].screenY;
145
+ });
146
+ detail.addEventListener("touchend", (event) => {
147
+ event.stopPropagation();
148
+ touchendX = event.changedTouches[0].screenX;
149
+ touchendY = event.changedTouches[0].screenY;
150
+ let direction = getSwipeDirection(touchstartX, touchstartY, touchendX, touchendY);
151
+ let currentTab = buttonWrapper.querySelector('[aria-pressed="true"]');
152
+ switch (direction) {
153
+ case 'left':
154
+ let nextTab = currentTab.nextSibling;
155
+ if (nextTab)
156
+ nextTab.click();
157
+ break;
158
+ case 'right':
159
+ let prevTab = currentTab.previousSibling;
160
+ if (prevTab)
161
+ prevTab.click();
162
+ break;
163
+ }
164
+ });
165
+ });
166
+ }
84
167
  };
85
168
  export const openFirstTab = function (tabsElement) {
86
169
  if (!tabsElement.querySelector(':scope > details'))