@opengeoweb/core 19.1.1 → 19.2.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/dist/index.esm.js CHANGED
@@ -2,18 +2,19 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { FormControl, MenuItem, Grid, InputLabel, Paper, Box, Typography, CircularProgress, List, ListSubheader, ListItemButton, ListItemText, DialogContentText, TextField, InputAdornment, Button, useTheme, Tooltip, ListItem, ListItemIcon, Checkbox, Popper, Fade, styled, LinearProgress, Autocomplete, Switch, Select } from '@mui/material';
3
3
  import React, { useMemo, useState, useCallback, useEffect, useContext } from 'react';
4
4
  import { safelyInitI18nForTestsAndStories, sharedTranslations, SHARED_NAMESPACE, TooltipSelect, CustomIconButton, CustomDialog, CustomTooltip, ToggleMenu, AlertIcon, useConfirmationDialog, useScrollingInIsolation, sliderHeaderStyle, CustomSlider, tooltipContainerStyles, renderCounter, AlertBanner, CustomAccordion, PROJECTION, calculateStartSize, useWheelStopPropagation, ToolContainerDraggable, dateUtils, sessionStorageProvider, useDebounce, usePrevious } from '@opengeoweb/shared';
5
- import { webmapUtils, queryWMSLayersTree, invalidateWMSGetCapabilities, LayerType, WMDefaultStyleName, queryWMSServiceInfo, queryWMSLayers, getWMSServiceId, handleDateUtilsISOString, generateLayerId, WMJSDimension, getWMLayerById, getMapDimURL, WMLayer } from '@opengeoweb/webmap';
5
+ import { webmapUtils, queryWMSLayersTree, invalidateWMSGetCapabilities, LayerType, WMDefaultStyleName, WMJSMAP_LONLAT_EPSGCODE, queryWMSServiceInfo, queryWMSLayers, getWMSServiceId, handleDateUtilsISOString, generateLayerId, WMJSDimension, getWMLayerById, getMapDimURL, WMLayer } from '@opengeoweb/webmap';
6
6
  import _, { isEqual, isArray, range, zip, throttle } from 'lodash';
7
7
  import { useDispatch, useSelector, connect, useStore, Provider } from 'react-redux';
8
8
  import { mapSelectors, layerSelectors, layerActions, layerTypes, filterLayers, mapActions, mapEnums, loadingIndicatorSelectors, layerUtils, serviceSelectors, serviceActions, uiSelectors, uiTypes, useSetupDialog, getUserAddedServices, uiActions, genericActions, drawingToolSelectors, syncGroupsSelectors, syncConstants, getViewObjectForSyncGroup, getViewObjectForMapId, loadingIndicatorActions, genericSelectors, defaultLayers, getSingularDrawtoolDrawLayerId, syncGroupsSelector, syncGroupsActions, routerUtils, mapUtils } from '@opengeoweb/store';
9
9
  import i18n from 'i18next';
10
10
  import { useTranslation, Trans, I18nextProvider } from 'react-i18next';
11
11
  import { TIME_SLIDER_NAMESPACE, timesliderTranslations, defaultTimeSpan, AnimationLengthButton, AnimationLength, AutoUpdateButton, BackwardForwardStepButton, NowButton, handleSetNowEvent, PlayButton, defaultTimeStep, SpeedButton, TimeSpanButton, secondsPerPxFromCanvasWidth, getNewCenterOfFixedPointZoom, TimeStepButton, OptionsMenuButton, TimeSliderButtons, TimeSliderCurrentTimeBox, TimeSliderLegend, onsetNewDateDebounced, getFilteredTime, defaultSecondsPerPx, moveSelectedTimePx, TimeSlider } from '@opengeoweb/time-slider';
