@iamproperty/components 7.5.1--beta6 → 7.5.1--beta7

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 (187) hide show
  1. package/assets/css/components/actionbar.component.css +1 -1
  2. package/assets/css/components/actionbar.component.css.map +1 -1
  3. package/assets/css/components/address-lookup.component.css +1 -1
  4. package/assets/css/components/address-lookup.component.css.map +1 -1
  5. package/assets/css/components/applied-filters.css +1 -1
  6. package/assets/css/components/applied-filters.css.map +1 -1
  7. package/assets/css/components/calendar.component.css +1 -1
  8. package/assets/css/components/calendar.component.css.map +1 -1
  9. package/assets/css/components/card.component.css +1 -1
  10. package/assets/css/components/card.component.css.map +1 -1
  11. package/assets/css/components/fileupload.css +1 -1
  12. package/assets/css/components/fileupload.css.map +1 -1
  13. package/assets/css/components/input-range.component.css +1 -0
  14. package/assets/css/components/input-range.component.css.map +1 -0
  15. package/assets/css/components/input.component.css +1 -0
  16. package/assets/css/components/input.component.css.map +1 -0
  17. package/assets/css/components/modal.component.css +1 -0
  18. package/assets/css/components/modal.component.css.map +1 -0
  19. package/assets/css/components/multi-step-modal.component.css +1 -0
  20. package/assets/css/components/multi-step-modal.component.css.map +1 -0
  21. package/assets/css/components/multi-step-modal.global.css +1 -0
  22. package/assets/css/components/multi-step-modal.global.css.map +1 -0
  23. package/assets/css/components/multiselect.css +1 -1
  24. package/assets/css/components/multiselect.css.map +1 -1
  25. package/assets/css/components/nav.component.css +1 -1
  26. package/assets/css/components/nav.component.css.map +1 -1
  27. package/assets/css/components/pagination.css +1 -1
  28. package/assets/css/components/pagination.css.map +1 -1
  29. package/assets/css/components/password.component.css +1 -0
  30. package/assets/css/components/password.component.css.map +1 -0
  31. package/assets/css/components/slider.css +1 -1
  32. package/assets/css/components/slider.css.map +1 -1
  33. package/assets/css/components/tabs.component.css +1 -1
  34. package/assets/css/components/tabs.component.css.map +1 -1
  35. package/assets/css/components/tabs.config.css +1 -1
  36. package/assets/css/components/tabs.config.css.map +1 -1
  37. package/assets/css/core.min.css +1 -1
  38. package/assets/css/core.min.css.map +1 -1
  39. package/assets/css/mobile-core.min.css +1 -1
  40. package/assets/css/mobile-core.min.css.map +1 -1
  41. package/assets/css/mobile.min.css +1 -1
  42. package/assets/css/mobile.min.css.map +1 -1
  43. package/assets/css/style.min.css +1 -1
  44. package/assets/css/style.min.css.map +1 -1
  45. package/assets/js/components/accordion/accordion.component.js +1 -1
  46. package/assets/js/components/accordion/accordion.component.min.js +3 -3
  47. package/assets/js/components/accordion/accordion.component.min.js.map +1 -1
  48. package/assets/js/components/actionbar/actionbar.component.js +2 -4
  49. package/assets/js/components/actionbar/actionbar.component.min.js +4 -4
  50. package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
  51. package/assets/js/components/address-lookup/address-lookup.component.js +45 -0
  52. package/assets/js/components/address-lookup/address-lookup.component.min.js +12 -4
  53. package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
  54. package/assets/js/components/advanced-select/advanced-select.component.min.js +1 -1
  55. package/assets/js/components/applied-filters/applied-filters.component.js +0 -2
  56. package/assets/js/components/applied-filters/applied-filters.component.min.js +5 -7
  57. package/assets/js/components/applied-filters/applied-filters.component.min.js.map +1 -1
  58. package/assets/js/components/barchart/barchart.component.min.js +1 -1
  59. package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
  60. package/assets/js/components/calendar/calendar.component.min.js +5 -5
  61. package/assets/js/components/card/card.component.min.js +8 -8
  62. package/assets/js/components/card/card.component.min.js.map +1 -1
  63. package/assets/js/components/carousel/carousel.component.min.js +1 -1
  64. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
  65. package/assets/js/components/content/content.component.min.js +1 -1
  66. package/assets/js/components/darkmode/darkmode.component.min.js +1 -1
  67. package/assets/js/components/doughnutchart/doughnutchart.component.min.js +1 -1
  68. package/assets/js/components/fileupload/fileupload.component.min.js +4 -4
  69. package/assets/js/components/filter-card/filter-card.component.js +19 -0
  70. package/assets/js/components/filter-card/filter-card.component.min.js +4 -4
  71. package/assets/js/components/filter-card/filter-card.component.min.js.map +1 -1
  72. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  73. package/assets/js/components/header/header.component.min.js +1 -1
  74. package/assets/js/components/inline-edit/inline-edit.component.min.js +1 -1
  75. package/assets/js/components/input/input.component.js +128 -0
  76. package/assets/js/components/input/input.component.min.js +16 -0
  77. package/assets/js/components/input/input.component.min.js.map +1 -0
  78. package/assets/js/components/input-range/input-range.component.js +62 -0
  79. package/assets/js/components/input-range/input-range.component.min.js +14 -0
  80. package/assets/js/components/input-range/input-range.component.min.js.map +1 -0
  81. package/assets/js/components/marketing/marketing.component.min.js +1 -1
  82. package/assets/js/components/menu/menu.component.min.js +1 -1
  83. package/assets/js/components/milestone/milestone.component.min.js +1 -1
  84. package/assets/js/components/milestone-group/milestone-group.component.min.js +1 -1
  85. package/assets/js/components/modal/modal.component.js +141 -0
  86. package/assets/js/components/modal/modal.component.min.js +28 -0
  87. package/assets/js/components/modal/modal.component.min.js.map +1 -0
  88. package/assets/js/components/multi-step/multi-step.component.min.js +1 -1
  89. package/assets/js/components/multi-step-modal/multi-step-modal.component.js +233 -0
  90. package/assets/js/components/multi-step-modal/multi-step-modal.component.min.js +17 -0
  91. package/assets/js/components/multi-step-modal/multi-step-modal.component.min.js.map +1 -0
  92. package/assets/js/components/multiselect/multiselect.component.min.js +4 -4
  93. package/assets/js/components/nav/nav.component.min.js +5 -5
  94. package/assets/js/components/nav/nav.component.min.js.map +1 -1
  95. package/assets/js/components/notification/notification.component.min.js +1 -1
  96. package/assets/js/components/pagination/pagination.component.min.js +3 -3
  97. package/assets/js/components/password/password.component.js +93 -0
  98. package/assets/js/components/password/password.component.min.js +17 -0
  99. package/assets/js/components/password/password.component.min.js.map +1 -0
  100. package/assets/js/components/rank/rank.component.min.js +1 -1
  101. package/assets/js/components/rankings/rankings.component.min.js +1 -1
  102. package/assets/js/components/record-card/record-card.component.min.js +4 -4
  103. package/assets/js/components/record-card/record-card.component.min.js.map +1 -1
  104. package/assets/js/components/search/search.component.min.js +1 -1
  105. package/assets/js/components/slider/slider.component.min.js +3 -3
  106. package/assets/js/components/split-button/split-button.component.min.js +1 -1
  107. package/assets/js/components/std-address-lookup/std-address-lookup.component.js +2 -0
  108. package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js +18 -8
  109. package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js.map +1 -1
  110. package/assets/js/components/table/table.component.min.js +3 -3
  111. package/assets/js/components/table/table.component.min.js.map +1 -1
  112. package/assets/js/components/table-ajax/table-ajax.component.min.js +4 -4
  113. package/assets/js/components/table-ajax/table-ajax.component.min.js.map +1 -1
  114. package/assets/js/components/table-basic/table-basic.component.min.js +1 -1
  115. package/assets/js/components/table-basic/table-basic.component.min.js.map +1 -1
  116. package/assets/js/components/table-no-submit/table-no-submit.component.min.js +1 -1
  117. package/assets/js/components/table-no-submit/table-no-submit.component.min.js.map +1 -1
  118. package/assets/js/components/table-submit/table-submit.component.min.js +1 -1
  119. package/assets/js/components/table-submit/table-submit.component.min.js.map +1 -1
  120. package/assets/js/components/tabs/tabs.component.min.js +2 -2
  121. package/assets/js/components/video-card/video-card.component.min.js +4 -4
  122. package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
  123. package/assets/js/components/word-count/word-count.component.min.js +1 -1
  124. package/assets/js/modules/applied-filters.js +78 -61
  125. package/assets/js/modules/card.module.js +6 -1
  126. package/assets/js/modules/dialogs.js +6 -2
  127. package/assets/js/modules/password.js +72 -0
  128. package/assets/js/modules/table.js +10 -6
  129. package/assets/js/scripts.bundle.js +2 -3
  130. package/assets/js/scripts.bundle.js.map +1 -1
  131. package/assets/js/scripts.bundle.min.js +2 -2
  132. package/assets/js/scripts.bundle.min.js.map +1 -1
  133. package/assets/js/scripts.js +0 -2
  134. package/assets/sass/_components.scss +2 -0
  135. package/assets/sass/_elements.scss +2 -0
  136. package/assets/sass/components/actionbar.component.scss +1 -0
  137. package/assets/sass/components/address-lookup.component.scss +20 -0
  138. package/assets/sass/components/applied-filters.scss +10 -14
  139. package/assets/sass/components/input-range.component.scss +38 -0
  140. package/assets/sass/components/input.component.scss +102 -0
  141. package/assets/sass/components/modal.component.scss +269 -0
  142. package/assets/sass/components/multi-step-modal.component.scss +255 -0
  143. package/assets/sass/components/multi-step-modal.global.scss +92 -0
  144. package/assets/sass/components/password.component.scss +60 -0
  145. package/assets/sass/components/tabs.config.scss +2 -2
  146. package/assets/sass/elements/badge-tag.scss +0 -1
  147. package/assets/sass/elements/details.scss +12 -7
  148. package/assets/sass/elements/dialog.scss +46 -5
  149. package/assets/sass/elements/forms.scss +41 -177
  150. package/assets/sass/elements/hr.scss +1 -1
  151. package/assets/sass/elements/modal.scss +19 -21
  152. package/assets/sass/elements/prefix.scss +115 -0
  153. package/assets/ts/components/accordion/accordion.component.ts +1 -1
  154. package/assets/ts/components/actionbar/actionbar.component.ts +3 -10
  155. package/assets/ts/components/address-lookup/address-lookup.component.ts +60 -0
  156. package/assets/ts/components/applied-filters/applied-filters.component.ts +0 -2
  157. package/assets/ts/components/filter-card/filter-card.component.ts +27 -0
  158. package/assets/ts/components/input/input.component.ts +168 -0
  159. package/assets/ts/components/input-range/input-range.component.ts +78 -0
  160. package/assets/ts/components/modal/modal.component.ts +188 -0
  161. package/assets/ts/components/multi-step-modal/multi-step-modal.component.ts +304 -0
  162. package/assets/ts/components/password/password.component.ts +118 -0
  163. package/assets/ts/components/std-address-lookup/std-address-lookup.component.ts +2 -1
  164. package/assets/ts/modules/applied-filters.ts +107 -71
  165. package/assets/ts/modules/card.module.ts +9 -4
  166. package/assets/ts/modules/dialogs.ts +6 -2
  167. package/assets/ts/modules/password.ts +82 -0
  168. package/assets/ts/modules/table.ts +13 -6
  169. package/assets/ts/scripts.ts +2 -2
  170. package/dist/components.es.js +641 -959
  171. package/dist/components.umd.js +275 -182
  172. package/package.json +2 -2
  173. package/src/components/Input/Input.vue +19 -363
  174. package/src/components/InputRange/InputRange.vue +22 -0
  175. package/src/components/Modal/Modal.vue +22 -0
  176. package/src/components/MultiStepModal/MultiStepModal.vue +23 -0
  177. package/src/components/{PasswordIndicator/PasswordIndicator.vue → Password/Password.vue} +23 -23
  178. package/assets/js/components/password-indicator/password-indicator.component.js +0 -19
  179. package/assets/js/components/password-indicator/password-indicator.component.min.js +0 -7
  180. package/assets/js/components/password-indicator/password-indicator.component.min.js.map +0 -1
  181. package/assets/js/modules/form.js +0 -125
  182. package/assets/js/modules/inputs.js +0 -151
  183. package/assets/js/modules/password-indicator.js +0 -21
  184. package/assets/ts/components/password-indicator/password-indicator.component.ts +0 -24
  185. package/assets/ts/modules/form.ts +0 -166
  186. package/assets/ts/modules/inputs.ts +0 -181
  187. package/assets/ts/modules/password-indicator.ts +0 -29
