@opengeoweb/core 9.16.0 → 9.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.esm.js CHANGED
@@ -1,36 +1,133 @@
1
1
  import * as React from 'react';
2
2
  import React__default, { useState, useCallback, useRef } from 'react';
3
3
  import { Grid, Box, MenuItem, Typography, useTheme, Popper, Fade, Tooltip, styled, LinearProgress, FormControl, InputLabel, Paper, List, ListItemButton, ListItemText, CircularProgress, ListSubheader, Dialog, DialogTitle, DialogContent, DialogContentText, TextField, InputAdornment, DialogActions, Button, ListItemIcon, Checkbox } from '@mui/material';
4
- import { CustomIconButton, TooltipSelect, AlertIcon, sliderHeaderStyle, CustomSlider, ToggleMenu, CustomTooltip, tooltipContainerStyles, renderCounter, AlertBanner, CustomAccordion, calculateStartSize, ToolContainerDraggable, useDebounce, dateUtils, withEggs } from '@opengeoweb/shared';
4
+ import { CustomIconButton, SHARED_NAMESPACE, sharedTranslations, TooltipSelect, AlertIcon, sliderHeaderStyle, CustomSlider, ToggleMenu, CustomTooltip, tooltipContainerStyles, renderCounter, AlertBanner, CustomAccordion, calculateStartSize, ToolContainerDraggable, useDebounce, dateUtils, withEggs, ErrorBoundary } from '@opengeoweb/shared';
5
5
  import { CollapseSmall, CollapseMedium, CollapseLarge, CollapseWindow, ExpandWindow, LayersAdd, CloudLoading, Copy, None, FastForward, AutoUpdateActive, Both, Visibility, VisibilityOff, Delete, DragHandle as DragHandle$1, Cached, Add, MapAdd, WorldMapProjection, Layers, List as List$1, ExitDomain, Info, Search, MyLocation, Close, ThemeWrapper, lightTheme } from '@opengeoweb/theme';
6
6
  import { useDispatch, useSelector, connect, useStore, Provider } from 'react-redux';
7
7
  import { ReactSortable } from 'react-sortablejs';
8
8
  import Sortable from 'sortablejs';
9
9
  import { layerTypes, layerUtils, layerActions, layerSelectors, serviceSelectors, serviceActions, mapSelectors, mapActions, mapEnums, uiSelectors, uiTypes, useSetupDialog, filterLayers, getUserAddedServices, uiActions, genericActions, drawtoolSelectors, syncConstants, loadingIndicatorActions, IS_LEGEND_OPEN_BY_DEFAULT, defaultLayers, mapStoreActions, getSingularDrawtoolDrawLayerId, syncGroupsSelectors, syncGroupsSelector, coreModuleConfig, routerUtils, routerModuleConfig } from '@opengeoweb/store';
10
- import { LayerInfoButton, LayerInfoDialog, MapControlButton, MapDimensionSelect, dimensionConfig, DimensionSelectDialog, DimensionSelectButton, ZoomControls, MapView, MapViewLayer, LegendDialog, registerDrawFunction, emptyGeoJSON, MapControls, publicLayers, WEBMAP_REACT_NAMESPACE, webmapReactTranslations } from '@opengeoweb/webmap-react';
10
+ import { WEBMAP_REACT_NAMESPACE, webmapReactTranslations, LayerInfoButton, LayerInfoDialog, MapControlButton, MapDimensionSelect, dimensionConfig, DimensionSelectDialog, DimensionSelectButton, ZoomControls, MapView, MapViewLayer, LegendDialog, registerDrawFunction, emptyGeoJSON, MapControls, publicLayers } from '@opengeoweb/webmap-react';
11
+ import i18n from 'i18next';
12
+ import { useTranslation, initReactI18next, I18nextProvider } from 'react-i18next';
13
+ import { TIMESLIDER_NAMESPACE, timesliderTranslations, defaultTimeSpan, TIME_SLIDER_LEGEND_HEIGHT, SpeedButton, TimeStepButton, AnimationLengthButton, AnimationLength, TimeSpanButton, marks as marks$1, secondsPerPxFromCanvasWidth, getNewCenterOfFixedPointZoom, OptionsMenuButton, PlayButton, defaultTimeStep, BackwardForwardStepButton, AutoUpdateButton, NowButton, handleSetNowEvent, TimeSliderButtons, TimeSliderCurrentTimeBox, TimeSliderLegend, TimeSlider, onsetNewDateDebounced, getFilteredTime, ControlButtons, OptionsMenu, TimeSliderClock } from '@opengeoweb/timeslider';
11
14
  import { webmapUtils, getCapabilities, WMGetServiceFromStore, LayerType, handleDateUtilsISOString, wmServiceListener, EVENT_GETCAPABILITIES_START, EVENT_GETCAPABILITIES_READY, WMLayer } from '@opengeoweb/webmap';
12
- import { Box as Box$1 } from '@mui/system';
13
- import { defaultTimeSpan, TIME_SLIDER_LEGEND_HEIGHT, SpeedButton, TimeStepButton, AnimationLengthButton, AnimationLength, TimeSpanButton, marks as marks$1, secondsPerPxFromCanvasWidth, getNewCenterOfFixedPointZoom, OptionsMenuButton, PlayButton, defaultTimeStep, BackwardForwardStepButton, AutoUpdateButton, NowButton, handleSetNowEvent, TimeSliderButtons, TimeSliderCurrentTimeBox, TimeSliderLegend, TimeSlider, onsetNewDateDebounced, getFilteredTime, ControlButtons, OptionsMenu, TimeSliderClock } from '@opengeoweb/timeslider';
15
+ import { Box as Box$1, styled as styled$1 } from '@mui/system';
14
16
  import _, { isEqual, range } from 'lodash';
15
17
  import { LayerSelectButtonConnect, LayerSelectConnect, layerSelectConfig } from '@opengeoweb/layer-select';
16
18
  import axios from 'axios';
17
19
  import * as DOMPurify from 'dompurify';
