@iamproperty/components 7.5.1--beta2 → 7.5.1--beta4

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 (152) 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/address-lookup.preload.css +1 -0
  6. package/assets/css/components/address-lookup.preload.css.map +1 -0
  7. package/assets/css/components/barchart.component.css +1 -1
  8. package/assets/css/components/barchart.component.css.map +1 -1
  9. package/assets/css/components/calendar.component.css +1 -1
  10. package/assets/css/components/calendar.component.css.map +1 -1
  11. package/assets/css/components/card.component.css +1 -1
  12. package/assets/css/components/card.component.css.map +1 -1
  13. package/assets/css/components/carousel.component.css +1 -1
  14. package/assets/css/components/carousel.component.css.map +1 -1
  15. package/assets/css/components/collapsible-side.css +1 -1
  16. package/assets/css/components/collapsible-side.css.map +1 -1
  17. package/assets/css/components/content.component.css +1 -1
  18. package/assets/css/components/content.component.css.map +1 -1
  19. package/assets/css/components/doughnutchart.component.css +1 -1
  20. package/assets/css/components/doughnutchart.component.css.map +1 -1
  21. package/assets/css/components/fileupload.css +1 -1
  22. package/assets/css/components/fileupload.css.map +1 -1
  23. package/assets/css/components/inline-edit.css +1 -1
  24. package/assets/css/components/inline-edit.css.map +1 -1
  25. package/assets/css/components/multiselect.css +1 -1
  26. package/assets/css/components/multiselect.css.map +1 -1
  27. package/assets/css/components/nav.component.css +1 -1
  28. package/assets/css/components/nav.component.css.map +1 -1
  29. package/assets/css/components/pagination.css +1 -1
  30. package/assets/css/components/pagination.css.map +1 -1
  31. package/assets/css/components/slider.css +1 -1
  32. package/assets/css/components/slider.css.map +1 -1
  33. package/assets/css/components/split-button.component.css +1 -1
  34. package/assets/css/components/split-button.component.css.map +1 -1
  35. package/assets/css/components/table-basic.global.css +1 -1
  36. package/assets/css/components/table-basic.global.css.map +1 -1
  37. package/assets/css/components/table.global.css +1 -1
  38. package/assets/css/components/table.global.css.map +1 -1
  39. package/assets/css/components/tabs.component.css +1 -1
  40. package/assets/css/components/tabs.component.css.map +1 -1
  41. package/assets/css/core.min.css +1 -1
  42. package/assets/css/core.min.css.map +1 -1
  43. package/assets/css/mobile-core.min.css +1 -1
  44. package/assets/css/mobile-core.min.css.map +1 -1
  45. package/assets/css/mobile.min.css +1 -1
  46. package/assets/css/mobile.min.css.map +1 -1
  47. package/assets/css/style.min.css +1 -1
  48. package/assets/css/style.min.css.map +1 -1
  49. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  50. package/assets/js/components/actionbar/actionbar.component.min.js +4 -4
  51. package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
  52. package/assets/js/components/address-lookup/address-lookup.component.js +336 -102
  53. package/assets/js/components/address-lookup/address-lookup.component.min.js +32 -14
  54. package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
  55. package/assets/js/components/advanced-select/advanced-select.component.min.js +3 -3
  56. package/assets/js/components/advanced-select/advanced-select.component.min.js.map +1 -1
  57. package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
  58. package/assets/js/components/barchart/barchart.component.min.js +2 -2
  59. package/assets/js/components/barchart/barchart.component.min.js.map +1 -1
  60. package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
  61. package/assets/js/components/calendar/calendar.component.min.js +5 -5
  62. package/assets/js/components/calendar/calendar.component.min.js.map +1 -1
  63. package/assets/js/components/card/card.component.min.js +2 -2
  64. package/assets/js/components/carousel/carousel.component.min.js +2 -2
  65. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +2 -2
  66. package/assets/js/components/content/content.component.min.js +2 -2
  67. package/assets/js/components/darkmode/darkmode.component.min.js +1 -1
  68. package/assets/js/components/doughnutchart/doughnutchart.component.min.js +2 -2
  69. package/assets/js/components/doughnutchart/doughnutchart.component.min.js.map +1 -1
  70. package/assets/js/components/fileupload/fileupload.component.min.js +4 -4
  71. package/assets/js/components/filter-card/filter-card.component.min.js +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 +3 -3
  75. package/assets/js/components/marketing/marketing.component.min.js +1 -1
  76. package/assets/js/components/menu/menu.component.min.js +1 -1
  77. package/assets/js/components/milestone/milestone.component.min.js +1 -1
  78. package/assets/js/components/milestone-group/milestone-group.component.min.js +1 -1
  79. package/assets/js/components/multi-step/multi-step.component.min.js +1 -1
  80. package/assets/js/components/multiselect/multiselect.component.min.js +4 -4
  81. package/assets/js/components/nav/nav.component.min.js +5 -5
  82. package/assets/js/components/notification/notification.component.min.js +1 -1
  83. package/assets/js/components/pagination/pagination.component.min.js +3 -3
  84. package/assets/js/components/password-indicator/password-indicator.component.min.js +1 -1
  85. package/assets/js/components/rank/rank.component.min.js +1 -1
  86. package/assets/js/components/rankings/rankings.component.min.js +1 -1
  87. package/assets/js/components/record-card/record-card.component.min.js +1 -1
  88. package/assets/js/components/search/search.component.js +65 -25
  89. package/assets/js/components/search/search.component.min.js +5 -5
  90. package/assets/js/components/search/search.component.min.js.map +1 -1
  91. package/assets/js/components/slider/slider.component.min.js +3 -3
  92. package/assets/js/components/split-button/split-button.component.min.js +3 -3
  93. package/assets/js/components/std-address-lookup/std-address-lookup.component.js +1715 -0
  94. package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js +172 -0
  95. package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js.map +1 -0
  96. package/assets/js/components/table/table.component.min.js +2 -2
  97. package/assets/js/components/table/table.component.min.js.map +1 -1
  98. package/assets/js/components/table-ajax/table-ajax.component.min.js +2 -2
  99. package/assets/js/components/table-ajax/table-ajax.component.min.js.map +1 -1
  100. package/assets/js/components/table-basic/table-basic.component.min.js +4 -4
  101. package/assets/js/components/table-basic/table-basic.component.min.js.map +1 -1
  102. package/assets/js/components/table-no-submit/table-no-submit.component.min.js +5 -5
  103. package/assets/js/components/table-no-submit/table-no-submit.component.min.js.map +1 -1
  104. package/assets/js/components/table-submit/table-submit.component.min.js +2 -2
  105. package/assets/js/components/table-submit/table-submit.component.min.js.map +1 -1
  106. package/assets/js/components/tabs/tabs.component.min.js +2 -2
  107. package/assets/js/components/tabs/tabs.component.min.js.map +1 -1
  108. package/assets/js/components/video-card/video-card.component.min.js +1 -1
  109. package/assets/js/components/word-count/word-count.component.min.js +1 -1
  110. package/assets/js/modules/advanced-select.js +35 -26
  111. package/assets/js/modules/helpers.js +19 -3
  112. package/assets/js/scripts.bundle.js +3 -3
  113. package/assets/js/scripts.bundle.js.map +1 -1
  114. package/assets/js/scripts.bundle.min.js +2 -2
  115. package/assets/js/scripts.bundle.min.js.map +1 -1
  116. package/assets/js/tests/helpers.spec.js +26 -0
  117. package/assets/sass/_components.scss +6 -0
  118. package/assets/sass/components/address-lookup.component.scss +91 -5
  119. package/assets/sass/components/address-lookup.preload.scss +81 -0
  120. package/assets/sass/components/table-basic.global.scss +175 -0
  121. package/assets/sass/components/table.global.scss +0 -163
  122. package/assets/sass/elements/buttons--action.scss +26 -0
  123. package/assets/sass/elements/buttons--global.scss +1 -4
  124. package/assets/sass/elements/forms.scss +182 -37
  125. package/assets/ts/components/address-lookup/address-lookup.component.ts +432 -109
  126. package/assets/ts/components/advanced-select/advanced-select.component.ts +1 -0
  127. package/assets/ts/components/search/search.component.ts +86 -27
  128. package/assets/ts/components/std-address-lookup/std-address-lookup.component.ts +1757 -0
  129. package/assets/ts/modules/advanced-select.ts +55 -27
  130. package/assets/ts/modules/helpers.ts +25 -3
  131. package/assets/ts/tests/helpers.spec.ts +38 -0
  132. package/dist/components.es.js +144 -144
  133. package/dist/components.umd.js +376 -191
  134. package/package.json +2 -1
  135. package/src/components/STDAddressLookup/STDAddressLookup.vue +22 -0
  136. /package/assets/js/{tests → ui-tests}/card.spec.js +0 -0
  137. /package/assets/js/{tests → ui-tests}/carousel.spec.js +0 -0
  138. /package/assets/js/{tests → ui-tests}/chart.spec.js +0 -0
  139. /package/assets/js/{tests → ui-tests}/fileupload.spec.js +0 -0
  140. /package/assets/js/{tests → ui-tests}/filterlist.spec.js +0 -0
  141. /package/assets/js/{tests → ui-tests}/multistep.spec.js +0 -0
  142. /package/assets/js/{tests → ui-tests}/slider.spec.js +0 -0
  143. /package/assets/js/{tests → ui-tests}/table.spec.js +0 -0
  144. /package/assets/ts/{tests → ui-tests}/card.spec.ts +0 -0
  145. /package/assets/ts/{tests → ui-tests}/carousel.spec.ts +0 -0
  146. /package/assets/ts/{tests → ui-tests}/chart.spec.ts +0 -0
  147. /package/assets/ts/{tests → ui-tests}/data-layer.spec.js +0 -0
  148. /package/assets/ts/{tests → ui-tests}/fileupload.spec.ts +0 -0
  149. /package/assets/ts/{tests → ui-tests}/filterlist.spec.ts +0 -0
  150. /package/assets/ts/{tests → ui-tests}/multistep.spec.ts +0 -0
  151. /package/assets/ts/{tests → ui-tests}/slider.spec.ts +0 -0
  152. /package/assets/ts/{tests → ui-tests}/table.spec.ts +0 -0
