@mapcomponents/react-maplibre 0.1.9 → 0.1.13

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 (134) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +2 -2
  2. package/.github/ISSUE_TEMPLATE/feature_request.md +3 -3
  3. package/.github/workflows/node_version_test.yml +25 -0
  4. package/.github/workflows/storybook.yml +6 -3
  5. package/CONTRIBUTING.md +2 -2
  6. package/README.md +3 -7
  7. package/coverage/clover.xml +748 -625
  8. package/coverage/coverage-final.json +19 -14
  9. package/coverage/lcov-report/block-navigation.js +8 -0
  10. package/coverage/lcov-report/index.html +170 -104
  11. package/coverage/lcov-report/sorter.js +26 -0
  12. package/coverage/lcov-report/{components → src/components}/MapLibreMap/MapLibreMap.js.html +17 -11
  13. package/coverage/lcov-report/{components → src/components}/MapLibreMap/index.html +17 -11
  14. package/coverage/lcov-report/{components → src/components}/MlCreatePdfButton/MlCreatePdfButton.js.html +17 -11
  15. package/coverage/lcov-report/{components → src/components}/MlCreatePdfButton/index.html +17 -11
  16. package/coverage/lcov-report/{components → src/components}/MlFeatureEditor/MlFeatureEditor.js.html +17 -11
  17. package/coverage/lcov-report/{components → src/components}/MlFeatureEditor/index.html +17 -11
  18. package/coverage/lcov-report/{components → src/components}/MlFillExtrusionLayer/MlFillExtrusionLayer.js.html +17 -11
  19. package/coverage/lcov-report/{components → src/components}/MlFillExtrusionLayer/index.html +17 -11
  20. package/coverage/lcov-report/{components → src/components}/MlFollowGps/MlFollowGps.js.html +99 -48
  21. package/coverage/lcov-report/{components → src/components}/MlFollowGps/index.html +27 -21
  22. package/coverage/lcov-report/{components → src/components}/MlGPXViewer/MlGPXViewer.js.html +73 -61
  23. package/coverage/lcov-report/{components → src/components}/MlGPXViewer/gpxConverter.js.html +56 -71
  24. package/coverage/lcov-report/{components → src/components}/MlGPXViewer/index.html +32 -26
  25. package/coverage/lcov-report/{components → src/components}/MlGeoJsonLayer/MlGeoJsonLayer.js.html +91 -31
  26. package/coverage/lcov-report/{components → src/components}/MlGeoJsonLayer/index.html +35 -29
  27. package/coverage/lcov-report/{components → src/components}/MlImageMarkerLayer/MlImageMarkerLayer.js.html +26 -23
  28. package/coverage/lcov-report/{components → src/components}/MlImageMarkerLayer/index.html +26 -20
  29. package/coverage/lcov-report/{components → src/components}/MlLayer/MlLayer.js.html +37 -31
  30. package/coverage/lcov-report/{components → src/components}/MlLayer/index.html +33 -27
  31. package/coverage/lcov-report/{components → src/components}/MlLayerMagnify/MlLayerMagnify.js.html +48 -42
  32. package/coverage/lcov-report/{components → src/components}/MlLayerMagnify/index.html +31 -25
  33. package/coverage/lcov-report/{components → src/components}/MlLayerSwipe/MlLayerSwipe.js.html +45 -42
  34. package/coverage/lcov-report/{components → src/components}/MlLayerSwipe/index.html +31 -25
  35. package/coverage/lcov-report/src/components/MlLayerSwitcher/MlLayerSwitcher.js.html +755 -0
  36. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/LayerBox.js.html +380 -0
  37. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/index.html +117 -0
  38. package/coverage/lcov-report/src/components/MlLayerSwitcher/index.html +117 -0
  39. package/coverage/lcov-report/{components → src/components}/MlMarker/MlMarker.js.html +18 -12
  40. package/coverage/lcov-report/{components → src/components}/MlMarker/index.html +17 -11
  41. package/coverage/lcov-report/{components → src/components}/MlNavigationCompass/MlNavigationCompass.js.html +17 -11
  42. package/coverage/lcov-report/{components → src/components}/MlNavigationCompass/index.html +17 -11
  43. package/coverage/lcov-report/{components → src/components}/MlNavigationTools/MlNavigationTools.js.html +55 -37
  44. package/coverage/lcov-report/{components → src/components}/MlNavigationTools/index.html +23 -17
  45. package/coverage/lcov-report/{components → src/components}/MlOsmLayer/MlOsmLayer.js.html +17 -11
  46. package/coverage/lcov-report/{components → src/components}/MlOsmLayer/index.html +17 -11
  47. package/coverage/lcov-report/{components → src/components}/MlScaleReference/MlScaleReference.js.html +17 -11
  48. package/coverage/lcov-report/{components → src/components}/MlScaleReference/index.html +17 -11
  49. package/coverage/lcov-report/{components → src/components}/MlShareMapState/MlShareMapState.js.html +17 -11
  50. package/coverage/lcov-report/{components → src/components}/MlShareMapState/index.html +17 -11
  51. package/coverage/lcov-report/{components → src/components}/MlSpatialElevationProfile/MlSpatialElevationProfile.js.html +17 -11
  52. package/coverage/lcov-report/{components → src/components}/MlSpatialElevationProfile/index.html +17 -11
  53. package/coverage/lcov-report/{components → src/components}/MlThreeJsLayer/MlThreeJsLayer.js.html +37 -55
  54. package/coverage/lcov-report/{components → src/components}/MlThreeJsLayer/index.html +31 -25
  55. package/coverage/lcov-report/{components → src/components}/MlUseMapDebugger/MlUseMapDebugger.js.html +17 -11
  56. package/coverage/lcov-report/{components → src/components}/MlUseMapDebugger/index.html +17 -11
  57. package/coverage/lcov-report/{components → src/components}/MlVectorTileLayer/MlVectorTileLayer.js.html +17 -11
  58. package/coverage/lcov-report/{components → src/components}/MlVectorTileLayer/index.html +17 -11
  59. package/coverage/lcov-report/{components → src/components}/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.js.html +17 -11
  60. package/coverage/lcov-report/{components → src/components}/MlWmsFeatureInfoPopup/index.html +17 -11
  61. package/coverage/lcov-report/{components → src/components}/MlWmsLayer/MlWmsLayer.js.html +20 -14
  62. package/coverage/lcov-report/{components → src/components}/MlWmsLayer/index.html +21 -15
  63. package/coverage/lcov-report/{components → src/components}/MlWmsLoader/MlWmsLoader.js.html +38 -20
  64. package/coverage/lcov-report/{components → src/components}/MlWmsLoader/index.html +23 -17
  65. package/coverage/lcov-report/{hooks → src/hooks}/index.html +17 -11
  66. package/coverage/lcov-report/{hooks → src/hooks}/useMap.js.html +17 -11
  67. package/coverage/lcov-report/{hooks → src/hooks}/useMapState.js.html +17 -11
  68. package/coverage/lcov-report/{hooks → src/hooks}/useWms.js.html +25 -19
  69. package/coverage/lcov-report/src/i18n.js.html +167 -0
  70. package/coverage/lcov-report/src/index.html +117 -0
  71. package/coverage/lcov-report/src/translations/english.js.html +95 -0
  72. package/coverage/lcov-report/src/translations/german.js.html +95 -0
  73. package/coverage/lcov-report/src/translations/index.html +132 -0
  74. package/coverage/lcov.info +1278 -1010
  75. package/dist/b556faa3bc6829d2.png +0 -0
  76. package/dist/index.esm.js +170 -109
  77. package/dist/index.esm.js.map +1 -1
  78. package/package.json +3 -1
  79. package/public/assets/dop.png +0 -0
  80. package/public/assets/historic.png +0 -0
  81. package/public/assets/osm.png +0 -0
  82. package/public/thumbnails/MlFollowGps.png +0 -0
  83. package/public/thumbnails/MlThreeJsLayer.png +0 -0
  84. package/rollup.config.js +10 -2
  85. package/src/components/MapLibreMap/lib/MapLibreGlWrapper.js +58 -73
  86. package/src/components/MlCreatePdfButton/MlCreatePdfButton.meta.json +1 -1
  87. package/src/components/MlFeatureEditor/MlFeatureEditor.meta.json +2 -2
  88. package/src/components/MlFollowGps/MlFollowGps.js +46 -31
  89. package/src/components/MlFollowGps/MlFollowGps.meta.json +2 -2
  90. package/src/components/MlFollowGps/assets/marker.png +0 -0
  91. package/src/components/MlGPXViewer/MlGPXViewer.js +45 -43
  92. package/src/components/MlGPXViewer/gpxConverter.js +22 -29
  93. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.js +27 -9
  94. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.meta.json +1 -1
  95. package/src/components/MlGeoJsonLayer/util/transitionFunctions.js +19 -12
  96. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.js +3 -4
  97. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.test.js +6 -7
  98. package/src/components/MlLayer/MlLayer.js +2 -2
  99. package/src/components/MlLayer/MlLayer.test.js +12 -10
  100. package/src/components/MlLayerMagnify/MlLayerMagnify.js +3 -3
  101. package/src/components/MlLayerSwipe/MlLayerSwipe.js +4 -5
  102. package/src/components/MlLayerSwitcher/MlLayerSwitcher.css +17 -0
  103. package/src/components/MlLayerSwitcher/MlLayerSwitcher.doc.de.md +3 -0
  104. package/src/components/MlLayerSwitcher/MlLayerSwitcher.js +223 -0
  105. package/src/components/MlLayerSwitcher/MlLayerSwitcher.meta_.json +15 -0
  106. package/src/components/MlLayerSwitcher/MlLayerSwitcher.stories.js +106 -0
  107. package/src/components/MlLayerSwitcher/assets/sample_1.json +26 -0
  108. package/src/components/MlLayerSwitcher/assets/sample_2.json +22 -0
  109. package/src/components/MlLayerSwitcher/components/LayerBox.js +98 -0
  110. package/src/components/MlMarker/MlMarker.js +1 -1
  111. package/src/components/MlNavigationTools/MlNavigationTools.js +26 -22
  112. package/src/components/MlScaleReference/MlScaleReference.meta.json +1 -1
  113. package/src/components/MlScaleReference/MlScaleReference.stories.js +25 -21
  114. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.stories.js +12 -6
  115. package/src/components/MlThreeJsLayer/MlThreeJsLayer.js +8 -15
  116. package/src/components/MlVectorTileLayer/MlVectorTileLayer.meta.json +3 -3
  117. package/src/components/MlWmsLayer/MlWmsLayer.js +1 -1
  118. package/src/components/MlWmsLoader/MlWmsLoader.js +8 -4
  119. package/src/components/MlWmsLoader/MlWmsLoader.meta.json +1 -1
  120. package/src/components/MlWmsLoader/MlWmsLoader.stories.js +5 -4
  121. package/src/decorators/EmptyMapContextDecorator.js +11 -6
  122. package/src/decorators/MapContext3DDecorator.js +25 -20
  123. package/src/decorators/MapContextDashboardDecorator.js +7 -7
  124. package/src/decorators/MapContextDecorator.js +7 -8
  125. package/src/decorators/MapContextKlokantechBasicDecorator.js +8 -9
  126. package/src/decorators/MultiMapContextDecorator.js +2 -6
  127. package/src/hooks/useMapState.stories.js +7 -2
  128. package/src/hooks/useWms.js +7 -6
  129. package/src/i18n.js +28 -0
  130. package/src/translations/english.js +4 -0
  131. package/src/translations/german.js +4 -0
  132. package/src/ui_components/ImageLoader.js +73 -0
  133. package/src/ui_components/Sidebar.js +76 -22
  134. package/src/ui_components/TopToolbar.js +18 -18
