@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
@@ -3973,6 +3973,10 @@ var RoadEditToolbar = function RoadEditToolbar(_ref) {
3973
3973
  * - click 模式:点击道路切换 Popup 显示/隐藏(toggle)
3974
3974
  * - hover 模式:鼠标进入道路延迟显示 Popup,离开立即隐藏(带防抖)
3975
3975
  * - 地图点击:点击地图空白区域自动关闭 Popup
3976
+ *
3977
+ * 【稳定性优化】
3978
+ * handleRoadClick 和 handleRoadHover 通过 useRef 保持稳定引用,
3979
+ * 避免因内部状态变化导致回调函数引用改变。
3976
3980
  */
3977
3981
  /**
3978
3982
  * 计算 Popup 位置参数(用于 usePopupTrigger)
@@ -4028,6 +4032,11 @@ function useRoadEvents(options) {
4028
4032
  },
4029
4033
  canClose: popupTrigger.canClosePopup
4030
4034
  });
4035
+ // ========== 稳定性优化:使用 ref 保持 popupTrigger 稳定引用 ==========
4036
+ // popupTrigger 来自 usePopupState,其内部状态变化会导致函数引用改变
4037
+ // 通过 ref 缓存,避免 handleRoadClick/handleRoadHover 依赖变化
4038
+ var popupTriggerLocalRef = useRef(popupTrigger);
4039
+ popupTriggerLocalRef.current = popupTrigger;
4031
4040
  // ========== 业务逻辑 ==========
4032
4041
  /** 计算 Popup 参数的辅助函数 */
4033
4042
  var getPopupParams = useCallback(function (road, layer) {
@@ -4037,30 +4046,30 @@ function useRoadEvents(options) {
4037
4046
  // 处理道路点击
4038
4047
  var handleRoadClick = useCallback(function (roadId, road, layer) {
4039
4048
  // Popup 处理(仅 click 模式)
4040
- if ((popupTriggerRef === null || popupTriggerRef === void 0 ? void 0 : popupTriggerRef.current) === 'click' && onPopupOpenRef !== null && onPopupOpenRef !== void 0 && onPopupOpenRef.current) {
4049
+ if (popupTriggerRef.current === 'click' && onPopupOpenRef !== null && onPopupOpenRef !== void 0 && onPopupOpenRef.current) {
4041
4050
  var _getPopupParams = getPopupParams(road, layer),
4042
4051
  position = _getPopupParams.position,
4043
4052
  bounds = _getPopupParams.bounds;
4044
- popupTrigger.handleItemClick(roadId, road, layer, position, bounds);
4053
+ popupTriggerLocalRef.current.handleItemClick(roadId, road, layer, position, bounds);
4045
4054
  }
4046
- }, [popupTriggerRef, onPopupOpenRef, popupTrigger, getPopupParams]);
4055
+ }, [onPopupOpenRef, getPopupParams, popupTriggerRef]);
4047
4056
  // 处理道路悬停进入
4048
4057
  var handleRoadHover = useCallback(function (roadId, road, layer, type) {
4049
4058
  if (type === 'mouseover') {
4050
4059
  // Popup 处理(仅 hover 模式)
4051
- if ((popupTriggerRef === null || popupTriggerRef === void 0 ? void 0 : popupTriggerRef.current) === 'hover' && onPopupOpenRef !== null && onPopupOpenRef !== void 0 && onPopupOpenRef.current) {
4060
+ if (popupTriggerRef.current === 'hover' && onPopupOpenRef !== null && onPopupOpenRef !== void 0 && onPopupOpenRef.current) {
4052
4061
  var _getPopupParams2 = getPopupParams(road, layer),
4053
4062
  position = _getPopupParams2.position,
4054
4063
  bounds = _getPopupParams2.bounds;
4055
- popupTrigger.handleMouseOver(roadId, road, layer, position, bounds);
4064
+ popupTriggerLocalRef.current.handleMouseOver(roadId, road, layer, position, bounds);
4056
4065
  }
4057
4066
  } else {
4058
4067
  // mouseout: 清除防抖定时器
4059
- if ((popupTriggerRef === null || popupTriggerRef === void 0 ? void 0 : popupTriggerRef.current) === 'hover') {
4060
- popupTrigger.handleMouseOut();
4068
+ if (popupTriggerRef.current === 'hover') {
4069
+ popupTriggerLocalRef.current.handleMouseOut();
4061
4070
  }
4062
4071
  }
4063
- }, [popupTriggerRef, onPopupOpenRef, popupTrigger, getPopupParams]);
4072
+ }, [onPopupOpenRef, getPopupParams, popupTriggerRef]);
4064
4073
  // 处理道路右键
4065
4074
  var handleRoadContextMenu = useCallback(function (_roadId, _road, _layer, _event) {
4066
4075
  // 右键默认行为由外层处理,这里仅提供基础支持
@@ -5800,7 +5809,7 @@ function useEditMode(editModeProp, defaultButtons) {
5800
5809
  * 管理线要素图层的创建与清理
5801
5810
  *
5802
5811
  * 负责:
5803
- * 1. 编辑模式下过滤数据(create/edit 模式不渲染已有要素)
5812
+ * 1. 编辑模式下过滤数据(create/redraw 模式不渲染已有要素)
5804
5813
  * 2. 创建 LayerGroup 并将数据渲染进去
5805
5814
  * 3. 组件卸载时移除 editingLayerRef
5806
5815
  *
@@ -5853,7 +5862,8 @@ function usePolylineRenderer(options) {
5853
5862
  return renderItem(item, layerGroup, index);
5854
5863
  });
5855
5864
  // 数据变化时清理编辑图层(新建保存后数据源更新时,移除临时的编辑图层避免重复)
5856
- if (dataChanged && editingLayerRef.current) {
5865
+ // 注意:在 redraw 模式下 editingLayerRef 不应被清理(可能在编辑过程中)
5866
+ if (dataChanged && editingLayerRef.current && currentMode !== 'redraw') {
5857
5867
  currentMap.removeLayer(editingLayerRef.current);
5858
5868
  editingLayerRef.current = null;
5859
5869
  }
@@ -7008,6 +7018,16 @@ var Road = /*#__PURE__*/forwardRef(function RoadComponent(props, ref) {
7008
7018
  }, [map, editEnabled]);
7009
7019
  var renderItem = useCallback(function (road, layerGroup, index) {
7010
7020
  var _onRowRef$current, _onRowRef$current2;
7021
+ // ========== 方案一修复:redraw 模式下跳过正在编辑的道路 ==========
7022
+ // 修复描述:当进入重绘模式时,被选中的道路(id === value)不应该被 renderItem 渲染
7023
+ // 原因:被选中的道路已经通过 editingLayerRef 在地图上以编辑样式(绿色)渲染
7024
+ // 如果 renderItem 仍然渲染,会导致同一道路以两种样式(红色原始样式 + 绿色编辑样式)同时显示
7025
+ // 撤销方法:删除以下 if 块及其注释即可恢复到修改前的状态
7026
+ // 问题根因:usePolylineRenderer 在 currentMode === 'redraw' 时仍然渲染了所有数据,包括被编辑的道路
7027
+ // ========== 方案一修复结束 ==========================================
7028
+ if (currentModeRef.current === 'redraw' && road.id === valueRef.current) {
7029
+ return; // 跳过渲染,由 editingLayerRef 处理该道路的显示
7030
+ }
7011
7031
  var isSelected = road.id === value;
7012
7032
  var style = getRoadStyle(road, isSelected);
7013
7033
  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 : {};
@@ -7176,8 +7196,10 @@ var Road = /*#__PURE__*/forwardRef(function RoadComponent(props, ref) {
7176
7196
  }
7177
7197
  }, [value, normalizedData, onEditRef, enabledButtonsRef]);
7178
7198
  var handleRedraw = useCallback(function () {
7179
- var _editingPath$vertexBo3, _editingPath$vertexFi3, _editingPath$vertexFi4, _editLayer$pm;
7180
- if (!map || !enabledButtonsRef.current.includes('redraw') || !value || !map.pm) return;
7199
+ var _editingPath$vertexBo3, _editingPath$vertexFi3, _editingPath$vertexFi4, _map$pm, _map$pm$globalEditMod, _editLayer$pm;
7200
+ if (!map || !enabledButtonsRef.current.includes('redraw') || !value || !map.pm) {
7201
+ return;
7202
+ }
7181
7203
  var layer = layerByIdRef.current[value];
7182
7204
  if (!layer) return;
7183
7205
  var road = normalizedData.find(function (r) {
@@ -7197,6 +7219,10 @@ var Road = /*#__PURE__*/forwardRef(function RoadComponent(props, ref) {
7197
7219
  map.removeLayer(layerGroupRef.current);
7198
7220
  layerGroupRef.current = null;
7199
7221
  }
7222
+ // 禁用全局编辑模式
7223
+ 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)) {
7224
+ map.pm.disableGlobalEditMode();
7225
+ }
7200
7226
  var editLayer = L$1.polyline(road.points, _objectSpread2(_objectSpread2({}, editingPath), {}, {
7201
7227
  className: 'road-line'
7202
7228
  })).addTo(map);
@@ -7218,7 +7244,9 @@ var Road = /*#__PURE__*/forwardRef(function RoadComponent(props, ref) {
7218
7244
  }, [value, normalizedData, map, editingPath, enabledButtonsRef]);
7219
7245
  useEffect(function () {
7220
7246
  var _editingPath$vertexBo4, _editingPath$vertexFi5, _editingPath$vertexFi6;
7221
- if (currentMode !== 'redraw' || !editingLayerRef.current || !map) return;
7247
+ if (currentMode !== 'redraw' || !editingLayerRef.current || !map) {
7248
+ return;
7249
+ }
7222
7250
  editingLayerRef.current.setStyle(editingPath);
7223
7251
  // 设置顶点样式 CSS 变量(与 PlotLayer 保持一致)
7224
7252
  var vertexBorderColor = (_editingPath$vertexBo4 = editingPath.vertexBorderColor) !== null && _editingPath$vertexBo4 !== void 0 ? _editingPath$vertexBo4 : ROAD_STYLE.editing.vertexBorderColor;