@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.umd.js CHANGED
@@ -5379,7 +5379,7 @@
5379
5379
  * 管理线要素图层的创建与清理
5380
5380
  *
5381
5381
  * 负责:
5382
- * 1. 编辑模式下过滤数据(create/edit 模式不渲染已有要素)
5382
+ * 1. 编辑模式下过滤数据(create/redraw 模式不渲染已有要素)
5383
5383
  * 2. 创建 LayerGroup 并将数据渲染进去
5384
5384
  * 3. 组件卸载时移除 editingLayerRef
5385
5385
  *
@@ -5432,7 +5432,8 @@
5432
5432
  return renderItem(item, layerGroup, index);
5433
5433
  });
5434
5434
  // 数据变化时清理编辑图层(新建保存后数据源更新时,移除临时的编辑图层避免重复)
5435
- if (dataChanged && editingLayerRef.current) {
5435
+ // 注意:在 redraw 模式下 editingLayerRef 不应被清理(可能在编辑过程中)
5436
+ if (dataChanged && editingLayerRef.current && currentMode !== 'redraw') {
5436
5437
  currentMap.removeLayer(editingLayerRef.current);
5437
5438
  editingLayerRef.current = null;
5438
5439
  }
@@ -16092,7 +16093,9 @@
16092
16093
  mode: mode,
16093
16094
  value: getSelectedIdsForType(plotType),
16094
16095
  onSelect: handleSelect(plotType),
16095
- onClick: handleClick(plotType),
16096
+ onClick: function onClick(item) {
16097
+ return handleClick(plotType)(item, undefined);
16098
+ },
16096
16099
  onHover: handleHover(plotType),
16097
16100
  onContextMenu: handleContextMenu(plotType),
16098
16101
  groupKey: groupKey,
@@ -23781,6 +23784,10 @@
23781
23784
  * - click 模式:点击道路切换 Popup 显示/隐藏(toggle)
23782
23785
  * - hover 模式:鼠标进入道路延迟显示 Popup,离开立即隐藏(带防抖)
23783
23786
  * - 地图点击:点击地图空白区域自动关闭 Popup
23787
+ *
23788
+ * 【稳定性优化】
23789
+ * handleRoadClick 和 handleRoadHover 通过 useRef 保持稳定引用,
23790
+ * 避免因内部状态变化导致回调函数引用改变。
23784
23791
  */
23785
23792
  /**
23786
23793
  * 计算 Popup 位置参数(用于 usePopupTrigger)
@@ -23836,6 +23843,11 @@
23836
23843
  },
23837
23844
  canClose: popupTrigger.canClosePopup
23838
23845
  });
23846
+ // ========== 稳定性优化:使用 ref 保持 popupTrigger 稳定引用 ==========
23847
+ // popupTrigger 来自 usePopupState,其内部状态变化会导致函数引用改变
23848
+ // 通过 ref 缓存,避免 handleRoadClick/handleRoadHover 依赖变化
23849
+ var popupTriggerLocalRef = React.useRef(popupTrigger);
23850
+ popupTriggerLocalRef.current = popupTrigger;
23839
23851
  // ========== 业务逻辑 ==========
23840
23852
  /** 计算 Popup 参数的辅助函数 */
23841
23853
  var getPopupParams = React.useCallback(function (road, layer) {
@@ -23845,30 +23857,30 @@
23845
23857
  // 处理道路点击
23846
23858
  var handleRoadClick = React.useCallback(function (roadId, road, layer) {
23847
23859
  // Popup 处理(仅 click 模式)
23848
- if ((popupTriggerRef === null || popupTriggerRef === void 0 ? void 0 : popupTriggerRef.current) === 'click' && onPopupOpenRef !== null && onPopupOpenRef !== void 0 && onPopupOpenRef.current) {
23860
+ if (popupTriggerRef.current === 'click' && onPopupOpenRef !== null && onPopupOpenRef !== void 0 && onPopupOpenRef.current) {
23849
23861
  var _getPopupParams = getPopupParams(road, layer),
23850
23862
  position = _getPopupParams.position,
23851
23863
  bounds = _getPopupParams.bounds;
23852
- popupTrigger.handleItemClick(roadId, road, layer, position, bounds);
23864
+ popupTriggerLocalRef.current.handleItemClick(roadId, road, layer, position, bounds);
23853
23865
  }
23854
- }, [popupTriggerRef, onPopupOpenRef, popupTrigger, getPopupParams]);
23866
+ }, [onPopupOpenRef, getPopupParams, popupTriggerRef]);
23855
23867
  // 处理道路悬停进入
23856
23868
  var handleRoadHover = React.useCallback(function (roadId, road, layer, type) {
23857
23869
  if (type === 'mouseover') {
23858
23870
  // Popup 处理(仅 hover 模式)
23859
- if ((popupTriggerRef === null || popupTriggerRef === void 0 ? void 0 : popupTriggerRef.current) === 'hover' && onPopupOpenRef !== null && onPopupOpenRef !== void 0 && onPopupOpenRef.current) {
23871
+ if (popupTriggerRef.current === 'hover' && onPopupOpenRef !== null && onPopupOpenRef !== void 0 && onPopupOpenRef.current) {
23860
23872
  var _getPopupParams2 = getPopupParams(road, layer),
23861
23873
  position = _getPopupParams2.position,
23862
23874
  bounds = _getPopupParams2.bounds;
23863
- popupTrigger.handleMouseOver(roadId, road, layer, position, bounds);
23875
+ popupTriggerLocalRef.current.handleMouseOver(roadId, road, layer, position, bounds);
23864
23876
  }
23865
23877
  } else {
23866
23878
  // mouseout: 清除防抖定时器
23867
- if ((popupTriggerRef === null || popupTriggerRef === void 0 ? void 0 : popupTriggerRef.current) === 'hover') {
23868
- popupTrigger.handleMouseOut();
23879
+ if (popupTriggerRef.current === 'hover') {
23880
+ popupTriggerLocalRef.current.handleMouseOut();
23869
23881
  }
23870
23882
  }
23871
- }, [popupTriggerRef, onPopupOpenRef, popupTrigger, getPopupParams]);
23883
+ }, [onPopupOpenRef, getPopupParams, popupTriggerRef]);
23872
23884
  // 处理道路右键
23873
23885
  var handleRoadContextMenu = React.useCallback(function (_roadId, _road, _layer, _event) {
23874
23886
  // 右键默认行为由外层处理,这里仅提供基础支持
@@ -24249,6 +24261,16 @@
24249
24261
  }, [map, editEnabled]);
24250
24262
  var renderItem = React.useCallback(function (road, layerGroup, index) {
24251
24263
  var _onRowRef$current, _onRowRef$current2;
24264
+ // ========== 方案一修复:redraw 模式下跳过正在编辑的道路 ==========
24265
+ // 修复描述:当进入重绘模式时,被选中的道路(id === value)不应该被 renderItem 渲染
24266
+ // 原因:被选中的道路已经通过 editingLayerRef 在地图上以编辑样式(绿色)渲染
24267
+ // 如果 renderItem 仍然渲染,会导致同一道路以两种样式(红色原始样式 + 绿色编辑样式)同时显示
24268
+ // 撤销方法:删除以下 if 块及其注释即可恢复到修改前的状态
24269
+ // 问题根因:usePolylineRenderer 在 currentMode === 'redraw' 时仍然渲染了所有数据,包括被编辑的道路
24270
+ // ========== 方案一修复结束 ==========================================
24271
+ if (currentModeRef.current === 'redraw' && road.id === valueRef.current) {
24272
+ return; // 跳过渲染,由 editingLayerRef 处理该道路的显示
24273
+ }
24252
24274
  var isSelected = road.id === value;
24253
24275
  var style = getRoadStyle(road, isSelected);
24254
24276
  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 : {};
@@ -24417,8 +24439,10 @@
24417
24439
  }
24418
24440
  }, [value, normalizedData, onEditRef, enabledButtonsRef]);
24419
24441
  var handleRedraw = React.useCallback(function () {
24420
- var _editingPath$vertexBo3, _editingPath$vertexFi3, _editingPath$vertexFi4, _editLayer$pm;
24421
- if (!map || !enabledButtonsRef.current.includes('redraw') || !value || !map.pm) return;
24442
+ var _editingPath$vertexBo3, _editingPath$vertexFi3, _editingPath$vertexFi4, _map$pm, _map$pm$globalEditMod, _editLayer$pm;
24443
+ if (!map || !enabledButtonsRef.current.includes('redraw') || !value || !map.pm) {
24444
+ return;
24445
+ }
24422
24446
  var layer = layerByIdRef.current[value];
24423
24447
  if (!layer) return;
24424
24448
  var road = normalizedData.find(function (r) {
@@ -24438,6 +24462,10 @@
24438
24462
  map.removeLayer(layerGroupRef.current);
24439
24463
  layerGroupRef.current = null;
24440
24464
  }
24465
+ // 禁用全局编辑模式
24466
+ 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)) {
24467
+ map.pm.disableGlobalEditMode();
24468
+ }
24441
24469
  var editLayer = L$1.polyline(road.points, _objectSpread2(_objectSpread2({}, editingPath), {}, {
24442
24470
  className: 'road-line'
24443
24471
  })).addTo(map);
@@ -24459,7 +24487,9 @@
24459
24487
  }, [value, normalizedData, map, editingPath, enabledButtonsRef]);
