@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.
- package/dist/components/ColorSwatch/__tests__/index.test.d.ts +5 -0
- package/dist/components/FullscreenControl/__tests__/index.test.d.ts +5 -0
- package/dist/components/Marker/useEditHandlers.d.ts +2 -2
- package/dist/components/Measurement/__tests__/toolbar.test.d.ts +2 -2
- package/dist/components/Notification/__tests__/index.test.d.ts +1 -1
- package/dist/components/PerformanceDashboard/__tests__/index.test.d.ts +1 -1
- package/dist/components/PlotLayer/__tests__/index.test.d.ts +2 -3
- package/dist/components/Popup/__tests__/index.test.d.ts +5 -0
- package/dist/components/Road/hooks/useRoadEvents.d.ts +4 -0
- package/dist/components/SelectIcon/__tests__/index.test.d.ts +4 -0
- package/dist/components/StyleSelector/__tests__/index.test.d.ts +5 -0
- package/dist/components/TrackPlayer/__tests__/index.test.d.ts +5 -0
- package/dist/components/irrigation.esm.js +12 -2
- package/dist/components/irrigation.esm.js.map +1 -1
- package/dist/components/marker.esm.js.map +1 -1
- package/dist/components/plotgrouplayer.esm.js +3 -1
- package/dist/components/plotgrouplayer.esm.js.map +1 -1
- package/dist/components/road.esm.js +41 -13
- package/dist/components/road.esm.js.map +1 -1
- package/dist/hooks/__tests__/useRenderOptimization.test.d.ts +0 -1
- package/dist/hooks/index.esm.js +3 -2
- package/dist/hooks/index.esm.js.map +1 -1
- package/dist/hooks/usePolylineDraw.d.ts +75 -0
- package/dist/hooks/usePolylineEdit.d.ts +70 -0
- package/dist/hooks/usePolylineRenderer.d.ts +1 -1
- package/dist/hooks/useSnapManager.d.ts +50 -0
- package/dist/hooks/useVertexMarkers.d.ts +51 -0
- package/dist/index.esm.js +53 -14
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +53 -14
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +53 -14
- package/dist/index.umd.js.map +1 -1
- package/dist/tests/setup/antd-mock.d.ts +34 -0
- package/dist/tests/setup/browser-mock.d.ts +53 -0
- package/dist/tests/setup/index.d.ts +22 -0
- package/dist/tests/setup/leaflet-mock.d.ts +28 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/irrigation.d.ts +4 -123
- package/dist/types/marker.d.ts +12 -113
- package/dist/types/mixins/DataSourceMixin.d.ts +56 -0
- package/dist/types/mixins/EditableMixin.d.ts +124 -0
- package/dist/types/mixins/InteractionMixin.d.ts +43 -0
- package/dist/types/mixins/LifecycleMixin.d.ts +23 -0
- package/dist/types/mixins/LoadingMixin.d.ts +44 -0
- package/dist/types/mixins/SelectableMixin.d.ts +52 -0
- package/dist/types/mixins/StyleMixin.d.ts +49 -0
- package/dist/types/mixins/ViewControlMixin.d.ts +36 -0
- package/dist/types/mixins/index.d.ts +13 -0
- package/dist/types/plot.d.ts +13 -67
- package/dist/types/road.d.ts +11 -157
- package/dist/types/track.d.ts +5 -15
- package/dist/utils/__tests__/RTreeIndex.test.d.ts +0 -1
- package/dist/utils/drawContext.d.ts +65 -0
- 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/
|
|
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
|
-
|
|
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:
|
|
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 (
|
|
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
|
-
|
|
23866
|
+
popupTriggerLocalRef.current.handleItemClick(roadId, road, layer, position, bounds);
|
|
23855
23867
|
}
|
|
23856
|
-
}, [
|
|
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 (
|
|
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
|
-
|
|
23877
|
+
popupTriggerLocalRef.current.handleMouseOver(roadId, road, layer, position, bounds);
|
|
23866
23878
|
}
|
|
23867
23879
|
} else {
|
|
23868
23880
|
// mouseout: 清除防抖定时器
|
|
23869
|
-
if (
|
|
23870
|
-
|
|
23881
|
+
if (popupTriggerRef.current === 'hover') {
|
|
23882
|
+
popupTriggerLocalRef.current.handleMouseOut();
|
|
23871
23883
|
}
|
|
23872
23884
|
}
|
|
23873
|
-
}, [
|
|
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)
|
|
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)
|
|
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, {
|