@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.umd.js
CHANGED
|
@@ -5379,7 +5379,7 @@
|
|
|
5379
5379
|
* 管理线要素图层的创建与清理
|
|
5380
5380
|
*
|
|
5381
5381
|
* 负责:
|
|
5382
|
-
* 1. 编辑模式下过滤数据(create/
|
|
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
|
-
|
|
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:
|
|
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 (
|
|
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
|
-
|
|
23864
|
+
popupTriggerLocalRef.current.handleItemClick(roadId, road, layer, position, bounds);
|
|
23853
23865
|
}
|
|
23854
|
-
}, [
|
|
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 (
|
|
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
|
-
|
|
23875
|
+
popupTriggerLocalRef.current.handleMouseOver(roadId, road, layer, position, bounds);
|
|
23864
23876
|
}
|
|
23865
23877
|
} else {
|
|
23866
23878
|
// mouseout: 清除防抖定时器
|
|
23867
|
-
if (
|
|
23868
|
-
|
|
23879
|
+
if (popupTriggerRef.current === 'hover') {
|
|
23880
|
+
popupTriggerLocalRef.current.handleMouseOut();
|
|
23869
23881
|
}
|
|
23870
23882
|
}
|
|
23871
|
-
}, [
|
|
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)
|
|
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)
|
|
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, {
|