@map-colonies/react-components 3.11.0 → 3.12.3

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 (40) hide show
  1. package/CHANGELOG.md +290 -234
  2. package/dist/cesium-map/index.d.ts +1 -0
  3. package/dist/cesium-map/index.js +1 -0
  4. package/dist/cesium-map/layers/imagery.layer.js +9 -5
  5. package/dist/cesium-map/layers-manager.d.ts +10 -2
  6. package/dist/cesium-map/layers-manager.js +19 -1
  7. package/dist/cesium-map/map-legend/MapLegend.css +135 -0
  8. package/dist/cesium-map/map-legend/MapLegend.d.ts +15 -0
  9. package/dist/cesium-map/map-legend/MapLegend.js +57 -0
  10. package/dist/cesium-map/map-legend/MapLegendList.d.ts +13 -0
  11. package/dist/cesium-map/map-legend/MapLegendList.js +43 -0
  12. package/dist/cesium-map/map-legend/MapLegendSidebar.d.ts +16 -0
  13. package/dist/cesium-map/map-legend/MapLegendSidebar.js +20 -0
  14. package/dist/cesium-map/map-legend/MapLegendToggle.d.ts +7 -0
  15. package/dist/cesium-map/map-legend/MapLegendToggle.js +20 -0
  16. package/dist/cesium-map/map-legend/index.d.ts +3 -0
  17. package/dist/cesium-map/map-legend/index.js +14 -0
  18. package/dist/cesium-map/map.css +6 -1
  19. package/dist/cesium-map/map.d.ts +14 -1
  20. package/dist/cesium-map/map.js +53 -21
  21. package/dist/cesium-map/proxied.types.d.ts +9 -1
  22. package/dist/cesium-map/proxied.types.js +33 -1
  23. package/dist/cesium-map/settings/settings.css +5 -2
  24. package/package.json +3 -3
  25. package/src/lib/cesium-map/data-sources/drawings.data-source.tsx +0 -1
  26. package/src/lib/cesium-map/index.ts +1 -0
  27. package/src/lib/cesium-map/layers/imagery.layer.tsx +12 -7
  28. package/src/lib/cesium-map/layers-manager.ts +30 -1
  29. package/src/lib/cesium-map/map-legend/MapLegend.css +135 -0
  30. package/src/lib/cesium-map/map-legend/MapLegend.tsx +92 -0
  31. package/src/lib/cesium-map/map-legend/MapLegendList.tsx +47 -0
  32. package/src/lib/cesium-map/map-legend/MapLegendSidebar.tsx +55 -0
  33. package/src/lib/cesium-map/map-legend/MapLegendToggle.tsx +31 -0
  34. package/src/lib/cesium-map/map-legend/index.tsx +3 -0
  35. package/src/lib/cesium-map/map-legend/legends-sidebar.stories.tsx +201 -0
  36. package/src/lib/cesium-map/map.css +6 -1
  37. package/src/lib/cesium-map/map.tsx +85 -20
  38. package/src/lib/cesium-map/proxied.types.ts +19 -7
  39. package/src/lib/cesium-map/settings/settings.css +5 -2
  40. package/src/lib/cesium-map/terrain-providers/terrain-provider-heights-tool.stories.tsx +2 -2
@@ -22,16 +22,29 @@ var point_geojson_1 = require("./tools/geojson/point.geojson");
22
22
  var INC = 1;
23
23
  var DEC = -1;