@@ -4,16 +4,21 @@ import { MapComponentsProvider } from "@mapcomponents/react-core";
4
4
  import { LoadingOverlayProvider } from "../ui_components/LoadingOverlayContext";
5
5
  import LoadingOverlay from "../ui_components/LoadingOverlay";
6
6
  import "./style.css";
7
+ import { createTheme, ThemeProvider } from "@mui/material/styles";
8
+
9
+ const theme = createTheme({});
7
10
 
8
11
  const decorators = [
9
12
  (Story) => (
10
- <MapComponentsProvider>
11
- <LoadingOverlayProvider>
12
- <LoadingOverlay></LoadingOverlay>
13
+ <ThemeProvider theme={theme}>
14
+ <MapComponentsProvider>
15
+ <LoadingOverlayProvider>
16
+ <LoadingOverlay></LoadingOverlay>
13
17
 
14
- <Story />
15
- </LoadingOverlayProvider>
16
- </MapComponentsProvider>
18
+ <Story />
19
+ </LoadingOverlayProvider>
20
+ </MapComponentsProvider>
21
+ </ThemeProvider>
17
22
  ),
18
23
  ];
19
24
 
@@ -3,30 +3,35 @@ import React from "react";
3
3
  import { MapComponentsProvider } from "@mapcomponents/react-core";
