@contentful/field-editor-location 1.2.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"field-editor-location.cjs.production.min.js","sources":["../src/GoogleMapView.tsx","../src/LocationSearchInput.tsx","../src/types.ts","../src/LocationSelector.tsx","../src/LocationEditor.tsx","../src/index.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport React from 'react';\n\nimport { css } from 'emotion';\nimport GoogleMapReact from 'google-map-react';\n\nimport { Coords } from './types';\n\nconst styles = {\n root: css({\n height: '300px',\n width: '100%',\n }),\n};\n\nconst BerlinLocation = {\n lat: 52.5018,\n lng: 13.41115439,\n};\n\ntype GoogleMapViewProps = {\n disabled: boolean;\n location: Coords | undefined;\n onGoogleApiLoaded: ({ maps }: { maps: any }) => void;\n onChangeLocation: (location: Coords) => void;\n googleMapsKey?: string;\n};\n\ntype GoogleMapsViewState = {\n marker: any;\n maps: any;\n};\n\nexport class GoogleMapView extends React.Component<GoogleMapViewProps, GoogleMapsViewState> {\n constructor(props: GoogleMapViewProps) {\n super(props);\n this.state = {\n marker: undefined,\n maps: undefined,\n };\n }\n\n componentDidUpdate() {\n if (this.state.marker && this.state.maps) {\n if (this.props.location) {\n const latLng = new this.state.maps.LatLng(this.props.location.lat, this.props.location.lng);\n this.state.marker.setPosition(latLng);\n this.state.marker.setVisible(true);\n } else {\n this.state.marker.setVisible(false);\n }\n this.state.marker.setDraggable(!this.props.disabled);\n this.state.marker.setCursor(this.props.disabled ? 'not-allowed' : 'auto');\n }\n }\n\n onGoogleApiLoaded = (event: { maps: any; map: any }) => {\n const { maps, map } = event;\n const marker = new maps.Marker({\n map,\n position: map.getCenter(),\n cursor: this.props.disabled ? 'not-allowed' : 'auto',\n draggable: !this.props.disabled,\n visible: Boolean(this.props.location),\n });\n\n maps.event.addListener(map, 'click', (event: any) => {\n if (this.props.disabled || !this.state.marker || !this.state.maps) {\n return;\n }\n this.state.marker.setPosition(event.latLng);\n this.state.marker.setVisible(true);\n this.props.onChangeLocation({\n lat: event.latLng.lat(),\n lng: event.latLng.lng(),\n });\n });\n\n maps.event.addListener(marker, 'dragend', (event: any) => {\n this.props.onChangeLocation({\n lat: event.latLng.lat(),\n lng: event.latLng.lng(),\n });\n });\n this.setState({ marker, maps }, () => {\n this.props.onGoogleApiLoaded({ maps });\n });\n };\n\n render() {\n return (\n <div className={styles.root}>\n <GoogleMapReact\n draggable={!this.props.disabled}\n bootstrapURLKeys={\n this.props.googleMapsKey ? { key: this.props.googleMapsKey } : undefined\n }\n defaultCenter={BerlinLocation}\n center={this.props.location}\n options={{\n scrollwheel: false,\n mapTypeId: 'roadmap',\n }}\n defaultZoom={6}\n yesIWantToUseGoogleMapApiInternals\n onGoogleApiLoaded={this.onGoogleApiLoaded}\n />\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport { Button, Card, Spinner, ValidationMessage, TextInput } from '@contentful/f36-components';\nimport tokens from '@contentful/f36-tokens';\nimport { css } from 'emotion';\n\nimport { Coords, GeocodeApiResponse } from './types';\n\nconst styles = {\n root: css({\n width: '100%',\n }),\n input: css({\n position: 'relative',\n width: '100%',\n }),\n spinner: css({\n position: 'absolute',\n right: 10,\n top: 10,\n zIndex: 99,\n }),\n validationMessage: css({\n marginTop: tokens.spacingS,\n }),\n suggestion: css({\n position: 'absolute',\n transform: 'translateY(100%)',\n bottom: 0,\n left: 0,\n zIndex: 1,\n }),\n};\n\ntype LocationSearchInputProps = {\n disabled: boolean;\n value?: Coords;\n onSearchAddress: (term: string) => Promise<GeocodeApiResponse>;\n onGetAddressFromLocation: (coors: Coords | undefined, value: string) => Promise<string>;\n onChangeLocation: (location?: Coords) => void;\n};\n\nexport function LocationSearchInput(props: LocationSearchInputProps) {\n const [isSearching, setIsSearching] = React.useState<boolean>(false);\n const [address, setAddress] = React.useState<string>('');\n const [hasError, setHasError] = React.useState<boolean>(false);\n const [suggestion, setSuggestion] = React.useState<null | {\n address: string;\n location: { lat: number; lng: number };\n }>(null);\n\n React.useEffect(() => {\n setIsSearching(true);\n props.onGetAddressFromLocation(props.value, address).then((address) => {\n setAddress(address);\n setIsSearching(false);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- TODO: Evaluate the dependencies\n }, [props.value, props.disabled]);\n\n return (\n <div className={styles.root}>\n <div className={styles.input}>\n <TextInput\n testId=\"location-editor-search\"\n isInvalid={hasError}\n placeholder=\"Start typing to find location\"\n value={address}\n onChange={(e) => {\n setAddress(e.target.value);\n setHasError(false);\n setSuggestion(null);\n\n if (e.target.value === '') {\n props.onChangeLocation(undefined);\n return;\n }\n\n setIsSearching(true);\n props.onSearchAddress(e.target.value).then((value) => {\n setIsSearching(false);\n if (value === null) {\n setHasError(false);\n } else if (value.length === 0) {\n setHasError(true);\n } else {\n setHasError(false);\n setSuggestion({\n address: value[0].formatted_address,\n location: {\n lat: Number(value[0].geometry.location.lat().toString().slice(0, 8)),\n lng: Number(value[0].geometry.location.lng().toString().slice(0, 8)),\n },\n });\n }\n });\n }}\n isDisabled={props.disabled}\n />\n {isSearching && <Spinner className={styles.spinner} />}\n {suggestion && (\n <Card padding=\"none\" className={styles.suggestion}>\n <Button\n variant=\"transparent\"\n testId=\"location-editor-suggestion\"\n onClick={() => {\n setAddress(suggestion.address);\n props.onChangeLocation(suggestion.location);\n setSuggestion(null);\n }}\n >\n {suggestion.address}\n </Button>\n </Card>\n )}\n {hasError && (\n <ValidationMessage\n testId=\"location-editor-not-found\"\n className={styles.validationMessage}\n >\n No results found for <strong>{address}</strong>. Please make sure that address is\n spelled correctly.\n </ValidationMessage>\n )}\n </div>\n </div>\n );\n}\n","export interface Coords {\n lat: number;\n lng: number;\n}\n\nexport type LocationValue = { lat: number; lon: number };\nexport type NullableLocationValue = LocationValue | null | undefined;\n\nexport enum ViewType {\n Address = 'Address',\n Coordinates = 'Coordinates',\n}\n\nexport type GeocodeApiResponse = null | Array<{\n formatted_address: string;\n geometry: {\n location: {\n lat: () => number;\n lng: () => number;\n };\n };\n}>;\n","import React from 'react';\n\nimport { TextLink, TextInput, Radio, Flex } from '@contentful/f36-components';\nimport tokens from '@contentful/f36-tokens';\nimport { css } from 'emotion';\n\nimport { LocationSearchInput } from './LocationSearchInput';\nimport { Coords, ViewType, GeocodeApiResponse } from './types';\n\ninterface LocationSelectorProps {\n disabled: boolean;\n value: Coords | undefined;\n view: ViewType;\n onChangeView: (view: ViewType) => void;\n onChangeLocation: (value?: Coords) => void;\n onSearchAddress: (value: string) => Promise<GeocodeApiResponse>;\n onGetAddressFromLocation: (location: Coords | undefined, address: string) => Promise<string>;\n}\n\nconst styles = {\n root: css({\n display: 'flex',\n flexDirection: 'row',\n marginTop: tokens.spacingS,\n alignItems: 'flex-end',\n }),\n main: css({\n flexGrow: 1,\n }),\n secondary: css({\n minWidth: '70px',\n textAlign: 'right',\n }),\n inputsRow: css({\n display: 'flex',\n marginTop: tokens.spacingS,\n fontSize: tokens.fontSizeM,\n color: tokens.gray900,\n fontFamily: tokens.fontStackPrimary,\n alignItems: 'center',\n }),\n splitter: css({\n width: tokens.spacingL,\n }),\n clearBtn: css({\n marginBottom: tokens.spacingS,\n }),\n};\n\nexport function LocationSelector(props: LocationSelectorProps) {\n return (\n <div className={styles.root}>\n <div className={styles.main}>\n <Flex flexDirection=\"row\">\n <Radio\n className={css({ flexBasis: '100%' })}\n id={ViewType.Address}\n testId=\"location-editor-address-radio\"\n isDisabled={props.disabled}\n value={ViewType.Address}\n isChecked={props.view === ViewType.Address}\n onChange={() => {\n props.onChangeView(ViewType.Address);\n }}\n >\n Address\n </Radio>\n <Radio\n className={css({ flexBasis: '100%' })}\n id={ViewType.Coordinates}\n testId=\"location-editor-coordinates-radio\"\n isDisabled={props.disabled}\n value={ViewType.Coordinates}\n isChecked={props.view === ViewType.Coordinates}\n onChange={() => {\n props.onChangeView(ViewType.Coordinates);\n }}\n >\n Coordinates\n </Radio>\n </Flex>\n {props.view === ViewType.Address && (\n <div className={styles.inputsRow}>\n <LocationSearchInput\n onSearchAddress={props.onSearchAddress}\n onGetAddressFromLocation={props.onGetAddressFromLocation}\n disabled={props.disabled}\n value={props.value}\n onChangeLocation={props.onChangeLocation}\n />\n </div>\n )}\n {props.view === ViewType.Coordinates && (\n <div className={styles.inputsRow}>\n <label htmlFor=\"latitude\">Latitude</label>\n <div className={styles.splitter} />\n <TextInput\n id=\"latitude\"\n testId=\"location-editor-latitude\"\n placeholder=\"Between -90 and 90\"\n isDisabled={props.disabled}\n value={props.value ? String(props.value.lat) : ''}\n onChange={(e) => {\n props.onChangeLocation({\n lng: props.value && props.value.lng !== undefined ? props.value.lng : 0,\n lat: Number(e.target.value) || 0,\n });\n }}\n type=\"number\"\n max=\"90\"\n min=\"-90\"\n step=\"0.1\"\n />\n <div className={styles.splitter} />\n <label htmlFor=\"longitude\">Longitude</label>\n <div className={styles.splitter} />\n <TextInput\n id=\"longitude\"\n testId=\"location-editor-longitude\"\n placeholder=\"Between -180 and 180\"\n isDisabled={props.disabled}\n value={props.value ? String(props.value.lng) : ''}\n onChange={(e) => {\n props.onChangeLocation({\n lat: props.value && props.value.lat !== undefined ? props.value.lat : 0,\n lng: Number(e.target.value) || 0,\n });\n }}\n type=\"number\"\n max=\"180\"\n min=\"-180\"\n step=\"0.1\"\n />\n </div>\n )}\n </div>\n <div className={styles.secondary}>\n <TextLink\n as=\"button\"\n isDisabled={props.disabled}\n testId=\"location-editor-clear\"\n className={styles.clearBtn}\n onClick={() => {\n props.onChangeLocation(undefined);\n }}\n >\n Clear\n </TextLink>\n </div>\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { FieldAPI, FieldConnector, ParametersAPI } from '@contentful/field-editor-shared';\nimport deepEqual from 'deep-equal';\nimport isNumber from 'lodash/isNumber';\nimport throttle from 'lodash/throttle';\n\nimport { GoogleMapView } from './GoogleMapView';\nimport { LocationSelector } from './LocationSelector';\nimport {\n LocationValue,\n ViewType,\n NullableLocationValue,\n Coords,\n GeocodeApiResponse,\n} from './types';\n\nexport interface LocationEditorConnectedProps {\n /**\n * is the field disabled initially\n */\n isInitiallyDisabled: boolean;\n\n /**\n * sdk.field\n */\n field: FieldAPI;\n\n /**\n * sdk.parameters\n */\n parameters?: ParametersAPI & {\n instance: {\n googleMapsKey?: string;\n };\n };\n}\n\ntype LocationEditorProps = {\n disabled: boolean;\n value: NullableLocationValue;\n setValue: (value: NullableLocationValue) => void;\n googleMapsKey?: string;\n selectedView: ViewType;\n setSelectedView: (view: ViewType) => void;\n};\n\nfunction toLocationValue(coords?: Coords): NullableLocationValue {\n if (coords && isNumber(coords.lat) && isNumber(coords.lng)) {\n return { lat: coords.lat, lon: coords.lng };\n } else {\n return null;\n }\n}\n\nexport class LocationEditor extends React.Component<\n LocationEditorProps,\n {\n localValue?: Coords;\n mapsObject: any; // eslint-disable-line -- TODO: describe this disable @typescript-eslint/no-explicit-any\n }\n> {\n constructor(props: LocationEditorProps) {\n super(props);\n\n this.state = {\n localValue: props.value\n ? {\n lng: props.value.lon,\n lat: props.value.lat,\n }\n : undefined,\n mapsObject: null,\n };\n }\n\n // @ts-expect-error\n onSearchAddress: (value: string) => Promise<GeocodeApiResponse> = throttle((value) => {\n if (!this.state.mapsObject) {\n return Promise.resolve(null);\n }\n const { mapsObject } = this.state;\n if (!value) {\n return Promise.resolve(null);\n }\n return new Promise((resolve) => {\n const geocoder = new mapsObject.Geocoder();\n geocoder.geocode({ address: value }, resolve, () => {\n resolve(null);\n });\n });\n }, 300);\n\n onGetAddressFromLocation = (location: Coords | undefined, value: string): Promise<string> => {\n if (!this.state.mapsObject || !location) {\n return Promise.resolve('');\n }\n const { mapsObject } = this.state;\n return new Promise((resolve) => {\n const geocoder = new mapsObject.Geocoder();\n geocoder.geocode(\n { location },\n (result: GeocodeApiResponse) => {\n if (result && result.length > 0) {\n const addresses = result.map((item) => item.formatted_address);\n resolve(addresses.find((item) => item === value) || addresses[0]);\n } else {\n resolve('');\n }\n },\n () => {\n resolve('');\n }\n );\n });\n };\n\n render() {\n const { mapsObject, localValue } = this.state;\n\n return (\n <div data-test-id=\"location-editor\">\n <GoogleMapView\n disabled={this.props.disabled || mapsObject === null}\n googleMapsKey={this.props.googleMapsKey}\n location={localValue}\n onGoogleApiLoaded={({ maps }) => {\n this.setState({ mapsObject: maps });\n }}\n onChangeLocation={(coords) => {\n this.setState({ localValue: coords });\n this.props.setValue(toLocationValue(coords));\n }}\n />\n <LocationSelector\n disabled={this.props.disabled || mapsObject === null}\n value={localValue}\n view={this.props.selectedView}\n onChangeView={(view) => {\n this.props.setSelectedView(view);\n }}\n onChangeLocation={(coords) => {\n this.setState({ localValue: coords });\n this.props.setValue(toLocationValue(coords));\n }}\n onSearchAddress={this.onSearchAddress}\n onGetAddressFromLocation={this.onGetAddressFromLocation}\n />\n </div>\n );\n }\n}\n\nexport function LocationEditorConnected(props: LocationEditorConnectedProps) {\n const { field } = props;\n const googleMapsKey = props.parameters ? props.parameters.instance.googleMapsKey : undefined;\n const [selectedView, setSelectedView] = React.useState<ViewType>(ViewType.Address);\n\n return (\n <FieldConnector<LocationValue>\n isEqualValues={(value1, value2) => {\n return deepEqual(value1, value2);\n }}\n field={field}\n isInitiallyDisabled={props.isInitiallyDisabled}\n >\n {({ value, disabled, setValue, externalReset }) => {\n return (\n <LocationEditor\n // on external change reset component completely and init with initial value again\n key={`location-editor-${externalReset}`}\n value={value}\n disabled={disabled}\n setValue={setValue}\n googleMapsKey={googleMapsKey}\n selectedView={selectedView}\n setSelectedView={setSelectedView}\n />\n );\n }}\n </FieldConnector>\n );\n}\n\nLocationEditorConnected.defaultProps = {\n isInitiallyDisabled: true,\n};\n","import { LocationEditorConnected } from './LocationEditor';\n\nexport const LocationEditor = LocationEditorConnected;\n"],"names":["styles","root","css","height","width","BerlinLocation","lat","lng","GoogleMapView","React","Component","constructor","props","onGoogleApiLoaded","event","maps","map","marker","Marker","position","getCenter","cursor","this","disabled","draggable","visible","Boolean","location","addListener","state","setPosition","latLng","setVisible","onChangeLocation","setState","undefined","componentDidUpdate","LatLng","setDraggable","setCursor","render","className","GoogleMapReact","bootstrapURLKeys","googleMapsKey","key","defaultCenter","center","options","scrollwheel","mapTypeId","defaultZoom","yesIWantToUseGoogleMapApiInternals","input","spinner","right","top","zIndex","validationMessage","marginTop","tokens","spacingS","suggestion","transform","bottom","left","LocationSearchInput","isSearching","setIsSearching","useState","address","setAddress","hasError","setHasError","setSuggestion","useEffect","onGetAddressFromLocation","value","then","TextInput","testId","isInvalid","placeholder","onChange","e","target","onSearchAddress","length","formatted_address","Number","geometry","toString","slice","isDisabled","Spinner","Card","padding","Button","variant","onClick","ValidationMessage","ViewType","display","flexDirection","alignItems","main","flexGrow","secondary","minWidth","textAlign","inputsRow","fontSize","fontSizeM","color","gray900","fontFamily","fontStackPrimary","splitter","spacingL","clearBtn","marginBottom","LocationSelector","Flex","Radio","flexBasis","id","Address","isChecked","view","onChangeView","Coordinates","htmlFor","String","type","max","min","step","TextLink","as","toLocationValue","coords","isNumber","lon","LocationEditor","throttle","mapsObject","Promise","resolve","Geocoder","geocode","result","addresses","item","find","localValue","setValue","selectedView","setSelectedView","LocationEditorConnected","field","parameters","instance","FieldConnector","isEqualValues","value1","value2","deepEqual","isInitiallyDisabled","externalReset","defaultProps"],"mappings":"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"}
@@ -1,490 +0,0 @@
1
- import React__default, { useState, createElement, Component } from 'react';
2
- import { FieldConnector } from '@contentful/field-editor-shared';
3
- import deepEqual from 'deep-equal';
4
- import isNumber from 'lodash-es/isNumber';
5
- import throttle from 'lodash-es/throttle';
6
- import { css } from 'emotion';
7
- import GoogleMapReact from 'google-map-react';
8
- import { TextInput, Spinner, Card, Button, ValidationMessage, Flex, Radio, TextLink } from '@contentful/f36-components';
9
- import tokens from '@contentful/f36-tokens';
10
-
11
- /* eslint-disable @typescript-eslint/no-explicit-any */
12
- const styles = {
13
- root: /*#__PURE__*/css({
14
- height: '300px',
15
- width: '100%'
16
- })
17
- };
18
- const BerlinLocation = {
19
- lat: 52.5018,
20
- lng: 13.41115439
21
- };
22
- class GoogleMapView extends React__default.Component {
23
- constructor(props) {
24
- super(props);
25
-
26
- this.onGoogleApiLoaded = event => {
27
- const {
28
- maps,
29
- map
30
- } = event;
31
- const marker = new maps.Marker({
32
- map,
33
- position: map.getCenter(),
34
- cursor: this.props.disabled ? 'not-allowed' : 'auto',
35
- draggable: !this.props.disabled,
36
- visible: Boolean(this.props.location)
37
- });
38
- maps.event.addListener(map, 'click', event => {
39
- if (this.props.disabled || !this.state.marker || !this.state.maps) {
40
- return;
41
- }
42
-
43
- this.state.marker.setPosition(event.latLng);
44
- this.state.marker.setVisible(true);
45
- this.props.onChangeLocation({
46
- lat: event.latLng.lat(),
47
- lng: event.latLng.lng()
48
- });
49
- });
50
- maps.event.addListener(marker, 'dragend', event => {
51
- this.props.onChangeLocation({
52
- lat: event.latLng.lat(),
53
- lng: event.latLng.lng()
54
- });
55
- });
56
- this.setState({
57
- marker,
58
- maps
59
- }, () => {
60
- this.props.onGoogleApiLoaded({
61
- maps
62
- });
63
- });
64
- };
65
-
66
- this.state = {
67
- marker: undefined,
68
- maps: undefined
69
- };
70
- }
71
-
72
- componentDidUpdate() {
73
- if (this.state.marker && this.state.maps) {
74
- if (this.props.location) {
75
- const latLng = new this.state.maps.LatLng(this.props.location.lat, this.props.location.lng);
76
- this.state.marker.setPosition(latLng);
77
- this.state.marker.setVisible(true);
78
- } else {
79
- this.state.marker.setVisible(false);
80
- }
81
-
82
- this.state.marker.setDraggable(!this.props.disabled);
83
- this.state.marker.setCursor(this.props.disabled ? 'not-allowed' : 'auto');
84
- }
85
- }
86
-
87
- render() {
88
- return React__default.createElement("div", {
89
- className: styles.root
90
- }, React__default.createElement(GoogleMapReact, {
91
- draggable: !this.props.disabled,
92
- bootstrapURLKeys: this.props.googleMapsKey ? {
93
- key: this.props.googleMapsKey
94
- } : undefined,
95
- defaultCenter: BerlinLocation,
96
- center: this.props.location,
97
- options: {
98
- scrollwheel: false,
99
- mapTypeId: 'roadmap'
100
- },
101
- defaultZoom: 6,
102
- yesIWantToUseGoogleMapApiInternals: true,
103
- onGoogleApiLoaded: this.onGoogleApiLoaded
104
- }));
105
- }
106
-
107
- }
108
-
109
- const styles$1 = {
110
- root: /*#__PURE__*/css({
111
- width: '100%'
112
- }),
113
- input: /*#__PURE__*/css({
114
- position: 'relative',
115
- width: '100%'
116
- }),
117
- spinner: /*#__PURE__*/css({
118
- position: 'absolute',
119
- right: 10,
120
- top: 10,
121
- zIndex: 99
122
- }),
123
- validationMessage: /*#__PURE__*/css({
124
- marginTop: tokens.spacingS
125
- }),
126
- suggestion: /*#__PURE__*/css({
127
- position: 'absolute',
128
- transform: 'translateY(100%)',
129
- bottom: 0,
130
- left: 0,
131
- zIndex: 1
132
- })
133
- };
134
- function LocationSearchInput(props) {
135
- const [isSearching, setIsSearching] = React__default.useState(false);
136
- const [address, setAddress] = React__default.useState('');
137
- const [hasError, setHasError] = React__default.useState(false);
138
- const [suggestion, setSuggestion] = React__default.useState(null);
139
- React__default.useEffect(() => {
140
- setIsSearching(true);
141
- props.onGetAddressFromLocation(props.value, address).then(address => {
142
- setAddress(address);
143
- setIsSearching(false);
144
- }); // eslint-disable-next-line react-hooks/exhaustive-deps -- TODO: Evaluate the dependencies
145
- }, [props.value, props.disabled]);
146
- return React__default.createElement("div", {
147
- className: styles$1.root
148
- }, React__default.createElement("div", {
149
- className: styles$1.input
150
- }, React__default.createElement(TextInput, {
151
- testId: "location-editor-search",
152
- isInvalid: hasError,
153
- placeholder: "Start typing to find location",
154
- value: address,
155
- onChange: e => {
156
- setAddress(e.target.value);
157
- setHasError(false);
158
- setSuggestion(null);
159
-
160
- if (e.target.value === '') {
161
- props.onChangeLocation(undefined);
162
- return;
163
- }
164
-
165
- setIsSearching(true);
166
- props.onSearchAddress(e.target.value).then(value => {
167
- setIsSearching(false);
168
-
169
- if (value === null) {
170
- setHasError(false);
171
- } else if (value.length === 0) {
172
- setHasError(true);
173
- } else {
174
- setHasError(false);
175
- setSuggestion({
176
- address: value[0].formatted_address,
177
- location: {
178
- lat: Number(value[0].geometry.location.lat().toString().slice(0, 8)),
179
- lng: Number(value[0].geometry.location.lng().toString().slice(0, 8))
180
- }
181
- });
182
- }
183
- });
184
- },
185
- isDisabled: props.disabled
186
- }), isSearching && React__default.createElement(Spinner, {
187
- className: styles$1.spinner
188
- }), suggestion && React__default.createElement(Card, {
189
- padding: "none",
190
- className: styles$1.suggestion
191
- }, React__default.createElement(Button, {
192
- variant: "transparent",
193
- testId: "location-editor-suggestion",
194
- onClick: () => {
195
- setAddress(suggestion.address);
196
- props.onChangeLocation(suggestion.location);
197
- setSuggestion(null);
198
- }
199
- }, suggestion.address)), hasError && React__default.createElement(ValidationMessage, {
200
- testId: "location-editor-not-found",
201
- className: styles$1.validationMessage
202
- }, "No results found for ", React__default.createElement("strong", null, address), ". Please make sure that address is spelled correctly.")));
203
- }
204
-
205
- var ViewType;
206
-
207
- (function (ViewType) {
208
- ViewType["Address"] = "Address";
209
- ViewType["Coordinates"] = "Coordinates";
210
- })(ViewType || (ViewType = {}));
211
-
212
- const styles$2 = {
213
- root: /*#__PURE__*/css({
214
- display: 'flex',
215
- flexDirection: 'row',
216
- marginTop: tokens.spacingS,
217
- alignItems: 'flex-end'
218
- }),
219
- main: /*#__PURE__*/css({
220
- flexGrow: 1
221
- }),
222
- secondary: /*#__PURE__*/css({
223
- minWidth: '70px',
224
- textAlign: 'right'
225
- }),
226
- inputsRow: /*#__PURE__*/css({
227
- display: 'flex',
228
- marginTop: tokens.spacingS,
229
- fontSize: tokens.fontSizeM,
230
- color: tokens.gray900,
231
- fontFamily: tokens.fontStackPrimary,
232
- alignItems: 'center'
233
- }),
234
- splitter: /*#__PURE__*/css({
235
- width: tokens.spacingL
236
- }),
237
- clearBtn: /*#__PURE__*/css({
238
- marginBottom: tokens.spacingS
239
- })
240
- };
241
- function LocationSelector(props) {
242
- return React__default.createElement("div", {
243
- className: styles$2.root
244
- }, React__default.createElement("div", {
245
- className: styles$2.main
246
- }, React__default.createElement(Flex, {
247
- flexDirection: "row"
248
- }, React__default.createElement(Radio, {
249
- className: css({
250
- flexBasis: '100%'
251
- }),
252
- id: ViewType.Address,
253
- testId: "location-editor-address-radio",
254
- isDisabled: props.disabled,
255
- value: ViewType.Address,
256
- isChecked: props.view === ViewType.Address,
257
- onChange: () => {
258
- props.onChangeView(ViewType.Address);
259
- }
260
- }, "Address"), React__default.createElement(Radio, {
261
- className: css({
262
- flexBasis: '100%'
263
- }),
264
- id: ViewType.Coordinates,
265
- testId: "location-editor-coordinates-radio",
266
- isDisabled: props.disabled,
267
- value: ViewType.Coordinates,
268
- isChecked: props.view === ViewType.Coordinates,
269
- onChange: () => {
270
- props.onChangeView(ViewType.Coordinates);
271
- }
272
- }, "Coordinates")), props.view === ViewType.Address && React__default.createElement("div", {
273
- className: styles$2.inputsRow
274
- }, React__default.createElement(LocationSearchInput, {
275
- onSearchAddress: props.onSearchAddress,
276
- onGetAddressFromLocation: props.onGetAddressFromLocation,
277
- disabled: props.disabled,
278
- value: props.value,
279
- onChangeLocation: props.onChangeLocation
280
- })), props.view === ViewType.Coordinates && React__default.createElement("div", {
281
- className: styles$2.inputsRow
282
- }, React__default.createElement("label", {
283
- htmlFor: "latitude"
284
- }, "Latitude"), React__default.createElement("div", {
285
- className: styles$2.splitter
286
- }), React__default.createElement(TextInput, {
287
- id: "latitude",
288
- testId: "location-editor-latitude",
289
- placeholder: "Between -90 and 90",
290
- isDisabled: props.disabled,
291
- value: props.value ? String(props.value.lat) : '',
292
- onChange: e => {
293
- props.onChangeLocation({
294
- lng: props.value && props.value.lng !== undefined ? props.value.lng : 0,
295
- lat: Number(e.target.value) || 0
296
- });
297
- },
298
- type: "number",
299
- max: "90",
300
- min: "-90",
301
- step: "0.1"
302
- }), React__default.createElement("div", {
303
- className: styles$2.splitter
304
- }), React__default.createElement("label", {
305
- htmlFor: "longitude"
306
- }, "Longitude"), React__default.createElement("div", {
307
- className: styles$2.splitter
308
- }), React__default.createElement(TextInput, {
309
- id: "longitude",
310
- testId: "location-editor-longitude",
311
- placeholder: "Between -180 and 180",
312
- isDisabled: props.disabled,
313
- value: props.value ? String(props.value.lng) : '',
314
- onChange: e => {
315
- props.onChangeLocation({
316
- lat: props.value && props.value.lat !== undefined ? props.value.lat : 0,
317
- lng: Number(e.target.value) || 0
318
- });
319
- },
320
- type: "number",
321
- max: "180",
322
- min: "-180",
323
- step: "0.1"
324
- }))), React__default.createElement("div", {
325
- className: styles$2.secondary
326
- }, React__default.createElement(TextLink, {
327
- as: "button",
328
- isDisabled: props.disabled,
329
- testId: "location-editor-clear",
330
- className: styles$2.clearBtn,
331
- onClick: () => {
332
- props.onChangeLocation(undefined);
333
- }
334
- }, "Clear")));
335
- }
336
-
337
- function toLocationValue(coords) {
338
- if (coords && isNumber(coords.lat) && isNumber(coords.lng)) {
339
- return {
340
- lat: coords.lat,
341
- lon: coords.lng
342
- };
343
- } else {
344
- return null;
345
- }
346
- }
347
-
348
- class LocationEditor extends Component {
349
- constructor(props) {
350
- super(props);
351
- this.onSearchAddress = throttle(value => {
352
- if (!this.state.mapsObject) {
353
- return Promise.resolve(null);
354
- }
355
-
356
- const {
357
- mapsObject
358
- } = this.state;
359
-
360
- if (!value) {
361
- return Promise.resolve(null);
362
- }
363
-
364
- return new Promise(resolve => {
365
- const geocoder = new mapsObject.Geocoder();
366
- geocoder.geocode({
367
- address: value
368
- }, resolve, () => {
369
- resolve(null);
370
- });
371
- });
372
- }, 300);
373
-
374
- this.onGetAddressFromLocation = (location, value) => {
375
- if (!this.state.mapsObject || !location) {
376
- return Promise.resolve('');
377
- }
378
-
379
- const {
380
- mapsObject
381
- } = this.state;
382
- return new Promise(resolve => {
383
- const geocoder = new mapsObject.Geocoder();
384
- geocoder.geocode({
385
- location
386
- }, result => {
387
- if (result && result.length > 0) {
388
- const addresses = result.map(item => item.formatted_address);
389
- resolve(addresses.find(item => item === value) || addresses[0]);
390
- } else {
391
- resolve('');
392
- }
393
- }, () => {
394
- resolve('');
395
- });
396
- });
397
- };
398
-
399
- this.state = {
400
- localValue: props.value ? {
401
- lng: props.value.lon,
402
- lat: props.value.lat
403
- } : undefined,
404
- mapsObject: null
405
- };
406
- } // @ts-expect-error
407
-
408
-
409
- render() {
410
- const {
411
- mapsObject,
412
- localValue
413
- } = this.state;
414
- return createElement("div", {
415
- "data-test-id": "location-editor"
416
- }, createElement(GoogleMapView, {
417
- disabled: this.props.disabled || mapsObject === null,
418
- googleMapsKey: this.props.googleMapsKey,
419
- location: localValue,
420
- onGoogleApiLoaded: ({
421
- maps
422
- }) => {
423
- this.setState({
424
- mapsObject: maps
425
- });
426
- },
427
- onChangeLocation: coords => {
428
- this.setState({
429
- localValue: coords
430
- });
431
- this.props.setValue(toLocationValue(coords));
432
- }
433
- }), createElement(LocationSelector, {
434
- disabled: this.props.disabled || mapsObject === null,
435
- value: localValue,
436
- view: this.props.selectedView,
437
- onChangeView: view => {
438
- this.props.setSelectedView(view);
439
- },
440
- onChangeLocation: coords => {
441
- this.setState({
442
- localValue: coords
443
- });
444
- this.props.setValue(toLocationValue(coords));
445
- },
446
- onSearchAddress: this.onSearchAddress,
447
- onGetAddressFromLocation: this.onGetAddressFromLocation
448
- }));
449
- }
450
-
451
- }
452
- function LocationEditorConnected(props) {
453
- const {
454
- field
455
- } = props;
456
- const googleMapsKey = props.parameters ? props.parameters.instance.googleMapsKey : undefined;
457
- const [selectedView, setSelectedView] = useState(ViewType.Address);
458
- return createElement(FieldConnector, {
459
- isEqualValues: (value1, value2) => {
460
- return deepEqual(value1, value2);
461
- },
462
- field: field,
463
- isInitiallyDisabled: props.isInitiallyDisabled
464
- }, ({
465
- value,
466
- disabled,
467
- setValue,
468
- externalReset
469
- }) => {
470
- return createElement(LocationEditor // on external change reset component completely and init with initial value again
471
- , {
472
- // on external change reset component completely and init with initial value again
473
- key: `location-editor-${externalReset}`,
474
- value: value,
475
- disabled: disabled,
476
- setValue: setValue,
477
- googleMapsKey: googleMapsKey,
478
- selectedView: selectedView,
479
- setSelectedView: setSelectedView
480
- });
481
- });
482
- }
483
- LocationEditorConnected.defaultProps = {
484
- isInitiallyDisabled: true
485
- };
486
-
487
- const LocationEditor$1 = LocationEditorConnected;
488
-
489
- export { LocationEditor$1 as LocationEditor };
490
- //# sourceMappingURL=field-editor-location.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"field-editor-location.esm.js","sources":["../src/GoogleMapView.tsx","../src/LocationSearchInput.tsx","../src/types.ts","../src/LocationSelector.tsx","../src/LocationEditor.tsx","../src/index.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport React from 'react';\n\nimport { css } from 'emotion';\nimport GoogleMapReact from 'google-map-react';\n\nimport { Coords } from './types';\n\nconst styles = {\n root: css({\n height: '300px',\n width: '100%',\n }),\n};\n\nconst BerlinLocation = {\n lat: 52.5018,\n lng: 13.41115439,\n};\n\ntype GoogleMapViewProps = {\n disabled: boolean;\n location: Coords | undefined;\n onGoogleApiLoaded: ({ maps }: { maps: any }) => void;\n onChangeLocation: (location: Coords) => void;\n googleMapsKey?: string;\n};\n\ntype GoogleMapsViewState = {\n marker: any;\n maps: any;\n};\n\nexport class GoogleMapView extends React.Component<GoogleMapViewProps, GoogleMapsViewState> {\n constructor(props: GoogleMapViewProps) {\n super(props);\n this.state = {\n marker: undefined,\n maps: undefined,\n };\n }\n\n componentDidUpdate() {\n if (this.state.marker && this.state.maps) {\n if (this.props.location) {\n const latLng = new this.state.maps.LatLng(this.props.location.lat, this.props.location.lng);\n this.state.marker.setPosition(latLng);\n this.state.marker.setVisible(true);\n } else {\n this.state.marker.setVisible(false);\n }\n this.state.marker.setDraggable(!this.props.disabled);\n this.state.marker.setCursor(this.props.disabled ? 'not-allowed' : 'auto');\n }\n }\n\n onGoogleApiLoaded = (event: { maps: any; map: any }) => {\n const { maps, map } = event;\n const marker = new maps.Marker({\n map,\n position: map.getCenter(),\n cursor: this.props.disabled ? 'not-allowed' : 'auto',\n draggable: !this.props.disabled,\n visible: Boolean(this.props.location),\n });\n\n maps.event.addListener(map, 'click', (event: any) => {\n if (this.props.disabled || !this.state.marker || !this.state.maps) {\n return;\n }\n this.state.marker.setPosition(event.latLng);\n this.state.marker.setVisible(true);\n this.props.onChangeLocation({\n lat: event.latLng.lat(),\n lng: event.latLng.lng(),\n });\n });\n\n maps.event.addListener(marker, 'dragend', (event: any) => {\n this.props.onChangeLocation({\n lat: event.latLng.lat(),\n lng: event.latLng.lng(),\n });\n });\n this.setState({ marker, maps }, () => {\n this.props.onGoogleApiLoaded({ maps });\n });\n };\n\n render() {\n return (\n <div className={styles.root}>\n <GoogleMapReact\n draggable={!this.props.disabled}\n bootstrapURLKeys={\n this.props.googleMapsKey ? { key: this.props.googleMapsKey } : undefined\n }\n defaultCenter={BerlinLocation}\n center={this.props.location}\n options={{\n scrollwheel: false,\n mapTypeId: 'roadmap',\n }}\n defaultZoom={6}\n yesIWantToUseGoogleMapApiInternals\n onGoogleApiLoaded={this.onGoogleApiLoaded}\n />\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport { Button, Card, Spinner, ValidationMessage, TextInput } from '@contentful/f36-components';\nimport tokens from '@contentful/f36-tokens';\nimport { css } from 'emotion';\n\nimport { Coords, GeocodeApiResponse } from './types';\n\nconst styles = {\n root: css({\n width: '100%',\n }),\n input: css({\n position: 'relative',\n width: '100%',\n }),\n spinner: css({\n position: 'absolute',\n right: 10,\n top: 10,\n zIndex: 99,\n }),\n validationMessage: css({\n marginTop: tokens.spacingS,\n }),\n suggestion: css({\n position: 'absolute',\n transform: 'translateY(100%)',\n bottom: 0,\n left: 0,\n zIndex: 1,\n }),\n};\n\ntype LocationSearchInputProps = {\n disabled: boolean;\n value?: Coords;\n onSearchAddress: (term: string) => Promise<GeocodeApiResponse>;\n onGetAddressFromLocation: (coors: Coords | undefined, value: string) => Promise<string>;\n onChangeLocation: (location?: Coords) => void;\n};\n\nexport function LocationSearchInput(props: LocationSearchInputProps) {\n const [isSearching, setIsSearching] = React.useState<boolean>(false);\n const [address, setAddress] = React.useState<string>('');\n const [hasError, setHasError] = React.useState<boolean>(false);\n const [suggestion, setSuggestion] = React.useState<null | {\n address: string;\n location: { lat: number; lng: number };\n }>(null);\n\n React.useEffect(() => {\n setIsSearching(true);\n props.onGetAddressFromLocation(props.value, address).then((address) => {\n setAddress(address);\n setIsSearching(false);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- TODO: Evaluate the dependencies\n }, [props.value, props.disabled]);\n\n return (\n <div className={styles.root}>\n <div className={styles.input}>\n <TextInput\n testId=\"location-editor-search\"\n isInvalid={hasError}\n placeholder=\"Start typing to find location\"\n value={address}\n onChange={(e) => {\n setAddress(e.target.value);\n setHasError(false);\n setSuggestion(null);\n\n if (e.target.value === '') {\n props.onChangeLocation(undefined);\n return;\n }\n\n setIsSearching(true);\n props.onSearchAddress(e.target.value).then((value) => {\n setIsSearching(false);\n if (value === null) {\n setHasError(false);\n } else if (value.length === 0) {\n setHasError(true);\n } else {\n setHasError(false);\n setSuggestion({\n address: value[0].formatted_address,\n location: {\n lat: Number(value[0].geometry.location.lat().toString().slice(0, 8)),\n lng: Number(value[0].geometry.location.lng().toString().slice(0, 8)),\n },\n });\n }\n });\n }}\n isDisabled={props.disabled}\n />\n {isSearching && <Spinner className={styles.spinner} />}\n {suggestion && (\n <Card padding=\"none\" className={styles.suggestion}>\n <Button\n variant=\"transparent\"\n testId=\"location-editor-suggestion\"\n onClick={() => {\n setAddress(suggestion.address);\n props.onChangeLocation(suggestion.location);\n setSuggestion(null);\n }}\n >\n {suggestion.address}\n </Button>\n </Card>\n )}\n {hasError && (\n <ValidationMessage\n testId=\"location-editor-not-found\"\n className={styles.validationMessage}\n >\n No results found for <strong>{address}</strong>. Please make sure that address is\n spelled correctly.\n </ValidationMessage>\n )}\n </div>\n </div>\n );\n}\n","export interface Coords {\n lat: number;\n lng: number;\n}\n\nexport type LocationValue = { lat: number; lon: number };\nexport type NullableLocationValue = LocationValue | null | undefined;\n\nexport enum ViewType {\n Address = 'Address',\n Coordinates = 'Coordinates',\n}\n\nexport type GeocodeApiResponse = null | Array<{\n formatted_address: string;\n geometry: {\n location: {\n lat: () => number;\n lng: () => number;\n };\n };\n}>;\n","import React from 'react';\n\nimport { TextLink, TextInput, Radio, Flex } from '@contentful/f36-components';\nimport tokens from '@contentful/f36-tokens';\nimport { css } from 'emotion';\n\nimport { LocationSearchInput } from './LocationSearchInput';\nimport { Coords, ViewType, GeocodeApiResponse } from './types';\n\ninterface LocationSelectorProps {\n disabled: boolean;\n value: Coords | undefined;\n view: ViewType;\n onChangeView: (view: ViewType) => void;\n onChangeLocation: (value?: Coords) => void;\n onSearchAddress: (value: string) => Promise<GeocodeApiResponse>;\n onGetAddressFromLocation: (location: Coords | undefined, address: string) => Promise<string>;\n}\n\nconst styles = {\n root: css({\n display: 'flex',\n flexDirection: 'row',\n marginTop: tokens.spacingS,\n alignItems: 'flex-end',\n }),\n main: css({\n flexGrow: 1,\n }),\n secondary: css({\n minWidth: '70px',\n textAlign: 'right',\n }),\n inputsRow: css({\n display: 'flex',\n marginTop: tokens.spacingS,\n fontSize: tokens.fontSizeM,\n color: tokens.gray900,\n fontFamily: tokens.fontStackPrimary,\n alignItems: 'center',\n }),\n splitter: css({\n width: tokens.spacingL,\n }),\n clearBtn: css({\n marginBottom: tokens.spacingS,\n }),\n};\n\nexport function LocationSelector(props: LocationSelectorProps) {\n return (\n <div className={styles.root}>\n <div className={styles.main}>\n <Flex flexDirection=\"row\">\n <Radio\n className={css({ flexBasis: '100%' })}\n id={ViewType.Address}\n testId=\"location-editor-address-radio\"\n isDisabled={props.disabled}\n value={ViewType.Address}\n isChecked={props.view === ViewType.Address}\n onChange={() => {\n props.onChangeView(ViewType.Address);\n }}\n >\n Address\n </Radio>\n <Radio\n className={css({ flexBasis: '100%' })}\n id={ViewType.Coordinates}\n testId=\"location-editor-coordinates-radio\"\n isDisabled={props.disabled}\n value={ViewType.Coordinates}\n isChecked={props.view === ViewType.Coordinates}\n onChange={() => {\n props.onChangeView(ViewType.Coordinates);\n }}\n >\n Coordinates\n </Radio>\n </Flex>\n {props.view === ViewType.Address && (\n <div className={styles.inputsRow}>\n <LocationSearchInput\n onSearchAddress={props.onSearchAddress}\n onGetAddressFromLocation={props.onGetAddressFromLocation}\n disabled={props.disabled}\n value={props.value}\n onChangeLocation={props.onChangeLocation}\n />\n </div>\n )}\n {props.view === ViewType.Coordinates && (\n <div className={styles.inputsRow}>\n <label htmlFor=\"latitude\">Latitude</label>\n <div className={styles.splitter} />\n <TextInput\n id=\"latitude\"\n testId=\"location-editor-latitude\"\n placeholder=\"Between -90 and 90\"\n isDisabled={props.disabled}\n value={props.value ? String(props.value.lat) : ''}\n onChange={(e) => {\n props.onChangeLocation({\n lng: props.value && props.value.lng !== undefined ? props.value.lng : 0,\n lat: Number(e.target.value) || 0,\n });\n }}\n type=\"number\"\n max=\"90\"\n min=\"-90\"\n step=\"0.1\"\n />\n <div className={styles.splitter} />\n <label htmlFor=\"longitude\">Longitude</label>\n <div className={styles.splitter} />\n <TextInput\n id=\"longitude\"\n testId=\"location-editor-longitude\"\n placeholder=\"Between -180 and 180\"\n isDisabled={props.disabled}\n value={props.value ? String(props.value.lng) : ''}\n onChange={(e) => {\n props.onChangeLocation({\n lat: props.value && props.value.lat !== undefined ? props.value.lat : 0,\n lng: Number(e.target.value) || 0,\n });\n }}\n type=\"number\"\n max=\"180\"\n min=\"-180\"\n step=\"0.1\"\n />\n </div>\n )}\n </div>\n <div className={styles.secondary}>\n <TextLink\n as=\"button\"\n isDisabled={props.disabled}\n testId=\"location-editor-clear\"\n className={styles.clearBtn}\n onClick={() => {\n props.onChangeLocation(undefined);\n }}\n >\n Clear\n </TextLink>\n </div>\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { FieldAPI, FieldConnector, ParametersAPI } from '@contentful/field-editor-shared';\nimport deepEqual from 'deep-equal';\nimport isNumber from 'lodash/isNumber';\nimport throttle from 'lodash/throttle';\n\nimport { GoogleMapView } from './GoogleMapView';\nimport { LocationSelector } from './LocationSelector';\nimport {\n LocationValue,\n ViewType,\n NullableLocationValue,\n Coords,\n GeocodeApiResponse,\n} from './types';\n\nexport interface LocationEditorConnectedProps {\n /**\n * is the field disabled initially\n */\n isInitiallyDisabled: boolean;\n\n /**\n * sdk.field\n */\n field: FieldAPI;\n\n /**\n * sdk.parameters\n */\n parameters?: ParametersAPI & {\n instance: {\n googleMapsKey?: string;\n };\n };\n}\n\ntype LocationEditorProps = {\n disabled: boolean;\n value: NullableLocationValue;\n setValue: (value: NullableLocationValue) => void;\n googleMapsKey?: string;\n selectedView: ViewType;\n setSelectedView: (view: ViewType) => void;\n};\n\nfunction toLocationValue(coords?: Coords): NullableLocationValue {\n if (coords && isNumber(coords.lat) && isNumber(coords.lng)) {\n return { lat: coords.lat, lon: coords.lng };\n } else {\n return null;\n }\n}\n\nexport class LocationEditor extends React.Component<\n LocationEditorProps,\n {\n localValue?: Coords;\n mapsObject: any; // eslint-disable-line -- TODO: describe this disable @typescript-eslint/no-explicit-any\n }\n> {\n constructor(props: LocationEditorProps) {\n super(props);\n\n this.state = {\n localValue: props.value\n ? {\n lng: props.value.lon,\n lat: props.value.lat,\n }\n : undefined,\n mapsObject: null,\n };\n }\n\n // @ts-expect-error\n onSearchAddress: (value: string) => Promise<GeocodeApiResponse> = throttle((value) => {\n if (!this.state.mapsObject) {\n return Promise.resolve(null);\n }\n const { mapsObject } = this.state;\n if (!value) {\n return Promise.resolve(null);\n }\n return new Promise((resolve) => {\n const geocoder = new mapsObject.Geocoder();\n geocoder.geocode({ address: value }, resolve, () => {\n resolve(null);\n });\n });\n }, 300);\n\n onGetAddressFromLocation = (location: Coords | undefined, value: string): Promise<string> => {\n if (!this.state.mapsObject || !location) {\n return Promise.resolve('');\n }\n const { mapsObject } = this.state;\n return new Promise((resolve) => {\n const geocoder = new mapsObject.Geocoder();\n geocoder.geocode(\n { location },\n (result: GeocodeApiResponse) => {\n if (result && result.length > 0) {\n const addresses = result.map((item) => item.formatted_address);\n resolve(addresses.find((item) => item === value) || addresses[0]);\n } else {\n resolve('');\n }\n },\n () => {\n resolve('');\n }\n );\n });\n };\n\n render() {\n const { mapsObject, localValue } = this.state;\n\n return (\n <div data-test-id=\"location-editor\">\n <GoogleMapView\n disabled={this.props.disabled || mapsObject === null}\n googleMapsKey={this.props.googleMapsKey}\n location={localValue}\n onGoogleApiLoaded={({ maps }) => {\n this.setState({ mapsObject: maps });\n }}\n onChangeLocation={(coords) => {\n this.setState({ localValue: coords });\n this.props.setValue(toLocationValue(coords));\n }}\n />\n <LocationSelector\n disabled={this.props.disabled || mapsObject === null}\n value={localValue}\n view={this.props.selectedView}\n onChangeView={(view) => {\n this.props.setSelectedView(view);\n }}\n onChangeLocation={(coords) => {\n this.setState({ localValue: coords });\n this.props.setValue(toLocationValue(coords));\n }}\n onSearchAddress={this.onSearchAddress}\n onGetAddressFromLocation={this.onGetAddressFromLocation}\n />\n </div>\n );\n }\n}\n\nexport function LocationEditorConnected(props: LocationEditorConnectedProps) {\n const { field } = props;\n const googleMapsKey = props.parameters ? props.parameters.instance.googleMapsKey : undefined;\n const [selectedView, setSelectedView] = React.useState<ViewType>(ViewType.Address);\n\n return (\n <FieldConnector<LocationValue>\n isEqualValues={(value1, value2) => {\n return deepEqual(value1, value2);\n }}\n field={field}\n isInitiallyDisabled={props.isInitiallyDisabled}\n >\n {({ value, disabled, setValue, externalReset }) => {\n return (\n <LocationEditor\n // on external change reset component completely and init with initial value again\n key={`location-editor-${externalReset}`}\n value={value}\n disabled={disabled}\n setValue={setValue}\n googleMapsKey={googleMapsKey}\n selectedView={selectedView}\n setSelectedView={setSelectedView}\n />\n );\n }}\n </FieldConnector>\n );\n}\n\nLocationEditorConnected.defaultProps = {\n isInitiallyDisabled: true,\n};\n","import { LocationEditorConnected } from './LocationEditor';\n\nexport const LocationEditor = LocationEditorConnected;\n"],"names":["styles","root","css","height","width","BerlinLocation","lat","lng","GoogleMapView","React","Component","constructor","props","onGoogleApiLoaded","event","maps","map","marker","Marker","position","getCenter","cursor","disabled","draggable","visible","Boolean","location","addListener","state","setPosition","latLng","setVisible","onChangeLocation","setState","undefined","componentDidUpdate","LatLng","setDraggable","setCursor","render","className","GoogleMapReact","bootstrapURLKeys","googleMapsKey","key","defaultCenter","center","options","scrollwheel","mapTypeId","defaultZoom","yesIWantToUseGoogleMapApiInternals","input","spinner","right","top","zIndex","validationMessage","marginTop","tokens","spacingS","suggestion","transform","bottom","left","LocationSearchInput","isSearching","setIsSearching","useState","address","setAddress","hasError","setHasError","setSuggestion","useEffect","onGetAddressFromLocation","value","then","TextInput","testId","isInvalid","placeholder","onChange","e","target","onSearchAddress","length","formatted_address","Number","geometry","toString","slice","isDisabled","Spinner","Card","padding","Button","variant","onClick","ValidationMessage","ViewType","display","flexDirection","alignItems","main","flexGrow","secondary","minWidth","textAlign","inputsRow","fontSize","fontSizeM","color","gray900","fontFamily","fontStackPrimary","splitter","spacingL","clearBtn","marginBottom","LocationSelector","Flex","Radio","flexBasis","id","Address","isChecked","view","onChangeView","Coordinates","htmlFor","String","type","max","min","step","TextLink","as","toLocationValue","coords","isNumber","lon","LocationEditor","throttle","mapsObject","Promise","resolve","geocoder","Geocoder","geocode","result","addresses","item","find","localValue","setValue","selectedView","setSelectedView","LocationEditorConnected","field","parameters","instance","FieldConnector","isEqualValues","value1","value2","deepEqual","isInitiallyDisabled","externalReset","defaultProps"],"mappings":"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"}
package/dist/index.js DELETED
@@ -1,8 +0,0 @@
1
-
2
- 'use strict'
3
-
4
- if (process.env.NODE_ENV === 'production') {
5
- module.exports = require('./field-editor-location.cjs.production.min.js')
6
- } else {
7
- module.exports = require('./field-editor-location.cjs.development.js')
8
- }