24
24
  var LayerManager = /** @class */ (function () {
25
- function LayerManager(mapViewer) {
25
+ function LayerManager(mapViewer, legendsExtractor, onLayersUpdate) {
26
+ var _this = this;
26
27
  this.mapViewer = mapViewer;
27
28
  // eslint-disable-next-line
28
29
  this.layers = this.mapViewer.imageryLayers._layers;
30
+ this.legendsList = [];
31
+ this.legendsExtractor = legendsExtractor;
32
+ this.layerUpdated = new cesium_1.Event();
33
+ if (onLayersUpdate) {
34
+ this.layerUpdated.addEventListener(onLayersUpdate, this);
35
+ }
36
+ this.mapViewer.imageryLayers.layerRemoved.addEventListener(function () {
37
+ _this.setLegends();
38
+ _this.layerUpdated.raiseEvent();
39
+ });
29
40
  }
30
41
  /* eslint-disable */
31
42
  LayerManager.prototype.addMetaToLayer = function (meta, layerPredicate) {
32
43
  var layer = this.layers.find(layerPredicate);
33
44
  if (layer) {
34
45
  layer.meta = meta;
46
+ this.setLegends();
47
+ this.layerUpdated.raiseEvent();
35
48
  }
36
49
  };
37
50
  /* eslint-enable */
@@ -192,6 +205,11 @@ var LayerManager = /** @class */ (function () {
192
205
  return ((_a = layer2.meta) === null || _a === void 0 ? void 0 : _a.zIndex) - ((_b = layer1.meta) === null || _b === void 0 ? void 0 : _b.zIndex);
193
206
  });
194
207
  };
208
+ LayerManager.prototype.setLegends = function () {
209
+ if (typeof this.legendsExtractor !== 'undefined') {
210
+ this.legendsList = this.legendsExtractor(this.layers);
211
+ }
212
+ };
195
213
  LayerManager.prototype.getBaseLayersCount = function () {
196
214
  var baseLayers = this.layers.filter(function (layer) {
197
215
  var parentId = lodash_1.get(layer.meta, 'parentBasetMapId');
@@ -0,0 +1,135 @@
1
+ .mapLegendSidebarContainer {
2
+ width: 340px;
3
+ height: 100%;
4
+ position: relative;
5
+ overflow-y: auto;
6
+ overflow-x: hidden;
7
+ font-size: 16px;
8
+ }
9
+
10
+ /* Disable drawer animation */
11
+
12
+ .mapLegendSidebarContainer.mdc-drawer--animate {
13
+ transform: translateX(0) !important;
14
+ transition: none !important;
15
+ }
16
+
17
+ .mapLegendSidebarContainer.mdc-drawer--dismissible {
18
+ position: relative;
19
+ }
20
+
21
+ div.MuiPaper-root {
22
+ transition: none !important;
23
+ }
24
+
25
+ .mapLegendCloseBtn {
26
+ position: absolute;
27
+ top: 0;
28
+ right: 0;
29
+ cursor: pointer;
30
+ width: 50px;
31
+ height: 50px;
32
+ padding: 20px;
33
+ font-size: 24px;
34
+ }
35
+
36
+ body[dir='rtl'] .mapLegendCloseBtn {
37
+ right: unset;
38
+ left: 0;
39
+ }
40
+
41
+ .mapLegendToggleContainer {
42
+ display: flex;
43
+ align-items: center;
44
+ justify-content: center;
45
+ }
46
+
47
+ .mapLegendIcon {
48
+ width: 2.5rem;
49
+ height: 2.5rem;
50
+ }
51
+
52
+ .sidebarHeaderContainer {
53
+ text-align: center;
54
+ margin-top: 40px;
55
+ }
56
+
57
+ .sidebarTitle {
58
+ font-size: 1.5rem;
59
+ font-weight: bold;
60
+ }
61
+
62
+ .mapLegend {
63
+ display: flex;
64
+ flex-direction: column;
65
+ align-items: center;
66
+ justify-content: center;
67
+ gap: 4px;
68
+ padding: 10px 14px;
69
+ }
70
+
71
+ .layerNameContainer {
72
+ width: 90%;
73
+ display: flex;
74
+ justify-content: center;
75
+ align-items: center;
76
+ }
77
+
78
+ .layerName {
79
+ overflow: hidden;
80
+ text-overflow: ellipsis;
81
+ white-space: nowrap;
82
+ }
83
+
84
+ .legendImg {
85
+ width: 90%;
86
+ height: 150px;
87
+ border: 1px solid black;
88
+ border-radius: 5px;
89
+ object-fit: cover;
90
+ cursor: pointer;
91
+ }
92
+
93
+ .legendActionsContainer {
94
+ display: flex;
95
+ flex-direction: row;
96
+ align-self: center;
97
+ }
98
+
99
+ .legendAction:not(:last-child)::after {
100
+ content: '|';
101
+ margin: 0px 4px;
102
+ }
103
+
104
+ .mapLegendsList {
105
+ display: flex;
106
+ flex-direction: column;
107
+ padding: 20px 0px;
108
+ width: 100%;
109
+ height: 90%;
110
+ }
111
+
112
+ .legendAction {
113
+ text-decoration: underline;
114
+ cursor: pointer;
115
+ font-size: 1.1rem;
116
+ transition: all 0.1s ease-in-out;
117
+ width: max-content;
118
+ }
119
+
120
+ .legendAction:hover {
121
+ filter: brightness(1.2);
122
+ }
123
+
124
+ .noLegendsContainer {
125
+ width: 100%;
126
+ height: 100%;
127
+ display: flex;
128
+ flex-direction: column;
129
+ justify-content: center;
130
+ align-items: center;
131
+ }
132
+
133
+ .noLegendsMsg {
134
+ text-align: center;
135
+ }
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import './MapLegend.css';
3
+ export interface IMapLegend {
4
+ layer?: string;
5
+ legendDoc?: string;
6
+ legendImg?: string;
7
+ legend?: Record<string, unknown>[];
8
+ }
9
+ interface MapLegendProps {
10
+ legend: IMapLegend;
11
+ docText?: string;
12
+ imgText?: string;
13
+ }
14
+ export declare const MapLegend: React.FC<MapLegendProps>;
15
+ export {};
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.MapLegend = void 0;
23
+ var react_1 = __importStar(require("react"));
24
+ var react_core_1 = require("@map-colonies/react-core");
25
+ var box_1 = require("../../box");
26
+ require("./MapLegend.css");
27
+ var MapLegend = function (_a) {
28
+ var _b = _a.legend, legendImg = _b.legendImg, legendDoc = _b.legendDoc, layer = _b.layer, docText = _a.docText, imgText = _a.imgText;
29
+ var handleLegendImgOpen = react_1.useCallback(function () {
30
+ // Open image in a new tab.
31
+ window.open(legendImg, '_blank');
32
+ }, [legendImg]);
33
+ var handleLegendDocOpen = react_1.useCallback(function () {
34
+ // Open doc in a new tab.
35
+ window.open(legendDoc, '_blank');
36
+ }, [legendDoc]);
37
+ var renderLayerName = react_1.useCallback(function () {
38
+ var MAX_LAYER_NAME_LENGTH = 15;
39
+ var layerNameContainer = (react_1.default.createElement(box_1.Box, { className: "layerNameContainer" },
40
+ react_1.default.createElement("h3", { style: { maxWidth: MAX_LAYER_NAME_LENGTH + "ch" }, className: "layerName" }, layer)));
41
+ if ((layer !== null && layer !== void 0 ? layer : '').length > MAX_LAYER_NAME_LENGTH) {
42
+ return react_1.default.createElement(react_core_1.Tooltip, { content: layer }, layerNameContainer);
43
+ }
44
+ return layerNameContainer;
45
+ }, [layer]);
46
+ var renderLinks = react_1.useCallback(function () {
47
+ return [
48
+ typeof legendImg === 'string' && (react_1.default.createElement("a", { className: "legendAction", href: legendImg, target: "_blank", rel: "noreferrer" }, imgText)),
49
+ typeof legendDoc === 'string' && (react_1.default.createElement("a", { className: "legendAction", href: legendDoc, target: "_blank", rel: "noreferrer" }, docText)),
50
+ ];
51
+ }, [legendImg, imgText, legendDoc, docText]);
52
+ return (react_1.default.createElement(box_1.Box, { className: "mapLegend" },
53
+ renderLayerName(),
54
+ react_1.default.createElement("img", { alt: "Map Legend", className: "legendImg", src: legendImg, onClick: handleLegendImgOpen }),
55
+ react_1.default.createElement(box_1.Box, { className: "legendActionsContainer" }, renderLinks())));
56
+ };
57
+ exports.MapLegend = MapLegend;
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { IMapLegend } from './MapLegend';
3
+ import './MapLegend.css';
4
+ interface MapLegendListProps {
5
+ legends: IMapLegend[];
6
+ actionsTexts: {
7
+ docText: string;
8
+ imgText: string;
9
+ };
10
+ noLegendsText: string;
11
+ }
12
+ export declare const MapLegendList: React.FC<MapLegendListProps>;
13
+ export {};
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.MapLegendList = void 0;
23
+ var react_1 = __importStar(require("react"));
24
+ var box_1 = require("../../box");
25
+ var MapLegend_1 = require("./MapLegend");
26
+ require("./MapLegend.css");
27
+ var MapLegendList = function (_a) {
28
+ var legends = _a.legends, _b = _a.actionsTexts, docText = _b.docText, imgText = _b.imgText, noLegendsText = _a.noLegendsText;
29
+ var handleNoLegends = react_1.useCallback(function () {
30
+ return (react_1.default.createElement(box_1.Box, { className: "noLegendsContainer" },
31
+ react_1.default.createElement("h2", { className: "noLegendsMsg" }, noLegendsText)));
32
+ }, [noLegendsText]);
33
+ var renderList = react_1.useCallback(function () {
34
+ if (!legends.length) {
35
+ return handleNoLegends();
36
+ }
37
+ return legends.map(function (legend, i) {
38
+ return (react_1.default.createElement(MapLegend_1.MapLegend, { key: legend.layer + "_" + i, legend: legend, docText: docText, imgText: imgText }));
39
+ });
40
+ }, [legends]);
41
+ return react_1.default.createElement(box_1.Box, { className: "mapLegendsList" }, renderList());
42
+ };
43
+ exports.MapLegendList = MapLegendList;
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import { IMapLegend } from './MapLegend';
3
+ import './MapLegend.css';
4
+ interface MapLegendSidebarProps {
5
+ isOpen: boolean;
6
+ toggleSidebar: () => void;
7
+ title?: string;
8
+ noLegendsText?: string;
9
+ actionsTexts?: {
10
+ docText: string;
11
+ imgText: string;
12
+ };
13
+ legends?: IMapLegend[];
14
+ }
15
+ export declare const MapLegendSidebar: React.FC<MapLegendSidebarProps>;
16
+ export {};
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MapLegendSidebar = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var react_core_1 = require("@map-colonies/react-core");
9
+ var MapLegendList_1 = require("./MapLegendList");
10
+ require("./MapLegend.css");
11
+ var MapLegendSidebar = function (_a) {
12
+ var isOpen = _a.isOpen, toggleSidebar = _a.toggleSidebar, _b = _a.title, title = _b === void 0 ? 'Map Legends' : _b, _c = _a.noLegendsText, noLegendsText = _c === void 0 ? 'No legends to display...' : _c, _d = _a.actionsTexts, actionsTexts = _d === void 0 ? { docText: 'Docs', imgText: 'View Image' } : _d, _e = _a.legends, legends = _e === void 0 ? [] : _e;
13
+ return isOpen ? (react_1.default.createElement(react_core_1.Drawer, { className: "mapLegendSidebarContainer", modal: false, dismissible: true, open: isOpen },
14
+ react_1.default.createElement(react_core_1.DrawerHeader, { className: "sidebarHeaderContainer" },
15
+ react_1.default.createElement(react_core_1.DrawerTitle, { className: "sidebarTitle" }, title)),
16
+ react_1.default.createElement(react_core_1.DrawerContent, { className: "sidebarContent" },
17
+ react_1.default.createElement(react_core_1.Icon, { onClick: toggleSidebar, className: "mapLegendCloseBtn", icon: { icon: 'close', size: 'small' } }),
18
+ react_1.default.createElement(MapLegendList_1.MapLegendList, { noLegendsText: noLegendsText, legends: legends, actionsTexts: actionsTexts })))) : null;
19
+ };
20
+ exports.MapLegendSidebar = MapLegendSidebar;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import './MapLegend.css';
3
+ interface MapLegendProps {
4
+ onClick: () => void;
5
+ }
6
+ export declare const MapLegendToggle: React.FC<MapLegendProps>;
7
+ export {};
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MapLegendToggle = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var react_core_1 = require("@map-colonies/react-core");
9
+ var box_1 = require("../../box");
10
+ require("./MapLegend.css");
11
+ var legendIcon = (react_1.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", "enable-background": "new 0 0 24 24", height: "24", width: "24", viewBox: "0 0 612 612" },
12
+ react_1.default.createElement("g", { xmlns: "http://www.w3.org/2000/svg" },
13
+ react_1.default.createElement("path", { d: "M322.4,173.9l-129,16.2l-4.6,21.4l25.3,4.7c16.5,3.9,19.8,9.9,16.2,26.4l-41.5,195.3c-10.9,50.5,5.9,74.3,45.5,74.3 c30.7,0,66.3-14.2,82.5-33.6l4.9-23.4c-11.3,9.9-27.7,13.9-38.6,13.9c-15.5,0-21.1-10.9-17.1-30L322.4,173.9z" }),
14
+ react_1.default.createElement("circle", { cx: "270.1", cy: "56.3", r: "56.3" }))));
15
+ var MapLegendToggle = function (_a) {
16
+ var onClick = _a.onClick;
17
+ return (react_1.default.createElement(box_1.Box, { onClick: onClick, className: "mapLegendToggleContainer" },
18
+ react_1.default.createElement(react_core_1.Icon, { icon: legendIcon, className: "mapLegendIcon" })));
19
+ };
20
+ exports.MapLegendToggle = MapLegendToggle;
@@ -0,0 +1,3 @@
1
+ export * from './MapLegendToggle';
2
+ export * from './MapLegendSidebar';
3
+ export type { IMapLegend } from './MapLegend';
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./MapLegendToggle"), exports);
14
+ __exportStar(require("./MapLegendSidebar"), exports);
@@ -40,7 +40,7 @@ body[dir='rtl'] .toolsContainer {
40
40
 
41
41
  .sideToolsContainer {
42
42
  display: flex;
43
- flex-direction: column;
43
+ flex-direction: row;
44
44
  gap: 8px;
45
45
  z-index: 2000;
46
46
  position: absolute;
@@ -52,3 +52,8 @@ body[dir='rtl'] .sideToolsContainer {
52
52
  left: 40px;
53
53
  right: unset;
54
54
  }
55
+
56
+ .viewer {
57
+ display: flex;
58
+ flex-direction: row;
59
+ }
@@ -3,7 +3,8 @@ import { ViewerProps } from 'resium/dist/types/src/Viewer/Viewer';
3
3
  import { Viewer as CesiumViewerCls, TerrainProvider } from 'cesium';
4
4
  import { Proj } from '../utils/projections';
5
5
  import { IBaseMaps } from './settings/settings';
6
- import LayerManager from './layers-manager';
6
+ import { IMapLegend } from './map-legend';
7
+ import LayerManager, { LegendExtractor } from './layers-manager';
7
8
  import { CesiumSceneModeEnum } from './map.types';
8
9
  import './map.css';
9
10
  export declare class CesiumViewer extends CesiumViewerCls {
@@ -23,6 +24,16 @@ export interface IContextMenuData {
23
24
  };
24
25
  handleClose: () => void;
25
26
  }
27
+ interface ILegends {
28
+ legendsList?: IMapLegend[];
29
+ emptyText?: string;
30
+ title?: string;
31
+ actionsTexts?: {
32
+ docText: string;
33
+ imgText: string;
34
+ };
35
+ mapLegendsExtractor?: LegendExtractor;
36
+ }
26
37
  export interface CesiumMapProps extends ViewerProps {
27
38
  showMousePosition?: boolean;
28
39
  showScale?: boolean;
@@ -41,6 +52,8 @@ export interface CesiumMapProps extends ViewerProps {
41
52
  width: number;
42
53
  dynamicHeightIncrement?: number;
43
54
  };
55
+ legends?: ILegends;
44
56
  }
45
57
  export declare const useCesiumMap: () => CesiumViewer;
46
58
  export declare const CesiumMap: React.FC<CesiumMapProps>;
59
+ export {};
@@ -50,6 +50,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
50
50
  Object.defineProperty(exports, "__esModule", { value: true });
51
51
  exports.CesiumMap = exports.useCesiumMap = exports.CesiumViewer = void 0;
52
52
  var react_1 = __importStar(require("react"));
53
+ var react_dom_1 = require("react-dom");
53
54
  var resium_1 = require("resium");
54
55
  var cesium_1 = require("cesium");
55
56
  var lodash_1 = require("lodash");
@@ -59,6 +60,7 @@ var projections_1 = require("../utils/projections");
59
60
  var coordinates_tracker_tool_1 = require("./tools/coordinates-tracker.tool");
60
61
  var scale_tracker_tool_1 = require("./tools/scale-tracker.tool");
61
62
  var settings_1 = require("./settings/settings");
63
+ var map_legend_1 = require("./map-legend");
62
64
  var layers_manager_1 = __importDefault(require("./layers-manager"));
63
65
  var map_types_1 = require("./map.types");
64
66
  require("./map.css");
@@ -85,18 +87,20 @@ var useCesiumMap = function () {
85
87
  };
86
88
  exports.useCesiumMap = useCesiumMap;
87
89
  var CesiumMap = function (props) {
88
- var _a, _b, _c, _d, _e, _f, _g, _h;
90
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
89
91
  var ref = react_1.useRef(null);
90
- var _j = react_1.useState(), mapViewRef = _j[0], setMapViewRef = _j[1];
91
- var _k = react_1.useState(), projection = _k[0], setProjection = _k[1];
92
- var _l = react_1.useState(), showMousePosition = _l[0], setShowMousePosition = _l[1];
93
- var _m = react_1.useState(), showScale = _m[0], setShowScale = _m[1];
94
- var _o = react_1.useState(), locale = _o[0], setLocale = _o[1];
95
- var _p = react_1.useState(), cameraState = _p[0], setCameraState = _p[1];
96
- var _q = react_1.useState(), sceneModes = _q[0], setSceneModes = _q[1];
97
- var _r = react_1.useState(), baseMaps = _r[0], setBaseMaps = _r[1];
98
- var _s = react_1.useState(false), showImageryMenu = _s[0], setShowImageryMenu = _s[1];
99
- var _t = react_1.useState(undefined), imageryMenuPosition = _t[0], setImageryMenuPosition = _t[1];
92
+ var _p = react_1.useState(), mapViewRef = _p[0], setMapViewRef = _p[1];
93
+ var _q = react_1.useState(), projection = _q[0], setProjection = _q[1];
94
+ var _r = react_1.useState(), showMousePosition = _r[0], setShowMousePosition = _r[1];
95
+ var _s = react_1.useState(), showScale = _s[0], setShowScale = _s[1];
96
+ var _t = react_1.useState(), locale = _t[0], setLocale = _t[1];
97
+ var _u = react_1.useState(), cameraState = _u[0], setCameraState = _u[1];
98
+ var _v = react_1.useState(), sceneModes = _v[0], setSceneModes = _v[1];
99
+ var _w = react_1.useState([]), legendsList = _w[0], setLegendsList = _w[1];
100
+ var _x = react_1.useState(), baseMaps = _x[0], setBaseMaps = _x[1];
101
+ var _y = react_1.useState(false), showImageryMenu = _y[0], setShowImageryMenu = _y[1];
102
+ var _z = react_1.useState(undefined), imageryMenuPosition = _z[0], setImageryMenuPosition = _z[1];
103
+ var _0 = react_1.useState(false), isLegendsSidebarOpen = _0[0], setIsLegendsSidebarOpen = _0[1];
100
104
  var viewerProps = __assign({ fullscreenButton: true, timeline: false, animation: false, baseLayerPicker: false, geocoder: false, navigationHelpButton: false, homeButton: false, sceneModePicker: false }, props);
101
105
  var getImageryMenuStyle = function (x, y, menuWidth, menuHeight, menuDynamicHeightIncrement) {
102
106
  var container = mapViewRef.container;
@@ -114,7 +118,6 @@ var CesiumMap = function (props) {
114
118
  var _a;
115
119
  if (ref.current) {
116
120
  var viewer = ref.current.cesiumElement;
117
- viewer.layersManager = new layers_manager_1.default(viewer);
118
121
  if (props.imageryContextMenu) {
119
122
  viewer.screenSpaceEventHandler.setInputAction(function (evt) {
120
123
  // console.log('RIGHT click', evt.position);
@@ -126,6 +129,15 @@ var CesiumMap = function (props) {
126
129
  }
127
130
  setMapViewRef((_a = ref.current) === null || _a === void 0 ? void 0 : _a.cesiumElement);
128
131
  }, [ref, props.imageryContextMenu]);
132
+ react_1.useEffect(function () {
133
+ var _a;
134
+ if (mapViewRef) {
135
+ mapViewRef.layersManager = new layers_manager_1.default(mapViewRef, (_a = props.legends) === null || _a === void 0 ? void 0 : _a.mapLegendsExtractor, function () {
136
+ var _a;
137
+ setLegendsList((_a = mapViewRef === null || mapViewRef === void 0 ? void 0 : mapViewRef.layersManager) === null || _a === void 0 ? void 0 : _a.legendsList);
138
+ });
139
+ }
140
+ }, [mapViewRef]);
129
141
  react_1.useEffect(function () {
130
142
  var _a;
131
143
  setSceneModes((_a = props.sceneModes) !== null && _a !== void 0 ? _a : [
@@ -243,25 +255,45 @@ var CesiumMap = function (props) {
243
255
  });
244
256
  }
245
257
  }, [props.zoom, props.center, mapViewRef]);
246
- return (react_1.default.createElement(resium_1.Viewer, __assign({ full: true, ref: ref }, viewerProps),
258
+ var bindCustomToolsToViewer = react_1.useCallback(function () {
259
+ return (mapViewRef &&
260
+ react_dom_1.createPortal(react_1.default.createElement(react_1.default.Fragment, null,
261
+ react_1.default.createElement(box_1.Box, { className: "sideToolsContainer" },
262
+ react_1.default.createElement(settings_1.CesiumSettings, { sceneModes: sceneModes, baseMaps: baseMaps, locale: locale }),
263
+ react_1.default.createElement(map_legend_1.MapLegendToggle, { onClick: function () {
264
+ return setIsLegendsSidebarOpen(!isLegendsSidebarOpen);
265
+ } })),
266
+ react_1.default.createElement(box_1.Box, { className: "toolsContainer" },
267
+ showMousePosition === true ? (react_1.default.createElement(coordinates_tracker_tool_1.CoordinatesTrackerTool, { projection: projection })) : (react_1.default.createElement(react_1.default.Fragment, null)),
268
+ showScale === true ? react_1.default.createElement(scale_tracker_tool_1.ScaleTrackerTool, { locale: locale }) : react_1.default.createElement(react_1.default.Fragment, null))), document.querySelector('.cesium-viewer')));
269
+ }, [
270
+ baseMaps,
271
+ locale,
272
+ mapViewRef,
273
+ projection,
274
+ sceneModes,
275
+ showMousePosition,
276
+ showScale,
277
+ isLegendsSidebarOpen,
278
+ ]);
279
+ return (react_1.default.createElement(resium_1.Viewer, __assign({ className: "viewer", full: true, ref: ref }, viewerProps),
247
280
  react_1.default.createElement(MapViewProvider, { value: mapViewRef },
281
+ react_1.default.createElement(map_legend_1.MapLegendSidebar, { title: (_a = props.legends) === null || _a === void 0 ? void 0 : _a.title, isOpen: isLegendsSidebarOpen, toggleSidebar: function () {
282
+ return setIsLegendsSidebarOpen(!isLegendsSidebarOpen);
283
+ }, noLegendsText: (_b = props.legends) === null || _b === void 0 ? void 0 : _b.emptyText, legends: (_d = (_c = props.legends) === null || _c === void 0 ? void 0 : _c.legendsList) !== null && _d !== void 0 ? _d : legendsList, actionsTexts: (_e = props.legends) === null || _e === void 0 ? void 0 : _e.actionsTexts }),
248
284
  props.children,
249
- react_1.default.createElement(box_1.Box, { className: "sideToolsContainer" },
250
- react_1.default.createElement(settings_1.CesiumSettings, { sceneModes: sceneModes, baseMaps: baseMaps, locale: locale })),
251
- react_1.default.createElement(box_1.Box, { className: "toolsContainer" },
252
- showMousePosition === true ? (react_1.default.createElement(coordinates_tracker_tool_1.CoordinatesTrackerTool, { projection: projection })) : (react_1.default.createElement(react_1.default.Fragment, null)),
253
- showScale === true ? react_1.default.createElement(scale_tracker_tool_1.ScaleTrackerTool, { locale: locale }) : react_1.default.createElement(react_1.default.Fragment, null)),
285
+ bindCustomToolsToViewer(),
254
286
  props.imageryContextMenu &&
255
287
  showImageryMenu &&
256
288
  imageryMenuPosition &&
257
289
  react_1.default.cloneElement(props.imageryContextMenu, {
258
- data: (_a = mapViewRef === null || mapViewRef === void 0 ? void 0 : mapViewRef.layersManager) === null || _a === void 0 ? void 0 : _a.findLayerByPOI(imageryMenuPosition.x, imageryMenuPosition.y),
290
+ data: (_f = mapViewRef === null || mapViewRef === void 0 ? void 0 : mapViewRef.layersManager) === null || _f === void 0 ? void 0 : _f.findLayerByPOI(imageryMenuPosition.x, imageryMenuPosition.y),
259
291
  position: {
260
292
  x: imageryMenuPosition.x,
261
293
  y: imageryMenuPosition.y,
262
294
  },
263
- style: getImageryMenuStyle(imageryMenuPosition.x, imageryMenuPosition.y, (_c = (_b = props.imageryContextMenuSize) === null || _b === void 0 ? void 0 : _b.width) !== null && _c !== void 0 ? _c : DEFAULT_WIDTH, (_e = (_d = props.imageryContextMenuSize) === null || _d === void 0 ? void 0 : _d.height) !== null && _e !== void 0 ? _e : DEFAULT_HEIGHT, (_g = (_f = props.imageryContextMenuSize) === null || _f === void 0 ? void 0 : _f.dynamicHeightIncrement) !== null && _g !== void 0 ? _g : DEFAULT_DYNAMIC_HEIGHT_INCREMENT),
264
- size: (_h = props.imageryContextMenuSize) !== null && _h !== void 0 ? _h : {
295
+ style: getImageryMenuStyle(imageryMenuPosition.x, imageryMenuPosition.y, (_h = (_g = props.imageryContextMenuSize) === null || _g === void 0 ? void 0 : _g.width) !== null && _h !== void 0 ? _h : DEFAULT_WIDTH, (_k = (_j = props.imageryContextMenuSize) === null || _j === void 0 ? void 0 : _j.height) !== null && _k !== void 0 ? _k : DEFAULT_HEIGHT, (_m = (_l = props.imageryContextMenuSize) === null || _l === void 0 ? void 0 : _l.dynamicHeightIncrement) !== null && _m !== void 0 ? _m : DEFAULT_DYNAMIC_HEIGHT_INCREMENT),
296
+ size: (_o = props.imageryContextMenuSize) !== null && _o !== void 0 ? _o : {
265
297
  height: DEFAULT_HEIGHT,
266
298
  width: DEFAULT_WIDTH,
267
299
  },
@@ -1,4 +1,4 @@
1
- import { PolylineDashMaterialProperty, ConstantProperty, VerticalOrigin, LabelStyle, Cartesian2, Cartesian3, BoundingSphere, Ellipsoid, ConstantPositionProperty, GeographicTilingScheme, Cartographic } from 'cesium';
1
+ import { BoundingSphere, Cartesian2, Cartesian3, Cartographic, CesiumTerrainProvider, ConstantPositionProperty, ConstantProperty, Ellipsoid, EllipsoidTerrainProvider, GeographicTilingScheme, LabelStyle, PolylineDashMaterialProperty, Rectangle, Resource, VerticalOrigin } from 'cesium';
2
2
  export declare class CesiumPolylineDashMaterialProperty extends PolylineDashMaterialProperty {
3
3
  }
4
4
  export declare class CesiumConstantProperty extends ConstantProperty {
@@ -17,6 +17,14 @@ export declare class CesiumEllipsoid extends Ellipsoid {
17
17
  }
18
18
  export declare class CesiumGeographicTilingScheme extends GeographicTilingScheme {
19
19
  }
20
+ export declare class CesiumRectangle extends Rectangle {
21
+ }
22
+ export declare class CesiumResource extends Resource {
23
+ }
24
+ export declare class CesiumEllipsoidTerrainProvider extends EllipsoidTerrainProvider {
25
+ }
26
+ export declare class CesiumCesiumTerrainProvider extends CesiumTerrainProvider {
27
+ }
20
28
  export declare const CesiumVerticalOrigin: typeof VerticalOrigin;
21
29
  export declare const CesiumLabelStyle: typeof LabelStyle;
22
30
  export { sampleTerrainMostDetailed as cesiumSampleTerrainMostDetailed } from 'cesium';
@@ -15,7 +15,7 @@ var __extends = (this && this.__extends) || (function () {
15
15
  };
16
16
  })();
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.cesiumSampleTerrainMostDetailed = exports.CesiumLabelStyle = exports.CesiumVerticalOrigin = exports.CesiumGeographicTilingScheme = exports.CesiumEllipsoid = exports.CesiumBoundingSphere = exports.CesiumCartographic = exports.CesiumCartesian3 = exports.CesiumCartesian2 = exports.CesiumConstantPositionProperty = exports.CesiumConstantProperty = exports.CesiumPolylineDashMaterialProperty = void 0;
18
+ exports.cesiumSampleTerrainMostDetailed = exports.CesiumLabelStyle = exports.CesiumVerticalOrigin = exports.CesiumCesiumTerrainProvider = exports.CesiumEllipsoidTerrainProvider = exports.CesiumResource = exports.CesiumRectangle = exports.CesiumGeographicTilingScheme = exports.CesiumEllipsoid = exports.CesiumBoundingSphere = exports.CesiumCartographic = exports.CesiumCartesian3 = exports.CesiumCartesian2 = exports.CesiumConstantPositionProperty = exports.CesiumConstantProperty = exports.CesiumPolylineDashMaterialProperty = void 0;
19
19
  var cesium_1 = require("cesium");
20
20
  // PROXIED CLASSES
21
21
  var CesiumPolylineDashMaterialProperty = /** @class */ (function (_super) {
@@ -90,6 +90,38 @@ var CesiumGeographicTilingScheme = /** @class */ (function (_super) {
90
90
  return CesiumGeographicTilingScheme;
91
91
  }(cesium_1.GeographicTilingScheme));
92
92
  exports.CesiumGeographicTilingScheme = CesiumGeographicTilingScheme;
93
+ var CesiumRectangle = /** @class */ (function (_super) {
94
+ __extends(CesiumRectangle, _super);
95
+ function CesiumRectangle() {
96
+ return _super !== null && _super.apply(this, arguments) || this;
97
+ }
98
+ return CesiumRectangle;
99
+ }(cesium_1.Rectangle));
100
+ exports.CesiumRectangle = CesiumRectangle;
101
+ var CesiumResource = /** @class */ (function (_super) {
102
+ __extends(CesiumResource, _super);
103
+ function CesiumResource() {
104
+ return _super !== null && _super.apply(this, arguments) || this;
105
+ }
106
+ return CesiumResource;
107
+ }(cesium_1.Resource));
108
+ exports.CesiumResource = CesiumResource;
109
+ var CesiumEllipsoidTerrainProvider = /** @class */ (function (_super) {
110
+ __extends(CesiumEllipsoidTerrainProvider, _super);
111
+ function CesiumEllipsoidTerrainProvider() {
112
+ return _super !== null && _super.apply(this, arguments) || this;
113
+ }
114
+ return CesiumEllipsoidTerrainProvider;
115
+ }(cesium_1.EllipsoidTerrainProvider));
116
+ exports.CesiumEllipsoidTerrainProvider = CesiumEllipsoidTerrainProvider;
117
+ var CesiumCesiumTerrainProvider = /** @class */ (function (_super) {
118
+ __extends(CesiumCesiumTerrainProvider, _super);
119
+ function CesiumCesiumTerrainProvider() {
120
+ return _super !== null && _super.apply(this, arguments) || this;
121
+ }
122
+ return CesiumCesiumTerrainProvider;
123
+ }(cesium_1.CesiumTerrainProvider));
124
+ exports.CesiumCesiumTerrainProvider = CesiumCesiumTerrainProvider;
93
125
  // PROXIED ENUMS
94
126
  // eslint-disable-next-line @typescript-eslint/naming-convention
95
127
  exports.CesiumVerticalOrigin = cesium_1.VerticalOrigin;