12
- import { webmapReactTranslations, WEBMAP_REACT_NAMESPACE, webmapTranslations, WEBMAP_NAMESPACE, openLayersGetMapImageStore, LayerInfoButton, useEDRGetCollectionDetails, useStacCollection, getRendersAsStyles, defaultEdrStyles, LayerInfoDialog, MapControlButton, MapDimensionSelect, dimensionConfig, DimensionSelectDialog, DimensionSelectButton, Clock, LegendDialog, LegendButton, MapContext, emptyGeoJSON, MapFeatureClass, setMapCenter, makeTimeList, useGetWMLayerInstance, getIsInsideAcceptanceTime, OpenLayersLayer, isGeoJSONGeometryEmpty, OpenLayersFeatureLayer, OpenLayersMapDraw, MapMeasure, useSetIntervalWhenVisible, TimeContext, OpenLayersMapView, WMSLayer, genericOpenLayersFeatureStyle, OpenLayersGetFeatureInfo, MapControls, OpenLayersZoomControl, getLayerUpdateInfo, publicLayers } from '@opengeoweb/webmap-react';
13
- import { Cached, Add, MapAdd, CollapseSmall, CollapseMedium, CollapseLarge, CollapseWindow, ExpandWindow, LayersAdd, CloudLoading, ColumnCollapsed, ColumnCollapse, DragHandle as DragHandle$1, None, FastForward, AutoUpdateActive, Both, Delete, Visibility, VisibilityOff, Copy, Overlayers, WorldMapProjection, Layers, Search, Exclamation, MyLocation, Airplane, Region, Pinned, Close, ExitDomain, LocationInfo, Measure, Options, Info, ThemeWrapper, lightTheme, FlagBritain, FlagNetherlands, FlagFinland, FlagNorway } from '@opengeoweb/theme';
12
+ import { webmapReactTranslations, WEBMAP_REACT_NAMESPACE, webmapTranslations, WEBMAP_NAMESPACE, openLayersGetMapImageStore, LayerInfoButton, useGetWMLayerInstance, useEDRGetCollectionDetails, useStacCollection, getRendersAsStyles, defaultEdrStyles, LayerInfoDialog, MapControlButton, MapDimensionSelect, dimensionConfig, DimensionSelectDialog, DimensionSelectButton, Clock, LegendDialog, LegendButton, MapContext, emptyGeoJSON, MapFeatureClass, setMapCenter, makeTimeList, getIsInsideAcceptanceTime, OpenLayersLayer, isGeoJSONGeometryEmpty, OpenLayersFeatureLayer, OpenLayersMapDraw, MapMeasure, useSetIntervalWhenVisible, TimeContext, OpenLayersMapView, WMSLayer, genericOpenLayersFeatureStyle, OpenLayersGetFeatureInfo, MapControls, OpenLayersZoomControl, getLayerUpdateInfo, publicLayers } from '@opengeoweb/webmap-react';
13
+ import { Cached, Add, MapAdd, CollapseSmall, CollapseMedium, CollapseLarge, CollapseWindow, ExpandWindow, LayersAdd, CloudLoading, ColumnCollapsed, ColumnCollapse, DragHandle as DragHandle$1, None, FastForward, AutoUpdateActive, Both, Delete, Visibility, VisibilityOff, Copy, ZoomToLayer, Overlayers, WorldMapProjection, Layers, Search, Exclamation, MyLocation, Airplane, Region, Pinned, Close, ExitDomain, LocationInfo, Measure, Options, Info, ThemeWrapper, lightTheme, FlagBritain, FlagNetherlands, FlagFinland, FlagNorway } from '@opengeoweb/theme';
14
14
  import { ReactSortable } from 'react-sortablejs';
15
15
  import Sortable from 'sortablejs';
16
16
  import { Box as Box$1, Stack } from '@mui/system';
17
+ import { transformExtent, toLonLat } from 'ol/proj';
17
18
  import { LayerSelectButtonConnect, LayerSelectConnect, DataExplorerButtonConnect } from '@opengeoweb/layer-select';
18
19
  import { unByKey } from 'ol/Observable';
19
20
  import { useQuery, QueryClient, QueryClientProvider } from '@tanstack/react-query';
@@ -22,7 +23,6 @@ import { bbox } from '@turf/turf';
22
23
  import proj4 from 'proj4';
23
24
  import { getIntersection } from 'ol/extent';
24
25
  import GeoJSON from 'ol/format/GeoJSON';
25
- import { toLonLat } from 'ol/proj';
26
26
  import axios from 'axios';
27
27
  import { ImageWMS } from 'ol/source';
28
28
  import DOMPurify from 'dompurify';