@@ -1,125 +0,0 @@
1
- // Create a link between two input/selects with one acting as setting a minimum value and the second a maximum
2
- // The link between the two will prevent the max input field form setting a lower value than the min and vice versa
3
- function inputRange(inputWrapper) {
4
- inputWrapper.addEventListener('change', function () {
5
- const min = parseInt(inputWrapper.querySelector('[data-min] select,[data-min] input').value);
6
- const max = parseInt(inputWrapper.querySelector('[data-max] select,[data-max] input').value);
7
- // Set attributes for input fields
8
- Array.from(inputWrapper.querySelectorAll('[data-min] input')).forEach((input) => {
9
- input.setAttribute('max', max);
10
- });
11
- Array.from(inputWrapper.querySelectorAll('[data-max] input')).forEach((input) => {
12
- input.setAttribute('min', min);
13
- });
14
- // Hide select options if they are higher or lower than the min and max values
15
- Array.from(inputWrapper.querySelectorAll('[data-min] select option')).forEach((option) => {
16
- if (parseInt(option.getAttribute('value')) > max)
17
- option.classList.add('d-none');
18
- else
19
- option.classList.remove('d-none');
20
- });
21
- Array.from(inputWrapper.querySelectorAll('[data-max] select option')).forEach((option) => {
22
- if (parseInt(option.getAttribute('value')) < min)
23
- option.classList.add('d-none');
24
- else
25
- option.classList.remove('d-none');
26
- });
27
- }, false);
28
- }
29
- function inputRedirect(inputWrapper) {
30
- inputWrapper.addEventListener('change', function () {
31
- if (inputWrapper.matches('[data-value-if]')) {
32
- const url = inputWrapper.getAttribute('data-redirect');
33
- const desiredValue = inputWrapper.getAttribute('data-value-if');
34
- if (inputWrapper.value == desiredValue)
35
- document.location.href = url;
36
- }
37
- else {
38
- if (typeof inputWrapper.value != 'undefined')
39
- document.location.href = inputWrapper.value;
40
- }
41
- }, false);
42
- }
43
- //
44
- function multipleFileUploads(wrapper) {
45
- const fileTenplate = wrapper.querySelector('.row');
46
- const clone = fileTenplate.cloneNode(true);
47
- const addButton = wrapper.querySelector('[data-add]');
48
- wrapper.addEventListener('click', function (e) {
49
- for (let target = e.target; target && target != this; target = target.parentNode) {
50
- if (target.matches('[data-add]')) {
51
- // Add a new row upload file input fields
52
- const tempClone = clone.cloneNode(true);
53
- wrapper.insertBefore(tempClone, target);
54
- if (addButton.matches('[data-maxfiles]') &&
55
- Array.from(wrapper.querySelectorAll(':scope > .row')).length >= addButton.dataset.maxfiles)
56
- addButton.setAttribute('disabled', 'disabled');
57
- break;
58
- }
59
- if (target.matches('[data-delete]')) {
60
- // Delete the current row
61
- const row = target.closest('.row');
62
- row.remove();
63
- if (addButton.matches('[data-maxfiles]') &&
64
- Array.from(wrapper.querySelectorAll(':scope > .row')).length < addButton.dataset.maxfiles)
65
- addButton.removeAttribute('disabled');
66
- break;
67
- }
68
- }
69
- }, false);
70
- }
71
- // Acts as an overall initialise function to trigger other functions.
72
- function form(formElement) {
73
- // Check for input range groups
74
- Array.from(formElement.querySelectorAll('[data-input-range]')).forEach((arrayElement) => {
75
- inputRange(arrayElement);
76
- });
77
- Array.from(formElement.querySelectorAll('[data-redirect]')).forEach((arrayElement) => {
78
- inputRedirect(arrayElement);
79
- });
80
- Array.from(formElement.querySelectorAll('.multiple-file-uploads')).forEach((arrayElement) => {
81
- multipleFileUploads(arrayElement);
82
- });
83
- // Check the file size of a file when uploaded in case it exceeds the max file size set
84
- formElement.addEventListener('change', function (e) {
85
- for (let target = e.target; target && target != this; target = target.parentNode) {
86
- if (target.matches('[type="file"][data-filesize]') && target.files && target.files[0]) {
87
- const maxAllowedSize = target.dataset.filesize;
88
- if (target.files[0].size > maxAllowedSize) {
89
- target.value = '';
90
- alert('File too large');
91
- }
92
- break;
93
- }
94
- }
95
- }, false);
96
- // When a form is updated we may want to update some of the existing input fields; setting active fields when some data is selected.
97
- formElement.addEventListener('change', function () {
98
- // Remove disabled attribute when a pre-selected input field equals a certain value
99
- Array.from(formElement.querySelectorAll('select[data-activeif][data-equals],input[data-activeif][data-equals]')).forEach((arrayElement) => {
100
- const group = arrayElement.closest('[data-group]') ? arrayElement.closest('[data-group]') : formElement;
101
- const selector = arrayElement.dataset.activeif;
102
- const value = arrayElement.dataset.equals;
103
- const testElement = group.querySelector(`select[data-id="${selector}"],input[data-id="${selector}"]`);
104
- if (testElement.value == value) {
105
- arrayElement.removeAttribute('disabled');
106
- }
107
- else {
108
- arrayElement.setAttribute('disabled', 'disabled');
109
- arrayElement.value = '';
110
- }
111
- });
112
- // Show this input wrapper when a pre-selected input field equals a certain value
113
- Array.from(formElement.querySelectorAll('.form-control__wrapper[data-displayif][data-equals]')).forEach((arrayElement) => {
114
- const group = arrayElement.closest('[data-group]') ? arrayElement.closest('[data-group]') : formElement;
115
- const selector = arrayElement.dataset.activeif;
116
- const value = arrayElement.dataset.equals;
117
- const testElement = group.querySelector(`select[data-id="${selector}"],input[data-id="${selector}"]`);
118
- if (testElement.value == value)
119
- arrayElement.classList.remove('d-none');
120
- else
121
- arrayElement.classList.add('d-none');
122
- });
123
- }, false);
124
- }
125
- export default form;
@@ -1,151 +0,0 @@
1
- import hibpCheck from '../vendor/hibp.js';
2
- const extendInputs = (body) => {
3
- function loadInput() {
4
- // Date restrictions
5
- if (document.querySelector('input[type="date"]')) {
6
- const today = new Date();
7
- function formatDate(date) {
8
- const year = date.getFullYear();
9
- const month = String(date.getMonth() + 1).padStart(2, '0');
10
- const day = String(date.getDate()).padStart(2, '0');
11
- return `${year}-${month}-${day}`;
12
- }
13
- Array.from(document.querySelectorAll('input[type="date"]')).forEach((input) => {
14
- const startDate = today;
15
- if (input.hasAttribute('data-start')) {
16
- startDate.setDate(startDate.getDate() + parseInt(input.getAttribute('data-start')));
17
- input.setAttribute('min', formatDate(startDate));
18
- }
19
- if (input.hasAttribute('data-period')) {
20
- const timePeriod = parseInt(input.getAttribute('data-period'));
21
- const endDate = new Date();
22
- endDate.setDate(startDate.getDate() + timePeriod);
23
- input.setAttribute('max', formatDate(endDate));
24
- }
25
- if (input.hasAttribute('data-allowed-days')) {
26
- const allowedDays = JSON.parse(`[${input.getAttribute('data-allowed-days')}]`);
27
- input.addEventListener('input', function () {
28
- const day = new Date(this.value).getUTCDay();
29
- if (allowedDays.includes(day))
30
- input.setCustomValidity('');
31
- else
32
- input.setCustomValidity('That day of the week is not allowed');
33
- });
34
- }
35
- });
36
- }
37
- }
38
- if (document.readyState === 'complete') {
39
- loadInput();
40
- }
41
- document.onreadystatechange = () => {
42
- if (document.readyState === 'complete') {
43
- loadInput();
44
- }
45
- };
46
- body.addEventListener('input', (event) => {
47
- if (event && event.target instanceof HTMLElement && event.target.closest('input,textarea,select')) {
48
- const input = event.target.closest('input,textarea,select');
49
- // Output the color hex
50
- if (input.hasAttribute('type') && input.getAttribute('type') == 'color')
51
- input.nextElementSibling.value = input.value;
52
- if (input.hasAttribute('data-strength-checker'))
53
- checkPWDStrength(input);
54
- }
55
- });
56
- body.addEventListener('change', (event) => {
57
- if (event && event.target instanceof HTMLElement && event.target.closest('select')) {
58
- const select = event.target.closest('select');
59
- if (select.hasAttribute('data-change-type') && select.hasAttribute('data-input')) {
60
- const input = document.getElementById(select.getAttribute('data-input'));
61
- const newType = select.value;
62
- changeType(input, newType);
63
- }
64
- }
65
- if (event && event.target instanceof HTMLElement && event.target.closest('dialog [type="radio"]')) {
66
- const dialog = event.target.closest('dialog');
67
- Array.from(dialog.querySelectorAll('[type="radio"][autofocus]')).forEach((input) => {
68
- input.removeAttribute('autofocus');
69
- });
70
- Array.from(dialog.querySelectorAll('[type="radio"]:checked')).forEach((input) => {
71
- input.setAttribute('autofocus', true);
72
- });
73
- }
74
- });
75
- body.addEventListener('click', (event) => {
76
- if (event &&
77
- event.target instanceof HTMLElement &&
78
- event.target.closest('[data-change-type][data-input]:not(select)')) {
79
- const button = event.target.closest('[data-change-type]');
80
- const input = document.getElementById(button.getAttribute('data-input'));
81
- const newType = button.getAttribute('data-change-type');
82
- button.setAttribute('data-change-type', input.getAttribute('type'));
83
- changeType(input, newType);
84
- if (button.hasAttribute('data-alt-class')) {
85
- const newClass = button.getAttribute('data-alt-class');
86
- button.setAttribute('data-alt-class', button.getAttribute('class'));
87
- button.setAttribute('class', newClass);
88
- }
89
- }
90
- });
91
- };
92
- export const changeType = (input, type) => {
93
- if (input.hasAttribute('type') && input.getAttribute('type') == 'password')
94
- input.setAttribute('data-password-type', true);
95
- input.setAttribute('type', type);
96
- };
97
- export const checkPWDStrength = (input, check = 'no') => {
98
- const pwdChecker = document.getElementById(input.getAttribute('data-strength-checker'));
99
- const password = input.value;
100
- const minChars = input.hasAttribute('minlength') ? input.getAttribute('minlength') : 12;
101
- let strength = 1;
102
- const strengthName = ['Very weak', 'Weak', 'Average', 'Strong', 'Very strong'];
103
- let extraMsg = '';
104
- //has number
105
- if (password.match(/(?=.*[0-9])/))
106
- strength += 1;
107
- // has special character
108
- if (password.match(/(?=.*[!,%,&,#,$,^,*,?,_,~,<,>,])/))
109
- strength += 1;
110
- // has lowercase alpha
111
- if (password.match(/(?=.*[a-z])/))
112
- strength += 1;
113
- // has uppercase alpha
114
- if (password.match(/(?=.*[A-Z])/))
115
- strength += 1;
116
- if (password.length < minChars) {
117
- strength = 1;
118
- extraMsg = `(must be at least ${minChars} characters.)`;
119
- }
120
- // if the strength is above weak and above the minimum length do some kind of api call to check if its in a list of passwords
121
- if (strength >= 3 && check == 'no') {
122
- hibpCheck(password, input);
123
- input.addEventListener('hibpCheck', function (event) {
124
- checkhibpCheck(event, input);
125
- });
126
- function checkhibpCheck(event, input) {
127
- if (event.detail) {
128
- // found
129
- checkPWDStrength(input, 'danger');
130
- }
131
- else {
132
- // not found
133
- checkPWDStrength(input, 'success');
134
- }
135
- input.removeEventListener('hibpCheck', checkhibpCheck); // Succeeds
136
- }
137
- }
138
- else if (strength >= 3 && check == 'danger') {
139
- strength = 3;
140
- extraMsg = `(this password is very common)`;
141
- }
142
- if (pwdChecker) {
143
- if (strength <= 3)
144
- pwdChecker.classList.add('invalid-feedback');
145
- else
146
- pwdChecker.classList.remove('invalid-feedback');
147
- pwdChecker.setAttribute('data-strength', strength);
148
- pwdChecker.innerHTML = `Password strength: ${strengthName[strength - 1]} ${extraMsg}`;
149
- }
150
- };
151
- export default extendInputs;
@@ -1,21 +0,0 @@
1
- export const changeType = function (element) {
2
- var _a;
3
- const buttonEle = element.querySelector('button');
4
- const associatedInput = (_a = element === null || element === void 0 ? void 0 : element.parentNode) === null || _a === void 0 ? void 0 : _a.querySelector('input');
5
- element.addEventListener('click', (event) => {
6
- const currentType = associatedInput.type;
7
- const newType = currentType === 'password' ? 'text' : 'password';
8
- const isPasswordType = currentType === 'password';
9
- associatedInput.setAttribute('type', newType);
10
- associatedInput.setAttribute('data-password-type', isPasswordType);
11
- if (element.hasAttribute('data-alt-class')) {
12
- const newClass = element.getAttribute('data-alt-class');
13
- element.setAttribute('data-alt-class', buttonEle.getAttribute('class'));
14
- buttonEle.setAttribute('class', newClass);
15
- }
16
- });
17
- };
18
- const passwordIndicator = function (element) {
19
- changeType(element);
20
- };
21
- export default passwordIndicator;
@@ -1,24 +0,0 @@
1
- import { trackComponentRegistered } from '../_global';
2
- import passwordIndicator from '../../modules/password-indicator';
3
-
4
- trackComponentRegistered('iam-password-indicator');
5
-
6
- class iamPasswordIndicator extends HTMLElement {
7
- constructor() {
8
- super();
9
- this.attachShadow({ mode: 'open' });
10
-
11
- const template = document.createElement('template');
12
- template.innerHTML = `
13
- <slot></slot>
14
- `;
15
- this.shadowRoot?.appendChild(template.content.cloneNode(true));
16
- }
17
-
18
- connectedCallback(): void {
19
-
20
- passwordIndicator(this);
21
- }
22
- }
23
-
24
- export default iamPasswordIndicator;
@@ -1,166 +0,0 @@
1
- // Create a link between two input/selects with one acting as setting a minimum value and the second a maximum
2
- // The link between the two will prevent the max input field form setting a lower value than the min and vice versa
3
- function inputRange(inputWrapper): void {
4
- inputWrapper.addEventListener(
5
- 'change',
6
- function () {
7
- const min = parseInt(inputWrapper.querySelector('[data-min] select,[data-min] input').value);
8
- const max = parseInt(inputWrapper.querySelector('[data-max] select,[data-max] input').value);
9
-
10
- // Set attributes for input fields
11
- Array.from(inputWrapper.querySelectorAll('[data-min] input')).forEach((input) => {
12
- input.setAttribute('max', max);
13
- });
14
-
15
- Array.from(inputWrapper.querySelectorAll('[data-max] input')).forEach((input) => {
16
- input.setAttribute('min', min);
17
- });
18
-
19
- // Hide select options if they are higher or lower than the min and max values
20
- Array.from(inputWrapper.querySelectorAll('[data-min] select option')).forEach((option) => {
21
- if (parseInt(option.getAttribute('value')) > max) option.classList.add('d-none');
22
- else option.classList.remove('d-none');
23
- });
24
-
25
- Array.from(inputWrapper.querySelectorAll('[data-max] select option')).forEach((option) => {
26
- if (parseInt(option.getAttribute('value')) < min) option.classList.add('d-none');
27
- else option.classList.remove('d-none');
28
- });
29
- },
30
- false
31
- );
32
- }
33
-
34
- function inputRedirect(inputWrapper): void {
35
- inputWrapper.addEventListener(
36
- 'change',
37
- function () {
38
- if (inputWrapper.matches('[data-value-if]')) {
39
- const url = inputWrapper.getAttribute('data-redirect');
40
- const desiredValue = inputWrapper.getAttribute('data-value-if');
41
-
42
- if (inputWrapper.value == desiredValue) document.location.href = url;
43
- } else {
44
- if (typeof inputWrapper.value != 'undefined') document.location.href = inputWrapper.value;
45
- }
46
- },
47
- false
48
- );
49
- }
50
-
51
- //
52
- function multipleFileUploads(wrapper): void {
53
- const fileTenplate = wrapper.querySelector('.row');
54
- const clone = fileTenplate.cloneNode(true);
55
- const addButton = wrapper.querySelector('[data-add]');
56
-
57
- wrapper.addEventListener(
58
- 'click',
59
- function (e) {
60
- for (let target = e.target; target && target != this; target = target.parentNode) {
61
- if (target.matches('[data-add]')) {
62
- // Add a new row upload file input fields
63
-
64
- const tempClone = clone.cloneNode(true);
65
- wrapper.insertBefore(tempClone, target);
66
-
67
- if (
68
- addButton.matches('[data-maxfiles]') &&
69
- Array.from(wrapper.querySelectorAll(':scope > .row')).length >= addButton.dataset.maxfiles
70
- )
71
- addButton.setAttribute('disabled', 'disabled');
72
-
73
- break;
74
- }
75
- if (target.matches('[data-delete]')) {
76
- // Delete the current row
77
-
78
- const row = target.closest('.row');
79
- row.remove();
80
-
81
- if (
82
- addButton.matches('[data-maxfiles]') &&
83
- Array.from(wrapper.querySelectorAll(':scope > .row')).length < addButton.dataset.maxfiles
84
- )
85
- addButton.removeAttribute('disabled');
86
-
87
- break;
88
- }
89
- }
90
- },
91
- false
92
- );
93
- }
94
-
95
- // Acts as an overall initialise function to trigger other functions.
96
- function form(formElement): void {
97
- // Check for input range groups
98
- Array.from(formElement.querySelectorAll('[data-input-range]')).forEach((arrayElement) => {
99
- inputRange(arrayElement);
100
- });
101
-
102
- Array.from(formElement.querySelectorAll('[data-redirect]')).forEach((arrayElement) => {
103
- inputRedirect(arrayElement);
104
- });
105
-
106
- Array.from(formElement.querySelectorAll('.multiple-file-uploads')).forEach((arrayElement) => {
107
- multipleFileUploads(arrayElement);
108
- });
109
-
110
- // Check the file size of a file when uploaded in case it exceeds the max file size set
111
- formElement.addEventListener(
112
- 'change',
113
- function (e) {
114
- for (let target = e.target; target && target != this; target = target.parentNode) {
115
- if (target.matches('[type="file"][data-filesize]') && target.files && target.files[0]) {
116
- const maxAllowedSize = target.dataset.filesize;
117
- if (target.files[0].size > maxAllowedSize) {
118
- target.value = '';
119
- alert('File too large');
120
- }
121
- break;
122
- }
123
- }
124
- },
125
- false
126
- );
127
-
128
- // When a form is updated we may want to update some of the existing input fields; setting active fields when some data is selected.
129
- formElement.addEventListener(
130
- 'change',
131
- function () {
132
- // Remove disabled attribute when a pre-selected input field equals a certain value
133
- Array.from(
134
- formElement.querySelectorAll('select[data-activeif][data-equals],input[data-activeif][data-equals]')
135
- ).forEach((arrayElement) => {
136
- const group = arrayElement.closest('[data-group]') ? arrayElement.closest('[data-group]') : formElement;
137
- const selector = arrayElement.dataset.activeif;
138
- const value = arrayElement.dataset.equals;
139
- const testElement = group.querySelector(`select[data-id="${selector}"],input[data-id="${selector}"]`);
140
-
141
- if (testElement.value == value) {
142
- arrayElement.removeAttribute('disabled');
143
- } else {
144
- arrayElement.setAttribute('disabled', 'disabled');
145
- arrayElement.value = '';
146
- }
147
- });
148
-
149
- // Show this input wrapper when a pre-selected input field equals a certain value
150
- Array.from(formElement.querySelectorAll('.form-control__wrapper[data-displayif][data-equals]')).forEach(
151
- (arrayElement) => {
152
- const group = arrayElement.closest('[data-group]') ? arrayElement.closest('[data-group]') : formElement;
153
- const selector = arrayElement.dataset.activeif;
154
- const value = arrayElement.dataset.equals;
155
- const testElement = group.querySelector(`select[data-id="${selector}"],input[data-id="${selector}"]`);
156
-
157
- if (testElement.value == value) arrayElement.classList.remove('d-none');
158
- else arrayElement.classList.add('d-none');
159
- }
160
- );
161
- },
162
- false
163
- );
164
- }
165
-
166
- export default form;
@@ -1,181 +0,0 @@
1
- import hibpCheck from '../vendor/hibp.js';
2
-
3
- const extendInputs = (body): void => {
4
- function loadInput(): void {
5
-
6
-
7
- // Date restrictions
8
- if (document.querySelector('input[type="date"]')) {
9
- const today = new Date();
10
-
11
- function formatDate(date): string {
12
- const year = date.getFullYear();
13
- const month = String(date.getMonth() + 1).padStart(2, '0');
14
- const day = String(date.getDate()).padStart(2, '0');
15
- return `${year}-${month}-${day}`;
16
- }
17
-
18
- Array.from(document.querySelectorAll('input[type="date"]')).forEach((input) => {
19
- const startDate = today;
20
-
21
- if (input.hasAttribute('data-start')) {
22
- startDate.setDate(startDate.getDate() + parseInt(input.getAttribute('data-start')));
23
- input.setAttribute('min', formatDate(startDate));
24
- }
25
-
26
- if (input.hasAttribute('data-period')) {
27
- const timePeriod = parseInt(input.getAttribute('data-period'));
28
-
29
- const endDate = new Date();
30
- endDate.setDate(startDate.getDate() + timePeriod);
31
-
32
- input.setAttribute('max', formatDate(endDate));
33
- }
34
-
35
- if (input.hasAttribute('data-allowed-days')) {
36
- const allowedDays = JSON.parse(`[${input.getAttribute('data-allowed-days')}]`);
37
-
38
- input.addEventListener('input', function () {
39
- const day = new Date(this.value).getUTCDay();
40
-
41
- if (allowedDays.includes(day)) input.setCustomValidity('');
42
- else input.setCustomValidity('That day of the week is not allowed');
43
- });
44
- }
45
- });
46
- }
47
- }
48
-
49
- if (document.readyState === 'complete') {
50
- loadInput();
51
- }
52
-
53
- document.onreadystatechange = (): void => {
54
- if (document.readyState === 'complete') {
55
- loadInput();
56
- }
57
- };
58
-
59
- body.addEventListener('input', (event) => {
60
- if (event && event.target instanceof HTMLElement && event.target.closest('input,textarea,select')) {
61
- const input = event.target.closest('input,textarea,select');
62
-
63
- // Output the color hex
64
- if (input.hasAttribute('type') && input.getAttribute('type') == 'color')
65
- input.nextElementSibling.value = input.value;
66
-
67
- if (input.hasAttribute('data-strength-checker')) checkPWDStrength(input);
68
- }
69
- });
70
-
71
- body.addEventListener('change', (event) => {
72
- if (event && event.target instanceof HTMLElement && event.target.closest('select')) {
73
- const select = event.target.closest('select');
74
-
75
- if (select.hasAttribute('data-change-type') && select.hasAttribute('data-input')) {
76
- const input = document.getElementById(select.getAttribute('data-input'));
77
- const newType = select.value;
78
- changeType(input, newType);
79
- }
80
- }
81
-
82
- if (event && event.target instanceof HTMLElement && event.target.closest('dialog [type="radio"]')) {
83
- const dialog = event.target.closest('dialog');
84
-
85
- Array.from(dialog.querySelectorAll('[type="radio"][autofocus]')).forEach((input) => {
86
- input.removeAttribute('autofocus');
87
- });
88
-
89
- Array.from(dialog.querySelectorAll('[type="radio"]:checked')).forEach((input) => {
90
- input.setAttribute('autofocus', true);
91
- });
92
- }
93
- });
94
-
95
- body.addEventListener('click', (event) => {
96
- if (
97
- event &&
98
- event.target instanceof HTMLElement &&
99
- event.target.closest('[data-change-type][data-input]:not(select)')
100
- ) {
101
- const button = event.target.closest('[data-change-type]');
102
- const input = document.getElementById(button.getAttribute('data-input'));
103
- const newType = button.getAttribute('data-change-type');
104
- button.setAttribute('data-change-type', input.getAttribute('type'));
105
-
106
- changeType(input, newType);
107
-
108
- if (button.hasAttribute('data-alt-class')) {
109
- const newClass = button.getAttribute('data-alt-class');
110
- button.setAttribute('data-alt-class', button.getAttribute('class'));
111
- button.setAttribute('class', newClass);
112
- }
113
- }
114
- });
115
- };
116
-
117
- export const changeType = (input, type): void => {
118
- if (input.hasAttribute('type') && input.getAttribute('type') == 'password')
119
- input.setAttribute('data-password-type', true);
120
-
121
- input.setAttribute('type', type);
122
- };
123
-
124
- export const checkPWDStrength = (input, check = 'no'): void => {
125
- const pwdChecker = document.getElementById(input.getAttribute('data-strength-checker'));
126
- const password = input.value;
127
- const minChars = input.hasAttribute('minlength') ? input.getAttribute('minlength') : 12;
128
-
129
- let strength = 1;
130
- const strengthName = ['Very weak', 'Weak', 'Average', 'Strong', 'Very strong'];
131
- let extraMsg = '';
132
-
133
- //has number
134
- if (password.match(/(?=.*[0-9])/)) strength += 1;
135
- // has special character
136
- if (password.match(/(?=.*[!,%,&,#,$,^,*,?,_,~,<,>,])/)) strength += 1;
137
- // has lowercase alpha
138
- if (password.match(/(?=.*[a-z])/)) strength += 1;
139
- // has uppercase alpha
140
- if (password.match(/(?=.*[A-Z])/)) strength += 1;
141
-
142
- if (password.length < minChars) {
143
- strength = 1;
144
- extraMsg = `(must be at least ${minChars} characters.)`;
145
- }
146
-
147
- // if the strength is above weak and above the minimum length do some kind of api call to check if its in a list of passwords
148
-
149
- if (strength >= 3 && check == 'no') {
150
- hibpCheck(password, input);
151
-
152
- input.addEventListener('hibpCheck', function (event) {
153
- checkhibpCheck(event, input);
154
- });
155
-
156
- function checkhibpCheck(event, input): void {
157
- if (event.detail) {
158
- // found
159
- checkPWDStrength(input, 'danger');
160
- } else {
161
- // not found
162
- checkPWDStrength(input, 'success');
163
- }
164
-
165
- input.removeEventListener('hibpCheck', checkhibpCheck); // Succeeds
166
- }
167
- } else if (strength >= 3 && check == 'danger') {
168
- strength = 3;
169
- extraMsg = `(this password is very common)`;
170
- }
171
-
172
- if (pwdChecker) {
173
- if (strength <= 3) pwdChecker.classList.add('invalid-feedback');
174
- else pwdChecker.classList.remove('invalid-feedback');
175
-
176
- pwdChecker.setAttribute('data-strength', strength);
177
- pwdChecker.innerHTML = `Password strength: ${strengthName[strength - 1]} ${extraMsg}`;
178
- }
179
- };
180
-
181
- export default extendInputs;