4
4
  import MapLibreMap from "../components/MapLibreMap/MapLibreMap";
5
5
  import "./style.css";
6
+ import { createTheme, ThemeProvider } from "@mui/material/styles";
7
+
8
+ const theme = createTheme({});
6
9
 
7
10
  const decorators = [
8
11
  (Story) => (
9
12
  <div className="fullscreen_map">
10
- <MapComponentsProvider>
11
- <Story />
12
- <MapLibreMap
13
- options={{
14
- //style: "mapbox://styles/mapbox/light-v10",
15
- //center: [-87.62712, 41.89033],
16
- zoom: 14.5,
17
- //pitch: 45,
18
- //style: "https://wms.wheregroup.com/tileserver/style/osm-bright.json",
19
- style: "https://wms.wheregroup.com/tileserver/style/osm-liberty.json",
20
- //center: [8.607, 53.1409349],
21
- // zoom: 13,
22
- center: [7.0851268, 50.73884],
23
- // maxBounds: [
24
- // [1.40625, 43.452919],
25
- // [17.797852, 55.973798],
26
- // ],
27
- }}
28
- />
29
- </MapComponentsProvider>
13
+ <ThemeProvider theme={theme}>
14
+ <MapComponentsProvider>
15
+ <Story />
16
+ <MapLibreMap
17
+ options={{
18
+ //style: "mapbox://styles/mapbox/light-v10",
19
+ //center: [-87.62712, 41.89033],
20
+ zoom: 14.5,
21
+ //pitch: 45,
22
+ //style: "https://wms.wheregroup.com/tileserver/style/osm-bright.json",
23
+ style: "https://wms.wheregroup.com/tileserver/style/osm-liberty.json",
24
+ //center: [8.607, 53.1409349],
25
+ // zoom: 13,
26
+ center: [7.0851268, 50.73884],
27
+ // maxBounds: [
28
+ // [1.40625, 43.452919],
29
+ // [17.797852, 55.973798],
30
+ // ],
31
+ }}
32
+ />
33
+ </MapComponentsProvider>
34
+ </ThemeProvider>
30
35
  </div>
31
36
  ),
32
37
  ];