18
- import i18n from 'i18next';
19
- import { initReactI18next, I18nextProvider } from 'react-i18next';
20
20
  import { SnackbarWrapperConnect } from '@opengeoweb/snackbar';
21
21
  import { useNavigate } from 'react-router-dom';
22
+ import * as Sentry from '@sentry/react';
22
23
 
23
24
  var en = {
24
- core: "Core"
25
+ feature_info_title: "Click on the map for info.",
26
+ feature_info_no_layers: "No layers added to the map.",
27
+ "add-layer-popup-title": "Load WMS layer(s)",
28
+ "add-layer-popup-service-url": "Service URL",
29
+ "add-layer-popup-available-services": "Available services",
30
+ "add-layer-popup-available-layers": "Available layers for {{serviceName}}",
31
+ "add-layer-popup-reload-layers": "Reload layers from service",
32
+ "layermanager-baselayers-title": "Base layer",
33
+ "layermanager-baselayers-no-available": "No service available",
34
+ "layermanager-acceptance-time": "Acc Time",
35
+ "layermanager-dimensions-total-values": "Dimension value ({{total_dimensions}} options)",
36
+ "layermanager-dimension-title": "Dimension",
37
+ "layermanager-opacity-title": "Opacity",
38
+ "layermanager-opacity-tooltip-prefix": "Opacity: ",
39
+ "layermanager-style-title": "Style",
40
+ "layermanager-layer-error": "This layer could not be loaded: does not exist on the server.",
41
+ "layermanager-layer": "Layer",
42
+ "projection-title": "Projection",
43
+ "wms-loader-title": "Load WMS layer(s)",
44
+ "wms-loader-description": "Please enter a wms server, or select one from the list.",
45
+ "wms-loader-no-data": "No data",
46
+ "wms-loader-error-http": "Use https or allow Mixed Content in your browser to use this WMS service",
47
+ "wms-loader-error-valid-service": "Please enter a valid WMS service",
48
+ "wms-loader-error-valid-url": "Please enter a valid URL",
49
+ "actions-close": "Close"
25
50
  };
26
51
  var fi = {
27
- core: "Core"
52
+ feature_info_title: "ei käännetty",
53
+ feature_info_no_layers: "ei käännetty",
54
+ "add-layer-popup-title": "ei käännetty",
55
+ "add-layer-popup-service-url": "ei käännetty",
56
+ "add-layer-popup-available-services": "ei käännetty",
57
+ "add-layer-popup-available-layers": "ei käännetty",
58
+ "add-layer-popup-reload-layers": "ei käännetty",
59
+ "layermanager-baselayers-title": "ei käännetty",
60
+ "layermanager-baselayers-no-available": "ei käännetty",
61
+ "layermanager-acceptance-time": "ei käännetty",
62
+ "layermanager-dimensions-total-values": "ei käännetty",
63
+ "layermanager-dimension-title": "ei käännetty",
64
+ "layermanager-opacity-title": "ei käännetty",
65
+ "layermanager-opacity-tooltip-prefix": "ei käännetty",
66
+ "layermanager-style-title": "ei käännetty",
67
+ "layermanager-layer-error": "ei käännetty",
68
+ "layermanager-layer": "ei käännetty",
69
+ "projection-title": "ei käännetty",
70
+ "wms-loader-title": "ei käännetty",
71
+ "wms-loader-description": "ei käännetty",
72
+ "wms-loader-no-data": "ei käännetty",
73
+ "wms-loader-error-http": "ei käännetty",
74
+ "wms-loader-error-valid-service": "ei käännetty",
75
+ "wms-loader-error-valid-url": "ei käännetty",
76
+ "actions-close": "ei käännetty"
28
77
  };
29
78
  var no = {
30
- core: "Core"
79
+ feature_info_title: "ikke oversatt",
80
+ feature_info_no_layers: "ikke oversatt",
81
+ "add-layer-popup-title": "ikke oversatt",
82
+ "add-layer-popup-service-url": "ikke oversatt",
83
+ "add-layer-popup-available-services": "ikke oversatt",
84
+ "add-layer-popup-available-layers": "ikke oversatt",
85
+ "add-layer-popup-reload-layers": "ikke oversatt",
86
+ "layermanager-baselayers-title": "ikke oversatt",
87
+ "layermanager-baselayers-no-available": "ikke oversatt",
88
+ "layermanager-acceptance-time": "ikke oversatt",
89
+ "layermanager-dimensions-total-values": "ikke oversatt",
90
+ "layermanager-dimension-title": "ikke oversatt",
91
+ "layermanager-opacity-title": "ikke oversatt",
92
+ "layermanager-opacity-tooltip-prefix": "ikke oversatt",
93
+ "layermanager-style-title": "ikke oversatt",
94
+ "layermanager-layer-error": "ikke oversatt",
95
+ "layermanager-layer": "ikke oversatt",
96
+ "projection-title": "ikke oversatt",
97
+ "wms-loader-title": "ikke oversatt",
98
+ "wms-loader-description": "ikke oversatt",
99
+ "wms-loader-no-data": "ikke oversatt",
100
+ "wms-loader-error-http": "ikke oversatt",
101
+ "wms-loader-error-valid-service": "ikke oversatt",
102
+ "wms-loader-error-valid-url": "ikke oversatt",
103
+ "actions-close": "ikke oversatt"
31
104
  };
