diff --git a/package-lock.json b/package-lock.json index 0a345e26..ea009ef6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,6 +56,7 @@ "@types/react-dom": "^17.0.21", "@types/validator": "^13.11.9", "@types/xrm": "^9.0.81", + "@vis.gl/react-google-maps": "^1.7.1", "babel-loader": "^8.2.3", "esbuild": "^0.13.9", "glob": "^11.0.0", @@ -136,7 +137,6 @@ "../INT0015/common/temp/node_modules/.pnpm/react-dom@17.0.2_react@17.0.2/node_modules/react-dom": { "version": "17.0.2", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -149,7 +149,6 @@ "../INT0015/common/temp/node_modules/.pnpm/react@17.0.2/node_modules/react": { "version": "17.0.2", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -174,6 +173,7 @@ "node_modules/@ag-grid-community/core": { "version": "31.3.2", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" } @@ -299,6 +299,7 @@ "version": "7.20.12", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", @@ -586,6 +587,7 @@ "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", "license": "MIT", + "peer": true, "dependencies": { "@dnd-kit/accessibility": "^3.1.1", "@dnd-kit/utilities": "^3.2.2", @@ -838,6 +840,7 @@ "node_modules/@floating-ui/dom": { "version": "1.6.12", "license": "MIT", + "peer": true, "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.8" @@ -955,6 +958,7 @@ "node_modules/@fluentui/react": { "version": "8.121.5", "license": "MIT", + "peer": true, "dependencies": { "@fluentui/date-time-utilities": "^8.6.9", "@fluentui/font-icons-mdl2": "^8.5.54", @@ -2758,6 +2762,7 @@ "resolved": "https://registry.npmjs.org/@talxis/client-libraries/-/client-libraries-1.2602.2.tgz", "integrity": "sha512-k6sSTsxKFfOMuKotKmZf8Vp6iyFp9I5aMl1e9HB9fFvM42vp+rXACwB+edr//S5b9AY7LoBS29NhZl35ttW3Qw==", "license": "MIT", + "peer": true, "dependencies": { "@azure/msal-browser": "^2.27.0", "@microsoft/microsoft-graph-client": "^2.2.1", @@ -3048,6 +3053,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/google.maps": { + "version": "3.58.1", + "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.58.1.tgz", + "integrity": "sha512-X9QTSvGJ0nCfMzYOnaVs/k6/4L+7F5uCS+4iUmkLEls6J9S/Phv+m/i3mDeyc49ZBgwab3EFO1HEoBY7k98EGQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/humanize-duration": { "version": "3.27.4", "dev": true, @@ -3118,6 +3130,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.90.tgz", "integrity": "sha512-P9beVR/x06U9rCJzSxtENnOr4BrbJ6VrsrDTc+73TtHv9XHhryXKbjGRB+6oooB2r0G/pQkD/S4dHo/7jUfwFw==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "^0.16", @@ -3129,6 +3142,7 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.26.tgz", "integrity": "sha512-Z+2VcYXJwOqQ79HreLU/1fyQ88eXSSFh6I3JdrEHQIfYSI0kCQpTGvOrbE6jFGGYXKsHuwY9tBa/w5Uo6KzrEg==", "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^17.0.0" } @@ -3172,6 +3186,21 @@ "dev": true, "license": "MIT" }, + "node_modules/@vis.gl/react-google-maps": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vis.gl/react-google-maps/-/react-google-maps-1.7.1.tgz", + "integrity": "sha512-F/GJzJyri7Jqf+bkLNxoi2RcH2hCIo1I3//PyiILqQzdzglMoqZVO1DLXlHPifNdebk1/zib6dMJA3i73nwmuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/google.maps": "^3.54.10", + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "react": ">=16.8.0 || ^19.0 || ^19.0.0-rc", + "react-dom": ">=16.8.0 || ^19.0 || ^19.0.0-rc" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "dev": true, @@ -3329,6 +3358,7 @@ "version": "6.12.6", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3746,6 +3776,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001449", "electron-to-chromium": "^1.4.284", @@ -4524,7 +4555,8 @@ }, "node_modules/embla-carousel": { "version": "8.3.1", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/embla-carousel-autoplay": { "version": "8.3.1", @@ -4628,6 +4660,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -4651,6 +4684,34 @@ "esbuild-windows-arm64": "0.13.15" } }, + "node_modules/esbuild-android-arm64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.15.tgz", + "integrity": "sha512-m602nft/XXeO8YQPUDVoHfjyRVPdPgjyyXOxZ44MK/agewFFkPa8tUo6lAzSWh5Ui5PB4KR9UIFTSBKh/RrCmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/esbuild-darwin-64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.15.tgz", + "integrity": "sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, "node_modules/esbuild-darwin-arm64": { "version": "0.13.15", "cpu": [ @@ -4663,6 +4724,202 @@ "darwin" ] }, + "node_modules/esbuild-freebsd-64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.15.tgz", + "integrity": "sha512-G3dLBXUI6lC6Z09/x+WtXBXbOYQZ0E8TDBqvn7aMaOCzryJs8LyVXKY4CPnHFXZAbSwkCbqiPuSQ1+HhrNk7EA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.15.tgz", + "integrity": "sha512-KJx0fzEDf1uhNOZQStV4ujg30WlnwqUASaGSFPhznLM/bbheu9HhqZ6mJJZM32lkyfGJikw0jg7v3S0oAvtvQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/esbuild-linux-32": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.15.tgz", + "integrity": "sha512-ZvTBPk0YWCLMCXiFmD5EUtB30zIPvC5Itxz0mdTu/xZBbbHJftQgLWY49wEPSn2T/TxahYCRDWun5smRa0Tu+g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.15.tgz", + "integrity": "sha512-eCKzkNSLywNeQTRBxJRQ0jxRCl2YWdMB3+PkWFo2BBQYC5mISLIVIjThNtn6HUNqua1pnvgP5xX0nHbZbPj5oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-arm": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.15.tgz", + "integrity": "sha512-wUHttDi/ol0tD8ZgUMDH8Ef7IbDX+/UsWJOXaAyTdkT7Yy9ZBqPg8bgB/Dn3CZ9SBpNieozrPRHm0BGww7W/jA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.15.tgz", + "integrity": "sha512-bYpuUlN6qYU9slzr/ltyLTR9YTBS7qUDymO8SV7kjeNext61OdmqFAzuVZom+OLW1HPHseBfJ/JfdSlx8oTUoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.15.tgz", + "integrity": "sha512-KlVjIG828uFPyJkO/8gKwy9RbXhCEUeFsCGOJBepUlpa7G8/SeZgncUEz/tOOUJTcWMTmFMtdd3GElGyAtbSWg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.15.tgz", + "integrity": "sha512-h6gYF+OsaqEuBjeesTBtUPw0bmiDu7eAeuc2OEH9S6mV9/jPhPdhOWzdeshb0BskRZxPhxPOjqZ+/OqLcxQwEQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.15.tgz", + "integrity": "sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ] + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.15.tgz", + "integrity": "sha512-wTfvtwYJYAFL1fSs8yHIdf5GEE4NkbtbXtjLWjM3Cw8mmQKqsg8kTiqJ9NJQe5NX/5Qlo7Xd9r1yKMMkHllp5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/esbuild-sunos-64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.15.tgz", + "integrity": "sha512-lbivT9Bx3t1iWWrSnGyBP9ODriEvWDRiweAs69vI+miJoeKwHWOComSRukttbuzjZ8r1q0mQJ8Z7yUsDJ3hKdw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ] + }, + "node_modules/esbuild-windows-32": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.15.tgz", + "integrity": "sha512-fDMEf2g3SsJ599MBr50cY5ve5lP1wyVwTe6aLJsM01KtxyKkB4UT+fc5MXQFn3RLrAIAZOG+tHC+yXObpSn7Nw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/esbuild-windows-64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.15.tgz", + "integrity": "sha512-9aMsPRGDWCd3bGjUIKG/ZOJPKsiztlxl/Q3C1XDswO6eNX/Jtwu4M+jb6YDH9hRSUflQWX0XKAfWzgy5Wk54JQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.15.tgz", + "integrity": "sha512-zzvyCVVpbwQQATaf3IG8mu1IwGEiDxKkYUdA4FpoCHi1KtPa13jeScYDjlW0Qh+ebWzpKfR2ZwvqAQkSWNcKjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/escalade": { "version": "3.1.1", "dev": true, @@ -6047,8 +6304,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.defaults": { "version": "4.2.0", @@ -6170,8 +6426,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/merge-anything": { "version": "5.1.7", @@ -6629,6 +6884,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.0", @@ -7323,7 +7579,6 @@ "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.11.tgz", "integrity": "sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.0.0", "memoize-one": ">=3.1.1 <6" @@ -7498,6 +7753,7 @@ "version": "2.79.1", "dev": true, "license": "MIT", + "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -8312,6 +8568,7 @@ "version": "4.9.5", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8483,6 +8740,7 @@ "version": "5.75.0", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", @@ -8542,6 +8800,7 @@ "version": "8.8.2", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, diff --git a/package.json b/package.json index f139ac6a..46828512 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "@types/react-dom": "^17.0.21", "@types/validator": "^13.11.9", "@types/xrm": "^9.0.81", + "@vis.gl/react-google-maps": "^1.7.1", "babel-loader": "^8.2.3", "esbuild": "^0.13.9", "glob": "^11.0.0", @@ -104,4 +105,4 @@ "react": "^16.8.6 || ^17.0.2", "react-dom": "^16.8.6 || ^17.0.2" } -} +} \ No newline at end of file diff --git a/rollup.config.js b/rollup.config.js index 4aa29a65..6c8e81d8 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -51,6 +51,7 @@ const externalDeps = [ 'react-select', 'react-select/async', 'hotkeys-js', + '@vis.gl/react-google-maps', ] export default [ diff --git a/src/components/Grid/interfaces.ts b/src/components/Grid/interfaces.ts index 4e358dde..c16e92b2 100644 --- a/src/components/Grid/interfaces.ts +++ b/src/components/Grid/interfaces.ts @@ -31,7 +31,7 @@ export interface IGridParameters extends IParameters { EnablePageSizeSwitcher?: Omit; EnableAutoSave?: Omit; DefaultExpandedGroupLevel?: Omit; - + Height?: IStringProperty; InlineRibbonButtonIds?: IStringProperty; GroupingType?: Omit, 'type'>; diff --git a/src/components/Map/components/Map.css b/src/components/Map/components/Map.css new file mode 100644 index 00000000..8214ee4a --- /dev/null +++ b/src/components/Map/components/Map.css @@ -0,0 +1,4 @@ +.map-picker { + width: 100%; + height: 100%; +} diff --git a/src/components/Map/components/Map.tsx b/src/components/Map/components/Map.tsx new file mode 100644 index 00000000..daac76f0 --- /dev/null +++ b/src/components/Map/components/Map.tsx @@ -0,0 +1,51 @@ +import { IMap } from "../interfaces"; +import { useCallback, useEffect, useState } from "react"; +import { IMapLocation } from "../providers"; +import { useEventEmitter } from "../../../hooks/useEventEmitter"; +import { IDataProviderEventListeners } from "@talxis/client-libraries"; +import './Map.css'; + +export const Map = (props: IMap) => { + const { Dataset: dataset, PinMetadata: pinMetadata, MapProvider } = props.parameters; + const [locations, setLocations] = useState([]); + + const loadLocations = useCallback(() => { + if (!dataset || !pinMetadata) { + setLocations([]); + return; + } + + const records = dataset.getRecords(); + const result: IMapLocation[] = []; + + for (const record of records) { + try { + const latValue = record.getValue(pinMetadata.LatitudeAttributeName); + const lngValue = record.getValue(pinMetadata.LongitudeAttributeName); + + const lat = typeof latValue === 'number' ? latValue : parseFloat(latValue); + const lng = typeof lngValue === 'number' ? lngValue : parseFloat(lngValue); + + if (!isNaN(lat) && !isNaN(lng)) { + result.push({ id: record.getRecordId(), latitude: lat, longitude: lng }); + } + } catch (error) { + console.warn(`Failed to extract location from record ${record.getRecordId()}:`, error); + } + } + + setLocations(result); + }, [dataset, pinMetadata]); + + useEffect(() => { + dataset?.refresh(); + }, []); + + useEventEmitter(dataset, 'onNewDataLoaded', loadLocations); + + return ( +
+ +
+ ); +}; diff --git a/src/components/Map/components/index.ts b/src/components/Map/components/index.ts new file mode 100644 index 00000000..f251395f --- /dev/null +++ b/src/components/Map/components/index.ts @@ -0,0 +1 @@ +export * from './Map'; diff --git a/src/components/Map/index.ts b/src/components/Map/index.ts new file mode 100644 index 00000000..2174630a --- /dev/null +++ b/src/components/Map/index.ts @@ -0,0 +1,3 @@ +export * from './interfaces'; +export * from './components/Map'; +export * from './providers'; \ No newline at end of file diff --git a/src/components/Map/interfaces.ts b/src/components/Map/interfaces.ts new file mode 100644 index 00000000..a92ed3c1 --- /dev/null +++ b/src/components/Map/interfaces.ts @@ -0,0 +1,27 @@ +import { IParameters } from "../../interfaces"; +import { mapTranslations } from "./translations"; +import { IControl, IOutputs, ITranslations } from "../../interfaces/context"; +import { IDataset } from "@talxis/client-libraries"; +import { IMapProvider } from "./providers"; + + +export interface IMap extends IControl>, any> { + +} + +interface IMapEntityProps { + LatitudeAttributeName: string; + LongitudeAttributeName: string; + + RouteAttributeName?: string; +} + +export interface IMapParameters extends IParameters { + Dataset: IDataset; + PinMetadata?: IMapEntityProps; + MapProvider: IMapProvider; +} + +export interface IMapOutputs extends IOutputs { + +} diff --git a/src/components/Map/providers/GoogleMaps/GoogleMapsProvider.css b/src/components/Map/providers/GoogleMaps/GoogleMapsProvider.css new file mode 100644 index 00000000..5fa98e1b --- /dev/null +++ b/src/components/Map/providers/GoogleMaps/GoogleMapsProvider.css @@ -0,0 +1,4 @@ +.google-maps-container { + width: 100%; + height: 400px; +} diff --git a/src/components/Map/providers/GoogleMaps/GoogleMapsProvider.tsx b/src/components/Map/providers/GoogleMaps/GoogleMapsProvider.tsx new file mode 100644 index 00000000..82ccbc95 --- /dev/null +++ b/src/components/Map/providers/GoogleMaps/GoogleMapsProvider.tsx @@ -0,0 +1,36 @@ +import { APIProvider, Map, AdvancedMarker, Pin, Marker } from '@vis.gl/react-google-maps'; +import { useMemo } from 'react'; +import { IMapProvider, IMapProviderProps } from '../IMapProvider'; +import './GoogleMapsProvider.css'; + +export interface IGoogleMapsConfig { + apiKey: string; +} + +const GoogleMapsMap = (props: IMapProviderProps & { apiKey: string }) => { + + // This sometimes doesn't work and defaults to (0, 0) + const center = useMemo(() => { + if (props.locations.length === 0) return { lat: 0, lng: 0 }; + const lat = props.locations.reduce((s, l) => s + l.latitude, 0) / props.locations.length; + const lng = props.locations.reduce((s, l) => s + l.longitude, 0) / props.locations.length; + return { lat, lng }; + }, [props.locations]); + + return ( + +
+ + {props.locations.map((location) => ( + // To use AdvancedMarker, we need mapid + + ))} + +
+
+ ); +}; + +export const createGoogleMapsProvider = (config: IGoogleMapsConfig): IMapProvider => { + return (props: IMapProviderProps) => ; +}; diff --git a/src/components/Map/providers/IMapProvider.ts b/src/components/Map/providers/IMapProvider.ts new file mode 100644 index 00000000..dcead615 --- /dev/null +++ b/src/components/Map/providers/IMapProvider.ts @@ -0,0 +1,13 @@ +import { ComponentType } from 'react'; + +export interface IMapLocation { + id: string; + latitude: number; + longitude: number; +} + +export interface IMapProviderProps { + locations: IMapLocation[]; +} + +export type IMapProvider = ComponentType; diff --git a/src/components/Map/providers/index.ts b/src/components/Map/providers/index.ts new file mode 100644 index 00000000..2edb884d --- /dev/null +++ b/src/components/Map/providers/index.ts @@ -0,0 +1,2 @@ +export * from './IMapProvider'; +export * from './GoogleMaps/GoogleMapsProvider'; diff --git a/src/components/Map/translations.ts b/src/components/Map/translations.ts new file mode 100644 index 00000000..529435dc --- /dev/null +++ b/src/components/Map/translations.ts @@ -0,0 +1,6 @@ +export const mapTranslations = { + placeholder: { + 1033: "Search", + 1029: "Vyhledejte" + } +} \ No newline at end of file diff --git a/src/components/index.ts b/src/components/index.ts index 57658029..55198ede 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -5,6 +5,7 @@ export * from './DateTime'; export * from './Grid'; export * from './GridCellRenderer'; export * from './Lookup'; +export * from './Map'; export * from './MultiSelectOptionSet'; export * from './NestedControlRenderer'; export * from './OptionSet';