@wenle_2523097/agri-map 2.0.1 → 2.0.2

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 (55) hide show
  1. package/dist/components/ColorSwatch/__tests__/index.test.d.ts +5 -0
  2. package/dist/components/FullscreenControl/__tests__/index.test.d.ts +5 -0
  3. package/dist/components/Marker/useEditHandlers.d.ts +2 -2
  4. package/dist/components/Measurement/__tests__/toolbar.test.d.ts +2 -2
  5. package/dist/components/Notification/__tests__/index.test.d.ts +1 -1
  6. package/dist/components/PerformanceDashboard/__tests__/index.test.d.ts +1 -1
  7. package/dist/components/PlotLayer/__tests__/index.test.d.ts +2 -3
  8. package/dist/components/Popup/__tests__/index.test.d.ts +5 -0
  9. package/dist/components/Road/hooks/useRoadEvents.d.ts +4 -0
  10. package/dist/components/SelectIcon/__tests__/index.test.d.ts +4 -0
  11. package/dist/components/StyleSelector/__tests__/index.test.d.ts +5 -0
  12. package/dist/components/TrackPlayer/__tests__/index.test.d.ts +5 -0
  13. package/dist/components/irrigation.esm.js +12 -2
  14. package/dist/components/irrigation.esm.js.map +1 -1
  15. package/dist/components/marker.esm.js.map +1 -1
  16. package/dist/components/plotgrouplayer.esm.js +3 -1
  17. package/dist/components/plotgrouplayer.esm.js.map +1 -1
  18. package/dist/components/road.esm.js +41 -13
  19. package/dist/components/road.esm.js.map +1 -1
  20. package/dist/hooks/__tests__/useRenderOptimization.test.d.ts +0 -1
  21. package/dist/hooks/index.esm.js +3 -2
  22. package/dist/hooks/index.esm.js.map +1 -1
  23. package/dist/hooks/usePolylineDraw.d.ts +75 -0
  24. package/dist/hooks/usePolylineEdit.d.ts +70 -0
  25. package/dist/hooks/usePolylineRenderer.d.ts +1 -1
  26. package/dist/hooks/useSnapManager.d.ts +50 -0
  27. package/dist/hooks/useVertexMarkers.d.ts +51 -0
  28. package/dist/index.esm.js +53 -14
  29. package/dist/index.esm.js.map +1 -1
  30. package/dist/index.js +53 -14
  31. package/dist/index.js.map +1 -1
  32. package/dist/index.umd.js +53 -14
  33. package/dist/index.umd.js.map +1 -1
  34. package/dist/tests/setup/antd-mock.d.ts +34 -0
  35. package/dist/tests/setup/browser-mock.d.ts +53 -0
  36. package/dist/tests/setup/index.d.ts +22 -0
  37. package/dist/tests/setup/leaflet-mock.d.ts +28 -0
  38. package/dist/types/index.d.ts +1 -0
  39. package/dist/types/irrigation.d.ts +4 -123
  40. package/dist/types/marker.d.ts +12 -113
  41. package/dist/types/mixins/DataSourceMixin.d.ts +56 -0
  42. package/dist/types/mixins/EditableMixin.d.ts +124 -0
  43. package/dist/types/mixins/InteractionMixin.d.ts +43 -0
  44. package/dist/types/mixins/LifecycleMixin.d.ts +23 -0
  45. package/dist/types/mixins/LoadingMixin.d.ts +44 -0
  46. package/dist/types/mixins/SelectableMixin.d.ts +52 -0
  47. package/dist/types/mixins/StyleMixin.d.ts +49 -0
  48. package/dist/types/mixins/ViewControlMixin.d.ts +36 -0
  49. package/dist/types/mixins/index.d.ts +13 -0
  50. package/dist/types/plot.d.ts +13 -67
  51. package/dist/types/road.d.ts +11 -157
  52. package/dist/types/track.d.ts +5 -15
  53. package/dist/utils/__tests__/RTreeIndex.test.d.ts +0 -1
  54. package/dist/utils/drawContext.d.ts +65 -0
  55. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -5381,7 +5381,7 @@ function useEditMode(editModeProp, defaultButtons) {
5381
5381
  * 管理线要素图层的创建与清理
5382
5382
  *
5383
5383
  * 负责:
5384
- * 1. 编辑模式下过滤数据(create/edit 模式不渲染已有要素)
5384
+ * 1. 编辑模式下过滤数据(create/redraw 模式不渲染已有要素)
5385
5385
  * 2. 创建 LayerGroup 并将数据渲染进去
5386
5386
  * 3. 组件卸载时移除 editingLayerRef
5387
5387
  *
@@ -5434,7 +5434,8 @@ function usePolylineRenderer(options) {
5434
5434
  return renderItem(item, layerGroup, index);
5435
5435
  });