32
105
  var nl = {
33
- core: "Core"
106
+ feature_info_title: "niet vertaald",
107
+ feature_info_no_layers: "niet vertaald",
108
+ "add-layer-popup-title": "niet vertaald",
109
+ "add-layer-popup-service-url": "niet vertaald",
110
+ "add-layer-popup-available-services": "niet vertaald",
111
+ "add-layer-popup-available-layers": "niet vertaald",
112
+ "add-layer-popup-reload-layers": "niet vertaald",
113
+ "layermanager-baselayers-title": "niet vertaald",
114
+ "layermanager-baselayers-no-available": "niet vertaald",
115
+ "layermanager-acceptance-time": "niet vertaald",
116
+ "layermanager-dimensions-total-values": "niet vertaald",
117
+ "layermanager-dimension-title": "niet vertaald",
118
+ "layermanager-opacity-title": "niet vertaald",
119
+ "layermanager-opacity-tooltip-prefix": "niet vertaald",
120
+ "layermanager-style-title": "niet vertaald",
121
+ "layermanager-layer-error": "niet vertaald",
122
+ "layermanager-layer": "niet vertaald",
123
+ "projection-title": "niet vertaald",
124
+ "wms-loader-title": "niet vertaald",
125
+ "wms-loader-description": "niet vertaald",
126
+ "wms-loader-no-data": "niet vertaald",
127
+ "wms-loader-error-http": "niet vertaald",
128
+ "wms-loader-error-valid-service": "niet vertaald",
129
+ "wms-loader-error-valid-url": "niet vertaald",
130
+ "actions-close": "niet vertaald"
34
131
  };