@@ -73,6 +73,7 @@ var en = {
73
73
  "layermanager-layer-duplicate": "Duplicate layer",
74
74
  "layermanager-layer-duplicate-to-other-maps": "Copy layer to other maps",
75
75
  "layermanager-layer-remove-from-other-maps": "Remove layer from other maps",
76
+ "layermanager-layer-zoom-to-extent": "Zoom to layer",
76
77
  "layermanager-options": "Options",
77
78
  "layermanager-baselayers-tooltip": "Add base layers",
78
79
  "layermanager-header-button-small": "small",
@@ -169,6 +170,7 @@ var fi = {
169
170
  "layermanager-layer-duplicate": "Monista karttataso",
170
171
  "layermanager-layer-duplicate-to-other-maps": "Kopioi karttataso muihin karttoihin",
171
172
  "layermanager-layer-remove-from-other-maps": "Poista karttataso muista kartoista",
173
+ "layermanager-layer-zoom-to-extent": "Zoomaa karttatasoon",
172
174
  "layermanager-options": "Valinnat",
173
175
  "layermanager-baselayers-tooltip": "Lisää pohjakartta",
174
176
  "layermanager-header-button-small": "Pieni",
@@ -256,6 +258,7 @@ var no = {
256
258
  "layermanager-layer-duplicate": "Duplikat lag",
257
259
  "layermanager-layer-duplicate-to-other-maps": "Kopier lag til andre kart",
258
260
  "layermanager-layer-remove-from-other-maps": "Fjern lag fra andre kart",
261
+ "layermanager-layer-zoom-to-extent": "Zoom til lag",
259
262
  "layermanager-options": "Laginnstillinger",
260
263
  "layermanager-baselayers-tooltip": "Legg til basislag",
261
264
  "layermanager-header-button-small": "liten",
@@ -344,6 +347,7 @@ var nl = {
344
347
  "layermanager-layer-duplicate": "Dupliceren",
345
348
  "layermanager-layer-duplicate-to-other-maps": "Kopieer laag naar andere kaarten",
346
349
  "layermanager-layer-remove-from-other-maps": "Verwijder laag van andere kaarten",
350
+ "layermanager-layer-zoom-to-extent": "Zoom naar laag",
347
351
  "layermanager-options": "Opties",
348
352
  "layermanager-baselayers-tooltip": "Basislagen toevoegen",
349
353
  "layermanager-header-button-small": "klein",
@@ -838,7 +842,7 @@ var preset = {
838
842
  },
839
843
  {
840
844
  name: "KNMIgeoservicesObs",
841
- url: "https://geoservices.knmi.nl/adagucserver?dataset=OBS",
845
+ url: "https://geoservices.knmi.nl/adagucserver?dataset=10-minute-in-situ-meteorological-observations",
842
846
  id: "KNMIgeoservicesObs"
843
847
  },
844
848
  {
@@ -3206,13 +3210,13 @@ var LoadDuration = function LoadDuration(_ref) {
3206
3210
  title: tooltipText,
3207
3211
  children: jsxs(Typography, {
3208
3212
  component: "div",
3209
- variant: "subtitle2",
3210
3213
  sx: {
3211
3214
  whiteSpace: 'nowrap',
3212
3215
  fontSize: 12,
3213
3216
  width: '100%',
3214
3217
  textAlign: 'center'
3215
3218
  },
3219
+ variant: "subtitle2",
3216
3220
  children: [percentage < 100 && jsx(LoadingIndicatorProgressBar, {
3217
3221
  height: 4,
3218
3222
  progressPercentage: percentage,
@@ -3348,6 +3352,9 @@ var LayerManagerMenuButton = function LayerManagerMenuButton(_ref) {
3348
3352
  onLayerDuplicate = _ref.onLayerDuplicate,
3349
3353
  onLayerCopyToOtherMaps = _ref.onLayerCopyToOtherMaps,
3350
3354
  onLayerRemoveFromOtherMaps = _ref.onLayerRemoveFromOtherMaps,
3355
+ onLayerZoomToExtent = _ref.onLayerZoomToExtent,
3356
+ _ref$canZoomToLayerEx = _ref.canZoomToLayerExtent,
3357
+ canZoomToLayerExtent = _ref$canZoomToLayerEx === void 0 ? true : _ref$canZoomToLayerEx,
3351
3358
  tooltipTitle = _ref.tooltipTitle,
3352
3359
  icon = _ref.icon;
3353
3360
  var _useCoreTranslation = useCoreTranslation(),
@@ -3365,6 +3372,9 @@ var LayerManagerMenuButton = function LayerManagerMenuButton(_ref) {
3365
3372
  var onClickRemoveFromOtherMaps = function onClickRemoveFromOtherMaps() {
3366
3373
  onLayerRemoveFromOtherMaps == null || onLayerRemoveFromOtherMaps();
3367
3374
  };
3375
+ var onClickZoomToExtent = function onClickZoomToExtent() {
3376
+ onLayerZoomToExtent == null || onLayerZoomToExtent();
3377
+ };
3368
3378
  return jsx(ToggleMenu, {
3369
3379
  buttonIcon: icon,
3370
3380
  buttonSx: {
@@ -3387,6 +3397,11 @@ var LayerManagerMenuButton = function LayerManagerMenuButton(_ref) {
3387
3397
  text: t('layermanager-layer-remove-from-other-maps'),
3388
3398
  action: onClickRemoveFromOtherMaps,
3389
3399
  icon: jsx(Delete, {})
3400
+ }, {
3401
+ text: t('layermanager-layer-zoom-to-extent'),
3402
+ action: onClickZoomToExtent,
3403
+ icon: jsx(ZoomToLayer, {}),
3404
+ isDisabled: !canZoomToLayerExtent
3390
3405
  }],
3391
3406
  menuPosition: "bottom",
3392
3407
  tooltipTitle: nonEmptyTooltipTitle,
@@ -4283,16 +4298,35 @@ var Accordion = function Accordion(_ref0) {
4283
4298
  });
4284
4299
  };
4285
4300
 
4301
+ var wmLayerHasZoomExtent = function wmLayerHasZoomExtent(wmLayer, mapSrs) {
4302
+ if (!wmLayer) {
4303
+ return false;
4304
+ }
4305
+ var crs = wmLayer.getCRSByName(mapSrs);
4306
+ if (crs != null && crs.bbox) {
4307
+ return true;
4308
+ }
4309
+ return !!wmLayer.geographicBoundingBox;
4310
+ };
4286
4311
  var LayerManagerMenuButtonConnect = function LayerManagerMenuButtonConnect(_ref) {
4287
4312
  var layerId = _ref.layerId,
4288
4313
  mapId = _ref.mapId,
4289
4314
  tooltipTitle = _ref.tooltipTitle,
4290
4315
  icon = _ref.icon;
4291
4316
  var dispatch = useDispatch();
4317
+ var layer = useSelector(function (store) {
4318
+ return layerSelectors.getLayerById(store, layerId);
4319
+ });
4292
4320
  var layerType = useSelector(function (store) {
4293
4321
  return layerSelectors.getLayerType(store, layerId);
4294
4322
  });
4295
4323
  var isFeatureLayer = layerType === LayerType.featureLayer;
4324
+ var mapSrs = useSelector(function (store) {
4325
+ return mapSelectors.getSrs(store, mapId);
4326
+ });
4327
+ var _useGetWMLayerInstanc = useGetWMLayerInstance(layer),
4328
+ wmLayer = _useGetWMLayerInstanc.wmLayer;
4329
+ var canZoomToLayerExtent = !!(layerId && mapSrs && wmLayerHasZoomExtent(wmLayer, mapSrs));
4296
4330
  // get all map ids
4297
4331
  var allMapIds = useSelector(mapSelectors.getAllMapIds);
4298
4332
  var allOtherMapIdsExceptCurrentOne = allMapIds.filter(function (id) {
@@ -4336,6 +4370,50 @@ var LayerManagerMenuButtonConnect = function LayerManagerMenuButtonConnect(_ref)
4336
4370
  }));
4337
4371
  });
4338
4372
  }, [dispatch, allLayers, mapId, layerId]);
4373
+ var zoomToLayerExtent = React.useCallback(function () {
4374
+ if (!layerId || !mapSrs || !wmLayer) {
4375
+ return;
4376
+ }
4377
+ var crs = wmLayer.getCRSByName(mapSrs);
4378
+ if (crs != null && crs.bbox) {
4379
+ var _crs$bbox$getExtent = crs.bbox.getExtent(),
4380
+ left = _crs$bbox$getExtent[0],
4381
+ bottom = _crs$bbox$getExtent[1],
4382
+ right = _crs$bbox$getExtent[2],
4383
+ top = _crs$bbox$getExtent[3];
4384
+ dispatch(mapActions.setBbox({
4385
+ mapId: mapId,
4386
+ srs: mapSrs,
4387
+ bbox: {
4388
+ left: left,
4389
+ bottom: bottom,
4390
+ right: right,
4391
+ top: top
4392
+ },
4393
+ origin: layerTypes.LayerActionOrigin.layerManager
4394
+ }));
4395
+ return;
4396
+ }
4397
+ var geo = wmLayer.geographicBoundingBox;
4398
+ if (geo) {
4399
+ var _transformExtent = transformExtent([parseFloat(geo.west), parseFloat(geo.south), parseFloat(geo.east), parseFloat(geo.north)], WMJSMAP_LONLAT_EPSGCODE, mapSrs),
4400
+ _left = _transformExtent[0],
4401
+ _bottom = _transformExtent[1],
4402
+ _right = _transformExtent[2],
4403
+ _top = _transformExtent[3];
4404
+ dispatch(mapActions.setBbox({
4405
+ mapId: mapId,
4406
+ srs: mapSrs,
4407
+ bbox: {
4408
+ left: _left,
4409
+ bottom: _bottom,
4410
+ right: _right,
4411
+ top: _top
4412
+ },
4413
+ origin: layerTypes.LayerActionOrigin.layerManager
4414
+ }));
4415
+ }
4416
+ }, [dispatch, layerId, mapId, mapSrs, wmLayer]);
4339
4417
  var duplicateLayer = React.useCallback(function (_ref3) {
4340
4418
  var newLayerId = _ref3.newLayerId,
4341
4419
  mapId = _ref3.mapId;
@@ -4347,6 +4425,7 @@ var LayerManagerMenuButtonConnect = function LayerManagerMenuButtonConnect(_ref)
4347
4425
  }));
4348
4426
  }, [dispatch, layerId]);
4349
4427
  return jsx(LayerManagerMenuButton, {
4428
+ canZoomToLayerExtent: canZoomToLayerExtent,
4350
4429
  icon: icon,
4351
4430
  isFeatureLayer: isFeatureLayer,
4352
4431
  layerId: layerId,
@@ -4359,6 +4438,7 @@ var LayerManagerMenuButtonConnect = function LayerManagerMenuButtonConnect(_ref)
4359
4438
  });
4360
4439
  },
4361
4440
  onLayerRemoveFromOtherMaps: removeLayerFromAllMaps,
4441
+ onLayerZoomToExtent: zoomToLayerExtent,
4362
4442
  tooltipTitle: tooltipTitle
4363
4443
  });
4364
4444
  };
@@ -8859,11 +8939,16 @@ var MapOptionsButtonConnect = function MapOptionsButtonConnect(_ref) {
8859
8939
  var isFeatureInfoActive = useSelector(function (store) {
8860
8940
  return uiSelectors.getisDialogOpen(store, gfiType);
8861
8941
  });
8942
+ var previousIsMeasureToolActive = usePrevious(isMeasureToolActive);
8943
+ var previousIsFeatureInfoActive = usePrevious(isFeatureInfoActive);
8862
8944
  React.useEffect(function () {
8863
8945
  if (!isMapOptionsOpen && (isMeasureToolActive || isFeatureInfoActive)) {
8864
8946
  setIsMapOptionsOpen(true);
8865
8947
  }
8866
- }, [isFeatureInfoActive, isMapOptionsOpen, isMeasureToolActive]);
8948
+ if (isMapOptionsOpen && !isMeasureToolActive && !isFeatureInfoActive && (previousIsMeasureToolActive || previousIsFeatureInfoActive)) {
8949
+ setIsMapOptionsOpen(false);
8950
+ }
8951
+ }, [isFeatureInfoActive, isMapOptionsOpen, isMeasureToolActive, previousIsFeatureInfoActive, previousIsMeasureToolActive]);
8867
8952
  return getFeatureInfo && measureTool ? jsxs(Stack, {
8868
8953
  direction: "row",
8869
8954
  spacing: 1,
@@ -9,6 +9,8 @@ interface LayerManagerButtonProps {
9
9
  }) => void;
10
10
  onLayerCopyToOtherMaps?: () => void;
11
11
  onLayerRemoveFromOtherMaps?: () => void;
12
+ onLayerZoomToExtent?: () => void;
13
+ canZoomToLayerExtent?: boolean;
12
14
  tooltipTitle?: string;
13
15
  icon?: React.ReactNode;
14
16
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeoweb/core",
3
- "version": "19.1.1",
3
+ "version": "19.2.0",
4
4
  "description": "GeoWeb Core library for the opengeoweb project",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {