@opengeoweb/core 19.2.0 → 19.3.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
@@ -4,8 +4,8 @@ import React, { useMemo, useState, useCallback, useEffect, useContext } from 're
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
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
- import { useDispatch, useSelector, connect, useStore, Provider } from 'react-redux';
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';
7
+ import { useDispatch, useSelector, connect, useStore, shallowEqual, Provider } from 'react-redux';
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, PUBLIC_WARNING_DRAW_TOOL_ID, 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';
@@ -14,7 +14,7 @@ import { Cached, Add, MapAdd, CollapseSmall, CollapseMedium, CollapseLarge, Coll
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
+ import { transformExtent, toLonLat, fromLonLat } from 'ol/proj';
18
18
  import { LayerSelectButtonConnect, LayerSelectConnect, DataExplorerButtonConnect } from '@opengeoweb/layer-select';
19
19
  import { unByKey } from 'ol/Observable';
20
20
  import { useQuery, QueryClient, QueryClientProvider } from '@tanstack/react-query';
@@ -2944,6 +2944,9 @@ var DeleteLayerConnect = function DeleteLayerConnect(_ref) {
2944
2944
  var layerType = useSelector(function (store) {
2945
2945
  return layerSelectors.getLayerType(store, layerId);
2946
2946
  });
2947
+ var isFeatureSyncLayer = useSelector(function (store) {
2948
+ return layerSelectors.getIsFeatureSyncLayer(store, layerId);
2949
+ });
2947
2950
  var isLayerEnabled = useSelector(function (store) {
2948
2951
  return layerSelectors.getLayerEnabled(store, layerId);
2949
2952
  });
@@ -2960,6 +2963,9 @@ var DeleteLayerConnect = function DeleteLayerConnect(_ref) {
2960
2963
  var onDelete = React.useCallback(function (_ref3) {
2961
2964
  var mapId = _ref3.mapId,
2962
2965
  layerId = _ref3.layerId;
2966
+ if (isFeatureSyncLayer) {
2967
+ return;
2968
+ }
2963
2969
  if (layerType === LayerType.edrFeatureLayer) {
2964
2970
  void confirmationDialog({
2965
2971
  title: t('delete-dialog-title'),
@@ -2978,16 +2984,17 @@ var DeleteLayerConnect = function DeleteLayerConnect(_ref) {
2978
2984
  layerId: layerId
2979
2985
  });
2980
2986
  }
2981
- }, [layerType, confirmationDialog, t, layerDelete]);
2987
+ }, [isFeatureSyncLayer, layerType, confirmationDialog, t, layerDelete]);
2982
2988
  return jsx(CustomIconButton, {
2983
2989
  "data-testid": "deleteButton",
2990
+ disabled: isFeatureSyncLayer,
2984
2991
  onClick: function onClick() {
2985
2992
  return onDelete({
2986
2993
  mapId: mapId,
2987
2994
  layerId: layerId
2988
2995
  });
2989
2996
  },
2990
- shouldShowAsDisabled: !isLayerEnabled,
2997
+ shouldShowAsDisabled: !isLayerEnabled || isFeatureSyncLayer,
2991
2998
  tooltipTitle: nonEmptyTooltipTitle,
2992
2999
  children: icon
2993
3000
  });
@@ -3277,10 +3284,15 @@ var useLoadDurationLabel = function useLoadDurationLabel(mapId, layerId) {
3277
3284
  var SelectableFeatures = function SelectableFeatures(_ref) {
3278
3285
  var layerId = _ref.layerId,
3279
3286
  isSelectable = _ref.isSelectable,
3280
- onToggleSelectable = _ref.onToggleSelectable;
3287
+ onToggleSelectable = _ref.onToggleSelectable,
3288
+ _ref$disabled = _ref.disabled,
3289
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled;
3281
3290
  var _useCoreTranslation = useCoreTranslation(),
3282
3291
  t = _useCoreTranslation.t;
3283
3292
  var onClickCheckbox = function onClickCheckbox() {
3293
+ if (disabled) {
3294
+ return;
3295
+ }
3284
3296
  onToggleSelectable();
3285
3297
  };
3286
3298
  return jsx(ListItem, {
@@ -3291,7 +3303,9 @@ var SelectableFeatures = function SelectableFeatures(_ref) {
3291
3303
  borderBottom: '1px solid #E0E0E0'
3292
3304
  },
3293
3305
  children: jsxs(ListItemButton, {
3306
+ "data-testid": "selectablefeatures-checkbox-" + layerId,
3294
3307
  disableGutters: true,
3308
+ disabled: disabled,
3295
3309
  onClick: function onClick() {
3296
3310
  return onClickCheckbox();
3297
3311
  },
@@ -3316,8 +3330,8 @@ var SelectableFeatures = function SelectableFeatures(_ref) {
3316
3330
  },
3317
3331
  children: jsx(Checkbox, {
3318
3332
  checked: isSelectable,
3319
- "data-testid": "selectablefeatures-checkbox-" + layerId,
3320
3333
  disableRipple: true,
3334
+ disabled: disabled,
3321
3335
  name: "selectablefeatures-checkbox-" + layerId,
3322
3336
  tabIndex: -1
3323
3337
  })
@@ -3327,7 +3341,8 @@ var SelectableFeatures = function SelectableFeatures(_ref) {
3327
3341
  };
3328
3342
 
3329
3343
  var SelectableFeaturesCheckboxConnect = function SelectableFeaturesCheckboxConnect(_ref) {
3330
- var layerId = _ref.layerId;
3344
+ var layerId = _ref.layerId,
3345
+ disabled = _ref.disabled;
3331
3346
  var dispatch = useDispatch();
3332
3347
  var isSelectable = useSelector(function (store) {
3333
3348
  return layerSelectors.getIsLayerSelectable(store, layerId);
@@ -3338,6 +3353,7 @@ var SelectableFeaturesCheckboxConnect = function SelectableFeaturesCheckboxConne
3338
3353
  }));
3339
3354
  }, [dispatch, layerId]);
3340
3355
  return jsx(SelectableFeatures, {
3356
+ disabled: disabled,
3341
3357
  isSelectable: isSelectable,
3342
3358
  layerId: layerId,
3343
3359
  onToggleSelectable: toggleSelectable
@@ -3349,6 +3365,8 @@ var LayerManagerMenuButton = function LayerManagerMenuButton(_ref) {
3349
3365
  layerId = _ref.layerId,
3350
3366
  _ref$isFeatureLayer = _ref.isFeatureLayer,
3351
3367
  isFeatureLayer = _ref$isFeatureLayer === void 0 ? false : _ref$isFeatureLayer,
3368
+ _ref$isFeatureSyncLay = _ref.isFeatureSyncLayer,
3369
+ isFeatureSyncLayer = _ref$isFeatureSyncLay === void 0 ? false : _ref$isFeatureSyncLay,
3352
3370
  onLayerDuplicate = _ref.onLayerDuplicate,
3353
3371
  onLayerCopyToOtherMaps = _ref.onLayerCopyToOtherMaps,
3354
3372
  onLayerRemoveFromOtherMaps = _ref.onLayerRemoveFromOtherMaps,
@@ -3388,15 +3406,18 @@ var LayerManagerMenuButton = function LayerManagerMenuButton(_ref) {
3388
3406
  menuItems: [{
3389
3407
  text: t('layermanager-layer-duplicate'),
3390
3408
  action: onClickDuplicate,
3391
- icon: jsx(Copy, {})
3409
+ icon: jsx(Copy, {}),
3410
+ isDisabled: isFeatureSyncLayer
3392
3411
  }, {
3393
3412
  text: t('layermanager-layer-duplicate-to-other-maps'),
3394
3413
  action: onClickCopyToOtherMaps,
3395
- icon: jsx(Copy, {})
3414
+ icon: jsx(Copy, {}),
3415
+ isDisabled: isFeatureSyncLayer
3396
3416
  }, {
3397
3417
  text: t('layermanager-layer-remove-from-other-maps'),
3398
3418
  action: onClickRemoveFromOtherMaps,
3399
- icon: jsx(Delete, {})
3419
+ icon: jsx(Delete, {}),
3420
+ isDisabled: isFeatureSyncLayer
3400
3421
  }, {
3401
3422
  text: t('layermanager-layer-zoom-to-extent'),
3402
3423
  action: onClickZoomToExtent,
@@ -3406,6 +3427,7 @@ var LayerManagerMenuButton = function LayerManagerMenuButton(_ref) {
3406
3427
  menuPosition: "bottom",
3407
3428
  tooltipTitle: nonEmptyTooltipTitle,
3408
3429
  children: !!isFeatureLayer && jsx(SelectableFeaturesCheckboxConnect, {
3430
+ disabled: isFeatureSyncLayer,
3409
3431
  layerId: layerId
3410
3432
  })
3411
3433
  });
@@ -4320,6 +4342,9 @@ var LayerManagerMenuButtonConnect = function LayerManagerMenuButtonConnect(_ref)
4320
4342
  var layerType = useSelector(function (store) {
4321
4343
  return layerSelectors.getLayerType(store, layerId);
4322
4344
  });
4345
+ var isFeatureSyncLayer = useSelector(function (store) {
4346
+ return layerSelectors.getIsFeatureSyncLayer(store, layerId);
4347
+ });
4323
4348
  var isFeatureLayer = layerType === LayerType.featureLayer;
4324
4349
  var mapSrs = useSelector(function (store) {
4325
4350
  return mapSelectors.getSrs(store, mapId);
@@ -4428,6 +4453,7 @@ var LayerManagerMenuButtonConnect = function LayerManagerMenuButtonConnect(_ref)
4428
4453
  canZoomToLayerExtent: canZoomToLayerExtent,
4429
4454
  icon: icon,
4430
4455
  isFeatureLayer: isFeatureLayer,
4456
+ isFeatureSyncLayer: isFeatureSyncLayer,
4431
4457
  layerId: layerId,
4432
4458
  mapId: mapId,
4433
4459
  onLayerCopyToOtherMaps: copyLayerToOtherMaps,
@@ -5977,24 +6003,30 @@ var useFetchServices = function useFetchServices(dialogType, preloadedServices,
5977
6003
  shouldDisableFetch = false;
5978
6004
  }
5979
6005
  var dispatch = useDispatch();
6006
+ var store = useStore();
5980
6007
  var isOpenInStore = useSelector(function (store) {
5981
6008
  return uiSelectors.getisDialogOpen(store, dialogType);
5982
6009
  });
5983
- var services = useSelector(function (store) {
5984
- return serviceSelectors.getServiceIds(store);
5985
- });
5986
6010
  var fetchInitialServices = useCallback(function (services) {
5987
6011
  dispatch(serviceActions.fetchInitialServices({
5988
6012
  services: services
5989
6013
  }));
5990
6014
  }, [dispatch]);
5991
6015
  useEffect(function () {
5992
- if (!shouldDisableFetch && isOpenInStore && preloadedServices && preloadedServices.length > 0 && !services.length) {
6016
+ if (!shouldDisableFetch && isOpenInStore && preloadedServices && preloadedServices.length > 0) {
5993
6017
  var allServicesToLoad = mergePresetsAndUserAddedServices(preloadedServices, getUserAddedServices());
5994
- void getServicesToLoad(allServicesToLoad).then(fetchInitialServices);
6018
+ void getServicesToLoad(allServicesToLoad).then(function (servicesToLoad) {
6019
+ var currentServiceIds = serviceSelectors.getServiceIds(store.getState());
6020
+ var missingServices = servicesToLoad.filter(function (service) {
6021
+ return !currentServiceIds.includes(service.id);
6022
+ });
6023
+ if (missingServices.length > 0) {
6024
+ fetchInitialServices(missingServices);
6025
+ }
6026
+ });
5995
6027
  }
5996
6028
  // eslint-disable-next-line react-hooks/exhaustive-deps
5997
- }, [isOpenInStore, services]);
6029
+ }, [isOpenInStore]);
5998
6030
  };
5999
6031
  var mergePresetsAndUserAddedServices = function mergePresetsAndUserAddedServices(presets, userAddedServices) {
6000
6032
  return Object.values(Object.assign({}, presets.reduce(function (byUrl, preset) {
@@ -7874,7 +7906,9 @@ var createLinkedFeatureCollection = function createLinkedFeatureCollection(linke
7874
7906
  var isSelected = selectedFeatureIds == null ? void 0 : selectedFeatureIds.has((_getGeoFeatureSelecti = getGeoFeatureSelectionKey(geoFeature)) != null ? _getGeoFeatureSelecti : '');
7875
7907
  var existingProperties = geoFeature.properties && typeof geoFeature.properties === 'object' ? geoFeature.properties : {};
7876
7908
  return Object.assign({}, geoFeature, {
7877
- properties: Object.assign({}, existingProperties, isSelected ? {
7909
+ properties: Object.assign({}, existingProperties, {
7910
+ sourceLayerId: featureLayer.id
7911
+ }, isSelected ? {
7878
7912
  highlightSelectedFeature: true
7879
7913
  } : undefined, featureLayer.originalId ? {
7880
7914
  originalId: featureLayer.originalId
@@ -8372,6 +8406,7 @@ var OpenLayersFeatureLayerConnect = function OpenLayersFeatureLayerConnect(_ref2
8372
8406
  } : undefined,
8373
8407
  featureCollection: !layer.isInEditMode ? displayGeojson : undefined,
8374
8408
  hoverSelect: hoverSelect,
8409
+ layerId: layerId,
8375
8410
  opacity: layer.opacity,
8376
8411
  style: style,
8377
8412
  visible: layer.enabled,
@@ -8599,6 +8634,32 @@ var sanitizeHTML = function sanitizeHTML(htmlToBeSanitized) {
8599
8634
  };
8600
8635
  };
8601
8636
 
8637
+ var getMapPinLocation = function getMapPinLocation(mapPinLocation, map) {
8638
+ if (!mapPinLocation) {
8639
+ return undefined;
8640
+ }
8641
+ if (mapPinLocation.projectionX !== undefined && mapPinLocation.projectionY !== undefined && mapPinLocation.resolution !== undefined && mapPinLocation.srs) {
8642
+ return mapPinLocation;
8643
+ }
8644
+ if (!map) {
8645
+ return mapPinLocation;
8646
+ }
8647
+ var view = map.getView();
8648
+ var projection = view == null ? void 0 : view.getProjection();
8649
+ var resolution = view == null ? void 0 : view.getResolution();
8650
+ if (!projection || resolution === undefined) {
8651
+ return mapPinLocation;
8652
+ }
8653
+ var _fromLonLat = fromLonLat([mapPinLocation.lon, mapPinLocation.lat], projection),
8654
+ projectionX = _fromLonLat[0],
8655
+ projectionY = _fromLonLat[1];
8656
+ return Object.assign({}, mapPinLocation, {
8657
+ projectionX: projectionX,
8658
+ projectionY: projectionY,
8659
+ resolution: resolution,
8660
+ srs: projection.getCode()
8661
+ });
8662
+ };
8602
8663
  var GetFeatureInfoDialog = function GetFeatureInfoDialog(_ref) {
8603
8664
  var layers = _ref.layers,
8604
8665
  isOpen = _ref.isOpen,
@@ -8615,8 +8676,10 @@ var GetFeatureInfoDialog = function GetFeatureInfoDialog(_ref) {
8615
8676
  mapPinLocation = _ref.mapPinLocation;
8616
8677
  var _useCoreTranslation = useCoreTranslation(),
8617
8678
  t = _useCoreTranslation.t;
8679
+ var _React$useContext = React.useContext(MapContext),
8680
+ map = _React$useContext.map;
8618
8681
  /* Ref, state and update function for results per layer map */
8619
- var gfiResultMap = React.useRef(new Map()).current;
8682
+ var gfiResultMap = React.useRef(new globalThis.Map()).current;
8620
8683
  // eslint-disable-next-line react/hook-use-state
8621
8684
  var _React$useState = React.useState(),
8622
8685
  triggerRerender = _React$useState[1];
@@ -8631,7 +8694,10 @@ var GetFeatureInfoDialog = function GetFeatureInfoDialog(_ref) {
8631
8694
  triggerRerender("" + layerId + isLoading);
8632
8695
  };
8633
8696
  /* Build a layerlist array with a set of arguments per layer to do the query for */
8634
- var layerToUpdateList = isOpen && mapPinLocation ? getLayersToUpdate(mapPinLocation, layers) : [];
8697
+ var mapPinLocationCoordinates = React.useMemo(function () {
8698
+ return getMapPinLocation(mapPinLocation, map);
8699
+ }, [map, mapPinLocation]);
8700
+ var layerToUpdateList = isOpen && mapPinLocationCoordinates ? getLayersToUpdate(mapPinLocationCoordinates, layers) : [];
8635
8701
  /*
8636
8702
  Build a string based on the GFI urls. If this changes for whatever reason we need to update.
8637
8703
  These strings can change very often, therefore they need to be debounced and only use the most recent result must be used.
@@ -8695,7 +8761,7 @@ var GetFeatureInfoDialog = function GetFeatureInfoDialog(_ref) {
8695
8761
  }();
8696
8762
  /* For each changed getfeature url string, load new data using WMS GetFeatureInfo */
8697
8763
  React.useEffect(function () {
8698
- if (mapPinLocation && isOpen) {
8764
+ if (mapPinLocationCoordinates && isOpen) {
8699
8765
  layerToUpdateList.forEach(function (_ref4) {
8700
8766
  var url = _ref4.url,
8701
8767
  layerId = _ref4.layerId;
@@ -8725,7 +8791,7 @@ var GetFeatureInfoDialog = function GetFeatureInfoDialog(_ref) {
8725
8791
  sx: {
8726
8792
  padding: 0
8727
8793
  },
8728
- children: [!!isOpen && !!hasLayers && !!mapPinLocation && jsx(Box, {
8794
+ children: [!!isOpen && !!hasLayers && !!mapPinLocationCoordinates && jsx(Box, {
8729
8795
  "data-testid": "GetFeatureInfoList",
8730
8796
  ref: stopWheelEventPropagationRef,
8731
8797
  children: layerToUpdateList.map(function (layer) {
@@ -8778,7 +8844,7 @@ var GetFeatureInfoDialog = function GetFeatureInfoDialog(_ref) {
8778
8844
  })]
8779
8845
  }, layerId);
8780
8846
  })
8781
- }), !!hasLayers && !mapPinLocation && jsx(Typography, {
8847
+ }), !!hasLayers && !mapPinLocationCoordinates && jsx(Typography, {
8782
8848
  "data-testid": "click-on-map-for-info",
8783
8849
  sx: {
8784
8850
  padding: '10px'
@@ -9050,12 +9116,24 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
9050
9116
  });
9051
9117
  return visibilityById;
9052
9118
  }, [layersState]);
9053
- var warningDialogFeatureLayers = useSelector(function (state) {
9119
+ var allWarningDialogFeatureLayers = useSelector(function (state) {
9054
9120
  return genericSelectors.selectFeatureSyncLayersForPanel(state, 'warning-dialog');
9055
9121
  });
9122
+ var warningDialogFeatureLayers = React.useMemo(function () {
9123
+ return allWarningDialogFeatureLayers.filter(function (layer) {
9124
+ return layer.mapId === mapId;
9125
+ });
9126
+ }, [allWarningDialogFeatureLayers, mapId]);
9056
9127
  var warningDialogFeatures = React.useMemo(function () {
9057
9128
  return createWarningDialogFeatureLayers(warningDialogFeatureLayers);
9058
9129
  }, [warningDialogFeatureLayers]);
9130
+ var hasPublicWarningDrawLayer = featureLayers.some(function (layer) {
9131
+ var _layer$id;
9132
+ return (_layer$id = layer.id) == null ? void 0 : _layer$id.startsWith("drawLayer-" + PUBLIC_WARNING_DRAW_TOOL_ID + "-");
9133
+ });
9134
+ var warningDialogFeaturesForHighlight = React.useMemo(function () {
9135
+ return hasPublicWarningDrawLayer ? [] : warningDialogFeatures;
9136
+ }, [hasPublicWarningDrawLayer, warningDialogFeatures]);
9059
9137
  var warningDialogFeatureKeys = React.useMemo(function () {
9060
9138
  return createWarningDialogFeatureKeys(warningDialogFeatures);
9061
9139
  }, [warningDialogFeatures]);
@@ -9064,11 +9142,6 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
9064
9142
  var linkedFeaturesFromState = useSelector(function (store) {
9065
9143
  return genericSelectors.selectLinkedFeatureLayersForMap(store, mapId);
9066
9144
  });
9067
- // Form-specific features (draft/edit geometries) from linked panels.
9068
- // Kept separate from linkedFeatures so edit-mode filtering can be applied.
9069
- var linkedFormFeaturesFromState = useSelector(function (store) {
9070
- return genericSelectors.selectLinkedFormFeaturesForMap(store, mapId);
9071
- });
9072
9145
  // Raw shared-data payload grouped per linked panel id.
9073
9146
  // Needed for ownership lookup (feature key -> panel id(s)) when routing
9074
9147
  // selection/hover updates back to the correct source panel(s).
@@ -9099,19 +9172,6 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
9099
9172
  return featureCollection.features.length > 0;
9100
9173
  });
9101
9174
  }, [featureSyncLayerVisibilityById, linkedFeaturesFromState, selectedFeatureIdsByLayerKey, warningDialogFeatureKeys]);
9102
- var linkedFormFeatures = React.useMemo(function () {
9103
- return {
9104
- type: 'FeatureCollection',
9105
- features: linkedFormFeaturesFromState.flatMap(function (feature) {
9106
- var _feature$geoJSON$feat;
9107
- // Filter out any form features currently in Edit mode
9108
- if ((_feature$geoJSON$feat = feature.geoJSON.features[0]) != null && (_feature$geoJSON$feat = _feature$geoJSON$feat.properties) != null && _feature$geoJSON$feat.inEditMode) {
9109
- return [];
9110
- }
9111
- return feature.geoJSON.features;
9112
- })
9113
- };
9114
- }, [linkedFormFeaturesFromState]);
9115
9175
  var srs = useSelector(function (store) {
9116
9176
  return mapSelectors.getSrs(store, mapId);
9117
9177
  });
@@ -9200,20 +9260,43 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
9200
9260
  var disableMapPin = useSelector(function (store) {
9201
9261
  return mapSelectors.getDisableMapPin(store, mapId);
9202
9262
  });
9263
+ var isCurrentMapDrawToolActive = useSelector(function (state) {
9264
+ return drawingToolSelectors.selectAllDrawingTools(state).some(function (tool) {
9265
+ var _layerSelectors$getLa;
9266
+ if (!tool.activeDrawModeId) {
9267
+ return false;
9268
+ }
9269
+ return ((_layerSelectors$getLa = layerSelectors.getLayerById(state, tool.geoJSONLayerId)) == null ? void 0 : _layerSelectors$getLa.mapId) === mapId;
9270
+ });
9271
+ });
9272
+ var drawToolLayerIds = useSelector(function (state) {
9273
+ return drawingToolSelectors.selectAllDrawingTools(state).map(function (tool) {
9274
+ return tool.geoJSONLayerId;
9275
+ }).filter(function (layerId) {
9276
+ return Boolean(layerId);
9277
+ });
9278
+ }, shallowEqual);
9279
+ var shouldHandleMapPinClick = React.useCallback(function (event) {
9280
+ var clickedLayerIds = new Set();
9281
+ event.map.forEachFeatureAtPixel(event.pixel, function (_feature, layerAtPixel) {
9282
+ var layerId = layerAtPixel == null ? void 0 : layerAtPixel.get('layerId');
9283
+ if (typeof layerId === 'string') {
9284
+ clickedLayerIds.add(layerId);
9285
+ }
9286
+ });
9287
+ return !drawToolLayerIds.some(function (layerId) {
9288
+ return clickedLayerIds.has(layerId);
9289
+ });
9290
+ }, [drawToolLayerIds]);
9203
9291
  var mapPinChangeLocation = React.useCallback(function (clickedLocation) {
9204
- var _hoverLinkedFeature$g, _hoverLinkedFeature$g2;
9205
- if (disableMapPin) {
9292
+ var _hoverLinkedFeature$g, _hoverLinkedFeature$g2, _hoverLinkedFeature$g3;
9293
+ if (disableMapPin || isCurrentMapDrawToolActive) {
9206
9294
  return;
9207
9295
  }
9208
9296
  var mapPinLocation = getCenterOfLinkedFeature(hoverLinkedFeature, srs) || clickedLocation;
9209
9297
  var selectedFeatureId = (hoverLinkedFeature == null || (_hoverLinkedFeature$g = hoverLinkedFeature.getId()) == null ? void 0 : _hoverLinkedFeature$g.toString()) || (hoverLinkedFeature == null || (_hoverLinkedFeature$g2 = hoverLinkedFeature.get('originalId')) == null ? void 0 : _hoverLinkedFeature$g2.toString()) || '';
9210
- var shouldMirrorSelectionToDrawLayer = hoverLinkedFeature && hoverLinkedFeature.get('isReadonly') !== true;
9211
- if (shouldMirrorSelectionToDrawLayer) {
9212
- dispatch(layerActions.setSelectedFeatures({
9213
- layerId: "drawlayer-" + mapId,
9214
- selectedFeatureIds: selectedFeatureId ? [selectedFeatureId] : []
9215
- }));
9216
- }
9298
+ var hoveredFeatureSourceLayerId = hoverLinkedFeature == null || (_hoverLinkedFeature$g3 = hoverLinkedFeature.get('sourceLayerId')) == null ? void 0 : _hoverLinkedFeature$g3.toString();
9299
+ var isHoveredFeatureSyncLayer = hoveredFeatureSourceLayerId ? layerSelectors.getIsFeatureSyncLayer(store.getState(), hoveredFeatureSourceLayerId) : false;
9217
9300
  var state = store.getState();
9218
9301
  var directlyLinkedPanelIds = genericSelectors.selectLinkedPanelIdsForMap(state, mapId);
9219
9302
  var connectedMapIds = new Set([mapId]);
@@ -9245,6 +9328,13 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
9245
9328
  });
9246
9329
  var targetPanelIds = getFeatureSelectionTargetPanelIds(selectedFeatureId, featureOwnerPanelIdsById, directlyLinkedPanelIds);
9247
9330
  var mapIdsToUpdate = directlyLinkedMapIds.size > 0 ? Array.from(directlyLinkedMapIds) : [mapId];
9331
+ var shouldMirrorSelectionToDrawLayer = hoverLinkedFeature && hoverLinkedFeature.get('isReadonly') !== true && !isHoveredFeatureSyncLayer && targetPanelIds.length === 0;
9332
+ if (shouldMirrorSelectionToDrawLayer) {
9333
+ dispatch(layerActions.setSelectedFeatures({
9334
+ layerId: "drawlayer-" + mapId,
9335
+ selectedFeatureIds: selectedFeatureId ? [selectedFeatureId] : []
9336
+ }));
9337
+ }
9248
9338
  if (targetPanelIds.length > 0) {
9249
9339
  directlyLinkedPanelIds.forEach(function (panelId) {
9250
9340
  var featureIdForPanel = targetPanelIds.includes(panelId) ? selectedFeatureId : '';
@@ -9263,7 +9353,7 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
9263
9353
  mapPinLocation: mapPinLocation
9264
9354
  }));
9265
9355
  });
9266
- }, [dispatch, featureOwnerPanelIdsById, disableMapPin, hoverLinkedFeature, mapId, setSelectedFeatureIdsForPanel, srs, store]);
9356
+ }, [dispatch, featureOwnerPanelIdsById, disableMapPin, hoverLinkedFeature, isCurrentMapDrawToolActive, mapId, setSelectedFeatureIdsForPanel, srs, store]);
9267
9357
  var isActiveWindowId = useSelector(function (store) {
9268
9358
  return uiSelectors.getIsActiveWindowId(store, mapId);
9269
9359
  });
@@ -9312,8 +9402,8 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
9312
9402
  };
9313
9403
  }, [view, mapId, srs, dispatch]);
9314
9404
  var featureProperties = React.useMemo(function () {
9315
- var _hoverLinkedFeature$g3;
9316
- return (_hoverLinkedFeature$g3 = hoverLinkedFeature == null || hoverLinkedFeature.getProperties == null ? void 0 : hoverLinkedFeature.getProperties()) != null ? _hoverLinkedFeature$g3 : {};
9405
+ var _hoverLinkedFeature$g4;
9406
+ return (_hoverLinkedFeature$g4 = hoverLinkedFeature == null || hoverLinkedFeature.getProperties == null ? void 0 : hoverLinkedFeature.getProperties()) != null ? _hoverLinkedFeature$g4 : {};
9317
9407
  }, [hoverLinkedFeature]);
9318
9408
  var hoverIdFromFeature = hoverLinkedFeature == null ? void 0 : hoverLinkedFeature.get('originalId');
9319
9409
  var hoverId = typeof hoverIdFromFeature === 'string' && hoverIdFromFeature || (typeof (featureProperties == null ? void 0 : featureProperties.originalId) === 'string' ? featureProperties.originalId : undefined);
@@ -9462,7 +9552,7 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
9462
9552
  }, [isSearchDialogOpen]);
9463
9553
  useFitAndHighlightWarningFeature({
9464
9554
  view: view,
9465
- warningDialogFeatures: warningDialogFeatures,
9555
+ warningDialogFeatures: warningDialogFeaturesForHighlight,
9466
9556
  srs: srs,
9467
9557
  mapId: mapId
9468
9558
  });
@@ -9483,23 +9573,12 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
9483
9573
  })
9484
9574
  };
9485
9575
  }, [hoveredLinkedFeatureIds, linkedFeatureCollections]);
9486
- var filteredLinkedFormFeatures = React.useMemo(function () {
9487
- return {
9488
- type: 'FeatureCollection',
9489
- features: linkedFormFeatures.features.filter(function (feature) {
9490
- var _feature$properties2;
9491
- var featureId = feature.id !== undefined ? String(feature.id) : undefined;
9492
- var originalId = typeof ((_feature$properties2 = feature.properties) == null ? void 0 : _feature$properties2.originalId) === 'string' ? feature.properties.originalId : undefined;
9493
- return !(featureId && warningDialogFeatureKeys.has(featureId) || originalId && warningDialogFeatureKeys.has(originalId));
9494
- })
9495
- };
9496
- }, [linkedFormFeatures, warningDialogFeatureKeys]);
9497
9576
  var combinedLinkedFeatures = React.useMemo(function () {
9498
9577
  return {
9499
9578
  type: 'FeatureCollection',
9500
- features: [].concat(linkedFeatureCollectionsWithHover.features, filteredLinkedFormFeatures.features)
9579
+ features: linkedFeatureCollectionsWithHover.features
9501
9580
  };
9502
- }, [linkedFeatureCollectionsWithHover, filteredLinkedFormFeatures]);
9581
+ }, [linkedFeatureCollectionsWithHover]);
9503
9582
  return jsx(TimeContext.Provider, {
9504
9583
  value: prefetchTimespan,
9505
9584
  children: jsxs(OpenLayersMapView, {
@@ -9549,7 +9628,8 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
9549
9628
  disableMapPin: disableMapPin,
9550
9629
  displayMapPin: displayMapPin,
9551
9630
  mapPinLocation: mapPinLocation,
9552
- selectLocation: mapPinChangeLocation
9631
+ selectLocation: mapPinChangeLocation,
9632
+ shouldHandleClick: shouldHandleMapPinClick
9553
9633
  })]
9554
9634
  }), jsxs(MapControls, {
9555
9635
  "data-testid": "mapControls",
@@ -1,8 +1,9 @@
1
1
  import React from 'react';
2
- interface LayerManagerButtonProps {
2
+ interface LayerManagerMenuButtonProps {
3
3
  mapId: string;
4
4
  layerId?: string;
5
5
  isFeatureLayer?: boolean;
6
+ isFeatureSyncLayer?: boolean;
6
7
  onLayerDuplicate?: (payload: {
7
8
  mapId: string;
8
9
  layerId: string;
@@ -14,5 +15,5 @@ interface LayerManagerButtonProps {
14
15
  tooltipTitle?: string;
15
16
  icon?: React.ReactNode;
16
17
  }
17
- declare const LayerManagerMenuButton: React.FC<LayerManagerButtonProps>;
18
+ declare const LayerManagerMenuButton: React.FC<LayerManagerMenuButtonProps>;
18
19
  export default LayerManagerMenuButton;
@@ -1,9 +1,9 @@
1
1
  import React from 'react';
2
- interface LayerManagerButtonProps {
2
+ interface LayerManagerMenuButtonConnectProps {
3
3
  mapId: string;
4
4
  layerId?: string;
5
5
  tooltipTitle?: string;
6
6
  icon?: React.ReactNode;
7
7
  }
8
- declare const LayerManagerMenuButtonConnect: React.FC<LayerManagerButtonProps>;
8
+ declare const LayerManagerMenuButtonConnect: React.FC<LayerManagerMenuButtonConnectProps>;
9
9
  export default LayerManagerMenuButtonConnect;
@@ -3,6 +3,7 @@ interface SelectableFeaturesProps {
3
3
  layerId: string;
4
4
  isSelectable: boolean;
5
5
  onToggleSelectable: () => void;
6
+ disabled?: boolean;
6
7
  }
7
8
  declare const SelectableFeatures: React.FC<SelectableFeaturesProps>;
8
9
  export default SelectableFeatures;
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  interface SelectableFeaturesCheckboxConnectProps {
3
3
  layerId: string;
4
+ disabled?: boolean;
4
5
  }
5
6
  declare const SelectableFeaturesCheckboxConnect: React.FC<SelectableFeaturesCheckboxConnectProps>;
6
7
  export default SelectableFeaturesCheckboxConnect;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeoweb/core",
3
- "version": "19.2.0",
3
+ "version": "19.3.0",
4
4
  "description": "GeoWeb Core library for the opengeoweb project",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -28,7 +28,7 @@
28
28
  "@opengeoweb/webmap-react": "*",
29
29
  "@opengeoweb/webmap": "*",
30
30
  "@opengeoweb/theme": "*",
31
- "axios": "^1.16.0",
31
+ "axios": "^1.18.0",
32
32
  "@opengeoweb/layer-select": "*",
33
33
  "lodash": "^4.18.1",
34
34
  "ol": "^10.4.0",