35
132
  var coreTranslations = {
36
133
  en: en,
@@ -2281,6 +2378,49 @@ $$7({ target: 'Array', proto: true, forced: String(test$1) === String(test$1.rev
2281
2378
  }
2282
2379
  });
2283
2380
 
2381
+ const CORE_NAMESPACE = 'core';
2382
+ const initCoreReactI18n = () => {
2383
+ i18n.use(initReactI18next).init({
2384
+ lng: 'en',
2385
+ fallbackLng: 'en',
2386
+ ns: CORE_NAMESPACE,
2387
+ interpolation: {
2388
+ escapeValue: false
2389
+ },
2390
+ resources: {
2391
+ en: {
2392
+ [CORE_NAMESPACE]: coreTranslations.en,
2393
+ [WEBMAP_REACT_NAMESPACE]: webmapReactTranslations.en,
2394
+ [SHARED_NAMESPACE]: sharedTranslations.en,
2395
+ [TIMESLIDER_NAMESPACE]: timesliderTranslations.en
2396
+ },
2397
+ fi: {
2398
+ [CORE_NAMESPACE]: coreTranslations.fi,
2399
+ [WEBMAP_REACT_NAMESPACE]: webmapReactTranslations.fi,
2400
+ [SHARED_NAMESPACE]: sharedTranslations.fi,
2401
+ [TIMESLIDER_NAMESPACE]: timesliderTranslations.fi
2402
+ },
2403
+ no: {
2404
+ [CORE_NAMESPACE]: coreTranslations.no,
2405
+ [WEBMAP_REACT_NAMESPACE]: webmapReactTranslations.no,
2406
+ [SHARED_NAMESPACE]: sharedTranslations.no,
2407
+ [TIMESLIDER_NAMESPACE]: timesliderTranslations.no
2408
+ },
2409
+ nl: {
2410
+ [CORE_NAMESPACE]: coreTranslations.nl,
2411
+ [WEBMAP_REACT_NAMESPACE]: webmapReactTranslations.nl,
2412
+ [SHARED_NAMESPACE]: sharedTranslations.nl,
2413
+ [TIMESLIDER_NAMESPACE]: timesliderTranslations.nl
2414
+ }
2415
+ }
2416
+ });
2417
+ };
2418
+ const ns = [CORE_NAMESPACE, TIMESLIDER_NAMESPACE];
2419
+ const translateKeyOutsideComponents = (key, params = undefined) => i18n.t(key, Object.assign({
2420
+ ns
2421
+ }, params));
2422
+ const useCoreTranslation = () => useTranslation(ns);
2423
+
2284
2424
  const DimensionSelectValue = ({
2285
2425
  isEnabled,
2286
2426
  tooltip,
@@ -2294,6 +2434,9 @@ const DimensionSelectValue = ({
2294
2434
  skipLocalStyling
2295
2435
  }) => {
2296
2436
  var _a;
2437
+ const {
2438
+ t
2439
+ } = useCoreTranslation();
2297
2440
  const dimensionValuesRaw = (_a = selectedDimension === null || selectedDimension === void 0 ? void 0 : selectedDimension.values) === null || _a === void 0 ? void 0 : _a.split(',').slice(0, 100).reverse();
2298
2441
  if (!(selectedDimension === null || selectedDimension === void 0 ? void 0 : selectedDimension.name) || !(dimensionValuesRaw === null || dimensionValuesRaw === void 0 ? void 0 : dimensionValuesRaw.length)) {
2299
2442
  return null;
@@ -2341,7 +2484,9 @@ const DimensionSelectValue = ({
2341
2484
  skipLocalStyling: skipLocalStyling
2342
2485
  }, /*#__PURE__*/React__default.createElement(MenuItem, {
2343
2486
  disabled: true
2344
- }, "Dimension value (", dimensionValues.length, " options)"), dimensionValues.map(dimensionValue => {
2487
+ }, t('layermanager-dimensions-total-values', {
2488
+ total_dimensions: dimensionValues.length
2489
+ })), dimensionValues.map(dimensionValue => {
2345
2490
  var _a;
2346
2491
  return /*#__PURE__*/React__default.createElement(MenuItem, {
2347
2492
  key: dimensionValue,
@@ -2380,6 +2525,9 @@ const DimensionSelectName = ({
2380
2525
  dimensionNames,
2381
2526
  skipLocalStyling
2382
2527
  }) => {
2528
+ const {
2529
+ t
2530
+ } = useCoreTranslation();
2383
2531
  return /*#__PURE__*/React__default.createElement(TooltipSelect, {
2384
2532
  disableUnderline: true,
2385
2533
  tooltip: tooltip,
@@ -2406,7 +2554,7 @@ const DimensionSelectName = ({
2406
2554
  skipLocalStyling: skipLocalStyling
2407
2555
  }, /*#__PURE__*/React__default.createElement(MenuItem, {
2408
2556
  disabled: true
2409
- }, "Dimension"), dimensionNames.map(name => ( /*#__PURE__*/React__default.createElement(MenuItem, {
2557
+ }, t('layermanager-dimension-title')), dimensionNames.map(name => ( /*#__PURE__*/React__default.createElement(MenuItem, {
2410
2558
  key: name,
2411
2559
  value: name
2412
2560
  }, (nameMappings === null || nameMappings === void 0 ? void 0 : nameMappings[name]) || name))));
@@ -2516,6 +2664,9 @@ const RenderLayers = ({
2516
2664
  skipLocalStyling
2517
2665
  }) => {
2518
2666
  var _a;
2667
+ const {
2668
+ t
2669
+ } = useCoreTranslation();
2519
2670
  if (!_layers || !_layers.length) {
2520
2671
  return /*#__PURE__*/React.createElement(Box, {
2521
2672
  sx: {
@@ -2531,7 +2682,7 @@ const RenderLayers = ({
2531
2682
  color: 'geowebColors.layerManager.tableRowDefaultText.rgba',
2532
2683
  fontWeight: 500
2533
2684
  }
2534
- }, "No service available"));
2685
+ }, t('layermanager-baselayers-no-available')));
2535
2686
  }
2536
2687
  const selectLayer = event => {
2537
2688
  event.stopPropagation();
@@ -2564,7 +2715,7 @@ const RenderLayers = ({
2564
2715
  renderValue: value => extendedLayers.find(layer => layer.name === value).title
2565
2716
  }, /*#__PURE__*/React.createElement(MenuItem, {
2566
2717
  disabled: true
2567
- }, "Layer"), extendedLayers.map((layerFromServiceLayers, currentIndex) => ( /*#__PURE__*/React.createElement(MenuItem, {
2718
+ }, t('layermanager-layer')), extendedLayers.map((layerFromServiceLayers, currentIndex) => ( /*#__PURE__*/React.createElement(MenuItem, {
2568
2719
  key: layerFromServiceLayers.name,
2569
2720
  value: layerFromServiceLayers.name,
2570
2721
  disabled: !layerFromServiceLayers.leaf,
@@ -2608,8 +2759,11 @@ const OpacitySelect = ({
2608
2759
  currentOpacity,
2609
2760
  onLayerChangeOpacity,
2610
2761
  isEnabled: _isEnabled = true,
2611
- tooltipPrefix: _tooltipPrefix = 'Opacity: '
2762
+ tooltipPrefix: _tooltipPrefix = translateKeyOutsideComponents('layermanager-opacity-tooltip-prefix')
2612
2763
  }) => {
2764
+ const {
2765
+ t
2766
+ } = useCoreTranslation();
2613
2767
  const [anchorEl, setAnchorEl] = React.useState(null);
2614
2768
  const isOpen = Boolean(anchorEl);
2615
2769
  const theme = useTheme();
@@ -2695,7 +2849,7 @@ const OpacitySelect = ({
2695
2849
  }, theme.palette.geowebColors.layerManager.opacitySelect.popper)
2696
2850
  }, /*#__PURE__*/React.createElement(Box, {
2697
2851
  sx: sliderHeaderStyle
2698
- }, "Opacity"), /*#__PURE__*/React.createElement(CustomSlider, {
2852
+ }, t('layermanager-opacity-title')), /*#__PURE__*/React.createElement(CustomSlider, {
2699
2853
  "data-testid": "opacitySlider",
2700
2854
  orientation: "vertical",
2701
2855
  value: currentOpacity,
@@ -2853,6 +3007,9 @@ const RenderStyles = ({
2853
3007
  skipLocalStyling
2854
3008
  }) => {
2855
3009
  var _a;
3010
+ const {
3011
+ t
3012
+ } = useCoreTranslation();
2856
3013
  const styles = [{
2857
3014
  title: 'default',
2858
3015
  name: 'default',
@@ -2891,7 +3048,7 @@ const RenderStyles = ({
2891
3048
  skipLocalStyling: skipLocalStyling
2892
3049
  }, /*#__PURE__*/React.createElement(MenuItem, {
2893
3050
  disabled: true
2894
- }, "Style"), styles.map(styleFromlayer => ( /*#__PURE__*/React.createElement(MenuItem, {
3051
+ }, t('layermanager-style-title')), styles.map(styleFromlayer => ( /*#__PURE__*/React.createElement(MenuItem, {
2895
3052
  key: styleFromlayer.name,
2896
3053
  value: styleFromlayer.name
2897
3054
  }, styleFromlayer.title))));
@@ -3113,13 +3270,17 @@ const AcceptanceTime = ({
3113
3270
  tooltipTitle,
3114
3271
  skipLocalStyling
3115
3272
  }) => {
3273
+ const {
3274
+ t
3275
+ } = useCoreTranslation();
3116
3276
  const onChange = acceptanceTimeRaw => {
3117
3277
  const acceptanceTime = acceptanceTimeRaw === 'off' ? undefined : Number(acceptanceTimeRaw);
3118
3278
  onChangeAcceptanceTime(acceptanceTime);
3119
3279
  };
3120
3280
  const layerAcceptanceTime = acceptanceTimeInMinutes === undefined ? 'off' : acceptanceTimeInMinutes.toString();
3281
+ const title = t('layermanager-acceptance-time');
3121
3282
  return /*#__PURE__*/React__default.createElement(TooltipSelect, {
3122
- tooltip: tooltipTitle !== null && tooltipTitle !== void 0 ? tooltipTitle : 'Acc Time',
3283
+ tooltip: tooltipTitle !== null && tooltipTitle !== void 0 ? tooltipTitle : title,
3123
3284
  isEnabled: _isEnabled,
3124
3285
  value: layerAcceptanceTime,
3125
3286
  onChange: event => {
@@ -3136,7 +3297,7 @@ const AcceptanceTime = ({
3136
3297
  skipLocalStyling: skipLocalStyling
3137
3298
  }, /*#__PURE__*/React__default.createElement(MenuItem, {
3138
3299
  disabled: true
3139
- }, "Acc Time"), acceptanceTimes.map(accTime => ( /*#__PURE__*/React__default.createElement(MenuItem, {
3300
+ }, title), acceptanceTimes.map(accTime => ( /*#__PURE__*/React__default.createElement(MenuItem, {
3140
3301
  key: accTime.text,
3141
3302
  value: accTime.value
3142
3303
  }, accTime.text))));
@@ -3405,6 +3566,9 @@ const LayerRowUnstyled = ({
3405
3566
  layerLoadDurationLayout,
3406
3567
  className
3407
3568
  }) => {
3569
+ const {
3570
+ t
3571
+ } = useCoreTranslation();
3408
3572
  const onClickRow = () => _onLayerRowClick(layerId);
3409
3573
  const changeEnable = event => {
3410
3574
  event.stopPropagation();
@@ -3514,7 +3678,7 @@ const LayerRowUnstyled = ({
3514
3678
  item: true,
3515
3679
  className: columnClasses.column7
3516
3680
  }, /*#__PURE__*/React__default.createElement(AlertBanner, {
3517
- title: "This layer could not be loaded: does not exist on the server.",
3681
+ title: t('layermanager-layer-error'),
3518
3682
  isCompact: true
3519
3683
  }))) : ( /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Grid, {
3520
3684
  item: true,
@@ -3599,6 +3763,9 @@ const Accordion = ({
3599
3763
  LeftButtons,
3600
3764
  LoadDuration
3601
3765
  }) => {
3766
+ const {
3767
+ t
3768
+ } = useCoreTranslation();
3602
3769
  return /*#__PURE__*/React__default.createElement(CustomAccordion, {
3603
3770
  className: "medium-layermanager",
3604
3771
  defaultExpanded: false,
@@ -3632,7 +3799,7 @@ const Accordion = ({
3632
3799
  item: true
3633
3800
  }, /*#__PURE__*/React__default.createElement(Grid, {
3634
3801
  item: true
3635
- }, "Style"), Styles), /*#__PURE__*/React__default.createElement(Grid, {
3802
+ }, t('layermanager-style-title')), Styles), /*#__PURE__*/React__default.createElement(Grid, {
3636
3803
  container: true,
3637
3804
  item: true,
3638
3805
  sx: {
@@ -3642,12 +3809,12 @@ const Accordion = ({
3642
3809
  }
3643
3810
  }, /*#__PURE__*/React__default.createElement(Grid, {
3644
3811
  item: true
3645
- }, "Opacity"), Opacity), /*#__PURE__*/React__default.createElement(Grid, {
3812
+ }, t('layermanager-opacity-title')), Opacity), /*#__PURE__*/React__default.createElement(Grid, {
3646
3813
  container: true,
3647
3814
  item: true
3648
3815
  }, /*#__PURE__*/React__default.createElement(Grid, {
3649
3816
  item: true
3650
- }, "Acc Time"), Acceptance), /*#__PURE__*/React__default.createElement(Grid, {
3817
+ }, t('layermanager-acceptance-time')), Acceptance), /*#__PURE__*/React__default.createElement(Grid, {
3651
3818
  container: true,
3652
3819
  item: true,
3653
3820
  flexDirection: "column"
@@ -4872,8 +5039,11 @@ const BaseLayers = ({
4872
5039
  tooltipPrefix: _tooltipPrefix = 'Layer: '
4873
5040
  }) => {
4874
5041
  var _a;
5042
+ const {
5043
+ t
5044
+ } = useCoreTranslation();
4875
5045
  if (!availableBaseLayers || !availableBaseLayers.length) {
4876
- return /*#__PURE__*/React.createElement("div", null, "No service available");
5046
+ return /*#__PURE__*/React.createElement("div", null, t('layermanager-baselayers-no-available'));
4877
5047
  }
4878
5048
  const selectedBaseLayerId = typeof selectedBaseLayers[0] !== 'undefined' ? selectedBaseLayers[0].id : '';
4879
5049
  const list = availableBaseLayers.map(layer => ({
@@ -4906,7 +5076,7 @@ const BaseLayers = ({
4906
5076
  IconComponent: icon
4907
5077
  }, /*#__PURE__*/React.createElement(MenuItem, {
4908
5078
  disabled: true
4909
- }, "Base layer"), availableBaseLayers.map(baseLayer => ( /*#__PURE__*/React.createElement(MenuItem, {
5079
+ }, t('layermanager-baselayers-title')), availableBaseLayers.map(baseLayer => ( /*#__PURE__*/React.createElement(MenuItem, {
4910
5080
  key: baseLayer.id,
4911
5081
  value: baseLayer.id
4912
5082
  }, baseLayer.name)))));
@@ -5440,6 +5610,9 @@ const WMSServerList = ({
5440
5610
  handleChangeService,
5441
5611
  service: activeService
5442
5612
  }) => {
5613
+ const {
5614
+ t
5615
+ } = useCoreTranslation();
5443
5616
  const handleListItemClick = (event, service) => {
5444
5617
  handleChangeService(service);
5445
5618
  };
@@ -5456,7 +5629,7 @@ const WMSServerList = ({
5456
5629
  }, /*#__PURE__*/React.createElement(InputLabel, {
5457
5630
  shrink: true,
5458
5631
  htmlFor: "select-multiple-native"
5459
- }, "Available services"))), /*#__PURE__*/React.createElement(Paper, {
5632
+ }, t('add-layer-popup-available-services')))), /*#__PURE__*/React.createElement(Paper, {
5460
5633
  style: {
5461
5634
  height: 200,
5462
5635
  overflow: 'auto'
@@ -5495,6 +5668,9 @@ const WMSLayerTreeHeader = ({
5495
5668
  serviceName,
5496
5669
  onClickReload
5497
5670
  }) => {
5671
+ const {
5672
+ t
5673
+ } = useCoreTranslation();
5498
5674
  return /*#__PURE__*/React.createElement(Grid, {
5499
5675
  container: true,
5500
5676
  direction: "row",
@@ -5505,10 +5681,12 @@ const WMSLayerTreeHeader = ({
5505
5681
  }, /*#__PURE__*/React.createElement(InputLabel, {
5506
5682
  shrink: true,
5507
5683
  htmlFor: "select-multiple-native"
5508
- }, "Available layers for ", serviceName)), onClickReload && ( /*#__PURE__*/React.createElement(Grid, {
5684
+ }, t('add-layer-popup-available-layers', {
5685
+ serviceName
5686
+ }))), onClickReload && ( /*#__PURE__*/React.createElement(Grid, {
5509
5687
  item: true
5510
5688
  }, /*#__PURE__*/React.createElement(CustomIconButton, {
5511
- tooltipTitle: "Reload layers from service",
5689
+ tooltipTitle: t('add-layer-popup-reload-layers'),
5512
5690
  "data-testid": "reloadLayers",
5513
5691
  onClick: onClickReload
5514
5692
  }, /*#__PURE__*/React.createElement(Cached, null)))));
@@ -5519,6 +5697,9 @@ const WMSLayerTree = ({
5519
5697
  onClickLayer,
5520
5698
  highlightedLayers
5521
5699
  }) => {
5700
+ const {
5701
+ t
5702
+ } = useCoreTranslation();
5522
5703
  const initialTree = {
5523
5704
  name: 'loading wms getcapabilities',
5524
5705
  leaf: true,
@@ -5568,7 +5749,7 @@ const WMSLayerTree = ({
5568
5749
  display: "flex"
5569
5750
  }, /*#__PURE__*/React.createElement(Typography, {
5570
5751
  variant: "body2"
5571
- }, "No data"))));
5752
+ }, t('wms-loader-no-data')))));
5572
5753
  }
5573
5754
  // Base case where there exists at least one layer
5574
5755
  // TODO: find a better way of doing this, without using prototype
@@ -5925,6 +6106,9 @@ const AddLayersPopup = ({
5925
6106
  handleClose,
5926
6107
  layerType: _layerType = LayerType.mapLayer
5927
6108
  }) => {
6109
+ const {
6110
+ t
6111
+ } = useCoreTranslation();
5928
6112
  const [serviceURL, setServiceURL] = React.useState('');
5929
6113
  const [services, setServices] = React.useState(_preloadedServices);
5930
6114
  const [activeService, setActiveService] = React.useState(_preloadedServices[0]);
@@ -5961,11 +6145,11 @@ const AddLayersPopup = ({
5961
6145
  setUrlError('');
5962
6146
  setLoading(false);
5963
6147
  }).catch(() => {
5964
- setUrlError('Please enter a valid WMS service');
6148
+ setUrlError(t('wms-loader-error-valid-service'));
5965
6149
  setLoading(false);
5966
6150
  });
5967
6151
  } else {
5968
- setUrlError('Please enter a valid URL');
6152
+ setUrlError(t('wms-loader-error-valid-url'));
5969
6153
  setLoading(false);
5970
6154
  }
5971
6155
  };
@@ -5984,7 +6168,7 @@ const AddLayersPopup = ({
5984
6168
  "data-testid": "addLayersPopup"
5985
6169
  }, /*#__PURE__*/React.createElement(DialogTitle, {
5986
6170
  id: "form-dialog-title"
5987
- }, "Load WMS layer(s)"), /*#__PURE__*/React.createElement(DialogContent, null, /*#__PURE__*/React.createElement(DialogContentText, null, "Please enter a wms server, or select one from the list."), /*#__PURE__*/React.createElement(Box, {
6171
+ }, t('add-layer-popup-title')), /*#__PURE__*/React.createElement(DialogContent, null, /*#__PURE__*/React.createElement(DialogContentText, null, t('wms-loader-description')), /*#__PURE__*/React.createElement(Box, {
5988
6172
  m: 2
5989
6173
  }, /*#__PURE__*/React.createElement(Grid, {
5990
6174
  container: true,
@@ -5996,7 +6180,7 @@ const AddLayersPopup = ({
5996
6180
  }, /*#__PURE__*/React.createElement(TextField, {
5997
6181
  margin: "dense",
5998
6182
  id: "serviceurl",
5999
- label: "Service URL",
6183
+ label: t('add-layer-popup-service-url'),
6000
6184
  value: serviceURL,
6001
6185
  type: "url",
6002
6186
  onChange: event => {
@@ -6054,7 +6238,7 @@ const AddLayersPopup = ({
6054
6238
  })))))), /*#__PURE__*/React.createElement(DialogActions, null, /*#__PURE__*/React.createElement(Button, {
6055
6239
  onClick: handleClose,
6056
6240
  color: "primary"
6057
- }, "Close")));
6241
+ }, t('actions-close'))));
6058
6242
  };
6059
6243
 
6060
6244
  const styles$2 = {
@@ -6298,12 +6482,16 @@ const ProjectionSelect = ({
6298
6482
  currentProjection,
6299
6483
  onChangeProjection
6300
6484
  }) => {
6485
+ const {
6486
+ t
6487
+ } = useCoreTranslation();
6301
6488
  const selectProjection = newProj => {
6302
6489
  const newProjDetails = availableProjections.find(proj => proj.value === newProj);
6303
6490
  onChangeProjection(newProjDetails);
6304
6491
  };
6305
6492
  const index = availableProjections.findIndex(projection => projection.value === currentProjection);
6306
6493
  const currentProjectionObject = availableProjections.find(projection => projection.value === currentProjection);
6494
+ const title = t('projection-title');
6307
6495
  return /*#__PURE__*/React.createElement(Grid, {
6308
6496
  container: true,
6309
6497
  className: "setProjection-column",
@@ -6335,7 +6523,7 @@ const ProjectionSelect = ({
6335
6523
  SelectDisplayProps: {
6336
6524
  'aria-label': 'projectionSelect'
6337
6525
  },
6338
- tooltip: `Projection: ${currentProjectionObject === null || currentProjectionObject === void 0 ? void 0 : currentProjectionObject.name}`,
6526
+ tooltip: `${title}: ${currentProjectionObject === null || currentProjectionObject === void 0 ? void 0 : currentProjectionObject.name}`,
6339
6527
  isEnabled: true,
6340
6528
  style: {
6341
6529
  maxWidth: '100%'
@@ -6351,7 +6539,7 @@ const ProjectionSelect = ({
6351
6539
  requiresCtrlToChange: true
6352
6540
  }, /*#__PURE__*/React.createElement(MenuItem, {
6353
6541
  disabled: true
6354
- }, "Projection"), availableProjections.map(projection => ( /*#__PURE__*/React.createElement(MenuItem, {
6542
+ }, title), availableProjections.map(projection => ( /*#__PURE__*/React.createElement(MenuItem, {
6355
6543
  key: projection.name,
6356
6544
  value: projection.value
6357
6545
  }, projection.name)))))));
@@ -8124,6 +8312,9 @@ const GetFeatureInfoDialog = ({
8124
8312
  source: _source = 'app',
8125
8313
  mapPinLocation
8126
8314
  }) => {
8315
+ const {
8316
+ t
8317
+ } = useCoreTranslation();
8127
8318
  /* Ref and state for maplocation */
8128
8319
  const mapLocationWasChanged = React__default.useRef(false);
8129
8320
  const [isInitialMapLocationChanged, setInitialMapLocationIsChanged] = React__default.useState(false);
@@ -8268,13 +8459,13 @@ const GetFeatureInfoDialog = ({
8268
8459
  sx: {
8269
8460
  padding: '10px'
8270
8461
  }
8271
- }, "Click on the map for info.")), !hasLayers && ( /*#__PURE__*/React__default.createElement(Typography, {
8462
+ }, t('feature_info_title'))), !hasLayers && ( /*#__PURE__*/React__default.createElement(Typography, {
8272
8463
  "data-testid": "NoLayers",
8273
8464
  variant: "subtitle1",
8274
8465
  sx: {
8275
8466
  padding: '10px'
8276
8467
  }
8277
- }, "No layers added to the map."))));
8468
+ }, t('feature_info_no_layers')))));
8278
8469
  };
8279
8470
 
8280
8471
  /* *
@@ -10712,51 +10903,6 @@ var testLayers = /*#__PURE__*/Object.freeze({
10712
10903
  simplePolygonGeoJSON: simplePolygonGeoJSON
10713
10904
  });
10714
10905
 
10715
- /* *
10716
- * Licensed under the Apache License, Version 2.0 (the "License");
10717
- * you may not use this file except in compliance with the License.
10718
- * You may obtain a copy of the License at
10719
- *
10720
- * http://www.apache.org/licenses/LICENSE-2.0
10721
- *
10722
- * Unless required by applicable law or agreed to in writing, software
10723
- * distributed under the License is distributed on an "AS IS" BASIS,
10724
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10725
- * See the License for the specific language governing permissions and
10726
- * limitations under the License.
10727
- *
10728
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
10729
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
10730
- * */
10731
- const CORE_NAMESPACE = 'core';
10732
- const initCoreReactI18n = () => {
10733
- i18n.use(initReactI18next).init({
10734
- lng: 'en',
10735
- ns: CORE_NAMESPACE,
10736
- interpolation: {
10737
- escapeValue: false
10738
- },
10739
- resources: {
10740
- en: {
10741
- [CORE_NAMESPACE]: coreTranslations.en,
10742
- [WEBMAP_REACT_NAMESPACE]: webmapReactTranslations.en
10743
- },
10744
- fi: {
10745
- [CORE_NAMESPACE]: coreTranslations.fi,
10746
- [WEBMAP_REACT_NAMESPACE]: webmapReactTranslations.fi
10747
- },
10748
- no: {
10749
- [CORE_NAMESPACE]: coreTranslations.no,
10750
- [WEBMAP_REACT_NAMESPACE]: webmapReactTranslations.no
10751
- },
10752
- nl: {
10753
- [CORE_NAMESPACE]: coreTranslations.nl,
10754
- [WEBMAP_REACT_NAMESPACE]: webmapReactTranslations.nl
10755
- }
10756
- }
10757
- });
10758
- };
10759
-
10760
10906
  /**
10761
10907
  * A Provider component which provides the GeoWeb theme
10762
10908
  * @param children
@@ -10844,4 +10990,46 @@ const RouterWrapperConnect = withEggs([routerModuleConfig])(props => {
10844
10990
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(NavigateSetter, null), props.children);
10845
10991
  });
10846
10992
 
10847
- export { ConfigurableMapConnect, CoreThemeProvider, CoreThemeStoreProvider, DemoWrapper, DemoWrapperConnect, HarmonieTempAndPrecipPreset, LayerInfoButtonConnect, LayerInfoDialogConnect, LayerManager, BaseLayerRow as LayerManagerBaseLayerRow, LayerManagerConnect, DescriptionRow as LayerManagerDescriptionRow, HeaderOptions as LayerManagerHeaderOptions, LayerContainerRow as LayerManagerLayerContainerRow, LayerManagerMapButtonConnect, LegendConnect, LegendMapButtonConnect, MapViewConnect, MultiDimensionSelectMapButtonsConnect, MultiMapMultiDimensionSelectConnect as MultiMapDimensionSelectConnect, MultiMapViewConnect, MyMapLocation, RouterWrapperConnect, SearchControlButtonConnect, SearchControlConnect, SearchDialog, SyncGroupViewerConnect, TimeSliderConnect, ZoomControlConnect, componentsLookUp, coreTranslations, defaultBbox, defaultConfigurations, filterMapPresets, filterServices, filterTimeSeriesServices, testLayers, useFetchServices, useUpdateTimeSpan, useUpdateTimestep };
10993
+ const Circle = styled$1('div')(({
10994
+ isRecording
10995
+ }) => ({
10996
+ width: '70%',
10997
+ height: '70%',
10998
+ borderRadius: '50%',
10999
+ backgroundColor: isRecording ? 'red' : 'gray',
11000
+ position: 'absolute',
11001
+ top: '50%',
11002
+ left: '50%',
11003
+ transform: 'translate(-50%, -50%)'
11004
+ }));
11005
+ const SentryRecordButton = () => {
11006
+ const [isRecording, setIsRecording] = React__default.useState(false);
11007
+ const replay = Sentry.getReplay();
11008
+ const toggleRecord = () => __awaiter(void 0, void 0, void 0, function* () {
11009
+ if (!isRecording) {
11010
+ replay === null || replay === void 0 ? void 0 : replay.start();
11011
+ setIsRecording(true);
11012
+ } else {
11013
+ setIsRecording(false);
11014
+ yield replay === null || replay === void 0 ? void 0 : replay.stop();
11015
+ }
11016
+ });
11017
+ return /*#__PURE__*/React__default.createElement(ErrorBoundary, {
11018
+ handlePromiseRejections: true,
11019
+ displayOnTop: true
11020
+ }, /*#__PURE__*/React__default.createElement(CustomTooltip, {
11021
+ title: isRecording ? 'Stop Recording' : 'Start Recording'
11022
+ }, /*#__PURE__*/React__default.createElement(CustomIconButton, {
11023
+ variant: "flat",
11024
+ onClick: toggleRecord,
11025
+ "data-testid": "sentryRecordButton",
11026
+ sx: {
11027
+ margin: '10px',
11028
+ border: 'solid 1px gray'
11029
+ }
11030
+ }, /*#__PURE__*/React__default.createElement(Circle, {
11031
+ isRecording: isRecording
11032
+ }))));
11033
+ };
11034
+
11035
+ export { CORE_NAMESPACE, ConfigurableMapConnect, CoreThemeProvider, CoreThemeStoreProvider, DemoWrapper, DemoWrapperConnect, HarmonieTempAndPrecipPreset, LayerInfoButtonConnect, LayerInfoDialogConnect, LayerManager, BaseLayerRow as LayerManagerBaseLayerRow, LayerManagerConnect, DescriptionRow as LayerManagerDescriptionRow, HeaderOptions as LayerManagerHeaderOptions, LayerContainerRow as LayerManagerLayerContainerRow, LayerManagerMapButtonConnect, LegendConnect, LegendMapButtonConnect, MapViewConnect, MultiDimensionSelectMapButtonsConnect, MultiMapMultiDimensionSelectConnect as MultiMapDimensionSelectConnect, MultiMapViewConnect, MyMapLocation, RouterWrapperConnect, SearchControlButtonConnect, SearchControlConnect, SearchDialog, SentryRecordButton, SyncGroupViewerConnect, ThemeWrapperWithModules, TimeSliderConnect, ZoomControlConnect, componentsLookUp, coreTranslations, defaultBbox, defaultConfigurations, filterMapPresets, filterServices, filterTimeSeriesServices, testLayers, translateKeyOutsideComponents, useFetchServices, useUpdateTimeSpan, useUpdateTimestep };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeoweb/core",
3
- "version": "9.16.0",
3
+ "version": "9.17.0",
4
4
  "description": "GeoWeb Core library for the opengeoweb project",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -28,7 +28,8 @@
28
28
  "react-draggable": "^4.4.6",
29
29
  "i18next": "^23.7.11",
30
30
  "react-i18next": "^13.5.0",
31
- "dompurify": "^3.0.6"
31
+ "dompurify": "^3.0.6",
32
+ "@sentry/react": "^7.109.0"
32
33
  },
33
34
  "peerDependencies": {
34
35
  "react": "18"
package/src/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  import coreTranslations from '../locales/core.json';
2
2
  export * from './lib';
3
+ export { translateKeyOutsideComponents, CORE_NAMESPACE, } from './lib/utils/i18n';
3
4
  export { coreTranslations };
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import '../../utils/languagesService';
2
+ import './languagesService';
3
3
  declare const _default: {
4
4
  title: string;
5
5
  };
@@ -24,6 +24,7 @@ export declare const outsideComponentTranslations: {
24
24
  deleteOK: string;
25
25
  restore: string;
26
26
  };
27
+ export declare const translateKeyOutsideComponents: (key: string, params?: Record<string, string | number> | undefined) => string;
27
28
  interface Languages {
28
29
  language: string;
29
30
  code: string;
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { Theme } from '@mui/material';
3
+ import { ThemeProviderProps } from '@opengeoweb/theme';
3
4
  import { Store } from '@reduxjs/toolkit';
4
5
  interface CoreThemeProviderProps {
5
6
  children?: React.ReactNode;
@@ -11,6 +12,7 @@ interface CoreThemeProviderProps {
11
12
  * @returns
12
13
  */
13
14
  export declare const CoreThemeProvider: React.FC<CoreThemeProviderProps>;
15
+ export declare const ThemeWrapperWithModules: React.FC<ThemeProviderProps>;
14
16
  interface CoreThemeStoreProviderProps extends CoreThemeProviderProps {
15
17
  store: Store;
16
18
  }
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const SentryRecordButton: React.FC;
3
+ export default SentryRecordButton;
@@ -0,0 +1 @@
1
+ export { default as SentryRecordButton } from './SentryRecordButton';
@@ -18,3 +18,4 @@ export * from './components/RouterWrapper';
18
18
  export * from './components/Search';
19
19
  export * from './components/TimeSliderConnect';
20
20
  export * from './components/LayerInfoConnect';
21
+ export * from './components/SentryRecordButton';
@@ -1,2 +1,6 @@
1
+ import i18n from 'i18next';
2
+ import { UseTranslationResponse } from 'react-i18next';
1
3
  export declare const CORE_NAMESPACE = "core";
2
4
  export declare const initCoreReactI18n: () => void;
5
+ export declare const translateKeyOutsideComponents: (key: string, params?: Record<string, string | number> | undefined) => string;
6
+ export declare const useCoreTranslation: () => UseTranslationResponse<typeof CORE_NAMESPACE, typeof i18n>;