@@ -1,18 +1,18 @@
1
1
  import React from "react";
2
2
 
3
3
  import { MapComponentsProvider } from "@mapcomponents/react-core";
4
- import { LoadingOverlayProvider } from "../ui_components/LoadingOverlayContext";
5
- import LoadingOverlay from "../ui_components/LoadingOverlay";
6
4
  import "./style.css";
5
+ import { createTheme, ThemeProvider } from "@mui/material/styles";
6
+
7
+ const theme = createTheme({});
7
8
 
8
9
  const decorators = [
9
10
  (Story) => (
10
- <MapComponentsProvider>
11
- <LoadingOverlayProvider>
12
- <LoadingOverlay></LoadingOverlay>
11
+ <ThemeProvider theme={theme}>
12
+ <MapComponentsProvider>
13
13
  <Story />
14
- </LoadingOverlayProvider>
15
- </MapComponentsProvider>
14
+ </MapComponentsProvider>
15
+ </ThemeProvider>
16
16
  ),
17
17
  ];
18
18
 
@@ -2,17 +2,16 @@ import React from "react";
2
2
 
3
3
  import { MapComponentsProvider } from "@mapcomponents/react-core";
4
4
  import MapLibreMap from "../components/MapLibreMap/MapLibreMap";
5
- import { LoadingOverlayProvider } from "../ui_components/LoadingOverlayContext";
6
- import LoadingOverlay from "../ui_components/LoadingOverlay";
7
5
  import "./style.css";