@@ -8,6 +8,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import Cookies from 'js-cookie';
11
+ import advancedSelect from '../../modules/advanced-select.js';
12
+ import { isValidPostcode } from '../../modules/helpers.js';
11
13
  window.dataLayer = window.dataLayer || [];
12
14
  window.dataLayer.push({
13
15
  event: 'customElementRegistered',
@@ -21,7 +23,7 @@ class iamAddressLookup extends HTMLElement {
21
23
  const assetLocation = document.body.hasAttribute('data-assets-location')
22
24
  ? document.body.getAttribute('data-assets-location')
23
25
  : '/assets';
24
- const loadCSS = `@import "${assetLocation}/css/components/address-lookup.css";`;
26
+ const loadCSS = `@import "${assetLocation}/css/components/address-lookup.component.css";`;
25
27
  const template = document.createElement('template');
26
28
  template.innerHTML = `
27
29
  <style>
@@ -31,29 +33,47 @@ class iamAddressLookup extends HTMLElement {
31
33
  <link rel="stylesheet" href="https://kit.fontawesome.com/26fdbf0179.css" crossorigin="anonymous" />
32
34
  <div class="wrapper">
33
35
 
34
- <div class="postcode-lookup">
36
+ <div class="postcode-lookup was-validated">
35
37
  <div>
36
- <label class="mb-2">Search <span class="title text-lowercase"></span> <span class="optional">(Optional)</span>
38
+ <label class="mb-1"><span class="title text-lowercase"></span>
37
39
  <span>
38
- <input type="text" name="postcode" list="address-lookup__addressess" autocomplete="off" aria-autocomplete="none" placeholder="Postcode" part="input" />
39
- <span class="suffix fa-regular fa-search" part="suffix"></span>
40
+ <input type="text" name="postcode" class="${this.hasAttribute('data-input-class') ? this.getAttribute('data-input-class') : ''}" list="address-lookup__addressess" autocomplete="one-time-code" aria-autocomplete="none" placeholder="${(this === null || this === void 0 ? void 0 : this.hasAttribute('data-placeholder')) ? this === null || this === void 0 ? void 0 : this.getAttribute('data-placeholder') : 'Postcode'}" value="${this.hasAttribute('data-postcode-value') ? this.getAttribute('data-postcode-value') : ''}" part="input" />
41
+ <button id="postcode__submit" class="suffix fa-regular fa-search" part="suffix"></button>
40
42
  </span>
41
- <span class="invalid-feedback">Required Adddress fields missing</span>
42
43
  </label>
44
+
45
+ <span class="invalid-feedback mb-2">${this.hasAttribute('data-error-msg') ? this.getAttribute('data-error-msg') : 'Required address fields'}</span>
43
46
 
47
+ <div class="datalist__wrapper ${this.hasAttribute('data-list-class') ? this.getAttribute('data-list-class') : ''}" tabindex="0" part="list-wrapper">
48
+ <slot name="beforeList"></slot>
49
+ <slot name="preloadedList"></slot>
50
+ <datalist id="address-lookup__addressess" class=""></datalist>
51
+ <div id="paginationWrapper"></div>
52
+ <slot name="afterList"></slot>
53
+ </div>
54
+ </div>
55
+ <slot name="hint"></slot>
56
+ <div class="actions">
57
+ <button class="btn btn-tertiary switch-to-manual-btn" type="button" part="manualButton">Or enter address manually</button>
58
+ <slot name="actions"></slot>
44
59
  </div>
45
- <button class="btn btn-tertiary switch-to-manual-btn" type="button" part="button">Or enter address manually</button>
46
60
  </div>
47
- <datalist id="address-lookup__addressess"></datalist>
48
61
 
49
62
  <div class="manual-address pb-2 js-hide">
50
63
  <slot part="contents"></slot>
51
- <button class="btn btn-tertiary switch-to-lookup-btn" type="button" part="button">Use postcode lookup</button>
64
+ <button class="btn btn-tertiary switch-to-lookup-btn" type="button" part="button">${this.hasAttribute('data-postcode-lookup-label') ? this.getAttribute('data-postcode-lookup-label') : 'Use postcode lookup'}</button>
52
65
  <slot name="after"></slot>
53
66
  </div>
54
- <div class="pre-filled pb-2 js-hide">
67
+ <div class="pre-filled p-2 js-hide">
55
68
  <strong class="title text-primary d-block"></strong>
56
- <p><span class="pre-filled-address"></span><button class="text-primary text-decoration-none ms-1 cursor-pointer" type="button" part="edit-button"><i class="fa-regular fa-pen-to-square"></i> <span class="visually-hidden">Edit</span></button><slot name="prefilled"></slot></p>
69
+ <p><span class="pre-filled-address"></span>
70
+ <button class="link m-0 text-primary ms-2 cursor-pointer" type="button" part="edit-button">
71
+ <i class="fa-regular fa-pen-to-square m-0"></i> <span class="visually-hidden">Edit</span>
72
+ </button>
73
+ <button class="link m-0 text-primary ms-2 cursor-pointer" type="button" part="remove-button">
74
+ <i class="fa-regular fa-trash m-0"></i> <span class="visually-hidden">Remove</span>
75
+ </button>
76
+ <slot name="prefilled"></slot></p>
57
77
  </div>
58
78
  </div>
59
79
  `;
@@ -61,126 +81,159 @@ class iamAddressLookup extends HTMLElement {
61
81
  }
62
82
  connectedCallback() {
63
83
  return __awaiter(this, void 0, void 0, function* () {
84
+ var _a, _b, _c;
64
85
  const lookup = this.shadowRoot.querySelector('[name="postcode"]');
65
86
  const lookupWrapper = this.shadowRoot.querySelector('.postcode-lookup');
66
87
  const manualWrapper = this.shadowRoot.querySelector('.manual-address');
67
88
  const preFilledWrapper = this.shadowRoot.querySelector('.pre-filled');
68
- const list = this.shadowRoot.querySelector('datalist');
89
+ const list = this.querySelector('datalist[slot="preloadedList"]') ? this.querySelector('datalist[slot="preloadedList"]') : this.shadowRoot.querySelector('.datalist__wrapper datalist');
90
+ const listWrapper = this.shadowRoot.querySelector('.datalist__wrapper');
69
91
  const switchManualBtn = this.shadowRoot.querySelector('.switch-to-manual-btn');
70
92
  const switchLookupBtn = this.shadowRoot.querySelector('.switch-to-lookup-btn');
71
- const title = this.hasAttribute('data-title') ? this.getAttribute('data-title') : 'Property address';
72
- const preFilledAddressBtn = this.shadowRoot.querySelector('.pre-filled-address + button');
93
+ const title = this.hasAttribute('data-title') ? this.getAttribute('data-title') : 'Find an address';
94
+ const preFilledAddressBtn = this.shadowRoot.querySelector('[part="edit-button"]');
95
+ const preFilledAddressRemoveBtn = this.shadowRoot.querySelector('[part="remove-button"]');
73
96
  const dataDisplayText = this.hasAttribute('data-display-text');
97
+ const postcodeSubmit = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#postcode__submit');
98
+ const errorMsg = (_b = this.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('.invalid-feedback');
99
+ const paginationWrapper = (_c = this.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('#paginationWrapper');
100
+ const minChars = this.hasAttribute('data-min-chars') ? parseInt(this.getAttribute('data-min-chars')) : 3;
101
+ let pageNumber = 1;
102
+ const atleastone = this.querySelector('.atleastone');
74
103
  Array.from(this.shadowRoot.querySelectorAll('.title')).forEach((titleElement) => {
75
104
  titleElement.innerHTML = title;
76
105
  });
106
+ // #region functions
77
107
  function checkFilled(component) {
78
108
  const preFilledAddress = component.shadowRoot.querySelector('.pre-filled-address');
79
109
  let preFilled = true;
80
110
  preFilledAddress.innerHTML = '';
81
111
  Array.from(component.querySelectorAll('input[required],input[data-required],select[required],select[data-required]')).forEach((input) => {
82
- const value = input.value;
83
- if (!value)
84
- preFilled = false;
85
- else
112
+ let value = input.hasAttribute('data-value') ? input.getAttribute('data-value') : input.value;
113
+ if (input.tagName == "SELECT" && component.querySelector(`[value="${input.value}"][data-value]`))
114
+ value = component.querySelector(`[value="${input.value}"][data-value]`).getAttribute('data-value');
115
+ if (!value) {
116
+ if (input.closest('.atleastone')) {
117
+ if (!atleastone.querySelector('input:valid, input.is-valid')) {
118
+ preFilled = false;
119
+ }
120
+ }
121
+ else {
122
+ preFilled = false;
123
+ }
124
+ }
125
+ else {
86
126
  preFilledAddress.innerHTML += value + (/^-?\d+$/.test(value) ? ' ' : ', ');
127
+ }
87
128
  });
88
129
  preFilledAddress.innerHTML = preFilledAddress.innerHTML.slice(0, -2);
130
+ // If has label then use that
89
131
  if (preFilled) {
132
+ if (component.querySelector('[name="label"]'))
133
+ preFilledAddress.innerHTML = component.querySelector('[name="label"]').value;
134
+ // If has label then use that
90
135
  preFilledWrapper.classList.remove('js-hide');
91
136
  lookupWrapper.classList.add('js-hide');
92
137
  manualWrapper.classList.add('js-hide');
93
138
  }
94
139
  }
95
- checkFilled(this);
96
- this.addEventListener('filled', () => {
97
- checkFilled(this);
98
- });
99
- if (this.hasAttribute('data-use')) {
100
- const useLabel = this.hasAttribute('data-use-label') ? this.getAttribute('data-use-label') : 'Use saved address';
101
- const useCheckbox = `<div><input type="checkbox" name="use" id="use" value="yes"><label for="use">${useLabel}</label></div>`;
102
- lookupWrapper.insertAdjacentHTML('afterbegin', useCheckbox);
103
- this.shadowRoot.addEventListener('change', (event) => {
104
- if (event && event.target instanceof HTMLElement && event.target.closest('[name="use"]')) {
105
- const checkbox = event.target.closest('[name="use"]');
106
- if (checkbox.checked) {
107
- lookupWrapper.classList.add('js-hide');
108
- manualWrapper.classList.remove('js-hide');
109
- const values = JSON.parse(this.getAttribute('data-use'));
110
- Object.keys(values).forEach((key) => {
111
- const value = values[key];
112
- if (this.querySelector(`[data-name="${key}"]`))
113
- this.querySelector(`[data-name="${key}"]`).value = value;
114
- else if (this.querySelector(`[name="${key}"]`))
115
- this.querySelector(`[name="${key}"]`).value = value;
116
- });
117
- }
118
- }
119
- });
120
- }
121
- if (this.hasAttribute('data-manual')) {
140
+ function openManualWrapper() {
122
141
  lookupWrapper.classList.add('js-hide');
123
142
  manualWrapper.classList.remove('js-hide');
124
143
  Array.from(manualWrapper.querySelectorAll('[data-required]')).forEach((input) => {
125
144
  input.setAttribute('required', 'true');
126
145
  });
146
+ manualWrapper.scrollIntoView();
127
147
  }
128
- function openManualWrapper() {
148
+ const atleastoneValidate = () => {
149
+ if (atleastone.querySelector('input:valid, input.is-valid')) {
150
+ Array.from(atleastone.querySelectorAll('input')).forEach(element => {
151
+ element.removeAttribute('required');
152
+ });
153
+ }
154
+ else {
155
+ Array.from(atleastone.querySelectorAll('input')).forEach((input) => {
156
+ input.setAttribute('required', 'true');
157
+ });
158
+ }
159
+ };
160
+ const fillInputs = (values) => {
129
161
  lookupWrapper.classList.add('js-hide');
130
162
  manualWrapper.classList.remove('js-hide');
131
- Array.from(manualWrapper.querySelectorAll('[data-required]')).forEach((input) => {
163
+ Object.keys(values).forEach((key) => {
164
+ const value = values[key];
165
+ let input = false;
166
+ if (this.querySelector(`[data-name="${key}"]`))
167
+ input = this.querySelector(`[data-name="${key}"]`);
168
+ else if (this.querySelector(`[data-name-alt="${key}"]`))
169
+ input = this.querySelector(`[data-name-alt="${key}"]`);
170
+ else if (this.querySelector(`[name="${key}"]`))
171
+ input = this.querySelector(`[name="${key}"]`);
172
+ if (input && input.tagName == "SELECT" && value.id) {
173
+ input.value = value.id;
174
+ }
175
+ else if (input && value != '') {
176
+ input.value = value;
177
+ if (input.hasAttribute('data-readonly')) {
178
+ input.setAttribute('readonly', true);
179
+ input.classList.add('is-valid');
180
+ }
181
+ }
182
+ else if (value != "") {
183
+ this.insertAdjacentHTML('beforeend', `<input type="hidden" class="inserted" data-hidden name="${key}" value="${value}" />`);
184
+ }
185
+ if (this.querySelector(`[data-name-2="${key}"]`))
186
+ this.querySelector(`[data-name-2="${key}"]`).value += ' ' + value;
187
+ });
188
+ Array.from(this.querySelectorAll('[data-required]')).forEach((input) => {
132
189
  input.setAttribute('required', 'true');
133
190
  });
134
- manualWrapper.scrollIntoView();
135
- }
136
- preFilledAddressBtn.addEventListener('click', () => {
137
- preFilledWrapper.classList.add('js-hide');
138
- openManualWrapper();
139
- });
140
- switchManualBtn.addEventListener('click', () => {
141
- openManualWrapper();
142
- });
143
- switchLookupBtn.addEventListener('click', () => {
144
- lookupWrapper.classList.remove('js-hide');
145
- manualWrapper.classList.add('js-hide');
146
- lookupWrapper.scrollIntoView();
147
- });
148
- lookup.addEventListener('keyup', () => {
149
- if (lookup.value.length >= 3)
150
- search(lookup.value);
151
- });
152
- lookup.addEventListener('change', () => {
153
- if (lookup.value.length >= 3) {
154
- search(lookup.value);
155
- if (list.querySelector(`[value="${lookup.value}"]`)) {
156
- lookupWrapper.classList.add('js-hide');
157
- manualWrapper.classList.remove('js-hide');
158
- const values = JSON.parse(list.querySelector(`[value="${lookup.value}"]`).getAttribute('data-values'));
159
- Object.keys(values).forEach((key) => {
160
- const value = values[key];
161
- if (this.querySelector(`[data-name="${key}"]`) && value != '')
162
- this.querySelector(`[data-name="${key}"]`).value = value;
163
- else if (this.querySelector(`[data-name-alt="${key}"]`) && value != '')
164
- this.querySelector(`[data-name-alt="${key}"]`).value = value;
165
- else if (this.querySelector(`[name="${key}"]`) && value != '')
166
- this.querySelector(`[name="${key}"]`).value = value;
167
- if (this.querySelector(`[data-name-2="${key}"]`))
168
- this.querySelector(`[data-name-2="${key}"]`).value += ' ' + value;
169
- });
170
- // Focus on first input
171
- this.querySelector('[name]').focus();
191
+ lookup.removeAttribute('required');
192
+ if (atleastone) {
193
+ atleastoneValidate();
194
+ }
195
+ if (!this.hasAttribute('data-force-manual'))
196
+ checkFilled(this);
197
+ };
198
+ const search = (searchValue_1, ...args_1) => __awaiter(this, [searchValue_1, ...args_1], void 0, function* (searchValue, paginate = false) {
199
+ // check if postcode is valid
200
+ const limit = this.hasAttribute('data-limit') ? parseInt(this.getAttribute('data-limit')) : 100;
201
+ if (paginate)
202
+ pageNumber++;
203
+ else
204
+ pageNumber = 1;
205
+ let ajaxURL = this.getAttribute('data-url');
206
+ ajaxURL += `${encodeURI(searchValue)}&page[number]=${pageNumber}&page[size]=${limit}`;
207
+ if (this.hasAttribute('data-url-2')) {
208
+ ajaxURL += this.getAttribute('data-url-2');
209
+ }
210
+ const postcode = searchValue; // TODO: remove when postcode comes from response
211
+ if (this.hasAttribute('data-postcode')) {
212
+ if (!isValidPostcode(searchValue)) {
213
+ return "Invalid postcode, please enter a valid postcode";
214
+ }
215
+ else {
216
+ if (!paginate)
217
+ list.innerHTML = "";
218
+ list === null || list === void 0 ? void 0 : list.classList.add('loading');
219
+ list === null || list === void 0 ? void 0 : list.classList.remove('noresults');
220
+ lookup === null || lookup === void 0 ? void 0 : lookup.classList.remove('is-invalid');
221
+ errorMsg === null || errorMsg === void 0 ? void 0 : errorMsg.innerHTML = "";
222
+ list === null || list === void 0 ? void 0 : list.classList.remove('show-welsh-banner');
172
223
  Array.from(this.querySelectorAll('[data-required]')).forEach((input) => {
173
- input.setAttribute('required', 'true');
224
+ input.removeAttribute('required');
225
+ });
226
+ Array.from(this.querySelectorAll('[data-readonly]')).forEach((input) => {
227
+ input.removeAttribute('readonly');
228
+ input.classList.remove('is-valid');
229
+ });
230
+ Array.from(this.querySelectorAll('.inserted')).forEach((input) => {
231
+ input.remove();
174
232
  });
175
- lookup.removeAttribute('required');
176
- if (this.shadowRoot.querySelector('[name="use"]'))
177
- this.shadowRoot.querySelector('[name="use"]').checked = false;
178
233
  }
179
234
  }
180
- });
181
- const search = (postcode) => __awaiter(this, void 0, void 0, function* () {
182
- let ajaxURL = this.getAttribute('data-url');
183
- ajaxURL += `${encodeURI(postcode)}`;
235
+ this.classList.add('searched');
236
+ this.classList.add('was-validated');
184
237
  // Setup controller vars if not already set
185
238
  if (!window.controller)
186
239
  window.controller = [];
@@ -191,7 +244,7 @@ class iamAddressLookup extends HTMLElement {
191
244
  window.controller[ajaxURL] = new AbortController();
192
245
  const { signal } = controller[ajaxURL];
193
246
  try {
194
- yield fetch(ajaxURL, {
247
+ return yield fetch(ajaxURL, {
195
248
  signal: signal,
196
249
  method: 'get',
197
250
  credentials: 'same-origin',
@@ -204,39 +257,220 @@ class iamAddressLookup extends HTMLElement {
204
257
  })
205
258
  .then((response) => response.json())
206
259
  .then((response) => {
260
+ var _a;
207
261
  // populate datalist
208
262
  let listString = '';
209
- response.forEach((address) => {
263
+ const addresses = response['data'] ? response['data'] : response;
264
+ addresses.forEach((address) => {
210
265
  // Deal with agent platform response
211
- if (typeof address.value == 'object') {
266
+ if (typeof address.attributes == 'object' && address.attributes.label) {
267
+ const values = JSON.stringify(address.attributes);
268
+ listString += `<option data-values='${values}' >${address.attributes.label}</option>`;
269
+ }
270
+ else if (typeof address.value == 'object') {
212
271
  const values = JSON.stringify(address.value);
213
- listString += `<option value="${address['label']}, ${postcode}" data-values='${values}'></option>`;
272
+ listString += `<option data-values='${values}'>${address['label']}, ${postcode}</option>`;
214
273
  }
215
274
  else {
216
275
  const values = JSON.stringify(address);
217
276
  if (dataDisplayText) {
218
- listString += `<option value="${address[dataDisplayText]}, ${postcode}" data-values='${values}'></option>`;
277
+ listString += `<option data-values='${values}'>${address[dataDisplayText]}, ${postcode}</option>`;
219
278
  }
220
279
  else {
221
280
  let itemString = '';
222
281
  for (const [key, value] of Object.entries(address)) {
223
282
  if (key == 'address_number_name')
224
283
  itemString += `${value} `;
225
- else if (key != 'postcode' && key != 'address_title')
284
+ else if (key != 'postcode' && key != 'address_title' && key != 'group')
226
285
  itemString += `${value}${/^-?\d+$/.test(value) ? '' : ','} `;
227
286
  }
228
- listString += `<option value="${itemString}${postcode}" data-values='${values}'></option>`;
287
+ listString += `<option data-values='${values}'>${itemString}, ${postcode}</option>`; // TODO postcode should come from the response
229
288
  }
230
289
  }
231
290
  });
232
- list.innerHTML = listString;
233
- return response;
291
+ if (paginate)
292
+ list.innerHTML += listString;
293
+ else
294
+ list.innerHTML = listString;
295
+ if (addresses.length) {
296
+ list === null || list === void 0 ? void 0 : list.classList.remove('loading');
297
+ }
298
+ else {
299
+ list === null || list === void 0 ? void 0 : list.classList.remove('loading');
300
+ list === null || list === void 0 ? void 0 : list.classList.add('noresults');
301
+ }
302
+ // pagination
303
+ if (response.meta && response.meta.current_page && response.meta.total_pages && response.meta.total_pages > response.meta.current_page) {
304
+ paginationWrapper === null || paginationWrapper === void 0 ? void 0 : paginationWrapper.innerHTML = `<div class="bg-light text-center p-2"><p class="m-0">Showing 1-${response.meta.current_page * limit} of ${response.meta.total_results} addresses <br /><button type="button" data-next="${response.meta.current_page + 1}" class="mt-1 mb-0 btn btn-action"><i class="fa-regular fa-eye me-1"></i>Show more addresses</button></p></div>`;
305
+ }
306
+ else {
307
+ paginationWrapper === null || paginationWrapper === void 0 ? void 0 : paginationWrapper.innerHTML = '';
308
+ }
309
+ if (response.meta && response.meta.welsh_language) {
310
+ list === null || list === void 0 ? void 0 : list.classList.add('show-welsh-banner');
311
+ }
312
+ listWrapper === null || listWrapper === void 0 ? void 0 : listWrapper.focus();
313
+ (_a = list === null || list === void 0 ? void 0 : list.querySelector('option')) === null || _a === void 0 ? void 0 : _a.focus();
314
+ return true;
234
315
  });
235
316
  }
236
317
  catch (error) {
237
318
  console.log(error);
319
+ return "There has been a problem. Please try again in a few moments.";
238
320
  }
239
321
  });
322
+ // #endregion
323
+ // #region check attributes and trigger functions
324
+ if (!this.hasAttribute('data-force-manual'))
325
+ checkFilled(this);
326
+ this.addEventListener('filled', () => {
327
+ if (!this.hasAttribute('data-force-manual'))
328
+ checkFilled(this);
329
+ });
330
+ if (this.hasAttribute('data-use')) {
331
+ const useLabel = this.hasAttribute('data-use-label') ? this.getAttribute('data-use-label') : 'Use saved address';
332
+ const useCheckbox = `<div><input type="checkbox" name="use" id="use" value="yes"><label for="use">${useLabel}</label></div>`;
333
+ lookupWrapper.insertAdjacentHTML('afterbegin', useCheckbox);
334
+ this.shadowRoot.addEventListener('change', (event) => {
335
+ if (event && event.target instanceof HTMLElement && event.target.closest('[name="use"]')) {
336
+ const checkbox = event.target.closest('[name="use"]');
337
+ if (checkbox.checked) {
338
+ lookupWrapper.classList.add('js-hide');
339
+ manualWrapper.classList.remove('js-hide');
340
+ const values = JSON.parse(this.getAttribute('data-use'));
341
+ Object.keys(values).forEach((key) => {
342
+ const value = values[key];
343
+ if (this.querySelector(`[data-name="${key}"]`))
344
+ this.querySelector(`[data-name="${key}"]`).value = value;
345
+ else if (this.querySelector(`[name="${key}"]`))
346
+ this.querySelector(`[name="${key}"]`).value = value;
347
+ });
348
+ }
349
+ }
350
+ });
351
+ if (this.hasAttribute('data-use-default')) {
352
+ lookupWrapper.querySelector('[name="use"]').checked = true;
353
+ const values = JSON.parse(this.getAttribute('data-use'));
354
+ fillInputs(values);
355
+ }
356
+ }
357
+ if (this.hasAttribute('data-manual')) {
358
+ fillInputs({});
359
+ }
360
+ if (this.classList.contains('show-pagination'))
361
+ paginationWrapper === null || paginationWrapper === void 0 ? void 0 : paginationWrapper.innerHTML = `<div class="bg-light text-center p-2"><p class="m-0">Showing 1-500 of 585 addresses <br /><button type="button" data-next="2" class="mt-1 mb-0 btn btn-action"><i class="fa-regular fa-eye me-1"></i>Show more addresses</button></p></div>`;
362
+ if (this.classList.contains('scroll-to-bottom-results'))
363
+ paginationWrapper.scrollIntoView({ container: 'nearest' });
364
+ // #endregion
365
+ // #region event listeners
366
+ preFilledAddressBtn.addEventListener('click', () => {
367
+ preFilledWrapper.classList.add('js-hide');
368
+ openManualWrapper();
369
+ });
370
+ preFilledAddressRemoveBtn.addEventListener('click', () => {
371
+ preFilledWrapper.classList.add('js-hide');
372
+ lookupWrapper.classList.remove('js-hide');
373
+ manualWrapper.classList.add('js-hide');
374
+ list.innerHTML = "";
375
+ list === null || list === void 0 ? void 0 : list.classList.remove('loading');
376
+ list === null || list === void 0 ? void 0 : list.classList.remove('noresults');
377
+ lookup === null || lookup === void 0 ? void 0 : lookup.classList.remove('is-invalid');
378
+ errorMsg === null || errorMsg === void 0 ? void 0 : errorMsg.innerHTML = "";
379
+ list === null || list === void 0 ? void 0 : list.classList.remove('show-welsh-banner');
380
+ lookup.focus();
381
+ lookup.value = "";
382
+ if (lookup === null || lookup === void 0 ? void 0 : lookup.hasAttribute('data-placeholder'))
383
+ lookup.setAttribute('placeholder', lookup === null || lookup === void 0 ? void 0 : lookup.getAttribute('data-placeholder'));
384
+ const updateEvent = new CustomEvent('switch-to-lookup');
385
+ this.dispatchEvent(updateEvent);
386
+ lookupWrapper.scrollIntoView();
387
+ });
388
+ switchManualBtn.addEventListener('click', () => {
389
+ openManualWrapper();
390
+ });
391
+ this.addEventListener('open-manual', () => {
392
+ openManualWrapper();
393
+ });
394
+ switchLookupBtn.addEventListener('click', () => {
395
+ lookupWrapper.classList.remove('js-hide');
396
+ manualWrapper.classList.add('js-hide');
397
+ const updateEvent = new CustomEvent('switch-to-lookup');
398
+ this.dispatchEvent(updateEvent);
399
+ lookupWrapper.scrollIntoView();
400
+ });
401
+ lookup.addEventListener('keyup', (e) => __awaiter(this, void 0, void 0, function* () {
402
+ if (![40, 38, 13].includes(e.keyCode) && lookup.value.length >= minChars) {
403
+ const valid = yield search(lookup.value);
404
+ if (valid != true) {
405
+ lookup === null || lookup === void 0 ? void 0 : lookup.classList.add('is-invalid');
406
+ errorMsg === null || errorMsg === void 0 ? void 0 : errorMsg.innerHTML = valid;
407
+ }
408
+ }
409
+ if (e.keyCode == 13) {
410
+ const valid = yield search(lookup.value);
411
+ if (valid != true) {
412
+ lookup === null || lookup === void 0 ? void 0 : lookup.classList.add('is-invalid');
413
+ errorMsg === null || errorMsg === void 0 ? void 0 : errorMsg.innerHTML = valid;
414
+ }
415
+ }
416
+ }));
417
+ lookup.addEventListener('change', () => __awaiter(this, void 0, void 0, function* () {
418
+ if (lookup.value.length >= minChars) {
419
+ const valid = yield search(lookup.value);
420
+ if (valid != true) {
421
+ lookup === null || lookup === void 0 ? void 0 : lookup.classList.add('is-invalid');
422
+ errorMsg === null || errorMsg === void 0 ? void 0 : errorMsg.innerHTML = valid;
423
+ }
424
+ }
425
+ }));
426
+ list.addEventListener('click', (e) => {
427
+ if (e.target.tagName == "OPTION") {
428
+ const values = JSON.parse(e.target.getAttribute('data-values'));
429
+ fillInputs(values);
430
+ if (this.shadowRoot.querySelector('[name="use"]'))
431
+ this.shadowRoot.querySelector('[name="use"]').checked = false;
432
+ }
433
+ });
434
+ atleastone === null || atleastone === void 0 ? void 0 : atleastone.addEventListener('input', (e) => {
435
+ Array.from(atleastone.querySelectorAll('[data-required]')).forEach((input) => {
436
+ input.setAttribute('required', 'true');
437
+ });
438
+ atleastoneValidate();
439
+ });
440
+ postcodeSubmit === null || postcodeSubmit === void 0 ? void 0 : postcodeSubmit.addEventListener('click', () => __awaiter(this, void 0, void 0, function* () {
441
+ const valid = yield search(lookup.value);
442
+ if (valid != true) {
443
+ lookup === null || lookup === void 0 ? void 0 : lookup.classList.add('is-invalid');
444
+ errorMsg === null || errorMsg === void 0 ? void 0 : errorMsg.innerHTML = valid;
445
+ }
446
+ }));
447
+ this === null || this === void 0 ? void 0 : this.addEventListener('search', () => __awaiter(this, void 0, void 0, function* () {
448
+ const valid = yield search(lookup.value);
449
+ if (valid != true) {
450
+ lookup === null || lookup === void 0 ? void 0 : lookup.classList.add('is-invalid');
451
+ errorMsg === null || errorMsg === void 0 ? void 0 : errorMsg.innerHTML = valid;
452
+ }
453
+ }));
454
+ this === null || this === void 0 ? void 0 : this.addEventListener('close-button-pressed', () => {
455
+ list.innerHTML = "";
456
+ list === null || list === void 0 ? void 0 : list.classList.remove('loading');
457
+ list === null || list === void 0 ? void 0 : list.classList.remove('noresults');
458
+ lookup === null || lookup === void 0 ? void 0 : lookup.classList.remove('is-invalid');
459
+ errorMsg === null || errorMsg === void 0 ? void 0 : errorMsg.innerHTML = "";
460
+ list === null || list === void 0 ? void 0 : list.classList.remove('show-welsh-banner');
461
+ lookup.focus();
462
+ });
463
+ paginationWrapper === null || paginationWrapper === void 0 ? void 0 : paginationWrapper.addEventListener('click', (e) => __awaiter(this, void 0, void 0, function* () {
464
+ if (e.target.tagName == "BUTTON") {
465
+ const valid = yield search(lookup.value, true);
466
+ if (valid != true) {
467
+ lookup === null || lookup === void 0 ? void 0 : lookup.classList.add('is-invalid');
468
+ errorMsg === null || errorMsg === void 0 ? void 0 : errorMsg.innerHTML = valid;
469
+ }
470
+ }
471
+ }));
472
+ // #endregion
473
+ advancedSelect(this, lookup, list, true);
240
474
  });
241
475
  }
242
476
  }