@sanity/google-maps-input 2.29.2 → 2.29.4-purple-unicorn.648

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.
Files changed (156) hide show
  1. package/LICENSE +1 -1
  2. package/diff/resolver.js +7 -0
  3. package/input/GeopointInput.js +7 -0
  4. package/lib/_Marker-353730d0.js +301 -0
  5. package/lib/_Marker-353730d0.js.map +1 -0
  6. package/lib/_Marker-ee551fa7.cjs +330 -0
  7. package/lib/_Marker-ee551fa7.cjs.map +1 -0
  8. package/lib/_reExport.js +19 -0
  9. package/lib/diff/resolver.cjs +203 -0
  10. package/lib/diff/resolver.cjs.map +1 -0
  11. package/lib/diff/resolver.js +168 -17
  12. package/lib/diff/resolver.js.map +1 -0
  13. package/{dist/dts → lib/dts/src}/diff/GeopointArrayDiff.d.ts +4 -4
  14. package/lib/dts/src/diff/GeopointArrayDiff.d.ts.map +1 -0
  15. package/lib/dts/src/diff/GeopointArrayDiff.js +36 -0
  16. package/lib/dts/src/diff/GeopointArrayDiff.js.map +1 -0
  17. package/{dist/dts → lib/dts/src}/diff/GeopointFieldDiff.d.ts +4 -4
  18. package/lib/dts/src/diff/GeopointFieldDiff.d.ts.map +1 -0
  19. package/lib/dts/src/diff/GeopointFieldDiff.js +51 -0
  20. package/lib/dts/src/diff/GeopointFieldDiff.js.map +1 -0
  21. package/{dist/dts → lib/dts/src}/diff/GeopointFieldDiff.styles.d.ts +1 -1
  22. package/lib/dts/src/diff/GeopointFieldDiff.styles.d.ts.map +1 -0
  23. package/lib/dts/src/diff/GeopointFieldDiff.styles.js +20 -0
  24. package/lib/dts/src/diff/GeopointFieldDiff.styles.js.map +1 -0
  25. package/{dist/dts → lib/dts/src}/diff/GeopointMove.d.ts +12 -12
  26. package/lib/dts/src/diff/GeopointMove.d.ts.map +1 -0
  27. package/lib/dts/src/diff/GeopointMove.js +16 -0
  28. package/lib/dts/src/diff/GeopointMove.js.map +1 -0
  29. package/lib/dts/src/diff/resolver.d.ts +4 -0
  30. package/lib/dts/src/diff/resolver.d.ts.map +1 -0
  31. package/lib/dts/src/diff/resolver.js +15 -0
  32. package/lib/dts/src/diff/resolver.js.map +1 -0
  33. package/lib/dts/src/input/GeopointInput.d.ts +26 -0
  34. package/lib/dts/src/input/GeopointInput.d.ts.map +1 -0
  35. package/lib/dts/src/input/GeopointInput.js +97 -0
  36. package/lib/dts/src/input/GeopointInput.js.map +1 -0
  37. package/{dist/dts → lib/dts/src}/input/GeopointInput.styles.d.ts +2 -2
  38. package/lib/dts/src/input/GeopointInput.styles.d.ts.map +1 -0
  39. package/lib/dts/src/input/GeopointInput.styles.js +11 -0
  40. package/lib/dts/src/input/GeopointInput.styles.js.map +1 -0
  41. package/{dist/dts → lib/dts/src}/input/GeopointSelect.d.ts +27 -27
  42. package/lib/dts/src/input/GeopointSelect.d.ts.map +1 -0
  43. package/lib/dts/src/input/GeopointSelect.js +44 -0
  44. package/lib/dts/src/input/GeopointSelect.js.map +1 -0
  45. package/{dist/dts → lib/dts/src}/loader/GoogleMapsLoadProxy.d.ts +13 -13
  46. package/lib/dts/src/loader/GoogleMapsLoadProxy.d.ts.map +1 -0
  47. package/lib/dts/src/loader/GoogleMapsLoadProxy.js +39 -0
  48. package/lib/dts/src/loader/GoogleMapsLoadProxy.js.map +1 -0
  49. package/{dist/dts → lib/dts/src}/loader/LoadError.d.ts +9 -9
  50. package/lib/dts/src/loader/LoadError.d.ts.map +1 -0
  51. package/lib/dts/src/loader/LoadError.js +22 -0
  52. package/lib/dts/src/loader/LoadError.js.map +1 -0
  53. package/{dist/dts → lib/dts/src}/loader/loadGoogleMapsApi.d.ts +17 -17
  54. package/lib/dts/src/loader/loadGoogleMapsApi.d.ts.map +1 -0
  55. package/lib/dts/src/loader/loadGoogleMapsApi.js +49 -0
  56. package/lib/dts/src/loader/loadGoogleMapsApi.js.map +1 -0
  57. package/{dist/dts → lib/dts/src}/map/Arrow.d.ts +28 -28
  58. package/lib/dts/src/map/Arrow.d.ts.map +1 -0
  59. package/lib/dts/src/map/Arrow.js +53 -0
  60. package/lib/dts/src/map/Arrow.js.map +1 -0
  61. package/{dist/dts → lib/dts/src}/map/Map.d.ts +36 -36
  62. package/lib/dts/src/map/Map.d.ts.map +1 -0
  63. package/lib/dts/src/map/Map.js +87 -0
  64. package/lib/dts/src/map/Map.js.map +1 -0
  65. package/{dist/dts → lib/dts/src}/map/Map.styles.d.ts +1 -1
  66. package/lib/dts/src/map/Map.styles.d.ts.map +1 -0
  67. package/lib/dts/src/map/Map.styles.js +10 -0
  68. package/lib/dts/src/map/Map.styles.js.map +1 -0
  69. package/{dist/dts → lib/dts/src}/map/Marker.d.ts +33 -35
  70. package/lib/dts/src/map/Marker.d.ts.map +1 -0
  71. package/lib/dts/src/map/Marker.js +94 -0
  72. package/lib/dts/src/map/Marker.js.map +1 -0
  73. package/{dist/dts → lib/dts/src}/map/SearchInput.d.ts +15 -15
  74. package/lib/dts/src/map/SearchInput.d.ts.map +1 -0
  75. package/lib/dts/src/map/SearchInput.js +37 -0
  76. package/lib/dts/src/map/SearchInput.js.map +1 -0
  77. package/{dist/dts → lib/dts/src}/map/SearchInput.styles.d.ts +1 -1
  78. package/lib/dts/src/map/SearchInput.styles.d.ts.map +1 -0
  79. package/lib/dts/src/map/SearchInput.styles.js +8 -0
  80. package/lib/dts/src/map/SearchInput.styles.js.map +1 -0
  81. package/{dist/dts → lib/dts/src}/map/util.d.ts +3 -3
  82. package/lib/dts/src/map/util.d.ts.map +1 -0
  83. package/lib/dts/src/map/util.js +8 -0
  84. package/lib/dts/src/map/util.js.map +1 -0
  85. package/lib/dts/src/types.d.ts +17 -0
  86. package/lib/dts/src/types.d.ts.map +1 -0
  87. package/lib/dts/src/types.js +2 -0
  88. package/lib/dts/src/types.js.map +1 -0
  89. package/lib/dts/tsconfig.tsbuildinfo +1 -0
  90. package/lib/input/GeopointInput.cjs +212 -0
  91. package/lib/input/GeopointInput.cjs.map +1 -0
  92. package/lib/input/GeopointInput.js +182 -190
  93. package/lib/input/GeopointInput.js.map +1 -0
  94. package/package.json +46 -12
  95. package/src/@types/css.d.ts +4 -0
  96. package/src/diff/GeopointArrayDiff.tsx +83 -0
  97. package/src/diff/GeopointFieldDiff.styles.tsx +20 -0
  98. package/src/diff/GeopointFieldDiff.tsx +94 -0
  99. package/src/diff/GeopointMove.tsx +48 -0
  100. package/src/diff/resolver.ts +21 -0
  101. package/src/input/GeopointInput.styles.tsx +12 -0
  102. package/src/input/GeopointInput.tsx +185 -0
  103. package/src/input/GeopointSelect.tsx +78 -0
  104. package/src/loader/GoogleMapsLoadProxy.tsx +49 -0
  105. package/src/loader/LoadError.tsx +44 -0
  106. package/src/loader/loadGoogleMapsApi.ts +91 -0
  107. package/src/map/Arrow.tsx +76 -0
  108. package/src/map/Map.styles.tsx +10 -0
  109. package/src/map/Map.tsx +125 -0
  110. package/src/map/Marker.tsx +130 -0
  111. package/src/map/SearchInput.styles.tsx +8 -0
  112. package/src/map/SearchInput.tsx +56 -0
  113. package/src/map/util.ts +14 -0
  114. package/src/types.ts +19 -0
  115. package/.depcheckignore.json +0 -3
  116. package/dist/dts/diff/GeopointArrayDiff.d.ts.map +0 -1
  117. package/dist/dts/diff/GeopointFieldDiff.d.ts.map +0 -1
  118. package/dist/dts/diff/GeopointFieldDiff.styles.d.ts.map +0 -1
  119. package/dist/dts/diff/GeopointMove.d.ts.map +0 -1
  120. package/dist/dts/diff/resolver.d.ts +0 -4
  121. package/dist/dts/diff/resolver.d.ts.map +0 -1
  122. package/dist/dts/input/GeopointInput.d.ts +0 -40
  123. package/dist/dts/input/GeopointInput.d.ts.map +0 -1
  124. package/dist/dts/input/GeopointInput.styles.d.ts.map +0 -1
  125. package/dist/dts/input/GeopointSelect.d.ts.map +0 -1
  126. package/dist/dts/loader/GoogleMapsLoadProxy.d.ts.map +0 -1
  127. package/dist/dts/loader/LoadError.d.ts.map +0 -1
  128. package/dist/dts/loader/loadGoogleMapsApi.d.ts.map +0 -1
  129. package/dist/dts/map/Arrow.d.ts.map +0 -1
  130. package/dist/dts/map/Map.d.ts.map +0 -1
  131. package/dist/dts/map/Map.styles.d.ts.map +0 -1
  132. package/dist/dts/map/Marker.d.ts.map +0 -1
  133. package/dist/dts/map/SearchInput.d.ts.map +0 -1
  134. package/dist/dts/map/SearchInput.styles.d.ts.map +0 -1
  135. package/dist/dts/map/util.d.ts.map +0 -1
  136. package/dist/dts/types.d.ts +0 -14
  137. package/dist/dts/types.d.ts.map +0 -1
  138. package/lib/@types/css.d.js +0 -1
  139. package/lib/diff/GeopointArrayDiff.js +0 -82
  140. package/lib/diff/GeopointFieldDiff.js +0 -97
  141. package/lib/diff/GeopointFieldDiff.styles.js +0 -18
  142. package/lib/diff/GeopointMove.js +0 -55
  143. package/lib/input/GeopointInput.styles.js +0 -22
  144. package/lib/input/GeopointSelect.js +0 -103
  145. package/lib/loader/GoogleMapsLoadProxy.js +0 -70
  146. package/lib/loader/LoadError.js +0 -43
  147. package/lib/loader/loadGoogleMapsApi.js +0 -81
  148. package/lib/map/Arrow.js +0 -97
  149. package/lib/map/Map.js +0 -147
  150. package/lib/map/Map.styles.js +0 -18
  151. package/lib/map/Marker.js +0 -156
  152. package/lib/map/SearchInput.js +0 -77
  153. package/lib/map/SearchInput.styles.js +0 -18
  154. package/lib/map/util.js +0 -14
  155. package/lib/types.js +0 -5
  156. package/tsconfig.json +0 -20
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeopointInput.js","sources":["../../src/map/SearchInput.styles.tsx","../../src/map/SearchInput.tsx","../../src/input/GeopointSelect.tsx","../../src/input/GeopointInput.styles.tsx","../../src/input/GeopointInput.tsx"],"sourcesContent":["import styled from 'styled-components'\n\nexport const WrapperContainer = styled.div`\n position: absolute;\n right: 10px;\n top: 10px;\n width: 220px;\n`\n","import * as React from 'react'\nimport {TextInput} from '@sanity/ui'\nimport {WrapperContainer} from './SearchInput.styles'\n\ninterface Props {\n api: typeof window.google.maps\n map: google.maps.Map\n onChange: (result: google.maps.places.PlaceResult) => void\n}\n\nexport class SearchInput extends React.PureComponent<Props> {\n searchInputRef = React.createRef<HTMLInputElement>()\n autoComplete: google.maps.places.Autocomplete | undefined\n\n handleChange = () => {\n if (!this.autoComplete) {\n return\n }\n\n this.props.onChange(this.autoComplete.getPlace())\n\n if (this.searchInputRef.current) {\n this.searchInputRef.current.value = ''\n }\n }\n\n componentDidMount() {\n const input = this.searchInputRef.current\n if (!input) {\n return\n }\n\n const {api, map} = this.props\n const {Circle, places, event} = api\n const searchBounds = new Circle({center: map.getCenter(), radius: 100}).getBounds()\n this.autoComplete = new places.Autocomplete(input, {\n bounds: searchBounds,\n types: [], // return all kinds of places\n })\n\n event.addListener(this.autoComplete, 'place_changed', this.handleChange)\n }\n\n render() {\n return (\n <WrapperContainer>\n <TextInput\n name=\"place\"\n ref={this.searchInputRef}\n placeholder=\"Search for place or address\"\n padding={4}\n />\n </WrapperContainer>\n )\n }\n}\n","import React from 'react'\nimport {SearchInput} from '../map/SearchInput'\nimport {GoogleMap} from '../map/Map'\nimport {Marker} from '../map/Marker'\nimport {LatLng, Geopoint} from '../types'\n\nconst fallbackLatLng: LatLng = {lat: 40.7058254, lng: -74.1180863}\n\ninterface SelectProps {\n api: typeof window.google.maps\n value?: Geopoint\n onChange?: (latLng: google.maps.LatLng) => void\n defaultLocation?: LatLng\n defaultZoom?: number\n}\n\nexport class GeopointSelect extends React.PureComponent<SelectProps> {\n static defaultProps = {\n defaultZoom: 8,\n defaultLocation: {lng: 10.74609, lat: 59.91273},\n }\n\n mapRef = React.createRef<HTMLDivElement>()\n\n getCenter() {\n const {value = {}, defaultLocation = {}} = this.props\n const point: LatLng = {...fallbackLatLng, ...defaultLocation, ...value}\n return point\n }\n\n handlePlaceChanged = (place: google.maps.places.PlaceResult) => {\n if (!place.geometry) {\n return\n }\n\n this.setValue(place.geometry.location)\n }\n\n handleMarkerDragEnd = (event: google.maps.MapMouseEvent) => {\n this.setValue(event.latLng)\n }\n\n handleMapClick = (event: google.maps.MapMouseEvent) => {\n this.setValue(event.latLng)\n }\n\n setValue(geoPoint: google.maps.LatLng) {\n if (this.props.onChange) {\n this.props.onChange(geoPoint)\n }\n }\n\n render() {\n const {api, defaultZoom, value, onChange} = this.props\n return (\n <GoogleMap\n api={api}\n location={this.getCenter()}\n onClick={this.handleMapClick}\n defaultZoom={defaultZoom}\n >\n {(map) => (\n <>\n <SearchInput api={api} map={map} onChange={this.handlePlaceChanged} />\n {value && (\n <Marker\n api={api}\n map={map}\n position={value}\n onMove={onChange ? this.handleMarkerDragEnd : undefined}\n />\n )}\n </>\n )}\n </GoogleMap>\n )\n }\n}\n","import styled from 'styled-components'\n\nexport const PreviewImage = styled.img`\n width: 100%;\n height: auto;\n vertical-align: top;\n`\n\nexport const DialogInnerContainer = styled.div`\n height: 40rem;\n width: 50rem;\n`\n","import React from 'react'\nimport {uniqueId} from 'lodash'\nimport {Box, Grid, Button, Dialog} from '@sanity/ui'\nimport {TrashIcon, EditIcon} from '@sanity/icons'\n// @ts-expect-error TODO: remove the types eventually\nimport config from 'config:@sanity/google-maps-input'\nimport {ChangeIndicatorCompareValueProvider, ChangeIndicator} from '@sanity/base/_unstable'\nimport {FormFieldSet, ObjectInputProps, set, setIfMissing, unset} from '@sanity/base/form'\nimport {GoogleMapsLoadProxy} from '../loader/GoogleMapsLoadProxy'\nimport {Geopoint, GeopointSchemaType} from '../types'\nimport {GeopointSelect} from './GeopointSelect'\nimport {PreviewImage, DialogInnerContainer} from './GeopointInput.styles'\n\nconst getStaticImageUrl = (value) => {\n const loc = `${value.lat},${value.lng}`\n const params = {\n key: config.apiKey,\n center: loc,\n markers: loc,\n zoom: 13,\n scale: 2,\n size: '640x300',\n }\n\n const qs = Object.keys(params).reduce((res, param) => {\n return res.concat(`${param}=${encodeURIComponent(params[param])}`)\n }, [] as string[])\n\n return `https://maps.googleapis.com/maps/api/staticmap?${qs.join('&')}`\n}\n\ntype GeopointInputProps = ObjectInputProps<Geopoint, GeopointSchemaType>\n\n// @todo\n// interface Focusable {\n// focus: () => void\n// }\ntype Focusable = any\n\ninterface InputState {\n modalOpen: boolean\n}\n\nclass GeopointInput extends React.PureComponent<GeopointInputProps, InputState> {\n _geopointInputId = uniqueId('GeopointInput')\n\n static defaultProps = {\n validation: [],\n }\n\n editButton: Focusable | undefined\n\n constructor(props) {\n super(props)\n\n this.state = {\n modalOpen: false,\n }\n }\n\n setEditButton = (el: Focusable) => {\n this.editButton = el\n }\n\n focus() {\n if (this.editButton) {\n this.editButton.focus()\n }\n }\n\n handleToggleModal = () => {\n this.setState((prevState) => ({modalOpen: !prevState.modalOpen}))\n }\n\n handleCloseModal = () => {\n this.setState({modalOpen: false})\n }\n\n handleChange = (latLng: google.maps.LatLng) => {\n const {schemaType, onChange} = this.props\n onChange([\n setIfMissing({\n _type: schemaType.name,\n }),\n set(latLng.lat(), ['lat']),\n set(latLng.lng(), ['lng']),\n ])\n }\n\n handleClear = () => {\n const {onChange} = this.props\n onChange(unset())\n }\n\n render() {\n const {value, schemaType, readOnly, compareValue} = this.props\n\n const {modalOpen} = this.state\n\n if (!config || !config.apiKey) {\n return (\n <div>\n <p>\n The <a href=\"https://sanity.io/docs/schema-types/geopoint-type\">Geopoint type</a> needs\n a Google Maps API key with access to:\n </p>\n <ul>\n <li>Google Maps JavaScript API</li>\n <li>Google Places API Web Service</li>\n <li>Google Static Maps API</li>\n </ul>\n <p>\n Please enter the API key with access to these services in\n <code style={{whiteSpace: 'nowrap'}}>\n `&lt;project-root&gt;/config/@sanity/google-maps-input.json`\n </code>\n </p>\n </div>\n )\n }\n\n return (\n <>\n {value && (\n <ChangeIndicatorCompareValueProvider value={value} compareValue={compareValue}>\n <ChangeIndicator compareDeep>\n <PreviewImage src={getStaticImageUrl(value)} alt=\"Map location\" />\n </ChangeIndicator>\n </ChangeIndicatorCompareValueProvider>\n )}\n\n {!readOnly && (\n <Box marginTop={4}>\n <Grid columns={2} gap={2}>\n <Button\n mode=\"ghost\"\n icon={value && EditIcon}\n padding={3}\n ref={this.setEditButton}\n text={value ? 'Edit' : 'Set location'}\n onClick={this.handleToggleModal}\n />\n\n {value && (\n <Button\n tone=\"critical\"\n icon={TrashIcon}\n padding={3}\n mode=\"ghost\"\n text={'Remove'}\n onClick={this.handleClear}\n />\n )}\n </Grid>\n </Box>\n )}\n\n {modalOpen && (\n <Dialog\n id={`${this._geopointInputId}_dialog`}\n onClose={this.handleCloseModal}\n header=\"Place the marker on the map\"\n width={1}\n >\n <DialogInnerContainer>\n <GoogleMapsLoadProxy>\n {(api) => (\n <GeopointSelect\n api={api}\n value={value || undefined}\n onChange={readOnly ? undefined : this.handleChange}\n defaultLocation={config.defaultLocation}\n defaultZoom={config.defaultZoom}\n />\n )}\n </GoogleMapsLoadProxy>\n </DialogInnerContainer>\n </Dialog>\n )}\n </>\n )\n }\n}\n\nexport default GeopointInput\n"],"names":["React"],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,46 @@
1
1
  {
2
2
  "name": "@sanity/google-maps-input",
3
- "version": "2.29.2",
3
+ "version": "2.29.4-purple-unicorn.648+c8cbef48aa",
4
4
  "description": "Sanity plugin providing input handlers for geo-related input types using Google Maps",
5
- "main": "lib/index.js",
6
- "types": "./dist/dts",
5
+ "main": "lib/input/GeopointInput.cjs",
6
+ "module": "lib/input/GeopointInput.js",
7
+ "exports": {
8
+ "./input/GeopointInput": {
9
+ "source": "./src/input/GeopointInput.tsx",
10
+ "require": "./lib/input/GeopointInput.cjs",
11
+ "default": "./lib/input/GeopointInput.js"
12
+ },
13
+ "./diff/resolver": {
14
+ "source": "./src/diff/resolver.ts",
15
+ "require": "./lib/diff/resolver.cjs",
16
+ "default": "./lib/diff/resolver.js"
17
+ }
18
+ },
19
+ "types": "./lib/dts/src/input/GeopointInput.d.ts",
20
+ "//": "the typesVersion config below is a workaround for TypeScript's lack of support for package exports",
21
+ "typesVersions": {
22
+ "*": {
23
+ "input/GeopointInput": [
24
+ "./lib/dts/src/input/GeopointInput.d.ts"
25
+ ],
26
+ "schema": [
27
+ "./lib/dts/src/schema.d.ts"
28
+ ],
29
+ "diff/resolver": [
30
+ "./lib/dts/src/diff/resolver.d.ts"
31
+ ]
32
+ }
33
+ },
7
34
  "author": "Sanity.io <hello@sanity.io>",
8
35
  "license": "MIT",
9
36
  "scripts": {
10
- "clean": "rimraf lib dest"
37
+ "build": "../../../bin/pkg-utils bundle",
38
+ "clean": "rimraf lib",
39
+ "_exports:check": "../../../bin/pkg-utils exports-check",
40
+ "exports:clean": "../../../bin/pkg-utils exports-clean",
41
+ "exports:generate": "../../../bin/pkg-utils exports-generate",
42
+ "postbuild": "run-s exports:generate",
43
+ "watch": "../../../bin/pkg-utils bundle --watch"
11
44
  },
12
45
  "keywords": [
13
46
  "sanity",
@@ -19,17 +52,18 @@
19
52
  "sanity-plugin"
20
53
  ],
21
54
  "dependencies": {
22
- "@sanity/field": "2.29.2",
23
- "@sanity/icons": "^1.2.1",
24
- "@sanity/types": "2.28.0",
25
- "@sanity/ui": "^0.37.2",
26
- "lodash": "^4.17.15",
55
+ "@sanity/icons": "^1.2.8",
56
+ "@sanity/types": "2.29.4-purple-unicorn.648+c8cbef48aa",
57
+ "@sanity/ui": "^0.37.8",
58
+ "lodash": "^4.17.21",
27
59
  "rxjs": "^6.5.3"
28
60
  },
29
61
  "devDependencies": {
30
- "@sanity/base": "2.29.2",
62
+ "@sanity/base": "2.29.4-purple-unicorn.648+c8cbef48aa",
31
63
  "@types/googlemaps": "^3.43.0",
32
- "rimraf": "^2.7.1"
64
+ "react": "17.0.2",
65
+ "rimraf": "^3.0.2",
66
+ "styled-components": "^5.2.0"
33
67
  },
34
68
  "peerDependencies": {
35
69
  "@sanity/base": "^2.0.0",
@@ -46,5 +80,5 @@
46
80
  "url": "https://github.com/sanity-io/sanity/issues"
47
81
  },
48
82
  "homepage": "https://www.sanity.io/",
49
- "gitHead": "65f337e037e7690514cf37f0038c3d58a8f4d11e"
83
+ "gitHead": "c8cbef48aaef4d7d1471d74f2f8146631e22aa0a"
50
84
  }
@@ -0,0 +1,4 @@
1
+ declare module '*.css' {
2
+ const styles: Record<string, string>
3
+ export default styles
4
+ }
@@ -0,0 +1,83 @@
1
+ import * as React from 'react'
2
+ import {
3
+ ArrayDiff,
4
+ ObjectDiff,
5
+ Diff,
6
+ DiffProps as GenericDiffProps,
7
+ DiffComponent,
8
+ } from '@sanity/base/_unstable'
9
+ import {GoogleMapsLoadProxy} from '../loader/GoogleMapsLoadProxy'
10
+ import {GoogleMap} from '../map/Map'
11
+ import {Geopoint} from '../types'
12
+ import {GeopointMove} from './GeopointMove'
13
+ import {RootContainer} from './GeopointFieldDiff.styles'
14
+
15
+ export type DiffProps = GenericDiffProps<ArrayDiff<Geopoint>>
16
+
17
+ export const GeopointArrayDiff: DiffComponent<ArrayDiff<Geopoint>> = ({diff, schemaType}) => {
18
+ return (
19
+ <RootContainer>
20
+ <GoogleMapsLoadProxy>
21
+ {(api) => <GeopointDiff api={api} diff={diff} schemaType={schemaType} />}
22
+ </GoogleMapsLoadProxy>
23
+ </RootContainer>
24
+ )
25
+ }
26
+
27
+ function GeopointDiff({api, diff}: DiffProps & {api: typeof window.google.maps}) {
28
+ const fromValue = (diff.fromValue || []).filter(hasCoordinates)
29
+ const toValue = (diff.toValue || []).filter(hasCoordinates)
30
+ if (fromValue.length === 0 && toValue.length === 0) {
31
+ return null
32
+ }
33
+
34
+ const bounds = getBounds(fromValue, toValue, api)
35
+ return (
36
+ <GoogleMap
37
+ api={api}
38
+ location={bounds.getCenter().toJSON()}
39
+ mapTypeControl={false}
40
+ controlSize={20}
41
+ bounds={bounds}
42
+ >
43
+ {(map) => (
44
+ <>
45
+ {diff.items.map(({toIndex, diff: pointDiff}) => {
46
+ if (!isChangeDiff(pointDiff)) {
47
+ return null
48
+ }
49
+
50
+ return (
51
+ <GeopointMove
52
+ key={toIndex}
53
+ api={api}
54
+ map={map}
55
+ diff={pointDiff}
56
+ label={`${toIndex}`}
57
+ />
58
+ )
59
+ })}
60
+ </>
61
+ )}
62
+ </GoogleMap>
63
+ )
64
+ }
65
+
66
+ function isChangeDiff(diff: Diff): diff is ObjectDiff<Geopoint> {
67
+ return diff.action !== 'unchanged' && diff.type === 'object'
68
+ }
69
+
70
+ function hasCoordinates(point: Partial<Geopoint>): point is Geopoint {
71
+ return typeof point.lat === 'number' && typeof point.lng === 'number'
72
+ }
73
+
74
+ function getBounds(
75
+ fromValue: google.maps.LatLngLiteral[] | null | undefined,
76
+ toValue: google.maps.LatLngLiteral[] | null | undefined,
77
+ api: typeof window.google.maps
78
+ ): google.maps.LatLngBounds {
79
+ const bounds = new api.LatLngBounds()
80
+ const points = [...(fromValue || []), ...(toValue || [])]
81
+ points.forEach((point) => bounds.extend(point))
82
+ return bounds
83
+ }
@@ -0,0 +1,20 @@
1
+ import styled from 'styled-components'
2
+
3
+ export const RootContainer = styled.div`
4
+ position: relative;
5
+ min-height: 200px;
6
+
7
+ &:empty {
8
+ background-color: var(--card-skeleton-color-from);
9
+ display: table;
10
+ width: 100%;
11
+ }
12
+
13
+ &:empty:after {
14
+ content: 'Missing/invalid data';
15
+ display: table-cell;
16
+ vertical-align: middle;
17
+ text-align: center;
18
+ position: relative;
19
+ }
20
+ `
@@ -0,0 +1,94 @@
1
+ import * as React from 'react'
2
+ import {
3
+ DiffComponent,
4
+ ObjectDiff,
5
+ DiffProps as GenericDiffProps,
6
+ DiffTooltip,
7
+ getAnnotationAtPath,
8
+ } from '@sanity/base/_unstable'
9
+ import {GoogleMapsLoadProxy} from '../loader/GoogleMapsLoadProxy'
10
+ import {GoogleMap} from '../map/Map'
11
+ import {Geopoint} from '../types'
12
+ import {GeopointMove} from './GeopointMove'
13
+ import {RootContainer} from './GeopointFieldDiff.styles'
14
+
15
+ export type DiffProps = GenericDiffProps<ObjectDiff<Geopoint>>
16
+
17
+ export const GeopointFieldDiff: DiffComponent<ObjectDiff<Geopoint>> = ({diff, schemaType}) => {
18
+ return (
19
+ <RootContainer>
20
+ <GoogleMapsLoadProxy>
21
+ {(api) => <GeopointDiff api={api} diff={diff} schemaType={schemaType} />}
22
+ </GoogleMapsLoadProxy>
23
+ </RootContainer>
24
+ )
25
+ }
26
+
27
+ function GeopointDiff({api, diff}: DiffProps & {api: typeof window.google.maps}) {
28
+ const {fromValue, toValue} = diff
29
+ const annotation =
30
+ getAnnotationAtPath(diff, ['lat']) ||
31
+ getAnnotationAtPath(diff, ['lng']) ||
32
+ getAnnotationAtPath(diff, [])
33
+
34
+ const center = getCenter(diff, api)
35
+ const bounds = fromValue && toValue ? getBounds(fromValue, toValue, api) : undefined
36
+
37
+ return (
38
+ <DiffTooltip annotations={annotation ? [annotation] : []} description={getAction(diff)}>
39
+ <div>
40
+ <GoogleMap
41
+ api={api}
42
+ location={center}
43
+ mapTypeControl={false}
44
+ controlSize={20}
45
+ bounds={bounds}
46
+ scrollWheel={false}
47
+ >
48
+ {(map) => <GeopointMove api={api} map={map} diff={diff} />}
49
+ </GoogleMap>
50
+ </div>
51
+ </DiffTooltip>
52
+ )
53
+ }
54
+
55
+ function getBounds(
56
+ fromValue: google.maps.LatLngLiteral,
57
+ toValue: google.maps.LatLngLiteral,
58
+ api: typeof window.google.maps
59
+ ): google.maps.LatLngBounds {
60
+ return new api.LatLngBounds().extend(fromValue).extend(toValue)
61
+ }
62
+
63
+ function getCenter(
64
+ diff: DiffProps['diff'],
65
+ api: typeof window.google.maps
66
+ ): google.maps.LatLngLiteral {
67
+ const {fromValue, toValue} = diff
68
+ if (fromValue && toValue) {
69
+ return getBounds(fromValue, toValue, api).getCenter().toJSON()
70
+ }
71
+
72
+ if (fromValue) {
73
+ return fromValue
74
+ }
75
+
76
+ if (toValue) {
77
+ return toValue
78
+ }
79
+
80
+ throw new Error('Neither a from or a to value present')
81
+ }
82
+
83
+ function getAction(diff: ObjectDiff<Geopoint>) {
84
+ const {fromValue, toValue} = diff
85
+ if (fromValue && toValue) {
86
+ return 'Moved'
87
+ } else if (fromValue) {
88
+ return 'Removed'
89
+ } else if (toValue) {
90
+ return 'Added'
91
+ }
92
+
93
+ return 'Unchanged'
94
+ }
@@ -0,0 +1,48 @@
1
+ import * as React from 'react'
2
+ import {useUserColor, ObjectDiff} from '@sanity/base/_unstable'
3
+ import {Marker} from '../map/Marker'
4
+ import {Arrow} from '../map/Arrow'
5
+ import {Geopoint} from '../types'
6
+
7
+ interface Props {
8
+ api: typeof window.google.maps
9
+ map: google.maps.Map
10
+ diff: ObjectDiff<Geopoint>
11
+ label?: string
12
+ }
13
+
14
+ export function GeopointMove({diff, api, map, label}: Props) {
15
+ const {fromValue: from, toValue: to} = diff
16
+ const annotation = diff.isChanged ? diff.annotation : undefined
17
+ const userColor = useUserColor(annotation ? annotation.author : null) || undefined
18
+ const fromRef = React.useRef<google.maps.Marker>()
19
+ const toRef = React.useRef<google.maps.Marker>()
20
+
21
+ return (
22
+ <>
23
+ {from && (
24
+ <Marker
25
+ api={api}
26
+ map={map}
27
+ position={from}
28
+ zIndex={0}
29
+ opacity={0.55}
30
+ markerRef={fromRef}
31
+ color={userColor}
32
+ />
33
+ )}
34
+ {from && to && <Arrow api={api} map={map} from={from} to={to} zIndex={1} color={userColor} />}
35
+ {to && (
36
+ <Marker
37
+ api={api}
38
+ map={map}
39
+ position={to}
40
+ zIndex={2}
41
+ markerRef={toRef}
42
+ label={label}
43
+ color={userColor}
44
+ />
45
+ )}
46
+ </>
47
+ )
48
+ }
@@ -0,0 +1,21 @@
1
+ import {DiffComponentResolver} from '@sanity/base/_unstable'
2
+ import {GeopointFieldDiff} from './GeopointFieldDiff'
3
+ import {GeopointArrayDiff} from './GeopointArrayDiff'
4
+
5
+ const diffResolver: DiffComponentResolver = function diffResolver({schemaType}) {
6
+ if (schemaType.name === 'geopoint') {
7
+ return GeopointFieldDiff
8
+ }
9
+
10
+ if (
11
+ schemaType.jsonType === 'array' &&
12
+ schemaType.of.length === 1 &&
13
+ schemaType.of[0].name === 'geopoint'
14
+ ) {
15
+ return GeopointArrayDiff
16
+ }
17
+
18
+ return undefined
19
+ }
20
+
21
+ export default diffResolver
@@ -0,0 +1,12 @@
1
+ import styled from 'styled-components'
2
+
3
+ export const PreviewImage = styled.img`
4
+ width: 100%;
5
+ height: auto;
6
+ vertical-align: top;
7
+ `
8
+
9
+ export const DialogInnerContainer = styled.div`
10
+ height: 40rem;
11
+ width: 50rem;
12
+ `
@@ -0,0 +1,185 @@
1
+ import React from 'react'
2
+ import {uniqueId} from 'lodash'
3
+ import {Box, Grid, Button, Dialog} from '@sanity/ui'
4
+ import {TrashIcon, EditIcon} from '@sanity/icons'
5
+ // @ts-expect-error TODO: remove the types eventually
6
+ import config from 'config:@sanity/google-maps-input'
7
+ import {ChangeIndicatorCompareValueProvider, ChangeIndicator} from '@sanity/base/_unstable'
8
+ import {FormFieldSet, ObjectInputProps, set, setIfMissing, unset} from '@sanity/base/form'
9
+ import {GoogleMapsLoadProxy} from '../loader/GoogleMapsLoadProxy'
10
+ import {Geopoint, GeopointSchemaType} from '../types'
11
+ import {GeopointSelect} from './GeopointSelect'
12
+ import {PreviewImage, DialogInnerContainer} from './GeopointInput.styles'
13
+
14
+ const getStaticImageUrl = (value) => {
15
+ const loc = `${value.lat},${value.lng}`
16
+ const params = {
17
+ key: config.apiKey,
18
+ center: loc,
19
+ markers: loc,
20
+ zoom: 13,
21
+ scale: 2,
22
+ size: '640x300',
23
+ }
24
+
25
+ const qs = Object.keys(params).reduce((res, param) => {
26
+ return res.concat(`${param}=${encodeURIComponent(params[param])}`)
27
+ }, [] as string[])
28
+
29
+ return `https://maps.googleapis.com/maps/api/staticmap?${qs.join('&')}`
30
+ }
31
+
32
+ type GeopointInputProps = ObjectInputProps<Geopoint, GeopointSchemaType>
33
+
34
+ // @todo
35
+ // interface Focusable {
36
+ // focus: () => void
37
+ // }
38
+ type Focusable = any
39
+
40
+ interface InputState {
41
+ modalOpen: boolean
42
+ }
43
+
44
+ class GeopointInput extends React.PureComponent<GeopointInputProps, InputState> {
45
+ _geopointInputId = uniqueId('GeopointInput')
46
+
47
+ static defaultProps = {
48
+ validation: [],
49
+ }
50
+
51
+ editButton: Focusable | undefined
52
+
53
+ constructor(props) {
54
+ super(props)
55
+
56
+ this.state = {
57
+ modalOpen: false,
58
+ }
59
+ }
60
+
61
+ setEditButton = (el: Focusable) => {
62
+ this.editButton = el
63
+ }
64
+
65
+ focus() {
66
+ if (this.editButton) {
67
+ this.editButton.focus()
68
+ }
69
+ }
70
+
71
+ handleToggleModal = () => {
72
+ this.setState((prevState) => ({modalOpen: !prevState.modalOpen}))
73
+ }
74
+
75
+ handleCloseModal = () => {
76
+ this.setState({modalOpen: false})
77
+ }
78
+
79
+ handleChange = (latLng: google.maps.LatLng) => {
80
+ const {schemaType, onChange} = this.props
81
+ onChange([
82
+ setIfMissing({
83
+ _type: schemaType.name,
84
+ }),
85
+ set(latLng.lat(), ['lat']),
86
+ set(latLng.lng(), ['lng']),
87
+ ])
88
+ }
89
+
90
+ handleClear = () => {
91
+ const {onChange} = this.props
92
+ onChange(unset())
93
+ }
94
+
95
+ render() {
96
+ const {value, schemaType, readOnly, compareValue} = this.props
97
+
98
+ const {modalOpen} = this.state
99
+
100
+ if (!config || !config.apiKey) {
101
+ return (
102
+ <div>
103
+ <p>
104
+ The <a href="https://sanity.io/docs/schema-types/geopoint-type">Geopoint type</a> needs
105
+ a Google Maps API key with access to:
106
+ </p>
107
+ <ul>
108
+ <li>Google Maps JavaScript API</li>
109
+ <li>Google Places API Web Service</li>
110
+ <li>Google Static Maps API</li>
111
+ </ul>
112
+ <p>
113
+ Please enter the API key with access to these services in
114
+ <code style={{whiteSpace: 'nowrap'}}>
115
+ `&lt;project-root&gt;/config/@sanity/google-maps-input.json`
116
+ </code>
117
+ </p>
118
+ </div>
119
+ )
120
+ }
121
+
122
+ return (
123
+ <>
124
+ {value && (
125
+ <ChangeIndicatorCompareValueProvider value={value} compareValue={compareValue}>
126
+ <ChangeIndicator compareDeep>
127
+ <PreviewImage src={getStaticImageUrl(value)} alt="Map location" />
128
+ </ChangeIndicator>
129
+ </ChangeIndicatorCompareValueProvider>
130
+ )}
131
+
132
+ {!readOnly && (
133
+ <Box marginTop={4}>
134
+ <Grid columns={2} gap={2}>
135
+ <Button
136
+ mode="ghost"
137
+ icon={value && EditIcon}
138
+ padding={3}
139
+ ref={this.setEditButton}
140
+ text={value ? 'Edit' : 'Set location'}
141
+ onClick={this.handleToggleModal}
142
+ />
143
+
144
+ {value && (
145
+ <Button
146
+ tone="critical"
147
+ icon={TrashIcon}
148
+ padding={3}
149
+ mode="ghost"
150
+ text={'Remove'}
151
+ onClick={this.handleClear}
152
+ />
153
+ )}
154
+ </Grid>
155
+ </Box>
156
+ )}
157
+
158
+ {modalOpen && (
159
+ <Dialog
160
+ id={`${this._geopointInputId}_dialog`}
161
+ onClose={this.handleCloseModal}
162
+ header="Place the marker on the map"
163
+ width={1}
164
+ >
165
+ <DialogInnerContainer>
166
+ <GoogleMapsLoadProxy>
167
+ {(api) => (
168
+ <GeopointSelect
169
+ api={api}
170
+ value={value || undefined}
171
+ onChange={readOnly ? undefined : this.handleChange}
172
+ defaultLocation={config.defaultLocation}
173
+ defaultZoom={config.defaultZoom}
174
+ />
175
+ )}
176
+ </GoogleMapsLoadProxy>
177
+ </DialogInnerContainer>
178
+ </Dialog>
179
+ )}
180
+ </>
181
+ )
182
+ }
183
+ }
184
+
185
+ export default GeopointInput
@@ -0,0 +1,78 @@
1
+ import React from 'react'
2
+ import {SearchInput} from '../map/SearchInput'
3
+ import {GoogleMap} from '../map/Map'
4
+ import {Marker} from '../map/Marker'
5
+ import {LatLng, Geopoint} from '../types'
6
+
7
+ const fallbackLatLng: LatLng = {lat: 40.7058254, lng: -74.1180863}
8
+
9
+ interface SelectProps {
10
+ api: typeof window.google.maps
11
+ value?: Geopoint
12
+ onChange?: (latLng: google.maps.LatLng) => void
13
+ defaultLocation?: LatLng
14
+ defaultZoom?: number
15
+ }
16
+
17
+ export class GeopointSelect extends React.PureComponent<SelectProps> {
18
+ static defaultProps = {
19
+ defaultZoom: 8,
20
+ defaultLocation: {lng: 10.74609, lat: 59.91273},
21
+ }
22
+
23
+ mapRef = React.createRef<HTMLDivElement>()
24
+
25
+ getCenter() {
26
+ const {value = {}, defaultLocation = {}} = this.props
27
+ const point: LatLng = {...fallbackLatLng, ...defaultLocation, ...value}
28
+ return point
29
+ }
30
+
31
+ handlePlaceChanged = (place: google.maps.places.PlaceResult) => {
32
+ if (!place.geometry) {
33
+ return
34
+ }
35
+
36
+ this.setValue(place.geometry.location)
37
+ }
38
+
39
+ handleMarkerDragEnd = (event: google.maps.MapMouseEvent) => {
40
+ this.setValue(event.latLng)
41
+ }
42
+
43
+ handleMapClick = (event: google.maps.MapMouseEvent) => {
44
+ this.setValue(event.latLng)
45
+ }
46
+
47
+ setValue(geoPoint: google.maps.LatLng) {
48
+ if (this.props.onChange) {
49
+ this.props.onChange(geoPoint)
50
+ }
51
+ }
52
+
53
+ render() {
54
+ const {api, defaultZoom, value, onChange} = this.props
55
+ return (
56
+ <GoogleMap
57
+ api={api}
58
+ location={this.getCenter()}
59
+ onClick={this.handleMapClick}
60
+ defaultZoom={defaultZoom}
61
+ >
62
+ {(map) => (
63
+ <>
64
+ <SearchInput api={api} map={map} onChange={this.handlePlaceChanged} />
65
+ {value && (
66
+ <Marker
67
+ api={api}
68
+ map={map}
69
+ position={value}
70
+ onMove={onChange ? this.handleMarkerDragEnd : undefined}
71
+ />
72
+ )}
73
+ </>
74
+ )}
75
+ </GoogleMap>
76
+ )
77
+ }
78
+ }