6
+ import { createTheme, ThemeProvider } from "@mui/material/styles";
7
+
8
+ const theme = createTheme({});
8
9
 
9
10
  const decorators = [
10
11
  (Story) => (
11
12
  <div className="fullscreen_map">
12
- <MapComponentsProvider>
13
- <LoadingOverlayProvider>
14
- <LoadingOverlay></LoadingOverlay>
15
-
13
+ <ThemeProvider theme={theme}>
14
+ <MapComponentsProvider>
16
15
  <Story />
17
16
  <MapLibreMap
18
17
  options={{
@@ -22,8 +21,8 @@ const decorators = [
22
21
  }}
23
22
  mapId="map_1"
24
23
  />
25
- </LoadingOverlayProvider>
26
- </MapComponentsProvider>
24
+ </MapComponentsProvider>
25
+ </ThemeProvider>
27
26
  </div>
28
27
  ),
29
28
  ];
@@ -2,16 +2,16 @@ import React from "react";
2
2
 
3
3
  import { MapComponentsProvider } from "@mapcomponents/react-core";
4
4
  import MapLibreMap from "../components/MapLibreMap/MapLibreMap";
5
- import { LoadingOverlayProvider } from "../ui_components/LoadingOverlayContext";
6
- import LoadingOverlay from "../ui_components/LoadingOverlay";
7
5
  import "./style.css";
6
+ import { createTheme, ThemeProvider } from "@mui/material/styles";
7
+
8
+ const theme = createTheme({});
8
9
 
9
10
  const decorators = [
10
11
  (Story) => (
11
12
  <div className="fullscreen_map">
12
- <MapComponentsProvider>
13
- <LoadingOverlayProvider>
14
- <LoadingOverlay></LoadingOverlay>
13
+ <ThemeProvider theme={theme}>
14
+ <MapComponentsProvider>
15
15
  <Story />
16
16
  <MapLibreMap
17
17
  options={{
@@ -19,8 +19,7 @@ const decorators = [
19
19
  //center: [-87.62712, 41.89033],
20
20
  zoom: 14.5,
21
21
  //pitch: 45,
22
- style:
23
- "https://wms.wheregroup.com/tileserver/style/klokantech-basic.json",
22
+ style: "https://wms.wheregroup.com/tileserver/style/klokantech-basic.json",
24
23
  //style:"https://wms.wheregroup.com/tileserver/style/osm-liberty.json",
25
24
  //center: [8.607, 53.1409349],
26
25
  // zoom: 13,
@@ -31,8 +30,8 @@ const decorators = [
31
30
  // ],
32
31
  }}
33
32
  />
34
- </LoadingOverlayProvider>
35
- </MapComponentsProvider>
33
+ </MapComponentsProvider>
34
+ </ThemeProvider>
36
35
  </div>
37
36
  ),
38
37
  ];
@@ -1,24 +1,21 @@
1
1
  import React from "react";
2
2
 
3
3
  import { MapComponentsProvider } from "@mapcomponents/react-core";
4
- import { LoadingOverlayProvider } from "../ui_components/LoadingOverlayContext";
5
- import LoadingOverlay from "../ui_components/LoadingOverlay";
6
4
 
7
5
  import MapLibreMap from "../components/MapLibreMap/MapLibreMap";
8
6
 
9
- import { createTheme, ThemeProvider } from "@mui/material/styles";
10
7
 
11
8
  import "./style.css";
9
+ import { createTheme, ThemeProvider } from "@mui/material/styles";
12
10
 
13
11
  const theme = createTheme({});
14
12
 
13
+
15
14
  const decorators = [
16
15
  (Story) => (
17
16
  <div className="fullscreen_map">
18
17
  <ThemeProvider theme={theme}>
19
18
  <MapComponentsProvider>
20
- <LoadingOverlayProvider>
21
- <LoadingOverlay></LoadingOverlay>
22
19
  <div
23
20
  style={{
24
21
  overflow: "hidden",
@@ -69,7 +66,6 @@ const decorators = [
69
66
  />
70
67
  </div>
71
68
  </div>
72
- </LoadingOverlayProvider>
73
69
  </MapComponentsProvider>
74
70
  </ThemeProvider>
75
71
  </div>
@@ -1,4 +1,4 @@
1
- import React from "react";
1
+ import React, { useEffect } from "react";
2
2
 
3
3
  import useMapState from "./useMapState";
4
4
 
@@ -15,6 +15,11 @@ export default storyoptions;
15
15
  const Template = (props) => {
16
16
  const mapState = useMapState({ ...props });
17
17
 
18
+ useEffect(() => {
19
+
20
+
21
+ }, [mapState.layers])
22
+
18
23
  return (
19
24
  <>
20
25
  <div
@@ -110,6 +115,6 @@ NonBaseLayersOnly.args = {
110
115
  sources: false,
111
116
  },
112
117
  filter: {
113
- includeBaseLayers: true,
118
+ includeBaseLayers: false,
114
119
  },
115
120
  };
@@ -25,12 +25,13 @@ function useWms(props) {
25
25
  // extract URL parameters from the given URL
26
26
  clearState();
27
27
  setError(undefined);
28
- if (!props.url) return;
28
+
29
+ if (!url) return;
29
30
 
30
31
  let _propsUrlParams;
31
- let _wmsUrl = props.url;
32
- if (props.url.indexOf("?") !== -1) {
33
- _propsUrlParams = props.url.split("?");
32
+ let _wmsUrl = url;
33
+ if (url.indexOf("?") !== -1) {
34
+ _propsUrlParams = url.split("?");
34
35
  _wmsUrl = _propsUrlParams[0];
35
36
  }
36
37
  let _urlParamsFromUrl = new URLSearchParams(_propsUrlParams?.[1]);
@@ -62,7 +63,7 @@ function useWms(props) {
62
63
  console.log(error);
63
64
  setError(error.message);
64
65
  });
65
- }, [props.url, props.urlParameters]);
66
+ }, [url, props.urlParameters]);
66
67
 
67
68
  useEffect(() => {
68
69
  if (!capabilities?.Service) return;
@@ -92,4 +93,4 @@ useWms.defaultProps = {
92
93
  },
93
94
  };
94
95
 
95
- export default useWms;
96
+ export default useWms;
package/src/i18n.js ADDED
@@ -0,0 +1,28 @@
1
+ import i18n from "i18next";
2
+ import { initReactI18next } from "react-i18next";
3
+ import english from "./translations/english.js"
4
+ import german from "./translations/german.js"
5
+
6
+
7
+ // the translations
8
+ // (tip move them in a JSON file and import them,
9
+ // or even better, manage them separated from your code: https://react.i18next.com/guides/multiple-translation-files)
10
+ const resources = { ...english, ...german };
11
+
12
+
13
+ i18n
14
+ .use(initReactI18next) // passes i18n down to react-i18next
15
+ .init({
16
+ resources,
17
+ lng: "de", // language to use, more information here: https://www.i18next.com/overview/configuration-options#languages-namespaces-resources
18
+ // you can use the i18n.changeLanguage function to change the language manually: https://www.i18next.com/overview/api#changelanguage
19
+ // if you're using a language detector, do not define the lng option
20
+
21
+ interpolation: {
22
+ escapeValue: false // react already safes from xss
23
+ }
24
+ });
25
+
26
+
27
+
28
+ export default i18n;
@@ -0,0 +1,4 @@
1
+ const english = {
2
+ "en": { "Layer": "Layer" }
3
+ }
4
+ export default english;
@@ -0,0 +1,4 @@
1
+ const german = {
2
+ "de": { "Layer": "Ebene" }
3
+ }
4
+ export default german;
@@ -0,0 +1,73 @@
1
+
2
+ import { useEffect, useState } from "react"
3
+ import CircularProgress from '@mui/material/CircularProgress';
4
+
5
+ import ErrorIcon from '@mui/icons-material/Error';
6
+ import { Box } from "@mui/system";
7
+ const ImageLoader = (props) => {
8
+ const [state, setState] = useState("loading");
9
+
10
+ useEffect(() => {
11
+ if (!props.src) {
12
+ setState("error");
13
+ return;
14
+ }
15
+ fetch(props.src)
16
+ .then(({ ok }) => {
17
+ if (ok) {
18
+ setState("ready");
19
+ } else {
20
+ setState("error");
21
+ }
22
+ })
23
+ .catch((e) => {
24
+ console.error(e);
25
+ setState("error");
26
+ });
27
+ }, [props.src]);
28
+
29
+ const boxStyle = {
30
+ width: "100%",
31
+ height: "100%",
32
+ border: 2,
33
+ borderRadius: "8px",
34
+ textAlign: "center",
35
+ display: "flex",
36
+ };
37
+
38
+ const LoadingImage = () => {
39
+ return (
40
+ <Box className={props.className} sx={{ ...boxStyle, ...props.style }}>
41
+ <CircularProgress />
42
+ </Box>
43
+ );
44
+ };
45
+
46
+ const ReadyImage = () => {
47
+ return (
48
+ <img className={props.className} style={{ ...boxStyle, ...props.style }} src={props.src} />
49
+ );
50
+ };
51
+ const ErrorImage = () => {
52
+ return (
53
+ <Box className={props.className} sx={{ boxStyle, ...props.style }}>
54
+ <ErrorIcon sx={{ display: "block", margin: "auto" }} />
55
+ </Box>
56
+ );
57
+ };
58
+
59
+ const renderImage = (state) => {
60
+ switch (state) {
61
+ case "ready":
62
+ return <ReadyImage />;
63
+ case "error":
64
+ return <ErrorImage />;
65
+ }
66
+
67
+ return <LoadingImage />;
68
+ };
69
+
70
+ return <>{renderImage(state)}</>;
71
+ };
72
+
73
+ export default ImageLoader
@@ -1,46 +1,100 @@
1
- import React from "react";
1
+ import React, {useState} from "react";
2
+ import { useTheme, styled } from "@mui/material/styles";
2
3
  import makeStyles from "@mui/styles/makeStyles";
3
4
  import Drawer from "@mui/material/Drawer";
5
+ import ChevronLeftIcon from "@mui/icons-material/ChevronLeft";
6
+ import MenuIcon from '@mui/icons-material/Menu';
7
+ import { IconButton } from "@mui/material";
8
+ import useMediaQuery from "@mui/material/useMediaQuery";
4
9
 
5
10
  const useStyles = makeStyles((theme) => ({
6
11
  drawer: {
7
12
  flexGrow: 1,
8
- zIndex: 101,
13
+ zIndex: 105,
9
14
  position: "absolute",
10
15
  top: 0,
11
16
  left: 0,
12
17
  bottom: 0,
13
18
  backgroundColor: "#fafafa",
14
- },
15
- drawerPaper: {
16
- position: "static",
17
19
  display: "flex",
20
+ flexDirection: "column",
18
21
  alignItems: "stretch",
19
22
  alignContent: "stretch",
20
- flexDirection: "column",
21
- padding: "90px 10px 10px 23px",
23
+ },
24
+ drawerPaper: {
25
+ position: "initial !important",
22
26
  boxSizing: "border-box",
23
- minWidth: "150px",
27
+ padding: "40px",
28
+ visibility: "visible !important",
29
+ zIndex: "initial !important",
24
30
  },
31
+ drawerHeader: {
32
+ alignContent: "flex-start",
33
+ display: "flex",
34
+ },
35
+ drawerContent: {},
36
+ }));
37
+
38
+ const DrawerHeader = styled("div")(({ theme }) => ({
39
+ display: "flex",
40
+ alignItems: "center",
25
41
  }));
26
42
 
27
43
  export default function Sidebar(props) {
28
44
  const classes = useStyles();
45
+ const mediaIsMobile = useMediaQuery("(max-width:900px)");
46
+
47
+ const [drawerOpen, setDrawerOpen] = useState(true);
48
+
49
+ const handleDrawerOpen = () => {
50
+ setDrawerOpen(true);
51
+ };
52
+ const handleDrawerClose = () => {
53
+ setDrawerOpen(false);
54
+ };
29
55
 
30
56
  return (
31
- <Drawer
32
- className={classes.drawer}
33
- variant="persistent"
34
- anchor="left"
35
- open={true}
36
- classes={{
37
- paper: classes.drawerPaper,
38
- }}
39
- sx={{
40
- ...props.sx,
41
- }}
42
- >
43
- {props.children}
44
- </Drawer>
57
+ <>
58
+ <IconButton
59
+ onClick={handleDrawerOpen}
60
+ style={{
61
+ zIndex: 101,
62
+ position: "relative",
63
+ padding: "20px",
64
+ }}
65
+ >
66
+ <MenuIcon />
67
+ </IconButton>
68
+ <Drawer
69
+ transitionDuration={0}
70
+ className={classes.drawer}
71
+ variant="persistent"
72
+ anchor="left"
73
+ open={drawerOpen}
74
+ classes={{
75
+ paper: classes.drawerPaper,
76
+ }}
77
+ sx={{
78
+ ...props.sx,
79
+ ...{
80
+ maxWidth: mediaIsMobile ? "90vw" : "20vw",
81
+ },
82
+ ...(drawerOpen ? {} : { left: mediaIsMobile ? "-90vw" : "-20vw" }),
83
+ }}
84
+ >
85
+ <DrawerHeader className={classes.drawerHeader}>
86
+ <IconButton onClick={handleDrawerClose}>
87
+ <ChevronLeftIcon
88
+ style={
89
+ {
90
+ //paddingBottom: "40px",
91
+ }
92
+ }
93
+ />
94
+ </IconButton>
95
+ </DrawerHeader>
96
+ <div style={{ maxWidth: "100%" }}>{props.children}</div>
97
+ </Drawer>
98
+ </>
45
99
  );
46
100
  }
@@ -3,27 +3,27 @@ import makeStyles from "@mui/styles/makeStyles";
3
3
  import AppBar from "@mui/material/AppBar";
4
4
  import Toolbar from "@mui/material/Toolbar";
5
5
 
6
- const useStyles = makeStyles((theme) => ({
7
- root: {
8
- flexGrow: 1,
9
- zIndex: 120,
10
- position: "absolute",
11
- top: 0,
12
- left: 0,
13
- right: 0,
14
- },
15
- AppBar: {
16
- backgroundColor: "#fafafa",
17
- minHeight: "62px",
18
- },
19
- }));
20
6
 
21
7
  export default function TopToolbar(props) {
22
- const classes = useStyles();
23
-
24
8
  return (
25
- <div className={classes.root}>
26
- <AppBar className={classes.AppBar} position="static">
9
+ <div
10
+ style={{
11
+ flexGrow: 1,
12
+ zIndex: 120,
13
+ position: "absolute",
14
+ top: 0,
15
+ left: 0,
16
+ right: 0,
17
+ }}
18
+ >
19
+ <AppBar
20
+ sx={{
21
+ minHeight: "62px",
22
+ backgroundColor: "#f1f1f1",
23
+ }}
24
+ color="primary"
25
+ position="static"
26
+ >
27
27
  <Toolbar>{props.children}</Toolbar>
28
28
  </AppBar>
29
29
  </div>