@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.
- package/assets/css/components/actionbar.component.css +1 -1
- package/assets/css/components/actionbar.component.css.map +1 -1
- package/assets/css/components/address-lookup.component.css +1 -1
- package/assets/css/components/address-lookup.component.css.map +1 -1
- package/assets/css/components/address-lookup.preload.css +1 -0
- package/assets/css/components/address-lookup.preload.css.map +1 -0
- package/assets/css/components/barchart.component.css +1 -1
- package/assets/css/components/barchart.component.css.map +1 -1
- package/assets/css/components/calendar.component.css +1 -1
- package/assets/css/components/calendar.component.css.map +1 -1
- package/assets/css/components/card.component.css +1 -1
- package/assets/css/components/card.component.css.map +1 -1
- package/assets/css/components/carousel.component.css +1 -1
- package/assets/css/components/carousel.component.css.map +1 -1
- package/assets/css/components/collapsible-side.css +1 -1
- package/assets/css/components/collapsible-side.css.map +1 -1
- package/assets/css/components/content.component.css +1 -1
- package/assets/css/components/content.component.css.map +1 -1
- package/assets/css/components/doughnutchart.component.css +1 -1
- package/assets/css/components/doughnutchart.component.css.map +1 -1
- package/assets/css/components/fileupload.css +1 -1
- package/assets/css/components/fileupload.css.map +1 -1
- package/assets/css/components/inline-edit.css +1 -1
- package/assets/css/components/inline-edit.css.map +1 -1
- package/assets/css/components/multiselect.css +1 -1
- package/assets/css/components/multiselect.css.map +1 -1
- package/assets/css/components/nav.component.css +1 -1
- package/assets/css/components/nav.component.css.map +1 -1
- package/assets/css/components/pagination.css +1 -1
- package/assets/css/components/pagination.css.map +1 -1
- package/assets/css/components/slider.css +1 -1
- package/assets/css/components/slider.css.map +1 -1
- package/assets/css/components/split-button.component.css +1 -1
- package/assets/css/components/split-button.component.css.map +1 -1
- package/assets/css/components/table-basic.global.css +1 -1
- package/assets/css/components/table-basic.global.css.map +1 -1
- package/assets/css/components/table.global.css +1 -1
- package/assets/css/components/table.global.css.map +1 -1
- package/assets/css/components/tabs.component.css +1 -1
- package/assets/css/components/tabs.component.css.map +1 -1
- package/assets/css/core.min.css +1 -1
- package/assets/css/core.min.css.map +1 -1
- package/assets/css/mobile-core.min.css +1 -1
- package/assets/css/mobile-core.min.css.map +1 -1
- package/assets/css/mobile.min.css +1 -1
- package/assets/css/mobile.min.css.map +1 -1
- package/assets/css/style.min.css +1 -1
- package/assets/css/style.min.css.map +1 -1
- package/assets/js/components/accordion/accordion.component.min.js +1 -1
- package/assets/js/components/actionbar/actionbar.component.min.js +4 -4
- package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
- package/assets/js/components/address-lookup/address-lookup.component.js +336 -102
- package/assets/js/components/address-lookup/address-lookup.component.min.js +32 -14
- package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
- package/assets/js/components/advanced-select/advanced-select.component.min.js +3 -3
- package/assets/js/components/advanced-select/advanced-select.component.min.js.map +1 -1
- package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
- package/assets/js/components/barchart/barchart.component.min.js +2 -2
- package/assets/js/components/barchart/barchart.component.min.js.map +1 -1
- package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
- package/assets/js/components/calendar/calendar.component.min.js +5 -5
- package/assets/js/components/calendar/calendar.component.min.js.map +1 -1
- package/assets/js/components/card/card.component.min.js +2 -2
- package/assets/js/components/carousel/carousel.component.min.js +2 -2
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js +2 -2
- package/assets/js/components/content/content.component.min.js +2 -2
- package/assets/js/components/darkmode/darkmode.component.min.js +1 -1
- package/assets/js/components/doughnutchart/doughnutchart.component.min.js +2 -2
- package/assets/js/components/doughnutchart/doughnutchart.component.min.js.map +1 -1
- package/assets/js/components/fileupload/fileupload.component.min.js +4 -4
- package/assets/js/components/filter-card/filter-card.component.min.js +1 -1
- package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
- package/assets/js/components/header/header.component.min.js +1 -1
- package/assets/js/components/inline-edit/inline-edit.component.min.js +3 -3
- package/assets/js/components/marketing/marketing.component.min.js +1 -1
- package/assets/js/components/menu/menu.component.min.js +1 -1
- package/assets/js/components/milestone/milestone.component.min.js +1 -1
- package/assets/js/components/milestone-group/milestone-group.component.min.js +1 -1
- package/assets/js/components/multi-step/multi-step.component.min.js +1 -1
- package/assets/js/components/multiselect/multiselect.component.min.js +4 -4
- package/assets/js/components/nav/nav.component.min.js +5 -5
- package/assets/js/components/notification/notification.component.min.js +1 -1
- package/assets/js/components/pagination/pagination.component.min.js +3 -3
- package/assets/js/components/password-indicator/password-indicator.component.min.js +1 -1
- package/assets/js/components/rank/rank.component.min.js +1 -1
- package/assets/js/components/rankings/rankings.component.min.js +1 -1
- package/assets/js/components/record-card/record-card.component.min.js +1 -1
- package/assets/js/components/search/search.component.js +65 -25
- package/assets/js/components/search/search.component.min.js +5 -5
- package/assets/js/components/search/search.component.min.js.map +1 -1
- package/assets/js/components/slider/slider.component.min.js +3 -3
- package/assets/js/components/split-button/split-button.component.min.js +3 -3
- package/assets/js/components/std-address-lookup/std-address-lookup.component.js +1715 -0
- package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js +172 -0
- package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js.map +1 -0
- package/assets/js/components/table/table.component.min.js +2 -2
- package/assets/js/components/table/table.component.min.js.map +1 -1
- package/assets/js/components/table-ajax/table-ajax.component.min.js +2 -2
- package/assets/js/components/table-ajax/table-ajax.component.min.js.map +1 -1
- package/assets/js/components/table-basic/table-basic.component.min.js +4 -4
- package/assets/js/components/table-basic/table-basic.component.min.js.map +1 -1
- package/assets/js/components/table-no-submit/table-no-submit.component.min.js +5 -5
- package/assets/js/components/table-no-submit/table-no-submit.component.min.js.map +1 -1
- package/assets/js/components/table-submit/table-submit.component.min.js +2 -2
- package/assets/js/components/table-submit/table-submit.component.min.js.map +1 -1
- package/assets/js/components/tabs/tabs.component.min.js +2 -2
- package/assets/js/components/tabs/tabs.component.min.js.map +1 -1
- package/assets/js/components/video-card/video-card.component.min.js +1 -1
- package/assets/js/components/word-count/word-count.component.min.js +1 -1
- package/assets/js/modules/advanced-select.js +35 -26
- package/assets/js/modules/helpers.js +19 -3
- package/assets/js/scripts.bundle.js +3 -3
- package/assets/js/scripts.bundle.js.map +1 -1
- package/assets/js/scripts.bundle.min.js +2 -2
- package/assets/js/scripts.bundle.min.js.map +1 -1
- package/assets/js/tests/helpers.spec.js +26 -0
- package/assets/sass/_components.scss +6 -0
- package/assets/sass/components/address-lookup.component.scss +91 -5
- package/assets/sass/components/address-lookup.preload.scss +81 -0
- package/assets/sass/components/table-basic.global.scss +175 -0
- package/assets/sass/components/table.global.scss +0 -163
- package/assets/sass/elements/buttons--action.scss +26 -0
- package/assets/sass/elements/buttons--global.scss +1 -4
- package/assets/sass/elements/forms.scss +182 -37
- package/assets/ts/components/address-lookup/address-lookup.component.ts +432 -109
- package/assets/ts/components/advanced-select/advanced-select.component.ts +1 -0
- package/assets/ts/components/search/search.component.ts +86 -27
- package/assets/ts/components/std-address-lookup/std-address-lookup.component.ts +1757 -0
- package/assets/ts/modules/advanced-select.ts +55 -27
- package/assets/ts/modules/helpers.ts +25 -3
- package/assets/ts/tests/helpers.spec.ts +38 -0
- package/dist/components.es.js +144 -144
- package/dist/components.umd.js +376 -191
- package/package.json +2 -1
- package/src/components/STDAddressLookup/STDAddressLookup.vue +22 -0
- /package/assets/js/{tests → ui-tests}/card.spec.js +0 -0
- /package/assets/js/{tests → ui-tests}/carousel.spec.js +0 -0
- /package/assets/js/{tests → ui-tests}/chart.spec.js +0 -0
- /package/assets/js/{tests → ui-tests}/fileupload.spec.js +0 -0
- /package/assets/js/{tests → ui-tests}/filterlist.spec.js +0 -0
- /package/assets/js/{tests → ui-tests}/multistep.spec.js +0 -0
- /package/assets/js/{tests → ui-tests}/slider.spec.js +0 -0
- /package/assets/js/{tests → ui-tests}/table.spec.js +0 -0
- /package/assets/ts/{tests → ui-tests}/card.spec.ts +0 -0
- /package/assets/ts/{tests → ui-tests}/carousel.spec.ts +0 -0
- /package/assets/ts/{tests → ui-tests}/chart.spec.ts +0 -0
- /package/assets/ts/{tests → ui-tests}/data-layer.spec.js +0 -0
- /package/assets/ts/{tests → ui-tests}/fileupload.spec.ts +0 -0
- /package/assets/ts/{tests → ui-tests}/filterlist.spec.ts +0 -0
- /package/assets/ts/{tests → ui-tests}/multistep.spec.ts +0 -0
- /package/assets/ts/{tests → ui-tests}/slider.spec.ts +0 -0
- /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-
|
|
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="
|
|
39
|
-
<
|
|
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"
|
|
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
|
|
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
|
|
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') : '
|
|
72
|
-
const preFilledAddressBtn = this.shadowRoot.querySelector('
|
|
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
|
-
|
|
83
|
-
if (
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
if (
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
263
|
+
const addresses = response['data'] ? response['data'] : response;
|
|
264
|
+
addresses.forEach((address) => {
|
|
210
265
|
// Deal with agent platform response
|
|
211
|
-
if (typeof address.
|
|
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
|
|
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
|
|
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
|
|
287
|
+
listString += `<option data-values='${values}'>${itemString}, ${postcode}</option>`; // TODO postcode should come from the response
|
|
229
288
|
}
|
|
230
289
|
}
|
|
231
290
|
});
|
|
232
|
-
|
|
233
|
-
|
|
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
|
}
|