5436
5436
  // 数据变化时清理编辑图层(新建保存后数据源更新时,移除临时的编辑图层避免重复)
5437
- if (dataChanged && editingLayerRef.current) {
5437
+ // 注意:在 redraw 模式下 editingLayerRef 不应被清理(可能在编辑过程中)
5438
+ if (dataChanged && editingLayerRef.current && currentMode !== 'redraw') {
5438
5439
  currentMap.removeLayer(editingLayerRef.current);
5439
5440
  editingLayerRef.current = null;
5440
5441
  }
@@ -16094,7 +16095,9 @@ var PlotGroupLayer = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
16094
16095
  mode: mode,
16095
16096
  value: getSelectedIdsForType(plotType),
16096
16097
  onSelect: handleSelect(plotType),
16097
- onClick: handleClick(plotType),
16098
+ onClick: function onClick(item) {
16099
+ return handleClick(plotType)(item, undefined);
16100
+ },
16098
16101
  onHover: handleHover(plotType),
16099
16102
  onContextMenu: handleContextMenu(plotType),
16100
16103
  groupKey: groupKey,
@@ -23783,6 +23786,10 @@ var RoadEditToolbar = function RoadEditToolbar(_ref) {
23783
23786
  * - click 模式:点击道路切换 Popup 显示/隐藏(toggle)
23784
23787
  * - hover 模式:鼠标进入道路延迟显示 Popup,离开立即隐藏(带防抖)
23785
23788
  * - 地图点击:点击地图空白区域自动关闭 Popup
23789
+ *
23790
+ * 【稳定性优化】
23791
+ * handleRoadClick 和 handleRoadHover 通过 useRef 保持稳定引用,
23792
+ * 避免因内部状态变化导致回调函数引用改变。
23786
23793
  */
23787
23794
  /**
23788
23795
  * 计算 Popup 位置参数(用于 usePopupTrigger)
@@ -23838,6 +23845,11 @@ function useRoadEvents(options) {
23838
23845
  },
23839
23846
  canClose: popupTrigger.canClosePopup
23840
23847
  });
23848
+ // ========== 稳定性优化:使用 ref 保持 popupTrigger 稳定引用 ==========
23849
+ // popupTrigger 来自 usePopupState,其内部状态变化会导致函数引用改变
23850
+ // 通过 ref 缓存,避免 handleRoadClick/handleRoadHover 依赖变化
23851
+ var popupTriggerLocalRef = React.useRef(popupTrigger);
23852
+ popupTriggerLocalRef.current = popupTrigger;
23841
23853
  // ========== 业务逻辑 ==========
23842
23854
  /** 计算 Popup 参数的辅助函数 */
23843
23855
  var getPopupParams = React.useCallback(function (road, layer) {
@@ -23847,30 +23859,30 @@ function useRoadEvents(options) {
23847
23859
  // 处理道路点击
23848
23860
  var handleRoadClick = React.useCallback(function (roadId, road, layer) {
23849
23861
  // Popup 处理(仅 click 模式)
23850
- if ((popupTriggerRef === null || popupTriggerRef === void 0 ? void 0 : popupTriggerRef.current) === 'click' && onPopupOpenRef !== null && onPopupOpenRef !== void 0 && onPopupOpenRef.current) {
23862
+ if (popupTriggerRef.current === 'click' && onPopupOpenRef !== null && onPopupOpenRef !== void 0 && onPopupOpenRef.current) {
23851
23863
  var _getPopupParams = getPopupParams(road, layer),
23852
23864
  position = _getPopupParams.position,
23853
23865
  bounds = _getPopupParams.bounds;
23854
- popupTrigger.handleItemClick(roadId, road, layer, position, bounds);
23866
+ popupTriggerLocalRef.current.handleItemClick(roadId, road, layer, position, bounds);
23855
23867
  }
23856
- }, [popupTriggerRef, onPopupOpenRef, popupTrigger, getPopupParams]);
23868
+ }, [onPopupOpenRef, getPopupParams, popupTriggerRef]);
23857
23869
  // 处理道路悬停进入
23858
23870
  var handleRoadHover = React.useCallback(function (roadId, road, layer, type) {
23859
23871
  if (type === 'mouseover') {
23860
23872
  // Popup 处理(仅 hover 模式)
23861
- if ((popupTriggerRef === null || popupTriggerRef === void 0 ? void 0 : popupTriggerRef.current) === 'hover' && onPopupOpenRef !== null && onPopupOpenRef !== void 0 && onPopupOpenRef.current) {
23873
+ if (popupTriggerRef.current === 'hover' && onPopupOpenRef !== null && onPopupOpenRef !== void 0 && onPopupOpenRef.current) {
23862
23874
  var _getPopupParams2 = getPopupParams(road, layer),
23863
23875
  position = _getPopupParams2.position,
23864
23876
  bounds = _getPopupParams2.bounds;
23865
- popupTrigger.handleMouseOver(roadId, road, layer, position, bounds);
23877
+ popupTriggerLocalRef.current.handleMouseOver(roadId, road, layer, position, bounds);
23866
23878
  }
23867
23879
  } else {
23868
23880
  // mouseout: 清除防抖定时器
23869
- if ((popupTriggerRef === null || popupTriggerRef === void 0 ? void 0 : popupTriggerRef.current) === 'hover') {
23870
- popupTrigger.handleMouseOut();
23881
+ if (popupTriggerRef.current === 'hover') {
23882
+ popupTriggerLocalRef.current.handleMouseOut();
23871
23883
  }
23872
23884
  }
23873
- }, [popupTriggerRef, onPopupOpenRef, popupTrigger, getPopupParams]);
23885
+ }, [onPopupOpenRef, getPopupParams, popupTriggerRef]);
23874
23886
  // 处理道路右键
23875
23887
  var handleRoadContextMenu = React.useCallback(function (_roadId, _road, _layer, _event) {
23876
23888
  // 右键默认行为由外层处理,这里仅提供基础支持
@@ -24251,6 +24263,16 @@ var Road = /*#__PURE__*/React.forwardRef(function RoadComponent(props, ref) {
24251
24263
  }, [map, editEnabled]);
24252
24264
  var renderItem = React.useCallback(function (road, layerGroup, index) {
24253
24265
  var _onRowRef$current, _onRowRef$current2;
24266
+ // ========== 方案一修复:redraw 模式下跳过正在编辑的道路 ==========
24267
+ // 修复描述:当进入重绘模式时,被选中的道路(id === value)不应该被 renderItem 渲染
24268
+ // 原因:被选中的道路已经通过 editingLayerRef 在地图上以编辑样式(绿色)渲染
24269
+ // 如果 renderItem 仍然渲染,会导致同一道路以两种样式(红色原始样式 + 绿色编辑样式)同时显示
24270
+ // 撤销方法:删除以下 if 块及其注释即可恢复到修改前的状态
24271
+ // 问题根因:usePolylineRenderer 在 currentMode === 'redraw' 时仍然渲染了所有数据,包括被编辑的道路
24272
+ // ========== 方案一修复结束 ==========================================
24273
+ if (currentModeRef.current === 'redraw' && road.id === valueRef.current) {
24274
+ return; // 跳过渲染,由 editingLayerRef 处理该道路的显示
24275
+ }
24254
24276
  var isSelected = road.id === value;
24255
24277
  var style = getRoadStyle(road, isSelected);
24256
24278
  var rowEvents = (_onRowRef$current = (_onRowRef$current2 = onRowRef.current) === null || _onRowRef$current2 === void 0 ? void 0 : _onRowRef$current2.call(onRowRef, road, index)) !== null && _onRowRef$current !== void 0 ? _onRowRef$current : {};
@@ -24419,8 +24441,10 @@ var Road = /*#__PURE__*/React.forwardRef(function RoadComponent(props, ref) {
24419
24441
  }
24420
24442
  }, [value, normalizedData, onEditRef, enabledButtonsRef]);
24421
24443
  var handleRedraw = React.useCallback(function () {
24422
- var _editingPath$vertexBo3, _editingPath$vertexFi3, _editingPath$vertexFi4, _editLayer$pm;
24423
- if (!map || !enabledButtonsRef.current.includes('redraw') || !value || !map.pm) return;
24444
+ var _editingPath$vertexBo3, _editingPath$vertexFi3, _editingPath$vertexFi4, _map$pm, _map$pm$globalEditMod, _editLayer$pm;
24445
+ if (!map || !enabledButtonsRef.current.includes('redraw') || !value || !map.pm) {
24446
+ return;
24447
+ }
24424
24448
  var layer = layerByIdRef.current[value];
24425
24449
  if (!layer) return;
24426
24450
  var road = normalizedData.find(function (r) {
@@ -24440,6 +24464,10 @@ var Road = /*#__PURE__*/React.forwardRef(function RoadComponent(props, ref) {
24440
24464
  map.removeLayer(layerGroupRef.current);
24441
24465
  layerGroupRef.current = null;
24442
24466
  }
24467
+ // 禁用全局编辑模式
24468
+ if ((_map$pm = map.pm) !== null && _map$pm !== void 0 && (_map$pm$globalEditMod = _map$pm.globalEditModeEnabled) !== null && _map$pm$globalEditMod !== void 0 && _map$pm$globalEditMod.call(_map$pm)) {
24469
+ map.pm.disableGlobalEditMode();
24470
+ }
24443
24471
  var editLayer = L$1.polyline(road.points, _objectSpread2(_objectSpread2({}, editingPath), {}, {
24444
24472
  className: 'road-line'
24445
24473
  })).addTo(map);
@@ -24461,7 +24489,9 @@ var Road = /*#__PURE__*/React.forwardRef(function RoadComponent(props, ref) {
24461
24489
  }, [value, normalizedData, map, editingPath, enabledButtonsRef]);
24462
24490
  React.useEffect(function () {
24463
24491
  var _editingPath$vertexBo4, _editingPath$vertexFi5, _editingPath$vertexFi6;
24464
- if (currentMode !== 'redraw' || !editingLayerRef.current || !map) return;
24492
+ if (currentMode !== 'redraw' || !editingLayerRef.current || !map) {
24493
+ return;
24494
+ }
24465
24495
  editingLayerRef.current.setStyle(editingPath);
24466
24496
  // 设置顶点样式 CSS 变量(与 PlotLayer 保持一致)
24467
24497
  var vertexBorderColor = (_editingPath$vertexBo4 = editingPath.vertexBorderColor) !== null && _editingPath$vertexBo4 !== void 0 ? _editingPath$vertexBo4 : ROAD_STYLE.editing.vertexBorderColor;
@@ -25393,6 +25423,15 @@ var Irrigation = /*#__PURE__*/React.forwardRef(function (props, ref) {
25393
25423
  }, animated, detected.type === 'svg' ? detected.config : null, detected.type === 'url' ? detected.src : null, 'irrigation-port-marker');
25394
25424
  }, []);
25395
25425
  var renderItem = React.useCallback(function (channel, layerGroup, _index) {
25426
+ // ========== 方案一修复:redraw 模式下跳过正在编辑的渠道 ==========
25427
+ // 修复描述:当进入重绘模式时,被选中的渠道(id === value)不应该被 renderItem 渲染
25428
+ // 原因:被选中的渠道已经通过 editingLayerRef 在地图上以编辑样式渲染
25429
+ // 如果 renderItem 仍然渲染,会导致同一渠道以两种样式同时显示
25430
+ // 撤销方法:删除以下 if 块及其注释即可恢复到修改前的状态
25431
+ // ========== 方案一修复结束 ==========================================
25432
+ if (currentModeRef.current === 'redraw' && channel.id === valueRef.current) {
25433
+ return; // 跳过渲染,由 editingLayerRef 处理该渠道的显示
25434
+ }
25396
25435
  var isSelected = channel.id === value;
25397
25436
  var style = getChannelStyle(channel, isSelected);
25398
25437
  var hitArea = L$1.polyline(channel.points, {