UNPKG

@firestitch/address

Version:
290 lines 63 kB
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Optional, Output, ViewChild, } from '@angular/core'; import { ControlContainer, NgForm, FormsModule } from '@angular/forms'; import { guid } from '@firestitch/common'; import { controlContainerFactory } from '@firestitch/core'; import { FsMapComponent, FsMapModule } from '@firestitch/map'; import { Subject } from 'rxjs'; import { isObject } from 'lodash-es'; import { Countries } from '../../consts/countries.const'; import { Country } from '../../enums/country.enum'; import { FsAddressRegionComponent } from '../address-region/address-region.component'; import { MatFormField, MatLabel } from '@angular/material/form-field'; import { MatInput } from '@angular/material/input'; import { FsFormModule } from '@firestitch/form'; import { FsAddressCountryComponent } from '../address-country/address-country.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@firestitch/form"; import * as i3 from "@firestitch/map"; export class FsAddressComponent { fsAddressRegionComponent; map; address; excludeCountries; regionCountryOrder = [Country.Canada, Country.UnitedStates]; set setConfig(config) { config.search = config.search === undefined ? false : config.search; if (!isObject(config.map)) { config.map = { showMap: false }; } this.config = config; } addressChange = new EventEmitter(); collapseChange = new EventEmitter(); controlNames = { street: `street_${guid('xxxxxxxx')}`, locationName: `location_name_${guid('xxxxxxxx')}`, address2: `address2_${guid('xxxxxxxx')}`, address3: `address3_${guid('xxxxxxxx')}`, city: `city_${guid('xxxxxxxx')}`, addressCountry: `address_country_${guid('xxxxxxxx')}`, zip: `zip_${guid('xxxxxxxx')}`, lat: `lat_${guid('xxxxxxxx')}`, lng: `lng_${guid('xxxxxxxx')}`, }; config = {}; countries = Countries; zipLabel; searchedAddress; isSearched = false; mapConfig; _destory$ = new Subject(); ngOnInit() { this._initAddress(); this._initConfig(); this._initMap(); this._initCountries(); this._initZipAndStateLabels(); this._initCollapseBtn(); } get regionCountries() { return this.countries.map((country) => country.code); } ngOnChanges(change) { if (change.address) { if (!change.address.currentValue) { this.address = {}; } if (!change.address.firstChange) { const currentCountry = change.address.currentValue ? change.address.currentValue.country : null; const previousCountry = change.address.previousValue ? change.address.previousValue.country : null; if (currentCountry !== previousCountry) { this._initZipAndStateLabels(); } } } } ngOnDestroy() { this._destory$.next(null); this._destory$.complete(); } recenter() { this.mapConfig.center = { latitude: this.address.lat, longitude: this.address.lng }; this.mapConfig.marker.coords.latitude = this.address.lat; this.mapConfig.marker.coords.longitude = this.address.lng; this.map.setCenter(this.address.lat, this.address.lng); } dragEnded(event) { this.mapConfig.marker.events.dragend(event); } changeCountry() { const country = this.countries.find((item) => item.code === this.address.country); if (country && country.regions) { const region = country.regions.some((item) => item.code === this.address.region); if (!region) { this.address.region = null; } } else { this.address.region = null; } this.fsAddressRegionComponent.region = this.address.region; this._initZipAndStateLabels(); this.change(); } changeRegion() { if (this.address.region) { const regionCountry = this.countries.find((country) => { return country.regions && country.regions.find((region) => this.address.region === region.code); }); if (regionCountry) { this.address.country = regionCountry.code; } } this.change(); } change(event) { if (event) { event.stopPropagation(); } if (!this.config.search) { return this.addressChange.emit(this.address); } const geocoder = new google.maps.Geocoder(); const parts = [ this.address.country, this.address.region, this.address.city, this.address.zip, this.address.street, this.address.name, ]; this.searchedAddress = parts.filter((part) => part).join(', '); this.addressChange.emit(this.address); geocoder.geocode({ address: this.searchedAddress }, (results, status) => { this.isSearched = true; const newAddress = { ...this.address }; if (status === google.maps.GeocoderStatus.OK && results.length > 0) { const location = results[0].geometry.location; newAddress.description = results[0].formatted_address; newAddress.lat = location.lat(); newAddress.lng = location.lng(); this.mapConfig.center = { latitude: location.lat(), longitude: location.lng() }; this.mapConfig.marker.coords.latitude = location.lat(); this.mapConfig.marker.coords.longitude = location.lng(); } else { newAddress.lat = null; newAddress.lng = null; } this.addressChange.emit(newAddress); }); } _initAddress() { this.address = { name: null, country: null, region: null, address2: null, address3: null, street: null, city: null, zip: null, lat: null, lng: null, ...this.address, }; } _initConfig() { this.config = { name: { required: false, visible: true }, country: { required: false, visible: true }, region: { required: false, visible: true }, address2: { required: false, visible: false }, address3: { required: false, visible: false }, city: { required: false, visible: true }, street: { required: false, visible: true }, zip: { required: false, visible: true }, lat: { required: false, visible: false }, lng: { required: false, visible: false }, ...this.config, }; } _initMap() { this.mapConfig = { center: { latitude: this.address.lat || 9999, longitude: this.address.lng || 9999, }, zoom: 13, scrollwheel: false, streetViewControl: false, zoomControl: true, mapTypeControlOptions: { mapTypeIds: [] }, marker: { id: 0, coords: { latitude: this.address.lat, longitude: this.address.lng }, options: { draggable: true }, events: { dragend: (marker) => { this.address.lat = marker.coords.lat; this.address.lng = marker.coords.lng; this.addressChange.emit(this.address); }, }, }, ...this.config.map, }; } _initCountries() { if (this.config.country && this.config.country.list && this.config.country.list.length) { this.countries.length = 0; this.config.country.list.forEach((el) => { const country = this.countries.find((countryEl) => countryEl.code === el); if (country) { this.countries.push(country); } }); } } _initZipAndStateLabels() { this._updateCountryRegionLabels(); } _updateCountryRegionLabels() { if (this.address.country) { this.zipLabel = this.address.country === String(Country.UnitedStates) ? 'ZIP Code' : 'Postal Code'; } else { this.zipLabel = 'ZIP/Postal Code'; } this.zipLabel = this.config.zip.placeholder ? this.config.zip.placeholder : this.zipLabel; } _initCollapseBtn() { this.config.collapseButton = { show: true, title: 'Collapse Address Editor', color: 'primary', theme: 'mat-flat-button', ...this.config.collapseButton, }; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsAddressComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: FsAddressComponent, isStandalone: true, selector: "fs-address", inputs: { address: "address", excludeCountries: "excludeCountries", regionCountryOrder: "regionCountryOrder", setConfig: ["config", "setConfig"] }, outputs: { addressChange: "addressChange", collapseChange: "collapseChange" }, viewQueries: [{ propertyName: "fsAddressRegionComponent", first: true, predicate: FsAddressRegionComponent, descendants: true }, { propertyName: "map", first: true, predicate: FsMapComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (config.name.visible!==false) {\n <mat-form-field\n class=\"name\">\n <mat-label>\n Location name\n </mat-label>\n <input\n matInput\n autocomplete=\"nope\"\n [(ngModel)]=\"address.name\"\n [disabled]=\"config.name.disabled\"\n [fsFormRequired]=\"config.name.required\"\n [name]=\"controlNames.locationName\"\n (change)=\"change($event)\"\n autocomplete=\"off\">\n </mat-form-field>\n}\n@if (config.street.visible!==false) {\n <mat-form-field class=\"street\">\n <mat-label>\n {{ config.street.placeholder || 'Street' }}\n </mat-label>\n <input\n matInput\n type=\"text\"\n autocomplete=\"nope\"\n [(ngModel)]=\"address.street\"\n [disabled]=\"config.street.disabled\"\n [fsFormRequired]=\"config.street.required\"\n [name]=\"controlNames.street\"\n (change)=\"change()\"\n autocomplete=\"off\">\n </mat-form-field>\n}\n@if (config.address2.visible) {\n <mat-form-field\n class=\"address2\">\n <mat-label>\n {{ config.address2.placeholder || 'Address 2' }}\n </mat-label>\n <input\n matInput\n type=\"text\"\n autocomplete=\"nope\"\n [(ngModel)]=\"address.address2\"\n [disabled]=\"config.address2.disabled\"\n [fsFormRequired]=\"config.address2.required\"\n [name]=\"controlNames.address2\"\n (change)=\"change($event)\"\n autocomplete=\"off\">\n </mat-form-field>\n}\n@if (config.address3.visible) {\n <mat-form-field\n class=\"address3\">\n <mat-label>\n {{ config.address3.placeholder || 'Address 3' }}\n </mat-label>\n <input\n matInput\n type=\"text\"\n autocomplete=\"nope\"\n [(ngModel)]=\"address.address3\"\n [disabled]=\"config.address3.disabled\"\n [fsFormRequired]=\"config.address3.required\"\n [name]=\"controlNames.address3\"\n (change)=\"change($event)\"\n autocomplete=\"off\">\n </mat-form-field>\n}\n<div class=\"city-region-zip-country\">\n <div class=\"city\">\n @if (config.city.visible!==false) {\n <mat-form-field>\n <mat-label>\n {{ config.city.placeholder || 'City' }}\n </mat-label>\n <input\n matInput\n type=\"text\"\n autocomplete=\"nope\"\n [(ngModel)]=\"address.city\"\n [disabled]=\"config.city.disabled\"\n [fsFormRequired]=\"config.city.required\"\n [name]=\"controlNames.city\"\n (change)=\"change($event)\"\n autocomplete=\"off\">\n </mat-form-field>\n }\n </div>\n <div class=\"region\">\n @if (config.region.visible!==false) {\n <fs-address-region\n [(region)]=\"address.region\"\n (regionChange)=\"changeRegion()\"\n [country]=\"address.country\"\n [countries]=\"regionCountries\"\n [label]=\"config.region.placeholder\"\n [disabled]=\"config.region.disabled\"\n [required]=\"config.region.required\"\n [regionCountryOrder]=\"regionCountryOrder\">\n </fs-address-region>\n }\n </div>\n <div class=\"zip\">\n @if (config.zip.visible!==false) {\n <mat-form-field>\n <mat-label>\n {{ zipLabel }}\n </mat-label>\n <input\n matInput\n type=\"text\"\n autocomplete=\"nope\"\n [(ngModel)]=\"address.zip\"\n [disabled]=\"config.zip.disabled\"\n [fsFormRequired]=\"config.zip.required\"\n [name]=\"controlNames.zip\"\n (change)=\"change($event)\"\n autocomplete=\"off\">\n </mat-form-field>\n }\n </div>\n <div class=\"country\">\n @if (config.country.visible!==false) {\n <fs-address-country\n [disabled]=\"config.country.disabled\"\n [required]=\"config.country.required\"\n [label]=\"config.country.placeholder || 'Country'\"\n [excludeCountries]=\"excludeCountries\"\n [(ngModel)]=\"address.country\"\n (selectionChange)=\"changeCountry()\"\n [name]=\"controlNames.addressCountry\">\n </fs-address-country>\n }\n </div>\n</div>\n@if (config.lat.visible === true && config.lng.visible === true) {\n <div class=\"lat-lng\">\n <mat-form-field>\n <mat-label>\n Latitude\n </mat-label>\n <input\n matInput\n type=\"text\"\n [(ngModel)]=\"address.lat\"\n [disabled]=\"config.lat.disabled\"\n [fsFormRequired]=\"config.lat.required\"\n [name]=\"controlNames.lat\"\n (change)=\"change($event)\">\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Longitude\n </mat-label>\n <input\n matInput\n type=\"text\"\n [(ngModel)]=\"address.lng\"\n [disabled]=\"config.lng.disabled\"\n [fsFormRequired]=\"config.lng.required\"\n [name]=\"controlNames.lng\"\n (change)=\"change($event)\">\n </mat-form-field>\n </div>\n}\n@if (mapConfig.showMap) {\n <div\n class=\"map-container\"\n >\n <fs-map\n [height]=\"'300px'\"\n [width]=\"'100%'\"\n [lat]=\"mapConfig.center.latitude\"\n [lng]=\"mapConfig.center.longitude\"\n [zoom]=\"mapConfig.zoom\"\n [scrollwheel]=\"mapConfig.scrollwheel\"\n [streetViewControl]=\"mapConfig.streetViewControl\"\n [zoomControl]=\"mapConfig.zoomControl\"\n [mapTypeControlOptions]=\"mapConfig.mapTypeControlOptions\">\n <fs-map-marker\n [lat]=\"mapConfig.marker.coords.latitude\"\n [lng]=\"mapConfig.marker.coords.longitude\">\n </fs-map-marker>\n </fs-map>\n @if (!address.lat && !address.lng) {\n <div\n class=\"address-incomplete\"\n >\n @if (!isSearched) {\n <div>\n Please populate the address above to locate it on the map\n </div>\n }\n @if (isSearched) {\n <div>\n Could not find address \"{{ searchedAddress }}\"\n </div>\n }\n </div>\n }\n </div>\n}", styles: ["agm-map{width:100%;height:400px;background-color:gray}mat-label:after{content:attr(data-after-content)}.map-container{position:relative}.map-container .address-incomplete{position:absolute;inset:0;background:#fff;border:1px solid #efefef;opacity:.87;font-size:larger;padding:40px;align-items:center;display:flex;flex-direction:column;justify-content:center;text-align:center}.map-container .center{position:absolute;right:5px;top:5px;z-index:5;background-color:#fff}.name,.address2,.address3,.street{width:100%;display:block}.lat-lng{display:flex;gap:5px}.lat-lng mat-form-field{width:100%}.city-region-zip-country{display:flex;flex-wrap:wrap}.city-region-zip-country .city,.city-region-zip-country .region,.city-region-zip-country .zip,.city-region-zip-country .country{flex:1 0 50%}.city-region-zip-country .city>*,.city-region-zip-country .region>*,.city-region-zip-country .zip>*,.city-region-zip-country .country>*{padding-right:5px;box-sizing:border-box;display:block}.city-region-zip-country:last-child>*{margin-right:0}.city-region-zip-country ::ng-deep .mat-form-field{width:100%}@media (max-width: 600px){.city-region-zip-country{flex-direction:column}}\n"], dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i2.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }, { kind: "component", type: FsAddressRegionComponent, selector: "fs-address-region", inputs: ["region", "disabled", "country", "label", "required", "regionCountryOrder", "countries"], outputs: ["regionChange"] }, { kind: "component", type: FsAddressCountryComponent, selector: "fs-address-country", inputs: ["disabled", "required", "excludeCountries", "countries", "label"], outputs: ["selectionChange"] }, { kind: "ngmodule", type: FsMapModule }, { kind: "component", type: i3.FsMapComponent, selector: "fs-map", inputs: ["address", "width", "height", "lat", "lng", "scrollwheel", "fullscreenControl", "streetViewControl", "zoomControl", "maxZoom", "zoom", "mapTypeControlOptions", "options"] }, { kind: "directive", type: i3.FsMapMarkerDirective, selector: "fs-map-marker", inputs: ["options", "lat", "lng", "zIndex"], outputs: ["click", "drag", "dragStart", "dragEnd"] }], viewProviders: [ { provide: ControlContainer, useFactory: controlContainerFactory, deps: [[new Optional(), NgForm]], }, ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsAddressComponent, decorators: [{ type: Component, args: [{ selector: 'fs-address', viewProviders: [ { provide: ControlContainer, useFactory: controlContainerFactory, deps: [[new Optional(), NgForm]], }, ], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ MatFormField, MatLabel, MatInput, FormsModule, FsFormModule, FsAddressRegionComponent, FsAddressCountryComponent, FsMapModule, ], template: "@if (config.name.visible!==false) {\n <mat-form-field\n class=\"name\">\n <mat-label>\n Location name\n </mat-label>\n <input\n matInput\n autocomplete=\"nope\"\n [(ngModel)]=\"address.name\"\n [disabled]=\"config.name.disabled\"\n [fsFormRequired]=\"config.name.required\"\n [name]=\"controlNames.locationName\"\n (change)=\"change($event)\"\n autocomplete=\"off\">\n </mat-form-field>\n}\n@if (config.street.visible!==false) {\n <mat-form-field class=\"street\">\n <mat-label>\n {{ config.street.placeholder || 'Street' }}\n </mat-label>\n <input\n matInput\n type=\"text\"\n autocomplete=\"nope\"\n [(ngModel)]=\"address.street\"\n [disabled]=\"config.street.disabled\"\n [fsFormRequired]=\"config.street.required\"\n [name]=\"controlNames.street\"\n (change)=\"change()\"\n autocomplete=\"off\">\n </mat-form-field>\n}\n@if (config.address2.visible) {\n <mat-form-field\n class=\"address2\">\n <mat-label>\n {{ config.address2.placeholder || 'Address 2' }}\n </mat-label>\n <input\n matInput\n type=\"text\"\n autocomplete=\"nope\"\n [(ngModel)]=\"address.address2\"\n [disabled]=\"config.address2.disabled\"\n [fsFormRequired]=\"config.address2.required\"\n [name]=\"controlNames.address2\"\n (change)=\"change($event)\"\n autocomplete=\"off\">\n </mat-form-field>\n}\n@if (config.address3.visible) {\n <mat-form-field\n class=\"address3\">\n <mat-label>\n {{ config.address3.placeholder || 'Address 3' }}\n </mat-label>\n <input\n matInput\n type=\"text\"\n autocomplete=\"nope\"\n [(ngModel)]=\"address.address3\"\n [disabled]=\"config.address3.disabled\"\n [fsFormRequired]=\"config.address3.required\"\n [name]=\"controlNames.address3\"\n (change)=\"change($event)\"\n autocomplete=\"off\">\n </mat-form-field>\n}\n<div class=\"city-region-zip-country\">\n <div class=\"city\">\n @if (config.city.visible!==false) {\n <mat-form-field>\n <mat-label>\n {{ config.city.placeholder || 'City' }}\n </mat-label>\n <input\n matInput\n type=\"text\"\n autocomplete=\"nope\"\n [(ngModel)]=\"address.city\"\n [disabled]=\"config.city.disabled\"\n [fsFormRequired]=\"config.city.required\"\n [name]=\"controlNames.city\"\n (change)=\"change($event)\"\n autocomplete=\"off\">\n </mat-form-field>\n }\n </div>\n <div class=\"region\">\n @if (config.region.visible!==false) {\n <fs-address-region\n [(region)]=\"address.region\"\n (regionChange)=\"changeRegion()\"\n [country]=\"address.country\"\n [countries]=\"regionCountries\"\n [label]=\"config.region.placeholder\"\n [disabled]=\"config.region.disabled\"\n [required]=\"config.region.required\"\n [regionCountryOrder]=\"regionCountryOrder\">\n </fs-address-region>\n }\n </div>\n <div class=\"zip\">\n @if (config.zip.visible!==false) {\n <mat-form-field>\n <mat-label>\n {{ zipLabel }}\n </mat-label>\n <input\n matInput\n type=\"text\"\n autocomplete=\"nope\"\n [(ngModel)]=\"address.zip\"\n [disabled]=\"config.zip.disabled\"\n [fsFormRequired]=\"config.zip.required\"\n [name]=\"controlNames.zip\"\n (change)=\"change($event)\"\n autocomplete=\"off\">\n </mat-form-field>\n }\n </div>\n <div class=\"country\">\n @if (config.country.visible!==false) {\n <fs-address-country\n [disabled]=\"config.country.disabled\"\n [required]=\"config.country.required\"\n [label]=\"config.country.placeholder || 'Country'\"\n [excludeCountries]=\"excludeCountries\"\n [(ngModel)]=\"address.country\"\n (selectionChange)=\"changeCountry()\"\n [name]=\"controlNames.addressCountry\">\n </fs-address-country>\n }\n </div>\n</div>\n@if (config.lat.visible === true && config.lng.visible === true) {\n <div class=\"lat-lng\">\n <mat-form-field>\n <mat-label>\n Latitude\n </mat-label>\n <input\n matInput\n type=\"text\"\n [(ngModel)]=\"address.lat\"\n [disabled]=\"config.lat.disabled\"\n [fsFormRequired]=\"config.lat.required\"\n [name]=\"controlNames.lat\"\n (change)=\"change($event)\">\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Longitude\n </mat-label>\n <input\n matInput\n type=\"text\"\n [(ngModel)]=\"address.lng\"\n [disabled]=\"config.lng.disabled\"\n [fsFormRequired]=\"config.lng.required\"\n [name]=\"controlNames.lng\"\n (change)=\"change($event)\">\n </mat-form-field>\n </div>\n}\n@if (mapConfig.showMap) {\n <div\n class=\"map-container\"\n >\n <fs-map\n [height]=\"'300px'\"\n [width]=\"'100%'\"\n [lat]=\"mapConfig.center.latitude\"\n [lng]=\"mapConfig.center.longitude\"\n [zoom]=\"mapConfig.zoom\"\n [scrollwheel]=\"mapConfig.scrollwheel\"\n [streetViewControl]=\"mapConfig.streetViewControl\"\n [zoomControl]=\"mapConfig.zoomControl\"\n [mapTypeControlOptions]=\"mapConfig.mapTypeControlOptions\">\n <fs-map-marker\n [lat]=\"mapConfig.marker.coords.latitude\"\n [lng]=\"mapConfig.marker.coords.longitude\">\n </fs-map-marker>\n </fs-map>\n @if (!address.lat && !address.lng) {\n <div\n class=\"address-incomplete\"\n >\n @if (!isSearched) {\n <div>\n Please populate the address above to locate it on the map\n </div>\n }\n @if (isSearched) {\n <div>\n Could not find address \"{{ searchedAddress }}\"\n </div>\n }\n </div>\n }\n </div>\n}", styles: ["agm-map{width:100%;height:400px;background-color:gray}mat-label:after{content:attr(data-after-content)}.map-container{position:relative}.map-container .address-incomplete{position:absolute;inset:0;background:#fff;border:1px solid #efefef;opacity:.87;font-size:larger;padding:40px;align-items:center;display:flex;flex-direction:column;justify-content:center;text-align:center}.map-container .center{position:absolute;right:5px;top:5px;z-index:5;background-color:#fff}.name,.address2,.address3,.street{width:100%;display:block}.lat-lng{display:flex;gap:5px}.lat-lng mat-form-field{width:100%}.city-region-zip-country{display:flex;flex-wrap:wrap}.city-region-zip-country .city,.city-region-zip-country .region,.city-region-zip-country .zip,.city-region-zip-country .country{flex:1 0 50%}.city-region-zip-country .city>*,.city-region-zip-country .region>*,.city-region-zip-country .zip>*,.city-region-zip-country .country>*{padding-right:5px;box-sizing:border-box;display:block}.city-region-zip-country:last-child>*{margin-right:0}.city-region-zip-country ::ng-deep .mat-form-field{width:100%}@media (max-width: 600px){.city-region-zip-country{flex-direction:column}}\n"] }] }], propDecorators: { fsAddressRegionComponent: [{ type: ViewChild, args: [FsAddressRegionComponent] }], map: [{ type: ViewChild, args: [FsMapComponent] }], address: [{ type: Input }], excludeCountries: [{ type: Input }], regionCountryOrder: [{ type: Input }], setConfig: [{ type: Input, args: ['config'] }], addressChange: [{ type: Output }], collapseChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvbXBvbmVudHMvYWRkcmVzcy9hZGRyZXNzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9hZGRyZXNzL2FkZHJlc3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTlELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSW5ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVB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QUF3QjtnQkFJNUIsR0FBRztzQkFEVCxTQUFTO3VCQUFDLGNBQWM7Z0JBR1QsT0FBTztzQkFBdEIsS0FBSztnQkFDVSxnQkFBZ0I7c0JBQS9CLEtBQUs7Z0JBQ1Usa0JBQWtCO3NCQUFqQyxLQUFLO2dCQUVzQixTQUFTO3NCQUFwQyxLQUFLO3VCQUFDLFFBQVE7Z0JBVUUsYUFBYTtzQkFBN0IsTUFBTTtnQkFDVSxjQUFjO3NCQUE5QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIE5nRm9ybSwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IGd1aWQgfSBmcm9tICdAZmlyZXN0aXRjaC9jb21tb24nO1xuaW1wb3J0IHsgY29udHJvbENvbnRhaW5lckZhY3RvcnkgfSBmcm9tICdAZmlyZXN0aXRjaC9jb3JlJztcbmltcG9ydCB7IEZzTWFwQ29tcG9uZW50LCBGc01hcE1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21hcCc7XG5cbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBDb3VudHJpZXMgfSBmcm9tICcuLi8uLi9jb25zdHMvY291bnRyaWVzLmNvbnN0JztcbmltcG9ydCB7IENvdW50cnkgfSBmcm9tICcuLi8uLi9lbnVtcy9jb3VudHJ5LmVudW0nO1xuaW1wb3J0IHsgRnNBZGRyZXNzQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hZGRyZXNzLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRnNBZGRyZXNzTWFwQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hZGRyZXNzLW1hcC1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IEZzQWRkcmVzcyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYWRkcmVzcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRnNBZGRyZXNzUmVnaW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vYWRkcmVzcy1yZWdpb24vYWRkcmVzcy1yZWdpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZCwgTWF0TGFiZWwgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgRnNGb3JtTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZm9ybSc7XG5pbXBvcnQgeyBGc0FkZHJlc3NDb3VudHJ5Q29tcG9uZW50IH0gZnJvbSAnLi4vYWRkcmVzcy1jb3VudHJ5L2FkZHJlc3MtY291bnRyeS5jb21wb25lbnQnO1xuXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZnMtYWRkcmVzcycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FkZHJlc3MuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2FkZHJlc3MuY29tcG9uZW50LnNjc3MnXSxcbiAgICB2aWV3UHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsXG4gICAgICAgICAgICB1c2VGYWN0b3J5OiBjb250cm9sQ29udGFpbmVyRmFjdG9yeSxcbiAgICAgICAgICAgIGRlcHM6IFtbbmV3IE9wdGlvbmFsKCksIE5nRm9ybV1dLFxuICAgICAgICB9LFxuICAgIF0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE1hdEZvcm1GaWVsZCxcbiAgICAgICAgTWF0TGFiZWwsXG4gICAgICAgIE1hdElucHV0LFxuICAgICAgICBGb3Jtc01vZHVsZSxcbiAgICAgICAgRnNGb3JtTW9kdWxlLFxuICAgICAgICBGc0FkZHJlc3NSZWdpb25Db21wb25lbnQsXG4gICAgICAgIEZzQWRkcmVzc0NvdW50cnlDb21wb25lbnQsXG4gICAgICAgIEZzTWFwTW9kdWxlLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEZzQWRkcmVzc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuXG4gIEBWaWV3Q2hpbGQoRnNBZGRyZXNzUmVnaW9uQ29tcG9uZW50KVxuICBwdWJsaWMgZnNBZGRyZXNzUmVnaW9uQ29tcG9uZW50OiBGc0FkZHJlc3NSZWdpb25Db21wb25lbnQ7XG5cbiAgQFZpZXdDaGlsZChGc01hcENvbXBvbmVudClcbiAgcHVibGljIG1hcDogRnNNYXBDb21wb25lbnQ7XG5cbiAgQElucHV0KCkgcHVibGljIGFkZHJlc3M6IEZzQWRkcmVzcztcbiAgQElucHV0KCkgcHVibGljIGV4Y2x1ZGVDb3VudHJpZXM6IHN0cmluZ1tdO1xuICBASW5wdXQoKSBwdWJsaWMgcmVnaW9uQ291bnRyeU9yZGVyID0gW0NvdW50cnkuQ2FuYWRhLCBDb3VudHJ5LlVuaXRlZFN0YXRlc107XG5cbiAgQElucHV0KCdjb25maWcnKSBwdWJsaWMgc2V0IHNldENvbmZpZyhjb25maWc6IEZzQWRkcmVzc0NvbmZpZykge1xuICAgIGNvbmZpZy5zZWFyY2ggPSBjb25maWcuc2VhcmNoID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IGNvbmZpZy5zZWFyY2g7XG5cbiAgICBpZiAoIWlzT2JqZWN0KGNvbmZpZy5tYXApKSB7XG4gICAgICBjb25maWcubWFwID0geyBzaG93TWFwOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG5cbiAgQE91dHB1dCgpIHB1YmxpYyBhZGRyZXNzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIGNvbGxhcHNlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHB1YmxpYyBjb250cm9sTmFtZXMgPSB7XG4gICAgc3RyZWV0OiBgc3RyZWV0XyR7Z3VpZCgneHh4eHh4eHgnKX1gLFxuICAgIGxvY2F0aW9uTmFtZTogYGxvY2F0aW9uX25hbWVfJHtndWlkKCd4eHh4eHh4eCcpfWAsXG4gICAgYWRkcmVzczI6IGBhZGRyZXNzMl8ke2d1aWQoJ3h4eHh4eHh4Jyl9YCxcbiAgICBhZGRyZXNzMzogYGFkZHJlc3MzXyR7Z3VpZCgneHh4eHh4eHgnKX1gLFxuICAgIGNpdHk6IGBjaXR5XyR7Z3VpZCgneHh4eHh4eHgnKX1gLFxuICAgIGFkZHJlc3NDb3VudHJ5OiBgYWRkcmVzc19jb3VudHJ5XyR7Z3VpZCgneHh4eHh4eHgnKX1gLFxuICAgIHppcDogYHppcF8ke2d1aWQoJ3h4eHh4eHh4Jyl9YCxcbiAgICBsYXQ6IGBsYXRfJHtndWlkKCd4eHh4eHh4eCcpfWAsXG4gICAgbG5nOiBgbG5nXyR7Z3VpZCgneHh4eHh4eHgnKX1gLFxuICB9O1xuXG4gIHB1YmxpYyBjb25maWc6IEZzQWRkcmVzc0NvbmZpZyA9IHt9O1xuICBwdWJsaWMgY291bnRyaWVzID0gQ291bnRyaWVzO1xuICBwdWJsaWMgemlwTGFiZWw6IHN0cmluZztcbiAgcHVibGljIHNlYXJjaGVkQWRkcmVzczogc3RyaW5nO1xuICBwdWJsaWMgaXNTZWFyY2hlZCA9IGZhbHNlO1xuICBwdWJsaWMgbWFwQ29uZmlnOiBGc0FkZHJlc3NNYXBDb25maWc7XG5cbiAgcHJpdmF0ZSBfZGVzdG9yeSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLl9pbml0QWRkcmVzcygpO1xuICAgIHRoaXMuX2luaXRDb25maWcoKTtcbiAgICB0aGlzLl9pbml0TWFwKCk7XG5cbiAgICB0aGlzLl9pbml0Q291bnRyaWVzKCk7XG4gICAgdGhpcy5faW5pdFppcEFuZFN0YXRlTGFiZWxzKCk7XG4gICAgdGhpcy5faW5pdENvbGxhcHNlQnRuKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJlZ2lvbkNvdW50cmllcygpIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudHJpZXMubWFwKChjb3VudHJ5KSA9PiBjb3VudHJ5LmNvZGUpO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZSkge1xuICAgIGlmIChjaGFuZ2UuYWRkcmVzcykge1xuICAgICAgaWYgKCFjaGFuZ2UuYWRkcmVzcy5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgdGhpcy5hZGRyZXNzID0ge307XG4gICAgICB9XG5cbiAgICAgIGlmICghY2hhbmdlLmFkZHJlc3MuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgY29uc3QgY3VycmVudENvdW50cnkgPSBjaGFuZ2UuYWRkcmVzcy5jdXJyZW50VmFsdWUgPyBjaGFuZ2UuYWRkcmVzcy5jdXJyZW50VmFsdWUuY291bnRyeSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzQ291bnRyeSA9IGNoYW5nZS5hZGRyZXNzLnByZXZpb3VzVmFsdWUgPyBjaGFuZ2UuYWRkcmVzcy5wcmV2aW91c1ZhbHVlLmNvdW50cnkgOiBudWxsO1xuICAgICAgICBpZiAoY3VycmVudENvdW50cnkgIT09IHByZXZpb3VzQ291bnRyeSkge1xuICAgICAgICAgIHRoaXMuX2luaXRaaXBBbmRTdGF0ZUxhYmVscygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2Rlc3RvcnkkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fZGVzdG9yeSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWNlbnRlcigpIHtcbiAgICB0aGlzLm1hcENvbmZpZy5jZW50ZXIgPSB7IGxhdGl0dWRlOiB0aGlzLmFkZHJlc3MubGF0LCBsb25naXR1ZGU6IHRoaXMuYWRkcmVzcy5sbmcgfTtcbiAgICB0aGlzLm1hcENvbmZpZy5tYXJrZXIuY29vcmRzLmxhdGl0dWRlID0gdGhpcy5hZGRyZXNzLmxhdDtcbiAgICB0aGlzLm1hcENvbmZpZy5tYXJrZXIuY29vcmRzLmxvbmdpdHVkZSA9IHRoaXMuYWRkcmVzcy5sbmc7XG4gICAgdGhpcy5tYXAuc2V0Q2VudGVyKHRoaXMuYWRkcmVzcy5sYXQsIHRoaXMuYWRkcmVzcy5sbmcpO1xuICB9XG5cbiAgcHVibGljIGRyYWdFbmRlZChldmVudCk6IHZvaWQge1xuICAgIHRoaXMubWFwQ29uZmlnLm1hcmtlci5ldmVudHMuZHJhZ2VuZChldmVudCk7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlQ291bnRyeSgpIHtcblxuICAgIGNvbnN0IGNvdW50cnkgPSB0aGlzLmNvdW50cmllcy5maW5kKChpdGVtKSA9PiBpdGVtLmNvZGUgPT09IHRoaXMuYWRkcmVzcy5jb3VudHJ5KTtcblxuICAgIGlmIChjb3VudHJ5ICYmIGNvdW50cnkucmVnaW9ucykge1xuXG4gICAgICBjb25zdCByZWdpb24gPSBjb3VudHJ5LnJlZ2lvbnMuc29tZSgoaXRlbSkgPT4gaXRlbS5jb2RlID09PSB0aGlzLmFkZHJlc3MucmVnaW9uKTtcblxuICAgICAgaWYgKCFyZWdpb24pIHtcbiAgICAgICAgdGhpcy5hZGRyZXNzLnJlZ2lvbiA9IG51bGw7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRyZXNzLnJlZ2lvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5mc0FkZHJlc3NSZWdpb25Db21wb25lbnQucmVnaW9uID0gdGhpcy5hZGRyZXNzLnJlZ2lvbjtcbiAgICB0aGlzLl9pbml0WmlwQW5kU3RhdGVMYWJlbHMoKTtcbiAgICB0aGlzLmNoYW5nZSgpO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVJlZ2lvbigpIHtcbiAgICBpZiAodGhpcy5hZGRyZXNzLnJlZ2lvbikge1xuICAgICAgY29uc3QgcmVnaW9uQ291bnRyeSA9IHRoaXMuY291bnRyaWVzLmZpbmQoKGNvdW50cnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvdW50cnkucmVnaW9uc1xuICAgICAgICAgICYmIGNvdW50cnkucmVnaW9ucy5maW5kKChyZWdpb24pID0+IHRoaXMuYWRkcmVzcy5yZWdpb24gPT09IHJlZ2lvbi5jb2RlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVnaW9uQ291bnRyeSkge1xuICAgICAgICB0aGlzLmFkZHJlc3MuY291bnRyeSA9IHJlZ2lvbkNvdW50cnkuY29kZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNoYW5nZSgpO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZShldmVudD8pIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb25maWcuc2VhcmNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGRyZXNzQ2hhbmdlLmVtaXQodGhpcy5hZGRyZXNzKTtcbiAgICB9XG5cbiAgICBjb25zdCBnZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpO1xuICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgdGhpcy5hZGRyZXNzLmNvdW50cnksXG4gICAgICB0aGlzLmFkZHJlc3MucmVnaW9uLFxuICAgICAgdGhpcy5hZGRyZXNzLmNpdHksXG4gICAgICB0aGlzLmFkZHJlc3MuemlwLFxu