24460
24488
  React.useEffect(function () {
24461
24489
  var _editingPath$vertexBo4, _editingPath$vertexFi5, _editingPath$vertexFi6;
24462
- if (currentMode !== 'redraw' || !editingLayerRef.current || !map) return;
24490
+ if (currentMode !== 'redraw' || !editingLayerRef.current || !map) {
24491
+ return;
24492
+ }
24463
24493
  editingLayerRef.current.setStyle(editingPath);
24464
24494
  // 设置顶点样式 CSS 变量(与 PlotLayer 保持一致)
24465
24495
  var vertexBorderColor = (_editingPath$vertexBo4 = editingPath.vertexBorderColor) !== null && _editingPath$vertexBo4 !== void 0 ? _editingPath$vertexBo4 : ROAD_STYLE.editing.vertexBorderColor;
@@ -25391,6 +25421,15 @@
25391
25421
  }, animated, detected.type === 'svg' ? detected.config : null, detected.type === 'url' ? detected.src : null, 'irrigation-port-marker');
25392
25422
  }, []);
25393
25423
  var renderItem = React.useCallback(function (channel, layerGroup, _index) {
25424
+ // ========== 方案一修复:redraw 模式下跳过正在编辑的渠道 ==========
25425
+ // 修复描述:当进入重绘模式时,被选中的渠道(id === value)不应该被 renderItem 渲染
25426
+ // 原因:被选中的渠道已经通过 editingLayerRef 在地图上以编辑样式渲染
25427
+ // 如果 renderItem 仍然渲染,会导致同一渠道以两种样式同时显示
25428
+ // 撤销方法:删除以下 if 块及其注释即可恢复到修改前的状态
25429
+ // ========== 方案一修复结束 ==========================================
25430
+ if (currentModeRef.current === 'redraw' && channel.id === valueRef.current) {
25431
+ return; // 跳过渲染,由 editingLayerRef 处理该渠道的显示
25432
+ }
25394
25433
  var isSelected = channel.id === value;
25395
25434
  var style = getChannelStyle(channel, isSelected);
25396
25435
  var hitArea = L$1.polyline(channel.points, {