{"version":3,"sources":["webpack:///./cartridges/app_storefront_widgets/cartridge/client/default/js/widgets/account/PasswordResetForm.js","webpack:///./cartridges/app_storefront_widgets/cartridge/client/default/js/widgets/forms/AddressForm.js","webpack:///./cartridges/app_storefront_widgets/cartridge/client/default/js/widgets/forms/GoogleAutocompleteField.js","webpack:///./cartridges/app_storefront_widgets/cartridge/client/default/js/widgets/toolbox/googleMgr.js"],"names":["AjaxForm","PasswordResetForm","onSubmitted","data","success","emitWithoutContext","AddressForm","prefs","addressFields","addressAutocompleteEnabled","addressAutocompleteProvider","onCountryChange","el","config","countryCode","getValue","updateFormData","then","updateAddressAutocomplete","currentSelector","document","querySelector","stateCode","postalCode","value","getAddressFields","split","handlePlaceChange","address","forEach","item","getById","addressField","name","getName","shortName","pop","setValue","autocompleteField","updateState","AutocompleteField","GoogleAutocompleteField","init","inited","handleFocus","initGoogleMapsApi","apiKey","field","ref","get","initGoogleAutocomplete","initEvents","bind","autocomplete","addListener","place","getPlace","addressComponents","address_components","parseAddress","parsedAddress","emit","setComponentRestrictions","country","googleApi","resolveGMapsFn","initialized","initializationPromise","Promise","resolve","window","googleMapsApiCallback","google","getAddressFieldsMappingConfig","address1","serviceObjectTypes","serviceObjectProperty","city","getAddressComponentByType","type","find","addressComponent","types","indexOf","getAddressField","fieldConfig","typesForMerge","aimProperty","targetAddressProperties","mergeType","Array","isArray","i","l","length","push","join","url","URL","searchParams","append","script","createElement","src","toString","async","body","appendChild","maps","places","Autocomplete","componentRestrictions","mappingConfig","Object","keys","reduce","addressObject"],"mappings":"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","file":"account.widgets~checkout.widgets.bundle.js","sourcesContent":["/**\n * @typedef {ReturnType<typeof import('widgets/forms/AjaxForm').default>} AjaxForm\n */\n\n/**\n * @param {AjaxForm} AjaxForm Base widget for extending\n * @returns {typeof PasswordResetForm} PasswordResetForm widget\n */\nexport default function (AjaxForm) {\n /**\n * @category widgets\n * @subcategory account\n * @class PasswordResetForm\n * @augments AjaxForm\n * @classdesc Represents PasswordResetForm component with next features:\n * 1. Allow fire {@link PasswordResetForm#event:submitted} event on success response from backend\n * 3. The main purpose of the widget is emit event that form was successfully submitted\n *\n * PasswordResetDialogForm widget should be a part of {@link PasswordResetModal} widgets that implement modal\n * Widget has next relationship:\n * * PasswordResetForm fire {@link PasswordResetForm#event:submitted} event that {@link PasswordResetModal} listens\n * @property {string} data-widget - Widget name `PasswordResetForm`\n * @example <caption>Example of PasswordResetForm widget usage</caption>\n * <form\n * class=\"reset-password-form\"\n * action=\"${URLUtils.url('Account-PasswordResetDialogForm', 'mobile', pdict.mobile)}\"\n * method=\"POST\"\n * name=\"email-form\"\n * id=\"email-form\"\n * data-widget=\"passwordResetForm\"\n * data-id=\"passwordResetForm\"\n * data-event-submit.prevent=\"handleSubmit\"\n * data-widget-event-submitted=\"showModal\"\n * >\n * <div data-ref=\"errorMessageLabel\"></div>\n * {{^receivedMsgBody}}\n * <isprint value=\"${\n * formElement(pdict.profileForm.resetPassword.email).render()\n * }\" encoding=\"off\"/>\n * <div class=\"b-dialog-footer m-actions\">\n * <button\n * type=\"submit\"\n * class=\"b-button m-width_full\"\n * data-widget=\"button\"\n * data-widget-event-click=\"handleSubmit\"\n * data-event-click.prevent=\"handleClick\"\n * data-ref=\"lastFocusElement\"\n * data-tau=\"forgot_password_submit\"\n * data-id=\"submitButton\"\n * >\n * ${Resource.msg('form.passwordReset.submit','forms',null)}\n * </button>\n * </div>\n * {{/receivedMsgBody}}\n * </form>\n */\n class PasswordResetForm extends AjaxForm {\n /**\n * @description Handle server response\n * @emits PasswordResetForm#submitted\n * @param {object} data - response data\n * @returns {void}\n */\n onSubmitted(data) {\n if (data.success) {\n /**\n * @description Event to submitted form\n * @event PasswordResetForm#submitted\n */\n this.emitWithoutContext('submitted', data);\n } else {\n super.onSubmitted(data);\n }\n }\n }\n\n return PasswordResetForm;\n}\n","/**\n * @typedef {ReturnType<typeof import('widgets/forms/AjaxForm').default>} AjaxForm\n * @typedef {InstanceType<ReturnType<typeof import('widgets/forms/BasicInput').default>>} basicInput\n *\n */\n\n/**\n * @param {AjaxForm} AjaxForm Base widget for extending\n * @returns {typeof AddressForm} Address Form widget\n */\nexport default function (AjaxForm) {\n /**\n * @category widgets\n * @subcategory forms\n * @class AddressForm\n * @augments AjaxForm\n * @classdesc Address form component with next features:\n * 1. Initiates form definition update and autocomplete config on country change event.\n * 2. After triggering state change on address autocomplete field, filles address fields with autocomplete data\n *\n * Widget has next relationship:\n * * After country changing updates autocomplete config by calling {@link AutocompleteField#updateState}\n *\n * >* As an address autocomplete provider could be used different 3d parties.\n * >* Class is not intended to be used directly, but instead concrete forms (like profile address, shipping / billing address) should extend this class.\n * @property {string[]} data-address-fields - Form address fields array\n * @property {boolean} [data-address-autocomplete-enabled=true] - Is address autocomplete enabled for the form\n * @property {string} [data-address-autocomplete-provider=googleAutocomplete] - An identifier of address autocomplete form field\n * @example <caption>Example of shipping form</caption>\n * <form\n * autocomplete=\"on\"\n * novalidate\n * data-widget=\"shippingForm\"\n * data-event-submit.prevent=\"handleSubmit\"\n * ...\n * data-address-fields=\"${[\n * shippingFields.firstName.htmlName,\n * shippingFields.lastName.htmlName,\n * shippingFields.address1.htmlName,\n * shippingFields.address2.htmlName,\n * shippingFields.country.htmlName,\n * shippingFields.states.stateCode.htmlName,\n * shippingFields.city.htmlName,\n * shippingFields.postalCode.htmlName,\n * shippingFields.phone.htmlName\n * ].join(',')}\"\n * ...\n * data-form-definition-url=\"${URLUtils.url('Forms-FormDefinition', 'form', 'shipping')}\"\n * <isprint value=${pdict.forms.shippingForm.attributes} encoding=\"off\"/>\n * data-address-autocomplete-enabled=\"${!!require('util/sitepref').getValue('googleAutocompleteEnabled')}\"\n * >\n * ...\n * <div\n * class=\"b-form-message\"\n * role=\"alert\"\n * hidden=\"hidden\"\n * data-ref=\"errorMessageLabel\"\n * ></div>\n * ...\n * </form>\n */\n class AddressForm extends AjaxForm {\n prefs() {\n return {\n addressFields: '',\n addressAutocompleteEnabled: true,\n addressAutocompleteProvider: 'googleAutocomplete',\n ...super.prefs()\n };\n }\n\n /**\n * @description Update form html body, after country change\n * @listens InputSelect#change\n * @param {basicInput} el - Country code field\n * @returns {void}\n */\n onCountryChange(el) {\n this.config.countryCode = el.getValue();\n\n this.updateFormData({ countryCode: this.config.countryCode })\n .then(() => this.updateAddressAutocomplete()).then(() => {\n var currentSelector = document.querySelector(`form[data-address-selector=\"billingAddressSelector\"]`);\n if (currentSelector) {\n var stateCode = currentSelector.querySelector(`input[id$=\"states_stateCode\"]`);\n var postalCode = currentSelector.querySelector(`input[id$=\"addressFields_postalCode\"]`);\n if (stateCode && postalCode) {\n stateCode.value = '';\n postalCode.value = '';\n }\n }\n });\n }\n\n /**\n * @description Get address fields from prefs\n * @returns {string[]} Address fields names, separated by a comma\n */\n getAddressFields() {\n return this.prefs().addressFields.split(',');\n }\n\n /**\n * @description Update address fields with new address object\n * @listens GoogleAutoComplateField#placechanged\n * @param {basicInput} el - Autocomplete input field\n * @param {object} address - Address object\n * @param {string} [address.address1] - Address 1\n * @param {string} [address.city] - City\n * @param {string} [address.county] - County\n * @param {string} [address.postalCode] - Postal Code\n * @param {string} [address.stateCode] - State code\n * @returns {void}\n */\n handlePlaceChange(el, address) {\n this.getAddressFields().forEach(item => {\n this.getById(item, (/** @type {basicInput} */addressField) => {\n const name = addressField.getName() || '';\n const shortName = name.split('_').pop();\n\n if (shortName && (shortName in address)) {\n addressField.setValue(address[shortName] || '', true);\n }\n });\n });\n }\n\n /**\n * @description Handles address autocomplete update with the current country code\n * @returns {void}\n */\n updateAddressAutocomplete() {\n if (this.prefs().addressAutocompleteEnabled) {\n this.getById(this.prefs().addressAutocompleteProvider, (autocompleteField) => {\n autocompleteField.updateState(this.config.countryCode);\n });\n }\n }\n }\n\n return AddressForm;\n}\n","/**\n * @typedef {ReturnType<typeof import('widgets/forms/AutocompleteField').default>} AutocompleteField\n */\n\nimport {\n initGoogleMapsApi,\n initGoogleAutocomplete,\n parseAddress\n} from 'widgets/toolbox/googleMgr';\n\n/**\n * @param {AutocompleteField} AutocompleteField Base widget for extending\n * @returns {typeof GoogleAutocompleteField} Input Textarea widget\n */\nexport default function (AutocompleteField) {\n /**\n * @category widgets\n * @subcategory forms\n * @class GoogleAutocompleteField\n * @augments AutocompleteField\n * @classdesc Represents GoogleAutocompleteField components that implement Google Autocomplete functionality using Google Places API.\n * It has next features:\n * 1. Inits google autocomplete once user is clicked on the input field\n * 2. Emits widget event with the suggested address by google autocomplete API\n *\n * GoogleAutocompleteField widget should receive countryCode\n * and google maps API key values in order to properly init the google autocomplete functionality\n * @property {string} data-country-code - current country code value\n * @property {string} data-api-key - google maps API key\n * @example <caption>Example of Google autocomplete field </caption>\n * <div\n * data-widget=\"googleAutocompleteField\"\n * data-widget-event-placechanged=\"handlePlaceChange\"\n * data-id=\"googleAutocomplete\"\n * data-api-key=\"...\"\n * data-country-code=\"US\"\n * ...\n * >\n * <label\n * class=\"b-form_section-label\"\n * for=\"dwfrm_shipping_shippingAddress_addressFields_quickFinder\"\n * ...\n * >\n * Quick Address Finder\n * </label>\n * <input\n * data-ref=\"field\"\n * id=\"dwfrm_shipping_shippingAddress_addressFields_quickFinder\"\n * type=\"text\"\n * class=\"b-input pac-target-input m-valid\"\n * placeholder=\"Start typing address or ZIP code\"\n * aria-describedby=\"dwfrm_shipping_shippingAddress_addressFields_quickFinder-error\"\n * name=\"dwfrm_shipping_shippingAddress_addressFields_quickFinder\"\n * value=\"\"\n * maxlength=\"2147483647\"\n * data-event-focus=\"handleFocus\"\n * data-event-blur=\"validate\"\n * autocomplete=\"off\"\n * ...\n * >\n * <div\n * role=\"alert\"\n * class=\"b-form_section-message m-hide\"\n * data-ref=\"errorFeedback\"\n * id=\"dwfrm_shipping_shippingAddress_addressFields_quickFinder-error\"\n * hidden=\"hidden\"\n * ...\n * >\n * ...error text\n * </div>\n * </div>\n */\n class GoogleAutocompleteField extends AutocompleteField {\n /**\n * @description Initialize widget logic\n * @returns {void}\n */\n init() {\n super.init();\n\n this.inited = false;\n }\n\n /**\n * @listens dom:focus\n * @description Inits google API once field is focused\n * @returns {void}\n */\n handleFocus() {\n if (this.inited) {\n return;\n }\n\n initGoogleMapsApi(this.config.apiKey).then(() => {\n const field = /** @type {HTMLInputElement} */ (this.ref('field').get());\n\n if (field) {\n initGoogleAutocomplete(field, this.prefs().countryCode)\n .then(this.initEvents.bind(this))\n .then(() => {\n this.inited = true;\n });\n }\n });\n }\n\n /**\n * @description Inits google API events\n * @param {object} autocomplete - google autocomplete\n * @returns {void}\n */\n initEvents(autocomplete) {\n if (!autocomplete) {\n return;\n }\n\n this.autocomplete = autocomplete;\n\n this.autocomplete.addListener('place_changed', () => {\n var place = autocomplete.getPlace();\n var addressComponents = place.address_components;\n\n if (addressComponents) {\n parseAddress(addressComponents, this.prefs().countryCode).then((parsedAddress) => {\n if (parsedAddress) {\n /**\n * @description Event to trigger address form fields prefill\n * @event AddressForm#handlePlaceChange\n */\n this.emit('placechanged', parsedAddress);\n }\n });\n }\n });\n }\n\n /**\n * @description Updates google API restrictions\n * @param {string} countryCode - current country code\n * @returns {void}\n */\n updateState(countryCode) {\n if (countryCode && this.autocomplete) {\n this.autocomplete.setComponentRestrictions({\n country: countryCode\n });\n }\n }\n }\n\n return GoogleAutocompleteField;\n}\n","let googleApi;\nlet resolveGMapsFn;\nlet initialized = false;\n\nconst initializationPromise = new Promise((resolve) => {\n resolveGMapsFn = resolve;\n});\n\n/**\n * @description callback fires once google maps api loaded\n */\n// @ts-ignore\nwindow.googleMapsApiCallback = () => {\n // @ts-ignore\n googleApi = window.google;\n\n resolveGMapsFn();\n};\n\n/**\n * @description Return mapping config for provided country\n * @param {string} country - Mapping config country\n * @returns {object} Mapping config\n */\nfunction getAddressFieldsMappingConfig(country) {\n const config = {\n address1: {\n serviceObjectTypes: ['street_number', 'route'],\n serviceObjectProperty: 'long_name'\n },\n city: {\n serviceObjectTypes: [['locality', 'postal_town']],\n serviceObjectProperty: 'long_name'\n },\n stateCode: {\n serviceObjectTypes: ['administrative_area_level_1'],\n serviceObjectProperty: 'short_name'\n },\n postalCode: {\n serviceObjectTypes: ['postal_code'],\n serviceObjectProperty: 'long_name'\n }\n };\n switch (country) {\n case 'GB':\n config.stateCode.serviceObjectTypes = ['administrative_area_level_2'];\n break;\n default:\n break;\n }\n\n return config;\n}\n\n/**\n * @description Return address component by provided type\n * @param {Array} addressComponents - API address components\n * @param {string} type - Target component type\n * @returns {object|undefined} Address component\n */\nfunction getAddressComponentByType(addressComponents, type) {\n return addressComponents.find((addressComponent) => {\n return addressComponent.types.indexOf(type) > -1;\n });\n}\n\n/**\n * @description Return address component by provided type\n * @param {object} addressComponents - API address components\n * @param {object} fieldConfig - Configuration object for current field\n * @returns {string} Address field\n */\nfunction getAddressField(addressComponents, fieldConfig) {\n const typesForMerge = fieldConfig.serviceObjectTypes;\n const aimProperty = fieldConfig.serviceObjectProperty;\n const targetAddressProperties = [];\n let addressComponent;\n\n typesForMerge.forEach((mergeType) => {\n if (Array.isArray(mergeType)) {\n for (let i = 0, l = mergeType.length; i < l; i++) {\n addressComponent = getAddressComponentByType(addressComponents, mergeType[i]);\n if (addressComponent && addressComponent[aimProperty]) {\n break;\n }\n }\n } else {\n addressComponent = getAddressComponentByType(addressComponents, mergeType);\n }\n\n if (addressComponent && addressComponent[aimProperty]) {\n targetAddressProperties.push(addressComponent[aimProperty]);\n }\n });\n return targetAddressProperties.join(' ');\n}\n\n/**\n * @description Loads google maps API\n * @param {string} apiKey - api key\n * @returns {Promise} result\n */\nexport function initGoogleMapsApi(apiKey) {\n if (!initialized) {\n const url = new URL('https://maps.googleapis.com/maps/api/js');\n\n url.searchParams.append('key', apiKey);\n url.searchParams.append('libraries', 'places');\n url.searchParams.append('callback', 'googleMapsApiCallback');\n\n const script = document.createElement('script');\n script.src = url.toString();\n script.async = true;\n script.type = 'text/javascript';\n\n document.body.appendChild(script);\n\n initialized = true;\n }\n\n return initializationPromise;\n}\n\n/**\n * @description Inits google autocomplete for the field\n * @param {HTMLInputElement} field - input field\n * @param {string} countryCode - country code to restrict search results\n * @returns {Promise} result\n */\nexport function initGoogleAutocomplete(field, countryCode) {\n return Promise.resolve(new googleApi.maps.places.Autocomplete(\n field, {\n componentRestrictions: {\n country: countryCode\n }\n }\n ));\n}\n\n/**\n * @description Returns parsed address object\n * @param {Array} addressComponents - Array with google address components\n * @param {string} country - Components country\n * @returns {object} result\n */\nexport function parseAddress(addressComponents, country) {\n const mappingConfig = getAddressFieldsMappingConfig(country);\n const address = Object.keys(mappingConfig).reduce((addressObject, field) => {\n addressObject[field] = getAddressField(addressComponents, mappingConfig[field]);\n\n return addressObject;\n }, {});\n\n return Promise.resolve(address);\n}\n"],"sourceRoot":""}