From a07c062c290459074e495d881ee9cf857bc7b5fd Mon Sep 17 00:00:00 2001 From: Vladyslav Kuksiuk Date: Wed, 12 Aug 2026 17:01:50 +0200 Subject: [PATCH 01/17] Update checkout page. --- site/assets/js/modules/paygate/purchases.js | 5 +- .../js/pages/checkout/charge-controller.js | 20 +- .../js/pages/checkout/charge-request.js | 36 ++ .../js/pages/checkout/completed-page-url.js | 76 +++ site/assets/js/pages/checkout/completed.js | 204 +++++++ .../js/pages/checkout/completion-order-id.js | 36 ++ site/assets/js/pages/checkout/countries.js | 47 ++ site/assets/js/pages/checkout/dom.js | 2 + .../js/pages/checkout/form-controller.js | 71 ++- site/assets/js/pages/checkout/index.js | 47 +- site/assets/js/pages/checkout/phone-codes.js | 13 + .../js/pages/checkout/view-controller.js | 42 +- site/assets/scss/pages/_checkout.scss | 448 +++++++------- site/content/checkout-completed/index.md | 4 +- site/layouts/checkout-completed/single.html | 107 +++- site/layouts/checkout/single.html | 502 ++++++++-------- site/package.json | 2 +- site/tests/checkout-completed.test.mjs | 561 ++++++++++++++++++ site/tests/checkout-configuration.test.mjs | 86 +++ 19 files changed, 1736 insertions(+), 573 deletions(-) create mode 100644 site/assets/js/pages/checkout/charge-request.js create mode 100644 site/assets/js/pages/checkout/completed-page-url.js create mode 100644 site/assets/js/pages/checkout/completed.js create mode 100644 site/assets/js/pages/checkout/completion-order-id.js create mode 100644 site/assets/js/pages/checkout/countries.js create mode 100644 site/tests/checkout-completed.test.mjs create mode 100644 site/tests/checkout-configuration.test.mjs diff --git a/site/assets/js/modules/paygate/purchases.js b/site/assets/js/modules/paygate/purchases.js index 6c10dbb1..a1b73be8 100644 --- a/site/assets/js/modules/paygate/purchases.js +++ b/site/assets/js/modules/paygate/purchases.js @@ -49,7 +49,8 @@ * @property {string} orderId paygate order ID * @property {string} productTitle product display title * @property {string} productDescription product description shown on checkout - * @property {boolean} paymentCompleted whether the order was already paid + * @property {string} [paymentStatus] current known payment status + * @property {boolean} completed whether the order was already paid */ /** @@ -202,7 +203,7 @@ export function createPurchaseClient(serverUrl) { * @throws {PurchaseApiError} if response status is not OK */ async function getJson(url) { - const response = await fetch(url); + const response = await fetch(url, {cache: 'no-store'}); const body = await readResponseBody(response); if (!response.ok) { diff --git a/site/assets/js/pages/checkout/charge-controller.js b/site/assets/js/pages/checkout/charge-controller.js index cc06fa81..5e3e2158 100644 --- a/site/assets/js/pages/checkout/charge-controller.js +++ b/site/assets/js/pages/checkout/charge-controller.js @@ -33,6 +33,7 @@ */ import {createDelayedRequestController} from 'js/pages/checkout/delayed-request-controller'; +import {buildChargeRequest} from 'js/pages/checkout/charge-request'; import {fieldValidationState} from 'js/pages/checkout/form-controller'; /** @@ -128,9 +129,9 @@ export function createChargeController( * @param {boolean} state.isRequesting whether a charge request is currently in flight */ function updateVatIdState({hasCurrentResult, isRequesting}) { - const hasRequestKey = Boolean(getRequestKey()); + const hasVatId = Boolean(getVatId()); - if (!hasRequestKey) { + if (!hasVatId) { onFieldValidationStateChange(fieldValidationState.idle); return; } @@ -155,15 +156,12 @@ export function createChargeController( const buyerCountryCode = getBuyerCountryCode(); const vatId = getVatId(); - if (!orderId || !buyerCountryCode || !vatId) { + const payload = buildChargeRequest(orderId, buyerCountryCode, vatId); + if (!payload) { return null; } - return purchaseClient.calculateCharges({ - orderId, - buyerCountryCode, - vatId - }); + return purchaseClient.calculateCharges(payload); } /** @@ -175,9 +173,7 @@ export function createChargeController( const buyerCountryCode = getBuyerCountryCode(); const vatId = getVatId(); - return buyerCountryCode && vatId - ? [buyerCountryCode, vatId].join(':') - : ''; + return buyerCountryCode ? [buyerCountryCode, vatId].join(':') : ''; } /** @@ -212,7 +208,7 @@ export function createChargeController( * @return {boolean} true when the error is a Paygate VAT validation response */ function isVatErrorResponse(error) { - return error.status === 422 && Boolean(error.body.vatIdInvalid); + return error.status === 422 && Boolean(error.body && error.body.vatIdInvalid); } /** diff --git a/site/assets/js/pages/checkout/charge-request.js b/site/assets/js/pages/checkout/charge-request.js new file mode 100644 index 00000000..f9aa1d51 --- /dev/null +++ b/site/assets/js/pages/checkout/charge-request.js @@ -0,0 +1,36 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +/** + * Builds a Paygate charge-calculation request for the current buyer inputs. + * + * @param {string} orderId Paygate order ID + * @param {string} buyerCountryCode billing country ISO code + * @param {string} vatId optional VAT ID + * @return {Object|null} request body, or null while required inputs are absent + */ +export function buildChargeRequest(orderId, buyerCountryCode, vatId) { + if (!orderId || !buyerCountryCode) { + return null; + } + + return vatId + ? {orderId, buyerCountryCode, vatId} + : {orderId, buyerCountryCode}; +} + diff --git a/site/assets/js/pages/checkout/completed-page-url.js b/site/assets/js/pages/checkout/completed-page-url.js new file mode 100644 index 00000000..ade12d13 --- /dev/null +++ b/site/assets/js/pages/checkout/completed-page-url.js @@ -0,0 +1,76 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +/** + * Builds Spine's payment-result URL from its checkout URL. + * + * @param {string} currentUrl absolute checkout URL + * @param {string} orderId Paygate order ID + * @return {string} absolute payment-result URL + */ +export function getCompletedPageUrl(currentUrl, orderId) { + const completedUrl = new URL(currentUrl); + const checkoutPath = /\/checkout\/?$/; + const checkoutFile = /\/checkout(\.[^./]+)$/; + + if (checkoutPath.test(completedUrl.pathname)) { + completedUrl.pathname = completedUrl.pathname.replace( + checkoutPath, + '/checkout-completed/' + ); + } else if (checkoutFile.test(completedUrl.pathname)) { + completedUrl.pathname = completedUrl.pathname.replace( + checkoutFile, + '/checkout-completed$1' + ); + } else { + return ''; + } + completedUrl.search = ''; + completedUrl.searchParams.set('orderId', orderId); + completedUrl.hash = ''; + return completedUrl.href; +} + +/** + * Builds Spine's checkout URL from its payment-result URL. + * + * @param {string} currentUrl absolute payment-result URL + * @param {string} orderId Paygate order ID + * @return {string} absolute checkout URL, or an empty string for an unsupported path + */ +export function getCheckoutPageUrl(currentUrl, orderId) { + const checkoutUrl = new URL(currentUrl); + const completedPath = /\/checkout-completed\/?$/; + const completedFile = /\/checkout-completed(\.[^./]+)$/; + + if (completedPath.test(checkoutUrl.pathname)) { + checkoutUrl.pathname = checkoutUrl.pathname.replace(completedPath, '/checkout/'); + } else if (completedFile.test(checkoutUrl.pathname)) { + checkoutUrl.pathname = checkoutUrl.pathname.replace( + completedFile, + '/checkout$1' + ); + } else { + return ''; + } + checkoutUrl.search = ''; + checkoutUrl.searchParams.set('orderId', orderId); + checkoutUrl.hash = ''; + return checkoutUrl.href; +} diff --git a/site/assets/js/pages/checkout/completed.js b/site/assets/js/pages/checkout/completed.js new file mode 100644 index 00000000..c264c407 --- /dev/null +++ b/site/assets/js/pages/checkout/completed.js @@ -0,0 +1,204 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +import * as params from '@params'; +import {createPurchaseClient} from 'js/modules/paygate/purchases'; +import {getCheckoutPageUrl} from 'js/pages/checkout/completed-page-url'; +import {getCompletionOrderId} from 'js/pages/checkout/completion-order-id'; + +const pollingIntervalsMs = [3000, 5000, 10000, 30000]; +const failuresBeforeErrorView = 3; +const notFoundResponsesBeforeResult = 2; +const maxPollingDurationMs = 15 * 60 * 1000; +const unsuccessfulTerminalStatuses = new Set(['ABANDONED', 'FAILED', 'VOIDED']); +const viewIds = Object.freeze({ + IN_PROGRESS: 'payment-in-progress', + COMPLETED: 'payment-completed', + FAILED: 'payment-failed', + REFUNDED: 'payment-refunded', + CHARGED_BACK: 'payment-charged-back', + STATUS_ERROR: 'payment-status-error', + NOT_FOUND: 'payment-order-not-found', + UNKNOWN: 'payment-status-unknown' +}); + +init(); + +/** Starts resolving the payment result represented by the current URL. */ +function init() { + if (!document.querySelector('[data-payment-status-page]')) { + return; + } + + const orderId = getCompletionOrderId(window.location, window.history); + if (!orderId) { + return; + } + configureBackToCheckoutLink(orderId); + + const paygateUrl = params.payment && params.payment.paygateurl; + if (!paygateUrl) { + return; + } + + let purchaseClient; + try { + purchaseClient = createPurchaseClient(paygateUrl); + } catch (error) { + logApiError(error); + return; + } + + let consecutiveFailures = 0; + let consecutiveNotFoundResponses = 0; + let pollingIntervalIndex = 0; + let pollingTimerId; + let stopped = false; + const pollingDeadlineMs = Date.now() + maxPollingDurationMs; + const deadlineTimerId = window.setTimeout(reachPollingDeadline, maxPollingDurationMs); + + showView(viewIds.IN_PROGRESS); + pollPaymentStatus(); + + /** Reads the order until Paygate reports a terminal payment status. */ + async function pollPaymentStatus() { + pollingTimerId = undefined; + if (stopped) { + return; + } + + try { + const order = await purchaseClient.getOrder(orderId); + if (stopped) { + return; + } + + consecutiveFailures = 0; + consecutiveNotFoundResponses = 0; + + if (order.paymentStatus === 'SETTLED' || (!order.paymentStatus && order.completed)) { + finishWithView(viewIds.COMPLETED); + return; + } + if (unsuccessfulTerminalStatuses.has(order.paymentStatus)) { + finishWithView(viewIds.FAILED); + return; + } + if (order.paymentStatus === 'REFUNDED') { + finishWithView(viewIds.REFUNDED); + return; + } + if (order.paymentStatus === 'CHARGED_BACK') { + finishWithView(viewIds.CHARGED_BACK); + return; + } + + showView(viewIds.IN_PROGRESS); + } catch (error) { + if (stopped) { + return; + } + + if (error.status === 404) { + consecutiveNotFoundResponses += 1; + consecutiveFailures = 0; + if (consecutiveNotFoundResponses >= notFoundResponsesBeforeResult) { + finishWithView(viewIds.NOT_FOUND); + return; + } + } else { + consecutiveNotFoundResponses = 0; + consecutiveFailures += 1; + if (consecutiveFailures >= failuresBeforeErrorView) { + showView(viewIds.STATUS_ERROR); + } + } + logApiError(error); + } + + scheduleNextPoll(); + } + + /** Schedules the next attempt using a backoff capped at 30 seconds. */ + function scheduleNextPoll() { + const remainingDurationMs = pollingDeadlineMs - Date.now(); + if (remainingDurationMs <= 0) { + finishWithView(viewIds.UNKNOWN); + return; + } + + const delay = pollingIntervalsMs[pollingIntervalIndex]; + if (pollingIntervalIndex < pollingIntervalsMs.length - 1) { + pollingIntervalIndex += 1; + } + pollingTimerId = window.setTimeout( + pollPaymentStatus, + Math.min(delay, remainingDurationMs) + ); + } + + /** Stops polling when its maximum duration is reached. */ + function reachPollingDeadline() { + finishWithView(viewIds.UNKNOWN); + } + + /** Stops all timers and shows the final page view. */ + function finishWithView(viewId) { + if (stopped) { + return; + } + stopped = true; + if (pollingTimerId !== undefined) { + window.clearTimeout(pollingTimerId); + } + window.clearTimeout(deadlineTimerId); + showView(viewId); + } +} + +/** Makes the failed-payment action navigate back to the same order. */ +function configureBackToCheckoutLink(orderId) { + const link = document.querySelector('#payment-failed .result-panel-button'); + if (!link) { + return; + } + + const checkoutUrl = getCheckoutPageUrl(window.location.href, orderId); + if (checkoutUrl) { + link.href = checkoutUrl; + link.hidden = false; + } +} + +/** Shows one payment-status view and hides every other view. */ +function showView(activeViewId) { + Object.values(viewIds).forEach(viewId => { + const view = document.getElementById(viewId); + if (view) { + view.hidden = viewId !== activeViewId; + } + }); +} + +/** Logs an API failure without exposing response data. */ +function logApiError(error) { + console.error( + `${error.status || 'Network error'}: ` + + `${error.statusText || 'Payment status request failed'}` + ); +} diff --git a/site/assets/js/pages/checkout/completion-order-id.js b/site/assets/js/pages/checkout/completion-order-id.js new file mode 100644 index 00000000..686c97db --- /dev/null +++ b/site/assets/js/pages/checkout/completion-order-id.js @@ -0,0 +1,36 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const historyStateKey = 'siteCommonsCompletionOrderId'; + +/** + * Reads the order ID from the visible payment-result URL. + * + * @param {Location|URL} location browser location + * @param {History} [history] browser history used by older completion URLs + * @return {string} Paygate order ID, or an empty string when unavailable + */ +export function getCompletionOrderId(location, history) { + const completionUrl = new URL(location.href); + if (completionUrl.searchParams.has('orderId')) { + return (completionUrl.searchParams.get('orderId') || '').trim(); + } + + const retainedOrderId = history && history.state && history.state[historyStateKey]; + return typeof retainedOrderId === 'string' ? retainedOrderId.trim() : ''; +} diff --git a/site/assets/js/pages/checkout/countries.js b/site/assets/js/pages/checkout/countries.js new file mode 100644 index 00000000..f0d10b7f --- /dev/null +++ b/site/assets/js/pages/checkout/countries.js @@ -0,0 +1,47 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const countryCodes = `AD AE AF AG AI AL AM AO AQ AR AS AT AU AW AX AZ BA BB BD BE BF BG BH BI BJ BL BM BN BO BQ BR BS BT BV BW BY BZ CA CC CD CF CG CH CI CK CL CM CN CO CR CU CV CW CX CY CZ DE DJ DK DM DO DZ EC EE EG EH ER ES ET FI FJ FK FM FO FR GA GB GD GE GF GG GH GI GL GM GN GP GQ GR GS GT GU GW GY HK HM HN HR HT HU ID IE IL IM IN IO IQ IR IS IT JE JM JO JP KE KG KH KI KM KN KP KR KW KY KZ LA LB LC LI LK LR LS LT LU LV LY MA MC MD ME MF MG MH MK ML MM MN MO MP MQ MR MS MT MU MV MW MX MY MZ NA NC NE NF NG NI NL NO NP NR NU NZ OM PA PE PF PG PH PK PL PM PN PR PS PT PW PY QA RE RO RS RU RW SA SB SC SD SE SG SH SI SJ SK SL SM SN SO SR SS ST SV SX SY SZ TC TD TF TG TH TJ TK TL TM TN TO TR TT TV TW TZ UA UG UM US UY UZ VA VC VE VG VI VN VU WF WS YE YT ZA ZM ZW` + .split(' '); + +/** + * Populates a billing-country select with ISO 3166-1 countries. + * + * Region names come from the browser locale API. The country code remains a + * usable fallback in browsers that do not implement `Intl.DisplayNames`. + * + * @param {HTMLSelectElement} select country select to populate + */ +export function populateCountrySelect(select) { + if (!select || select.options.length > 1) { + return; + } + + const displayNames = typeof Intl.DisplayNames === 'function' + ? new Intl.DisplayNames(['en'], {type: 'region'}) + : null; + const countries = countryCodes.map(code => ({ + code, + name: displayNames ? displayNames.of(code) : code + })).sort((first, second) => first.name.localeCompare(second.name)); + + countries.forEach(country => { + select.add(new Option(country.name, country.code)); + }); +} + diff --git a/site/assets/js/pages/checkout/dom.js b/site/assets/js/pages/checkout/dom.js index d31bdcaf..342c0170 100644 --- a/site/assets/js/pages/checkout/dom.js +++ b/site/assets/js/pages/checkout/dom.js @@ -53,6 +53,7 @@ * @property {JQuery} $totalValue total amount element * @property {JQuery} $submitButton checkout submit button * @property {JQuery} $errorModal generic checkout error modal + * @property {JQuery} $missingOrder missing-order result panel * @property {JQuery} $notFound order-not-found result panel * @property {JQuery} $summaryError generic checkout summary-error panel * @property {HTMLFormElement} form native checkout form element @@ -86,6 +87,7 @@ export function getCheckoutDom() { $totalValue: $('#checkout-total-value'), $submitButton: $('#checkout-submit'), $errorModal: $('#checkout-error-modal'), + $missingOrder: $('#checkout-missing-order'), $notFound: $('#checkout-not-found'), $summaryError: $('#checkout-summary-error') }; diff --git a/site/assets/js/pages/checkout/form-controller.js b/site/assets/js/pages/checkout/form-controller.js index 59d9b74c..b5209810 100644 --- a/site/assets/js/pages/checkout/form-controller.js +++ b/site/assets/js/pages/checkout/form-controller.js @@ -26,7 +26,10 @@ 'use strict'; -import {euCountryPhoneCodes} from 'js/pages/checkout/phone-codes'; +import { + euCountryPhoneCodes, + isEuCountry +} from 'js/pages/checkout/phone-codes'; import { normalizePhoneNumber, sanitizePhoneNumberInput @@ -61,6 +64,8 @@ export const fieldValidationState = Object.freeze({ * buildSubmitBillingInfoRequest builds the billing-info payload for Paygate * @property {function(): void} focusPhoneNumber * focuses the phone number input when a country is selected + * @property {function(): string} getVatId + * returns VAT ID only when it applies to the selected country * @property {function(HTMLElement, string): void} setFieldValidationState * updates generic async field validation styling * @property {function(string): void} showVatIdError @@ -117,6 +122,11 @@ export function createCheckoutFormController({dom}) { return true; } + if (field.disabled || field.closest('[hidden]')) { + setFieldError(field, ''); + return true; + } + const value = field.value ? field.value.trim() : ''; let message = ''; @@ -136,6 +146,9 @@ export function createCheckoutFormController({dom}) { * @param {string} reason paygate VAT ID error reason */ function showVatIdError(reason) { + if (!isVatIdRelevant()) { + return; + } setFieldError(dom.$vatId.get(0), vatIdErrorMessage(reason)); } @@ -146,6 +159,9 @@ export function createCheckoutFormController({dom}) { * @param {string} state async validation state */ function setFieldValidationState(field, state) { + if (state === fieldValidationState.success) { + setFieldError(field, ''); + } applyFieldValidationState(field, state); } @@ -154,9 +170,35 @@ export function createCheckoutFormController({dom}) { */ function updateVatIdFieldState() { const field = dom.$vatId.get(0); - const vatId = (dom.$vatId.val() || '').trim(); + const fieldContainer = field && field.closest('.form-field'); + const isRelevant = isVatIdRelevant(); + + if (!field || !fieldContainer) { + return; + } + + field.disabled = !isRelevant; + fieldContainer.hidden = !isRelevant; - vatId ? validateField(field) : setFieldError(field, ''); + if (!isRelevant) { + dom.$vatId.val(''); + setFieldError(field, ''); + applyFieldValidationState(field, fieldValidationState.idle); + return; + } + + setFieldError(field, ''); + } + + /** + * Returns VAT ID only when it applies to the selected billing country. + * + * @return {string} VAT ID, or an empty string when VAT ID is not applicable + */ + function getVatId() { + return isVatIdRelevant() + ? String(dom.$vatId.val() || '').trim() + : ''; } /** @@ -169,7 +211,7 @@ export function createCheckoutFormController({dom}) { const formData = Object.fromEntries(new FormData(dom.form).entries()); const field = name => (formData[name] || '').trim(); const companyName = field('company'); - const vatId = field('vat_id'); + const vatId = getVatId(); const fullName = [field('first_name'), field('last_name')] .filter(Boolean) .join(' ') || companyName; @@ -177,6 +219,10 @@ export function createCheckoutFormController({dom}) { formData.phone_country_code || '', formData.phone_number || '' ); + const company = companyName || vatId ? { + ...(companyName ? {name: companyName} : {}), + ...(vatId ? {vatId} : {}) + } : null; const billingInfo = { name: fullName, email: field('email'), @@ -186,10 +232,7 @@ export function createCheckoutFormController({dom}) { street: joinAddressLines(formData.address_line_1, formData.address_line_2), postalCode: field('postal_code') }, - company: companyName ? { - name: companyName, - vatId - } : null + company }; if (phoneNumber) { @@ -465,7 +508,16 @@ export function createCheckoutFormController({dom}) { * @return {boolean} true when the select has an option for the country code */ function hasCountryOption(countryCode) { - return dom.$country.find(`option[value="${countryCode}"]`).length > 0; + const countryField = dom.$country.get(0); + return Boolean( + countryField && Array.from(countryField.options) + .some(option => option.value === countryCode) + ); + } + + /** Checks whether the selected billing country supports VAT ID entry. */ + function isVatIdRelevant() { + return isEuCountry(dom.$country.val()); } /** @@ -497,6 +549,7 @@ export function createCheckoutFormController({dom}) { bindPhoneEvents, buildSubmitBillingInfoRequest, focusPhoneNumber, + getVatId, setFieldValidationState, showVatIdError, updatePhoneCountryDisplay, diff --git a/site/assets/js/pages/checkout/index.js b/site/assets/js/pages/checkout/index.js index e13867e4..7c5a8843 100644 --- a/site/assets/js/pages/checkout/index.js +++ b/site/assets/js/pages/checkout/index.js @@ -29,6 +29,8 @@ import * as params from '@params'; import {createPurchaseClient} from 'js/modules/paygate/purchases'; import {createChargeController} from 'js/pages/checkout/charge-controller'; +import {getCompletedPageUrl} from 'js/pages/checkout/completed-page-url'; +import {populateCountrySelect} from 'js/pages/checkout/countries'; import {getCheckoutDom} from 'js/pages/checkout/dom'; import {createCheckoutFormController} from 'js/pages/checkout/form-controller'; import {createCheckoutView} from 'js/pages/checkout/view-controller'; @@ -43,6 +45,7 @@ $( return; } + populateCountrySelect(dom.$country.get(0)); const purchaseClient = createPurchaseClient(params.payment.paygateurl); const orderId = getOrderId(); const view = createCheckoutView(dom); @@ -54,7 +57,7 @@ $( view, ensureOrderId: () => Promise.resolve(orderId), getBuyerCountryCode: () => dom.$country.val(), - getVatId: () => (dom.$vatId.val() || '').trim(), + getVatId: formController.getVatId, onFieldValidationStateChange: state => { formController.setFieldValidationState(dom.$vatId.get(0), state); }, @@ -63,7 +66,7 @@ $( }); if (!orderId) { - redirectToGettingHelp(); + view.showMissingOrderView(); return; } @@ -95,7 +98,7 @@ $( }); $(window).on('pageshow', () => { - scheduleRestoredVatResume(); + scheduleCurrentChargeCalculation(); }); dom.$country.on('change', () => { @@ -142,11 +145,22 @@ $( try { const order = await purchaseClient.getOrder(orderId); + + if (order.completed) { + const completedPageUrl = getCompletedPageUrl( + window.location.href, + orderId + ); + if (completedPageUrl) { + window.location.replace(completedPageUrl); + return; + } + } + view.fillOrderSummary(order); - view.setSummaryLoading(false); - dom.$form.prop('hidden', false); + view.showCheckoutView(); chargeController.updateSubmitState(); - scheduleRestoredVatResume(); + scheduleCurrentChargeCalculation(); } catch (error) { if (error.status === 404) { chargeController.invalidate(); @@ -202,13 +216,6 @@ $( return (new URLSearchParams(window.location.search).get('orderId') || '').trim(); } - /** - * Redirects visitors with incomplete checkout links to the help page. - */ - function redirectToGettingHelp() { - window.location.replace('/getting-help'); - } - /** * Logs API failures in a compact and consistent format. * @@ -222,24 +229,20 @@ $( } /** - * Schedules one pass that resumes charge calculation from browser-restored VAT data. + * Schedules one charge calculation after browser-restored fields settle. */ - function scheduleRestoredVatResume() { - window.setTimeout(resumeChargesFromRestoredVatId, 0); + function scheduleCurrentChargeCalculation() { + window.setTimeout(requestCurrentCharges, 0); } /** - * Restarts charge calculation when the browser already restored VAT ID into the field. + * Calculates charges when a billing country is currently selected. */ - function resumeChargesFromRestoredVatId() { + function requestCurrentCharges() { if (view.isFormHidden()) { return; } - if (!(dom.$vatId.val() || '').trim()) { - return; - } - chargeController.requestIfReady(); } } diff --git a/site/assets/js/pages/checkout/phone-codes.js b/site/assets/js/pages/checkout/phone-codes.js index 5dd658e3..a26bd498 100644 --- a/site/assets/js/pages/checkout/phone-codes.js +++ b/site/assets/js/pages/checkout/phone-codes.js @@ -58,3 +58,16 @@ export const euCountryPhoneCodes = { ES: '34', SE: '46' }; + +/** + * Checks whether the country supports EU VAT ID entry. + * + * @param {string} countryCode ISO country code + * @return {boolean} true for an EU member country + */ +export function isEuCountry(countryCode) { + return Object.prototype.hasOwnProperty.call( + euCountryPhoneCodes, + String(countryCode || '').trim().toUpperCase() + ); +} diff --git a/site/assets/js/pages/checkout/view-controller.js b/site/assets/js/pages/checkout/view-controller.js index e49a6009..44f2143e 100644 --- a/site/assets/js/pages/checkout/view-controller.js +++ b/site/assets/js/pages/checkout/view-controller.js @@ -46,6 +46,10 @@ * shows or hides the summary loading state * @property {function(): void} showErrorModal * opens the generic checkout error modal + * @property {function(): void} showCheckoutView + * shows a resolved order summary and its billing form + * @property {function(): void} showMissingOrderView + * shows the missing-order result panel * @property {function(): void} showNotFoundView * shows the checkout order-not-found panel * @property {function(): void} showSummaryError @@ -68,7 +72,9 @@ export function createCheckoutView(dom) { * @param {boolean} isDisabled whether submit should be disabled */ function setSubmitDisabled(isDisabled) { - dom.$submitButton.prop('disabled', isDisabled); + dom.$submitButton + .prop('disabled', isDisabled) + .toggleClass('disabled', isDisabled); } /** @@ -124,13 +130,12 @@ export function createCheckoutView(dom) { * @param {boolean} isLoading whether the summary should show the loading state */ function setSummaryLoading(isLoading) { - dom.$summary.attr('data-loading', isLoading ? 'true' : 'false'); - dom.$summary.attr('data-error', 'false'); - dom.$summary.prop('hidden', false); + dom.$summary.prop('hidden', isLoading); dom.$loading.prop('hidden', !isLoading); dom.$loadingSpinner.prop('hidden', !isLoading); dom.$loadingSupport.prop('hidden', true); dom.$form.prop('hidden', isLoading); + dom.$missingOrder.prop('hidden', true); dom.$notFound.prop('hidden', true); dom.$summaryError.prop('hidden', true); @@ -143,13 +148,36 @@ export function createCheckoutView(dom) { * Shows the generic summary error panel inside the checkout page. */ function showSummaryError() { - dom.$summary.attr('data-error', 'true'); + dom.$loading.prop('hidden', true); dom.$summary.prop('hidden', true); dom.$form.prop('hidden', true); + dom.$missingOrder.prop('hidden', true); dom.$notFound.prop('hidden', true); dom.$summaryError.prop('hidden', false); } + /** Shows the resolved order summary and billing form. */ + function showCheckoutView() { + closeErrorModal(); + dom.$loading.prop('hidden', true); + dom.$summary.prop('hidden', false); + dom.$form.prop('hidden', false); + dom.$missingOrder.prop('hidden', true); + dom.$notFound.prop('hidden', true); + dom.$summaryError.prop('hidden', true); + } + + /** Shows the missing-order result panel. */ + function showMissingOrderView() { + closeErrorModal(); + dom.$loading.prop('hidden', true); + dom.$summary.prop('hidden', true); + dom.$form.prop('hidden', true); + dom.$notFound.prop('hidden', true); + dom.$summaryError.prop('hidden', true); + dom.$missingOrder.prop('hidden', false); + } + /** * Opens the generic checkout error modal. */ @@ -169,8 +197,10 @@ export function createCheckoutView(dom) { */ function showNotFoundView() { closeErrorModal(); + dom.$loading.prop('hidden', true); dom.$summary.prop('hidden', true); dom.$form.prop('hidden', true); + dom.$missingOrder.prop('hidden', true); dom.$summaryError.prop('hidden', true); dom.$notFound.prop('hidden', false); } @@ -210,7 +240,9 @@ export function createCheckoutView(dom) { isFormHidden, setSubmitDisabled, setSummaryLoading, + showCheckoutView, showErrorModal, + showMissingOrderView, showNotFoundView, showSummaryError, updateCharges diff --git a/site/assets/scss/pages/_checkout.scss b/site/assets/scss/pages/_checkout.scss index 526ebff2..1c2e458d 100644 --- a/site/assets/scss/pages/_checkout.scss +++ b/site/assets/scss/pages/_checkout.scss @@ -7,25 +7,19 @@ * * http://www.apache.org/licenses/LICENSE-2.0 * - * Redistribution and use in source and/or binary forms, with or without - * modification, must retain the above copyright notice and the following - * disclaimer. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ +$checkout-bg-color: #f3f3f3; +$checkout-panel-width: 790px; + .checkout-page { .main { + min-height: 100vh; display: flex; flex-direction: column; } @@ -35,157 +29,113 @@ flex: 1 0 auto; display: flex; flex-direction: column; - background: radial-gradient(circle at top left, rgba($main-brand-color, .10), transparent 36%), - linear-gradient(180deg, #f5faff 0%, var(--body-bg-color) 220px); + width: 100%; + min-height: 0; + overflow-x: hidden; + background: $checkout-bg-color; - @include breakpoint(lg-phone) { - background: white; + [hidden] { + display: none !important; } .content-with-fixed-header { margin-top: $header-height; - - @include breakpoint(desktop) { - margin-top: $header-height; - } } +} - .row { - flex: 1 0 auto; - margin-right: 0; - margin-left: 0; - } +.checkout-frame { + flex: 1 0 auto; + display: flex; + flex-direction: column; + width: 100%; +} - .row > [class*='col-'] { - padding-right: 0; - padding-left: 0; - } +.checkout-panel { + flex: 1 0 auto; + display: flex; + flex-direction: column; + align-items: center; + width: 100%; - .content-holder, - .article-container { - display: flex; + > .content-holder { flex: 1 0 auto; + display: flex; flex-direction: column; - } - - .article-container { - height: 100%; + width: 100%; + max-width: $checkout-panel-width; + margin: 0; + padding: 48px 64px 56px; + background: white; @include breakpoint(lg-phone) { - padding-block: 24px 32px; - } - } -} - -.checkout-summary { - - &[data-loading='true'] { - .checkout-summary-details { - min-height: 260px; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; + padding: 28px 24px 40px; } - .checkout-summary-row, - .checkout-summary-product, - .checkout-summary-product-description { - display: none; - } - } - - &[data-error='true'] { - .checkout-summary-details { - min-height: 260px; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - } - - .checkout-summary-row, - .checkout-summary-product, - .checkout-summary-product-description { - display: none; + @include breakpoint(sm-phone) { + padding-right: 18px; + padding-left: 18px; } } +} - .checkout-summary-details { - border-top: none; - padding-top: 8px; - } +.checkout-loading { + flex: 1 0 auto; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + min-height: 260px; + text-align: center; - .checkout-summary-loading { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - width: 100%; + p { max-width: 420px; - margin: 0 auto; + margin: 0; color: $gray-500; - font-size: 16px; - font-weight: 600; - line-height: 1.4; - text-align: center; - - .loader { - width: 38px; - height: 38px; - margin: 0 auto 14px; - } - - p { - margin: 0; - font-size: 17px; - font-weight: 600; - line-height: 1.4; - color: $gray-500; - text-align: center; - } - } - - .checkout-summary-support { - max-width: 360px; - margin-top: 12px; - font-size: 15px; + font-size: 17px; font-weight: 500; line-height: 1.5; - text-align: center; - - a { - color: $main-brand-color; - font-weight: 700; - text-decoration: none; + } - &:hover, - &:focus { - text-decoration: underline; - } - } + span { + display: block; } +} - @include breakpoint(sm-phone) { - &[data-loading='true'], - &[data-error='true'] { - .checkout-summary-details { - min-height: 220px; - } - } +.checkout-loading-spinner { + width: 40px; + height: 40px; + margin: 0 auto 16px; + border: 4px solid rgba($main-brand-color, .18); + border-top-color: $main-brand-color; + border-radius: 50%; + animation: checkout-loading-spin .8s linear infinite; +} - .checkout-summary-loading { - font-size: 16px; +@keyframes checkout-loading-spin { + to { + transform: rotate(360deg); + } +} - .loader { - width: 34px; - height: 34px; - } +.checkout-summary { + width: 100%; - p { - font-size: 16px; - } - } + .checkout-summary-product { + max-width: 100%; + padding-bottom: 10px; + color: $black; + font-size: 36px; + font-weight: 600; + line-height: 1.12; + overflow-wrap: anywhere; + } + + .checkout-summary-product-description { + margin-bottom: 30px; + color: $gray-500; + font-size: 16px; + line-height: 1.5; } .checkout-summary-row { @@ -194,174 +144,176 @@ align-items: end; column-gap: 20px; padding: 12px 0; - border-bottom: 0; } .checkout-summary-row-divider { border-bottom: 1px solid rgba($black, .12); } + .checkout-summary-label, + .checkout-summary-value { + min-width: 0; + color: $black; + font-size: 16px; + line-height: 1.2; + } + + .checkout-summary-value { + max-width: 100%; + font-weight: 700; + text-align: right; + overflow-wrap: anywhere; + } + .checkout-summary-row-total { - padding-top: 12px; padding-bottom: 0; - border-bottom: 0; - - .checkout-summary-label { - color: $black; - font-size: 20px; - font-weight: 800; - letter-spacing: -.02em; - } + .checkout-summary-label, .checkout-summary-value { font-size: 20px; font-weight: 800; - letter-spacing: -.02em; } } - .checkout-summary-product { - max-width: 100%; - padding-bottom: 8px; - color: rgba($black, .4); - font-size: 42px; - font-weight: 300; - letter-spacing: 0; - line-height: 1.12; - overflow-wrap: anywhere; + @include breakpoint(lg-phone) { + margin-bottom: 16px; - @include breakpoint(md-phone) { - font-size: 32px !important; + .checkout-summary-product { + font-size: 28px; } - } - .checkout-summary-product-description { - margin-bottom: 28px; - color: rgba($black, .54); - font-size: 16px; - font-weight: 400; - line-height: 1.5; + .checkout-summary-product-description { + margin-bottom: 22px; + } + } - @include breakpoint(lg-phone) { - margin-bottom: 24px; + @include breakpoint(sm-phone) { + .checkout-summary-product { + font-size: 24px; } - @include breakpoint(md-phone) { - font-size: 14px; - margin-bottom: 16px; + .checkout-summary-row { + column-gap: 12px; + padding: 10px 0; } } +} - .checkout-summary-label { - flex: 0 0 auto; - min-width: 0; - color: $black; - font-size: 16px; - font-weight: 400; - line-height: 1.2; - } +.checkout .form-section { + margin-top: 44px; - .checkout-summary-value { - min-width: 0; - max-width: 100%; + .form-title { + margin-bottom: 26px; + padding-top: 0; color: $black; - font-size: 18px; - font-weight: 700; + font-size: 24px; + font-weight: 800; line-height: 1.2; - text-align: right; - white-space: normal; - overflow-wrap: anywhere; } - .checkout-summary-value-amount { - color: $black; - font-size: 16px; - font-weight: 700; - line-height: 1.2; + .form-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + column-gap: 20px; } - .checkout-summary-value-total { - color: $black; - font-size: 20px; - font-weight: 700; - letter-spacing: 0; - line-height: 1.1; + .form-field { + min-width: 0; } - @include breakpoint(lg-phone) { - margin-bottom: 16px; - - .checkout-summary-product { - font-size: 28px; - padding-bottom: 6px; - } + .form-field-full { + grid-column: 1 / -1; + } - .checkout-summary-row { - column-gap: 12px; - padding: 10px 0 12px; - } + .form-input, + .form-select { + width: 100%; + min-height: 48px; } - @include breakpoint(md-phone) { - .checkout-summary-label { - font-size: 15px; - } + .form-select { + appearance: auto; + } - .checkout-summary-value-amount { - font-size: 16px; - } + .form-actions { + margin-top: 8px; + } - .checkout-summary-row-total .checkout-summary-label, - .checkout-summary-value-total { - font-size: 20px; - } + .form-submit-button { + width: 100%; + min-height: 48px; } - @include breakpoint(sm-phone) { - .checkout-summary-product { - font-size: 26px; - } + .form-submit-button.disabled, + .form-submit-button:disabled { + cursor: not-allowed; + opacity: .55; + } - .checkout-summary-row { - padding: 8px 0; - } + @include breakpoint(md-phone) { + margin-top: 30px; - .checkout-summary-value-amount { - font-size: 15px; + .form-grid { + grid-template-columns: minmax(0, 1fr); } - .checkout-summary-row-total .checkout-summary-label, - .checkout-summary-value-total { - font-size: 18px; + .form-field, + .form-field-full { + grid-column: 1; } } } -.checkout .form-section { - margin-top: 8px; +.checkout-business-fields { + min-width: 0; + margin: 10px 0 0; + padding: 28px 0 0; + border: 0; + border-top: 1px solid rgba($black, .12); - .form-title { - padding-top: 40px; + .checkout-business-fields-title { + width: 100%; + margin: 0 0 8px; + padding: 0; + color: $black; + font-size: 20px; + font-weight: 800; + } - @include breakpoint(lg-phone) { - padding-top: 8px; - } + .checkout-business-fields-description { + margin: 0 0 22px; + color: $gray-500; + font-size: 15px; + line-height: 1.5; + } + + .checkout-business-fields-grid { + display: grid; + grid-template-columns: minmax(0, 1fr); } } +#checkout-missing-order, #checkout-not-found, -#checkout-summary-error { - margin-top: 32px; - - @include breakpoint(desktop) { - margin-top: 16px; - } +#checkout-summary-error, +.checkout-completed > .checkout-frame { + flex: 1 0 auto; } -.checkout-completed { - min-height: 420px; +.checkout-result-loading .checkout-result-title { + margin: 0 0 14px; + color: $black; + font-size: 32px; + font-weight: 800; + line-height: 1.15; + text-align: center; @include breakpoint(sm-phone) { - min-height: auto; + font-size: 28px; } } + +.checkout-completed .result-panel { + margin-top: auto; + margin-bottom: auto; +} diff --git a/site/content/checkout-completed/index.md b/site/content/checkout-completed/index.md index f524801a..866bd7b8 100644 --- a/site/content/checkout-completed/index.md +++ b/site/content/checkout-completed/index.md @@ -1,6 +1,6 @@ --- -title: Checkout Completed -description: Thank you page about completed checkout. +title: Payment Result +description: Current payment result for a checkout order. body_class: checkout-page header_type: fixed-header sitemap: diff --git a/site/layouts/checkout-completed/single.html b/site/layouts/checkout-completed/single.html index 14e24484..58cb8868 100644 --- a/site/layouts/checkout-completed/single.html +++ b/site/layouts/checkout-completed/single.html @@ -1,28 +1,109 @@ {{ define "main" }} {{ partial "components/navbar/navbar.html" . }} -
-
-
-
-
+ {{ $email := hugo.Data.emails.sales_email }} +
+
+
+
+ + + + + + + +
+ {{ partial "components/result-panel.html" (dict + "title" "Thank you!" + "title_as_h1" true + "lines" (slice + "We will send the order details to your email after the payment is confirmed." + (printf "If you have any questions, email us at %s." $email) ) + "action" (dict "label" "Back to home" "url" site.Home.RelPermalink) ) }}
+ + {{ $params := dict "payment" site.Params.payment }} + {{ $js := resources.Get "js/pages/checkout/completed.js" | js.Build (dict "params" $params) }} + {{ partial "scripts/script.html" (dict "js" $js "attributes" "defer") }} {{ end }} diff --git a/site/layouts/checkout/single.html b/site/layouts/checkout/single.html index 6868be21..b23660bb 100644 --- a/site/layouts/checkout/single.html +++ b/site/layouts/checkout/single.html @@ -1,280 +1,264 @@ {{ define "main" }} {{ partial "components/navbar/navbar.html" . }} + {{ $email := hugo.Data.emails.sales_email }} + {{ $emailLink := printf "%s" $email $email | safeHTML }}
-
-
-
-
-
-
-
- -

Loading checkout details...

- {{ $email := hugo.Data.emails.sales_email }} - {{ $emailLink := printf - "%s" - $email - $email - | safeHTML - }} - -
- - -
- Subtotal - ... -
-
- VAT - ... -
-
- Total - ... -
+
+
+
+
+ +

Processing your order...

+
+
- {{ partial "components/go-top-button.html" . }} {{ end }} diff --git a/site/package.json b/site/package.json index ea630367..f6a19a84 100644 --- a/site/package.json +++ b/site/package.json @@ -4,7 +4,7 @@ "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "node --test tests/*.test.mjs" }, "author": "", "license": "ISC", diff --git a/site/tests/checkout-completed.test.mjs b/site/tests/checkout-completed.test.mjs new file mode 100644 index 00000000..b11fdedb --- /dev/null +++ b/site/tests/checkout-completed.test.mjs @@ -0,0 +1,561 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +import test from 'node:test'; +import vm from 'node:vm'; + +// The page-state harness injects module dependencies and browser APIs. A Hugo +// consumer build separately verifies production import resolution and output. +const completedSource = fs.readFileSync( + new URL('../assets/js/pages/checkout/completed.js', import.meta.url), + 'utf8' +).replace(/^import .*;\n/gm, ''); +assert.doesNotMatch( + completedSource, + /^\s*import\b/m, + 'completed-page harness did not strip every import' +); +const completedPageUrlSource = fs.readFileSync( + new URL('../assets/js/pages/checkout/completed-page-url.js', import.meta.url), + 'utf8' +); +const {getCheckoutPageUrl, getCompletedPageUrl} = await import( + `data:text/javascript,${encodeURIComponent(completedPageUrlSource)}` +); +const completionOrderIdSource = fs.readFileSync( + new URL('../assets/js/pages/checkout/completion-order-id.js', import.meta.url), + 'utf8' +); +const {getCompletionOrderId} = await import( + `data:text/javascript,${encodeURIComponent(completionOrderIdSource)}` +); +const viewIds = [ + 'payment-in-progress', + 'payment-completed', + 'payment-failed', + 'payment-refunded', + 'payment-charged-back', + 'payment-status-error', + 'payment-order-not-found', + 'payment-status-unknown' +]; +const maxPollingDurationMs = 15 * 60 * 1000; + + +test('keep polling until a pending payment settles', async () => { + const page = await render([ + {order: {paymentStatus: 'SENT_FOR_PROCESSING', completed: false}}, + {order: {paymentStatus: 'SETTLED', completed: true}} + ]); + + assert.equal(page.isVisible('payment-in-progress'), true); + assert.equal(page.scheduledPolls(), 1); + assert.equal(page.nextPollDelay(), 3000); + + await page.runNextPoll(); + + assert.equal(page.isVisible('payment-completed'), true); + assert.equal(page.scheduledPolls(), 0); +}); + +test('back off pending polling to a 30-second interval', async () => { + const pending = {order: {paymentStatus: 'SENT_FOR_PROCESSING', completed: false}}; + const page = await render([pending, pending, pending, pending, pending]); + + assert.equal(page.nextPollDelay(), 3000); + await page.runNextPoll(); + assert.equal(page.nextPollDelay(), 5000); + await page.runNextPoll(); + assert.equal(page.nextPollDelay(), 10000); + await page.runNextPoll(); + assert.equal(page.nextPollDelay(), 30000); + await page.runNextPoll(); + assert.equal(page.nextPollDelay(), 30000); +}); + +for (const [status, view] of [ + ['SETTLED', 'payment-completed'], + ['ABANDONED', 'payment-failed'], + ['FAILED', 'payment-failed'], + ['VOIDED', 'payment-failed'], + ['REFUNDED', 'payment-refunded'], + ['CHARGED_BACK', 'payment-charged-back'] +]) { + test(`stop polling and show ${view} for ${status}`, async () => { + const page = await render([{order: {paymentStatus: status, completed: false}}]); + + assert.equal(page.isVisible(view), true); + assert.equal(page.scheduledPolls(), 0); + }); +} + +test('fall back to the legacy completed flag when payment status is absent', async () => { + const page = await render([{order: {completed: true}}]); + + assert.equal(page.isVisible('payment-completed'), true); + assert.equal(page.scheduledPolls(), 0); +}); + +test('show an error after repeated failures and recover to in progress', async () => { + const page = await render([ + {error: {status: 500, statusText: 'Unavailable'}}, + {error: {status: 500, statusText: 'Unavailable'}}, + {error: {status: 500, statusText: 'Unavailable'}}, + {order: {paymentStatus: 'AUTHORISED', completed: false}} + ]); + + assert.equal(page.nextPollDelay(), 3000); + await page.runNextPoll(); + assert.equal(page.nextPollDelay(), 5000); + await page.runNextPoll(); + assert.equal(page.isVisible('payment-status-error'), true); + assert.equal(page.nextPollDelay(), 10000); + + await page.runNextPoll(); + assert.equal(page.isVisible('payment-in-progress'), true); + assert.equal(page.scheduledPolls(), 1); + assert.equal(page.nextPollDelay(), 30000); +}); + +test('stop a retry chain when a terminal status arrives', async () => { + const page = await render([ + {error: {status: 503, statusText: 'Unavailable'}}, + {order: {paymentStatus: 'FAILED', completed: false}} + ]); + + assert.equal(page.nextPollDelay(), 3000); + await page.runNextPoll(); + + assert.equal(page.requests(), 2); + assert.equal(page.isVisible('payment-failed'), true); + assert.equal(page.scheduledPolls(), 0); + assert.equal(page.nextPollDelay(), undefined); +}); + +test('link a failed payment back to its checkout', async () => { + const page = await render([ + {order: {paymentStatus: 'FAILED', completed: false}} + ]); + + assert.equal(page.isVisible('payment-failed'), true); + assert.equal(page.backToCheckoutHidden(), false); + assert.equal( + page.backToCheckoutHref(), + 'https://example.com/checkout/?orderId=current-order' + ); +}); + +test('retry one not-found response before recovering', async () => { + const page = await render([ + {error: {status: 404, statusText: 'Not Found'}}, + {order: {paymentStatus: 'SETTLED', completed: true}} + ]); + + assert.equal(page.isVisible('payment-in-progress'), true); + assert.equal(page.scheduledPolls(), 1); + + await page.runNextPoll(); + + assert.equal(page.isVisible('payment-completed'), true); + assert.equal(page.scheduledPolls(), 0); +}); + +test('stop polling after two consecutive not-found responses', async () => { + const notFound = {error: {status: 404, statusText: 'Not Found'}}; + const page = await render([notFound, notFound]); + + assert.equal(page.isVisible('payment-in-progress'), true); + assert.equal(page.scheduledPolls(), 1); + + await page.runNextPoll(); + + assert.equal(page.isVisible('payment-order-not-found'), true); + assert.equal(page.scheduledPolls(), 0); +}); + +test('reset the not-found count after another response', async () => { + const notFound = {error: {status: 404, statusText: 'Not Found'}}; + const page = await render([ + notFound, + {error: {status: 503, statusText: 'Unavailable'}}, + notFound, + notFound + ]); + + await page.runNextPoll(); + await page.runNextPoll(); + assert.equal(page.isVisible('payment-in-progress'), true); + + await page.runNextPoll(); + assert.equal(page.isVisible('payment-order-not-found'), true); + assert.equal(page.requests(), 4); +}); + +test('stop polling after 15 minutes and show a neutral result', async () => { + const pending = Array.from({length: 40}, () => ({ + order: {paymentStatus: 'SENT_FOR_PROCESSING', completed: false} + })); + const page = await render(pending); + + while (!page.isVisible('payment-status-unknown')) { + await page.runNextTimer(); + } + + assert.equal(page.elapsedMs(), maxPollingDurationMs); + assert.ok(page.requests() < 40); + assert.equal(page.scheduledPolls(), 0); + assert.equal(page.scheduledTimers(), 0); +}); + +test('apply the 15-minute deadline to a hanging request', async () => { + const page = await render([{pending: true}]); + + assert.equal(page.isVisible('payment-in-progress'), true); + assert.equal(page.scheduledPolls(), 0); + assert.equal(page.nextTimerDelay(), maxPollingDurationMs); + + await page.runNextTimer(); + + assert.equal(page.isVisible('payment-status-unknown'), true); + assert.equal(page.scheduledTimers(), 0); +}); + +test('show a neutral result without polling when the order ID is absent', async () => { + const page = await render([], ''); + + assert.equal(page.isVisible('payment-status-unknown'), true); + for (const view of viewIds.filter(view => view !== 'payment-status-unknown')) { + assert.equal(page.isVisible(view), false); + } + assert.equal(page.requests(), 0); + assert.equal(page.scheduledPolls(), 0); + assert.equal(page.backToCheckoutHidden(), true); +}); + +test('keep the neutral result when payment configuration is absent', async () => { + const page = await render([], '?orderId=current-order', {params: {}}); + + assert.equal(page.isVisible('payment-status-unknown'), true); + assert.equal(page.clientCreations(), 0); + assert.equal(page.requests(), 0); + assert.equal(page.scheduledTimers(), 0); +}); + +test('keep the neutral result when the payment client cannot initialize', async () => { + const page = await render([], '?orderId=current-order', { + clientError: new Error('Client initialization failed') + }); + + assert.equal(page.isVisible('payment-status-unknown'), true); + assert.equal(page.clientCreations(), 1); + assert.equal(page.requests(), 0); + assert.equal(page.scheduledTimers(), 0); +}); + +test('keep the order ID in the visible URL', () => { + const initialUrl = 'https://example.com/checkout-completed/' + + '?campaign=sale&orderId=current-order&orderId=ignored#result'; + const browser = createBrowserState( + initialUrl, + { + consumerState: 'preserved', + siteCommonsCompletionOrderId: 'previous-order' + } + ); + + const orderId = getCompletionOrderId(browser.location, browser.history); + + assert.equal(orderId, 'current-order'); + assert.equal(browser.location.href, initialUrl); + assert.equal(browser.history.state.consumerState, 'preserved'); + assert.equal(browser.history.state.siteCommonsCompletionOrderId, 'previous-order'); +}); + +test('fall back to an order ID retained by the previous URL behavior', () => { + const browser = createBrowserState( + 'https://example.com/checkout-completed/?campaign=sale#result', + {siteCommonsCompletionOrderId: 'current-order'} + ); + + assert.equal( + getCompletionOrderId(browser.location, browser.history), + 'current-order' + ); + assert.equal( + browser.location.href, + 'https://example.com/checkout-completed/?campaign=sale#result' + ); +}); + +test('let an explicit empty order ID override retained history', () => { + const browser = createBrowserState( + 'https://example.com/checkout-completed/?orderId=', + {siteCommonsCompletionOrderId: 'previous-order'} + ); + + assert.equal( + getCompletionOrderId(browser.location, browser.history), + '' + ); +}); + +test('carry only the order ID to a directory completion URL', () => { + const actual = getCompletedPageUrl( + 'https://example.com/checkout/?orderId=current-order&campaign=sale#form', + 'current-order' + ); + + assert.equal( + actual, + 'https://example.com/checkout-completed/?orderId=current-order' + ); +}); + +test('carry the order ID to a file-style completion URL', () => { + const actual = getCompletedPageUrl( + 'https://example.com/checkout.html?orderId=current-order', + 'current-order' + ); + + assert.equal( + actual, + 'https://example.com/checkout-completed.html?orderId=current-order' + ); +}); + +test('carry only the order ID back to a directory checkout URL', () => { + const actual = getCheckoutPageUrl( + 'https://example.com/checkout-completed/?campaign=sale#result', + 'current-order' + ); + + assert.equal( + actual, + 'https://example.com/checkout/?orderId=current-order' + ); +}); + +test('carry the order ID back to a file-style checkout URL', () => { + const actual = getCheckoutPageUrl( + 'https://example.com/checkout-completed.html?campaign=sale#result', + 'current-order' + ); + + assert.equal( + actual, + 'https://example.com/checkout.html?orderId=current-order' + ); +}); + +test('reject a non-completion URL as a checkout-link source', () => { + assert.equal( + getCheckoutPageUrl( + 'https://example.com/payment-result/?orderId=current-order', + 'current-order' + ), + '' + ); +}); + +/** + * Runs the completion page against predefined order API results. + * + * @param {Array} responses order responses or request errors + * @param {string} [search] completion-page query string + * @param {Object} [options] harness overrides + * @return {Promise} page-state test harness + */ +async function render( + responses, + search = '?orderId=current-order', + options = {} +) { + const views = Object.fromEntries( + viewIds.map(id => [id, {hidden: id !== 'payment-status-unknown'}]) + ); + const backToCheckoutLink = {hidden: true, href: ''}; + const scheduled = new Map(); + const queuedResponses = [...responses]; + let currentTimeMs = 0; + let nextTimerId = 1; + let deadlineTimerId; + let clientCreations = 0; + let requests = 0; + const browser = createBrowserState( + `https://example.com/checkout-completed/${search}`, + options.historyState || null + ); + const context = { + params: Object.hasOwn(options, 'params') ? options.params : { + payment: {paygateurl: 'https://paygate.example'} + }, + createPurchaseClient: () => { + clientCreations += 1; + if (options.clientError) { + throw options.clientError; + } + return { + async getOrder() { + requests += 1; + const response = queuedResponses.shift(); + assert.ok(response, 'unexpected payment-status request'); + if (response.pending) { + return new Promise(() => {}); + } + if (response.error) { + throw response.error; + } + return response.order; + } + }; + }, + getCheckoutPageUrl, + getCompletionOrderId, + document: { + querySelector: selector => { + if (selector === '[data-payment-status-page]') { + return {}; + } + if (selector === '#payment-failed .result-panel-button') { + return backToCheckoutLink; + } + return null; + }, + getElementById: id => views[id] + }, + window: { + location: browser.location, + history: browser.history, + setTimeout(callback, delay) { + const timerId = nextTimerId; + nextTimerId += 1; + if (delay === maxPollingDurationMs) { + assert.equal( + deadlineTimerId, + undefined, + 'expected only one polling deadline timer' + ); + deadlineTimerId = timerId; + } + scheduled.set(timerId, { + callback, + dueAt: currentTimeMs + delay, + timerId + }); + return timerId; + }, + clearTimeout: timerId => scheduled.delete(timerId) + }, + Date: {now: () => currentTimeMs}, + console: {error: () => {}}, + }; + + vm.runInNewContext(completedSource, context); + await settleAsyncWork(); + + return { + isVisible: id => views[id].hidden === false, + backToCheckoutHidden: () => backToCheckoutLink.hidden, + backToCheckoutHref: () => backToCheckoutLink.href, + clientCreations: () => clientCreations, + requests: () => requests, + elapsedMs: () => currentTimeMs, + scheduledPolls: () => + getScheduledPolls(scheduled, deadlineTimerId).length, + scheduledTimers: () => scheduled.size, + nextPollDelay: () => { + const nextPoll = getScheduledPolls( + scheduled, + deadlineTimerId + )[0]; + return nextPoll ? nextPoll.dueAt - currentTimeMs : undefined; + }, + nextTimerDelay: () => { + const nextTimer = getScheduledTimers(scheduled)[0]; + return nextTimer ? nextTimer.dueAt - currentTimeMs : undefined; + }, + async runNextPoll() { + const poll = getScheduledPolls(scheduled, deadlineTimerId)[0]; + assert.ok(poll, 'expected another polling attempt'); + await runTimer(poll); + }, + async runNextTimer() { + const timer = getScheduledTimers(scheduled)[0]; + assert.ok(timer, 'expected another scheduled timer'); + await runTimer(timer); + } + }; + + /** + * Runs one browser timer and lets its promise continuations settle. + * + * @param {Object} timer scheduled timer + * @return {Promise} resolves after asynchronous page work settles + */ + async function runTimer(timer) { + scheduled.delete(timer.timerId); + currentTimeMs = timer.dueAt; + timer.callback(); + await settleAsyncWork(); + } +} + +/** + * Returns scheduled timers in browser execution order. + * + * @param {Map} scheduled timers by ID + * @return {Array} ordered timers + */ +function getScheduledTimers(scheduled) { + return [...scheduled.values()].sort((left, right) => + left.dueAt - right.dueAt || left.timerId - right.timerId + ); +} + +/** + * Returns only timers that trigger another status request. + * + * @param {Map} scheduled timers by ID + * @param {number|undefined} deadlineTimerId polling deadline timer ID + * @return {Array} ordered polling timers + */ +function getScheduledPolls(scheduled, deadlineTimerId) { + return getScheduledTimers(scheduled).filter( + timer => timer.timerId !== deadlineTimerId + ); +} + +/** + * Creates location and history fakes whose URLs stay in sync. + * + * @param {string} href initial browser URL + * @param {Object|null} state initial history state + * @return {{location: Object, history: Object}} browser state + */ +function createBrowserState(href, state = null) { + const location = {href}; + const history = {state}; + return {location, history}; +} + +/** + * Waits for promise continuations started by the page script. + */ +function settleAsyncWork() { + return new Promise(resolve => setImmediate(resolve)); +} + diff --git a/site/tests/checkout-configuration.test.mjs b/site/tests/checkout-configuration.test.mjs new file mode 100644 index 00000000..92a5bbda --- /dev/null +++ b/site/tests/checkout-configuration.test.mjs @@ -0,0 +1,86 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +import test from 'node:test'; + +const {buildChargeRequest} = await importSource( + '../assets/js/pages/checkout/charge-request.js' +); +const {populateCountrySelect} = await importSource( + '../assets/js/pages/checkout/countries.js' +); +const {isEuCountry} = await importSource( + '../assets/js/pages/checkout/phone-codes.js' +); + +test('calculate charges without requiring a VAT ID', () => { + assert.deepEqual( + buildChargeRequest('order-1', 'US', ''), + {orderId: 'order-1', buyerCountryCode: 'US'} + ); + assert.deepEqual( + buildChargeRequest('order-1', 'EE', 'EE123456789'), + { + orderId: 'order-1', + buyerCountryCode: 'EE', + vatId: 'EE123456789' + } + ); + assert.equal(buildChargeRequest('', 'US', ''), null); + assert.equal(buildChargeRequest('order-1', '', ''), null); +}); + +test('offer the complete ISO billing-country list', () => { + const OriginalOption = globalThis.Option; + globalThis.Option = class { + constructor(text, value) { + this.text = text; + this.value = value; + } + }; + + try { + const select = { + options: [{text: 'Select country', value: ''}], + add(option) { + this.options.push(option); + } + }; + + populateCountrySelect(select); + + assert.ok(select.options.length > 240); + for (const countryCode of ['AU', 'BR', 'CA', 'CN', 'EE', 'GB', 'JP', 'US', 'ZA']) { + assert.ok(select.options.some(option => option.value === countryCode)); + } + } finally { + globalThis.Option = OriginalOption; + } +}); + +test('show VAT ID only for EU billing countries', () => { + assert.equal(isEuCountry('EE'), true); + assert.equal(isEuCountry('DE'), true); + assert.equal(isEuCountry('GB'), false); + assert.equal(isEuCountry('US'), false); +}); + +async function importSource(relativePath) { + const source = fs.readFileSync(new URL(relativePath, import.meta.url), 'utf8'); + return import(`data:text/javascript,${encodeURIComponent(source)}`); +} From bed744bfc5f8e8fdfb07c67f98b2bdc943873436 Mon Sep 17 00:00:00 2001 From: Vladyslav Kuksiuk Date: Thu, 13 Aug 2026 13:38:16 +0200 Subject: [PATCH 02/17] Provide country and phone libs. --- site/static/images/flags/flags.png | Bin 0 -> 70325 bytes site/static/images/flags/flags@2x.png | Bin 0 -> 183962 bytes .../libs/country-select/select2.min.css | 1 + .../static/libs/country-select/select2.min.js | 2 + .../libs/intl-tel-input/intlTelInput.min.css | 1 + .../libs/intl-tel-input/intlTelInput.min.js | 8 + site/static/libs/intl-tel-input/utils.js | 508 ++++++++++++++++++ 7 files changed, 520 insertions(+) create mode 100644 site/static/images/flags/flags.png create mode 100644 site/static/images/flags/flags@2x.png create mode 100644 site/static/libs/country-select/select2.min.css create mode 100644 site/static/libs/country-select/select2.min.js create mode 100644 site/static/libs/intl-tel-input/intlTelInput.min.css create mode 100644 site/static/libs/intl-tel-input/intlTelInput.min.js create mode 100644 site/static/libs/intl-tel-input/utils.js diff --git a/site/static/images/flags/flags.png b/site/static/images/flags/flags.png new file mode 100644 index 0000000000000000000000000000000000000000..36f236e5e8070e4326dbd17c6241ffedaf0626e8 GIT binary patch literal 70325 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%0AH63NFh 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%0AxCdz3Qj{z@ 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

_AM+dM%;MQRe9vNcKW+-xOm7l2TdcM-2Mf@ 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 d?dAD@>T3;mziGTM`5OZec)I$ztaD0e0swO?U&8.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--group{padding:0}.select2-container--default .select2-results__option--disabled{color:#999}.select2-container--default .select2-results__option--selected{background-color:#ddd}.select2-container--default .select2-results__option--highlighted.select2-results__option--selectable{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;height:26px;margin-right:20px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0;padding-bottom:5px;padding-right:5px}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;display:inline-block;margin-left:5px;margin-top:5px;padding:0}.select2-container--classic .select2-selection--multiple .select2-selection__choice__display{cursor:default;padding-left:2px;padding-right:5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{background-color:transparent;border:none;border-top-left-radius:4px;border-bottom-left-radius:4px;color:#888;cursor:pointer;font-size:1em;font-weight:bold;padding:0 4px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555;outline:none}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__display{padding-left:5px;padding-right:2px}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:4px;border-bottom-right-radius:4px}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option--group{padding:0}.select2-container--classic .select2-results__option--disabled{color:grey}.select2-container--classic .select2-results__option--highlighted.select2-results__option--selectable{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/site/static/libs/country-select/select2.min.js b/site/static/libs/country-select/select2.min.js new file mode 100644 index 00000000..445a6798 --- /dev/null +++ b/site/static/libs/country-select/select2.min.js @@ -0,0 +1,2 @@ +/*! Select2 4.1.0-rc.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ +!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(t){var e,n,s,p,r,o,h,f,g,m,y,v,i,a,_,s=((u=t&&t.fn&&t.fn.select2&&t.fn.select2.amd?t.fn.select2.amd:u)&&u.requirejs||(u?n=u:u={},g={},m={},y={},v={},i=Object.prototype.hasOwnProperty,a=[].slice,_=/\.js$/,h=function(e,t){var n,s,i=c(e),r=i[0],t=t[1];return e=i[1],r&&(n=x(r=l(r,t))),r?e=n&&n.normalize?n.normalize(e,(s=t,function(e){return l(e,s)})):l(e,t):(r=(i=c(e=l(e,t)))[0],e=i[1],r&&(n=x(r))),{f:r?r+"!"+e:e,n:e,pr:r,p:n}},f={require:function(e){return w(e)},exports:function(e){var t=g[e];return void 0!==t?t:g[e]={}},module:function(e){return{id:e,uri:"",exports:g[e],config:(t=e,function(){return y&&y.config&&y.config[t]||{}})};var t}},r=function(e,t,n,s){var i,r,o,a,l,c=[],u=typeof n,d=A(s=s||e);if("undefined"==u||"function"==u){for(t=!t.length&&n.length?["require","exports","module"]:t,a=0;a":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},s.__cache={};var n=0;return s.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null!=t||(t=e.id?"select2-data-"+e.id:"select2-data-"+(++n).toString()+"-"+s.generateChars(4),e.setAttribute("data-select2-id",t)),t},s.StoreData=function(e,t,n){e=s.GetUniqueElementId(e);s.__cache[e]||(s.__cache[e]={}),s.__cache[e][t]=n},s.GetData=function(e,t){var n=s.GetUniqueElementId(e);return t?s.__cache[n]&&null!=s.__cache[n][t]?s.__cache[n][t]:r(e).data(t):s.__cache[n]},s.RemoveData=function(e){var t=s.GetUniqueElementId(e);null!=s.__cache[t]&&delete s.__cache[t],e.removeAttribute("data-select2-id")},s.copyNonInternalCssClasses=function(e,t){var n=(n=e.getAttribute("class").trim().split(/\s+/)).filter(function(e){return 0===e.indexOf("select2-")}),t=(t=t.getAttribute("class").trim().split(/\s+/)).filter(function(e){return 0!==e.indexOf("select2-")}),t=n.concat(t);e.setAttribute("class",t.join(" "))},s}),u.define("select2/results",["jquery","./utils"],function(d,p){function s(e,t,n){this.$element=e,this.data=n,this.options=t,s.__super__.constructor.call(this)}return p.Extend(s,p.Observable),s.prototype.render=function(){var e=d('

    ');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},s.prototype.clear=function(){this.$results.empty()},s.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=d(''),s=this.options.get("translations").get(e.message);n.append(t(s(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},s.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},s.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n",{class:"select2-results__options select2-results__options--nested",role:"none"});i.append(l),o.append(a),o.append(i)}else this.template(e,t);return p.StoreData(t,"data",e),t},s.prototype.bind=function(t,e){var i=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){i.clear(),i.append(e.data),t.isOpen()&&(i.setClasses(),i.highlightFirstItem())}),t.on("results:append",function(e){i.append(e.data),t.isOpen()&&i.setClasses()}),t.on("query",function(e){i.hideMessages(),i.showLoading(e)}),t.on("select",function(){t.isOpen()&&(i.setClasses(),i.options.get("scrollAfterSelect")&&i.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(i.setClasses(),i.options.get("scrollAfterSelect")&&i.highlightFirstItem())}),t.on("open",function(){i.$results.attr("aria-expanded","true"),i.$results.attr("aria-hidden","false"),i.setClasses(),i.ensureHighlightVisible()}),t.on("close",function(){i.$results.attr("aria-expanded","false"),i.$results.attr("aria-hidden","true"),i.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=i.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e,t=i.getHighlightedResults();0!==t.length&&(e=p.GetData(t[0],"data"),t.hasClass("select2-results__option--selected")?i.trigger("close",{}):i.trigger("select",{data:e}))}),t.on("results:previous",function(){var e,t=i.getHighlightedResults(),n=i.$results.find(".select2-results__option--selectable"),s=n.index(t);s<=0||(e=s-1,0===t.length&&(e=0),(s=n.eq(e)).trigger("mouseenter"),t=i.$results.offset().top,n=s.offset().top,s=i.$results.scrollTop()+(n-t),0===e?i.$results.scrollTop(0):n-t<0&&i.$results.scrollTop(s))}),t.on("results:next",function(){var e,t=i.getHighlightedResults(),n=i.$results.find(".select2-results__option--selectable"),s=n.index(t)+1;s>=n.length||((e=n.eq(s)).trigger("mouseenter"),t=i.$results.offset().top+i.$results.outerHeight(!1),n=e.offset().top+e.outerHeight(!1),e=i.$results.scrollTop()+n-t,0===s?i.$results.scrollTop(0):tthis.$results.outerHeight()||s<0)&&this.$results.scrollTop(n))},s.prototype.template=function(e,t){var n=this.options.get("templateResult"),s=this.options.get("escapeMarkup"),e=n(e,t);null==e?t.style.display="none":"string"==typeof e?t.innerHTML=s(e):d(t).append(e)},s}),u.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),u.define("select2/selection/base",["jquery","../utils","../keys"],function(n,s,i){function r(e,t){this.$element=e,this.options=t,r.__super__.constructor.call(this)}return s.Extend(r,s.Observable),r.prototype.render=function(){var e=n('');return this._tabindex=0,null!=s.GetData(this.$element[0],"old-tabindex")?this._tabindex=s.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},r.prototype.bind=function(e,t){var n=this,s=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===i.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",s),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},r.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},r.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&s.GetData(this,"element").select2("close")})})},r.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},r.prototype.position=function(e,t){t.find(".selection").append(e)},r.prototype.destroy=function(){this._detachCloseHandler(this.container)},r.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},r.prototype.isEnabled=function(){return!this.isDisabled()},r.prototype.isDisabled=function(){return this.options.get("disabled")},r}),u.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,s){function i(){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e[0].classList.add("select2-selection--single"),e.html(''),e},i.prototype.bind=function(t,e){var n=this;i.__super__.bind.apply(this,arguments);var s=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",s).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",s),this.$selection.attr("aria-controls",s),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},i.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e("")},i.prototype.update=function(e){var t,n;0!==e.length?(n=e[0],t=this.$selection.find(".select2-selection__rendered"),e=this.display(n,t),t.empty().append(e),(n=n.title||n.text)?t.attr("title",n):t.removeAttr("title")):this.clear()},i}),u.define("select2/selection/multiple",["jquery","./base","../utils"],function(i,e,c){function r(e,t){r.__super__.constructor.apply(this,arguments)}return c.Extend(r,e),r.prototype.render=function(){var e=r.__super__.render.call(this);return e[0].classList.add("select2-selection--multiple"),e.html('
      '),e},r.prototype.bind=function(e,t){var n=this;r.__super__.bind.apply(this,arguments);var s=e.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",s),this.$selection.on("click",function(e){n.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){var t;n.isDisabled()||(t=i(this).parent(),t=c.GetData(t[0],"data"),n.trigger("unselect",{originalEvent:e,data:t}))}),this.$selection.on("keydown",".select2-selection__choice__remove",function(e){n.isDisabled()||e.stopPropagation()})},r.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},r.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},r.prototype.selectionContainer=function(){return i('
    • ')},r.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=this.$selection.find(".select2-selection__rendered").attr("id")+"-choice-",s=0;s')).attr("title",s()),e.attr("aria-label",s()),e.attr("aria-describedby",n),a.StoreData(e[0],"data",t),this.$selection.prepend(e),this.$selection[0].classList.add("select2-selection--clearable"))},e}),u.define("select2/selection/search",["jquery","../utils","../keys"],function(s,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=this.options.get("translations").get("search"),n=s('');this.$searchContainer=n,this.$search=n.find("textarea"),this.$search.prop("autocomplete",this.options.get("autocomplete")),this.$search.attr("aria-label",t());e=e.call(this);return this._transferTabIndex(),e.append(this.$searchContainer),e},e.prototype.bind=function(e,t,n){var s=this,i=t.id+"-results",r=t.id+"-container";e.call(this,t,n),s.$search.attr("aria-describedby",r),t.on("open",function(){s.$search.attr("aria-controls",i),s.$search.trigger("focus")}),t.on("close",function(){s.$search.val(""),s.resizeSearch(),s.$search.removeAttr("aria-controls"),s.$search.removeAttr("aria-activedescendant"),s.$search.trigger("focus")}),t.on("enable",function(){s.$search.prop("disabled",!1),s._transferTabIndex()}),t.on("disable",function(){s.$search.prop("disabled",!0)}),t.on("focus",function(e){s.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?s.$search.attr("aria-activedescendant",e.data._resultId):s.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){s.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){s._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){var t;e.stopPropagation(),s.trigger("keypress",e),s._keyUpPrevented=e.isDefaultPrevented(),e.which!==l.BACKSPACE||""!==s.$search.val()||0<(t=s.$selection.find(".select2-selection__choice").last()).length&&(t=a.GetData(t[0],"data"),s.searchRemoveChoice(t),e.preventDefault())}),this.$selection.on("click",".select2-search--inline",function(e){s.$search.val()&&e.stopPropagation()});var t=document.documentMode,o=t&&t<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(e){o?s.$selection.off("input.search input.searchcheck"):s.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(e){var t;o&&"input"===e.type?s.$selection.off("input.search input.searchcheck"):(t=e.which)!=l.SHIFT&&t!=l.CTRL&&t!=l.ALT&&t!=l.TAB&&s.handleSearch(e)})},e.prototype._transferTabIndex=function(e){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},e.prototype.createPlaceholder=function(e,t){this.$search.attr("placeholder",t.text)},e.prototype.update=function(e,t){var n=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),e.call(this,t),this.resizeSearch(),n&&this.$search.trigger("focus")},e.prototype.handleSearch=function(){var e;this.resizeSearch(),this._keyUpPrevented||(e=this.$search.val(),this.trigger("query",{term:e})),this._keyUpPrevented=!1},e.prototype.searchRemoveChoice=function(e,t){this.trigger("unselect",{data:t}),this.$search.val(t.text),this.handleSearch()},e.prototype.resizeSearch=function(){this.$search.css("width","25px");var e="100%";""===this.$search.attr("placeholder")&&(e=.75*(this.$search.val().length+1)+"em"),this.$search.css("width",e)},e}),u.define("select2/selection/selectionCss",["../utils"],function(n){function e(){}return e.prototype.render=function(e){var t=e.call(this),e=this.options.get("selectionCssClass")||"";return-1!==e.indexOf(":all:")&&(e=e.replace(":all:",""),n.copyNonInternalCssClasses(t[0],this.$element[0])),t.addClass(e),t},e}),u.define("select2/selection/eventRelay",["jquery"],function(o){function e(){}return e.prototype.bind=function(e,t,n){var s=this,i=["open","opening","close","closing","select","selecting","unselect","unselecting","clear","clearing"],r=["opening","closing","selecting","unselecting","clearing"];e.call(this,t,n),t.on("*",function(e,t){var n;-1!==i.indexOf(e)&&(t=t||{},n=o.Event("select2:"+e,{params:t}),s.$element.trigger(n),-1!==r.indexOf(e)&&(t.prevented=n.isDefaultPrevented()))})},e}),u.define("select2/translation",["jquery","require"],function(t,n){function s(e){this.dict=e||{}}return s.prototype.all=function(){return this.dict},s.prototype.get=function(e){return this.dict[e]},s.prototype.extend=function(e){this.dict=t.extend({},e.all(),this.dict)},s._cache={},s.loadPath=function(e){var t;return e in s._cache||(t=n(e),s._cache[e]=t),new s(s._cache[e])},s}),u.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Œ":"OE","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","œ":"oe","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ώ":"ω","ς":"σ","’":"'"}}),u.define("select2/data/base",["../utils"],function(n){function s(e,t){s.__super__.constructor.call(this)}return n.Extend(s,n.Observable),s.prototype.current=function(e){throw new Error("The `current` method must be defined in child classes.")},s.prototype.query=function(e,t){throw new Error("The `query` method must be defined in child classes.")},s.prototype.bind=function(e,t){},s.prototype.destroy=function(){},s.prototype.generateResultId=function(e,t){e=e.id+"-result-";return e+=n.generateChars(4),null!=t.id?e+="-"+t.id.toString():e+="-"+n.generateChars(4),e},s}),u.define("select2/data/select",["./base","../utils","jquery"],function(e,a,l){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return a.Extend(n,e),n.prototype.current=function(e){var t=this;e(Array.prototype.map.call(this.$element[0].querySelectorAll(":checked"),function(e){return t.item(l(e))}))},n.prototype.select=function(i){var e,r=this;if(i.selected=!0,null!=i.element&&"option"===i.element.tagName.toLowerCase())return i.element.selected=!0,void this.$element.trigger("input").trigger("change");this.$element.prop("multiple")?this.current(function(e){var t=[];(i=[i]).push.apply(i,e);for(var n=0;nthis.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),u.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("select",function(){s._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var s=this;this._checkIfMaximumSelected(function(){e.call(s,t,n)})},e.prototype._checkIfMaximumSelected=function(e,t){var n=this;this.current(function(e){e=null!=e?e.length:0;0=n.maximumSelectionLength?n.trigger("results:message",{message:"maximumSelected",args:{maximum:n.maximumSelectionLength}}):t&&t()})},e}),u.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),u.define("select2/dropdown/search",["jquery"],function(r){function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("translations").get("search"),e=r('');return this.$searchContainer=e,this.$search=e.find("input"),this.$search.prop("autocomplete",this.options.get("autocomplete")),this.$search.attr("aria-label",n()),t.prepend(e),t},e.prototype.bind=function(e,t,n){var s=this,i=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){s.trigger("keypress",e),s._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){r(this).off("keyup")}),this.$search.on("keyup input",function(e){s.handleSearch(e)}),t.on("open",function(){s.$search.attr("tabindex",0),s.$search.attr("aria-controls",i),s.$search.trigger("focus"),window.setTimeout(function(){s.$search.trigger("focus")},0)}),t.on("close",function(){s.$search.attr("tabindex",-1),s.$search.removeAttr("aria-controls"),s.$search.removeAttr("aria-activedescendant"),s.$search.val(""),s.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||s.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(s.showSearch(e)?s.$searchContainer[0].classList.remove("select2-search--hide"):s.$searchContainer[0].classList.add("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?s.$search.attr("aria-activedescendant",e.data._resultId):s.$search.removeAttr("aria-activedescendant")})},e.prototype.handleSearch=function(e){var t;this._keyUpPrevented||(t=this.$search.val(),this.trigger("query",{term:t})),this._keyUpPrevented=!1},e.prototype.showSearch=function(e,t){return!0},e}),u.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,s){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,s)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return t="string"==typeof t?{id:"",text:t}:t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),s=t.length-1;0<=s;s--){var i=t[s];this.placeholder.id===i.id&&n.splice(s,1)}return n},e}),u.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,s){this.lastParams={},e.call(this,t,n,s),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("query",function(e){s.lastParams=e,s.loading=!0}),t.on("query:append",function(e){s.lastParams=e,s.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);!this.loading&&e&&(e=this.$results.offset().top+this.$results.outerHeight(!1),this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=e+50&&this.loadMore())},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('
    • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),u.define("select2/dropdown/attachBody",["jquery","../utils"],function(u,o){function e(e,t,n){this.$dropdownParent=u(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("open",function(){s._showDropdown(),s._attachPositioningHandler(t),s._bindContainerResultHandlers(t)}),t.on("close",function(){s._hideDropdown(),s._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t[0].classList.remove("select2"),t[0].classList.add("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=u(""),e=e.call(this);return t.append(e),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){var n;this._containerResultsHandlersBound||(n=this,t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0)},e.prototype._attachPositioningHandler=function(e,t){var n=this,s="scroll.select2."+t.id,i="resize.select2."+t.id,r="orientationchange.select2."+t.id,t=this.$container.parents().filter(o.hasScroll);t.each(function(){o.StoreData(this,"select2-scroll-position",{x:u(this).scrollLeft(),y:u(this).scrollTop()})}),t.on(s,function(e){var t=o.GetData(this,"select2-scroll-position");u(this).scrollTop(t.y)}),u(window).on(s+" "+i+" "+r,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,s="resize.select2."+t.id,t="orientationchange.select2."+t.id;this.$container.parents().filter(o.hasScroll).off(n),u(window).off(n+" "+s+" "+t)},e.prototype._positionDropdown=function(){var e=u(window),t=this.$dropdown[0].classList.contains("select2-dropdown--above"),n=this.$dropdown[0].classList.contains("select2-dropdown--below"),s=null,i=this.$container.offset();i.bottom=i.top+this.$container.outerHeight(!1);var r={height:this.$container.outerHeight(!1)};r.top=i.top,r.bottom=i.top+r.height;var o=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ai.bottom+o,a={left:i.left,top:r.bottom},l=this.$dropdownParent;"static"===l.css("position")&&(l=l.offsetParent());i={top:0,left:0};(u.contains(document.body,l[0])||l[0].isConnected)&&(i=l.offset()),a.top-=i.top,a.left-=i.left,t||n||(s="below"),e||!c||t?!c&&e&&t&&(s="below"):s="above",("above"==s||t&&"below"!==s)&&(a.top=r.top-i.top-o),null!=s&&(this.$dropdown[0].classList.remove("select2-dropdown--below"),this.$dropdown[0].classList.remove("select2-dropdown--above"),this.$dropdown[0].classList.add("select2-dropdown--"+s),this.$container[0].classList.remove("select2-container--below"),this.$container[0].classList.remove("select2-container--above"),this.$container[0].classList.add("select2-container--"+s)),this.$dropdownContainer.css(a)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),u.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,s){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,s)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,s=0;s');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container[0].classList.add("select2-container--"+this.options.get("theme")),r.StoreData(e[0],"element",this.$element),e},o}),u.define("jquery-mousewheel",["jquery"],function(e){return e}),u.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(i,e,r,t,o){var a;return null==i.fn.select2&&(a=["open","close","destroy"],i.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=i.extend(!0,{},t);new r(i(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,s=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=o.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),n=e[t].apply(e,s)}),-1this.countryCodeMaxLen&&(this.countryCodeMaxLen=c.length),this.q.hasOwnProperty(c)||(this.q[c]=[]);for(var e=0;e-1})}else if(this.d.excludeCountries.length){var b=this.d.excludeCountries.map(function(a){return a.toLowerCase()});this.p=i.filter(function(a){return-1===b.indexOf(a.iso2)})}else this.p=i}},{key:"_d0",value:function(){for(var a=0;ab.name?1:0}},{key:"_d2",value:function(){this.countryCodeMaxLen=0,this.dialCodes={},this.q={};for(var a=0;a"),this.d.showFlags&&(d+="
      ")),d+="".concat(f.name,""),d+="+".concat(f.dialCode,""),d+=""}this.m.insertAdjacentHTML("beforeend",d)}},{key:"_h",value:function(){var a=this.a.getAttribute("value"),b=this.a.value,c=a&&"+"===a.charAt(0)&&(!b||"+"!==b.charAt(0)),d=c?a:b,e=this._5(d),f=this._w(d),g=this.d,h=g.initialCountry,i=g.autoInsertDialCode;e&&!f?this._v(d):"auto"!==h&&(h?this._z(h.toLowerCase()):e&&f?this._z("us"):(this.j=this.preferredCountries.length?this.preferredCountries[0].iso2:this.p[0].iso2,d||this._z(this.j)),!d&&i&&(this.a.value="+".concat(this.s.dialCode))),d&&this._u(d)}},{key:"_i",value:function(){this._j(),this.d.autoInsertDialCode&&this._l(),this.d.allowDropdown&&this._i2(),this.hiddenInput&&this._i0()}},{key:"_i0",value:function(){var a=this;this._a14=function(){a.hiddenInput.value=a.getNumber()},this.a.form&&this.a.form.addEventListener("submit",this._a14)}},{key:"_i1",value:function(){for(var a=this.a;a&&"LABEL"!==a.tagName;)a=a.parentNode;return a}},{key:"_i2",value:function(){var a=this;this._a9=function(b){a.m.classList.contains("iti__hide")?a.a.focus():b.preventDefault()};var b=this._i1();b&&b.addEventListener("click",this._a9),this._a10=function(){!a.m.classList.contains("iti__hide")||a.a.disabled||a.a.readOnly||a._n()},this.selectedFlag.addEventListener("click",this._a10),this._a11=function(b){a.m.classList.contains("iti__hide")&&-1!==["ArrowUp","Up","ArrowDown","Down"," ","Enter"].indexOf(b.key)&&(b.preventDefault(),b.stopPropagation(),a._n()),"Tab"===b.key&&a._2()},this.k.addEventListener("keydown",this._a11)}},{key:"_i3",value:function(){var a=this;this.d.utilsScript&&!window.intlTelInputUtils?window.intlTelInputGlobals.documentReady()?window.intlTelInputGlobals.loadUtils(this.d.utilsScript):window.addEventListener("load",function(){window.intlTelInputGlobals.loadUtils(a.d.utilsScript)}):this.i0(),"auto"===this.d.initialCountry?this._i4():this.h()}},{key:"_i4",value:function(){window.intlTelInputGlobals.autoCountry?this.handleAutoCountry():window.intlTelInputGlobals.startedLoadingAutoCountry||(window.intlTelInputGlobals.startedLoadingAutoCountry=!0,"function"==typeof this.d.geoIpLookup&&this.d.geoIpLookup(function(a){window.intlTelInputGlobals.autoCountry=a.toLowerCase(),setTimeout(function(){return q("handleAutoCountry")})},function(){return q("rejectAutoCountryPromise")}))}},{key:"_j",value:function(){var a=this;this._a12=function(){a._v(a.a.value)&&a._m2CountryChange()},this.a.addEventListener("keyup",this._a12),this._a13=function(){setTimeout(a._a12)},this.a.addEventListener("cut",this._a13),this.a.addEventListener("paste",this._a13)}},{key:"_j2",value:function(a){var b=this.a.getAttribute("maxlength");return b&&a.length>b?a.substr(0,b):a}},{key:"_l",value:function(){var a=this;this._a8=function(){a._l2()},this.a.form&&this.a.form.addEventListener("submit",this._a8),this.a.addEventListener("blur",this._a8)}},{key:"_l2",value:function(){if("+"===this.a.value.charAt(0)){var a=this._m(this.a.value);a&&this.s.dialCode!==a||(this.a.value="")}}},{key:"_m",value:function(a){return a.replace(/\D/g,"")}},{key:"_m2",value:function(a){var b=document.createEvent("Event");b.initEvent(a,!0,!0),this.a.dispatchEvent(b)}},{key:"_n",value:function(){this.m.classList.remove("iti__hide"),this.selectedFlag.setAttribute("aria-expanded","true"),this._o(),this.b&&(this._x(this.b,!1),this._3(this.b,!0)),this._p(),this.u.classList.add("iti__arrow--up"),this._m2("open:countrydropdown")}},{key:"_n2",value:function(a,b,c){c&&!a.classList.contains(b)?a.classList.add(b):!c&&a.classList.contains(b)&&a.classList.remove(b)}},{key:"_o",value:function(){var a=this;if(this.d.dropdownContainer&&this.d.dropdownContainer.appendChild(this.dropdown),!this.g){var b=this.a.getBoundingClientRect(),c=window.pageYOffset||document.documentElement.scrollTop,d=b.top+c,e=this.m.offsetHeight,f=d+this.a.offsetHeight+ec;if(this._n2(this.m,"iti__country-list--dropup",!f&&g),this.d.dropdownContainer){var h=!f&&g?0:this.a.offsetHeight;this.dropdown.style.top="".concat(d+h,"px"),this.dropdown.style.left="".concat(b.left+document.body.scrollLeft,"px"),this._a4=function(){return a._2()},window.addEventListener("scroll",this._a4)}}}},{key:"_o2",value:function(a){for(var b=a;b&&b!==this.m&&!b.classList.contains("iti__country");)b=b.parentNode;return b===this.m?null:b}},{key:"_p",value:function(){var a=this;this._a0=function(b){var c=a._o2(b.target);c&&a._x(c,!1)},this.m.addEventListener("mouseover",this._a0),this._a1=function(b){var c=a._o2(b.target);c&&a._1(c)},this.m.addEventListener("click",this._a1);var b=!0;this._a2=function(){b||a._2(),b=!1},document.documentElement.addEventListener("click",this._a2);var c="",d=null;this._a3=function(b){b.preventDefault(),"ArrowUp"===b.key||"Up"===b.key||"ArrowDown"===b.key||"Down"===b.key?a._q(b.key):"Enter"===b.key?a._r():"Escape"===b.key?a._2():/^[a-zA-ZÀ-ÿа-яА-Я ]$/.test(b.key)&&(d&&clearTimeout(d),c+=b.key.toLowerCase(),a._s(c),d=setTimeout(function(){c=""},1e3))},document.addEventListener("keydown",this._a3)}},{key:"_q",value:function(a){var b="ArrowUp"===a||"Up"===a?this.c.previousElementSibling:this.c.nextElementSibling;b&&(b.classList.contains("iti__divider")&&(b="ArrowUp"===a||"Up"===a?b.previousElementSibling:b.nextElementSibling),this._x(b,!0))}},{key:"_r",value:function(){this.c&&this._1(this.c)}},{key:"_s",value:function(a){for(var b=0;bg){b&&(k+=l);var m=e-h;c.scrollTop=k-m}}},{key:"_4",value:function(a){var b,c=this.a.value,d="+".concat(a);if("+"===c.charAt(0)){var e=this._5(c);b=e?c.replace(e,d):d,this.a.value=b}else this.d.autoInsertDialCode&&(b=c?d+c:d,this.a.value=b)}},{key:"_5",value:function(a,b){var c="";if("+"===a.charAt(0))for(var d="",e=0;ea.length?!1:M(Ga,a)}function Ja(a){return M(Ba,a)?N(a,wa):N(a,va)}function Ka(a){var b=Ja(a.toString());a.i="";a.g(b)}function La(a){return null!=a&&(1!=w(a,9)||-1!=t(a,9)[0])}function N(a,b){for(var c=new C,d,f=a.length,e=0;eb?2:e[e.length-1]=b.i.length)throw Error("Phone number too short after IDD"); + a:{a=b.toString();if(0!=a.length&&"0"!=a.charAt(0))for(f=a.length,b=1;3>=b&&b<=f;++b)if(c=parseInt(a.substring(0,b),10),c in I){d.g(a.substring(b));d=c;break a}d=0}if(0!=d)return q(e,1,d),d;throw Error("Invalid country calling code");}if(null!=c&&(g=v(c,10),h=""+g,l=b.toString(),0==l.lastIndexOf(h,0)&&(h=new C(l.substring(h.length)),l=p(c,1),l=new RegExp(v(l,2)),Qa(h,c,null),h=h.toString(),!M(l,b.toString())&&M(l,h)||3==W(a,b.toString(),c,-1))))return d.g(h),f&&q(e,6,10),q(e,1,g),g;q(e,1,0);return 0} + function Qa(a,b,c){var d=a.toString(),f=d.length,e=p(b,15);if(0!=f&&null!=e&&0!=e.length){var g=new RegExp("^(?:"+e+")");if(f=g.exec(d)){e=new RegExp(v(p(b,1),2));var h=M(e,d),l=f.length-1;b=p(b,16);if(null==b||0==b.length||null==f[l]||0==f[l].length){if(!h||M(e,d.substring(f[0].length)))null!=c&&0=b.length)e="";else{var g=b.indexOf(";",e);e=-1!==g?b.substring(e,g):b.substring(e)}var h=e;null==h?g=!0:0===h.length?g=!1:(g=Ca.exec(h),h=Da.exec(h),g=null!==g||null!==h);if(!g)throw Error("The string supplied did not seem to be a phone number"); + null!=e?("+"===e.charAt(0)&&f.g(e),e=b.indexOf("tel:"),f.g(b.substring(0<=e?e+4:0,b.indexOf(";phone-context=")))):(e=f.g,g=b??"",h=g.search(ya),0<=h?(g=g.substring(h),g=g.replace(Aa,""),h=g.search(za),0<=h&&(g=g.substring(0,h))):g="",e.call(f,g));e=f.toString();g=e.indexOf(";isub=");0b.i.length)throw Error("The string supplied is too short to be a phone number");null!=g&&(c=new C,f=new C(b.toString()),Qa(f,g,c),a=W(a,f.toString(),g,-1),2!=a&&4!=a&&5!=a&&(b=f,d&&0a)throw Error("The string supplied is too short to be a phone number");if(17{try{const f=J.g(),e=Z(f,a,b);var d=X(f,e);return 0==d||4==d?Ma(f,e,"undefined"===typeof c?0:c):a}catch(f){return a}});k("intlTelInputUtils.getExampleNumber",(a,b,c)=>{try{const h=J.g();a:{var d=h;if(O(a)){var f=T(S(d,a),c);try{if(null!=f.g[6]){var e=p(f,6);var g=Ra(d,e,a,!1);break a}}catch(l){}}g=null}return Ma(h,g,b?2:1)}catch(h){return""}});k("intlTelInputUtils.getExtension",(a,b)=>{try{return p(Z(J.g(),a,b),3)}catch(c){return""}}); + k("intlTelInputUtils.getNumberType",(a,b)=>{try{const h=J.g();var c=Z(h,a,b);a=h;var d=Oa(a,c),f=Q(a,v(c,1),d);if(null==f)var e=-1;else{var g=P(c);e=U(g,f)}return e}catch(h){return-99}}); + k("intlTelInputUtils.getValidationError",(a,b)=>{try{const c=J.g(),d=Z(c,a,b);return X(c,d)}catch(c){return"Invalid country calling code"===c.message?1:"Phone number too short after IDD"===c.message||"The string supplied is too short to be a phone number"===c.message?2:"The string supplied is too long to be a phone number"===c.message?3:-99}}); + k("intlTelInputUtils.isValidNumber",(a,b)=>{try{const Y=J.g();var c=Z(Y,a,b);a=Y;var d=Oa(a,c);var f=v(c,1),e=Q(a,f,d),g;if(!(g=null==e)){var h;if(h="001"!=d){var l=S(a,d);if(null==l)throw Error("Invalid region code: "+d);var A=v(l,10);h=f!=A}g=h}if(g)var G=!1;else{var Sa=P(c);G=-1!=U(Sa,e)}return G}catch(Y){return!1}});k("intlTelInputUtils.isPossibleNumber",(a,b)=>{try{const c=J.g(),d=Z(c,a,b);return 0===X(c,d)}catch(c){return!1}}); + k("intlTelInputUtils.numberFormat",{E164:0,INTERNATIONAL:1,NATIONAL:2,RFC3966:3});k("intlTelInputUtils.numberType",{FIXED_LINE:0,MOBILE:1,FIXED_LINE_OR_MOBILE:2,TOLL_FREE:3,PREMIUM_RATE:4,SHARED_COST:5,VOIP:6,PERSONAL_NUMBER:7,PAGER:8,UAN:9,VOICEMAIL:10,UNKNOWN:-1});k("intlTelInputUtils.validationError",{IS_POSSIBLE:0,INVALID_COUNTRY_CODE:1,TOO_SHORT:2,TOO_LONG:3,IS_POSSIBLE_LOCAL_ONLY:4,INVALID_LENGTH:5});})(); From 9801c39ce63ac70546a2db3caf06ef7000ef14f9 Mon Sep 17 00:00:00 2001 From: Vladyslav Kuksiuk Date: Thu, 13 Aug 2026 13:44:52 +0200 Subject: [PATCH 03/17] Update checkout and checkout-completed pages. --- .../tasks/align-checkout-shared-controls.md | 68 ++++ site/assets/js/modules/forms/phone-number.js | 30 ++ site/assets/js/pages/checkout/completed.js | 2 +- site/assets/js/pages/checkout/countries.js | 80 +++++ site/assets/js/pages/checkout/dom.js | 13 +- .../js/pages/checkout/form-controller.js | 293 ++++++++++-------- site/assets/js/pages/checkout/index.js | 113 +++++-- site/assets/scss/modules/_forms.scss | 13 + site/assets/scss/modules/_result-panel.scss | 51 ++- site/assets/scss/pages/_checkout.scss | 139 ++++++++- site/config/development/hugo.toml | 1 + site/content/checkout-completed/index.md | 2 +- .../_partials/components/result-panel.html | 36 ++- .../_partials/getting-help/services.html | 2 +- site/layouts/checkout-completed/single.html | 26 +- site/layouts/checkout/single.html | 77 ++--- site/tests/checkout-completed.test.mjs | 3 +- site/tests/checkout-configuration.test.mjs | 115 ++++++- 18 files changed, 821 insertions(+), 243 deletions(-) create mode 100644 .agents/tasks/align-checkout-shared-controls.md diff --git a/.agents/tasks/align-checkout-shared-controls.md b/.agents/tasks/align-checkout-shared-controls.md new file mode 100644 index 00000000..2ff0cecf --- /dev/null +++ b/.agents/tasks/align-checkout-shared-controls.md @@ -0,0 +1,68 @@ +--- +slug: align-checkout-shared-controls +branch: update-checkout +owner: codex +status: completed +started: 2026-08-13 +--- + +## Goal + +Use the current `site-commons` country selector and international phone input +on the Spine checkout while preserving the Spine-specific checkout and payment +result behavior. + +## Plan + +- [x] Vendor the exact shared Select2 and `intl-tel-input` runtime assets without + changing the public `site-commons` module pin. +- [x] Adapt the checkout template and controller to the shared component APIs. +- [x] Preserve optional phone behavior and Paygate payload normalization. +- [x] Add or update focused JavaScript tests. +- [x] Build with CI-pinned Hugo and inspect desktop/mobile behavior. + +## Log + +- 2026-08-13 — confirmed the pinned May 2026 module predates the shared Select2 + and `intl-tel-input` assets; current `site-commons` master contains both. +- 2026-08-13 — retained the public module pin because the current TeamDev module + path is private, and copied only the controls' runtime files and flag sprites. +- 2026-08-13 — `npm test` passed 32 tests; JavaScript syntax checks and + `git diff --check` passed. +- 2026-08-13 — CI-pinned Hugo 0.161.1 development and production builds passed; + production still renders `spine-standard-support`, while development uses the + staging product ID. +- 2026-08-13 — verified both dropdowns in the local browser at desktop and + 390-by-844 mobile sizes with no horizontal overflow. +- 2026-08-13 — collapsed the hidden native country select's inherited minimum + height so the visible Select2 control sits directly below its label. +- 2026-08-13 — restored the shared form action spacing and intrinsic desktop + button width for `Continue to payment`; narrow screens retain full width. +- 2026-08-13 — removed the Business details divider and matched the Company + name-to-VAT ID spacing to the form's standard 24-pixel row gap. +- 2026-08-13 — restored the completed-payment page's pre-redesign content-height + layout, removing the checkout form's inherited full-viewport minimum height. +- 2026-08-13 — positioned VAT validation feedback inside the existing action + gap so error-state changes do not reflow the VAT field or payment button. +- 2026-08-13 — clear a previous VAT API error on each input edit; only the + latest non-stale server validation response can render a new VAT error. +- 2026-08-13 — focus the active Select2 search field whenever the country + dropdown opens so typing can begin without a second click. +- 2026-08-13 — added primary checkout and secondary home actions to failed + payments, and rendered result-page sales addresses as `mailto:` links. +- 2026-08-13 — separated payment-result contact copy into its own paragraph + with a consistent 24-pixel gap above it. +- 2026-08-13 — persist the billing country in the checkout history entry and + restore its Select2, VAT, phone, and charge state after browser Back. +- 2026-08-13 — preserve the independently selected phone country and VAT ID in + the same history entry and restore them after the billing-country widget. +- 2026-08-13 — verified browser Back restores Estonia billing, Poland phone + country, and `EE123456789`; all 36 JavaScript tests and both Hugo builds pass. +- 2026-08-13 — limit custom checkout restoration to Back/Forward navigation; + explicit reload clears billing country, phone country, VAT ID, and saved state. +- 2026-08-13 — with optional cookies declined, verified reload resets Estonia, + Poland (+48), and VAT ID while browser Back restores all three. +- 2026-08-13 — removed the custom `history.state` payload; native form controls + now retain billing/VAT, with a native phone-country mirror for widget sync. +- 2026-08-13 — verified the native path restores Estonia, Poland (+48), VAT ID, + and other inputs after Back, resets on reload, and passes 35 tests/builds. diff --git a/site/assets/js/modules/forms/phone-number.js b/site/assets/js/modules/forms/phone-number.js index b6a29325..be5eca2c 100644 --- a/site/assets/js/modules/forms/phone-number.js +++ b/site/assets/js/modules/forms/phone-number.js @@ -64,3 +64,33 @@ export function normalizePhoneNumber(rawCountryCode, rawNumber) { number }; } + +/** + * Builds a Paygate phone payload from an `intl-tel-input` field. + * + * @param {string} rawNumber displayed national phone number + * @param {string} rawCountryCode selected international dial code + * @param {string} rawFullNumber full number returned by the plugin + * @return {{countryCode: number, number: string}|null} + * normalized phone-number payload, or null when incomplete + */ +export function normalizeIntlPhoneNumber(rawNumber, rawCountryCode, rawFullNumber) { + const countryCode = digits(rawCountryCode); + const fullNumber = digits(rawFullNumber); + const fallbackNumber = digits(rawNumber); + + if (!countryCode || !fallbackNumber) { + return null; + } + + const number = fullNumber.indexOf(countryCode) === 0 + ? fullNumber.slice(countryCode.length) + : fallbackNumber; + + return normalizePhoneNumber(countryCode, number); +} + +/** Returns decimal digits from a phone-number fragment. */ +function digits(value) { + return String(value || '').replace(/\D/g, ''); +} diff --git a/site/assets/js/pages/checkout/completed.js b/site/assets/js/pages/checkout/completed.js index c264c407..5e587267 100644 --- a/site/assets/js/pages/checkout/completed.js +++ b/site/assets/js/pages/checkout/completed.js @@ -173,7 +173,7 @@ function init() { /** Makes the failed-payment action navigate back to the same order. */ function configureBackToCheckoutLink(orderId) { - const link = document.querySelector('#payment-failed .result-panel-button'); + const link = document.querySelector('#payment-failed [data-back-to-checkout]'); if (!link) { return; } diff --git a/site/assets/js/pages/checkout/countries.js b/site/assets/js/pages/checkout/countries.js index f0d10b7f..8ec8a7c4 100644 --- a/site/assets/js/pages/checkout/countries.js +++ b/site/assets/js/pages/checkout/countries.js @@ -19,6 +19,23 @@ const countryCodes = `AD AE AF AG AI AL AM AO AQ AR AS AT AU AW AX AZ BA BB BD BE BF BG BH BI BJ BL BM BN BO BQ BR BS BT BV BW BY BZ CA CC CD CF CG CH CI CK CL CM CN CO CR CU CV CW CX CY CZ DE DJ DK DM DO DZ EC EE EG EH ER ES ET FI FJ FK FM FO FR GA GB GD GE GF GG GH GI GL GM GN GP GQ GR GS GT GU GW GY HK HM HN HR HT HU ID IE IL IM IN IO IQ IR IS IT JE JM JO JP KE KG KH KI KM KN KP KR KW KY KZ LA LB LC LI LK LR LS LT LU LV LY MA MC MD ME MF MG MH MK ML MM MN MO MP MQ MR MS MT MU MV MW MX MY MZ NA NC NE NF NG NI NL NO NP NR NU NZ OM PA PE PF PG PH PK PL PM PN PR PS PT PW PY QA RE RO RS RU RW SA SB SC SD SE SG SH SI SJ SK SL SM SN SO SR SS ST SV SX SY SZ TC TD TF TG TH TJ TK TL TM TN TO TR TT TV TW TZ UA UG UM US UY UZ VA VC VE VG VI VN VU WF WS YE YT ZA ZM ZW` .split(' '); +export const checkoutNavigationMode = Object.freeze({ + none: 'none', + reset: 'reset', + restore: 'restore' +}); + +/** Chooses whether checkout state should be restored or reset for a navigation. */ +export function getCheckoutNavigationMode(navigationType, pagePersisted = false) { + if (navigationType === 'reload') { + return checkoutNavigationMode.reset; + } + if (pagePersisted || navigationType === 'back_forward') { + return checkoutNavigationMode.restore; + } + return checkoutNavigationMode.none; +} + /** * Populates a billing-country select with ISO 3166-1 countries. * @@ -45,3 +62,66 @@ export function populateCountrySelect(select) { }); } +/** + * Initializes the shared Select2 country control with flag sprites. + * + * @param {HTMLSelectElement} select country select to initialize + */ +export function initializeCountrySelector(select) { + populateCountrySelect(select); + + if (!select || !window.jQuery || typeof window.jQuery.fn.select2 !== 'function') { + return; + } + + const $select = window.jQuery(select); + $select.select2({ + placeholder: select.dataset.placeholder || '', + templateResult: formatCountry, + templateSelection: formatCountry, + width: '100%' + }); + $select.on('select2:open', () => { + focusOpenCountrySearchField(); + }); +} + +/** + * Focuses the search input belonging to the currently open country dropdown. + * + * @param {Document|HTMLElement} [root=document] root used to find the open dropdown + */ +export function focusOpenCountrySearchField(root = document) { + const searchField = root.querySelector( + '.select2-container--open .select2-search__field' + ); + + if (searchField) { + searchField.focus(); + } +} + +/** + * Renders one Select2 country option using the shared flag sprite. + * + * @param {Object} country Select2 option data + * @return {string|JQuery} rendered country option + */ +function formatCountry(country) { + if (!country.id) { + return country.text; + } + + const normalizedCode = String(country.id).toLowerCase(); + const $flag = window.jQuery('') + .addClass(`iti__flag iti__${normalizedCode}`) + .attr('aria-hidden', 'true'); + const $label = window.jQuery('') + .addClass('country-selector__text') + .text(country.text); + + return window.jQuery('') + .addClass('country-selector__option') + .append($flag) + .append($label); +} diff --git a/site/assets/js/pages/checkout/dom.js b/site/assets/js/pages/checkout/dom.js index 342c0170..2cf92831 100644 --- a/site/assets/js/pages/checkout/dom.js +++ b/site/assets/js/pages/checkout/dom.js @@ -33,12 +33,8 @@ * @property {JQuery} $form checkout billing form wrapper * @property {JQuery} $summary order summary container * @property {JQuery} $country billing country select - * @property {JQuery} $phone custom phone field wrapper - * @property {JQuery} $phoneCountryCode phone country-code - * select - * @property {JQuery} $phoneFlag visible phone country flag - * @property {JQuery} $phoneDialCode visible phone dial code label - * @property {JQuery} $phoneNumber national phone number input + * @property {JQuery} $phoneNumber international phone input + * @property {JQuery} $phoneCountry native phone-country state * @property {JQuery} $vatId vat ID input * @property {JQuery} $loading summary loading container * @property {JQuery} $loadingSpinner summary spinner element @@ -69,11 +65,8 @@ export function getCheckoutDom() { $form: $('#checkout-form'), $summary: $('.checkout-summary'), $country: $('#checkout-country'), - $phone: $('.phone-field'), - $phoneCountryCode: $('#checkout-phone-country-code'), - $phoneFlag: $('#checkout-phone-flag'), - $phoneDialCode: $('#checkout-phone-dial-code'), $phoneNumber: $('#checkout-phone'), + $phoneCountry: $('#checkout-phone-country'), $vatId: $('#checkout-vat-id'), $loading: $('#checkout-summary-loading'), $loadingSpinner: $('#checkout-summary-loading-spinner'), diff --git a/site/assets/js/pages/checkout/form-controller.js b/site/assets/js/pages/checkout/form-controller.js index b5209810..d0757e44 100644 --- a/site/assets/js/pages/checkout/form-controller.js +++ b/site/assets/js/pages/checkout/form-controller.js @@ -26,14 +26,8 @@ 'use strict'; -import { - euCountryPhoneCodes, - isEuCountry -} from 'js/pages/checkout/phone-codes'; -import { - normalizePhoneNumber, - sanitizePhoneNumberInput -} from 'js/modules/forms/phone-number'; +import {isEuCountry} from 'js/pages/checkout/phone-codes'; +import {normalizeIntlPhoneNumber} from 'js/modules/forms/phone-number'; /** * Generic async field-validation states. @@ -62,22 +56,28 @@ export const fieldValidationState = Object.freeze({ * attaches phone field event handlers * @property {function(string): SubmitBillingInfoRequest} * buildSubmitBillingInfoRequest builds the billing-info payload for Paygate + * @property {function(): void} clearVatIdError + * clears the VAT ID API validation error * @property {function(): void} focusPhoneNumber * focuses the phone number input when a country is selected * @property {function(): string} getVatId * returns VAT ID only when it applies to the selected country + * @property {function(Object): void} restoreCountryState + * restores the billing-country and phone-country controls * @property {function(HTMLElement, string): void} setFieldValidationState * updates generic async field validation styling * @property {function(string): void} showVatIdError * renders VAT API validation errors inline - * @property {function(): void} updatePhoneCountryDisplay - * refreshes visible phone-country UI + * @property {function(): void} initPhoneNumberField + * initializes the shared international phone input * @property {function(): void} updateVatIdFieldState * refreshes VAT field state after country changes * @property {function(HTMLInputElement|HTMLSelectElement|HTMLTextAreaElement):boolean} validateField * validates one form field * @property {function(string): boolean} validateRequiredFields * validates all required checkout fields + * @property {function(): boolean} validatePhoneNumber + * validates the optional international phone number */ /** @@ -88,14 +88,45 @@ export const fieldValidationState = Object.freeze({ * @return {CheckoutFormController} checkout form helpers and event handlers */ export function createCheckoutFormController({dom}) { + let isSettingPhoneCountryProgrammatically = false; + + /** Initializes the shared `intl-tel-input` field. */ + function initPhoneNumberField() { + const field = dom.$phoneNumber.get(0); + + if (!field || typeof window.intlTelInput !== 'function') { + return; + } + + window.intlTelInput(field, { + initialCountry: normalizeCountryCode(dom.$phoneCountry.val()) || 'us', + autoPlaceholder: 'aggressive', + separateDialCode: true, + formatOnDisplay: true, + utilsScript: '/libs/intl-tel-input/utils.js' + }); + syncPhoneCountryState(); + } + /** - * Attaches event handlers for the custom phone field. + * Attaches event handlers for the shared phone field. + * + * @param {Object} options phone event options + * @param {function(): void} [options.onPhoneCountryChange] called after a + * user-driven phone country change */ - function bindPhoneEvents() { - dom.$phone.on('click', focusPhoneCountrySelectorIfMissing); - dom.$phoneNumber.on('focus', focusPhoneCountrySelectorIfMissing); - dom.$phoneNumber.on('beforeinput', preventUnsupportedPhoneInput); - dom.$phoneNumber.on('input', sanitizePhoneNumberValue); + function bindPhoneEvents({onPhoneCountryChange} = {}) { + dom.$phoneNumber.on('countrychange', () => { + syncPhoneCountryState(); + if ( + !isSettingPhoneCountryProgrammatically && + typeof onPhoneCountryChange === 'function' + ) { + onPhoneCountryChange(); + } + }); + dom.$phoneNumber.on('input', () => setPhoneFieldError('')); + dom.$phoneNumber.on('blur', validatePhoneNumber); } /** @@ -127,6 +158,10 @@ export function createCheckoutFormController({dom}) { return true; } + if (field.type === 'tel') { + return true; + } + const value = field.value ? field.value.trim() : ''; let message = ''; @@ -140,6 +175,20 @@ export function createCheckoutFormController({dom}) { return !message; } + /** + * Validates the optional phone number through `intl-tel-input`. + * + * @return {boolean} true when the phone is empty or valid + */ + function validatePhoneNumber() { + const value = String(dom.$phoneNumber.val() || '').trim(); + const phoneInput = getPhoneInputInstance(); + const isValid = !value || Boolean(phoneInput && phoneInput.isValidNumber()); + + setPhoneFieldError(isValid ? '' : 'Enter a valid phone number.'); + return isValid; + } + /** * Shows the API-provided VAT ID validation error on the VAT ID field. * @@ -152,6 +201,11 @@ export function createCheckoutFormController({dom}) { setFieldError(dom.$vatId.get(0), vatIdErrorMessage(reason)); } + /** Clears an earlier VAT ID validation response after the input changes. */ + function clearVatIdError() { + setFieldError(dom.$vatId.get(0), ''); + } + /** * Updates generic async field validation styling. * @@ -177,7 +231,6 @@ export function createCheckoutFormController({dom}) { return; } - field.disabled = !isRelevant; fieldContainer.hidden = !isRelevant; if (!isRelevant) { @@ -215,10 +268,7 @@ export function createCheckoutFormController({dom}) { const fullName = [field('first_name'), field('last_name')] .filter(Boolean) .join(' ') || companyName; - const phoneNumber = normalizePhoneNumber( - formData.phone_country_code || '', - formData.phone_number || '' - ); + const phoneNumber = buildPhoneNumberPayload(); const company = companyName || vatId ? { ...(companyName ? {name: companyName} : {}), ...(vatId ? {vatId} : {}) @@ -256,13 +306,13 @@ export function createCheckoutFormController({dom}) { return false; } - const countryCode = countryCodeFromPhoneCode(getPhoneCountryCode()); + const countryCode = getSelectedPhoneCountryCode(); if (!countryCode || !hasCountryOption(countryCode) || dom.$country.val() === countryCode) { return false; } - dom.$country.val(countryCode); + setBillingCountry(countryCode); return true; } @@ -273,123 +323,100 @@ export function createCheckoutFormController({dom}) { */ function applyPhoneCountryFromBillingCountry(phoneCountryManuallySelected) { if (phoneCountryManuallySelected || hasPhoneNumber()) { - updatePhoneCountryDisplay(); return; } - setPhoneCountryCode(euCountryPhoneCodes[dom.$country.val()] || ''); - updatePhoneCountryDisplay(); + setPhoneCountry(dom.$country.val()); } - /** - * Mirrors the selected phone country into the custom visible phone field. - */ - function updatePhoneCountryDisplay() { - restorePhoneCountryFromBillingCountry(); - const selection = getPhoneCountrySelection(); - - dom.$phoneFlag.text(selection.flag); - dom.$phoneDialCode.text(selection.code); - dom.$phone.attr( - 'data-phone-country-selected', - selection.isSelected ? 'true' : 'false' - ); - dom.$phoneNumber.prop('disabled', !selection.isSelected); - - if (!selection.isSelected && !hasPhoneNumber()) { - clearPhoneNumber(); + /** Restores billing-country and phone-country controls from browser history. */ + function restoreCountryState({billingCountryCode, phoneCountryCode}) { + if (hasCountryOption(billingCountryCode)) { + setBillingCountry(billingCountryCode); } - } - /** - * Restores phone country from billing country when browser already restored the number. - */ - function restorePhoneCountryFromBillingCountry() { - if (getPhoneCountryCode() || !hasPhoneNumber()) { - return; - } + setPhoneCountry(phoneCountryCode || billingCountryCode); + } - setPhoneCountryCode(euCountryPhoneCodes[dom.$country.val()] || ''); + /** Returns country values restored by the browser's native form state. */ + function getBrowserRestoredCountryState() { + return { + billingCountryCode: normalizeCountryCode(dom.$country.val()), + phoneCountryCode: normalizeCountryCode(dom.$phoneCountry.val()) + }; } /** * Focuses the phone number input when the phone country is selected. */ function focusPhoneNumber() { - if (!getPhoneCountryCode()) { - return; - } - window.requestAnimationFrame(() => { dom.$phoneNumber.trigger('focus'); }); } - /** - * Focuses the phone-country select when the number part cannot be used yet. - */ - function focusPhoneCountrySelectorIfMissing() { - if (!getPhoneCountryCode()) { - dom.$phoneCountryCode.trigger('focus'); + /** Returns the `intl-tel-input` instance for the checkout phone field. */ + function getPhoneInputInstance() { + const field = dom.$phoneNumber.get(0); + + if (!field || !window.intlTelInputGlobals) { + return null; } + + return window.intlTelInputGlobals.getInstance(field); } - /** - * Prevents unsupported phone symbols from being typed into the phone field. - * - * @param {JQuery.Event} event phone number beforeinput event - */ - function preventUnsupportedPhoneInput(event) { - const originalEvent = event.originalEvent; - const input = originalEvent && originalEvent.data; + /** Returns the selected phone country as an uppercase ISO code. */ + function getSelectedPhoneCountryCode() { + const phoneInput = getPhoneInputInstance(); + const countryData = phoneInput && phoneInput.getSelectedCountryData(); - if (input && sanitizePhoneNumberInput(input) !== input) { - event.preventDefault(); - } + return String(countryData && countryData.iso2 || '').toUpperCase(); } - /** - * Sanitizes the phone number input after user edits. - */ - function sanitizePhoneNumberValue() { - const sanitized = sanitizePhoneNumberInput(dom.$phoneNumber.val()); + /** Mirrors the library-owned phone country into a native form control. */ + function syncPhoneCountryState() { + dom.$phoneCountry.val(getSelectedPhoneCountryCode()); + } + + /** Selects the phone country without treating it as a user change. */ + function setPhoneCountry(countryCode) { + const phoneInput = getPhoneInputInstance(); + const normalizedCode = String(countryCode || '').trim().toLowerCase(); - if (dom.$phoneNumber.val() !== sanitized) { - dom.$phoneNumber.val(sanitized); + if (!phoneInput || !/^[a-z]{2}$/.test(normalizedCode)) { + return; } - } - /** - * Returns the current phone-country code. - * - * @return {string} selected phone-country code, or empty string - */ - function getPhoneCountryCode() { - return String(dom.$phoneCountryCode.val() || ''); + isSettingPhoneCountryProgrammatically = true; + try { + phoneInput.setCountry(normalizedCode); + } finally { + window.setTimeout(() => { + isSettingPhoneCountryProgrammatically = false; + }, 0); + } } - /** - * Updates the selected phone-country code. - * - * @param {string} phoneCode phone-country code without a leading plus sign - */ - function setPhoneCountryCode(phoneCode) { - dom.$phoneCountryCode.val(phoneCode); + /** Sets the native country value and refreshes its Select2 presentation. */ + function setBillingCountry(countryCode) { + dom.$country.val(countryCode); + if (dom.$country.hasClass('select2-hidden-accessible')) { + dom.$country.trigger('change.select2'); + } } - /** - * Returns the currently selected phone-country data for the visible field. - * - * @return {{flag: string, code: string, isSelected: boolean}} selected phone-country data - */ - function getPhoneCountrySelection() { - const selected = dom.$phoneCountryCode.find(':selected'); + /** Builds the optional Paygate phone number from the shared plugin state. */ + function buildPhoneNumberPayload() { + const rawNumber = String(dom.$phoneNumber.val() || '').trim(); + const phoneInput = getPhoneInputInstance(); + const countryData = phoneInput && phoneInput.getSelectedCountryData(); - return { - flag: String(selected.data('flag') || ''), - code: String(selected.data('code') || ''), - isSelected: Boolean(getPhoneCountryCode()) - }; + return normalizeIntlPhoneNumber( + rawNumber, + countryData && countryData.dialCode, + phoneInput && phoneInput.getNumber() + ); } /** @@ -419,6 +446,26 @@ export function createCheckoutFormController({dom}) { errorElement.textContent = message || ''; } + /** Applies or clears the international phone field error state. */ + function setPhoneFieldError(message) { + const field = dom.$phoneNumber.get(0); + + if (!field) { + return; + } + + setFieldError(field, message); + field.classList.toggle('error', Boolean(message)); + field.setCustomValidity(message || ''); + + const fieldContainer = field.closest('.form-field'); + const errorElement = fieldContainer && + fieldContainer.querySelector('.phone-error-message'); + if (errorElement) { + errorElement.classList.toggle('show', Boolean(message)); + } + } + /** * Applies the field state classes used by inline validation styles. * @@ -484,14 +531,6 @@ export function createCheckoutFormController({dom}) { } } - /** - * Clears the national phone-number input and refreshes its validation state. - */ - function clearPhoneNumber() { - dom.$phoneNumber.val(''); - validateField(dom.$phoneNumber.get(0)); - } - /** * Checks whether the national phone-number input has user-entered text. * @@ -515,23 +554,17 @@ export function createCheckoutFormController({dom}) { ); } + /** Normalizes a possible ISO country code. */ + function normalizeCountryCode(countryCode) { + const normalizedCode = String(countryCode || '').trim().toUpperCase(); + return /^[A-Z]{2}$/.test(normalizedCode) ? normalizedCode : ''; + } + /** Checks whether the selected billing country supports VAT ID entry. */ function isVatIdRelevant() { return isEuCountry(dom.$country.val()); } - /** - * Resolves an EU billing country code from a phone country code. - * - * @param {string} phoneCode phone calling code without a plus sign - * @return {string} matching billing country code, or empty string when none matches - */ - function countryCodeFromPhoneCode(phoneCode) { - return Object.keys(euCountryPhoneCodes).find( - countryCode => euCountryPhoneCodes[countryCode] === phoneCode - ) || ''; - } - /** * Joins non-empty address lines into the single street value expected by Paygate. * @@ -548,13 +581,17 @@ export function createCheckoutFormController({dom}) { applyPhoneCountryFromBillingCountry, bindPhoneEvents, buildSubmitBillingInfoRequest, + clearVatIdError, focusPhoneNumber, + getBrowserRestoredCountryState, getVatId, + initPhoneNumberField, + restoreCountryState, setFieldValidationState, showVatIdError, - updatePhoneCountryDisplay, updateVatIdFieldState, validateField, + validatePhoneNumber, validateRequiredFields }; } diff --git a/site/assets/js/pages/checkout/index.js b/site/assets/js/pages/checkout/index.js index 7c5a8843..e9eac77e 100644 --- a/site/assets/js/pages/checkout/index.js +++ b/site/assets/js/pages/checkout/index.js @@ -30,7 +30,11 @@ import * as params from '@params'; import {createPurchaseClient} from 'js/modules/paygate/purchases'; import {createChargeController} from 'js/pages/checkout/charge-controller'; import {getCompletedPageUrl} from 'js/pages/checkout/completed-page-url'; -import {populateCountrySelect} from 'js/pages/checkout/countries'; +import { + checkoutNavigationMode, + getCheckoutNavigationMode, + initializeCountrySelector +} from 'js/pages/checkout/countries'; import {getCheckoutDom} from 'js/pages/checkout/dom'; import {createCheckoutFormController} from 'js/pages/checkout/form-controller'; import {createCheckoutView} from 'js/pages/checkout/view-controller'; @@ -45,7 +49,7 @@ $( return; } - populateCountrySelect(dom.$country.get(0)); + initializeCountrySelector(dom.$country.get(0)); const purchaseClient = createPurchaseClient(params.payment.paygateurl); const orderId = getOrderId(); const view = createCheckoutView(dom); @@ -71,8 +75,10 @@ $( } dom.$form.prop('hidden', true); - formController.updatePhoneCountryDisplay(); - formController.bindPhoneEvents(); + formController.initPhoneNumberField(); + formController.bindPhoneEvents({ + onPhoneCountryChange: handlePhoneCountryChange + }); chargeController.updateSubmitState(); loadOrder(); bindEvents(); @@ -97,8 +103,17 @@ $( } }); - $(window).on('pageshow', () => { - scheduleCurrentChargeCalculation(); + $(window).on('pageshow', event => { + const mode = getCheckoutNavigationMode( + getNavigationType(), + Boolean(event.originalEvent && event.originalEvent.persisted) + ); + + if (mode === checkoutNavigationMode.reset) { + scheduleCheckoutReset(); + } else if (mode === checkoutNavigationMode.restore) { + scheduleCheckoutRestoration(); + } }); dom.$country.on('change', () => { @@ -109,19 +124,8 @@ $( chargeController.flush(); }); - dom.$phoneCountryCode.on('change', () => { - phoneCountryManuallySelected = true; - formController.updatePhoneCountryDisplay(); - formController.focusPhoneNumber(); - - if (formController.applyBillingCountryFromPhoneCountry(countryManuallySelected)) { - chargeController.invalidate(); - formController.updateVatIdFieldState(); - chargeController.flush(); - } - }); - dom.$vatId.on('input', () => { + formController.clearVatIdError(); chargeController.invalidate(); chargeController.schedule(); }); @@ -135,6 +139,18 @@ $( dom.$form.on('submit', handleSubmit); } + /** Syncs billing country after a user changes the phone country. */ + function handlePhoneCountryChange() { + phoneCountryManuallySelected = true; + formController.focusPhoneNumber(); + + if (formController.applyBillingCountryFromPhoneCountry(countryManuallySelected)) { + chargeController.invalidate(); + formController.updateVatIdFieldState(); + chargeController.flush(); + } + } + /** * Loads order details for the checkout page from the current checkout URL. * @@ -185,7 +201,11 @@ $( async function handleSubmit(event) { event.preventDefault(); - if (!formController.validateRequiredFields(requiredSelector)) { + const hasValidRequiredFields = + formController.validateRequiredFields(requiredSelector); + const hasValidPhoneNumber = formController.validatePhoneNumber(); + + if (!hasValidRequiredFields || !hasValidPhoneNumber) { dom.form.reportValidity(); return; } @@ -235,6 +255,61 @@ $( window.setTimeout(requestCurrentCharges, 0); } + /** Restores custom country widgets after native browser form restoration settles. */ + function scheduleCheckoutRestoration() { + window.setTimeout(() => { + const restoredState = formController.getBrowserRestoredCountryState(); + + countryManuallySelected = Boolean(restoredState.billingCountryCode); + phoneCountryManuallySelected = Boolean( + restoredState.phoneCountryCode && + restoredState.phoneCountryCode !== restoredState.billingCountryCode + ); + formController.restoreCountryState(restoredState); + formController.updateVatIdFieldState(); + requestCurrentCharges(); + }, 0); + } + + /** Clears browser-restored custom checkout fields after an explicit reload. */ + function scheduleCheckoutReset() { + window.setTimeout(() => { + countryManuallySelected = false; + phoneCountryManuallySelected = false; + formController.restoreCountryState({ + billingCountryCode: '', + phoneCountryCode: 'US' + }); + dom.$vatId.val(''); + formController.updateVatIdFieldState(); + chargeController.invalidate(); + requestCurrentCharges(); + }, 0); + } + + /** Returns the current document-navigation type with a legacy fallback. */ + function getNavigationType() { + const navigationEntries = window.performance && + typeof window.performance.getEntriesByType === 'function' + ? window.performance.getEntriesByType('navigation') + : []; + + if (navigationEntries.length) { + return navigationEntries[0].type; + } + + const legacyType = window.performance && + window.performance.navigation && + window.performance.navigation.type; + if (legacyType === 1) { + return 'reload'; + } + if (legacyType === 2) { + return 'back_forward'; + } + return 'navigate'; + } + /** * Calculates charges when a billing country is currently selected. */ diff --git a/site/assets/scss/modules/_forms.scss b/site/assets/scss/modules/_forms.scss index f140799a..cee9cbc2 100644 --- a/site/assets/scss/modules/_forms.scss +++ b/site/assets/scss/modules/_forms.scss @@ -106,6 +106,19 @@ $form-success-color: #2e7d32; padding-right: 44px; } +.form-field-vat { + position: relative; + + .error-message { + position: absolute; + top: 100%; + left: 0; + width: 100%; + margin-top: 4px; + line-height: 1.3; + } +} + .form-field-vat .form-input-status::after { position: absolute; top: 50%; diff --git a/site/assets/scss/modules/_result-panel.scss b/site/assets/scss/modules/_result-panel.scss index f243c6b0..72a7905e 100644 --- a/site/assets/scss/modules/_result-panel.scss +++ b/site/assets/scss/modules/_result-panel.scss @@ -143,10 +143,26 @@ } } +.result-panel p.result-panel-text-primary { + margin-bottom: 0; +} + +.result-panel p.result-panel-contact { + margin-top: 24px; +} + +.result-panel-actions { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: center; + gap: 16px; + margin-top: 50px; +} + .result-panel a.result-panel-button, .result-panel a.result-panel-button:visited { display: inline-block; - margin-top: 20px; min-width: 220px; color: $main-brand-color; font-size: 14px; @@ -161,6 +177,30 @@ } } +.result-panel a.result-panel-button-primary, +.result-panel a.result-panel-button-primary:visited { + color: white; + background: $main-brand-color; + border: 2px solid $main-brand-color; + + &:hover, + &:focus { + color: white; + background: darken($main-brand-color, 7%); + border-color: darken($main-brand-color, 7%); + } +} + +.result-panel-text a { + color: $main-brand-color; + text-decoration: none; + + &:hover, + &:focus { + text-decoration: underline; + } +} + @include breakpoint(sm-phone) { .result-panel { padding: 14px 0 16px; @@ -180,4 +220,13 @@ .result-panel p.result-panel-text { font-size: 16px; } + + .result-panel-actions { + flex-direction: column; + margin-top: 30px; + } + + .result-panel a.result-panel-button { + width: 100%; + } } diff --git a/site/assets/scss/pages/_checkout.scss b/site/assets/scss/pages/_checkout.scss index 1c2e458d..95c9d61e 100644 --- a/site/assets/scss/pages/_checkout.scss +++ b/site/assets/scss/pages/_checkout.scss @@ -14,6 +14,9 @@ * limitations under the License. */ +@import 'libs/country-select/select2.min.css'; +@import 'libs/intl-tel-input/intlTelInput.min.css'; + $checkout-bg-color: #f3f3f3; $checkout-panel-width: 790px; @@ -25,6 +28,10 @@ $checkout-panel-width: 790px; } } +.checkout-completed-page .main { + min-height: auto; +} + .checkout { flex: 1 0 auto; display: flex; @@ -235,12 +242,7 @@ $checkout-panel-width: 790px; appearance: auto; } - .form-actions { - margin-top: 8px; - } - .form-submit-button { - width: 100%; min-height: 48px; } @@ -264,12 +266,123 @@ $checkout-panel-width: 790px; } } +.checkout { + .select2-hidden-accessible[required] { + position: static !important; + display: block; + width: 100% !important; + height: 0 !important; + min-height: 0 !important; + margin: 0 !important; + opacity: 0; + } + + .select2-container { + width: 100% !important; + + .select2-selection--single { + height: 48px; + border: 1px solid rgba($black, .12); + border-radius: $border-radius-m; + box-shadow: inset 0 1px 1px rgba($black, .02); + + &:focus { + outline: none; + border-color: rgba($main-brand-color, .55); + box-shadow: 0 0 0 3px rgba($main-brand-color, .12); + } + + .select2-selection__rendered { + padding: 13px 40px 13px 15px; + color: $black; + font-size: 16px; + line-height: 20px; + } + + .select2-selection__arrow { + width: 40px; + height: 46px; + } + } + } + + .field-error .select2-selection--single { + border-color: rgba($form-error-color, .7); + box-shadow: 0 0 0 3px rgba($form-error-color, .12); + } + + .iti { + display: block; + width: 100%; + + input.form-input { + width: 100%; + min-height: 48px; + } + + .iti__selected-flag { + border-radius: $border-radius-m 0 0 $border-radius-m; + } + + .iti__country-list { + z-index: 20; + border: 0; + border-radius: $border-radius-m; + box-shadow: 0 8px 24px rgba($black, .16); + } + } + + .phone-error-message.show { + display: block; + } +} + +.select2-dropdown { + border: 0; + border-radius: $border-radius-m; + box-shadow: 0 8px 24px rgba($black, .16); + z-index: 20; + + .select2-results__option { + padding: 10px 15px; + } + + .select2-results__option--highlighted.select2-results__option--selectable { + color: $black; + background: rgba($main-brand-color, .1); + } + + .select2-search__field { + padding: 8px 10px; + border: 1px solid rgba($black, .15) !important; + border-radius: $border-radius-m; + } +} + +.country-selector__option { + display: inline-flex; + align-items: center; + gap: 8px; + max-width: 100%; + min-width: 0; + + .iti__flag { + flex: 0 0 auto; + } +} + +.country-selector__text { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + .checkout-business-fields { min-width: 0; - margin: 10px 0 0; - padding: 28px 0 0; + margin: 0; + padding: 0; border: 0; - border-top: 1px solid rgba($black, .12); .checkout-business-fields-title { width: 100%; @@ -290,6 +403,7 @@ $checkout-panel-width: 790px; .checkout-business-fields-grid { display: grid; grid-template-columns: minmax(0, 1fr); + row-gap: 24px; } } @@ -313,7 +427,10 @@ $checkout-panel-width: 790px; } } -.checkout-completed .result-panel { - margin-top: auto; - margin-bottom: auto; +.checkout-completed { + min-height: 420px; + + @include breakpoint(sm-phone) { + min-height: auto; + } } diff --git a/site/config/development/hugo.toml b/site/config/development/hugo.toml index c5c23c67..3613c7dc 100644 --- a/site/config/development/hugo.toml +++ b/site/config/development/hugo.toml @@ -1,3 +1,4 @@ [params.payment] consentURL = 'http://localhost:5002/spine-site-server/us-central1/api/consent' paygateURL = 'https://stag.paygate.teamdev.com' + productID = '137c613b-305b-45ce-bd40-49f6a42eafde' diff --git a/site/content/checkout-completed/index.md b/site/content/checkout-completed/index.md index 866bd7b8..94a19649 100644 --- a/site/content/checkout-completed/index.md +++ b/site/content/checkout-completed/index.md @@ -1,7 +1,7 @@ --- title: Payment Result description: Current payment result for a checkout order. -body_class: checkout-page +body_class: checkout-page checkout-completed-page header_type: fixed-header sitemap: disable: true diff --git a/site/layouts/_partials/components/result-panel.html b/site/layouts/_partials/components/result-panel.html index 8cca5326..a21ab75d 100644 --- a/site/layouts/_partials/components/result-panel.html +++ b/site/layouts/_partials/components/result-panel.html @@ -30,7 +30,9 @@ {{ $titleAsH1 := .title_as_h1 }} {{ $mark := .mark }} {{ $lines := .lines | default slice }} +{{ $additionalLine := .additional_line | default "" }} {{ $action := .action }} +{{ $actions := .actions | default slice }}
      {{ with $mark }} @@ -44,19 +46,37 @@

      {{ $title }}

      {{ $title }}

      {{ end }} {{ if $lines }} -

      +

      {{ range $lines }} {{ . }} {{ end }}

      {{ end }} - {{ with $action }} - {{ $actionLabel := .label | default .text | default "" }} - {{ $actionUrl := .url | default site.Home.RelPermalink }} - {{ if $actionLabel }} - - {{ $actionLabel }} - + {{ with $additionalLine }} +

      {{ . }}

      {{ end }} + {{ if or $action $actions }} +
      + {{ with $action }} + {{ $actionLabel := .label | default .text | default "" }} + {{ $actionUrl := .url | default site.Home.RelPermalink }} + {{ if $actionLabel }} + + {{ $actionLabel }} + + {{ end }} + {{ end }} + {{ range $actions }} + {{ $actionLabel := .label | default .text | default "" }} + {{ $actionUrl := .url | default site.Home.RelPermalink }} + {{ if $actionLabel }} + + {{ $actionLabel }} + + {{ end }} + {{ end }} +
      {{ end }}
      diff --git a/site/layouts/_partials/getting-help/services.html b/site/layouts/_partials/getting-help/services.html index 35751883..72441721 100644 --- a/site/layouts/_partials/getting-help/services.html +++ b/site/layouts/_partials/getting-help/services.html @@ -42,7 +42,7 @@

      {{ $data.title | markdownify }}

      {{ $comparableServices := $data.comparable_services }} {{ range $comparableServices.header_cols }}
      + {{ with .paygate_product_id }}data-paygate-product-id="{{ site.Params.payment.productid | default . }}"{{ end }}>

      {{ .title | markdownify }}

      diff --git a/site/layouts/checkout-completed/single.html b/site/layouts/checkout-completed/single.html index 58cb8868..748a3803 100644 --- a/site/layouts/checkout-completed/single.html +++ b/site/layouts/checkout-completed/single.html @@ -1,6 +1,8 @@ {{ define "main" }} {{ partial "components/navbar/navbar.html" . }} {{ $email := hugo.Data.emails.sales_email }} + {{ $contactLine := printf "If you have any questions, email us at %s." $email $email | safeHTML }} + {{ $missingOrderContactLine := printf "Please check the address or contact %s." $email $email | safeHTML }}
      @@ -25,8 +27,8 @@

      Transaction in progress...

      "lines" (slice "Your payment was successful." "We will send the order details to your email." - (printf "If you have any questions, email us at %s." $email) ) + "additional_line" $contactLine "action" (dict "label" "Back to home" "url" site.Home.RelPermalink) ) }}
      @@ -37,9 +39,17 @@

      Transaction in progress...

      "lines" (slice "Your payment was not completed successfully." "Please try again or contact your bank for details." - (printf "If you have any questions, email us at %s." $email) ) - "action" (dict "label" "Back to checkout" "url" "#") + "additional_line" $contactLine + "actions" (slice + (dict + "label" "Back to checkout" + "url" "#" + "primary" true + "back_to_checkout" true + ) + (dict "label" "Back to home" "url" site.Home.RelPermalink) + ) ) }}
      @@ -59,8 +69,8 @@

      Transaction in progress...

      "title_as_h1" true "lines" (slice "Your bank or card provider reversed it after a payment dispute." - (printf "If you have any questions, email us at %s." $email) ) + "additional_line" $contactLine "action" (dict "label" "Back to home" "url" site.Home.RelPermalink) ) }}
      @@ -71,8 +81,8 @@

      Transaction in progress...

      "lines" (slice "The payment status is temporarily unavailable." "This page will retry automatically." - (printf "If you have any questions, email us at %s." $email) ) + "additional_line" $contactLine ) }}
      @@ -93,8 +103,8 @@

      Transaction in progress...

      "title_as_h1" true "lines" (slice "We will send the order details to your email after the payment is confirmed." - (printf "If you have any questions, email us at %s." $email) ) + "additional_line" $contactLine "action" (dict "label" "Back to home" "url" site.Home.RelPermalink) ) }} diff --git a/site/layouts/checkout/single.html b/site/layouts/checkout/single.html index b23660bb..bc87f72b 100644 --- a/site/layouts/checkout/single.html +++ b/site/layouts/checkout/single.html @@ -49,12 +49,13 @@

      Billing details

      -
      @@ -85,54 +86,20 @@

      Billing details

      -
      - - - - - -
      + + +

      + Enter a valid phone number. +

      @@ -261,4 +227,11 @@

      Billing details

      + + + {{ end }} diff --git a/site/tests/checkout-completed.test.mjs b/site/tests/checkout-completed.test.mjs index b11fdedb..c72a9922 100644 --- a/site/tests/checkout-completed.test.mjs +++ b/site/tests/checkout-completed.test.mjs @@ -430,7 +430,7 @@ async function render( if (selector === '[data-payment-status-page]') { return {}; } - if (selector === '#payment-failed .result-panel-button') { + if (selector === '#payment-failed [data-back-to-checkout]') { return backToCheckoutLink; } return null; @@ -558,4 +558,3 @@ function createBrowserState(href, state = null) { function settleAsyncWork() { return new Promise(resolve => setImmediate(resolve)); } - diff --git a/site/tests/checkout-configuration.test.mjs b/site/tests/checkout-configuration.test.mjs index 92a5bbda..518c6491 100644 --- a/site/tests/checkout-configuration.test.mjs +++ b/site/tests/checkout-configuration.test.mjs @@ -21,12 +21,21 @@ import test from 'node:test'; const {buildChargeRequest} = await importSource( '../assets/js/pages/checkout/charge-request.js' ); -const {populateCountrySelect} = await importSource( +const { + checkoutNavigationMode, + focusOpenCountrySearchField, + getCheckoutNavigationMode, + populateCountrySelect +} = await importSource( '../assets/js/pages/checkout/countries.js' ); const {isEuCountry} = await importSource( '../assets/js/pages/checkout/phone-codes.js' ); +const {normalizeIntlPhoneNumber} = await importSource( + '../assets/js/modules/forms/phone-number.js' +); +const {createCheckoutFormController} = await importFormController(); test('calculate charges without requiring a VAT ID', () => { assert.deepEqual( @@ -73,6 +82,44 @@ test('offer the complete ISO billing-country list', () => { } }); +test('focus the country search input when its dropdown opens', () => { + let focused = false; + let requestedSelector = ''; + const root = { + querySelector(selector) { + requestedSelector = selector; + return {focus: () => focused = true}; + } + }; + + focusOpenCountrySearchField(root); + + assert.equal( + requestedSelector, + '.select2-container--open .select2-search__field' + ); + assert.equal(focused, true); +}); + +test('restore checkout fields only for browser history navigation', () => { + assert.equal( + getCheckoutNavigationMode('back_forward'), + checkoutNavigationMode.restore + ); + assert.equal( + getCheckoutNavigationMode('navigate', true), + checkoutNavigationMode.restore + ); + assert.equal( + getCheckoutNavigationMode('reload'), + checkoutNavigationMode.reset + ); + assert.equal( + getCheckoutNavigationMode('navigate'), + checkoutNavigationMode.none + ); +}); + test('show VAT ID only for EU billing countries', () => { assert.equal(isEuCountry('EE'), true); assert.equal(isEuCountry('DE'), true); @@ -80,7 +127,73 @@ test('show VAT ID only for EU billing countries', () => { assert.equal(isEuCountry('US'), false); }); +test('build Paygate phone data from the shared international input', () => { + assert.deepEqual( + normalizeIntlPhoneNumber('555 0100', '372', '+372 555 0100'), + {countryCode: 372, number: '5550100'} + ); + assert.deepEqual( + normalizeIntlPhoneNumber('(512) 555-0199', '1', ''), + {countryCode: 1, number: '5125550199'} + ); + assert.equal(normalizeIntlPhoneNumber('', '372', ''), null); + assert.equal(normalizeIntlPhoneNumber('5550100', '', ''), null); +}); + +test('clear an earlier VAT validation error after the input changes', () => { + const classes = new Set(); + const errorElement = {textContent: ''}; + const fieldContainer = { + classList: { + toggle(className, enabled) { + if (enabled) { + classes.add(className); + } else { + classes.delete(className); + } + } + }, + querySelector() { + return errorElement; + } + }; + const vatField = { + closest() { + return fieldContainer; + } + }; + const controller = createCheckoutFormController({ + dom: { + $country: {val: () => 'EE'}, + $vatId: {get: () => vatField} + } + }); + + controller.showVatIdError('NOT_ACTIVE'); + assert.equal(classes.has('field-error'), true); + assert.equal(errorElement.textContent, 'This VAT ID is not active.'); + + controller.clearVatIdError(); + assert.equal(classes.has('field-error'), false); + assert.equal(errorElement.textContent, ''); +}); + async function importSource(relativePath) { const source = fs.readFileSync(new URL(relativePath, import.meta.url), 'utf8'); return import(`data:text/javascript,${encodeURIComponent(source)}`); } + +async function importFormController() { + const source = fs.readFileSync( + new URL('../assets/js/pages/checkout/form-controller.js', import.meta.url), + 'utf8' + ).replace( + "import {isEuCountry} from 'js/pages/checkout/phone-codes';", + "const isEuCountry = countryCode => countryCode === 'EE';" + ).replace( + "import {normalizeIntlPhoneNumber} from 'js/modules/forms/phone-number';", + 'const normalizeIntlPhoneNumber = () => null;' + ); + + return import(`data:text/javascript,${encodeURIComponent(source)}`); +} From 124fa8f8803d29dc8e4bc83c73f9811b1308122e Mon Sep 17 00:00:00 2001 From: Vladyslav Kuksiuk Date: Thu, 13 Aug 2026 13:55:14 +0200 Subject: [PATCH 04/17] Provide production product ID. --- .../tasks/align-checkout-shared-controls.md | 68 ------------------- site/config/_default/hugo.toml | 1 + site/config/development/hugo.toml | 2 +- .../_partials/getting-help/services.html | 2 +- 4 files changed, 3 insertions(+), 70 deletions(-) delete mode 100644 .agents/tasks/align-checkout-shared-controls.md diff --git a/.agents/tasks/align-checkout-shared-controls.md b/.agents/tasks/align-checkout-shared-controls.md deleted file mode 100644 index 2ff0cecf..00000000 --- a/.agents/tasks/align-checkout-shared-controls.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -slug: align-checkout-shared-controls -branch: update-checkout -owner: codex -status: completed -started: 2026-08-13 ---- - -## Goal - -Use the current `site-commons` country selector and international phone input -on the Spine checkout while preserving the Spine-specific checkout and payment -result behavior. - -## Plan - -- [x] Vendor the exact shared Select2 and `intl-tel-input` runtime assets without - changing the public `site-commons` module pin. -- [x] Adapt the checkout template and controller to the shared component APIs. -- [x] Preserve optional phone behavior and Paygate payload normalization. -- [x] Add or update focused JavaScript tests. -- [x] Build with CI-pinned Hugo and inspect desktop/mobile behavior. - -## Log - -- 2026-08-13 — confirmed the pinned May 2026 module predates the shared Select2 - and `intl-tel-input` assets; current `site-commons` master contains both. -- 2026-08-13 — retained the public module pin because the current TeamDev module - path is private, and copied only the controls' runtime files and flag sprites. -- 2026-08-13 — `npm test` passed 32 tests; JavaScript syntax checks and - `git diff --check` passed. -- 2026-08-13 — CI-pinned Hugo 0.161.1 development and production builds passed; - production still renders `spine-standard-support`, while development uses the - staging product ID. -- 2026-08-13 — verified both dropdowns in the local browser at desktop and - 390-by-844 mobile sizes with no horizontal overflow. -- 2026-08-13 — collapsed the hidden native country select's inherited minimum - height so the visible Select2 control sits directly below its label. -- 2026-08-13 — restored the shared form action spacing and intrinsic desktop - button width for `Continue to payment`; narrow screens retain full width. -- 2026-08-13 — removed the Business details divider and matched the Company - name-to-VAT ID spacing to the form's standard 24-pixel row gap. -- 2026-08-13 — restored the completed-payment page's pre-redesign content-height - layout, removing the checkout form's inherited full-viewport minimum height. -- 2026-08-13 — positioned VAT validation feedback inside the existing action - gap so error-state changes do not reflow the VAT field or payment button. -- 2026-08-13 — clear a previous VAT API error on each input edit; only the - latest non-stale server validation response can render a new VAT error. -- 2026-08-13 — focus the active Select2 search field whenever the country - dropdown opens so typing can begin without a second click. -- 2026-08-13 — added primary checkout and secondary home actions to failed - payments, and rendered result-page sales addresses as `mailto:` links. -- 2026-08-13 — separated payment-result contact copy into its own paragraph - with a consistent 24-pixel gap above it. -- 2026-08-13 — persist the billing country in the checkout history entry and - restore its Select2, VAT, phone, and charge state after browser Back. -- 2026-08-13 — preserve the independently selected phone country and VAT ID in - the same history entry and restore them after the billing-country widget. -- 2026-08-13 — verified browser Back restores Estonia billing, Poland phone - country, and `EE123456789`; all 36 JavaScript tests and both Hugo builds pass. -- 2026-08-13 — limit custom checkout restoration to Back/Forward navigation; - explicit reload clears billing country, phone country, VAT ID, and saved state. -- 2026-08-13 — with optional cookies declined, verified reload resets Estonia, - Poland (+48), and VAT ID while browser Back restores all three. -- 2026-08-13 — removed the custom `history.state` payload; native form controls - now retain billing/VAT, with a native phone-country mirror for widget sync. -- 2026-08-13 — verified the native path restores Estonia, Poland (+48), VAT ID, - and other inputs after Back, resets on reload, and passes 35 tests/builds. diff --git a/site/config/_default/hugo.toml b/site/config/_default/hugo.toml index c15de947..2205a71f 100644 --- a/site/config/_default/hugo.toml +++ b/site/config/_default/hugo.toml @@ -22,6 +22,7 @@ disableKinds = ['taxonomy', 'term'] [params.payment] consentURL = 'https://us-central1-spine-site-server.cloudfunctions.net/api/consent' paygateURL = 'https://paygate.teamdev.com' + standardSupportProductId = 'spine-standard-support' reCaptchaKey = '6Lef7b0ZAAAAAHPIbf6XQIzzeyCoSzS56GTej1c0' [params.libs.docsearch] diff --git a/site/config/development/hugo.toml b/site/config/development/hugo.toml index 3613c7dc..18dce1c0 100644 --- a/site/config/development/hugo.toml +++ b/site/config/development/hugo.toml @@ -1,4 +1,4 @@ [params.payment] consentURL = 'http://localhost:5002/spine-site-server/us-central1/api/consent' paygateURL = 'https://stag.paygate.teamdev.com' - productID = '137c613b-305b-45ce-bd40-49f6a42eafde' + standardSupportProductId = '137c613b-305b-45ce-bd40-49f6a42eafde' diff --git a/site/layouts/_partials/getting-help/services.html b/site/layouts/_partials/getting-help/services.html index 72441721..d5930b27 100644 --- a/site/layouts/_partials/getting-help/services.html +++ b/site/layouts/_partials/getting-help/services.html @@ -42,7 +42,7 @@

      {{ $data.title | markdownify }}

      {{ $comparableServices := $data.comparable_services }} {{ range $comparableServices.header_cols }}
      + {{ with .paygate_product_id }}data-paygate-product-id="{{ site.Params.payment.standardsupportproductid | default . }}"{{ end }}>

      {{ .title | markdownify }}

      From 4b08d8b3920bf18039d017a856161ed4e445bab5 Mon Sep 17 00:00:00 2001 From: Vladyslav Kuksiuk Date: Thu, 13 Aug 2026 14:59:56 +0200 Subject: [PATCH 05/17] Improve layout. --- site/assets/js/pages/checkout/view-controller.js | 10 ++++++++++ site/assets/scss/pages/_checkout.scss | 8 +++++--- site/layouts/checkout/single.html | 3 ++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/site/assets/js/pages/checkout/view-controller.js b/site/assets/js/pages/checkout/view-controller.js index 44f2143e..6b1358d6 100644 --- a/site/assets/js/pages/checkout/view-controller.js +++ b/site/assets/js/pages/checkout/view-controller.js @@ -130,6 +130,7 @@ export function createCheckoutView(dom) { * @param {boolean} isLoading whether the summary should show the loading state */ function setSummaryLoading(isLoading) { + setResultPageMode(false); dom.$summary.prop('hidden', isLoading); dom.$loading.prop('hidden', !isLoading); dom.$loadingSpinner.prop('hidden', !isLoading); @@ -148,6 +149,7 @@ export function createCheckoutView(dom) { * Shows the generic summary error panel inside the checkout page. */ function showSummaryError() { + setResultPageMode(true); dom.$loading.prop('hidden', true); dom.$summary.prop('hidden', true); dom.$form.prop('hidden', true); @@ -158,6 +160,7 @@ export function createCheckoutView(dom) { /** Shows the resolved order summary and billing form. */ function showCheckoutView() { + setResultPageMode(false); closeErrorModal(); dom.$loading.prop('hidden', true); dom.$summary.prop('hidden', false); @@ -169,6 +172,7 @@ export function createCheckoutView(dom) { /** Shows the missing-order result panel. */ function showMissingOrderView() { + setResultPageMode(true); closeErrorModal(); dom.$loading.prop('hidden', true); dom.$summary.prop('hidden', true); @@ -196,6 +200,7 @@ export function createCheckoutView(dom) { * Shows the not-found result panel inside the checkout page. */ function showNotFoundView() { + setResultPageMode(true); closeErrorModal(); dom.$loading.prop('hidden', true); dom.$summary.prop('hidden', true); @@ -205,6 +210,11 @@ export function createCheckoutView(dom) { dom.$notFound.prop('hidden', false); } + /** Matches checkout result-page height to the payment-result layout. */ + function setResultPageMode(isResultPage) { + document.body.classList.toggle('checkout-result-page', isResultPage); + } + /** * Formats a money value with its currency symbol. * diff --git a/site/assets/scss/pages/_checkout.scss b/site/assets/scss/pages/_checkout.scss index 95c9d61e..f5e7daa6 100644 --- a/site/assets/scss/pages/_checkout.scss +++ b/site/assets/scss/pages/_checkout.scss @@ -28,7 +28,8 @@ $checkout-panel-width: 790px; } } -.checkout-completed-page .main { +.checkout-completed-page .main, +.checkout-result-page .main { min-height: auto; } @@ -100,7 +101,7 @@ $checkout-panel-width: 790px; margin: 0; color: $gray-500; font-size: 17px; - font-weight: 500; + font-weight: 400; line-height: 1.5; } @@ -427,7 +428,8 @@ $checkout-panel-width: 790px; } } -.checkout-completed { +.checkout-completed, +.checkout-result-page .checkout { min-height: 420px; @include breakpoint(sm-phone) { diff --git a/site/layouts/checkout/single.html b/site/layouts/checkout/single.html index bc87f72b..c1af22f4 100644 --- a/site/layouts/checkout/single.html +++ b/site/layouts/checkout/single.html @@ -2,6 +2,7 @@ {{ partial "components/navbar/navbar.html" . }} {{ $email := hugo.Data.emails.sales_email }} {{ $emailLink := printf "%s" $email $email | safeHTML }} + {{ $missingOrderContactLine := printf "Please check the address or contact %s." $email $email | safeHTML }}
      @@ -207,8 +208,8 @@

      Billing details

      "mark" (dict "text" "404" "icon_class" "result-panel-mark-code") "lines" (slice "The checkout order could not be found." - "Please check the address or contact us for help." ) + "additional_line" $missingOrderContactLine "action" (dict "label" "Back to home" "url" site.Home.RelPermalink) ) }}
      From ac8b13cecc306bd9f140fe080cd7834275cea98e Mon Sep 17 00:00:00 2001 From: Vladyslav Kuksiuk Date: Thu, 13 Aug 2026 15:37:25 +0200 Subject: [PATCH 06/17] Improve readability. --- site/assets/js/modules/forms/phone-number.js | 12 - .../js/pages/checkout/charge-request.js | 23 +- .../js/pages/checkout/completed-page-url.js | 34 +- site/assets/js/pages/checkout/completed.js | 24 +- .../js/pages/checkout/completion-order-id.js | 34 +- site/assets/js/pages/checkout/countries.js | 54 +- site/assets/js/pages/checkout/dom.js | 2 - .../js/pages/checkout/form-controller.js | 58 +- site/assets/js/pages/checkout/index.js | 24 +- site/assets/js/pages/checkout/navigation.js | 44 ++ .../{phone-codes.js => vat-countries.js} | 44 +- .../js/pages/checkout/view-controller.js | 1 - site/assets/libs/README.md | 16 + .../libs/country-select/select2.js} | 2 +- .../libs/intl-tel-input/intlTelInput.js | 8 + site/assets/libs/intl-tel-input/utils.js | 508 ++++++++++++++++++ .../scss/libs/country-select/_select2.scss} | 0 .../libs/intl-tel-input/_intl-tel-input.scss | 1 + site/assets/scss/modules/_forms.scss | 121 ----- site/assets/scss/modules/_result-panel.scss | 6 +- site/assets/scss/pages/_checkout.scss | 34 +- .../_partials/getting-help/services.html | 6 +- site/layouts/checkout/single.html | 18 +- site/package-lock.json | 16 + site/package.json | 4 + .../libs/intl-tel-input/intlTelInput.min.css | 1 - .../libs/intl-tel-input/intlTelInput.min.js | 8 - site/static/libs/intl-tel-input/utils.js | 508 ------------------ site/tests/checkout-completed.test.mjs | 84 +-- site/tests/checkout-configuration.test.mjs | 154 +++++- 30 files changed, 920 insertions(+), 929 deletions(-) create mode 100644 site/assets/js/pages/checkout/navigation.js rename site/assets/js/pages/checkout/{phone-codes.js => vat-countries.js} (68%) create mode 100644 site/assets/libs/README.md rename site/{static/libs/country-select/select2.min.js => assets/libs/country-select/select2.js} (99%) create mode 100644 site/assets/libs/intl-tel-input/intlTelInput.js create mode 100644 site/assets/libs/intl-tel-input/utils.js rename site/{static/libs/country-select/select2.min.css => assets/scss/libs/country-select/_select2.scss} (100%) create mode 100644 site/assets/scss/libs/intl-tel-input/_intl-tel-input.scss delete mode 100644 site/static/libs/intl-tel-input/intlTelInput.min.css delete mode 100644 site/static/libs/intl-tel-input/intlTelInput.min.js delete mode 100644 site/static/libs/intl-tel-input/utils.js diff --git a/site/assets/js/modules/forms/phone-number.js b/site/assets/js/modules/forms/phone-number.js index be5eca2c..f58ec165 100644 --- a/site/assets/js/modules/forms/phone-number.js +++ b/site/assets/js/modules/forms/phone-number.js @@ -26,18 +26,6 @@ 'use strict'; -/** - * Removes characters that are not accepted by the phone-number field. - * - *

      Allowed: digits, parentheses, hyphens, and spaces. - * - * @param {string} value phone-number value to sanitize - * @return {string} sanitized phone-number value - */ -export function sanitizePhoneNumberInput(value) { - return String(value || '').replace(/[^0-9\s()-]/g, ''); -} - /** * Builds the phone-number payload with country code and number with digits only. * diff --git a/site/assets/js/pages/checkout/charge-request.js b/site/assets/js/pages/checkout/charge-request.js index f9aa1d51..e813ac1a 100644 --- a/site/assets/js/pages/checkout/charge-request.js +++ b/site/assets/js/pages/checkout/charge-request.js @@ -5,13 +5,23 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 'use strict'; @@ -33,4 +43,3 @@ export function buildChargeRequest(orderId, buyerCountryCode, vatId) { ? {orderId, buyerCountryCode, vatId} : {orderId, buyerCountryCode}; } - diff --git a/site/assets/js/pages/checkout/completed-page-url.js b/site/assets/js/pages/checkout/completed-page-url.js index ade12d13..02544d7b 100644 --- a/site/assets/js/pages/checkout/completed-page-url.js +++ b/site/assets/js/pages/checkout/completed-page-url.js @@ -5,13 +5,23 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 'use strict'; @@ -26,18 +36,12 @@ export function getCompletedPageUrl(currentUrl, orderId) { const completedUrl = new URL(currentUrl); const checkoutPath = /\/checkout\/?$/; - const checkoutFile = /\/checkout(\.[^./]+)$/; if (checkoutPath.test(completedUrl.pathname)) { completedUrl.pathname = completedUrl.pathname.replace( checkoutPath, '/checkout-completed/' ); - } else if (checkoutFile.test(completedUrl.pathname)) { - completedUrl.pathname = completedUrl.pathname.replace( - checkoutFile, - '/checkout-completed$1' - ); } else { return ''; } @@ -57,15 +61,9 @@ export function getCompletedPageUrl(currentUrl, orderId) { export function getCheckoutPageUrl(currentUrl, orderId) { const checkoutUrl = new URL(currentUrl); const completedPath = /\/checkout-completed\/?$/; - const completedFile = /\/checkout-completed(\.[^./]+)$/; if (completedPath.test(checkoutUrl.pathname)) { checkoutUrl.pathname = checkoutUrl.pathname.replace(completedPath, '/checkout/'); - } else if (completedFile.test(checkoutUrl.pathname)) { - checkoutUrl.pathname = checkoutUrl.pathname.replace( - completedFile, - '/checkout$1' - ); } else { return ''; } diff --git a/site/assets/js/pages/checkout/completed.js b/site/assets/js/pages/checkout/completed.js index 5e587267..a35b5d0f 100644 --- a/site/assets/js/pages/checkout/completed.js +++ b/site/assets/js/pages/checkout/completed.js @@ -5,13 +5,23 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 'use strict'; @@ -45,7 +55,7 @@ function init() { return; } - const orderId = getCompletionOrderId(window.location, window.history); + const orderId = getCompletionOrderId(window.location); if (!orderId) { return; } diff --git a/site/assets/js/pages/checkout/completion-order-id.js b/site/assets/js/pages/checkout/completion-order-id.js index 686c97db..325abdf1 100644 --- a/site/assets/js/pages/checkout/completion-order-id.js +++ b/site/assets/js/pages/checkout/completion-order-id.js @@ -5,32 +5,34 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 'use strict'; -const historyStateKey = 'siteCommonsCompletionOrderId'; - /** * Reads the order ID from the visible payment-result URL. * * @param {Location|URL} location browser location - * @param {History} [history] browser history used by older completion URLs * @return {string} Paygate order ID, or an empty string when unavailable */ -export function getCompletionOrderId(location, history) { +export function getCompletionOrderId(location) { const completionUrl = new URL(location.href); - if (completionUrl.searchParams.has('orderId')) { - return (completionUrl.searchParams.get('orderId') || '').trim(); - } - - const retainedOrderId = history && history.state && history.state[historyStateKey]; - return typeof retainedOrderId === 'string' ? retainedOrderId.trim() : ''; + return (completionUrl.searchParams.get('orderId') || '').trim(); } diff --git a/site/assets/js/pages/checkout/countries.js b/site/assets/js/pages/checkout/countries.js index 8ec8a7c4..8d10a1e6 100644 --- a/site/assets/js/pages/checkout/countries.js +++ b/site/assets/js/pages/checkout/countries.js @@ -5,36 +5,40 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 'use strict'; -const countryCodes = `AD AE AF AG AI AL AM AO AQ AR AS AT AU AW AX AZ BA BB BD BE BF BG BH BI BJ BL BM BN BO BQ BR BS BT BV BW BY BZ CA CC CD CF CG CH CI CK CL CM CN CO CR CU CV CW CX CY CZ DE DJ DK DM DO DZ EC EE EG EH ER ES ET FI FJ FK FM FO FR GA GB GD GE GF GG GH GI GL GM GN GP GQ GR GS GT GU GW GY HK HM HN HR HT HU ID IE IL IM IN IO IQ IR IS IT JE JM JO JP KE KG KH KI KM KN KP KR KW KY KZ LA LB LC LI LK LR LS LT LU LV LY MA MC MD ME MF MG MH MK ML MM MN MO MP MQ MR MS MT MU MV MW MX MY MZ NA NC NE NF NG NI NL NO NP NR NU NZ OM PA PE PF PG PH PK PL PM PN PR PS PT PW PY QA RE RO RS RU RW SA SB SC SD SE SG SH SI SJ SK SL SM SN SO SR SS ST SV SX SY SZ TC TD TF TG TH TJ TK TL TM TN TO TR TT TV TW TZ UA UG UM US UY UZ VA VC VE VG VI VN VU WF WS YE YT ZA ZM ZW` - .split(' '); - -export const checkoutNavigationMode = Object.freeze({ - none: 'none', - reset: 'reset', - restore: 'restore' -}); - -/** Chooses whether checkout state should be restored or reset for a navigation. */ -export function getCheckoutNavigationMode(navigationType, pagePersisted = false) { - if (navigationType === 'reload') { - return checkoutNavigationMode.reset; - } - if (pagePersisted || navigationType === 'back_forward') { - return checkoutNavigationMode.restore; - } - return checkoutNavigationMode.none; -} +const countryCodes = [ + 'AD AE AF AG AI AL AM AO AQ AR AS AT AU AW AX AZ BA BB BD BE BF BG BH BI', + 'BJ BL BM BN BO BQ BR BS BT BV BW BY BZ CA CC CD CF CG CH CI CK CL CM CN', + 'CO CR CU CV CW CX CY CZ DE DJ DK DM DO DZ EC EE EG EH ER ES ET FI FJ FK', + 'FM FO FR GA GB GD GE GF GG GH GI GL GM GN GP GQ GR GS GT GU GW GY HK HM', + 'HN HR HT HU ID IE IL IM IN IO IQ IR IS IT JE JM JO JP KE KG KH KI KM KN', + 'KP KR KW KY KZ LA LB LC LI LK LR LS LT LU LV LY MA MC MD ME MF MG MH MK', + 'ML MM MN MO MP MQ MR MS MT MU MV MW MX MY MZ NA NC NE NF NG NI NL NO NP', + 'NR NU NZ OM PA PE PF PG PH PK PL PM PN PR PS PT PW PY QA RE RO RS RU RW', + 'SA SB SC SD SE SG SH SI SJ SK SL SM SN SO SR SS ST SV SX SY SZ TC TD TF', + 'TG TH TJ TK TL TM TN TO TR TT TV TW TZ UA UG UM US UY UZ VA VC VE VG VI', + 'VN VU WF WS YE YT ZA ZM ZW' +].join(' ').split(' '); /** * Populates a billing-country select with ISO 3166-1 countries. diff --git a/site/assets/js/pages/checkout/dom.js b/site/assets/js/pages/checkout/dom.js index 2cf92831..55a9cab7 100644 --- a/site/assets/js/pages/checkout/dom.js +++ b/site/assets/js/pages/checkout/dom.js @@ -39,7 +39,6 @@ * @property {JQuery} $loading summary loading container * @property {JQuery} $loadingSpinner summary spinner element * @property {JQuery} $loadingText summary loading text element - * @property {JQuery} $loadingSupport summary support text element * @property {JQuery} $productTitle product title element * @property {JQuery} $productDescription product description * element @@ -71,7 +70,6 @@ export function getCheckoutDom() { $loading: $('#checkout-summary-loading'), $loadingSpinner: $('#checkout-summary-loading-spinner'), $loadingText: $('#checkout-summary-loading-text'), - $loadingSupport: $('#checkout-summary-support'), $productTitle: $('#checkout-product-title'), $productDescription: $('#checkout-product-description'), $subtotalValue: $('#checkout-subtotal-value'), diff --git a/site/assets/js/pages/checkout/form-controller.js b/site/assets/js/pages/checkout/form-controller.js index d0757e44..41fd2246 100644 --- a/site/assets/js/pages/checkout/form-controller.js +++ b/site/assets/js/pages/checkout/form-controller.js @@ -26,7 +26,7 @@ 'use strict'; -import {isEuCountry} from 'js/pages/checkout/phone-codes'; +import {isEuCountry} from 'js/pages/checkout/vat-countries'; import {normalizeIntlPhoneNumber} from 'js/modules/forms/phone-number'; /** @@ -48,8 +48,6 @@ export const fieldValidationState = Object.freeze({ * API exposed by the checkout form controller. * * @typedef {Object} CheckoutFormController - * @property {function(boolean): boolean} applyBillingCountryFromPhoneCountry - * syncs billing country from phone country when allowed * @property {function(boolean): void} applyPhoneCountryFromBillingCountry * syncs phone country from billing country when allowed * @property {function(): void} bindPhoneEvents @@ -102,8 +100,7 @@ export function createCheckoutFormController({dom}) { initialCountry: normalizeCountryCode(dom.$phoneCountry.val()) || 'us', autoPlaceholder: 'aggressive', separateDialCode: true, - formatOnDisplay: true, - utilsScript: '/libs/intl-tel-input/utils.js' + formatOnDisplay: true }); syncPhoneCountryState(); } @@ -183,7 +180,9 @@ export function createCheckoutFormController({dom}) { function validatePhoneNumber() { const value = String(dom.$phoneNumber.val() || '').trim(); const phoneInput = getPhoneInputInstance(); - const isValid = !value || Boolean(phoneInput && phoneInput.isValidNumber()); + const utilsReady = Boolean(window.intlTelInputUtils); + const isValid = !value || !utilsReady || + Boolean(phoneInput && phoneInput.isValidNumber()); setPhoneFieldError(isValid ? '' : 'Enter a valid phone number.'); return isValid; @@ -296,33 +295,12 @@ export function createCheckoutFormController({dom}) { } /** - * Sets billing country from phone country when the user has not chosen country manually. - * - * @param {boolean} countryManuallySelected whether billing country was chosen by the user - * @return {boolean} true when billing country was changed by the phone-country selector - */ - function applyBillingCountryFromPhoneCountry(countryManuallySelected) { - if (countryManuallySelected) { - return false; - } - - const countryCode = getSelectedPhoneCountryCode(); - - if (!countryCode || !hasCountryOption(countryCode) || dom.$country.val() === countryCode) { - return false; - } - - setBillingCountry(countryCode); - return true; - } - - /** - * Sets phone country from billing country while the phone number is still untouched. + * Sets phone country from billing country unless the phone country was chosen manually. * * @param {boolean} phoneCountryManuallySelected whether phone country was chosen by the user */ function applyPhoneCountryFromBillingCountry(phoneCountryManuallySelected) { - if (phoneCountryManuallySelected || hasPhoneNumber()) { + if (phoneCountryManuallySelected) { return; } @@ -331,7 +309,7 @@ export function createCheckoutFormController({dom}) { /** Restores billing-country and phone-country controls from browser history. */ function restoreCountryState({billingCountryCode, phoneCountryCode}) { - if (hasCountryOption(billingCountryCode)) { + if (!billingCountryCode || hasCountryOption(billingCountryCode)) { setBillingCountry(billingCountryCode); } @@ -390,6 +368,8 @@ export function createCheckoutFormController({dom}) { isSettingPhoneCountryProgrammatically = true; try { + // `setCountry()` emits `countrychange` synchronously. Keep the guard + // through that event and release it after the current event turn. phoneInput.setCountry(normalizedCode); } finally { window.setTimeout(() => { @@ -455,15 +435,7 @@ export function createCheckoutFormController({dom}) { } setFieldError(field, message); - field.classList.toggle('error', Boolean(message)); field.setCustomValidity(message || ''); - - const fieldContainer = field.closest('.form-field'); - const errorElement = fieldContainer && - fieldContainer.querySelector('.phone-error-message'); - if (errorElement) { - errorElement.classList.toggle('show', Boolean(message)); - } } /** @@ -531,15 +503,6 @@ export function createCheckoutFormController({dom}) { } } - /** - * Checks whether the national phone-number input has user-entered text. - * - * @return {boolean} true when the phone number input is not empty - */ - function hasPhoneNumber() { - return Boolean((dom.$phoneNumber.val() || '').trim()); - } - /** * Checks whether the billing country select contains the given country code. * @@ -577,7 +540,6 @@ export function createCheckoutFormController({dom}) { } return { - applyBillingCountryFromPhoneCountry, applyPhoneCountryFromBillingCountry, bindPhoneEvents, buildSubmitBillingInfoRequest, diff --git a/site/assets/js/pages/checkout/index.js b/site/assets/js/pages/checkout/index.js index e9eac77e..506ef3d4 100644 --- a/site/assets/js/pages/checkout/index.js +++ b/site/assets/js/pages/checkout/index.js @@ -30,13 +30,13 @@ import * as params from '@params'; import {createPurchaseClient} from 'js/modules/paygate/purchases'; import {createChargeController} from 'js/pages/checkout/charge-controller'; import {getCompletedPageUrl} from 'js/pages/checkout/completed-page-url'; -import { - checkoutNavigationMode, - getCheckoutNavigationMode, - initializeCountrySelector -} from 'js/pages/checkout/countries'; +import {initializeCountrySelector} from 'js/pages/checkout/countries'; import {getCheckoutDom} from 'js/pages/checkout/dom'; import {createCheckoutFormController} from 'js/pages/checkout/form-controller'; +import { + checkoutNavigationMode, + getCheckoutNavigationMode +} from 'js/pages/checkout/navigation'; import {createCheckoutView} from 'js/pages/checkout/view-controller'; const requiredSelector = 'input[required], select[required], textarea[required]'; @@ -54,7 +54,6 @@ $( const orderId = getOrderId(); const view = createCheckoutView(dom); const formController = createCheckoutFormController({dom}); - let countryManuallySelected = false; let phoneCountryManuallySelected = false; const chargeController = createChargeController({ purchaseClient, @@ -117,7 +116,6 @@ $( }); dom.$country.on('change', () => { - countryManuallySelected = true; chargeController.invalidate(); formController.applyPhoneCountryFromBillingCountry(phoneCountryManuallySelected); formController.updateVatIdFieldState(); @@ -139,16 +137,10 @@ $( dom.$form.on('submit', handleSubmit); } - /** Syncs billing country after a user changes the phone country. */ + /** Records a user-selected phone country without changing billing/tax country. */ function handlePhoneCountryChange() { phoneCountryManuallySelected = true; formController.focusPhoneNumber(); - - if (formController.applyBillingCountryFromPhoneCountry(countryManuallySelected)) { - chargeController.invalidate(); - formController.updateVatIdFieldState(); - chargeController.flush(); - } } /** @@ -185,7 +177,6 @@ $( return; } - view.setSummaryLoading(false); view.showSummaryError(); chargeController.updateSubmitState(); logApiError(error); @@ -260,7 +251,6 @@ $( window.setTimeout(() => { const restoredState = formController.getBrowserRestoredCountryState(); - countryManuallySelected = Boolean(restoredState.billingCountryCode); phoneCountryManuallySelected = Boolean( restoredState.phoneCountryCode && restoredState.phoneCountryCode !== restoredState.billingCountryCode @@ -274,12 +264,12 @@ $( /** Clears browser-restored custom checkout fields after an explicit reload. */ function scheduleCheckoutReset() { window.setTimeout(() => { - countryManuallySelected = false; phoneCountryManuallySelected = false; formController.restoreCountryState({ billingCountryCode: '', phoneCountryCode: 'US' }); + dom.$phoneNumber.val(''); dom.$vatId.val(''); formController.updateVatIdFieldState(); chargeController.invalidate(); diff --git a/site/assets/js/pages/checkout/navigation.js b/site/assets/js/pages/checkout/navigation.js new file mode 100644 index 00000000..0a32355a --- /dev/null +++ b/site/assets/js/pages/checkout/navigation.js @@ -0,0 +1,44 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +'use strict'; + +export const checkoutNavigationMode = Object.freeze({ + none: 'none', + reset: 'reset', + restore: 'restore' +}); + +/** Chooses whether checkout state should be restored or reset for a navigation. */ +export function getCheckoutNavigationMode(navigationType, pagePersisted = false) { + if (pagePersisted || navigationType === 'back_forward') { + return checkoutNavigationMode.restore; + } + if (navigationType === 'reload') { + return checkoutNavigationMode.reset; + } + return checkoutNavigationMode.none; +} diff --git a/site/assets/js/pages/checkout/phone-codes.js b/site/assets/js/pages/checkout/vat-countries.js similarity index 68% rename from site/assets/js/pages/checkout/phone-codes.js rename to site/assets/js/pages/checkout/vat-countries.js index a26bd498..3caf64fe 100644 --- a/site/assets/js/pages/checkout/phone-codes.js +++ b/site/assets/js/pages/checkout/vat-countries.js @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * * Redistribution and use in source and/or binary forms, with or without * modification, must retain the above copyright notice and the following @@ -26,38 +26,11 @@ 'use strict'; -/** - * Phone codes of the EU countries. - */ -export const euCountryPhoneCodes = { - AT: '43', - BE: '32', - BG: '359', - HR: '385', - CY: '357', - CZ: '420', - DK: '45', - EE: '372', - FI: '358', - FR: '33', - DE: '49', - GR: '30', - HU: '36', - IE: '353', - IT: '39', - LV: '371', - LT: '370', - LU: '352', - MT: '356', - NL: '31', - PL: '48', - PT: '351', - RO: '40', - SK: '421', - SI: '386', - ES: '34', - SE: '46' -}; +const euCountryCodes = new Set([ + 'AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', + 'FR', 'DE', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', + 'MT', 'NL', 'PL', 'PT', 'RO', 'SK', 'SI', 'ES', 'SE' +]); /** * Checks whether the country supports EU VAT ID entry. @@ -66,8 +39,5 @@ export const euCountryPhoneCodes = { * @return {boolean} true for an EU member country */ export function isEuCountry(countryCode) { - return Object.prototype.hasOwnProperty.call( - euCountryPhoneCodes, - String(countryCode || '').trim().toUpperCase() - ); + return euCountryCodes.has(String(countryCode || '').trim().toUpperCase()); } diff --git a/site/assets/js/pages/checkout/view-controller.js b/site/assets/js/pages/checkout/view-controller.js index 6b1358d6..3eacab44 100644 --- a/site/assets/js/pages/checkout/view-controller.js +++ b/site/assets/js/pages/checkout/view-controller.js @@ -134,7 +134,6 @@ export function createCheckoutView(dom) { dom.$summary.prop('hidden', isLoading); dom.$loading.prop('hidden', !isLoading); dom.$loadingSpinner.prop('hidden', !isLoading); - dom.$loadingSupport.prop('hidden', true); dom.$form.prop('hidden', isLoading); dom.$missingOrder.prop('hidden', true); dom.$notFound.prop('hidden', true); diff --git a/site/assets/libs/README.md b/site/assets/libs/README.md new file mode 100644 index 00000000..230fe7d5 --- /dev/null +++ b/site/assets/libs/README.md @@ -0,0 +1,16 @@ +# Checkout libraries + +The checkout uses locally hosted copies of these browser libraries: + +- [Select2 4.1.0-rc.0](https://github.com/select2/select2/releases/tag/4.1.0-rc.0) + (`country-select/select2.js`), under the MIT license. +- [intl-tel-input 18.2.1](https://github.com/jackocnr/intl-tel-input/releases/tag/v18.2.1) + (`intl-tel-input/intlTelInput.js` and `utils.js`), under the MIT license. + +Their CSS distributions live under `site/assets/scss/libs/`. Hugo compiles the CSS +into the site stylesheet and fingerprints the JavaScript resources in production. +The generated script tags include Subresource Integrity metadata. The original +library license notices remain in the distributed files. + +Library version changes require a dedicated dependency update and checkout UI +regression testing. diff --git a/site/static/libs/country-select/select2.min.js b/site/assets/libs/country-select/select2.js similarity index 99% rename from site/static/libs/country-select/select2.min.js rename to site/assets/libs/country-select/select2.js index 445a6798..cc9a83f1 100644 --- a/site/static/libs/country-select/select2.min.js +++ b/site/assets/libs/country-select/select2.js @@ -1,2 +1,2 @@ /*! Select2 4.1.0-rc.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ -!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(t){var e,n,s,p,r,o,h,f,g,m,y,v,i,a,_,s=((u=t&&t.fn&&t.fn.select2&&t.fn.select2.amd?t.fn.select2.amd:u)&&u.requirejs||(u?n=u:u={},g={},m={},y={},v={},i=Object.prototype.hasOwnProperty,a=[].slice,_=/\.js$/,h=function(e,t){var n,s,i=c(e),r=i[0],t=t[1];return e=i[1],r&&(n=x(r=l(r,t))),r?e=n&&n.normalize?n.normalize(e,(s=t,function(e){return l(e,s)})):l(e,t):(r=(i=c(e=l(e,t)))[0],e=i[1],r&&(n=x(r))),{f:r?r+"!"+e:e,n:e,pr:r,p:n}},f={require:function(e){return w(e)},exports:function(e){var t=g[e];return void 0!==t?t:g[e]={}},module:function(e){return{id:e,uri:"",exports:g[e],config:(t=e,function(){return y&&y.config&&y.config[t]||{}})};var t}},r=function(e,t,n,s){var i,r,o,a,l,c=[],u=typeof n,d=A(s=s||e);if("undefined"==u||"function"==u){for(t=!t.length&&n.length?["require","exports","module"]:t,a=0;a":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},s.__cache={};var n=0;return s.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null!=t||(t=e.id?"select2-data-"+e.id:"select2-data-"+(++n).toString()+"-"+s.generateChars(4),e.setAttribute("data-select2-id",t)),t},s.StoreData=function(e,t,n){e=s.GetUniqueElementId(e);s.__cache[e]||(s.__cache[e]={}),s.__cache[e][t]=n},s.GetData=function(e,t){var n=s.GetUniqueElementId(e);return t?s.__cache[n]&&null!=s.__cache[n][t]?s.__cache[n][t]:r(e).data(t):s.__cache[n]},s.RemoveData=function(e){var t=s.GetUniqueElementId(e);null!=s.__cache[t]&&delete s.__cache[t],e.removeAttribute("data-select2-id")},s.copyNonInternalCssClasses=function(e,t){var n=(n=e.getAttribute("class").trim().split(/\s+/)).filter(function(e){return 0===e.indexOf("select2-")}),t=(t=t.getAttribute("class").trim().split(/\s+/)).filter(function(e){return 0!==e.indexOf("select2-")}),t=n.concat(t);e.setAttribute("class",t.join(" "))},s}),u.define("select2/results",["jquery","./utils"],function(d,p){function s(e,t,n){this.$element=e,this.data=n,this.options=t,s.__super__.constructor.call(this)}return p.Extend(s,p.Observable),s.prototype.render=function(){var e=d('

        ');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},s.prototype.clear=function(){this.$results.empty()},s.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=d(''),s=this.options.get("translations").get(e.message);n.append(t(s(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},s.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},s.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n",{class:"select2-results__options select2-results__options--nested",role:"none"});i.append(l),o.append(a),o.append(i)}else this.template(e,t);return p.StoreData(t,"data",e),t},s.prototype.bind=function(t,e){var i=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){i.clear(),i.append(e.data),t.isOpen()&&(i.setClasses(),i.highlightFirstItem())}),t.on("results:append",function(e){i.append(e.data),t.isOpen()&&i.setClasses()}),t.on("query",function(e){i.hideMessages(),i.showLoading(e)}),t.on("select",function(){t.isOpen()&&(i.setClasses(),i.options.get("scrollAfterSelect")&&i.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(i.setClasses(),i.options.get("scrollAfterSelect")&&i.highlightFirstItem())}),t.on("open",function(){i.$results.attr("aria-expanded","true"),i.$results.attr("aria-hidden","false"),i.setClasses(),i.ensureHighlightVisible()}),t.on("close",function(){i.$results.attr("aria-expanded","false"),i.$results.attr("aria-hidden","true"),i.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=i.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e,t=i.getHighlightedResults();0!==t.length&&(e=p.GetData(t[0],"data"),t.hasClass("select2-results__option--selected")?i.trigger("close",{}):i.trigger("select",{data:e}))}),t.on("results:previous",function(){var e,t=i.getHighlightedResults(),n=i.$results.find(".select2-results__option--selectable"),s=n.index(t);s<=0||(e=s-1,0===t.length&&(e=0),(s=n.eq(e)).trigger("mouseenter"),t=i.$results.offset().top,n=s.offset().top,s=i.$results.scrollTop()+(n-t),0===e?i.$results.scrollTop(0):n-t<0&&i.$results.scrollTop(s))}),t.on("results:next",function(){var e,t=i.getHighlightedResults(),n=i.$results.find(".select2-results__option--selectable"),s=n.index(t)+1;s>=n.length||((e=n.eq(s)).trigger("mouseenter"),t=i.$results.offset().top+i.$results.outerHeight(!1),n=e.offset().top+e.outerHeight(!1),e=i.$results.scrollTop()+n-t,0===s?i.$results.scrollTop(0):tthis.$results.outerHeight()||s<0)&&this.$results.scrollTop(n))},s.prototype.template=function(e,t){var n=this.options.get("templateResult"),s=this.options.get("escapeMarkup"),e=n(e,t);null==e?t.style.display="none":"string"==typeof e?t.innerHTML=s(e):d(t).append(e)},s}),u.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),u.define("select2/selection/base",["jquery","../utils","../keys"],function(n,s,i){function r(e,t){this.$element=e,this.options=t,r.__super__.constructor.call(this)}return s.Extend(r,s.Observable),r.prototype.render=function(){var e=n('');return this._tabindex=0,null!=s.GetData(this.$element[0],"old-tabindex")?this._tabindex=s.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},r.prototype.bind=function(e,t){var n=this,s=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===i.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",s),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},r.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},r.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&s.GetData(this,"element").select2("close")})})},r.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},r.prototype.position=function(e,t){t.find(".selection").append(e)},r.prototype.destroy=function(){this._detachCloseHandler(this.container)},r.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},r.prototype.isEnabled=function(){return!this.isDisabled()},r.prototype.isDisabled=function(){return this.options.get("disabled")},r}),u.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,s){function i(){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e[0].classList.add("select2-selection--single"),e.html(''),e},i.prototype.bind=function(t,e){var n=this;i.__super__.bind.apply(this,arguments);var s=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",s).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",s),this.$selection.attr("aria-controls",s),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},i.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e("")},i.prototype.update=function(e){var t,n;0!==e.length?(n=e[0],t=this.$selection.find(".select2-selection__rendered"),e=this.display(n,t),t.empty().append(e),(n=n.title||n.text)?t.attr("title",n):t.removeAttr("title")):this.clear()},i}),u.define("select2/selection/multiple",["jquery","./base","../utils"],function(i,e,c){function r(e,t){r.__super__.constructor.apply(this,arguments)}return c.Extend(r,e),r.prototype.render=function(){var e=r.__super__.render.call(this);return e[0].classList.add("select2-selection--multiple"),e.html('
          '),e},r.prototype.bind=function(e,t){var n=this;r.__super__.bind.apply(this,arguments);var s=e.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",s),this.$selection.on("click",function(e){n.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){var t;n.isDisabled()||(t=i(this).parent(),t=c.GetData(t[0],"data"),n.trigger("unselect",{originalEvent:e,data:t}))}),this.$selection.on("keydown",".select2-selection__choice__remove",function(e){n.isDisabled()||e.stopPropagation()})},r.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},r.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},r.prototype.selectionContainer=function(){return i('
        • ')},r.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=this.$selection.find(".select2-selection__rendered").attr("id")+"-choice-",s=0;s')).attr("title",s()),e.attr("aria-label",s()),e.attr("aria-describedby",n),a.StoreData(e[0],"data",t),this.$selection.prepend(e),this.$selection[0].classList.add("select2-selection--clearable"))},e}),u.define("select2/selection/search",["jquery","../utils","../keys"],function(s,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=this.options.get("translations").get("search"),n=s('');this.$searchContainer=n,this.$search=n.find("textarea"),this.$search.prop("autocomplete",this.options.get("autocomplete")),this.$search.attr("aria-label",t());e=e.call(this);return this._transferTabIndex(),e.append(this.$searchContainer),e},e.prototype.bind=function(e,t,n){var s=this,i=t.id+"-results",r=t.id+"-container";e.call(this,t,n),s.$search.attr("aria-describedby",r),t.on("open",function(){s.$search.attr("aria-controls",i),s.$search.trigger("focus")}),t.on("close",function(){s.$search.val(""),s.resizeSearch(),s.$search.removeAttr("aria-controls"),s.$search.removeAttr("aria-activedescendant"),s.$search.trigger("focus")}),t.on("enable",function(){s.$search.prop("disabled",!1),s._transferTabIndex()}),t.on("disable",function(){s.$search.prop("disabled",!0)}),t.on("focus",function(e){s.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?s.$search.attr("aria-activedescendant",e.data._resultId):s.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){s.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){s._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){var t;e.stopPropagation(),s.trigger("keypress",e),s._keyUpPrevented=e.isDefaultPrevented(),e.which!==l.BACKSPACE||""!==s.$search.val()||0<(t=s.$selection.find(".select2-selection__choice").last()).length&&(t=a.GetData(t[0],"data"),s.searchRemoveChoice(t),e.preventDefault())}),this.$selection.on("click",".select2-search--inline",function(e){s.$search.val()&&e.stopPropagation()});var t=document.documentMode,o=t&&t<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(e){o?s.$selection.off("input.search input.searchcheck"):s.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(e){var t;o&&"input"===e.type?s.$selection.off("input.search input.searchcheck"):(t=e.which)!=l.SHIFT&&t!=l.CTRL&&t!=l.ALT&&t!=l.TAB&&s.handleSearch(e)})},e.prototype._transferTabIndex=function(e){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},e.prototype.createPlaceholder=function(e,t){this.$search.attr("placeholder",t.text)},e.prototype.update=function(e,t){var n=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),e.call(this,t),this.resizeSearch(),n&&this.$search.trigger("focus")},e.prototype.handleSearch=function(){var e;this.resizeSearch(),this._keyUpPrevented||(e=this.$search.val(),this.trigger("query",{term:e})),this._keyUpPrevented=!1},e.prototype.searchRemoveChoice=function(e,t){this.trigger("unselect",{data:t}),this.$search.val(t.text),this.handleSearch()},e.prototype.resizeSearch=function(){this.$search.css("width","25px");var e="100%";""===this.$search.attr("placeholder")&&(e=.75*(this.$search.val().length+1)+"em"),this.$search.css("width",e)},e}),u.define("select2/selection/selectionCss",["../utils"],function(n){function e(){}return e.prototype.render=function(e){var t=e.call(this),e=this.options.get("selectionCssClass")||"";return-1!==e.indexOf(":all:")&&(e=e.replace(":all:",""),n.copyNonInternalCssClasses(t[0],this.$element[0])),t.addClass(e),t},e}),u.define("select2/selection/eventRelay",["jquery"],function(o){function e(){}return e.prototype.bind=function(e,t,n){var s=this,i=["open","opening","close","closing","select","selecting","unselect","unselecting","clear","clearing"],r=["opening","closing","selecting","unselecting","clearing"];e.call(this,t,n),t.on("*",function(e,t){var n;-1!==i.indexOf(e)&&(t=t||{},n=o.Event("select2:"+e,{params:t}),s.$element.trigger(n),-1!==r.indexOf(e)&&(t.prevented=n.isDefaultPrevented()))})},e}),u.define("select2/translation",["jquery","require"],function(t,n){function s(e){this.dict=e||{}}return s.prototype.all=function(){return this.dict},s.prototype.get=function(e){return this.dict[e]},s.prototype.extend=function(e){this.dict=t.extend({},e.all(),this.dict)},s._cache={},s.loadPath=function(e){var t;return e in s._cache||(t=n(e),s._cache[e]=t),new s(s._cache[e])},s}),u.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Œ":"OE","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","œ":"oe","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ώ":"ω","ς":"σ","’":"'"}}),u.define("select2/data/base",["../utils"],function(n){function s(e,t){s.__super__.constructor.call(this)}return n.Extend(s,n.Observable),s.prototype.current=function(e){throw new Error("The `current` method must be defined in child classes.")},s.prototype.query=function(e,t){throw new Error("The `query` method must be defined in child classes.")},s.prototype.bind=function(e,t){},s.prototype.destroy=function(){},s.prototype.generateResultId=function(e,t){e=e.id+"-result-";return e+=n.generateChars(4),null!=t.id?e+="-"+t.id.toString():e+="-"+n.generateChars(4),e},s}),u.define("select2/data/select",["./base","../utils","jquery"],function(e,a,l){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return a.Extend(n,e),n.prototype.current=function(e){var t=this;e(Array.prototype.map.call(this.$element[0].querySelectorAll(":checked"),function(e){return t.item(l(e))}))},n.prototype.select=function(i){var e,r=this;if(i.selected=!0,null!=i.element&&"option"===i.element.tagName.toLowerCase())return i.element.selected=!0,void this.$element.trigger("input").trigger("change");this.$element.prop("multiple")?this.current(function(e){var t=[];(i=[i]).push.apply(i,e);for(var n=0;nthis.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),u.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("select",function(){s._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var s=this;this._checkIfMaximumSelected(function(){e.call(s,t,n)})},e.prototype._checkIfMaximumSelected=function(e,t){var n=this;this.current(function(e){e=null!=e?e.length:0;0=n.maximumSelectionLength?n.trigger("results:message",{message:"maximumSelected",args:{maximum:n.maximumSelectionLength}}):t&&t()})},e}),u.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),u.define("select2/dropdown/search",["jquery"],function(r){function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("translations").get("search"),e=r('');return this.$searchContainer=e,this.$search=e.find("input"),this.$search.prop("autocomplete",this.options.get("autocomplete")),this.$search.attr("aria-label",n()),t.prepend(e),t},e.prototype.bind=function(e,t,n){var s=this,i=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){s.trigger("keypress",e),s._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){r(this).off("keyup")}),this.$search.on("keyup input",function(e){s.handleSearch(e)}),t.on("open",function(){s.$search.attr("tabindex",0),s.$search.attr("aria-controls",i),s.$search.trigger("focus"),window.setTimeout(function(){s.$search.trigger("focus")},0)}),t.on("close",function(){s.$search.attr("tabindex",-1),s.$search.removeAttr("aria-controls"),s.$search.removeAttr("aria-activedescendant"),s.$search.val(""),s.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||s.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(s.showSearch(e)?s.$searchContainer[0].classList.remove("select2-search--hide"):s.$searchContainer[0].classList.add("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?s.$search.attr("aria-activedescendant",e.data._resultId):s.$search.removeAttr("aria-activedescendant")})},e.prototype.handleSearch=function(e){var t;this._keyUpPrevented||(t=this.$search.val(),this.trigger("query",{term:t})),this._keyUpPrevented=!1},e.prototype.showSearch=function(e,t){return!0},e}),u.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,s){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,s)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return t="string"==typeof t?{id:"",text:t}:t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),s=t.length-1;0<=s;s--){var i=t[s];this.placeholder.id===i.id&&n.splice(s,1)}return n},e}),u.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,s){this.lastParams={},e.call(this,t,n,s),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("query",function(e){s.lastParams=e,s.loading=!0}),t.on("query:append",function(e){s.lastParams=e,s.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);!this.loading&&e&&(e=this.$results.offset().top+this.$results.outerHeight(!1),this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=e+50&&this.loadMore())},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('
        • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),u.define("select2/dropdown/attachBody",["jquery","../utils"],function(u,o){function e(e,t,n){this.$dropdownParent=u(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("open",function(){s._showDropdown(),s._attachPositioningHandler(t),s._bindContainerResultHandlers(t)}),t.on("close",function(){s._hideDropdown(),s._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t[0].classList.remove("select2"),t[0].classList.add("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=u(""),e=e.call(this);return t.append(e),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){var n;this._containerResultsHandlersBound||(n=this,t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0)},e.prototype._attachPositioningHandler=function(e,t){var n=this,s="scroll.select2."+t.id,i="resize.select2."+t.id,r="orientationchange.select2."+t.id,t=this.$container.parents().filter(o.hasScroll);t.each(function(){o.StoreData(this,"select2-scroll-position",{x:u(this).scrollLeft(),y:u(this).scrollTop()})}),t.on(s,function(e){var t=o.GetData(this,"select2-scroll-position");u(this).scrollTop(t.y)}),u(window).on(s+" "+i+" "+r,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,s="resize.select2."+t.id,t="orientationchange.select2."+t.id;this.$container.parents().filter(o.hasScroll).off(n),u(window).off(n+" "+s+" "+t)},e.prototype._positionDropdown=function(){var e=u(window),t=this.$dropdown[0].classList.contains("select2-dropdown--above"),n=this.$dropdown[0].classList.contains("select2-dropdown--below"),s=null,i=this.$container.offset();i.bottom=i.top+this.$container.outerHeight(!1);var r={height:this.$container.outerHeight(!1)};r.top=i.top,r.bottom=i.top+r.height;var o=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ai.bottom+o,a={left:i.left,top:r.bottom},l=this.$dropdownParent;"static"===l.css("position")&&(l=l.offsetParent());i={top:0,left:0};(u.contains(document.body,l[0])||l[0].isConnected)&&(i=l.offset()),a.top-=i.top,a.left-=i.left,t||n||(s="below"),e||!c||t?!c&&e&&t&&(s="below"):s="above",("above"==s||t&&"below"!==s)&&(a.top=r.top-i.top-o),null!=s&&(this.$dropdown[0].classList.remove("select2-dropdown--below"),this.$dropdown[0].classList.remove("select2-dropdown--above"),this.$dropdown[0].classList.add("select2-dropdown--"+s),this.$container[0].classList.remove("select2-container--below"),this.$container[0].classList.remove("select2-container--above"),this.$container[0].classList.add("select2-container--"+s)),this.$dropdownContainer.css(a)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),u.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,s){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,s)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,s=0;s');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container[0].classList.add("select2-container--"+this.options.get("theme")),r.StoreData(e[0],"element",this.$element),e},o}),u.define("jquery-mousewheel",["jquery"],function(e){return e}),u.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(i,e,r,t,o){var a;return null==i.fn.select2&&(a=["open","close","destroy"],i.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=i.extend(!0,{},t);new r(i(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,s=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=o.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),n=e[t].apply(e,s)}),-1":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},s.__cache={};var n=0;return s.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null!=t||(t=e.id?"select2-data-"+e.id:"select2-data-"+(++n).toString()+"-"+s.generateChars(4),e.setAttribute("data-select2-id",t)),t},s.StoreData=function(e,t,n){e=s.GetUniqueElementId(e);s.__cache[e]||(s.__cache[e]={}),s.__cache[e][t]=n},s.GetData=function(e,t){var n=s.GetUniqueElementId(e);return t?s.__cache[n]&&null!=s.__cache[n][t]?s.__cache[n][t]:r(e).data(t):s.__cache[n]},s.RemoveData=function(e){var t=s.GetUniqueElementId(e);null!=s.__cache[t]&&delete s.__cache[t],e.removeAttribute("data-select2-id")},s.copyNonInternalCssClasses=function(e,t){var n=(n=e.getAttribute("class").trim().split(/\s+/)).filter(function(e){return 0===e.indexOf("select2-")}),t=(t=t.getAttribute("class").trim().split(/\s+/)).filter(function(e){return 0!==e.indexOf("select2-")}),t=n.concat(t);e.setAttribute("class",t.join(" "))},s}),u.define("select2/results",["jquery","./utils"],function(d,p){function s(e,t,n){this.$element=e,this.data=n,this.options=t,s.__super__.constructor.call(this)}return p.Extend(s,p.Observable),s.prototype.render=function(){var e=d('
            ');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},s.prototype.clear=function(){this.$results.empty()},s.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=d(''),s=this.options.get("translations").get(e.message);n.append(t(s(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},s.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},s.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n",{class:"select2-results__options select2-results__options--nested",role:"none"});i.append(l),o.append(a),o.append(i)}else this.template(e,t);return p.StoreData(t,"data",e),t},s.prototype.bind=function(t,e){var i=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){i.clear(),i.append(e.data),t.isOpen()&&(i.setClasses(),i.highlightFirstItem())}),t.on("results:append",function(e){i.append(e.data),t.isOpen()&&i.setClasses()}),t.on("query",function(e){i.hideMessages(),i.showLoading(e)}),t.on("select",function(){t.isOpen()&&(i.setClasses(),i.options.get("scrollAfterSelect")&&i.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(i.setClasses(),i.options.get("scrollAfterSelect")&&i.highlightFirstItem())}),t.on("open",function(){i.$results.attr("aria-expanded","true"),i.$results.attr("aria-hidden","false"),i.setClasses(),i.ensureHighlightVisible()}),t.on("close",function(){i.$results.attr("aria-expanded","false"),i.$results.attr("aria-hidden","true"),i.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=i.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e,t=i.getHighlightedResults();0!==t.length&&(e=p.GetData(t[0],"data"),t.hasClass("select2-results__option--selected")?i.trigger("close",{}):i.trigger("select",{data:e}))}),t.on("results:previous",function(){var e,t=i.getHighlightedResults(),n=i.$results.find(".select2-results__option--selectable"),s=n.index(t);s<=0||(e=s-1,0===t.length&&(e=0),(s=n.eq(e)).trigger("mouseenter"),t=i.$results.offset().top,n=s.offset().top,s=i.$results.scrollTop()+(n-t),0===e?i.$results.scrollTop(0):n-t<0&&i.$results.scrollTop(s))}),t.on("results:next",function(){var e,t=i.getHighlightedResults(),n=i.$results.find(".select2-results__option--selectable"),s=n.index(t)+1;s>=n.length||((e=n.eq(s)).trigger("mouseenter"),t=i.$results.offset().top+i.$results.outerHeight(!1),n=e.offset().top+e.outerHeight(!1),e=i.$results.scrollTop()+n-t,0===s?i.$results.scrollTop(0):tthis.$results.outerHeight()||s<0)&&this.$results.scrollTop(n))},s.prototype.template=function(e,t){var n=this.options.get("templateResult"),s=this.options.get("escapeMarkup"),e=n(e,t);null==e?t.style.display="none":"string"==typeof e?t.innerHTML=s(e):d(t).append(e)},s}),u.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),u.define("select2/selection/base",["jquery","../utils","../keys"],function(n,s,i){function r(e,t){this.$element=e,this.options=t,r.__super__.constructor.call(this)}return s.Extend(r,s.Observable),r.prototype.render=function(){var e=n('');return this._tabindex=0,null!=s.GetData(this.$element[0],"old-tabindex")?this._tabindex=s.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},r.prototype.bind=function(e,t){var n=this,s=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===i.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",s),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},r.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},r.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&s.GetData(this,"element").select2("close")})})},r.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},r.prototype.position=function(e,t){t.find(".selection").append(e)},r.prototype.destroy=function(){this._detachCloseHandler(this.container)},r.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},r.prototype.isEnabled=function(){return!this.isDisabled()},r.prototype.isDisabled=function(){return this.options.get("disabled")},r}),u.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,s){function i(){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e[0].classList.add("select2-selection--single"),e.html(''),e},i.prototype.bind=function(t,e){var n=this;i.__super__.bind.apply(this,arguments);var s=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",s).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",s),this.$selection.attr("aria-controls",s),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},i.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e("")},i.prototype.update=function(e){var t,n;0!==e.length?(n=e[0],t=this.$selection.find(".select2-selection__rendered"),e=this.display(n,t),t.empty().append(e),(n=n.title||n.text)?t.attr("title",n):t.removeAttr("title")):this.clear()},i}),u.define("select2/selection/multiple",["jquery","./base","../utils"],function(i,e,c){function r(e,t){r.__super__.constructor.apply(this,arguments)}return c.Extend(r,e),r.prototype.render=function(){var e=r.__super__.render.call(this);return e[0].classList.add("select2-selection--multiple"),e.html('
              '),e},r.prototype.bind=function(e,t){var n=this;r.__super__.bind.apply(this,arguments);var s=e.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",s),this.$selection.on("click",function(e){n.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){var t;n.isDisabled()||(t=i(this).parent(),t=c.GetData(t[0],"data"),n.trigger("unselect",{originalEvent:e,data:t}))}),this.$selection.on("keydown",".select2-selection__choice__remove",function(e){n.isDisabled()||e.stopPropagation()})},r.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},r.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},r.prototype.selectionContainer=function(){return i('
            • ')},r.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=this.$selection.find(".select2-selection__rendered").attr("id")+"-choice-",s=0;s')).attr("title",s()),e.attr("aria-label",s()),e.attr("aria-describedby",n),a.StoreData(e[0],"data",t),this.$selection.prepend(e),this.$selection[0].classList.add("select2-selection--clearable"))},e}),u.define("select2/selection/search",["jquery","../utils","../keys"],function(s,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=this.options.get("translations").get("search"),n=s('');this.$searchContainer=n,this.$search=n.find("textarea"),this.$search.prop("autocomplete",this.options.get("autocomplete")),this.$search.attr("aria-label",t());e=e.call(this);return this._transferTabIndex(),e.append(this.$searchContainer),e},e.prototype.bind=function(e,t,n){var s=this,i=t.id+"-results",r=t.id+"-container";e.call(this,t,n),s.$search.attr("aria-describedby",r),t.on("open",function(){s.$search.attr("aria-controls",i),s.$search.trigger("focus")}),t.on("close",function(){s.$search.val(""),s.resizeSearch(),s.$search.removeAttr("aria-controls"),s.$search.removeAttr("aria-activedescendant"),s.$search.trigger("focus")}),t.on("enable",function(){s.$search.prop("disabled",!1),s._transferTabIndex()}),t.on("disable",function(){s.$search.prop("disabled",!0)}),t.on("focus",function(e){s.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?s.$search.attr("aria-activedescendant",e.data._resultId):s.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){s.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){s._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){var t;e.stopPropagation(),s.trigger("keypress",e),s._keyUpPrevented=e.isDefaultPrevented(),e.which!==l.BACKSPACE||""!==s.$search.val()||0<(t=s.$selection.find(".select2-selection__choice").last()).length&&(t=a.GetData(t[0],"data"),s.searchRemoveChoice(t),e.preventDefault())}),this.$selection.on("click",".select2-search--inline",function(e){s.$search.val()&&e.stopPropagation()});var t=document.documentMode,o=t&&t<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(e){o?s.$selection.off("input.search input.searchcheck"):s.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(e){var t;o&&"input"===e.type?s.$selection.off("input.search input.searchcheck"):(t=e.which)!=l.SHIFT&&t!=l.CTRL&&t!=l.ALT&&t!=l.TAB&&s.handleSearch(e)})},e.prototype._transferTabIndex=function(e){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},e.prototype.createPlaceholder=function(e,t){this.$search.attr("placeholder",t.text)},e.prototype.update=function(e,t){var n=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),e.call(this,t),this.resizeSearch(),n&&this.$search.trigger("focus")},e.prototype.handleSearch=function(){var e;this.resizeSearch(),this._keyUpPrevented||(e=this.$search.val(),this.trigger("query",{term:e})),this._keyUpPrevented=!1},e.prototype.searchRemoveChoice=function(e,t){this.trigger("unselect",{data:t}),this.$search.val(t.text),this.handleSearch()},e.prototype.resizeSearch=function(){this.$search.css("width","25px");var e="100%";""===this.$search.attr("placeholder")&&(e=.75*(this.$search.val().length+1)+"em"),this.$search.css("width",e)},e}),u.define("select2/selection/selectionCss",["../utils"],function(n){function e(){}return e.prototype.render=function(e){var t=e.call(this),e=this.options.get("selectionCssClass")||"";return-1!==e.indexOf(":all:")&&(e=e.replace(":all:",""),n.copyNonInternalCssClasses(t[0],this.$element[0])),t.addClass(e),t},e}),u.define("select2/selection/eventRelay",["jquery"],function(o){function e(){}return e.prototype.bind=function(e,t,n){var s=this,i=["open","opening","close","closing","select","selecting","unselect","unselecting","clear","clearing"],r=["opening","closing","selecting","unselecting","clearing"];e.call(this,t,n),t.on("*",function(e,t){var n;-1!==i.indexOf(e)&&(t=t||{},n=o.Event("select2:"+e,{params:t}),s.$element.trigger(n),-1!==r.indexOf(e)&&(t.prevented=n.isDefaultPrevented()))})},e}),u.define("select2/translation",["jquery","require"],function(t,n){function s(e){this.dict=e||{}}return s.prototype.all=function(){return this.dict},s.prototype.get=function(e){return this.dict[e]},s.prototype.extend=function(e){this.dict=t.extend({},e.all(),this.dict)},s._cache={},s.loadPath=function(e){var t;return e in s._cache||(t=n(e),s._cache[e]=t),new s(s._cache[e])},s}),u.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Œ":"OE","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","œ":"oe","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ώ":"ω","ς":"σ","’":"'"}}),u.define("select2/data/base",["../utils"],function(n){function s(e,t){s.__super__.constructor.call(this)}return n.Extend(s,n.Observable),s.prototype.current=function(e){throw new Error("The `current` method must be defined in child classes.")},s.prototype.query=function(e,t){throw new Error("The `query` method must be defined in child classes.")},s.prototype.bind=function(e,t){},s.prototype.destroy=function(){},s.prototype.generateResultId=function(e,t){e=e.id+"-result-";return e+=n.generateChars(4),null!=t.id?e+="-"+t.id.toString():e+="-"+n.generateChars(4),e},s}),u.define("select2/data/select",["./base","../utils","jquery"],function(e,a,l){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return a.Extend(n,e),n.prototype.current=function(e){var t=this;e(Array.prototype.map.call(this.$element[0].querySelectorAll(":checked"),function(e){return t.item(l(e))}))},n.prototype.select=function(i){var e,r=this;if(i.selected=!0,null!=i.element&&"option"===i.element.tagName.toLowerCase())return i.element.selected=!0,void this.$element.trigger("input").trigger("change");this.$element.prop("multiple")?this.current(function(e){var t=[];(i=[i]).push.apply(i,e);for(var n=0;nthis.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),u.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("select",function(){s._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var s=this;this._checkIfMaximumSelected(function(){e.call(s,t,n)})},e.prototype._checkIfMaximumSelected=function(e,t){var n=this;this.current(function(e){e=null!=e?e.length:0;0=n.maximumSelectionLength?n.trigger("results:message",{message:"maximumSelected",args:{maximum:n.maximumSelectionLength}}):t&&t()})},e}),u.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),u.define("select2/dropdown/search",["jquery"],function(r){function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("translations").get("search"),e=r('');return this.$searchContainer=e,this.$search=e.find("input"),this.$search.prop("autocomplete",this.options.get("autocomplete")),this.$search.attr("aria-label",n()),t.prepend(e),t},e.prototype.bind=function(e,t,n){var s=this,i=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){s.trigger("keypress",e),s._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){r(this).off("keyup")}),this.$search.on("keyup input",function(e){s.handleSearch(e)}),t.on("open",function(){s.$search.attr("tabindex",0),s.$search.attr("aria-controls",i),s.$search.trigger("focus"),window.setTimeout(function(){s.$search.trigger("focus")},0)}),t.on("close",function(){s.$search.attr("tabindex",-1),s.$search.removeAttr("aria-controls"),s.$search.removeAttr("aria-activedescendant"),s.$search.val(""),s.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||s.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(s.showSearch(e)?s.$searchContainer[0].classList.remove("select2-search--hide"):s.$searchContainer[0].classList.add("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?s.$search.attr("aria-activedescendant",e.data._resultId):s.$search.removeAttr("aria-activedescendant")})},e.prototype.handleSearch=function(e){var t;this._keyUpPrevented||(t=this.$search.val(),this.trigger("query",{term:t})),this._keyUpPrevented=!1},e.prototype.showSearch=function(e,t){return!0},e}),u.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,s){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,s)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return t="string"==typeof t?{id:"",text:t}:t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),s=t.length-1;0<=s;s--){var i=t[s];this.placeholder.id===i.id&&n.splice(s,1)}return n},e}),u.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,s){this.lastParams={},e.call(this,t,n,s),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("query",function(e){s.lastParams=e,s.loading=!0}),t.on("query:append",function(e){s.lastParams=e,s.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);!this.loading&&e&&(e=this.$results.offset().top+this.$results.outerHeight(!1),this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=e+50&&this.loadMore())},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('
            • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),u.define("select2/dropdown/attachBody",["jquery","../utils"],function(u,o){function e(e,t,n){this.$dropdownParent=u(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("open",function(){s._showDropdown(),s._attachPositioningHandler(t),s._bindContainerResultHandlers(t)}),t.on("close",function(){s._hideDropdown(),s._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t[0].classList.remove("select2"),t[0].classList.add("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=u(""),e=e.call(this);return t.append(e),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){var n;this._containerResultsHandlersBound||(n=this,t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0)},e.prototype._attachPositioningHandler=function(e,t){var n=this,s="scroll.select2."+t.id,i="resize.select2."+t.id,r="orientationchange.select2."+t.id,t=this.$container.parents().filter(o.hasScroll);t.each(function(){o.StoreData(this,"select2-scroll-position",{x:u(this).scrollLeft(),y:u(this).scrollTop()})}),t.on(s,function(e){var t=o.GetData(this,"select2-scroll-position");u(this).scrollTop(t.y)}),u(window).on(s+" "+i+" "+r,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,s="resize.select2."+t.id,t="orientationchange.select2."+t.id;this.$container.parents().filter(o.hasScroll).off(n),u(window).off(n+" "+s+" "+t)},e.prototype._positionDropdown=function(){var e=u(window),t=this.$dropdown[0].classList.contains("select2-dropdown--above"),n=this.$dropdown[0].classList.contains("select2-dropdown--below"),s=null,i=this.$container.offset();i.bottom=i.top+this.$container.outerHeight(!1);var r={height:this.$container.outerHeight(!1)};r.top=i.top,r.bottom=i.top+r.height;var o=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ai.bottom+o,a={left:i.left,top:r.bottom},l=this.$dropdownParent;"static"===l.css("position")&&(l=l.offsetParent());i={top:0,left:0};(u.contains(document.body,l[0])||l[0].isConnected)&&(i=l.offset()),a.top-=i.top,a.left-=i.left,t||n||(s="below"),e||!c||t?!c&&e&&t&&(s="below"):s="above",("above"==s||t&&"below"!==s)&&(a.top=r.top-i.top-o),null!=s&&(this.$dropdown[0].classList.remove("select2-dropdown--below"),this.$dropdown[0].classList.remove("select2-dropdown--above"),this.$dropdown[0].classList.add("select2-dropdown--"+s),this.$container[0].classList.remove("select2-container--below"),this.$container[0].classList.remove("select2-container--above"),this.$container[0].classList.add("select2-container--"+s)),this.$dropdownContainer.css(a)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),u.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,s){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,s)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,s=0;s');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container[0].classList.add("select2-container--"+this.options.get("theme")),r.StoreData(e[0],"element",this.$element),e},o}),u.define("jquery-mousewheel",["jquery"],function(e){return e}),u.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(i,e,r,t,o){var a;return null==i.fn.select2&&(a=["open","close","destroy"],i.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=i.extend(!0,{},t);new r(i(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,s=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=o.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),n=e[t].apply(e,s)}),-1this.countryCodeMaxLen&&(this.countryCodeMaxLen=c.length),this.q.hasOwnProperty(c)||(this.q[c]=[]);for(var e=0;e-1})}else if(this.d.excludeCountries.length){var b=this.d.excludeCountries.map(function(a){return a.toLowerCase()});this.p=i.filter(function(a){return-1===b.indexOf(a.iso2)})}else this.p=i}},{key:"_d0",value:function(){for(var a=0;ab.name?1:0}},{key:"_d2",value:function(){this.countryCodeMaxLen=0,this.dialCodes={},this.q={};for(var a=0;a"),this.d.showFlags&&(d+="
              ")),d+="".concat(f.name,""),d+="+".concat(f.dialCode,""),d+=""}this.m.insertAdjacentHTML("beforeend",d)}},{key:"_h",value:function(){var a=this.a.getAttribute("value"),b=this.a.value,c=a&&"+"===a.charAt(0)&&(!b||"+"!==b.charAt(0)),d=c?a:b,e=this._5(d),f=this._w(d),g=this.d,h=g.initialCountry,i=g.autoInsertDialCode;e&&!f?this._v(d):"auto"!==h&&(h?this._z(h.toLowerCase()):e&&f?this._z("us"):(this.j=this.preferredCountries.length?this.preferredCountries[0].iso2:this.p[0].iso2,d||this._z(this.j)),!d&&i&&(this.a.value="+".concat(this.s.dialCode))),d&&this._u(d)}},{key:"_i",value:function(){this._j(),this.d.autoInsertDialCode&&this._l(),this.d.allowDropdown&&this._i2(),this.hiddenInput&&this._i0()}},{key:"_i0",value:function(){var a=this;this._a14=function(){a.hiddenInput.value=a.getNumber()},this.a.form&&this.a.form.addEventListener("submit",this._a14)}},{key:"_i1",value:function(){for(var a=this.a;a&&"LABEL"!==a.tagName;)a=a.parentNode;return a}},{key:"_i2",value:function(){var a=this;this._a9=function(b){a.m.classList.contains("iti__hide")?a.a.focus():b.preventDefault()};var b=this._i1();b&&b.addEventListener("click",this._a9),this._a10=function(){!a.m.classList.contains("iti__hide")||a.a.disabled||a.a.readOnly||a._n()},this.selectedFlag.addEventListener("click",this._a10),this._a11=function(b){a.m.classList.contains("iti__hide")&&-1!==["ArrowUp","Up","ArrowDown","Down"," ","Enter"].indexOf(b.key)&&(b.preventDefault(),b.stopPropagation(),a._n()),"Tab"===b.key&&a._2()},this.k.addEventListener("keydown",this._a11)}},{key:"_i3",value:function(){var a=this;this.d.utilsScript&&!window.intlTelInputUtils?window.intlTelInputGlobals.documentReady()?window.intlTelInputGlobals.loadUtils(this.d.utilsScript):window.addEventListener("load",function(){window.intlTelInputGlobals.loadUtils(a.d.utilsScript)}):this.i0(),"auto"===this.d.initialCountry?this._i4():this.h()}},{key:"_i4",value:function(){window.intlTelInputGlobals.autoCountry?this.handleAutoCountry():window.intlTelInputGlobals.startedLoadingAutoCountry||(window.intlTelInputGlobals.startedLoadingAutoCountry=!0,"function"==typeof this.d.geoIpLookup&&this.d.geoIpLookup(function(a){window.intlTelInputGlobals.autoCountry=a.toLowerCase(),setTimeout(function(){return q("handleAutoCountry")})},function(){return q("rejectAutoCountryPromise")}))}},{key:"_j",value:function(){var a=this;this._a12=function(){a._v(a.a.value)&&a._m2CountryChange()},this.a.addEventListener("keyup",this._a12),this._a13=function(){setTimeout(a._a12)},this.a.addEventListener("cut",this._a13),this.a.addEventListener("paste",this._a13)}},{key:"_j2",value:function(a){var b=this.a.getAttribute("maxlength");return b&&a.length>b?a.substr(0,b):a}},{key:"_l",value:function(){var a=this;this._a8=function(){a._l2()},this.a.form&&this.a.form.addEventListener("submit",this._a8),this.a.addEventListener("blur",this._a8)}},{key:"_l2",value:function(){if("+"===this.a.value.charAt(0)){var a=this._m(this.a.value);a&&this.s.dialCode!==a||(this.a.value="")}}},{key:"_m",value:function(a){return a.replace(/\D/g,"")}},{key:"_m2",value:function(a){var b=document.createEvent("Event");b.initEvent(a,!0,!0),this.a.dispatchEvent(b)}},{key:"_n",value:function(){this.m.classList.remove("iti__hide"),this.selectedFlag.setAttribute("aria-expanded","true"),this._o(),this.b&&(this._x(this.b,!1),this._3(this.b,!0)),this._p(),this.u.classList.add("iti__arrow--up"),this._m2("open:countrydropdown")}},{key:"_n2",value:function(a,b,c){c&&!a.classList.contains(b)?a.classList.add(b):!c&&a.classList.contains(b)&&a.classList.remove(b)}},{key:"_o",value:function(){var a=this;if(this.d.dropdownContainer&&this.d.dropdownContainer.appendChild(this.dropdown),!this.g){var b=this.a.getBoundingClientRect(),c=window.pageYOffset||document.documentElement.scrollTop,d=b.top+c,e=this.m.offsetHeight,f=d+this.a.offsetHeight+ec;if(this._n2(this.m,"iti__country-list--dropup",!f&&g),this.d.dropdownContainer){var h=!f&&g?0:this.a.offsetHeight;this.dropdown.style.top="".concat(d+h,"px"),this.dropdown.style.left="".concat(b.left+document.body.scrollLeft,"px"),this._a4=function(){return a._2()},window.addEventListener("scroll",this._a4)}}}},{key:"_o2",value:function(a){for(var b=a;b&&b!==this.m&&!b.classList.contains("iti__country");)b=b.parentNode;return b===this.m?null:b}},{key:"_p",value:function(){var a=this;this._a0=function(b){var c=a._o2(b.target);c&&a._x(c,!1)},this.m.addEventListener("mouseover",this._a0),this._a1=function(b){var c=a._o2(b.target);c&&a._1(c)},this.m.addEventListener("click",this._a1);var b=!0;this._a2=function(){b||a._2(),b=!1},document.documentElement.addEventListener("click",this._a2);var c="",d=null;this._a3=function(b){b.preventDefault(),"ArrowUp"===b.key||"Up"===b.key||"ArrowDown"===b.key||"Down"===b.key?a._q(b.key):"Enter"===b.key?a._r():"Escape"===b.key?a._2():/^[a-zA-ZÀ-ÿа-яА-Я ]$/.test(b.key)&&(d&&clearTimeout(d),c+=b.key.toLowerCase(),a._s(c),d=setTimeout(function(){c=""},1e3))},document.addEventListener("keydown",this._a3)}},{key:"_q",value:function(a){var b="ArrowUp"===a||"Up"===a?this.c.previousElementSibling:this.c.nextElementSibling;b&&(b.classList.contains("iti__divider")&&(b="ArrowUp"===a||"Up"===a?b.previousElementSibling:b.nextElementSibling),this._x(b,!0))}},{key:"_r",value:function(){this.c&&this._1(this.c)}},{key:"_s",value:function(a){for(var b=0;bg){b&&(k+=l);var m=e-h;c.scrollTop=k-m}}},{key:"_4",value:function(a){var b,c=this.a.value,d="+".concat(a);if("+"===c.charAt(0)){var e=this._5(c);b=e?c.replace(e,d):d,this.a.value=b}else this.d.autoInsertDialCode&&(b=c?d+c:d,this.a.value=b)}},{key:"_5",value:function(a,b){var c="";if("+"===a.charAt(0))for(var d="",e=0;ea.length?!1:M(Ga,a)}function Ja(a){return M(Ba,a)?N(a,wa):N(a,va)}function Ka(a){var b=Ja(a.toString());a.i="";a.g(b)}function La(a){return null!=a&&(1!=w(a,9)||-1!=t(a,9)[0])}function N(a,b){for(var c=new C,d,f=a.length,e=0;eb?2:e[e.length-1]=b.i.length)throw Error("Phone number too short after IDD"); +a:{a=b.toString();if(0!=a.length&&"0"!=a.charAt(0))for(f=a.length,b=1;3>=b&&b<=f;++b)if(c=parseInt(a.substring(0,b),10),c in I){d.g(a.substring(b));d=c;break a}d=0}if(0!=d)return q(e,1,d),d;throw Error("Invalid country calling code");}if(null!=c&&(g=v(c,10),h=""+g,l=b.toString(),0==l.lastIndexOf(h,0)&&(h=new C(l.substring(h.length)),l=p(c,1),l=new RegExp(v(l,2)),Qa(h,c,null),h=h.toString(),!M(l,b.toString())&&M(l,h)||3==W(a,b.toString(),c,-1))))return d.g(h),f&&q(e,6,10),q(e,1,g),g;q(e,1,0);return 0} +function Qa(a,b,c){var d=a.toString(),f=d.length,e=p(b,15);if(0!=f&&null!=e&&0!=e.length){var g=new RegExp("^(?:"+e+")");if(f=g.exec(d)){e=new RegExp(v(p(b,1),2));var h=M(e,d),l=f.length-1;b=p(b,16);if(null==b||0==b.length||null==f[l]||0==f[l].length){if(!h||M(e,d.substring(f[0].length)))null!=c&&0=b.length)e="";else{var g=b.indexOf(";",e);e=-1!==g?b.substring(e,g):b.substring(e)}var h=e;null==h?g=!0:0===h.length?g=!1:(g=Ca.exec(h),h=Da.exec(h),g=null!==g||null!==h);if(!g)throw Error("The string supplied did not seem to be a phone number"); +null!=e?("+"===e.charAt(0)&&f.g(e),e=b.indexOf("tel:"),f.g(b.substring(0<=e?e+4:0,b.indexOf(";phone-context=")))):(e=f.g,g=b??"",h=g.search(ya),0<=h?(g=g.substring(h),g=g.replace(Aa,""),h=g.search(za),0<=h&&(g=g.substring(0,h))):g="",e.call(f,g));e=f.toString();g=e.indexOf(";isub=");0b.i.length)throw Error("The string supplied is too short to be a phone number");null!=g&&(c=new C,f=new C(b.toString()),Qa(f,g,c),a=W(a,f.toString(),g,-1),2!=a&&4!=a&&5!=a&&(b=f,d&&0a)throw Error("The string supplied is too short to be a phone number");if(17{try{const f=J.g(),e=Z(f,a,b);var d=X(f,e);return 0==d||4==d?Ma(f,e,"undefined"===typeof c?0:c):a}catch(f){return a}});k("intlTelInputUtils.getExampleNumber",(a,b,c)=>{try{const h=J.g();a:{var d=h;if(O(a)){var f=T(S(d,a),c);try{if(null!=f.g[6]){var e=p(f,6);var g=Ra(d,e,a,!1);break a}}catch(l){}}g=null}return Ma(h,g,b?2:1)}catch(h){return""}});k("intlTelInputUtils.getExtension",(a,b)=>{try{return p(Z(J.g(),a,b),3)}catch(c){return""}}); +k("intlTelInputUtils.getNumberType",(a,b)=>{try{const h=J.g();var c=Z(h,a,b);a=h;var d=Oa(a,c),f=Q(a,v(c,1),d);if(null==f)var e=-1;else{var g=P(c);e=U(g,f)}return e}catch(h){return-99}}); +k("intlTelInputUtils.getValidationError",(a,b)=>{try{const c=J.g(),d=Z(c,a,b);return X(c,d)}catch(c){return"Invalid country calling code"===c.message?1:"Phone number too short after IDD"===c.message||"The string supplied is too short to be a phone number"===c.message?2:"The string supplied is too long to be a phone number"===c.message?3:-99}}); +k("intlTelInputUtils.isValidNumber",(a,b)=>{try{const Y=J.g();var c=Z(Y,a,b);a=Y;var d=Oa(a,c);var f=v(c,1),e=Q(a,f,d),g;if(!(g=null==e)){var h;if(h="001"!=d){var l=S(a,d);if(null==l)throw Error("Invalid region code: "+d);var A=v(l,10);h=f!=A}g=h}if(g)var G=!1;else{var Sa=P(c);G=-1!=U(Sa,e)}return G}catch(Y){return!1}});k("intlTelInputUtils.isPossibleNumber",(a,b)=>{try{const c=J.g(),d=Z(c,a,b);return 0===X(c,d)}catch(c){return!1}}); +k("intlTelInputUtils.numberFormat",{E164:0,INTERNATIONAL:1,NATIONAL:2,RFC3966:3});k("intlTelInputUtils.numberType",{FIXED_LINE:0,MOBILE:1,FIXED_LINE_OR_MOBILE:2,TOLL_FREE:3,PREMIUM_RATE:4,SHARED_COST:5,VOIP:6,PERSONAL_NUMBER:7,PAGER:8,UAN:9,VOICEMAIL:10,UNKNOWN:-1});k("intlTelInputUtils.validationError",{IS_POSSIBLE:0,INVALID_COUNTRY_CODE:1,TOO_SHORT:2,TOO_LONG:3,IS_POSSIBLE_LOCAL_ONLY:4,INVALID_LENGTH:5});})(); diff --git a/site/static/libs/country-select/select2.min.css b/site/assets/scss/libs/country-select/_select2.scss similarity index 100% rename from site/static/libs/country-select/select2.min.css rename to site/assets/scss/libs/country-select/_select2.scss diff --git a/site/assets/scss/libs/intl-tel-input/_intl-tel-input.scss b/site/assets/scss/libs/intl-tel-input/_intl-tel-input.scss new file mode 100644 index 00000000..1684ca36 --- /dev/null +++ b/site/assets/scss/libs/intl-tel-input/_intl-tel-input.scss @@ -0,0 +1 @@ +.iti{position:relative;display:inline-block}.iti *{box-sizing:border-box}.iti__hide{display:none}.iti__v-hide{visibility:hidden}.iti input,.iti input[type=tel],.iti input[type=text]{position:relative;z-index:0;margin-top:0!important;margin-bottom:0!important;padding-right:36px;margin-right:0}.iti__flag-container{position:absolute;top:0;bottom:0;right:0;padding:1px}.iti__selected-flag{z-index:1;position:relative;display:flex;align-items:center;height:100%;padding:0 6px 0 8px}.iti__arrow{margin-left:6px;width:0;height:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:4px solid #555}[dir=rtl] .iti__arrow{margin-right:6px;margin-left:0}.iti__arrow--up{border-top:none;border-bottom:4px solid #555}.iti__country-list{position:absolute;z-index:2;list-style:none;padding:0;margin:0 0 0 -1px;box-shadow:1px 1px 4px rgba(0,0,0,.2);background-color:#fff;border:1px solid #ccc;white-space:nowrap;max-height:200px;overflow-y:scroll;-webkit-overflow-scrolling:touch}.iti__country-list--dropup{bottom:100%;margin-bottom:-1px}@media (max-width:500px){.iti__country-list{white-space:normal}}.iti__flag-box{display:inline-block;width:20px}.iti__divider{padding-bottom:5px;margin-bottom:5px;border-bottom:1px solid #ccc}.iti__country{display:flex;align-items:center;padding:5px 10px;outline:0}.iti__dial-code{color:#999}.iti__country.iti__highlight{background-color:rgba(0,0,0,.05)}.iti__country-name,.iti__flag-box{margin-right:6px}[dir=rtl] .iti__country-name,[dir=rtl] .iti__flag-box{margin-right:0;margin-left:6px}.iti--allow-dropdown input,.iti--allow-dropdown input[type=tel],.iti--allow-dropdown input[type=text],.iti--separate-dial-code input,.iti--separate-dial-code input[type=tel],.iti--separate-dial-code input[type=text]{padding-right:6px;padding-left:52px;margin-left:0}[dir=rtl] .iti--allow-dropdown input,[dir=rtl] .iti--allow-dropdown input[type=tel],[dir=rtl] .iti--allow-dropdown input[type=text],[dir=rtl] .iti--separate-dial-code input,[dir=rtl] .iti--separate-dial-code input[type=tel],[dir=rtl] .iti--separate-dial-code input[type=text]{padding-right:52px;padding-left:6px;margin-right:0}.iti--allow-dropdown .iti__flag-container,.iti--separate-dial-code .iti__flag-container{right:auto;left:0}[dir=rtl] .iti--allow-dropdown .iti__flag-container,[dir=rtl] .iti--separate-dial-code .iti__flag-container{right:0;left:auto}.iti--allow-dropdown .iti__flag-container:hover{cursor:pointer}.iti--allow-dropdown .iti__flag-container:hover .iti__selected-flag{background-color:rgba(0,0,0,.05)}.iti--allow-dropdown input[disabled]+.iti__flag-container:hover,.iti--allow-dropdown input[readonly]+.iti__flag-container:hover{cursor:default}.iti--allow-dropdown input[disabled]+.iti__flag-container:hover .iti__selected-flag,.iti--allow-dropdown input[readonly]+.iti__flag-container:hover .iti__selected-flag{background-color:transparent}.iti--separate-dial-code .iti__selected-flag{background-color:rgba(0,0,0,.05)}.iti--separate-dial-code.iti--show-flags .iti__selected-dial-code{margin-left:6px}[dir=rtl] .iti--separate-dial-code.iti--show-flags .iti__selected-dial-code{margin-left:0;margin-right:6px}.iti--container{position:absolute;top:-1000px;left:-1000px;z-index:1060;padding:1px}.iti--container:hover{cursor:pointer}.iti-mobile .iti--container{top:30px;bottom:30px;left:30px;right:30px;position:fixed}.iti-mobile .iti__country-list{max-height:100%;width:100%}.iti-mobile .iti__country{padding:10px 10px;line-height:1.5em}.iti__flag{width:20px}.iti__flag.iti__be{width:18px}.iti__flag.iti__ch{width:15px}.iti__flag.iti__mc{width:19px}.iti__flag.iti__ne{width:18px}.iti__flag.iti__np{width:13px}.iti__flag.iti__va{width:15px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.iti__flag{background-size:5762px 15px}}.iti__flag.iti__ac{height:10px;background-position:0 0}.iti__flag.iti__ad{height:14px;background-position:-22px 0}.iti__flag.iti__ae{height:10px;background-position:-44px 0}.iti__flag.iti__af{height:14px;background-position:-66px 0}.iti__flag.iti__ag{height:14px;background-position:-88px 0}.iti__flag.iti__ai{height:10px;background-position:-110px 0}.iti__flag.iti__al{height:15px;background-position:-132px 0}.iti__flag.iti__am{height:10px;background-position:-154px 0}.iti__flag.iti__ao{height:14px;background-position:-176px 0}.iti__flag.iti__aq{height:14px;background-position:-198px 0}.iti__flag.iti__ar{height:13px;background-position:-220px 0}.iti__flag.iti__as{height:10px;background-position:-242px 0}.iti__flag.iti__at{height:14px;background-position:-264px 0}.iti__flag.iti__au{height:10px;background-position:-286px 0}.iti__flag.iti__aw{height:14px;background-position:-308px 0}.iti__flag.iti__ax{height:13px;background-position:-330px 0}.iti__flag.iti__az{height:10px;background-position:-352px 0}.iti__flag.iti__ba{height:10px;background-position:-374px 0}.iti__flag.iti__bb{height:14px;background-position:-396px 0}.iti__flag.iti__bd{height:12px;background-position:-418px 0}.iti__flag.iti__be{height:15px;background-position:-440px 0}.iti__flag.iti__bf{height:14px;background-position:-460px 0}.iti__flag.iti__bg{height:12px;background-position:-482px 0}.iti__flag.iti__bh{height:12px;background-position:-504px 0}.iti__flag.iti__bi{height:12px;background-position:-526px 0}.iti__flag.iti__bj{height:14px;background-position:-548px 0}.iti__flag.iti__bl{height:14px;background-position:-570px 0}.iti__flag.iti__bm{height:10px;background-position:-592px 0}.iti__flag.iti__bn{height:10px;background-position:-614px 0}.iti__flag.iti__bo{height:14px;background-position:-636px 0}.iti__flag.iti__bq{height:14px;background-position:-658px 0}.iti__flag.iti__br{height:14px;background-position:-680px 0}.iti__flag.iti__bs{height:10px;background-position:-702px 0}.iti__flag.iti__bt{height:14px;background-position:-724px 0}.iti__flag.iti__bv{height:15px;background-position:-746px 0}.iti__flag.iti__bw{height:14px;background-position:-768px 0}.iti__flag.iti__by{height:10px;background-position:-790px 0}.iti__flag.iti__bz{height:12px;background-position:-812px 0}.iti__flag.iti__ca{height:10px;background-position:-834px 0}.iti__flag.iti__cc{height:10px;background-position:-856px 0}.iti__flag.iti__cd{height:15px;background-position:-878px 0}.iti__flag.iti__cf{height:14px;background-position:-900px 0}.iti__flag.iti__cg{height:14px;background-position:-922px 0}.iti__flag.iti__ch{height:15px;background-position:-944px 0}.iti__flag.iti__ci{height:14px;background-position:-961px 0}.iti__flag.iti__ck{height:10px;background-position:-983px 0}.iti__flag.iti__cl{height:14px;background-position:-1005px 0}.iti__flag.iti__cm{height:14px;background-position:-1027px 0}.iti__flag.iti__cn{height:14px;background-position:-1049px 0}.iti__flag.iti__co{height:14px;background-position:-1071px 0}.iti__flag.iti__cp{height:14px;background-position:-1093px 0}.iti__flag.iti__cq{height:12px;background-position:-1115px 0}.iti__flag.iti__cr{height:12px;background-position:-1137px 0}.iti__flag.iti__cu{height:10px;background-position:-1159px 0}.iti__flag.iti__cv{height:12px;background-position:-1181px 0}.iti__flag.iti__cw{height:14px;background-position:-1203px 0}.iti__flag.iti__cx{height:10px;background-position:-1225px 0}.iti__flag.iti__cy{height:14px;background-position:-1247px 0}.iti__flag.iti__cz{height:14px;background-position:-1269px 0}.iti__flag.iti__de{height:12px;background-position:-1291px 0}.iti__flag.iti__dg{height:10px;background-position:-1313px 0}.iti__flag.iti__dj{height:14px;background-position:-1335px 0}.iti__flag.iti__dk{height:15px;background-position:-1357px 0}.iti__flag.iti__dm{height:10px;background-position:-1379px 0}.iti__flag.iti__do{height:14px;background-position:-1401px 0}.iti__flag.iti__dz{height:14px;background-position:-1423px 0}.iti__flag.iti__ea{height:14px;background-position:-1445px 0}.iti__flag.iti__ec{height:14px;background-position:-1467px 0}.iti__flag.iti__ee{height:13px;background-position:-1489px 0}.iti__flag.iti__eg{height:14px;background-position:-1511px 0}.iti__flag.iti__eh{height:10px;background-position:-1533px 0}.iti__flag.iti__er{height:10px;background-position:-1555px 0}.iti__flag.iti__es{height:14px;background-position:-1577px 0}.iti__flag.iti__et{height:10px;background-position:-1599px 0}.iti__flag.iti__eu{height:14px;background-position:-1621px 0}.iti__flag.iti__ez{height:14px;background-position:-1643px 0}.iti__flag.iti__fi{height:12px;background-position:-1665px 0}.iti__flag.iti__fj{height:10px;background-position:-1687px 0}.iti__flag.iti__fk{height:10px;background-position:-1709px 0}.iti__flag.iti__fm{height:11px;background-position:-1731px 0}.iti__flag.iti__fo{height:15px;background-position:-1753px 0}.iti__flag.iti__fr{height:14px;background-position:-1775px 0}.iti__flag.iti__fx{height:14px;background-position:-1797px 0}.iti__flag.iti__ga{height:15px;background-position:-1819px 0}.iti__flag.iti__gb{height:10px;background-position:-1841px 0}.iti__flag.iti__gd{height:12px;background-position:-1863px 0}.iti__flag.iti__ge{height:14px;background-position:-1885px 0}.iti__flag.iti__gf{height:14px;background-position:-1907px 0}.iti__flag.iti__gg{height:14px;background-position:-1929px 0}.iti__flag.iti__gh{height:14px;background-position:-1951px 0}.iti__flag.iti__gi{height:10px;background-position:-1973px 0}.iti__flag.iti__gl{height:14px;background-position:-1995px 0}.iti__flag.iti__gm{height:14px;background-position:-2017px 0}.iti__flag.iti__gn{height:14px;background-position:-2039px 0}.iti__flag.iti__gp{height:14px;background-position:-2061px 0}.iti__flag.iti__gq{height:14px;background-position:-2083px 0}.iti__flag.iti__gr{height:14px;background-position:-2105px 0}.iti__flag.iti__gs{height:10px;background-position:-2127px 0}.iti__flag.iti__gt{height:13px;background-position:-2149px 0}.iti__flag.iti__gu{height:11px;background-position:-2171px 0}.iti__flag.iti__gw{height:10px;background-position:-2193px 0}.iti__flag.iti__gy{height:12px;background-position:-2215px 0}.iti__flag.iti__hk{height:14px;background-position:-2237px 0}.iti__flag.iti__hm{height:10px;background-position:-2259px 0}.iti__flag.iti__hn{height:10px;background-position:-2281px 0}.iti__flag.iti__hr{height:10px;background-position:-2303px 0}.iti__flag.iti__ht{height:12px;background-position:-2325px 0}.iti__flag.iti__hu{height:10px;background-position:-2347px 0}.iti__flag.iti__ic{height:14px;background-position:-2369px 0}.iti__flag.iti__id{height:14px;background-position:-2391px 0}.iti__flag.iti__ie{height:10px;background-position:-2413px 0}.iti__flag.iti__il{height:15px;background-position:-2435px 0}.iti__flag.iti__im{height:10px;background-position:-2457px 0}.iti__flag.iti__in{height:14px;background-position:-2479px 0}.iti__flag.iti__io{height:10px;background-position:-2501px 0}.iti__flag.iti__iq{height:14px;background-position:-2523px 0}.iti__flag.iti__ir{height:12px;background-position:-2545px 0}.iti__flag.iti__is{height:15px;background-position:-2567px 0}.iti__flag.iti__it{height:14px;background-position:-2589px 0}.iti__flag.iti__je{height:12px;background-position:-2611px 0}.iti__flag.iti__jm{height:10px;background-position:-2633px 0}.iti__flag.iti__jo{height:10px;background-position:-2655px 0}.iti__flag.iti__jp{height:14px;background-position:-2677px 0}.iti__flag.iti__ke{height:14px;background-position:-2699px 0}.iti__flag.iti__kg{height:12px;background-position:-2721px 0}.iti__flag.iti__kh{height:13px;background-position:-2743px 0}.iti__flag.iti__ki{height:10px;background-position:-2765px 0}.iti__flag.iti__km{height:12px;background-position:-2787px 0}.iti__flag.iti__kn{height:14px;background-position:-2809px 0}.iti__flag.iti__kp{height:10px;background-position:-2831px 0}.iti__flag.iti__kr{height:14px;background-position:-2853px 0}.iti__flag.iti__kw{height:10px;background-position:-2875px 0}.iti__flag.iti__ky{height:10px;background-position:-2897px 0}.iti__flag.iti__kz{height:10px;background-position:-2919px 0}.iti__flag.iti__la{height:14px;background-position:-2941px 0}.iti__flag.iti__lb{height:14px;background-position:-2963px 0}.iti__flag.iti__lc{height:10px;background-position:-2985px 0}.iti__flag.iti__li{height:12px;background-position:-3007px 0}.iti__flag.iti__lk{height:10px;background-position:-3029px 0}.iti__flag.iti__lr{height:11px;background-position:-3051px 0}.iti__flag.iti__ls{height:14px;background-position:-3073px 0}.iti__flag.iti__lt{height:12px;background-position:-3095px 0}.iti__flag.iti__lu{height:12px;background-position:-3117px 0}.iti__flag.iti__lv{height:10px;background-position:-3139px 0}.iti__flag.iti__ly{height:10px;background-position:-3161px 0}.iti__flag.iti__ma{height:14px;background-position:-3183px 0}.iti__flag.iti__mc{height:15px;background-position:-3205px 0}.iti__flag.iti__md{height:10px;background-position:-3226px 0}.iti__flag.iti__me{height:10px;background-position:-3248px 0}.iti__flag.iti__mf{height:14px;background-position:-3270px 0}.iti__flag.iti__mg{height:14px;background-position:-3292px 0}.iti__flag.iti__mh{height:11px;background-position:-3314px 0}.iti__flag.iti__mk{height:10px;background-position:-3336px 0}.iti__flag.iti__ml{height:14px;background-position:-3358px 0}.iti__flag.iti__mm{height:14px;background-position:-3380px 0}.iti__flag.iti__mn{height:10px;background-position:-3402px 0}.iti__flag.iti__mo{height:14px;background-position:-3424px 0}.iti__flag.iti__mp{height:10px;background-position:-3446px 0}.iti__flag.iti__mq{height:14px;background-position:-3468px 0}.iti__flag.iti__mr{height:14px;background-position:-3490px 0}.iti__flag.iti__ms{height:10px;background-position:-3512px 0}.iti__flag.iti__mt{height:14px;background-position:-3534px 0}.iti__flag.iti__mu{height:14px;background-position:-3556px 0}.iti__flag.iti__mv{height:14px;background-position:-3578px 0}.iti__flag.iti__mw{height:14px;background-position:-3600px 0}.iti__flag.iti__mx{height:12px;background-position:-3622px 0}.iti__flag.iti__my{height:10px;background-position:-3644px 0}.iti__flag.iti__mz{height:14px;background-position:-3666px 0}.iti__flag.iti__na{height:14px;background-position:-3688px 0}.iti__flag.iti__nc{height:10px;background-position:-3710px 0}.iti__flag.iti__ne{height:15px;background-position:-3732px 0}.iti__flag.iti__nf{height:10px;background-position:-3752px 0}.iti__flag.iti__ng{height:10px;background-position:-3774px 0}.iti__flag.iti__ni{height:12px;background-position:-3796px 0}.iti__flag.iti__nl{height:14px;background-position:-3818px 0}.iti__flag.iti__no{height:15px;background-position:-3840px 0}.iti__flag.iti__np{height:15px;background-position:-3862px 0}.iti__flag.iti__nr{height:10px;background-position:-3877px 0}.iti__flag.iti__nu{height:10px;background-position:-3899px 0}.iti__flag.iti__nz{height:10px;background-position:-3921px 0}.iti__flag.iti__om{height:10px;background-position:-3943px 0}.iti__flag.iti__pa{height:14px;background-position:-3965px 0}.iti__flag.iti__pe{height:14px;background-position:-3987px 0}.iti__flag.iti__pf{height:14px;background-position:-4009px 0}.iti__flag.iti__pg{height:15px;background-position:-4031px 0}.iti__flag.iti__ph{height:10px;background-position:-4053px 0}.iti__flag.iti__pk{height:14px;background-position:-4075px 0}.iti__flag.iti__pl{height:13px;background-position:-4097px 0}.iti__flag.iti__pm{height:14px;background-position:-4119px 0}.iti__flag.iti__pn{height:10px;background-position:-4141px 0}.iti__flag.iti__pr{height:14px;background-position:-4163px 0}.iti__flag.iti__ps{height:10px;background-position:-4185px 0}.iti__flag.iti__pt{height:14px;background-position:-4207px 0}.iti__flag.iti__pw{height:13px;background-position:-4229px 0}.iti__flag.iti__py{height:11px;background-position:-4251px 0}.iti__flag.iti__qa{height:8px;background-position:-4273px 0}.iti__flag.iti__re{height:14px;background-position:-4295px 0}.iti__flag.iti__ro{height:14px;background-position:-4317px 0}.iti__flag.iti__rs{height:14px;background-position:-4339px 0}.iti__flag.iti__ru{height:14px;background-position:-4361px 0}.iti__flag.iti__rw{height:14px;background-position:-4383px 0}.iti__flag.iti__sa{height:14px;background-position:-4405px 0}.iti__flag.iti__sb{height:10px;background-position:-4427px 0}.iti__flag.iti__sc{height:10px;background-position:-4449px 0}.iti__flag.iti__sd{height:10px;background-position:-4471px 0}.iti__flag.iti__se{height:13px;background-position:-4493px 0}.iti__flag.iti__sg{height:14px;background-position:-4515px 0}.iti__flag.iti__sh{height:10px;background-position:-4537px 0}.iti__flag.iti__si{height:10px;background-position:-4559px 0}.iti__flag.iti__sj{height:15px;background-position:-4581px 0}.iti__flag.iti__sk{height:14px;background-position:-4603px 0}.iti__flag.iti__sl{height:14px;background-position:-4625px 0}.iti__flag.iti__sm{height:15px;background-position:-4647px 0}.iti__flag.iti__sn{height:14px;background-position:-4669px 0}.iti__flag.iti__so{height:14px;background-position:-4691px 0}.iti__flag.iti__sr{height:14px;background-position:-4713px 0}.iti__flag.iti__ss{height:10px;background-position:-4735px 0}.iti__flag.iti__st{height:10px;background-position:-4757px 0}.iti__flag.iti__su{height:10px;background-position:-4779px 0}.iti__flag.iti__sv{height:12px;background-position:-4801px 0}.iti__flag.iti__sx{height:14px;background-position:-4823px 0}.iti__flag.iti__sy{height:14px;background-position:-4845px 0}.iti__flag.iti__sz{height:14px;background-position:-4867px 0}.iti__flag.iti__ta{height:10px;background-position:-4889px 0}.iti__flag.iti__tc{height:10px;background-position:-4911px 0}.iti__flag.iti__td{height:14px;background-position:-4933px 0}.iti__flag.iti__tf{height:14px;background-position:-4955px 0}.iti__flag.iti__tg{height:13px;background-position:-4977px 0}.iti__flag.iti__th{height:14px;background-position:-4999px 0}.iti__flag.iti__tj{height:10px;background-position:-5021px 0}.iti__flag.iti__tk{height:10px;background-position:-5043px 0}.iti__flag.iti__tl{height:10px;background-position:-5065px 0}.iti__flag.iti__tm{height:14px;background-position:-5087px 0}.iti__flag.iti__tn{height:14px;background-position:-5109px 0}.iti__flag.iti__to{height:10px;background-position:-5131px 0}.iti__flag.iti__tr{height:14px;background-position:-5153px 0}.iti__flag.iti__tt{height:12px;background-position:-5175px 0}.iti__flag.iti__tv{height:10px;background-position:-5197px 0}.iti__flag.iti__tw{height:14px;background-position:-5219px 0}.iti__flag.iti__tz{height:14px;background-position:-5241px 0}.iti__flag.iti__ua{height:14px;background-position:-5263px 0}.iti__flag.iti__ug{height:14px;background-position:-5285px 0}.iti__flag.iti__uk{height:10px;background-position:-5307px 0}.iti__flag.iti__um{height:11px;background-position:-5329px 0}.iti__flag.iti__un{height:14px;background-position:-5351px 0}.iti__flag.iti__us{height:11px;background-position:-5373px 0}.iti__flag.iti__uy{height:14px;background-position:-5395px 0}.iti__flag.iti__uz{height:10px;background-position:-5417px 0}.iti__flag.iti__va{height:15px;background-position:-5439px 0}.iti__flag.iti__vc{height:14px;background-position:-5456px 0}.iti__flag.iti__ve{height:14px;background-position:-5478px 0}.iti__flag.iti__vg{height:10px;background-position:-5500px 0}.iti__flag.iti__vi{height:14px;background-position:-5522px 0}.iti__flag.iti__vn{height:14px;background-position:-5544px 0}.iti__flag.iti__vu{height:12px;background-position:-5566px 0}.iti__flag.iti__wf{height:14px;background-position:-5588px 0}.iti__flag.iti__ws{height:10px;background-position:-5610px 0}.iti__flag.iti__xk{height:15px;background-position:-5632px 0}.iti__flag.iti__ye{height:14px;background-position:-5654px 0}.iti__flag.iti__yt{height:14px;background-position:-5676px 0}.iti__flag.iti__za{height:14px;background-position:-5698px 0}.iti__flag.iti__zm{height:14px;background-position:-5720px 0}.iti__flag.iti__zw{height:10px;background-position:-5742px 0}.iti__flag{height:15px;box-shadow:0 0 1px 0 #888;background-image:url("../../images/flags/flags.png?1");background-repeat:no-repeat;background-color:#dbdbdb;background-position:20px 0}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.iti__flag{background-image:url("../../images/flags/flags@2x.png?1")}}.iti__flag.iti__np{background-color:transparent} \ No newline at end of file diff --git a/site/assets/scss/modules/_forms.scss b/site/assets/scss/modules/_forms.scss index cee9cbc2..8638ab9d 100644 --- a/site/assets/scss/modules/_forms.scss +++ b/site/assets/scss/modules/_forms.scss @@ -169,118 +169,6 @@ $form-success-color: #2e7d32; padding-right: 40px; } -.phone-field { - position: relative; - display: flex; - align-items: center; - min-height: 47px; - padding-left: 66px; - border: 1px solid rgba(black, .12); - border-radius: $border-radius-m; - background: white; - box-shadow: inset 0 1px 1px rgba(black, .02); - transition: border-color .2s ease-in-out, box-shadow .2s ease-in-out; - - &:focus-within { - border-color: rgba($main-brand-color, .55); - box-shadow: 0 0 0 3px rgba($main-brand-color, .12); - } - - @include breakpoint(sm-phone) { - min-height: 44px; - padding-left: 64px; - } -} - -.phone-field[data-phone-country-selected='false'] { - cursor: pointer; - - .phone-number { - cursor: pointer; - } - - .phone-flag, - .phone-chevron { - display: none; - } - - .phone-country-select { - width: 100%; - } -} - -.phone-field .phone-number { - flex: 1 1 auto; - min-width: 0; - padding: 13px 15px 13px 10px; - border: 0; - border-radius: 0; - box-shadow: none; - color: $black; - font-size: 16px; - font-weight: 400; - letter-spacing: 0; - background: transparent; - - &:focus { - border-color: transparent; - box-shadow: none; - } -} - -.field-error .phone-field { - border-color: rgba($form-error-color, .7); - box-shadow: 0 0 0 3px rgba($form-error-color, .12); -} - -.field-error .phone-field .phone-number { - border-color: transparent; - box-shadow: none; -} - -.phone-country-select { - position: absolute; - top: 0; - bottom: 0; - left: 0; - z-index: 3; - width: 66px; - height: 100%; - opacity: 0; - cursor: pointer; -} - -.phone-flag { - position: absolute; - top: 50%; - left: 16px; - z-index: 1; - font-size: 19px; - line-height: 1; - transform: translateY(-50%); -} - -.phone-chevron { - position: absolute; - top: 50%; - left: 42px; - z-index: 1; - width: 9px; - height: 9px; - border-right: 2px solid $gray-500; - border-bottom: 2px solid $gray-500; - transform: translateY(-58%) rotate(45deg); - pointer-events: none; -} - -.phone-dial-code { - flex: 0 0 auto; - color: $black; - font-size: 16px; - font-weight: 400; - line-height: 1; -} - .error-message { display: none; margin-top: 6px; @@ -332,13 +220,4 @@ $form-success-color: #2e7d32; padding: 12px 14px; font-size: 15px; } - - .phone-flag { - left: 15px; - font-size: 18px; - } - - .phone-chevron { - left: 40px; - } } diff --git a/site/assets/scss/modules/_result-panel.scss b/site/assets/scss/modules/_result-panel.scss index 72a7905e..75e5f5f0 100644 --- a/site/assets/scss/modules/_result-panel.scss +++ b/site/assets/scss/modules/_result-panel.scss @@ -157,6 +157,10 @@ align-items: center; justify-content: center; gap: 16px; + margin-top: 20px; +} + +.checkout .result-panel-actions { margin-top: 50px; } @@ -221,7 +225,7 @@ font-size: 16px; } - .result-panel-actions { + .checkout .result-panel-actions { flex-direction: column; margin-top: 30px; } diff --git a/site/assets/scss/pages/_checkout.scss b/site/assets/scss/pages/_checkout.scss index f5e7daa6..d1913f98 100644 --- a/site/assets/scss/pages/_checkout.scss +++ b/site/assets/scss/pages/_checkout.scss @@ -1,21 +1,31 @@ -/*! +/* * Copyright 2026, TeamDev. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -@import 'libs/country-select/select2.min.css'; -@import 'libs/intl-tel-input/intlTelInput.min.css'; +@import 'libs/country-select/select2'; +@import 'libs/intl-tel-input/intl-tel-input'; $checkout-bg-color: #f3f3f3; $checkout-panel-width: 790px; @@ -268,6 +278,8 @@ $checkout-panel-width: 790px; } .checkout { + // Select2 normally positions the required native select off-screen, which + // prevents reportValidity() from focusing it. Keep it in the layout at zero height. .select2-hidden-accessible[required] { position: static !important; display: block; @@ -332,10 +344,6 @@ $checkout-panel-width: 790px; box-shadow: 0 8px 24px rgba($black, .16); } } - - .phone-error-message.show { - display: block; - } } .select2-dropdown { diff --git a/site/layouts/_partials/getting-help/services.html b/site/layouts/_partials/getting-help/services.html index d5930b27..ad838321 100644 --- a/site/layouts/_partials/getting-help/services.html +++ b/site/layouts/_partials/getting-help/services.html @@ -41,8 +41,12 @@

              {{ $data.title | markdownify }}

              {{ $comparableServices := $data.comparable_services }} {{ range $comparableServices.header_cols }} + {{ $productId := .paygate_product_id }} + {{ if eq $productId "spine-standard-support" }} + {{ $productId = site.Params.payment.standardsupportproductid | default $productId }} + {{ end }}
              + {{ with $productId }}data-paygate-product-id="{{ . }}"{{ end }}>

              {{ .title | markdownify }}

              diff --git a/site/layouts/checkout/single.html b/site/layouts/checkout/single.html index c1af22f4..8e45c9cc 100644 --- a/site/layouts/checkout/single.html +++ b/site/layouts/checkout/single.html @@ -94,13 +94,13 @@

              Billing details

              autocomplete="tel" inputmode="tel" placeholder=" "> + -

              - Enter a valid phone number. -

              +

              - - + {{ $select2 := resources.Get "libs/country-select/select2.js" }} + {{ partial "scripts/script.html" (dict "js" $select2 "attributes" "defer") }} + {{ $phoneUtils := resources.Get "libs/intl-tel-input/utils.js" }} + {{ partial "scripts/script.html" (dict "js" $phoneUtils "attributes" "defer") }} + {{ $internationalPhoneInput := resources.Get "libs/intl-tel-input/intlTelInput.js" }} + {{ partial "scripts/script.html" (dict "js" $internationalPhoneInput "attributes" "defer") }} {{ end }} diff --git a/site/package-lock.json b/site/package-lock.json index dc7fa4f9..4a7bf340 100644 --- a/site/package-lock.json +++ b/site/package-lock.json @@ -8,6 +8,10 @@ "name": "spine", "version": "1.0.0", "license": "ISC", + "dependencies": { + "intl-tel-input": "18.2.1", + "select2": "4.1.0-rc.0" + }, "devDependencies": { "@fullhuman/postcss-purgecss": "^7.0.2", "autoprefixer": "^10.5.0", @@ -560,6 +564,12 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, + "node_modules/intl-tel-input": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/intl-tel-input/-/intl-tel-input-18.2.1.tgz", + "integrity": "sha512-wOm0/61kTtpYjOOW1bhHzC4G8Om+atTxHmg31FS0KD0LQ8k8BpgO925npyi4jlT/EK4+joABABZzz0/XeSgupQ==", + "license": "MIT" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1010,6 +1020,12 @@ "node": ">=0.10.0" } }, + "node_modules/select2": { + "version": "4.1.0-rc.0", + "resolved": "https://registry.npmjs.org/select2/-/select2-4.1.0-rc.0.tgz", + "integrity": "sha512-Hr9TdhyHCZUtwznEH2CBf7967mEM0idtJ5nMtjvk3Up5tPukOLXbHUNmh10oRfeNIhj+3GD3niu+g6sVK+gK0A==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/site/package.json b/site/package.json index f6a19a84..00e727e1 100644 --- a/site/package.json +++ b/site/package.json @@ -14,5 +14,9 @@ "postcss": "^8.5.14", "postcss-cli": "^11.0.1", "postcss-discard-comments": "^7.0.5" + }, + "dependencies": { + "intl-tel-input": "18.2.1", + "select2": "4.1.0-rc.0" } } diff --git a/site/static/libs/intl-tel-input/intlTelInput.min.css b/site/static/libs/intl-tel-input/intlTelInput.min.css deleted file mode 100644 index c798e6e7..00000000 --- a/site/static/libs/intl-tel-input/intlTelInput.min.css +++ /dev/null @@ -1 +0,0 @@ -.iti--allow-dropdown .iti__flag-container:hover .iti__selected-flag,.iti--separate-dial-code .iti__selected-flag,.iti__country.iti__highlight{background-color:rgba(0,0,0,.05)}.iti--allow-dropdown .iti__flag-container:hover,.iti--container:hover{cursor:pointer}.iti{position:relative;display:inline-block}.iti *{box-sizing:border-box}.iti__hide{display:none}.iti__v-hide{visibility:hidden}.iti input,.iti input[type=tel],.iti input[type=text]{position:relative;z-index:0;margin-top:0!important;margin-bottom:0!important;padding-right:36px;margin-right:0}.iti__flag-container{position:absolute;top:0;bottom:0;right:0;padding:1px}.iti__selected-flag{z-index:1;position:relative;display:flex;align-items:center;height:100%;padding:0 6px 0 8px}.iti__arrow{margin-left:6px;width:0;height:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:4px solid #555}[dir=rtl] .iti__arrow{margin-right:6px;margin-left:0}.iti__arrow--up{border-top:none;border-bottom:4px solid #555}.iti__country-list{position:absolute;z-index:2;list-style:none;padding:0;margin:0 0 0 -1px;box-shadow:1px 1px 4px rgba(0,0,0,.2);background-color:#fff;border:1px solid #ccc;white-space:nowrap;max-height:200px;overflow-y:scroll;-webkit-overflow-scrolling:touch}.iti__country-list--dropup{bottom:100%;margin-bottom:-1px}@media (max-width:500px){.iti__country-list{white-space:normal}}.iti__flag-box{display:inline-block;width:20px}.iti__divider{padding-bottom:5px;margin-bottom:5px;border-bottom:1px solid #ccc}.iti__country{display:flex;align-items:center;padding:5px 10px;outline:0}.iti__dial-code{color:#999}.iti__country-name,.iti__flag-box{margin-right:6px}[dir=rtl] .iti__country-name,[dir=rtl] .iti__flag-box{margin-right:0;margin-left:6px}.iti--allow-dropdown input,.iti--allow-dropdown input[type=tel],.iti--allow-dropdown input[type=text],.iti--separate-dial-code input,.iti--separate-dial-code input[type=tel],.iti--separate-dial-code input[type=text]{padding-right:6px;padding-left:52px;margin-left:0}[dir=rtl] .iti--allow-dropdown input,[dir=rtl] .iti--allow-dropdown input[type=tel],[dir=rtl] .iti--allow-dropdown input[type=text],[dir=rtl] .iti--separate-dial-code input,[dir=rtl] .iti--separate-dial-code input[type=tel],[dir=rtl] .iti--separate-dial-code input[type=text]{padding-right:52px;padding-left:6px;margin-right:0}.iti--allow-dropdown .iti__flag-container,.iti--separate-dial-code .iti__flag-container{right:auto;left:0}[dir=rtl] .iti--allow-dropdown .iti__flag-container,[dir=rtl] .iti--separate-dial-code .iti__flag-container{right:0;left:auto}.iti--allow-dropdown input[disabled]+.iti__flag-container:hover .iti__selected-flag,.iti--allow-dropdown input[readonly]+.iti__flag-container:hover .iti__selected-flag,.iti__flag.iti__np{background-color:transparent}.iti--allow-dropdown input[disabled]+.iti__flag-container:hover,.iti--allow-dropdown input[readonly]+.iti__flag-container:hover{cursor:default}.iti--separate-dial-code.iti--show-flags .iti__selected-dial-code{margin-left:6px}[dir=rtl] .iti--separate-dial-code.iti--show-flags .iti__selected-dial-code{margin-left:0;margin-right:6px}.iti--container{position:absolute;top:-1000px;left:-1000px;z-index:1060;padding:1px}.iti-mobile .iti--container{top:30px;bottom:30px;left:30px;right:30px;position:fixed}.iti-mobile .iti__country-list{max-height:100%;width:100%}.iti-mobile .iti__country{padding:10px;line-height:1.5em}.iti__flag{width:20px;height:15px;box-shadow:0 0 1px 0 #888;background-image:url("../../images/flags/flags.png?1");background-repeat:no-repeat;background-color:#dbdbdb;background-position:20px 0}.iti__flag.iti__be,.iti__flag.iti__ne{width:18px}.iti__flag.iti__ch{width:15px}.iti__flag.iti__mc{width:19px}.iti__flag.iti__ac{height:10px;background-position:0 0}.iti__flag.iti__ad{height:14px;background-position:-22px 0}.iti__flag.iti__ae{height:10px;background-position:-44px 0}.iti__flag.iti__af{height:14px;background-position:-66px 0}.iti__flag.iti__ag{height:14px;background-position:-88px 0}.iti__flag.iti__ai{height:10px;background-position:-110px 0}.iti__flag.iti__al{height:15px;background-position:-132px 0}.iti__flag.iti__am{height:10px;background-position:-154px 0}.iti__flag.iti__ao{height:14px;background-position:-176px 0}.iti__flag.iti__aq{height:14px;background-position:-198px 0}.iti__flag.iti__ar{height:13px;background-position:-220px 0}.iti__flag.iti__as{height:10px;background-position:-242px 0}.iti__flag.iti__at{height:14px;background-position:-264px 0}.iti__flag.iti__au{height:10px;background-position:-286px 0}.iti__flag.iti__aw{height:14px;background-position:-308px 0}.iti__flag.iti__ax{height:13px;background-position:-330px 0}.iti__flag.iti__az{height:10px;background-position:-352px 0}.iti__flag.iti__ba{height:10px;background-position:-374px 0}.iti__flag.iti__bb{height:14px;background-position:-396px 0}.iti__flag.iti__bd{height:12px;background-position:-418px 0}.iti__flag.iti__be{height:15px;background-position:-440px 0}.iti__flag.iti__bf{height:14px;background-position:-460px 0}.iti__flag.iti__bg{height:12px;background-position:-482px 0}.iti__flag.iti__bh{height:12px;background-position:-504px 0}.iti__flag.iti__bi{height:12px;background-position:-526px 0}.iti__flag.iti__bj{height:14px;background-position:-548px 0}.iti__flag.iti__bl{height:14px;background-position:-570px 0}.iti__flag.iti__bm{height:10px;background-position:-592px 0}.iti__flag.iti__bn{height:10px;background-position:-614px 0}.iti__flag.iti__bo{height:14px;background-position:-636px 0}.iti__flag.iti__bq{height:14px;background-position:-658px 0}.iti__flag.iti__br{height:14px;background-position:-680px 0}.iti__flag.iti__bs{height:10px;background-position:-702px 0}.iti__flag.iti__bt{height:14px;background-position:-724px 0}.iti__flag.iti__bv{height:15px;background-position:-746px 0}.iti__flag.iti__bw{height:14px;background-position:-768px 0}.iti__flag.iti__by{height:10px;background-position:-790px 0}.iti__flag.iti__bz{height:12px;background-position:-812px 0}.iti__flag.iti__ca{height:10px;background-position:-834px 0}.iti__flag.iti__cc{height:10px;background-position:-856px 0}.iti__flag.iti__cd{height:15px;background-position:-878px 0}.iti__flag.iti__cf{height:14px;background-position:-900px 0}.iti__flag.iti__cg{height:14px;background-position:-922px 0}.iti__flag.iti__ch{height:15px;background-position:-944px 0}.iti__flag.iti__ci{height:14px;background-position:-961px 0}.iti__flag.iti__ck{height:10px;background-position:-983px 0}.iti__flag.iti__cl{height:14px;background-position:-1005px 0}.iti__flag.iti__cm{height:14px;background-position:-1027px 0}.iti__flag.iti__cn{height:14px;background-position:-1049px 0}.iti__flag.iti__co{height:14px;background-position:-1071px 0}.iti__flag.iti__cp{height:14px;background-position:-1093px 0}.iti__flag.iti__cq{height:12px;background-position:-1115px 0}.iti__flag.iti__cr{height:12px;background-position:-1137px 0}.iti__flag.iti__cu{height:10px;background-position:-1159px 0}.iti__flag.iti__cv{height:12px;background-position:-1181px 0}.iti__flag.iti__cw{height:14px;background-position:-1203px 0}.iti__flag.iti__cx{height:10px;background-position:-1225px 0}.iti__flag.iti__cy{height:14px;background-position:-1247px 0}.iti__flag.iti__cz{height:14px;background-position:-1269px 0}.iti__flag.iti__de{height:12px;background-position:-1291px 0}.iti__flag.iti__dg{height:10px;background-position:-1313px 0}.iti__flag.iti__dj{height:14px;background-position:-1335px 0}.iti__flag.iti__dk{height:15px;background-position:-1357px 0}.iti__flag.iti__dm{height:10px;background-position:-1379px 0}.iti__flag.iti__do{height:14px;background-position:-1401px 0}.iti__flag.iti__dz{height:14px;background-position:-1423px 0}.iti__flag.iti__ea{height:14px;background-position:-1445px 0}.iti__flag.iti__ec{height:14px;background-position:-1467px 0}.iti__flag.iti__ee{height:13px;background-position:-1489px 0}.iti__flag.iti__eg{height:14px;background-position:-1511px 0}.iti__flag.iti__eh{height:10px;background-position:-1533px 0}.iti__flag.iti__er{height:10px;background-position:-1555px 0}.iti__flag.iti__es{height:14px;background-position:-1577px 0}.iti__flag.iti__et{height:10px;background-position:-1599px 0}.iti__flag.iti__eu{height:14px;background-position:-1621px 0}.iti__flag.iti__ez{height:14px;background-position:-1643px 0}.iti__flag.iti__fi{height:12px;background-position:-1665px 0}.iti__flag.iti__fj{height:10px;background-position:-1687px 0}.iti__flag.iti__fk{height:10px;background-position:-1709px 0}.iti__flag.iti__fm{height:11px;background-position:-1731px 0}.iti__flag.iti__fo{height:15px;background-position:-1753px 0}.iti__flag.iti__fr{height:14px;background-position:-1775px 0}.iti__flag.iti__fx{height:14px;background-position:-1797px 0}.iti__flag.iti__ga{height:15px;background-position:-1819px 0}.iti__flag.iti__gb{height:10px;background-position:-1841px 0}.iti__flag.iti__gd{height:12px;background-position:-1863px 0}.iti__flag.iti__ge{height:14px;background-position:-1885px 0}.iti__flag.iti__gf{height:14px;background-position:-1907px 0}.iti__flag.iti__gg{height:14px;background-position:-1929px 0}.iti__flag.iti__gh{height:14px;background-position:-1951px 0}.iti__flag.iti__gi{height:10px;background-position:-1973px 0}.iti__flag.iti__gl{height:14px;background-position:-1995px 0}.iti__flag.iti__gm{height:14px;background-position:-2017px 0}.iti__flag.iti__gn{height:14px;background-position:-2039px 0}.iti__flag.iti__gp{height:14px;background-position:-2061px 0}.iti__flag.iti__gq{height:14px;background-position:-2083px 0}.iti__flag.iti__gr{height:14px;background-position:-2105px 0}.iti__flag.iti__gs{height:10px;background-position:-2127px 0}.iti__flag.iti__gt{height:13px;background-position:-2149px 0}.iti__flag.iti__gu{height:11px;background-position:-2171px 0}.iti__flag.iti__gw{height:10px;background-position:-2193px 0}.iti__flag.iti__gy{height:12px;background-position:-2215px 0}.iti__flag.iti__hk{height:14px;background-position:-2237px 0}.iti__flag.iti__hm{height:10px;background-position:-2259px 0}.iti__flag.iti__hn{height:10px;background-position:-2281px 0}.iti__flag.iti__hr{height:10px;background-position:-2303px 0}.iti__flag.iti__ht{height:12px;background-position:-2325px 0}.iti__flag.iti__hu{height:10px;background-position:-2347px 0}.iti__flag.iti__ic{height:14px;background-position:-2369px 0}.iti__flag.iti__id{height:14px;background-position:-2391px 0}.iti__flag.iti__ie{height:10px;background-position:-2413px 0}.iti__flag.iti__il{height:15px;background-position:-2435px 0}.iti__flag.iti__im{height:10px;background-position:-2457px 0}.iti__flag.iti__in{height:14px;background-position:-2479px 0}.iti__flag.iti__io{height:10px;background-position:-2501px 0}.iti__flag.iti__iq{height:14px;background-position:-2523px 0}.iti__flag.iti__ir{height:12px;background-position:-2545px 0}.iti__flag.iti__is{height:15px;background-position:-2567px 0}.iti__flag.iti__it{height:14px;background-position:-2589px 0}.iti__flag.iti__je{height:12px;background-position:-2611px 0}.iti__flag.iti__jm{height:10px;background-position:-2633px 0}.iti__flag.iti__jo{height:10px;background-position:-2655px 0}.iti__flag.iti__jp{height:14px;background-position:-2677px 0}.iti__flag.iti__ke{height:14px;background-position:-2699px 0}.iti__flag.iti__kg{height:12px;background-position:-2721px 0}.iti__flag.iti__kh{height:13px;background-position:-2743px 0}.iti__flag.iti__ki{height:10px;background-position:-2765px 0}.iti__flag.iti__km{height:12px;background-position:-2787px 0}.iti__flag.iti__kn{height:14px;background-position:-2809px 0}.iti__flag.iti__kp{height:10px;background-position:-2831px 0}.iti__flag.iti__kr{height:14px;background-position:-2853px 0}.iti__flag.iti__kw{height:10px;background-position:-2875px 0}.iti__flag.iti__ky{height:10px;background-position:-2897px 0}.iti__flag.iti__kz{height:10px;background-position:-2919px 0}.iti__flag.iti__la{height:14px;background-position:-2941px 0}.iti__flag.iti__lb{height:14px;background-position:-2963px 0}.iti__flag.iti__lc{height:10px;background-position:-2985px 0}.iti__flag.iti__li{height:12px;background-position:-3007px 0}.iti__flag.iti__lk{height:10px;background-position:-3029px 0}.iti__flag.iti__lr{height:11px;background-position:-3051px 0}.iti__flag.iti__ls{height:14px;background-position:-3073px 0}.iti__flag.iti__lt{height:12px;background-position:-3095px 0}.iti__flag.iti__lu{height:12px;background-position:-3117px 0}.iti__flag.iti__lv{height:10px;background-position:-3139px 0}.iti__flag.iti__ly{height:10px;background-position:-3161px 0}.iti__flag.iti__ma{height:14px;background-position:-3183px 0}.iti__flag.iti__mc{height:15px;background-position:-3205px 0}.iti__flag.iti__md{height:10px;background-position:-3226px 0}.iti__flag.iti__me{height:10px;background-position:-3248px 0}.iti__flag.iti__mf{height:14px;background-position:-3270px 0}.iti__flag.iti__mg{height:14px;background-position:-3292px 0}.iti__flag.iti__mh{height:11px;background-position:-3314px 0}.iti__flag.iti__mk{height:10px;background-position:-3336px 0}.iti__flag.iti__ml{height:14px;background-position:-3358px 0}.iti__flag.iti__mm{height:14px;background-position:-3380px 0}.iti__flag.iti__mn{height:10px;background-position:-3402px 0}.iti__flag.iti__mo{height:14px;background-position:-3424px 0}.iti__flag.iti__mp{height:10px;background-position:-3446px 0}.iti__flag.iti__mq{height:14px;background-position:-3468px 0}.iti__flag.iti__mr{height:14px;background-position:-3490px 0}.iti__flag.iti__ms{height:10px;background-position:-3512px 0}.iti__flag.iti__mt{height:14px;background-position:-3534px 0}.iti__flag.iti__mu{height:14px;background-position:-3556px 0}.iti__flag.iti__mv{height:14px;background-position:-3578px 0}.iti__flag.iti__mw{height:14px;background-position:-3600px 0}.iti__flag.iti__mx{height:12px;background-position:-3622px 0}.iti__flag.iti__my{height:10px;background-position:-3644px 0}.iti__flag.iti__mz{height:14px;background-position:-3666px 0}.iti__flag.iti__na{height:14px;background-position:-3688px 0}.iti__flag.iti__nc{height:10px;background-position:-3710px 0}.iti__flag.iti__ne{height:15px;background-position:-3732px 0}.iti__flag.iti__nf{height:10px;background-position:-3752px 0}.iti__flag.iti__ng{height:10px;background-position:-3774px 0}.iti__flag.iti__ni{height:12px;background-position:-3796px 0}.iti__flag.iti__nl{height:14px;background-position:-3818px 0}.iti__flag.iti__no{height:15px;background-position:-3840px 0}.iti__flag.iti__np{width:13px;height:15px;background-position:-3862px 0}.iti__flag.iti__nr{height:10px;background-position:-3877px 0}.iti__flag.iti__nu{height:10px;background-position:-3899px 0}.iti__flag.iti__nz{height:10px;background-position:-3921px 0}.iti__flag.iti__om{height:10px;background-position:-3943px 0}.iti__flag.iti__pa{height:14px;background-position:-3965px 0}.iti__flag.iti__pe{height:14px;background-position:-3987px 0}.iti__flag.iti__pf{height:14px;background-position:-4009px 0}.iti__flag.iti__pg{height:15px;background-position:-4031px 0}.iti__flag.iti__ph{height:10px;background-position:-4053px 0}.iti__flag.iti__pk{height:14px;background-position:-4075px 0}.iti__flag.iti__pl{height:13px;background-position:-4097px 0}.iti__flag.iti__pm{height:14px;background-position:-4119px 0}.iti__flag.iti__pn{height:10px;background-position:-4141px 0}.iti__flag.iti__pr{height:14px;background-position:-4163px 0}.iti__flag.iti__ps{height:10px;background-position:-4185px 0}.iti__flag.iti__pt{height:14px;background-position:-4207px 0}.iti__flag.iti__pw{height:13px;background-position:-4229px 0}.iti__flag.iti__py{height:11px;background-position:-4251px 0}.iti__flag.iti__qa{height:8px;background-position:-4273px 0}.iti__flag.iti__re{height:14px;background-position:-4295px 0}.iti__flag.iti__ro{height:14px;background-position:-4317px 0}.iti__flag.iti__rs{height:14px;background-position:-4339px 0}.iti__flag.iti__ru{height:14px;background-position:-4361px 0}.iti__flag.iti__rw{height:14px;background-position:-4383px 0}.iti__flag.iti__sa{height:14px;background-position:-4405px 0}.iti__flag.iti__sb{height:10px;background-position:-4427px 0}.iti__flag.iti__sc{height:10px;background-position:-4449px 0}.iti__flag.iti__sd{height:10px;background-position:-4471px 0}.iti__flag.iti__se{height:13px;background-position:-4493px 0}.iti__flag.iti__sg{height:14px;background-position:-4515px 0}.iti__flag.iti__sh{height:10px;background-position:-4537px 0}.iti__flag.iti__si{height:10px;background-position:-4559px 0}.iti__flag.iti__sj{height:15px;background-position:-4581px 0}.iti__flag.iti__sk{height:14px;background-position:-4603px 0}.iti__flag.iti__sl{height:14px;background-position:-4625px 0}.iti__flag.iti__sm{height:15px;background-position:-4647px 0}.iti__flag.iti__sn{height:14px;background-position:-4669px 0}.iti__flag.iti__so{height:14px;background-position:-4691px 0}.iti__flag.iti__sr{height:14px;background-position:-4713px 0}.iti__flag.iti__ss{height:10px;background-position:-4735px 0}.iti__flag.iti__st{height:10px;background-position:-4757px 0}.iti__flag.iti__su{height:10px;background-position:-4779px 0}.iti__flag.iti__sv{height:12px;background-position:-4801px 0}.iti__flag.iti__sx{height:14px;background-position:-4823px 0}.iti__flag.iti__sy{height:14px;background-position:-4845px 0}.iti__flag.iti__sz{height:14px;background-position:-4867px 0}.iti__flag.iti__ta{height:10px;background-position:-4889px 0}.iti__flag.iti__tc{height:10px;background-position:-4911px 0}.iti__flag.iti__td{height:14px;background-position:-4933px 0}.iti__flag.iti__tf{height:14px;background-position:-4955px 0}.iti__flag.iti__tg{height:13px;background-position:-4977px 0}.iti__flag.iti__th{height:14px;background-position:-4999px 0}.iti__flag.iti__tj{height:10px;background-position:-5021px 0}.iti__flag.iti__tk{height:10px;background-position:-5043px 0}.iti__flag.iti__tl{height:10px;background-position:-5065px 0}.iti__flag.iti__tm{height:14px;background-position:-5087px 0}.iti__flag.iti__tn{height:14px;background-position:-5109px 0}.iti__flag.iti__to{height:10px;background-position:-5131px 0}.iti__flag.iti__tr{height:14px;background-position:-5153px 0}.iti__flag.iti__tt{height:12px;background-position:-5175px 0}.iti__flag.iti__tv{height:10px;background-position:-5197px 0}.iti__flag.iti__tw{height:14px;background-position:-5219px 0}.iti__flag.iti__tz{height:14px;background-position:-5241px 0}.iti__flag.iti__ua{height:14px;background-position:-5263px 0}.iti__flag.iti__ug{height:14px;background-position:-5285px 0}.iti__flag.iti__uk{height:10px;background-position:-5307px 0}.iti__flag.iti__um{height:11px;background-position:-5329px 0}.iti__flag.iti__un{height:14px;background-position:-5351px 0}.iti__flag.iti__us{height:11px;background-position:-5373px 0}.iti__flag.iti__uy{height:14px;background-position:-5395px 0}.iti__flag.iti__uz{height:10px;background-position:-5417px 0}.iti__flag.iti__va{width:15px;height:15px;background-position:-5439px 0}.iti__flag.iti__vc{height:14px;background-position:-5456px 0}.iti__flag.iti__ve{height:14px;background-position:-5478px 0}.iti__flag.iti__vg{height:10px;background-position:-5500px 0}.iti__flag.iti__vi{height:14px;background-position:-5522px 0}.iti__flag.iti__vn{height:14px;background-position:-5544px 0}.iti__flag.iti__vu{height:12px;background-position:-5566px 0}.iti__flag.iti__wf{height:14px;background-position:-5588px 0}.iti__flag.iti__ws{height:10px;background-position:-5610px 0}.iti__flag.iti__xk{height:15px;background-position:-5632px 0}.iti__flag.iti__ye{height:14px;background-position:-5654px 0}.iti__flag.iti__yt{height:14px;background-position:-5676px 0}.iti__flag.iti__za{height:14px;background-position:-5698px 0}.iti__flag.iti__zm{height:14px;background-position:-5720px 0}.iti__flag.iti__zw{height:10px;background-position:-5742px 0}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.iti__flag{background-size:5762px 15px;background-image:url("../../images/flags/flags@2x.png?1")}} diff --git a/site/static/libs/intl-tel-input/intlTelInput.min.js b/site/static/libs/intl-tel-input/intlTelInput.min.js deleted file mode 100644 index 9cd35ca6..00000000 --- a/site/static/libs/intl-tel-input/intlTelInput.min.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - * International Telephone Input v18.2.1 - * https://github.com/jackocnr/intl-tel-input.git - * Licensed under the MIT license - */ - -!function(a){"object"==typeof module&&module.exports?module.exports=a():window.intlTelInput=a()}(function(a){"use strict";return function(){function b(a){for(var b=1;bthis.countryCodeMaxLen&&(this.countryCodeMaxLen=c.length),this.q.hasOwnProperty(c)||(this.q[c]=[]);for(var e=0;e-1})}else if(this.d.excludeCountries.length){var b=this.d.excludeCountries.map(function(a){return a.toLowerCase()});this.p=i.filter(function(a){return-1===b.indexOf(a.iso2)})}else this.p=i}},{key:"_d0",value:function(){for(var a=0;ab.name?1:0}},{key:"_d2",value:function(){this.countryCodeMaxLen=0,this.dialCodes={},this.q={};for(var a=0;a"),this.d.showFlags&&(d+="
              ")),d+="".concat(f.name,""),d+="+".concat(f.dialCode,""),d+=""}this.m.insertAdjacentHTML("beforeend",d)}},{key:"_h",value:function(){var a=this.a.getAttribute("value"),b=this.a.value,c=a&&"+"===a.charAt(0)&&(!b||"+"!==b.charAt(0)),d=c?a:b,e=this._5(d),f=this._w(d),g=this.d,h=g.initialCountry,i=g.autoInsertDialCode;e&&!f?this._v(d):"auto"!==h&&(h?this._z(h.toLowerCase()):e&&f?this._z("us"):(this.j=this.preferredCountries.length?this.preferredCountries[0].iso2:this.p[0].iso2,d||this._z(this.j)),!d&&i&&(this.a.value="+".concat(this.s.dialCode))),d&&this._u(d)}},{key:"_i",value:function(){this._j(),this.d.autoInsertDialCode&&this._l(),this.d.allowDropdown&&this._i2(),this.hiddenInput&&this._i0()}},{key:"_i0",value:function(){var a=this;this._a14=function(){a.hiddenInput.value=a.getNumber()},this.a.form&&this.a.form.addEventListener("submit",this._a14)}},{key:"_i1",value:function(){for(var a=this.a;a&&"LABEL"!==a.tagName;)a=a.parentNode;return a}},{key:"_i2",value:function(){var a=this;this._a9=function(b){a.m.classList.contains("iti__hide")?a.a.focus():b.preventDefault()};var b=this._i1();b&&b.addEventListener("click",this._a9),this._a10=function(){!a.m.classList.contains("iti__hide")||a.a.disabled||a.a.readOnly||a._n()},this.selectedFlag.addEventListener("click",this._a10),this._a11=function(b){a.m.classList.contains("iti__hide")&&-1!==["ArrowUp","Up","ArrowDown","Down"," ","Enter"].indexOf(b.key)&&(b.preventDefault(),b.stopPropagation(),a._n()),"Tab"===b.key&&a._2()},this.k.addEventListener("keydown",this._a11)}},{key:"_i3",value:function(){var a=this;this.d.utilsScript&&!window.intlTelInputUtils?window.intlTelInputGlobals.documentReady()?window.intlTelInputGlobals.loadUtils(this.d.utilsScript):window.addEventListener("load",function(){window.intlTelInputGlobals.loadUtils(a.d.utilsScript)}):this.i0(),"auto"===this.d.initialCountry?this._i4():this.h()}},{key:"_i4",value:function(){window.intlTelInputGlobals.autoCountry?this.handleAutoCountry():window.intlTelInputGlobals.startedLoadingAutoCountry||(window.intlTelInputGlobals.startedLoadingAutoCountry=!0,"function"==typeof this.d.geoIpLookup&&this.d.geoIpLookup(function(a){window.intlTelInputGlobals.autoCountry=a.toLowerCase(),setTimeout(function(){return q("handleAutoCountry")})},function(){return q("rejectAutoCountryPromise")}))}},{key:"_j",value:function(){var a=this;this._a12=function(){a._v(a.a.value)&&a._m2CountryChange()},this.a.addEventListener("keyup",this._a12),this._a13=function(){setTimeout(a._a12)},this.a.addEventListener("cut",this._a13),this.a.addEventListener("paste",this._a13)}},{key:"_j2",value:function(a){var b=this.a.getAttribute("maxlength");return b&&a.length>b?a.substr(0,b):a}},{key:"_l",value:function(){var a=this;this._a8=function(){a._l2()},this.a.form&&this.a.form.addEventListener("submit",this._a8),this.a.addEventListener("blur",this._a8)}},{key:"_l2",value:function(){if("+"===this.a.value.charAt(0)){var a=this._m(this.a.value);a&&this.s.dialCode!==a||(this.a.value="")}}},{key:"_m",value:function(a){return a.replace(/\D/g,"")}},{key:"_m2",value:function(a){var b=document.createEvent("Event");b.initEvent(a,!0,!0),this.a.dispatchEvent(b)}},{key:"_n",value:function(){this.m.classList.remove("iti__hide"),this.selectedFlag.setAttribute("aria-expanded","true"),this._o(),this.b&&(this._x(this.b,!1),this._3(this.b,!0)),this._p(),this.u.classList.add("iti__arrow--up"),this._m2("open:countrydropdown")}},{key:"_n2",value:function(a,b,c){c&&!a.classList.contains(b)?a.classList.add(b):!c&&a.classList.contains(b)&&a.classList.remove(b)}},{key:"_o",value:function(){var a=this;if(this.d.dropdownContainer&&this.d.dropdownContainer.appendChild(this.dropdown),!this.g){var b=this.a.getBoundingClientRect(),c=window.pageYOffset||document.documentElement.scrollTop,d=b.top+c,e=this.m.offsetHeight,f=d+this.a.offsetHeight+ec;if(this._n2(this.m,"iti__country-list--dropup",!f&&g),this.d.dropdownContainer){var h=!f&&g?0:this.a.offsetHeight;this.dropdown.style.top="".concat(d+h,"px"),this.dropdown.style.left="".concat(b.left+document.body.scrollLeft,"px"),this._a4=function(){return a._2()},window.addEventListener("scroll",this._a4)}}}},{key:"_o2",value:function(a){for(var b=a;b&&b!==this.m&&!b.classList.contains("iti__country");)b=b.parentNode;return b===this.m?null:b}},{key:"_p",value:function(){var a=this;this._a0=function(b){var c=a._o2(b.target);c&&a._x(c,!1)},this.m.addEventListener("mouseover",this._a0),this._a1=function(b){var c=a._o2(b.target);c&&a._1(c)},this.m.addEventListener("click",this._a1);var b=!0;this._a2=function(){b||a._2(),b=!1},document.documentElement.addEventListener("click",this._a2);var c="",d=null;this._a3=function(b){b.preventDefault(),"ArrowUp"===b.key||"Up"===b.key||"ArrowDown"===b.key||"Down"===b.key?a._q(b.key):"Enter"===b.key?a._r():"Escape"===b.key?a._2():/^[a-zA-ZÀ-ÿа-яА-Я ]$/.test(b.key)&&(d&&clearTimeout(d),c+=b.key.toLowerCase(),a._s(c),d=setTimeout(function(){c=""},1e3))},document.addEventListener("keydown",this._a3)}},{key:"_q",value:function(a){var b="ArrowUp"===a||"Up"===a?this.c.previousElementSibling:this.c.nextElementSibling;b&&(b.classList.contains("iti__divider")&&(b="ArrowUp"===a||"Up"===a?b.previousElementSibling:b.nextElementSibling),this._x(b,!0))}},{key:"_r",value:function(){this.c&&this._1(this.c)}},{key:"_s",value:function(a){for(var b=0;bg){b&&(k+=l);var m=e-h;c.scrollTop=k-m}}},{key:"_4",value:function(a){var b,c=this.a.value,d="+".concat(a);if("+"===c.charAt(0)){var e=this._5(c);b=e?c.replace(e,d):d,this.a.value=b}else this.d.autoInsertDialCode&&(b=c?d+c:d,this.a.value=b)}},{key:"_5",value:function(a,b){var c="";if("+"===a.charAt(0))for(var d="",e=0;ea.length?!1:M(Ga,a)}function Ja(a){return M(Ba,a)?N(a,wa):N(a,va)}function Ka(a){var b=Ja(a.toString());a.i="";a.g(b)}function La(a){return null!=a&&(1!=w(a,9)||-1!=t(a,9)[0])}function N(a,b){for(var c=new C,d,f=a.length,e=0;eb?2:e[e.length-1]=b.i.length)throw Error("Phone number too short after IDD"); - a:{a=b.toString();if(0!=a.length&&"0"!=a.charAt(0))for(f=a.length,b=1;3>=b&&b<=f;++b)if(c=parseInt(a.substring(0,b),10),c in I){d.g(a.substring(b));d=c;break a}d=0}if(0!=d)return q(e,1,d),d;throw Error("Invalid country calling code");}if(null!=c&&(g=v(c,10),h=""+g,l=b.toString(),0==l.lastIndexOf(h,0)&&(h=new C(l.substring(h.length)),l=p(c,1),l=new RegExp(v(l,2)),Qa(h,c,null),h=h.toString(),!M(l,b.toString())&&M(l,h)||3==W(a,b.toString(),c,-1))))return d.g(h),f&&q(e,6,10),q(e,1,g),g;q(e,1,0);return 0} - function Qa(a,b,c){var d=a.toString(),f=d.length,e=p(b,15);if(0!=f&&null!=e&&0!=e.length){var g=new RegExp("^(?:"+e+")");if(f=g.exec(d)){e=new RegExp(v(p(b,1),2));var h=M(e,d),l=f.length-1;b=p(b,16);if(null==b||0==b.length||null==f[l]||0==f[l].length){if(!h||M(e,d.substring(f[0].length)))null!=c&&0=b.length)e="";else{var g=b.indexOf(";",e);e=-1!==g?b.substring(e,g):b.substring(e)}var h=e;null==h?g=!0:0===h.length?g=!1:(g=Ca.exec(h),h=Da.exec(h),g=null!==g||null!==h);if(!g)throw Error("The string supplied did not seem to be a phone number"); - null!=e?("+"===e.charAt(0)&&f.g(e),e=b.indexOf("tel:"),f.g(b.substring(0<=e?e+4:0,b.indexOf(";phone-context=")))):(e=f.g,g=b??"",h=g.search(ya),0<=h?(g=g.substring(h),g=g.replace(Aa,""),h=g.search(za),0<=h&&(g=g.substring(0,h))):g="",e.call(f,g));e=f.toString();g=e.indexOf(";isub=");0b.i.length)throw Error("The string supplied is too short to be a phone number");null!=g&&(c=new C,f=new C(b.toString()),Qa(f,g,c),a=W(a,f.toString(),g,-1),2!=a&&4!=a&&5!=a&&(b=f,d&&0a)throw Error("The string supplied is too short to be a phone number");if(17{try{const f=J.g(),e=Z(f,a,b);var d=X(f,e);return 0==d||4==d?Ma(f,e,"undefined"===typeof c?0:c):a}catch(f){return a}});k("intlTelInputUtils.getExampleNumber",(a,b,c)=>{try{const h=J.g();a:{var d=h;if(O(a)){var f=T(S(d,a),c);try{if(null!=f.g[6]){var e=p(f,6);var g=Ra(d,e,a,!1);break a}}catch(l){}}g=null}return Ma(h,g,b?2:1)}catch(h){return""}});k("intlTelInputUtils.getExtension",(a,b)=>{try{return p(Z(J.g(),a,b),3)}catch(c){return""}}); - k("intlTelInputUtils.getNumberType",(a,b)=>{try{const h=J.g();var c=Z(h,a,b);a=h;var d=Oa(a,c),f=Q(a,v(c,1),d);if(null==f)var e=-1;else{var g=P(c);e=U(g,f)}return e}catch(h){return-99}}); - k("intlTelInputUtils.getValidationError",(a,b)=>{try{const c=J.g(),d=Z(c,a,b);return X(c,d)}catch(c){return"Invalid country calling code"===c.message?1:"Phone number too short after IDD"===c.message||"The string supplied is too short to be a phone number"===c.message?2:"The string supplied is too long to be a phone number"===c.message?3:-99}}); - k("intlTelInputUtils.isValidNumber",(a,b)=>{try{const Y=J.g();var c=Z(Y,a,b);a=Y;var d=Oa(a,c);var f=v(c,1),e=Q(a,f,d),g;if(!(g=null==e)){var h;if(h="001"!=d){var l=S(a,d);if(null==l)throw Error("Invalid region code: "+d);var A=v(l,10);h=f!=A}g=h}if(g)var G=!1;else{var Sa=P(c);G=-1!=U(Sa,e)}return G}catch(Y){return!1}});k("intlTelInputUtils.isPossibleNumber",(a,b)=>{try{const c=J.g(),d=Z(c,a,b);return 0===X(c,d)}catch(c){return!1}}); - k("intlTelInputUtils.numberFormat",{E164:0,INTERNATIONAL:1,NATIONAL:2,RFC3966:3});k("intlTelInputUtils.numberType",{FIXED_LINE:0,MOBILE:1,FIXED_LINE_OR_MOBILE:2,TOLL_FREE:3,PREMIUM_RATE:4,SHARED_COST:5,VOIP:6,PERSONAL_NUMBER:7,PAGER:8,UAN:9,VOICEMAIL:10,UNKNOWN:-1});k("intlTelInputUtils.validationError",{IS_POSSIBLE:0,INVALID_COUNTRY_CODE:1,TOO_SHORT:2,TOO_LONG:3,IS_POSSIBLE_LOCAL_ONLY:4,INVALID_LENGTH:5});})(); diff --git a/site/tests/checkout-completed.test.mjs b/site/tests/checkout-completed.test.mjs index c72a9922..13e1e61a 100644 --- a/site/tests/checkout-completed.test.mjs +++ b/site/tests/checkout-completed.test.mjs @@ -7,11 +7,21 @@ * * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import assert from 'node:assert/strict'; import fs from 'node:fs'; @@ -269,48 +279,12 @@ test('keep the neutral result when the payment client cannot initialize', async test('keep the order ID in the visible URL', () => { const initialUrl = 'https://example.com/checkout-completed/' + '?campaign=sale&orderId=current-order&orderId=ignored#result'; - const browser = createBrowserState( - initialUrl, - { - consumerState: 'preserved', - siteCommonsCompletionOrderId: 'previous-order' - } - ); + const browser = createBrowserState(initialUrl); - const orderId = getCompletionOrderId(browser.location, browser.history); + const orderId = getCompletionOrderId(browser.location); assert.equal(orderId, 'current-order'); assert.equal(browser.location.href, initialUrl); - assert.equal(browser.history.state.consumerState, 'preserved'); - assert.equal(browser.history.state.siteCommonsCompletionOrderId, 'previous-order'); -}); - -test('fall back to an order ID retained by the previous URL behavior', () => { - const browser = createBrowserState( - 'https://example.com/checkout-completed/?campaign=sale#result', - {siteCommonsCompletionOrderId: 'current-order'} - ); - - assert.equal( - getCompletionOrderId(browser.location, browser.history), - 'current-order' - ); - assert.equal( - browser.location.href, - 'https://example.com/checkout-completed/?campaign=sale#result' - ); -}); - -test('let an explicit empty order ID override retained history', () => { - const browser = createBrowserState( - 'https://example.com/checkout-completed/?orderId=', - {siteCommonsCompletionOrderId: 'previous-order'} - ); - - assert.equal( - getCompletionOrderId(browser.location, browser.history), - '' - ); }); test('carry only the order ID to a directory completion URL', () => { @@ -325,18 +299,6 @@ test('carry only the order ID to a directory completion URL', () => { ); }); -test('carry the order ID to a file-style completion URL', () => { - const actual = getCompletedPageUrl( - 'https://example.com/checkout.html?orderId=current-order', - 'current-order' - ); - - assert.equal( - actual, - 'https://example.com/checkout-completed.html?orderId=current-order' - ); -}); - test('carry only the order ID back to a directory checkout URL', () => { const actual = getCheckoutPageUrl( 'https://example.com/checkout-completed/?campaign=sale#result', @@ -349,18 +311,6 @@ test('carry only the order ID back to a directory checkout URL', () => { ); }); -test('carry the order ID back to a file-style checkout URL', () => { - const actual = getCheckoutPageUrl( - 'https://example.com/checkout-completed.html?campaign=sale#result', - 'current-order' - ); - - assert.equal( - actual, - 'https://example.com/checkout.html?orderId=current-order' - ); -}); - test('reject a non-completion URL as a checkout-link source', () => { assert.equal( getCheckoutPageUrl( diff --git a/site/tests/checkout-configuration.test.mjs b/site/tests/checkout-configuration.test.mjs index 518c6491..774c7db4 100644 --- a/site/tests/checkout-configuration.test.mjs +++ b/site/tests/checkout-configuration.test.mjs @@ -7,11 +7,21 @@ * * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import assert from 'node:assert/strict'; @@ -22,21 +32,66 @@ const {buildChargeRequest} = await importSource( '../assets/js/pages/checkout/charge-request.js' ); const { - checkoutNavigationMode, focusOpenCountrySearchField, - getCheckoutNavigationMode, populateCountrySelect } = await importSource( '../assets/js/pages/checkout/countries.js' ); +const { + checkoutNavigationMode, + getCheckoutNavigationMode +} = await importSource( + '../assets/js/pages/checkout/navigation.js' +); const {isEuCountry} = await importSource( - '../assets/js/pages/checkout/phone-codes.js' + '../assets/js/pages/checkout/vat-countries.js' ); const {normalizeIntlPhoneNumber} = await importSource( '../assets/js/modules/forms/phone-number.js' ); const {createCheckoutFormController} = await importFormController(); +test('keep checkout libraries aligned with pinned npm distributions', () => { + assert.deepEqual( + readFile('../assets/libs/country-select/select2.js'), + readFile('../node_modules/select2/dist/js/select2.min.js') + ); + assert.deepEqual( + readFile('../assets/scss/libs/country-select/_select2.scss'), + readFile('../node_modules/select2/dist/css/select2.min.css') + ); + assert.deepEqual( + readFile('../assets/libs/intl-tel-input/intlTelInput.js'), + readFile('../node_modules/intl-tel-input/build/js/intlTelInput.min.js') + ); + assert.deepEqual( + readFile('../assets/libs/intl-tel-input/utils.js'), + readFile('../node_modules/intl-tel-input/build/js/utils.js') + ); + + const expectedPhoneCss = readText( + '../node_modules/intl-tel-input/build/css/intlTelInput.min.css' + ).replace( + 'url(../img/flags.png?1)', + 'url("../../images/flags/flags.png?1")' + ).replace( + 'url(../img/flags@2x.png?1)', + 'url("../../images/flags/flags@2x.png?1")' + ); + assert.equal( + readText('../assets/scss/libs/intl-tel-input/_intl-tel-input.scss'), + expectedPhoneCss + ); + assert.deepEqual( + readFile('../static/images/flags/flags.png'), + readFile('../node_modules/intl-tel-input/build/img/flags.png') + ); + assert.deepEqual( + readFile('../static/images/flags/flags@2x.png'), + readFile('../node_modules/intl-tel-input/build/img/flags@2x.png') + ); +}); + test('calculate charges without requiring a VAT ID', () => { assert.deepEqual( buildChargeRequest('order-1', 'US', ''), @@ -114,6 +169,10 @@ test('restore checkout fields only for browser history navigation', () => { getCheckoutNavigationMode('reload'), checkoutNavigationMode.reset ); + assert.equal( + getCheckoutNavigationMode('reload', true), + checkoutNavigationMode.restore + ); assert.equal( getCheckoutNavigationMode('navigate'), checkoutNavigationMode.none @@ -140,6 +199,75 @@ test('build Paygate phone data from the shared international input', () => { assert.equal(normalizeIntlPhoneNumber('5550100', '', ''), null); }); +test('allow an optional phone number while validation utilities are loading', () => { + const originalWindow = globalThis.window; + let validityMessage = ''; + const errorElement = {textContent: ''}; + const fieldContainer = { + classList: {toggle() {}}, + querySelector: () => errorElement + }; + const phoneField = { + closest: () => fieldContainer, + setCustomValidity: message => validityMessage = message + }; + const phoneInput = {isValidNumber: () => false}; + globalThis.window = { + intlTelInputGlobals: {getInstance: () => phoneInput} + }; + + try { + const controller = createCheckoutFormController({ + dom: { + $phoneNumber: { + get: () => phoneField, + val: () => '151 23456789' + } + } + }); + + assert.equal(controller.validatePhoneNumber(), true); + assert.equal(validityMessage, ''); + + globalThis.window.intlTelInputUtils = {}; + assert.equal(controller.validatePhoneNumber(), false); + assert.equal(validityMessage, 'Enter a valid phone number.'); + } finally { + globalThis.window = originalWindow; + } +}); + +test('apply billing country to a typed phone unless its country was chosen manually', () => { + const originalWindow = globalThis.window; + const selectedCountries = []; + const phoneField = {}; + globalThis.window = { + intlTelInputGlobals: { + getInstance: () => ({ + setCountry: countryCode => selectedCountries.push(countryCode) + }) + }, + setTimeout: callback => callback() + }; + + try { + const controller = createCheckoutFormController({ + dom: { + $country: {val: () => 'DE'}, + $phoneNumber: {get: () => phoneField, val: () => '151 23456789'} + } + }); + + controller.applyPhoneCountryFromBillingCountry(false); + controller.applyPhoneCountryFromBillingCountry(true); + + assert.deepEqual(selectedCountries, ['de']); + assert.equal(controller.applyBillingCountryFromPhoneCountry, undefined); + } finally { + globalThis.window = originalWindow; + } +}); + test('clear an earlier VAT validation error after the input changes', () => { const classes = new Set(); const errorElement = {textContent: ''}; @@ -183,12 +311,20 @@ async function importSource(relativePath) { return import(`data:text/javascript,${encodeURIComponent(source)}`); } +function readFile(relativePath) { + return fs.readFileSync(new URL(relativePath, import.meta.url)); +} + +function readText(relativePath) { + return fs.readFileSync(new URL(relativePath, import.meta.url), 'utf8'); +} + async function importFormController() { const source = fs.readFileSync( new URL('../assets/js/pages/checkout/form-controller.js', import.meta.url), 'utf8' ).replace( - "import {isEuCountry} from 'js/pages/checkout/phone-codes';", + "import {isEuCountry} from 'js/pages/checkout/vat-countries';", "const isEuCountry = countryCode => countryCode === 'EE';" ).replace( "import {normalizeIntlPhoneNumber} from 'js/modules/forms/phone-number';", From c2677aeb830f7febf657d820c0d27e932848b2c9 Mon Sep 17 00:00:00 2001 From: Vladyslav Kuksiuk Date: Thu, 13 Aug 2026 16:54:33 +0200 Subject: [PATCH 07/17] Improve readability. --- .github/workflows/check-links.yml | 5 + site/assets/js/modules/forms/phone-number.js | 4 +- .../js/pages/checkout/charge-controller.js | 12 +- site/assets/js/pages/checkout/completed.js | 4 +- site/assets/js/pages/checkout/dom.js | 6 +- .../js/pages/checkout/form-controller.js | 7 +- site/assets/js/pages/checkout/index.js | 16 +- .../{completion-order-id.js => order-id.js} | 8 +- .../js/pages/checkout/view-controller.js | 65 +++++---- site/assets/libs/README.md | 5 +- site/assets/scss/pages/_checkout.scss | 2 +- site/config/_default/hugo.toml | 1 - site/content/checkout-completed/index.md | 1 + site/layouts/404.html | 4 +- .../_partials/components/result-panel.html | 12 +- .../_partials/getting-help/services.html | 6 +- site/layouts/_partials/scripts/script.html | 6 +- site/layouts/checkout-completed/single.html | 29 ++-- site/layouts/checkout/single.html | 39 +++-- site/package-lock.json | 10 +- site/package.json | 6 +- site/tests/checkout-completed.test.mjs | 13 +- site/tests/checkout-configuration.test.mjs | 138 ++++++++++++++++++ 23 files changed, 281 insertions(+), 118 deletions(-) rename site/assets/js/pages/checkout/{completion-order-id.js => order-id.js} (86%) diff --git a/.github/workflows/check-links.yml b/.github/workflows/check-links.yml index a6779543..e8fde000 100644 --- a/.github/workflows/check-links.yml +++ b/.github/workflows/check-links.yml @@ -108,6 +108,11 @@ jobs: working-directory: ${{ steps.docs.outputs.work_dir }} run: npm ci + - name: Run checkout tests + if: steps.docs.outputs.present == 'true' + working-directory: ${{ steps.docs.outputs.work_dir }} + run: npm test + - name: Build docs preview site if: steps.docs.outputs.present == 'true' working-directory: ${{ steps.docs.outputs.work_dir }} diff --git a/site/assets/js/modules/forms/phone-number.js b/site/assets/js/modules/forms/phone-number.js index f58ec165..66bc4de0 100644 --- a/site/assets/js/modules/forms/phone-number.js +++ b/site/assets/js/modules/forms/phone-number.js @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * * Redistribution and use in source and/or binary forms, with or without * modification, must retain the above copyright notice and the following @@ -34,7 +34,7 @@ * @return {{countryCode: number, number: string}|null} * normalized phone-number payload, or null when incomplete */ -export function normalizePhoneNumber(rawCountryCode, rawNumber) { +function normalizePhoneNumber(rawCountryCode, rawNumber) { const countryCode = String(rawCountryCode || '').replace(/\D/g, ''); const number = String(rawNumber || '').replace(/\D/g, ''); diff --git a/site/assets/js/pages/checkout/charge-controller.js b/site/assets/js/pages/checkout/charge-controller.js index 5e3e2158..47944ca7 100644 --- a/site/assets/js/pages/checkout/charge-controller.js +++ b/site/assets/js/pages/checkout/charge-controller.js @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * * Redistribution and use in source and/or binary forms, with or without * modification, must retain the above copyright notice and the following @@ -183,19 +183,15 @@ export function createChargeController( * @param {boolean} isCurrentRequest whether the failed request is still current */ function handleRequestError(error, isCurrentRequest) { - const isVatError = isVatErrorResponse(error); - - if (!isVatError) { - view.showErrorModal(); - } - if (!isCurrentRequest) { logApiError(error); return; } - if (isVatError) { + if (isVatErrorResponse(error)) { onVatIdError(getVatErrorReason(error)); + } else { + view.showErrorModal(); } logApiError(error); diff --git a/site/assets/js/pages/checkout/completed.js b/site/assets/js/pages/checkout/completed.js index a35b5d0f..fc473164 100644 --- a/site/assets/js/pages/checkout/completed.js +++ b/site/assets/js/pages/checkout/completed.js @@ -29,7 +29,7 @@ import * as params from '@params'; import {createPurchaseClient} from 'js/modules/paygate/purchases'; import {getCheckoutPageUrl} from 'js/pages/checkout/completed-page-url'; -import {getCompletionOrderId} from 'js/pages/checkout/completion-order-id'; +import {getOrderId} from 'js/pages/checkout/order-id'; const pollingIntervalsMs = [3000, 5000, 10000, 30000]; const failuresBeforeErrorView = 3; @@ -55,7 +55,7 @@ function init() { return; } - const orderId = getCompletionOrderId(window.location); + const orderId = getOrderId(window.location); if (!orderId) { return; } diff --git a/site/assets/js/pages/checkout/dom.js b/site/assets/js/pages/checkout/dom.js index 55a9cab7..d14a34b8 100644 --- a/site/assets/js/pages/checkout/dom.js +++ b/site/assets/js/pages/checkout/dom.js @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * * Redistribution and use in source and/or binary forms, with or without * modification, must retain the above copyright notice and the following @@ -37,8 +37,6 @@ * @property {JQuery} $phoneCountry native phone-country state * @property {JQuery} $vatId vat ID input * @property {JQuery} $loading summary loading container - * @property {JQuery} $loadingSpinner summary spinner element - * @property {JQuery} $loadingText summary loading text element * @property {JQuery} $productTitle product title element * @property {JQuery} $productDescription product description * element @@ -68,8 +66,6 @@ export function getCheckoutDom() { $phoneCountry: $('#checkout-phone-country'), $vatId: $('#checkout-vat-id'), $loading: $('#checkout-summary-loading'), - $loadingSpinner: $('#checkout-summary-loading-spinner'), - $loadingText: $('#checkout-summary-loading-text'), $productTitle: $('#checkout-product-title'), $productDescription: $('#checkout-product-description'), $subtotalValue: $('#checkout-subtotal-value'), diff --git a/site/assets/js/pages/checkout/form-controller.js b/site/assets/js/pages/checkout/form-controller.js index 41fd2246..c254a369 100644 --- a/site/assets/js/pages/checkout/form-controller.js +++ b/site/assets/js/pages/checkout/form-controller.js @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * * Redistribution and use in source and/or binary forms, with or without * modification, must retain the above copyright notice and the following @@ -70,7 +70,8 @@ export const fieldValidationState = Object.freeze({ * initializes the shared international phone input * @property {function(): void} updateVatIdFieldState * refreshes VAT field state after country changes - * @property {function(HTMLInputElement|HTMLSelectElement|HTMLTextAreaElement):boolean} validateField + * @property {function(HTMLInputElement|HTMLSelectElement|HTMLTextAreaElement):boolean} + * validateField * validates one form field * @property {function(string): boolean} validateRequiredFields * validates all required checkout fields @@ -268,7 +269,7 @@ export function createCheckoutFormController({dom}) { .filter(Boolean) .join(' ') || companyName; const phoneNumber = buildPhoneNumberPayload(); - const company = companyName || vatId ? { + const company = (companyName || vatId) ? { ...(companyName ? {name: companyName} : {}), ...(vatId ? {vatId} : {}) } : null; diff --git a/site/assets/js/pages/checkout/index.js b/site/assets/js/pages/checkout/index.js index 506ef3d4..ba8f7064 100644 --- a/site/assets/js/pages/checkout/index.js +++ b/site/assets/js/pages/checkout/index.js @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * * Redistribution and use in source and/or binary forms, with or without * modification, must retain the above copyright notice and the following @@ -37,6 +37,7 @@ import { checkoutNavigationMode, getCheckoutNavigationMode } from 'js/pages/checkout/navigation'; +import {getOrderId} from 'js/pages/checkout/order-id'; import {createCheckoutView} from 'js/pages/checkout/view-controller'; const requiredSelector = 'input[required], select[required], textarea[required]'; @@ -51,7 +52,7 @@ $( initializeCountrySelector(dom.$country.get(0)); const purchaseClient = createPurchaseClient(params.payment.paygateurl); - const orderId = getOrderId(); + const orderId = getOrderId(window.location); const view = createCheckoutView(dom); const formController = createCheckoutFormController({dom}); let phoneCountryManuallySelected = false; @@ -149,7 +150,7 @@ $( * @return {Promise} resolves when the initial order load flow finishes */ async function loadOrder() { - view.setSummaryLoading(true); + view.showSummaryLoading(); try { const order = await purchaseClient.getOrder(orderId); @@ -218,15 +219,6 @@ $( } } - /** - * Reads the order ID from the `orderId` query parameter. - * - * @return {string} checkout order ID, or empty string when unavailable - */ - function getOrderId() { - return (new URLSearchParams(window.location.search).get('orderId') || '').trim(); - } - /** * Logs API failures in a compact and consistent format. * diff --git a/site/assets/js/pages/checkout/completion-order-id.js b/site/assets/js/pages/checkout/order-id.js similarity index 86% rename from site/assets/js/pages/checkout/completion-order-id.js rename to site/assets/js/pages/checkout/order-id.js index 325abdf1..5a93bd20 100644 --- a/site/assets/js/pages/checkout/completion-order-id.js +++ b/site/assets/js/pages/checkout/order-id.js @@ -27,12 +27,12 @@ 'use strict'; /** - * Reads the order ID from the visible payment-result URL. + * Reads the order ID from the visible checkout URL. * * @param {Location|URL} location browser location * @return {string} Paygate order ID, or an empty string when unavailable */ -export function getCompletionOrderId(location) { - const completionUrl = new URL(location.href); - return (completionUrl.searchParams.get('orderId') || '').trim(); +export function getOrderId(location) { + const checkoutUrl = new URL(location.href); + return (checkoutUrl.searchParams.get('orderId') || '').trim(); } diff --git a/site/assets/js/pages/checkout/view-controller.js b/site/assets/js/pages/checkout/view-controller.js index 3eacab44..57478e74 100644 --- a/site/assets/js/pages/checkout/view-controller.js +++ b/site/assets/js/pages/checkout/view-controller.js @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * * Redistribution and use in source and/or binary forms, with or without * modification, must retain the above copyright notice and the following @@ -42,8 +42,8 @@ * checks whether the checkout form is currently hidden * @property {function(boolean): void} setSubmitDisabled * enables or disables the checkout submit button - * @property {function(boolean): void} setSummaryLoading - * shows or hides the summary loading state + * @property {function(): void} showSummaryLoading + * shows the summary loading state * @property {function(): void} showErrorModal * opens the generic checkout error modal * @property {function(): void} showCheckoutView @@ -104,10 +104,12 @@ export function createCheckoutView(dom) { dom.$productDescription.text('').prop('hidden', true); } - dom.$subtotalValue.text(formatMoney(order.netAmount)); + const netAmount = order.netAmount || {}; + + dom.$subtotalValue.text(formatMoney(netAmount)); dom.$vatLabel.text('VAT'); - dom.$vatValue.text(formatMoney(zeroMoney(order.netAmount.currency))); - dom.$totalValue.text(formatMoney(order.netAmount)); + dom.$vatValue.text(formatMoney(zeroMoney(netAmount.currency))); + dom.$totalValue.text(formatMoney(netAmount)); } /** @@ -116,32 +118,23 @@ export function createCheckoutView(dom) { * @param {Object} response paygate charge calculation response */ function updateCharges(response) { - const vatRatePercent = Number(response.vatRate) * 100; - - dom.$vatLabel.text(`VAT (${String(vatRatePercent)}%)`); + dom.$vatLabel.text(formatVatLabel(response && response.vatRate)); dom.$subtotalValue.text(formatMoney(response.netAmount)); dom.$vatValue.text(formatMoney(response.vatAmount)); dom.$totalValue.text(formatMoney(response.totalAmount)); } /** - * Shows or hides the order-summary loading state. - * - * @param {boolean} isLoading whether the summary should show the loading state + * Shows the order-summary loading state. */ - function setSummaryLoading(isLoading) { + function showSummaryLoading() { setResultPageMode(false); - dom.$summary.prop('hidden', isLoading); - dom.$loading.prop('hidden', !isLoading); - dom.$loadingSpinner.prop('hidden', !isLoading); - dom.$form.prop('hidden', isLoading); + dom.$summary.prop('hidden', true); + dom.$loading.prop('hidden', false); + dom.$form.prop('hidden', true); dom.$missingOrder.prop('hidden', true); dom.$notFound.prop('hidden', true); dom.$summaryError.prop('hidden', true); - - if (isLoading) { - dom.$loadingText.text('Loading checkout details...'); - } } /** @@ -221,13 +214,33 @@ export function createCheckoutView(dom) { * @return {string} formatted money value */ function formatMoney(amount) { - const numericAmount = Number(amount.value); + const amountValue = amount && amount.value; + const numericAmount = Number(amountValue); const formattedAmount = Number.isNaN(numericAmount) - ? String(amount.value || '') + ? String(amountValue || '') : numericAmount.toFixed(2); - const currency = amount.currency; + const currency = amount && amount.currency; + const currencySymbol = currency && currency.symbol || ''; + + return `${currencySymbol}${formattedAmount}`; + } + + /** + * Formats a VAT-rate label without exposing invalid or imprecise numbers. + * + * @param {*} rawVatRate VAT rate returned by Paygate + * @return {string} VAT label with an optional percentage + */ + function formatVatLabel(rawVatRate) { + const vatRate = Number(rawVatRate); + + if (rawVatRate === null || rawVatRate === undefined || rawVatRate === '' || + !Number.isFinite(vatRate)) { + return 'VAT'; + } - return `${currency.symbol}${formattedAmount}`; + const percentage = Math.round(vatRate * 10000) / 100; + return `VAT (${String(percentage)}%)`; } /** @@ -248,7 +261,7 @@ export function createCheckoutView(dom) { fillOrderSummary, isFormHidden, setSubmitDisabled, - setSummaryLoading, + showSummaryLoading, showCheckoutView, showErrorModal, showMissingOrderView, diff --git a/site/assets/libs/README.md b/site/assets/libs/README.md index 230fe7d5..ef4b252e 100644 --- a/site/assets/libs/README.md +++ b/site/assets/libs/README.md @@ -9,8 +9,9 @@ The checkout uses locally hosted copies of these browser libraries: Their CSS distributions live under `site/assets/scss/libs/`. Hugo compiles the CSS into the site stylesheet and fingerprints the JavaScript resources in production. -The generated script tags include Subresource Integrity metadata. The original -library license notices remain in the distributed files. +The generated script tags include Subresource Integrity metadata. The vendored +JavaScript license notices remain in the distributed files; the upstream CSS +distributions do not include equivalent banner comments. Library version changes require a dedicated dependency update and checkout UI regression testing. diff --git a/site/assets/scss/pages/_checkout.scss b/site/assets/scss/pages/_checkout.scss index d1913f98..73aadf6e 100644 --- a/site/assets/scss/pages/_checkout.scss +++ b/site/assets/scss/pages/_checkout.scss @@ -1,4 +1,4 @@ -/* +/*! * Copyright 2026, TeamDev. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/site/config/_default/hugo.toml b/site/config/_default/hugo.toml index 2205a71f..c15de947 100644 --- a/site/config/_default/hugo.toml +++ b/site/config/_default/hugo.toml @@ -22,7 +22,6 @@ disableKinds = ['taxonomy', 'term'] [params.payment] consentURL = 'https://us-central1-spine-site-server.cloudfunctions.net/api/consent' paygateURL = 'https://paygate.teamdev.com' - standardSupportProductId = 'spine-standard-support' reCaptchaKey = '6Lef7b0ZAAAAAHPIbf6XQIzzeyCoSzS56GTej1c0' [params.libs.docsearch] diff --git a/site/content/checkout-completed/index.md b/site/content/checkout-completed/index.md index 94a19649..4ee55acc 100644 --- a/site/content/checkout-completed/index.md +++ b/site/content/checkout-completed/index.md @@ -2,6 +2,7 @@ title: Payment Result description: Current payment result for a checkout order. body_class: checkout-page checkout-completed-page +customjs: js/pages/checkout/completed.js header_type: fixed-header sitemap: disable: true diff --git a/site/layouts/404.html b/site/layouts/404.html index d2868e3a..010011a9 100644 --- a/site/layouts/404.html +++ b/site/layouts/404.html @@ -16,10 +16,10 @@ "The page you are looking for could not be found." "Please check the address or return to the home page." ) - "action" (dict + "actions" (slice (dict "label" "Back to home" "url" site.Home.RelPermalink - ) + )) ) }}
              diff --git a/site/layouts/_partials/components/result-panel.html b/site/layouts/_partials/components/result-panel.html index a21ab75d..59783500 100644 --- a/site/layouts/_partials/components/result-panel.html +++ b/site/layouts/_partials/components/result-panel.html @@ -31,7 +31,6 @@ {{ $mark := .mark }} {{ $lines := .lines | default slice }} {{ $additionalLine := .additional_line | default "" }} -{{ $action := .action }} {{ $actions := .actions | default slice }}
              @@ -55,17 +54,8 @@

              {{ $title }}

              {{ with $additionalLine }}

              {{ . }}

              {{ end }} - {{ if or $action $actions }} + {{ if $actions }}
              - {{ with $action }} - {{ $actionLabel := .label | default .text | default "" }} - {{ $actionUrl := .url | default site.Home.RelPermalink }} - {{ if $actionLabel }} - - {{ $actionLabel }} - - {{ end }} - {{ end }} {{ range $actions }} {{ $actionLabel := .label | default .text | default "" }} {{ $actionUrl := .url | default site.Home.RelPermalink }} diff --git a/site/layouts/_partials/getting-help/services.html b/site/layouts/_partials/getting-help/services.html index ad838321..e6659e8e 100644 --- a/site/layouts/_partials/getting-help/services.html +++ b/site/layouts/_partials/getting-help/services.html @@ -41,9 +41,9 @@

              {{ $data.title | markdownify }}

              {{ $comparableServices := $data.comparable_services }} {{ range $comparableServices.header_cols }} - {{ $productId := .paygate_product_id }} - {{ if eq $productId "spine-standard-support" }} - {{ $productId = site.Params.payment.standardsupportproductid | default $productId }} + {{ $productId := .paygate_product_id | default "" }} + {{ with site.Params.payment.standardsupportproductid }} + {{ $productId = . }} {{ end }}
              diff --git a/site/layouts/_partials/scripts/script.html b/site/layouts/_partials/scripts/script.html index 311797df..9eda603d 100644 --- a/site/layouts/_partials/scripts/script.html +++ b/site/layouts/_partials/scripts/script.html @@ -31,9 +31,13 @@ {{ $js := .js }} {{ $attributes := .attributes }} +{{ $skipMinify := .skip_minify | default false }} {{ if hugo.IsProduction }} - {{ $js = $js | minify | fingerprint }} + {{ if not $skipMinify }} + {{ $js = $js | minify }} + {{ end }} + {{ $js = $js | fingerprint }} -{{ else }} - -{{ end }} diff --git a/site/layouts/checkout/single.html b/site/layouts/checkout/single.html index eb3ded87..37c5fa94 100644 --- a/site/layouts/checkout/single.html +++ b/site/layouts/checkout/single.html @@ -236,22 +236,12 @@

              Billing details

              - {{ $select2 := resources.Get "libs/country-select/select2.js" }} - {{ partial "scripts/script.html" (dict - "js" $select2 - "attributes" "defer" - "skip_minify" true - ) }} - {{ $phoneUtils := resources.Get "libs/intl-tel-input/utils.js" }} - {{ partial "scripts/script.html" (dict - "js" $phoneUtils - "attributes" "defer" - "skip_minify" true - ) }} - {{ $internationalPhoneInput := resources.Get "libs/intl-tel-input/intlTelInput.js" }} - {{ partial "scripts/script.html" (dict - "js" $internationalPhoneInput - "attributes" "defer" - "skip_minify" true - ) }} + + + + {{ end }} diff --git a/site/assets/libs/country-select/select2.js b/site/static/libs/country-select/select2.min.js similarity index 100% rename from site/assets/libs/country-select/select2.js rename to site/static/libs/country-select/select2.min.js diff --git a/site/assets/libs/intl-tel-input/intlTelInput.js b/site/static/libs/intl-tel-input/intlTelInput.min.js similarity index 100% rename from site/assets/libs/intl-tel-input/intlTelInput.js rename to site/static/libs/intl-tel-input/intlTelInput.min.js diff --git a/site/assets/libs/intl-tel-input/utils.js b/site/static/libs/intl-tel-input/utils.js similarity index 100% rename from site/assets/libs/intl-tel-input/utils.js rename to site/static/libs/intl-tel-input/utils.js diff --git a/site/tests/checkout-configuration.test.mjs b/site/tests/checkout-configuration.test.mjs index 49243d41..07dee4ce 100644 --- a/site/tests/checkout-configuration.test.mjs +++ b/site/tests/checkout-configuration.test.mjs @@ -57,7 +57,7 @@ const {createChargeController} = await importChargeController(); test('keep checkout libraries aligned with pinned npm distributions', () => { assert.deepEqual( - readFile('../assets/libs/country-select/select2.js'), + readFile('../static/libs/country-select/select2.min.js'), readFile('../node_modules/select2/dist/js/select2.min.js') ); assert.deepEqual( @@ -65,11 +65,11 @@ test('keep checkout libraries aligned with pinned npm distributions', () => { readFile('../node_modules/select2/dist/css/select2.min.css') ); assert.deepEqual( - readFile('../assets/libs/intl-tel-input/intlTelInput.js'), + readFile('../static/libs/intl-tel-input/intlTelInput.min.js'), readFile('../node_modules/intl-tel-input/build/js/intlTelInput.min.js') ); assert.deepEqual( - readFile('../assets/libs/intl-tel-input/utils.js'), + readFile('../static/libs/intl-tel-input/utils.js'), readFile('../node_modules/intl-tel-input/build/js/utils.js') ); @@ -203,6 +203,48 @@ test('build Paygate phone data from the shared international input', () => { assert.equal(normalizeIntlPhoneNumber('5550100', '', ''), null); }); +test('load phone validation utilities next to the static library', () => { + const originalDocument = globalThis.document; + const originalWindow = globalThis.window; + const phoneField = {}; + let libraryOptions; + globalThis.document = { + querySelector: () => ({ + src: 'https://spine.io/libs/intl-tel-input/intlTelInput.min.js' + }) + }; + globalThis.window = { + intlTelInput(field, options) { + assert.equal(field, phoneField); + libraryOptions = options; + }, + intlTelInputGlobals: { + getInstance: () => ({ + getSelectedCountryData: () => ({iso2: 'us'}) + }) + } + }; + + try { + const controller = createCheckoutFormController({ + dom: { + $phoneNumber: {get: () => phoneField}, + $phoneCountry: {val: () => 'US'} + } + }); + + controller.initPhoneNumberField(); + + assert.equal( + libraryOptions.utilsScript, + 'https://spine.io/libs/intl-tel-input/utils.js' + ); + } finally { + globalThis.document = originalDocument; + globalThis.window = originalWindow; + } +}); + test('allow an optional phone number while validation utilities are loading', () => { const originalWindow = globalThis.window; let validityMessage = ''; From 4a6c580ecb65951cfde8f16f7afe4bcb228300ab Mon Sep 17 00:00:00 2001 From: Vladyslav Kuksiuk Date: Fri, 14 Aug 2026 13:21:30 +0200 Subject: [PATCH 14/17] Improve readability. --- site/assets/scss/pages/_checkout.scss | 4 +- .../_partials/components/result-panel.html | 48 +++++++++---------- site/layouts/checkout-completed/single.html | 8 ++-- site/layouts/checkout/single.html | 16 ++++--- 4 files changed, 41 insertions(+), 35 deletions(-) diff --git a/site/assets/scss/pages/_checkout.scss b/site/assets/scss/pages/_checkout.scss index 09d636ab..d62b6744 100644 --- a/site/assets/scss/pages/_checkout.scss +++ b/site/assets/scss/pages/_checkout.scss @@ -146,8 +146,8 @@ $checkout-panel-width: 790px; .checkout-summary-product { max-width: 100%; padding-bottom: 8px; - color: $text-color; - font-size: 42px; + color: rgba(black, .4); + font-size: $font-size--xxxl; font-weight: 300; letter-spacing: 0; line-height: 1.12; diff --git a/site/layouts/_partials/components/result-panel.html b/site/layouts/_partials/components/result-panel.html index 12a16fee..b852a08e 100644 --- a/site/layouts/_partials/components/result-panel.html +++ b/site/layouts/_partials/components/result-panel.html @@ -35,38 +35,38 @@
              {{ with $mark }} - {{ $markText := .text | default .content | default "" }} - {{ $markClass := .icon_class | default "" }} - + {{ $markText := .text | default .content | default "" }} + {{ $markClass := .icon_class | default "" }} + {{ end }} {{ if $titleAsH1 }} -

              {{ $title }}

              +

              {{ $title }}

              {{ else }} -

              {{ $title }}

              +

              {{ $title }}

              {{ end }} {{ if $lines }} -

              - {{ range $lines }} - {{ . }} - {{ end }} -

              +

              + {{ range $lines }} + {{ . | markdownify }} + {{ end }} +

              {{ end }} {{ with $additionalLine }} -

              {{ . }}

              +

              {{ . | markdownify }}

              {{ end }} {{ if $actions }} -
              - {{ range $actions }} - {{ $actionLabel := .label | default .text | default "" }} - {{ $actionUrl := .url | default site.Home.RelPermalink }} - {{ if $actionLabel }} - - {{ $actionLabel }} - - {{ end }} - {{ end }} -
              +
              + {{ range $actions }} + {{ $actionLabel := .label | default .text | default "" }} + {{ $actionUrl := .url | default site.Home.RelPermalink }} + {{ if $actionLabel }} + + {{ $actionLabel }} + + {{ end }} + {{ end }} +
              {{ end }}
              diff --git a/site/layouts/checkout-completed/single.html b/site/layouts/checkout-completed/single.html index 33716c6b..55abf9aa 100644 --- a/site/layouts/checkout-completed/single.html +++ b/site/layouts/checkout-completed/single.html @@ -1,8 +1,10 @@ {{ define "main" }} {{ partial "components/navbar/navbar.html" . }} - {{ $email := hugo.Data.emails.sales_email }} - {{ $contactLine := printf "If you have any questions, email us at %s." $email $email | safeHTML }} - {{ $missingOrderContactLine := printf "Please check the address or contact %s." $email $email | safeHTML }} + {{ $salesEmail := hugo.Data.emails.sales_email }} + {{ $salesEmailLink := (printf "{{< cloakemail address=\"%s\" >}}" $salesEmail) }} + + {{ $contactLine := printf "If you have any questions, email us at %s." $salesEmailLink }} + {{ $missingOrderContactLine := printf "Please check the address or contact %s." $salesEmailLink }}
              diff --git a/site/layouts/checkout/single.html b/site/layouts/checkout/single.html index 37c5fa94..e0f1ef97 100644 --- a/site/layouts/checkout/single.html +++ b/site/layouts/checkout/single.html @@ -1,8 +1,9 @@ {{ define "main" }} {{ partial "components/navbar/navbar.html" . }} - {{ $email := hugo.Data.emails.sales_email }} - {{ $emailLink := printf "%s" $email $email | safeHTML }} - {{ $missingOrderContactLine := printf "Please check the address or contact %s." $email $email | safeHTML }} + {{ $salesEmail := hugo.Data.emails.sales_email }} + {{ $salesEmailLink := (printf "{{< cloakemail address=\"%s\" >}}" $salesEmail) }} + + {{ $missingOrderContactLine := printf "Please check the address or contact %s." $salesEmailLink }}
              @@ -187,7 +188,8 @@

              Billing details

              Something went wrong

              - Something went wrong, please contact {{ $emailLink }}. + Something went wrong, please contact + {{ $salesEmailLink | markdownify }}.

              @@ -195,7 +197,9 @@

              Billing details

              {{ partial "components/result-panel.html" (dict "title" "Order required" "title_as_h1" true - "lines" (slice (printf "Please contact %s to place an order." $email)) + "lines" (slice + (printf "Please contact %s to place an order." $salesEmailLink) + ) "actions" (slice (dict "label" "Back to home" "url" site.Home.RelPermalink @@ -223,7 +227,7 @@

              Billing details

              "title_as_h1" true "lines" (slice "Something went wrong." - (printf "Please contact %s." $email) + (printf "Please contact %s." $salesEmailLink) ) "actions" (slice (dict "label" "Back to home" From b459e88b5f1d64ea6a71ae1c819e9326adf9a6b8 Mon Sep 17 00:00:00 2001 From: Vladyslav Kuksiuk Date: Fri, 14 Aug 2026 14:00:20 +0200 Subject: [PATCH 15/17] Fix loading stuck. --- site/assets/js/pages/pricing.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/site/assets/js/pages/pricing.js b/site/assets/js/pages/pricing.js index 3c934aaa..ee2d7aa4 100644 --- a/site/assets/js/pages/pricing.js +++ b/site/assets/js/pages/pricing.js @@ -1,11 +1,11 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2026, TeamDev. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * * Redistribution and use in source and/or binary forms, with or without * modification, must retain the above copyright notice and the following @@ -97,6 +97,12 @@ $( hideRedirect(); }); + window.addEventListener('pageshow', event => { + if (event.persisted) { + hideRedirect(); + } + }); + /** * Checks if all consent checkboxes are checked. * From b53ea4d1adc8e47fc10ec4e2d49fadce82fd9c6c Mon Sep 17 00:00:00 2001 From: Julia Evseeva Date: Fri, 14 Aug 2026 14:12:14 +0200 Subject: [PATCH 16/17] Clean up button styles to avoid Bootstrap overrides --- site/assets/scss/modules/_buttons.scss | 101 ++++++++---------- site/assets/scss/modules/_call-to-action.scss | 2 +- 2 files changed, 48 insertions(+), 55 deletions(-) diff --git a/site/assets/scss/modules/_buttons.scss b/site/assets/scss/modules/_buttons.scss index 89b4f31a..cafcf833 100644 --- a/site/assets/scss/modules/_buttons.scss +++ b/site/assets/scss/modules/_buttons.scss @@ -25,25 +25,28 @@ */ $btn-font-size: 14px; +$btn-border-radius: $border-radius-m; +$btn-primary-color: $main-brand-color; $btn-primary-hover-color: #5fabdd; .btn { display: inline-block; + padding: 14px 32px; font-size: $btn-font-size; font-weight: bold; text-align: center; - padding: 14px 32px; - border-radius: $border-radius-m; text-transform: uppercase; + letter-spacing: 1px; + border-radius: $btn-border-radius; cursor: pointer; transition: all .34s ease-in-out; &:hover { - outline: none; text-decoration: none; } - &:focus { + &:focus, + &:focus-visible { text-decoration: none; box-shadow: none; outline: 1px dotted; @@ -62,65 +65,55 @@ $btn-primary-hover-color: #5fabdd; cursor: pointer; } -.icon-caret { - background: url('img/icons/caret.svg') no-repeat center/cover; - height: 20px; - margin: 3px auto 0; - width: 24px; +.btn-primary-blue { + --bs-btn-color: #{$white}; + --bs-btn-bg: #{$btn-primary-color}; + --bs-btn-border-color: #{$btn-primary-color}; - @include breakpoint-min(tablet) { - height: 45px; - width: 45px; - } -} + --bs-btn-hover-color: #{$white}; + --bs-btn-hover-bg: #{$btn-primary-hover-color}; + --bs-btn-hover-border-color: #{$btn-primary-hover-color}; -.external-link-icon { - background: url('img/icons/external-link.svg') no-repeat center/cover; - width: 15px; - height: 15px; -} + --bs-btn-active-color: #{$white}; + --bs-btn-active-bg: #{$btn-primary-color}; + --bs-btn-active-border-color: #{$btn-primary-color}; -.btn-doc-call-white { - color: $white; - border: 1px solid $white; - background-color: transparent; - border-radius: $border-radius-s; - padding: 12px 56px; - - &:hover, &:focus { - color: white; - background-color: rgba($link-blue-color, .2); - border: 1px solid $link-blue-color; - box-shadow: 0 5px 20px 0 rgba($footer-color, .28); - } + --bs-btn-disabled-color: #{$white}; + --bs-btn-disabled-bg: #{$btn-primary-color}; + --bs-btn-disabled-border-color: #{$btn-primary-color}; + + border-width: 2px; } -.btn-primary-blue, -.btn-primary-blue:visited { - letter-spacing: 1px; - color: white; - background-color: $main-brand-color; - border: 2px solid $main-brand-color; +.btn-bordered-blue { + --bs-btn-color: #{$btn-primary-color}; + --bs-btn-bg: transparent; + --bs-btn-border-color: #{$btn-primary-color}; - &:hover, - &:focus { - color: white; - background-color: $btn-primary-hover-color; - border-color: $btn-primary-hover-color; - } + --bs-btn-hover-color: #{$btn-primary-color}; + --bs-btn-hover-bg: rgba(26, 150, 222, .12); + --bs-btn-hover-border-color: #{$btn-primary-color}; + + --bs-btn-active-color: #{$btn-primary-color}; + --bs-btn-active-bg: transparent; + --bs-btn-active-border-color: #{$btn-primary-color}; + + --bs-btn-disabled-color: #{$gray-600}; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #{$gray-600}; + + border-width: 2px; } -.btn-bordered-blue, -.btn-bordered-blue:visited { - letter-spacing: 1px; - color: $main-brand-color; - border: 2px solid $main-brand-color; +.icon-caret { + background: url('img/icons/caret.svg') no-repeat center/cover; + height: 20px; + margin: 3px auto 0; + width: 24px; - &:hover, - &:focus { - background-color: rgba($main-brand-color, .12); - color: $main-brand-color; - border: 2px solid $main-brand-color; + @include breakpoint-min(tablet) { + height: 45px; + width: 45px; } } diff --git a/site/assets/scss/modules/_call-to-action.scss b/site/assets/scss/modules/_call-to-action.scss index 3292efc9..229e5a95 100644 --- a/site/assets/scss/modules/_call-to-action.scss +++ b/site/assets/scss/modules/_call-to-action.scss @@ -52,7 +52,7 @@ background-color: transparent; text-transform: uppercase; border: 1px solid $white; - border-radius: $border-radius-s; + border-radius: $border-radius-m; padding: 12px 56px; margin: 40px auto 0; From 4a386cf67b8f747a31d691414be9d61fbb31e6be Mon Sep 17 00:00:00 2001 From: Vladyslav Kuksiuk Date: Fri, 14 Aug 2026 17:38:28 +0200 Subject: [PATCH 17/17] Improve readability. --- .github/workflows/check-links.yml | 5 - .github/workflows/checkout-tests.yml | 27 ++++ site/assets/js/pages/checkout/countries.js | 4 +- .../js/pages/checkout/form-controller.js | 11 +- site/assets/js/pages/checkout/index.js | 16 ++- site/assets/js/pages/checkout/navigation.js | 17 +++ .../js/pages/checkout/view-controller.js | 66 +++++---- site/assets/scss/pages/_checkout.scss | 7 +- .../_partials/getting-help/services.html | 6 +- site/tests/checkout-configuration.test.mjs | 131 ++++++++++++++++-- 10 files changed, 220 insertions(+), 70 deletions(-) create mode 100644 .github/workflows/checkout-tests.yml diff --git a/.github/workflows/check-links.yml b/.github/workflows/check-links.yml index e8fde000..a6779543 100644 --- a/.github/workflows/check-links.yml +++ b/.github/workflows/check-links.yml @@ -108,11 +108,6 @@ jobs: working-directory: ${{ steps.docs.outputs.work_dir }} run: npm ci - - name: Run checkout tests - if: steps.docs.outputs.present == 'true' - working-directory: ${{ steps.docs.outputs.work_dir }} - run: npm test - - name: Build docs preview site if: steps.docs.outputs.present == 'true' working-directory: ${{ steps.docs.outputs.work_dir }} diff --git a/.github/workflows/checkout-tests.yml b/.github/workflows/checkout-tests.yml new file mode 100644 index 00000000..e188e904 --- /dev/null +++ b/.github/workflows/checkout-tests.yml @@ -0,0 +1,27 @@ +name: Checkout tests + +on: + pull_request: + workflow_dispatch: + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: '26' + cache: 'npm' + cache-dependency-path: site/package-lock.json + + - name: Install dependencies + working-directory: site + run: npm ci + + - name: Run checkout tests + working-directory: site + run: npm test diff --git a/site/assets/js/pages/checkout/countries.js b/site/assets/js/pages/checkout/countries.js index 8d10a1e6..a3716411 100644 --- a/site/assets/js/pages/checkout/countries.js +++ b/site/assets/js/pages/checkout/countries.js @@ -61,9 +61,11 @@ export function populateCountrySelect(select) { name: displayNames ? displayNames.of(code) : code })).sort((first, second) => first.name.localeCompare(second.name)); + const options = document.createDocumentFragment(); countries.forEach(country => { - select.add(new Option(country.name, country.code)); + options.append(new Option(country.name, country.code)); }); + select.append(options); } /** diff --git a/site/assets/js/pages/checkout/form-controller.js b/site/assets/js/pages/checkout/form-controller.js index 39069089..84ce4461 100644 --- a/site/assets/js/pages/checkout/form-controller.js +++ b/site/assets/js/pages/checkout/form-controller.js @@ -32,6 +32,9 @@ import {normalizeIntlPhoneNumber} from 'js/modules/forms/phone-number'; const intlTelInputScriptSelector = 'script[src*="libs/intl-tel-input/intlTelInput.min.js"]'; +/** Default phone country used before the user selects a billing country. */ +export const defaultPhoneCountryCode = 'US'; + /** * Generic async field-validation states. */ @@ -105,8 +108,10 @@ export function createCheckoutFormController({dom}) { return; } + const initialCountry = normalizeCountryCode(dom.$phoneCountry.val()) || + defaultPhoneCountryCode; window.intlTelInput(field, { - initialCountry: normalizeCountryCode(dom.$phoneCountry.val()) || 'us', + initialCountry: initialCountry.toLowerCase(), autoPlaceholder: 'aggressive', separateDialCode: true, formatOnDisplay: true, @@ -174,10 +179,6 @@ export function createCheckoutFormController({dom}) { return true; } - if (field.type === 'tel') { - return true; - } - const value = field.value ? field.value.trim() : ''; let message = ''; diff --git a/site/assets/js/pages/checkout/index.js b/site/assets/js/pages/checkout/index.js index 5406934a..886646d4 100644 --- a/site/assets/js/pages/checkout/index.js +++ b/site/assets/js/pages/checkout/index.js @@ -32,10 +32,14 @@ import {createChargeController} from 'js/pages/checkout/charge-controller'; import {getCompletedPageUrl} from 'js/pages/checkout/completed-page-url'; import {initializeCountrySelector} from 'js/pages/checkout/countries'; import {getCheckoutDom} from 'js/pages/checkout/dom'; -import {createCheckoutFormController} from 'js/pages/checkout/form-controller'; +import { + createCheckoutFormController, + defaultPhoneCountryCode +} from 'js/pages/checkout/form-controller'; import { checkoutNavigationMode, - getCheckoutNavigationMode + getCheckoutNavigationMode, + getRestoredPhoneCountryManualState } from 'js/pages/checkout/navigation'; import {getOrderId} from 'js/pages/checkout/order-id'; import {createCheckoutView} from 'js/pages/checkout/view-controller'; @@ -248,9 +252,9 @@ $( window.setTimeout(() => { const restoredState = formController.getBrowserRestoredCountryState(); - phoneCountryManuallySelected = Boolean( - restoredState.phoneCountryCode && - restoredState.phoneCountryCode !== restoredState.billingCountryCode + phoneCountryManuallySelected = getRestoredPhoneCountryManualState( + phoneCountryManuallySelected, + restoredState ); formController.restoreCountryState(restoredState); formController.updateVatIdFieldState(); @@ -264,7 +268,7 @@ $( phoneCountryManuallySelected = false; formController.restoreCountryState({ billingCountryCode: '', - phoneCountryCode: 'US' + phoneCountryCode: defaultPhoneCountryCode }); dom.$phoneNumber.val(''); dom.$vatId.val(''); diff --git a/site/assets/js/pages/checkout/navigation.js b/site/assets/js/pages/checkout/navigation.js index 0a32355a..9d29ed19 100644 --- a/site/assets/js/pages/checkout/navigation.js +++ b/site/assets/js/pages/checkout/navigation.js @@ -42,3 +42,20 @@ export function getCheckoutNavigationMode(navigationType, pagePersisted = false) } return checkoutNavigationMode.none; } + +/** + * Restores whether the phone country should remain independent from billing country. + * + * @param {boolean} wasManuallySelected state retained by a cached page + * @param {Object} restoredState country values restored by the browser + * @return {boolean} whether billing-country changes should leave phone country unchanged + */ +export function getRestoredPhoneCountryManualState(wasManuallySelected, restoredState) { + const billingCountryCode = restoredState && restoredState.billingCountryCode; + const phoneCountryCode = restoredState && restoredState.phoneCountryCode; + + return Boolean( + wasManuallySelected || + billingCountryCode && phoneCountryCode && phoneCountryCode !== billingCountryCode + ); +} diff --git a/site/assets/js/pages/checkout/view-controller.js b/site/assets/js/pages/checkout/view-controller.js index 57478e74..e97aa751 100644 --- a/site/assets/js/pages/checkout/view-controller.js +++ b/site/assets/js/pages/checkout/view-controller.js @@ -65,6 +65,21 @@ * @return {CheckoutViewController} view update helpers for the checkout page */ export function createCheckoutView(dom) { + const pageElements = [ + dom.$loading, + dom.$summary, + dom.$form, + dom.$missingOrder, + dom.$notFound, + dom.$summaryError + ]; + const pageViews = { + loading: {elements: [dom.$loading], isResultPage: false}, + checkout: {elements: [dom.$summary, dom.$form], isResultPage: false}, + missingOrder: {elements: [dom.$missingOrder], isResultPage: true}, + notFound: {elements: [dom.$notFound], isResultPage: true}, + summaryError: {elements: [dom.$summaryError], isResultPage: true} + }; /** * Enables or disables the checkout submit button. @@ -128,50 +143,26 @@ export function createCheckoutView(dom) { * Shows the order-summary loading state. */ function showSummaryLoading() { - setResultPageMode(false); - dom.$summary.prop('hidden', true); - dom.$loading.prop('hidden', false); - dom.$form.prop('hidden', true); - dom.$missingOrder.prop('hidden', true); - dom.$notFound.prop('hidden', true); - dom.$summaryError.prop('hidden', true); + showPageView('loading'); } /** * Shows the generic summary error panel inside the checkout page. */ function showSummaryError() { - setResultPageMode(true); - dom.$loading.prop('hidden', true); - dom.$summary.prop('hidden', true); - dom.$form.prop('hidden', true); - dom.$missingOrder.prop('hidden', true); - dom.$notFound.prop('hidden', true); - dom.$summaryError.prop('hidden', false); + showPageView('summaryError'); } /** Shows the resolved order summary and billing form. */ function showCheckoutView() { - setResultPageMode(false); closeErrorModal(); - dom.$loading.prop('hidden', true); - dom.$summary.prop('hidden', false); - dom.$form.prop('hidden', false); - dom.$missingOrder.prop('hidden', true); - dom.$notFound.prop('hidden', true); - dom.$summaryError.prop('hidden', true); + showPageView('checkout'); } /** Shows the missing-order result panel. */ function showMissingOrderView() { - setResultPageMode(true); closeErrorModal(); - dom.$loading.prop('hidden', true); - dom.$summary.prop('hidden', true); - dom.$form.prop('hidden', true); - dom.$notFound.prop('hidden', true); - dom.$summaryError.prop('hidden', true); - dom.$missingOrder.prop('hidden', false); + showPageView('missingOrder'); } /** @@ -192,14 +183,19 @@ export function createCheckoutView(dom) { * Shows the not-found result panel inside the checkout page. */ function showNotFoundView() { - setResultPageMode(true); closeErrorModal(); - dom.$loading.prop('hidden', true); - dom.$summary.prop('hidden', true); - dom.$form.prop('hidden', true); - dom.$missingOrder.prop('hidden', true); - dom.$summaryError.prop('hidden', true); - dom.$notFound.prop('hidden', false); + showPageView('notFound'); + } + + /** Shows one checkout page state and hides every other state panel. */ + function showPageView(viewName) { + const view = pageViews[viewName]; + const visibleElements = new Set(view.elements); + + pageElements.forEach(element => { + element.prop('hidden', !visibleElements.has(element)); + }); + setResultPageMode(view.isResultPage); } /** Matches checkout result-page height to the payment-result layout. */ diff --git a/site/assets/scss/pages/_checkout.scss b/site/assets/scss/pages/_checkout.scss index d62b6744..e22a7b24 100644 --- a/site/assets/scss/pages/_checkout.scss +++ b/site/assets/scss/pages/_checkout.scss @@ -244,16 +244,11 @@ $checkout-panel-width: 790px; grid-column: 1 / -1; } - .form-input, - .form-select { + .form-input { width: 100%; min-height: 48px; } - .form-select { - appearance: auto; - } - .form-submit-button { min-height: 48px; } diff --git a/site/layouts/_partials/getting-help/services.html b/site/layouts/_partials/getting-help/services.html index e6659e8e..96542c42 100644 --- a/site/layouts/_partials/getting-help/services.html +++ b/site/layouts/_partials/getting-help/services.html @@ -42,8 +42,10 @@

              {{ $data.title | markdownify }}

              {{ $comparableServices := $data.comparable_services }} {{ range $comparableServices.header_cols }} {{ $productId := .paygate_product_id | default "" }} - {{ with site.Params.payment.standardsupportproductid }} - {{ $productId = . }} + {{ if $productId }} + {{ with site.Params.payment.standardsupportproductid }} + {{ $productId = . }} + {{ end }} {{ end }}
              diff --git a/site/tests/checkout-configuration.test.mjs b/site/tests/checkout-configuration.test.mjs index 07dee4ce..2a9bf271 100644 --- a/site/tests/checkout-configuration.test.mjs +++ b/site/tests/checkout-configuration.test.mjs @@ -39,7 +39,8 @@ const { ); const { checkoutNavigationMode, - getCheckoutNavigationMode + getCheckoutNavigationMode, + getRestoredPhoneCountryManualState } = await importSource( '../assets/js/pages/checkout/navigation.js' ); @@ -49,7 +50,10 @@ const {isEuCountry} = await importSource( const {normalizeIntlPhoneNumber} = await importSource( '../assets/js/modules/forms/phone-number.js' ); -const {createCheckoutFormController} = await importFormController(); +const { + createCheckoutFormController, + defaultPhoneCountryCode +} = await importFormController(); const {createCheckoutView} = await importSource( '../assets/js/pages/checkout/view-controller.js' ); @@ -114,7 +118,19 @@ test('calculate charges without requiring a VAT ID', () => { }); test('offer the complete ISO billing-country list', () => { + const OriginalDocument = globalThis.document; const OriginalOption = globalThis.Option; + let appendCount = 0; + globalThis.document = { + createDocumentFragment() { + return { + children: [], + append(option) { + this.children.push(option); + } + }; + } + }; globalThis.Option = class { constructor(text, value) { this.text = text; @@ -125,18 +141,21 @@ test('offer the complete ISO billing-country list', () => { try { const select = { options: [{text: 'Select country', value: ''}], - add(option) { - this.options.push(option); + append(fragment) { + appendCount += 1; + this.options.push(...fragment.children); } }; populateCountrySelect(select); assert.ok(select.options.length > 240); + assert.equal(appendCount, 1); for (const countryCode of ['AU', 'BR', 'CA', 'CN', 'EE', 'GB', 'JP', 'US', 'ZA']) { assert.ok(select.options.some(option => option.value === countryCode)); } } finally { + globalThis.document = OriginalDocument; globalThis.Option = OriginalOption; } }); @@ -183,6 +202,30 @@ test('restore checkout fields only for browser history navigation', () => { ); }); +test('preserve only genuine manual phone-country selection after history restore', () => { + assert.equal( + getRestoredPhoneCountryManualState(false, { + billingCountryCode: '', + phoneCountryCode: defaultPhoneCountryCode + }), + false + ); + assert.equal( + getRestoredPhoneCountryManualState(false, { + billingCountryCode: 'DE', + phoneCountryCode: 'US' + }), + true + ); + assert.equal( + getRestoredPhoneCountryManualState(true, { + billingCountryCode: 'DE', + phoneCountryCode: 'DE' + }), + true + ); +}); + test('show VAT ID only for EU billing countries', () => { assert.equal(isEuCountry('EE'), true); assert.equal(isEuCountry('DE'), true); @@ -239,6 +282,7 @@ test('load phone validation utilities next to the static library', () => { libraryOptions.utilsScript, 'https://spine.io/libs/intl-tel-input/utils.js' ); + assert.equal(libraryOptions.initialCountry, 'us'); } finally { globalThis.document = originalDocument; globalThis.window = originalWindow; @@ -422,6 +466,25 @@ test('clear a required-field error while the user edits the field', () => { assert.equal(errorElement.textContent, ''); }); +test('reject an empty required phone field', () => { + const errorElement = {textContent: ''}; + const fieldContainer = { + classList: {toggle() {}}, + querySelector: () => errorElement + }; + const field = { + disabled: false, + required: true, + type: 'tel', + value: '', + closest: selector => selector === '[hidden]' ? null : fieldContainer + }; + const controller = createCheckoutFormController({dom: {}}); + + assert.equal(controller.validateField(field), false); + assert.equal(errorElement.textContent, 'This field is required.'); +}); + test('ignore an obsolete charge failure after newer charges succeed', async () => { const requests = []; const updatedCharges = []; @@ -497,6 +560,36 @@ test('render a safe rounded VAT label and tolerate missing order money', () => { assert.equal(dom.$vatLabel.value, 'VAT'); }); +test('show one checkout page state at a time', () => { + const originalDocument = globalThis.document; + let isResultPage = false; + globalThis.document = { + body: { + classList: { + toggle(className, enabled) { + assert.equal(className, 'checkout-result-page'); + isResultPage = enabled; + } + } + } + }; + + try { + const dom = createSummaryDom(); + const view = createCheckoutView(dom); + + view.showCheckoutView(); + assertVisiblePageElements(dom, ['$summary', '$form']); + assert.equal(isResultPage, false); + + view.showNotFoundView(); + assertVisiblePageElements(dom, ['$notFound']); + assert.equal(isResultPage, true); + } finally { + globalThis.document = originalDocument; + } +}); + async function importSource(relativePath) { const source = fs.readFileSync(new URL(relativePath, import.meta.url), 'utf8'); return import(`data:text/javascript,${encodeURIComponent(source)}`); @@ -520,12 +613,7 @@ async function importChargeController() { ).replace(/^import .*;\n/gm, ''); const dependencies = ` const fieldValidationState = {idle: 'idle', loading: 'loading', success: 'success'}; - const buildChargeRequest = (orderId, buyerCountryCode, vatId) => { - if (!orderId || !buyerCountryCode) return null; - return vatId - ? {orderId, buyerCountryCode, vatId} - : {orderId, buyerCountryCode}; - }; + const buildChargeRequest = ${buildChargeRequest.toString()}; `; const source = [delayedRequestSource, dependencies, chargeControllerSource].join('\n'); @@ -550,15 +638,38 @@ function createSummaryDom() { }); return { + $errorModal: element(), + $form: element(), + $loading: element(), + $missingOrder: element(), + $notFound: element(), $productTitle: element(), $productDescription: element(), + $summary: element(), + $summaryError: element(), $subtotalValue: element(), + $submitButton: element(), $vatLabel: element(), $vatValue: element(), $totalValue: element() }; } +function assertVisiblePageElements(dom, visibleNames) { + const pageElementNames = [ + '$loading', + '$summary', + '$form', + '$missingOrder', + '$notFound', + '$summaryError' + ]; + + for (const name of pageElementNames) { + assert.equal(dom[name].hidden, !visibleNames.includes(name), name); + } +} + async function waitUntil(predicate) { for (let attempt = 0; attempt < 20; attempt += 1) { if (predicate()) {