@mint-ui/map 1.2.0-test.6 → 1.2.0-test.8
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/mint-map/core/MintMapController.d.ts +0 -1
- package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.d.ts +1 -0
- package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.js +84 -35
- package/dist/components/mint-map/core/wrapper/MapMarkerWrapper.js +1 -22
- package/dist/components/mint-map/google/GoogleMintMapController.d.ts +0 -1
- package/dist/components/mint-map/google/GoogleMintMapController.js +0 -4
- package/dist/components/mint-map/kakao/KakaoMintMapController.d.ts +0 -1
- package/dist/components/mint-map/kakao/KakaoMintMapController.js +0 -4
- package/dist/components/mint-map/naver/NaverMintMapController.d.ts +0 -3
- package/dist/components/mint-map/naver/NaverMintMapController.js +3 -37
- package/dist/index.es.js +88 -102
- package/dist/index.umd.js +88 -102
- package/package.json +1 -1
|
@@ -24,7 +24,6 @@ export declare abstract class MintMapController {
|
|
|
24
24
|
abstract updateMarker(marker: Marker, options: MarkerOptions): void;
|
|
25
25
|
abstract clearDrawable(drawable: Drawable): boolean;
|
|
26
26
|
abstract markerToTheTop(marker: Marker): void;
|
|
27
|
-
abstract restoreMarkerZIndex(marker: Marker): void;
|
|
28
27
|
abstract isMapDragged(): boolean;
|
|
29
28
|
abstract setMapDragged(value: boolean): void;
|
|
30
29
|
abstract setMarkerZIndex(marker: Marker, zIndex: number): void;
|
|
@@ -131,6 +131,12 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
131
131
|
x: 0,
|
|
132
132
|
y: 0
|
|
133
133
|
}); // --------------------------------------------------------------------------
|
|
134
|
+
// Event Handler Refs (클로저 문제 방지)
|
|
135
|
+
// --------------------------------------------------------------------------
|
|
136
|
+
|
|
137
|
+
var onClickRef = React.useRef(onClick);
|
|
138
|
+
var onMouseOverRef = React.useRef(onMouseOver);
|
|
139
|
+
var onMouseOutRef = React.useRef(onMouseOut); // --------------------------------------------------------------------------
|
|
134
140
|
// Performance Refs (캐싱 & 최적화)
|
|
135
141
|
// --------------------------------------------------------------------------
|
|
136
142
|
|
|
@@ -420,9 +426,16 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
420
426
|
|
|
421
427
|
|
|
422
428
|
var doRenderEvent = function () {
|
|
423
|
-
if (!renderEvent) return;
|
|
424
429
|
var layer = eventLayerRef.current;
|
|
425
|
-
if (!layer) return; //
|
|
430
|
+
if (!layer) return; // 이벤트 핸들러가 없으면 Event Layer를 완전히 지움
|
|
431
|
+
|
|
432
|
+
if (!onClickRef.current && !onMouseOverRef.current && !onMouseOutRef.current) {
|
|
433
|
+
layer.destroyChildren();
|
|
434
|
+
layer.batchDraw();
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
if (!renderEvent) return; // 🔥 Shape 재사용: 이미 존재하면 재사용, 없으면 생성
|
|
426
439
|
|
|
427
440
|
var shape = layer.findOne('.event-render-shape');
|
|
428
441
|
|
|
@@ -620,6 +633,7 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
620
633
|
|
|
621
634
|
|
|
622
635
|
var setHovered = function (data) {
|
|
636
|
+
if (!onMouseOverRef.current && !onMouseOutRef.current) return;
|
|
623
637
|
hoveredItemRef.current = data;
|
|
624
638
|
|
|
625
639
|
if (draggingRef.current) {
|
|
@@ -644,7 +658,8 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
644
658
|
|
|
645
659
|
|
|
646
660
|
var handleLocalClick = function (data) {
|
|
647
|
-
// 1. 선택 상태 업데이트
|
|
661
|
+
if (!onClickRef.current) return; // 1. 선택 상태 업데이트
|
|
662
|
+
|
|
648
663
|
if (enableMultiSelect) {
|
|
649
664
|
// 다중 선택: Set과 Map 동시 업데이트
|
|
650
665
|
var newSelected = new Set(selectedIdsRef.current);
|
|
@@ -694,6 +709,7 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
694
709
|
var handleClick = function (event) {
|
|
695
710
|
var _a;
|
|
696
711
|
|
|
712
|
+
if (!onClickRef.current) return;
|
|
697
713
|
if (context$1 || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
|
|
698
714
|
|
|
699
715
|
try {
|
|
@@ -702,7 +718,7 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
702
718
|
|
|
703
719
|
if (data) {
|
|
704
720
|
handleLocalClick(data);
|
|
705
|
-
|
|
721
|
+
onClickRef.current(data, selectedIdsRef.current);
|
|
706
722
|
}
|
|
707
723
|
} catch (error) {
|
|
708
724
|
console.error('[WoongKonvaMarker] handleClick error:', error);
|
|
@@ -716,6 +732,7 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
716
732
|
var handleMouseMove = function (event) {
|
|
717
733
|
var _a;
|
|
718
734
|
|
|
735
|
+
if (!onMouseOverRef.current && !onMouseOutRef.current) return;
|
|
719
736
|
if (context$1 || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
|
|
720
737
|
|
|
721
738
|
try {
|
|
@@ -725,8 +742,8 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
725
742
|
|
|
726
743
|
if (prevHovered !== hoveredItem) {
|
|
727
744
|
setHovered(hoveredItem);
|
|
728
|
-
if (prevHovered &&
|
|
729
|
-
if (hoveredItem &&
|
|
745
|
+
if (prevHovered && onMouseOutRef.current) onMouseOutRef.current(prevHovered);
|
|
746
|
+
if (hoveredItem && onMouseOverRef.current) onMouseOverRef.current(hoveredItem);
|
|
730
747
|
}
|
|
731
748
|
} catch (error) {
|
|
732
749
|
console.error('[WoongKonvaMarker] handleMouseMove error:', error);
|
|
@@ -756,6 +773,7 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
756
773
|
|
|
757
774
|
|
|
758
775
|
var handleMouseLeave = function () {
|
|
776
|
+
if (!onMouseOverRef.current && !onMouseOutRef.current) return;
|
|
759
777
|
var prevHovered = hoveredItemRef.current;
|
|
760
778
|
|
|
761
779
|
if (prevHovered) {
|
|
@@ -763,8 +781,8 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
763
781
|
controller.setMapCursor('grab');
|
|
764
782
|
doRenderEvent();
|
|
765
783
|
|
|
766
|
-
if (
|
|
767
|
-
|
|
784
|
+
if (onMouseOutRef.current) {
|
|
785
|
+
onMouseOutRef.current(prevHovered);
|
|
768
786
|
}
|
|
769
787
|
}
|
|
770
788
|
}; // --------------------------------------------------------------------------
|
|
@@ -865,13 +883,20 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
865
883
|
controller.addEventListener('IDLE', handleIdle);
|
|
866
884
|
controller.addEventListener('ZOOMSTART', handleZoomStart);
|
|
867
885
|
controller.addEventListener('ZOOM_CHANGED', handleZoomEnd);
|
|
868
|
-
controller.addEventListener('CENTER_CHANGED', handleCenterChanged);
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
886
|
+
controller.addEventListener('CENTER_CHANGED', handleCenterChanged); // onClick이 있을 때만 CLICK 이벤트 등록
|
|
887
|
+
|
|
888
|
+
if (onClick) {
|
|
889
|
+
controller.addEventListener('CLICK', handleClick);
|
|
890
|
+
} // onMouseOver/onMouseOut이 있을 때만 MOUSEMOVE 이벤트 등록
|
|
891
|
+
|
|
892
|
+
|
|
893
|
+
if (onMouseOver || onMouseOut) {
|
|
894
|
+
controller.addEventListener('MOUSEMOVE', handleMouseMove);
|
|
895
|
+
mapDiv.addEventListener('mouseleave', handleMouseLeave);
|
|
896
|
+
}
|
|
873
897
|
|
|
874
|
-
|
|
898
|
+
controller.addEventListener('DRAGSTART', handleDragStart);
|
|
899
|
+
controller.addEventListener('DRAGEND', handleDragEnd);
|
|
875
900
|
renderAllImmediate(); // Context 사용 시 컴포넌트 등록 (다중 인스턴스 관리)
|
|
876
901
|
|
|
877
902
|
var componentInstance = null;
|
|
@@ -909,11 +934,18 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
909
934
|
controller.removeEventListener('ZOOMSTART', handleZoomStart);
|
|
910
935
|
controller.removeEventListener('ZOOM_CHANGED', handleZoomEnd);
|
|
911
936
|
controller.removeEventListener('CENTER_CHANGED', handleCenterChanged);
|
|
912
|
-
|
|
913
|
-
|
|
937
|
+
|
|
938
|
+
if (onClick) {
|
|
939
|
+
controller.removeEventListener('CLICK', handleClick);
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
if (onMouseOver || onMouseOut) {
|
|
943
|
+
controller.removeEventListener('MOUSEMOVE', handleMouseMove);
|
|
944
|
+
mapDiv.removeEventListener('mouseleave', handleMouseLeave);
|
|
945
|
+
}
|
|
946
|
+
|
|
914
947
|
controller.removeEventListener('DRAGSTART', handleDragStart);
|
|
915
|
-
controller.removeEventListener('DRAGEND', handleDragEnd);
|
|
916
|
-
mapDiv.removeEventListener('mouseleave', handleMouseLeave); // Context 정리
|
|
948
|
+
controller.removeEventListener('DRAGEND', handleDragEnd); // Context 정리
|
|
917
949
|
|
|
918
950
|
if (context$1 && componentInstance) {
|
|
919
951
|
context$1.unregisterComponent(componentInstance);
|
|
@@ -930,6 +962,18 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
930
962
|
spatialIndexRef.current.clear();
|
|
931
963
|
};
|
|
932
964
|
}, []); // --------------------------------------------------------------------------
|
|
965
|
+
// Lifecycle: 이벤트 핸들러 ref 동기화
|
|
966
|
+
// --------------------------------------------------------------------------
|
|
967
|
+
|
|
968
|
+
React.useEffect(function () {
|
|
969
|
+
onClickRef.current = onClick;
|
|
970
|
+
onMouseOverRef.current = onMouseOver;
|
|
971
|
+
onMouseOutRef.current = onMouseOut; // Event Layer 다시 렌더링 (이벤트 핸들러 변경 반영)
|
|
972
|
+
|
|
973
|
+
if (stageRef.current) {
|
|
974
|
+
doRenderEvent();
|
|
975
|
+
}
|
|
976
|
+
}, [onClick, onMouseOver, onMouseOut]); // --------------------------------------------------------------------------
|
|
933
977
|
// Lifecycle: 외부 selectedItems 동기화
|
|
934
978
|
// --------------------------------------------------------------------------
|
|
935
979
|
|
|
@@ -1020,14 +1064,23 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
1020
1064
|
|
|
1021
1065
|
renderAllImmediate();
|
|
1022
1066
|
}, [markers]);
|
|
1067
|
+
var hasAnyHandler = onClick || onMouseOver || onMouseOut;
|
|
1023
1068
|
return reactDom.createPortal(React__default["default"].createElement("div", {
|
|
1069
|
+
style: {
|
|
1070
|
+
zIndex: options.zIndex !== undefined ? options.zIndex + 1 : 9999,
|
|
1071
|
+
position: 'absolute',
|
|
1072
|
+
width: '100%',
|
|
1073
|
+
height: '100%',
|
|
1074
|
+
pointerEvents: hasAnyHandler ? 'none' : 'auto'
|
|
1075
|
+
}
|
|
1076
|
+
}, React__default["default"].createElement("div", {
|
|
1024
1077
|
ref: containerRef,
|
|
1025
1078
|
style: {
|
|
1026
1079
|
position: 'absolute',
|
|
1027
1080
|
width: '100%',
|
|
1028
1081
|
height: '100%'
|
|
1029
1082
|
}
|
|
1030
|
-
}), divElement);
|
|
1083
|
+
})), divElement);
|
|
1031
1084
|
};
|
|
1032
1085
|
/**
|
|
1033
1086
|
* 🔥 React.memo 최적화: 마커 배열과 selectedItems 변경 체크
|
|
@@ -1035,33 +1088,29 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
1035
1088
|
* 비교 전략:
|
|
1036
1089
|
* 1. markers 배열 비교
|
|
1037
1090
|
* 2. selectedItems 배열 비교 (외부 제어)
|
|
1091
|
+
* 3. 이벤트 핸들러 비교 (onClick, onMouseOver, onMouseOut)
|
|
1038
1092
|
*
|
|
1039
1093
|
* 주의: JSON.stringify() 사용 금지! (매우 느림)
|
|
1040
1094
|
*/
|
|
1041
1095
|
|
|
1042
1096
|
|
|
1043
1097
|
var WoongKonvaMarker = React__default["default"].memo(WoongKonvaMarkerComponent, function (prevProps, nextProps) {
|
|
1044
|
-
//
|
|
1045
|
-
|
|
1046
|
-
var nextMarkers = nextProps.markers; // 참조가 같으면 스킵
|
|
1098
|
+
// markers 배열 비교 (참조 비교)
|
|
1099
|
+
if (prevProps.markers !== nextProps.markers) return false; // selectedItems 배열 비교 (참조 비교)
|
|
1047
1100
|
|
|
1048
|
-
if (
|
|
1049
|
-
// 길이가 다르면 변경됨
|
|
1050
|
-
if (prevMarkers.length !== nextMarkers.length) return false; // 각 마커의 ID 비교
|
|
1101
|
+
if (prevProps.selectedItems !== nextProps.selectedItems) return false; // selectedItem 비교 (참조 비교)
|
|
1051
1102
|
|
|
1052
|
-
|
|
1053
|
-
if (prevMarkers[i].id !== nextMarkers[i].id) {
|
|
1054
|
-
return false; // 변경됨 → 리렌더링
|
|
1055
|
-
}
|
|
1056
|
-
}
|
|
1057
|
-
} // 2. selectedItems 비교 (참조만 비교)
|
|
1103
|
+
if (prevProps.selectedItem !== nextProps.selectedItem) return false; // 이벤트 핸들러 비교 (참조 비교)
|
|
1058
1104
|
|
|
1105
|
+
if (prevProps.onClick !== nextProps.onClick) return false;
|
|
1106
|
+
if (prevProps.onMouseOver !== nextProps.onMouseOver) return false;
|
|
1107
|
+
if (prevProps.onMouseOut !== nextProps.onMouseOut) return false; // renderBase, renderEvent 등 함수 비교
|
|
1059
1108
|
|
|
1060
|
-
if (prevProps.
|
|
1061
|
-
|
|
1062
|
-
|
|
1109
|
+
if (prevProps.renderBase !== nextProps.renderBase) return false;
|
|
1110
|
+
if (prevProps.renderEvent !== nextProps.renderEvent) return false;
|
|
1111
|
+
if (prevProps.renderAnimation !== nextProps.renderAnimation) return false; // 나머지 props는 변경되지 않는다고 가정
|
|
1063
1112
|
|
|
1064
|
-
return true;
|
|
1113
|
+
return true;
|
|
1065
1114
|
});
|
|
1066
1115
|
|
|
1067
1116
|
Object.defineProperty(exports, 'CanvasDataType', {
|
|
@@ -172,7 +172,7 @@ function MapMarkerWrapper(_a) {
|
|
|
172
172
|
var onMouseOverHandler = function (e) {
|
|
173
173
|
var _a;
|
|
174
174
|
|
|
175
|
-
var marker = markerRef.current;
|
|
175
|
+
var marker = markerRef.current; //console.log('onMouseOverHandler', marker);
|
|
176
176
|
|
|
177
177
|
if (marker) {
|
|
178
178
|
var mouseOverHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseover');
|
|
@@ -185,25 +185,6 @@ function MapMarkerWrapper(_a) {
|
|
|
185
185
|
|
|
186
186
|
next && topOnHover && controller.markerToTheTop(marker);
|
|
187
187
|
}
|
|
188
|
-
}; // 20251014 | 장한별 | mouseleave 이벤트 추가, 마우스가 마커 위에서 떠날 때 원래 zindex 를 복구하기 위함
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
var onMouseLeaveHandler = function (e) {
|
|
192
|
-
var _a;
|
|
193
|
-
|
|
194
|
-
var marker = markerRef.current;
|
|
195
|
-
|
|
196
|
-
if (marker) {
|
|
197
|
-
var mouseOutHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseout');
|
|
198
|
-
var next = true;
|
|
199
|
-
|
|
200
|
-
if (mouseOutHandler) {
|
|
201
|
-
var hasNext = mouseOutHandler(e);
|
|
202
|
-
hasNext !== undefined && (next = hasNext);
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
next && topOnHover && controller.restoreMarkerZIndex(marker);
|
|
206
|
-
}
|
|
207
188
|
}; //create object
|
|
208
189
|
|
|
209
190
|
|
|
@@ -221,12 +202,10 @@ function MapMarkerWrapper(_a) {
|
|
|
221
202
|
}); //드래그 여부 초기화를 먼저 수행하기 위해 capture : true 처리
|
|
222
203
|
|
|
223
204
|
divElement.addEventListener('mouseover', onMouseOverHandler);
|
|
224
|
-
divElement.addEventListener('mouseleave', onMouseLeaveHandler);
|
|
225
205
|
return function () {
|
|
226
206
|
divElement.removeEventListener('click', onClickHandler);
|
|
227
207
|
divElement.removeEventListener('mousedown', onMousedownHandler);
|
|
228
208
|
divElement.removeEventListener('mouseover', onMouseOverHandler);
|
|
229
|
-
divElement.removeEventListener('mouseleave', onMouseLeaveHandler);
|
|
230
209
|
|
|
231
210
|
if (markerRef.current) {
|
|
232
211
|
controller.clearDrawable(markerRef.current);
|
|
@@ -28,7 +28,6 @@ export declare class GoogleMintMapController extends MintMapController {
|
|
|
28
28
|
private getMaxZIndex;
|
|
29
29
|
setMarkerZIndex(marker: Marker, zIndex: number): void;
|
|
30
30
|
markerToTheTop(marker: Marker): void;
|
|
31
|
-
restoreMarkerZIndex(marker: Marker): void;
|
|
32
31
|
clearDrawable(drawable: Drawable): boolean;
|
|
33
32
|
private dragged;
|
|
34
33
|
isMapDragged(): boolean;
|
|
@@ -340,10 +340,6 @@ function (_super) {
|
|
|
340
340
|
}
|
|
341
341
|
};
|
|
342
342
|
|
|
343
|
-
GoogleMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Google Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
|
|
344
|
-
// 이 기능은 Naver Maps에서만 사용 가능합니다.
|
|
345
|
-
};
|
|
346
|
-
|
|
347
343
|
GoogleMintMapController.prototype.clearDrawable = function (drawable) {
|
|
348
344
|
if (drawable && drawable.native) {
|
|
349
345
|
if (drawable.native instanceof google.maps.Marker || drawable.native instanceof google.maps.Polygon || drawable.native instanceof google.maps.Polyline) {
|
|
@@ -31,7 +31,6 @@ export declare class KakaoMintMapController extends MintMapController {
|
|
|
31
31
|
private getMaxZIndex;
|
|
32
32
|
setMarkerZIndex(marker: Marker, zIndex: number): void;
|
|
33
33
|
markerToTheTop(marker: Marker): void;
|
|
34
|
-
restoreMarkerZIndex(marker: Marker): void;
|
|
35
34
|
clearDrawable(drawable: Drawable): boolean;
|
|
36
35
|
private dragged;
|
|
37
36
|
isMapDragged(): boolean;
|
|
@@ -348,10 +348,6 @@ function (_super) {
|
|
|
348
348
|
}
|
|
349
349
|
};
|
|
350
350
|
|
|
351
|
-
KakaoMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Kakao Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
|
|
352
|
-
// 이 기능은 Naver Maps에서만 사용 가능합니다.
|
|
353
|
-
};
|
|
354
|
-
|
|
355
351
|
KakaoMintMapController.prototype.clearDrawable = function (drawable) {
|
|
356
352
|
var _this = this;
|
|
357
353
|
|
|
@@ -27,12 +27,9 @@ export declare class NaverMintMapController extends MintMapController {
|
|
|
27
27
|
createMarker(marker: Marker): void;
|
|
28
28
|
updateMarker(marker: Marker, options: MarkerOptions): void;
|
|
29
29
|
private markerMaxZIndex;
|
|
30
|
-
private markerOriginalZIndex;
|
|
31
30
|
private getMaxZIndex;
|
|
32
|
-
private getCurrentZIndex;
|
|
33
31
|
setMarkerZIndex(marker: Marker, zIndex: number): void;
|
|
34
32
|
markerToTheTop(marker: Marker): void;
|
|
35
|
-
restoreMarkerZIndex(marker: Marker): void;
|
|
36
33
|
clearDrawable(drawable: Drawable): boolean;
|
|
37
34
|
private dragged;
|
|
38
35
|
isMapDragged(): boolean;
|
|
@@ -340,54 +340,20 @@ function (_super) {
|
|
|
340
340
|
}
|
|
341
341
|
};
|
|
342
342
|
|
|
343
|
-
NaverMintMapController.prototype.getCurrentZIndex = function (marker) {
|
|
344
|
-
if (this.map && marker.element && marker.element instanceof HTMLElement) {
|
|
345
|
-
var parent_1 = marker.element.parentElement;
|
|
346
|
-
|
|
347
|
-
if (parent_1 && parent_1.style.zIndex) {
|
|
348
|
-
var zIndex = Number(parent_1.style.zIndex);
|
|
349
|
-
return isNaN(zIndex) ? undefined : zIndex;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
return undefined;
|
|
354
|
-
};
|
|
355
|
-
|
|
356
343
|
NaverMintMapController.prototype.setMarkerZIndex = function (marker, zIndex) {
|
|
357
344
|
if (this.map && marker.element && marker.element instanceof HTMLElement) {
|
|
358
|
-
var
|
|
345
|
+
var parent_1 = marker.element.parentElement;
|
|
359
346
|
|
|
360
|
-
if (
|
|
361
|
-
|
|
347
|
+
if (parent_1) {
|
|
348
|
+
parent_1.style.zIndex = String(zIndex);
|
|
362
349
|
}
|
|
363
350
|
}
|
|
364
351
|
};
|
|
365
352
|
|
|
366
353
|
NaverMintMapController.prototype.markerToTheTop = function (marker) {
|
|
367
|
-
// 이미 최상위로 올라간 상태면 (원래 zIndex가 이미 저장됨) 중복 실행 방지
|
|
368
|
-
if (this.markerOriginalZIndex !== undefined) {
|
|
369
|
-
return;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
var currentZIndex = this.getCurrentZIndex(marker); // undefined면 null로 저장 (원래 zIndex가 없었음을 표시)
|
|
373
|
-
|
|
374
|
-
this.markerOriginalZIndex = currentZIndex !== undefined ? currentZIndex : null;
|
|
375
354
|
this.setMarkerZIndex(marker, this.getMaxZIndex(1));
|
|
376
355
|
};
|
|
377
356
|
|
|
378
|
-
NaverMintMapController.prototype.restoreMarkerZIndex = function (marker) {
|
|
379
|
-
if (this.markerOriginalZIndex !== undefined) {
|
|
380
|
-
if (this.markerOriginalZIndex === null) {
|
|
381
|
-
// 원래 zIndex가 없었으면 제거 (또는 초기값 0으로)
|
|
382
|
-
this.setMarkerZIndex(marker, 0);
|
|
383
|
-
} else {
|
|
384
|
-
this.setMarkerZIndex(marker, this.markerOriginalZIndex);
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
this.markerOriginalZIndex = undefined;
|
|
388
|
-
}
|
|
389
|
-
};
|
|
390
|
-
|
|
391
357
|
NaverMintMapController.prototype.clearDrawable = function (drawable) {
|
|
392
358
|
var _a;
|
|
393
359
|
|
package/dist/index.es.js
CHANGED
|
@@ -2750,7 +2750,7 @@ function MapMarkerWrapper(_a) {
|
|
|
2750
2750
|
var onMouseOverHandler = function (e) {
|
|
2751
2751
|
var _a;
|
|
2752
2752
|
|
|
2753
|
-
var marker = markerRef.current;
|
|
2753
|
+
var marker = markerRef.current; //console.log('onMouseOverHandler', marker);
|
|
2754
2754
|
|
|
2755
2755
|
if (marker) {
|
|
2756
2756
|
var mouseOverHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseover');
|
|
@@ -2763,25 +2763,6 @@ function MapMarkerWrapper(_a) {
|
|
|
2763
2763
|
|
|
2764
2764
|
next && topOnHover && controller.markerToTheTop(marker);
|
|
2765
2765
|
}
|
|
2766
|
-
}; // 20251014 | 장한별 | mouseleave 이벤트 추가, 마우스가 마커 위에서 떠날 때 원래 zindex 를 복구하기 위함
|
|
2767
|
-
|
|
2768
|
-
|
|
2769
|
-
var onMouseLeaveHandler = function (e) {
|
|
2770
|
-
var _a;
|
|
2771
|
-
|
|
2772
|
-
var marker = markerRef.current;
|
|
2773
|
-
|
|
2774
|
-
if (marker) {
|
|
2775
|
-
var mouseOutHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseout');
|
|
2776
|
-
var next = true;
|
|
2777
|
-
|
|
2778
|
-
if (mouseOutHandler) {
|
|
2779
|
-
var hasNext = mouseOutHandler(e);
|
|
2780
|
-
hasNext !== undefined && (next = hasNext);
|
|
2781
|
-
}
|
|
2782
|
-
|
|
2783
|
-
next && topOnHover && controller.restoreMarkerZIndex(marker);
|
|
2784
|
-
}
|
|
2785
2766
|
}; //create object
|
|
2786
2767
|
|
|
2787
2768
|
|
|
@@ -2799,12 +2780,10 @@ function MapMarkerWrapper(_a) {
|
|
|
2799
2780
|
}); //드래그 여부 초기화를 먼저 수행하기 위해 capture : true 처리
|
|
2800
2781
|
|
|
2801
2782
|
divElement.addEventListener('mouseover', onMouseOverHandler);
|
|
2802
|
-
divElement.addEventListener('mouseleave', onMouseLeaveHandler);
|
|
2803
2783
|
return function () {
|
|
2804
2784
|
divElement.removeEventListener('click', onClickHandler);
|
|
2805
2785
|
divElement.removeEventListener('mousedown', onMousedownHandler);
|
|
2806
2786
|
divElement.removeEventListener('mouseover', onMouseOverHandler);
|
|
2807
|
-
divElement.removeEventListener('mouseleave', onMouseLeaveHandler);
|
|
2808
2787
|
|
|
2809
2788
|
if (markerRef.current) {
|
|
2810
2789
|
controller.clearDrawable(markerRef.current);
|
|
@@ -5481,6 +5460,12 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
5481
5460
|
x: 0,
|
|
5482
5461
|
y: 0
|
|
5483
5462
|
}); // --------------------------------------------------------------------------
|
|
5463
|
+
// Event Handler Refs (클로저 문제 방지)
|
|
5464
|
+
// --------------------------------------------------------------------------
|
|
5465
|
+
|
|
5466
|
+
var onClickRef = useRef(onClick);
|
|
5467
|
+
var onMouseOverRef = useRef(onMouseOver);
|
|
5468
|
+
var onMouseOutRef = useRef(onMouseOut); // --------------------------------------------------------------------------
|
|
5484
5469
|
// Performance Refs (캐싱 & 최적화)
|
|
5485
5470
|
// --------------------------------------------------------------------------
|
|
5486
5471
|
|
|
@@ -5770,9 +5755,16 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
5770
5755
|
|
|
5771
5756
|
|
|
5772
5757
|
var doRenderEvent = function () {
|
|
5773
|
-
if (!renderEvent) return;
|
|
5774
5758
|
var layer = eventLayerRef.current;
|
|
5775
|
-
if (!layer) return; //
|
|
5759
|
+
if (!layer) return; // 이벤트 핸들러가 없으면 Event Layer를 완전히 지움
|
|
5760
|
+
|
|
5761
|
+
if (!onClickRef.current && !onMouseOverRef.current && !onMouseOutRef.current) {
|
|
5762
|
+
layer.destroyChildren();
|
|
5763
|
+
layer.batchDraw();
|
|
5764
|
+
return;
|
|
5765
|
+
}
|
|
5766
|
+
|
|
5767
|
+
if (!renderEvent) return; // 🔥 Shape 재사용: 이미 존재하면 재사용, 없으면 생성
|
|
5776
5768
|
|
|
5777
5769
|
var shape = layer.findOne('.event-render-shape');
|
|
5778
5770
|
|
|
@@ -5970,6 +5962,7 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
5970
5962
|
|
|
5971
5963
|
|
|
5972
5964
|
var setHovered = function (data) {
|
|
5965
|
+
if (!onMouseOverRef.current && !onMouseOutRef.current) return;
|
|
5973
5966
|
hoveredItemRef.current = data;
|
|
5974
5967
|
|
|
5975
5968
|
if (draggingRef.current) {
|
|
@@ -5994,7 +5987,8 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
5994
5987
|
|
|
5995
5988
|
|
|
5996
5989
|
var handleLocalClick = function (data) {
|
|
5997
|
-
// 1. 선택 상태 업데이트
|
|
5990
|
+
if (!onClickRef.current) return; // 1. 선택 상태 업데이트
|
|
5991
|
+
|
|
5998
5992
|
if (enableMultiSelect) {
|
|
5999
5993
|
// 다중 선택: Set과 Map 동시 업데이트
|
|
6000
5994
|
var newSelected = new Set(selectedIdsRef.current);
|
|
@@ -6044,6 +6038,7 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
6044
6038
|
var handleClick = function (event) {
|
|
6045
6039
|
var _a;
|
|
6046
6040
|
|
|
6041
|
+
if (!onClickRef.current) return;
|
|
6047
6042
|
if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
|
|
6048
6043
|
|
|
6049
6044
|
try {
|
|
@@ -6052,7 +6047,7 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
6052
6047
|
|
|
6053
6048
|
if (data) {
|
|
6054
6049
|
handleLocalClick(data);
|
|
6055
|
-
|
|
6050
|
+
onClickRef.current(data, selectedIdsRef.current);
|
|
6056
6051
|
}
|
|
6057
6052
|
} catch (error) {
|
|
6058
6053
|
console.error('[WoongKonvaMarker] handleClick error:', error);
|
|
@@ -6066,6 +6061,7 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
6066
6061
|
var handleMouseMove = function (event) {
|
|
6067
6062
|
var _a;
|
|
6068
6063
|
|
|
6064
|
+
if (!onMouseOverRef.current && !onMouseOutRef.current) return;
|
|
6069
6065
|
if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
|
|
6070
6066
|
|
|
6071
6067
|
try {
|
|
@@ -6075,8 +6071,8 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
6075
6071
|
|
|
6076
6072
|
if (prevHovered !== hoveredItem) {
|
|
6077
6073
|
setHovered(hoveredItem);
|
|
6078
|
-
if (prevHovered &&
|
|
6079
|
-
if (hoveredItem &&
|
|
6074
|
+
if (prevHovered && onMouseOutRef.current) onMouseOutRef.current(prevHovered);
|
|
6075
|
+
if (hoveredItem && onMouseOverRef.current) onMouseOverRef.current(hoveredItem);
|
|
6080
6076
|
}
|
|
6081
6077
|
} catch (error) {
|
|
6082
6078
|
console.error('[WoongKonvaMarker] handleMouseMove error:', error);
|
|
@@ -6106,6 +6102,7 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
6106
6102
|
|
|
6107
6103
|
|
|
6108
6104
|
var handleMouseLeave = function () {
|
|
6105
|
+
if (!onMouseOverRef.current && !onMouseOutRef.current) return;
|
|
6109
6106
|
var prevHovered = hoveredItemRef.current;
|
|
6110
6107
|
|
|
6111
6108
|
if (prevHovered) {
|
|
@@ -6113,8 +6110,8 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
6113
6110
|
controller.setMapCursor('grab');
|
|
6114
6111
|
doRenderEvent();
|
|
6115
6112
|
|
|
6116
|
-
if (
|
|
6117
|
-
|
|
6113
|
+
if (onMouseOutRef.current) {
|
|
6114
|
+
onMouseOutRef.current(prevHovered);
|
|
6118
6115
|
}
|
|
6119
6116
|
}
|
|
6120
6117
|
}; // --------------------------------------------------------------------------
|
|
@@ -6215,13 +6212,20 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
6215
6212
|
controller.addEventListener('IDLE', handleIdle);
|
|
6216
6213
|
controller.addEventListener('ZOOMSTART', handleZoomStart);
|
|
6217
6214
|
controller.addEventListener('ZOOM_CHANGED', handleZoomEnd);
|
|
6218
|
-
controller.addEventListener('CENTER_CHANGED', handleCenterChanged);
|
|
6219
|
-
|
|
6220
|
-
|
|
6221
|
-
|
|
6222
|
-
|
|
6215
|
+
controller.addEventListener('CENTER_CHANGED', handleCenterChanged); // onClick이 있을 때만 CLICK 이벤트 등록
|
|
6216
|
+
|
|
6217
|
+
if (onClick) {
|
|
6218
|
+
controller.addEventListener('CLICK', handleClick);
|
|
6219
|
+
} // onMouseOver/onMouseOut이 있을 때만 MOUSEMOVE 이벤트 등록
|
|
6220
|
+
|
|
6223
6221
|
|
|
6224
|
-
|
|
6222
|
+
if (onMouseOver || onMouseOut) {
|
|
6223
|
+
controller.addEventListener('MOUSEMOVE', handleMouseMove);
|
|
6224
|
+
mapDiv.addEventListener('mouseleave', handleMouseLeave);
|
|
6225
|
+
}
|
|
6226
|
+
|
|
6227
|
+
controller.addEventListener('DRAGSTART', handleDragStart);
|
|
6228
|
+
controller.addEventListener('DRAGEND', handleDragEnd);
|
|
6225
6229
|
renderAllImmediate(); // Context 사용 시 컴포넌트 등록 (다중 인스턴스 관리)
|
|
6226
6230
|
|
|
6227
6231
|
var componentInstance = null;
|
|
@@ -6259,11 +6263,18 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
6259
6263
|
controller.removeEventListener('ZOOMSTART', handleZoomStart);
|
|
6260
6264
|
controller.removeEventListener('ZOOM_CHANGED', handleZoomEnd);
|
|
6261
6265
|
controller.removeEventListener('CENTER_CHANGED', handleCenterChanged);
|
|
6262
|
-
|
|
6263
|
-
|
|
6266
|
+
|
|
6267
|
+
if (onClick) {
|
|
6268
|
+
controller.removeEventListener('CLICK', handleClick);
|
|
6269
|
+
}
|
|
6270
|
+
|
|
6271
|
+
if (onMouseOver || onMouseOut) {
|
|
6272
|
+
controller.removeEventListener('MOUSEMOVE', handleMouseMove);
|
|
6273
|
+
mapDiv.removeEventListener('mouseleave', handleMouseLeave);
|
|
6274
|
+
}
|
|
6275
|
+
|
|
6264
6276
|
controller.removeEventListener('DRAGSTART', handleDragStart);
|
|
6265
|
-
controller.removeEventListener('DRAGEND', handleDragEnd);
|
|
6266
|
-
mapDiv.removeEventListener('mouseleave', handleMouseLeave); // Context 정리
|
|
6277
|
+
controller.removeEventListener('DRAGEND', handleDragEnd); // Context 정리
|
|
6267
6278
|
|
|
6268
6279
|
if (context && componentInstance) {
|
|
6269
6280
|
context.unregisterComponent(componentInstance);
|
|
@@ -6280,6 +6291,18 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
6280
6291
|
spatialIndexRef.current.clear();
|
|
6281
6292
|
};
|
|
6282
6293
|
}, []); // --------------------------------------------------------------------------
|
|
6294
|
+
// Lifecycle: 이벤트 핸들러 ref 동기화
|
|
6295
|
+
// --------------------------------------------------------------------------
|
|
6296
|
+
|
|
6297
|
+
useEffect(function () {
|
|
6298
|
+
onClickRef.current = onClick;
|
|
6299
|
+
onMouseOverRef.current = onMouseOver;
|
|
6300
|
+
onMouseOutRef.current = onMouseOut; // Event Layer 다시 렌더링 (이벤트 핸들러 변경 반영)
|
|
6301
|
+
|
|
6302
|
+
if (stageRef.current) {
|
|
6303
|
+
doRenderEvent();
|
|
6304
|
+
}
|
|
6305
|
+
}, [onClick, onMouseOver, onMouseOut]); // --------------------------------------------------------------------------
|
|
6283
6306
|
// Lifecycle: 외부 selectedItems 동기화
|
|
6284
6307
|
// --------------------------------------------------------------------------
|
|
6285
6308
|
|
|
@@ -6370,14 +6393,23 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
6370
6393
|
|
|
6371
6394
|
renderAllImmediate();
|
|
6372
6395
|
}, [markers]);
|
|
6396
|
+
var hasAnyHandler = onClick || onMouseOver || onMouseOut;
|
|
6373
6397
|
return createPortal(React.createElement("div", {
|
|
6398
|
+
style: {
|
|
6399
|
+
zIndex: options.zIndex !== undefined ? options.zIndex + 1 : 9999,
|
|
6400
|
+
position: 'absolute',
|
|
6401
|
+
width: '100%',
|
|
6402
|
+
height: '100%',
|
|
6403
|
+
pointerEvents: hasAnyHandler ? 'none' : 'auto'
|
|
6404
|
+
}
|
|
6405
|
+
}, React.createElement("div", {
|
|
6374
6406
|
ref: containerRef,
|
|
6375
6407
|
style: {
|
|
6376
6408
|
position: 'absolute',
|
|
6377
6409
|
width: '100%',
|
|
6378
6410
|
height: '100%'
|
|
6379
6411
|
}
|
|
6380
|
-
}), divElement);
|
|
6412
|
+
})), divElement);
|
|
6381
6413
|
};
|
|
6382
6414
|
/**
|
|
6383
6415
|
* 🔥 React.memo 최적화: 마커 배열과 selectedItems 변경 체크
|
|
@@ -6385,33 +6417,29 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
6385
6417
|
* 비교 전략:
|
|
6386
6418
|
* 1. markers 배열 비교
|
|
6387
6419
|
* 2. selectedItems 배열 비교 (외부 제어)
|
|
6420
|
+
* 3. 이벤트 핸들러 비교 (onClick, onMouseOver, onMouseOut)
|
|
6388
6421
|
*
|
|
6389
6422
|
* 주의: JSON.stringify() 사용 금지! (매우 느림)
|
|
6390
6423
|
*/
|
|
6391
6424
|
|
|
6392
6425
|
|
|
6393
6426
|
var WoongKonvaMarker = React.memo(WoongKonvaMarkerComponent, function (prevProps, nextProps) {
|
|
6394
|
-
//
|
|
6395
|
-
|
|
6396
|
-
var nextMarkers = nextProps.markers; // 참조가 같으면 스킵
|
|
6427
|
+
// markers 배열 비교 (참조 비교)
|
|
6428
|
+
if (prevProps.markers !== nextProps.markers) return false; // selectedItems 배열 비교 (참조 비교)
|
|
6397
6429
|
|
|
6398
|
-
if (
|
|
6399
|
-
// 길이가 다르면 변경됨
|
|
6400
|
-
if (prevMarkers.length !== nextMarkers.length) return false; // 각 마커의 ID 비교
|
|
6430
|
+
if (prevProps.selectedItems !== nextProps.selectedItems) return false; // selectedItem 비교 (참조 비교)
|
|
6401
6431
|
|
|
6402
|
-
|
|
6403
|
-
if (prevMarkers[i].id !== nextMarkers[i].id) {
|
|
6404
|
-
return false; // 변경됨 → 리렌더링
|
|
6405
|
-
}
|
|
6406
|
-
}
|
|
6407
|
-
} // 2. selectedItems 비교 (참조만 비교)
|
|
6432
|
+
if (prevProps.selectedItem !== nextProps.selectedItem) return false; // 이벤트 핸들러 비교 (참조 비교)
|
|
6408
6433
|
|
|
6434
|
+
if (prevProps.onClick !== nextProps.onClick) return false;
|
|
6435
|
+
if (prevProps.onMouseOver !== nextProps.onMouseOver) return false;
|
|
6436
|
+
if (prevProps.onMouseOut !== nextProps.onMouseOut) return false; // renderBase, renderEvent 등 함수 비교
|
|
6409
6437
|
|
|
6410
|
-
if (prevProps.
|
|
6411
|
-
|
|
6412
|
-
|
|
6438
|
+
if (prevProps.renderBase !== nextProps.renderBase) return false;
|
|
6439
|
+
if (prevProps.renderEvent !== nextProps.renderEvent) return false;
|
|
6440
|
+
if (prevProps.renderAnimation !== nextProps.renderAnimation) return false; // 나머지 props는 변경되지 않는다고 가정
|
|
6413
6441
|
|
|
6414
|
-
return true;
|
|
6442
|
+
return true;
|
|
6415
6443
|
});
|
|
6416
6444
|
|
|
6417
6445
|
var css_248z = ".MintMapWrapper-module_mint-map-control-wrapper-container__DONh7 {\n position: absolute;\n width: 100%;\n height: 100%;\n display: flex;\n pointer-events: none;\n z-index: 101;\n}\n\n.MintMapWrapper-module_mint-map-overlay-wrapper__Jn4wV {\n position: absolute;\n z-index: 1;\n}";
|
|
@@ -7154,54 +7182,20 @@ function (_super) {
|
|
|
7154
7182
|
}
|
|
7155
7183
|
};
|
|
7156
7184
|
|
|
7157
|
-
NaverMintMapController.prototype.getCurrentZIndex = function (marker) {
|
|
7158
|
-
if (this.map && marker.element && marker.element instanceof HTMLElement) {
|
|
7159
|
-
var parent_1 = marker.element.parentElement;
|
|
7160
|
-
|
|
7161
|
-
if (parent_1 && parent_1.style.zIndex) {
|
|
7162
|
-
var zIndex = Number(parent_1.style.zIndex);
|
|
7163
|
-
return isNaN(zIndex) ? undefined : zIndex;
|
|
7164
|
-
}
|
|
7165
|
-
}
|
|
7166
|
-
|
|
7167
|
-
return undefined;
|
|
7168
|
-
};
|
|
7169
|
-
|
|
7170
7185
|
NaverMintMapController.prototype.setMarkerZIndex = function (marker, zIndex) {
|
|
7171
7186
|
if (this.map && marker.element && marker.element instanceof HTMLElement) {
|
|
7172
|
-
var
|
|
7187
|
+
var parent_1 = marker.element.parentElement;
|
|
7173
7188
|
|
|
7174
|
-
if (
|
|
7175
|
-
|
|
7189
|
+
if (parent_1) {
|
|
7190
|
+
parent_1.style.zIndex = String(zIndex);
|
|
7176
7191
|
}
|
|
7177
7192
|
}
|
|
7178
7193
|
};
|
|
7179
7194
|
|
|
7180
7195
|
NaverMintMapController.prototype.markerToTheTop = function (marker) {
|
|
7181
|
-
// 이미 최상위로 올라간 상태면 (원래 zIndex가 이미 저장됨) 중복 실행 방지
|
|
7182
|
-
if (this.markerOriginalZIndex !== undefined) {
|
|
7183
|
-
return;
|
|
7184
|
-
}
|
|
7185
|
-
|
|
7186
|
-
var currentZIndex = this.getCurrentZIndex(marker); // undefined면 null로 저장 (원래 zIndex가 없었음을 표시)
|
|
7187
|
-
|
|
7188
|
-
this.markerOriginalZIndex = currentZIndex !== undefined ? currentZIndex : null;
|
|
7189
7196
|
this.setMarkerZIndex(marker, this.getMaxZIndex(1));
|
|
7190
7197
|
};
|
|
7191
7198
|
|
|
7192
|
-
NaverMintMapController.prototype.restoreMarkerZIndex = function (marker) {
|
|
7193
|
-
if (this.markerOriginalZIndex !== undefined) {
|
|
7194
|
-
if (this.markerOriginalZIndex === null) {
|
|
7195
|
-
// 원래 zIndex가 없었으면 제거 (또는 초기값 0으로)
|
|
7196
|
-
this.setMarkerZIndex(marker, 0);
|
|
7197
|
-
} else {
|
|
7198
|
-
this.setMarkerZIndex(marker, this.markerOriginalZIndex);
|
|
7199
|
-
}
|
|
7200
|
-
|
|
7201
|
-
this.markerOriginalZIndex = undefined;
|
|
7202
|
-
}
|
|
7203
|
-
};
|
|
7204
|
-
|
|
7205
7199
|
NaverMintMapController.prototype.clearDrawable = function (drawable) {
|
|
7206
7200
|
var _a;
|
|
7207
7201
|
|
|
@@ -7956,10 +7950,6 @@ function (_super) {
|
|
|
7956
7950
|
}
|
|
7957
7951
|
};
|
|
7958
7952
|
|
|
7959
|
-
GoogleMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Google Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
|
|
7960
|
-
// 이 기능은 Naver Maps에서만 사용 가능합니다.
|
|
7961
|
-
};
|
|
7962
|
-
|
|
7963
7953
|
GoogleMintMapController.prototype.clearDrawable = function (drawable) {
|
|
7964
7954
|
if (drawable && drawable.native) {
|
|
7965
7955
|
if (drawable.native instanceof google.maps.Marker || drawable.native instanceof google.maps.Polygon || drawable.native instanceof google.maps.Polyline) {
|
|
@@ -8682,10 +8672,6 @@ function (_super) {
|
|
|
8682
8672
|
}
|
|
8683
8673
|
};
|
|
8684
8674
|
|
|
8685
|
-
KakaoMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Kakao Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
|
|
8686
|
-
// 이 기능은 Naver Maps에서만 사용 가능합니다.
|
|
8687
|
-
};
|
|
8688
|
-
|
|
8689
8675
|
KakaoMintMapController.prototype.clearDrawable = function (drawable) {
|
|
8690
8676
|
var _this = this;
|
|
8691
8677
|
|
package/dist/index.umd.js
CHANGED
|
@@ -2754,7 +2754,7 @@
|
|
|
2754
2754
|
var onMouseOverHandler = function (e) {
|
|
2755
2755
|
var _a;
|
|
2756
2756
|
|
|
2757
|
-
var marker = markerRef.current;
|
|
2757
|
+
var marker = markerRef.current; //console.log('onMouseOverHandler', marker);
|
|
2758
2758
|
|
|
2759
2759
|
if (marker) {
|
|
2760
2760
|
var mouseOverHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseover');
|
|
@@ -2767,25 +2767,6 @@
|
|
|
2767
2767
|
|
|
2768
2768
|
next && topOnHover && controller.markerToTheTop(marker);
|
|
2769
2769
|
}
|
|
2770
|
-
}; // 20251014 | 장한별 | mouseleave 이벤트 추가, 마우스가 마커 위에서 떠날 때 원래 zindex 를 복구하기 위함
|
|
2771
|
-
|
|
2772
|
-
|
|
2773
|
-
var onMouseLeaveHandler = function (e) {
|
|
2774
|
-
var _a;
|
|
2775
|
-
|
|
2776
|
-
var marker = markerRef.current;
|
|
2777
|
-
|
|
2778
|
-
if (marker) {
|
|
2779
|
-
var mouseOutHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseout');
|
|
2780
|
-
var next = true;
|
|
2781
|
-
|
|
2782
|
-
if (mouseOutHandler) {
|
|
2783
|
-
var hasNext = mouseOutHandler(e);
|
|
2784
|
-
hasNext !== undefined && (next = hasNext);
|
|
2785
|
-
}
|
|
2786
|
-
|
|
2787
|
-
next && topOnHover && controller.restoreMarkerZIndex(marker);
|
|
2788
|
-
}
|
|
2789
2770
|
}; //create object
|
|
2790
2771
|
|
|
2791
2772
|
|
|
@@ -2803,12 +2784,10 @@
|
|
|
2803
2784
|
}); //드래그 여부 초기화를 먼저 수행하기 위해 capture : true 처리
|
|
2804
2785
|
|
|
2805
2786
|
divElement.addEventListener('mouseover', onMouseOverHandler);
|
|
2806
|
-
divElement.addEventListener('mouseleave', onMouseLeaveHandler);
|
|
2807
2787
|
return function () {
|
|
2808
2788
|
divElement.removeEventListener('click', onClickHandler);
|
|
2809
2789
|
divElement.removeEventListener('mousedown', onMousedownHandler);
|
|
2810
2790
|
divElement.removeEventListener('mouseover', onMouseOverHandler);
|
|
2811
|
-
divElement.removeEventListener('mouseleave', onMouseLeaveHandler);
|
|
2812
2791
|
|
|
2813
2792
|
if (markerRef.current) {
|
|
2814
2793
|
controller.clearDrawable(markerRef.current);
|
|
@@ -5485,6 +5464,12 @@
|
|
|
5485
5464
|
x: 0,
|
|
5486
5465
|
y: 0
|
|
5487
5466
|
}); // --------------------------------------------------------------------------
|
|
5467
|
+
// Event Handler Refs (클로저 문제 방지)
|
|
5468
|
+
// --------------------------------------------------------------------------
|
|
5469
|
+
|
|
5470
|
+
var onClickRef = React.useRef(onClick);
|
|
5471
|
+
var onMouseOverRef = React.useRef(onMouseOver);
|
|
5472
|
+
var onMouseOutRef = React.useRef(onMouseOut); // --------------------------------------------------------------------------
|
|
5488
5473
|
// Performance Refs (캐싱 & 최적화)
|
|
5489
5474
|
// --------------------------------------------------------------------------
|
|
5490
5475
|
|
|
@@ -5774,9 +5759,16 @@
|
|
|
5774
5759
|
|
|
5775
5760
|
|
|
5776
5761
|
var doRenderEvent = function () {
|
|
5777
|
-
if (!renderEvent) return;
|
|
5778
5762
|
var layer = eventLayerRef.current;
|
|
5779
|
-
if (!layer) return; //
|
|
5763
|
+
if (!layer) return; // 이벤트 핸들러가 없으면 Event Layer를 완전히 지움
|
|
5764
|
+
|
|
5765
|
+
if (!onClickRef.current && !onMouseOverRef.current && !onMouseOutRef.current) {
|
|
5766
|
+
layer.destroyChildren();
|
|
5767
|
+
layer.batchDraw();
|
|
5768
|
+
return;
|
|
5769
|
+
}
|
|
5770
|
+
|
|
5771
|
+
if (!renderEvent) return; // 🔥 Shape 재사용: 이미 존재하면 재사용, 없으면 생성
|
|
5780
5772
|
|
|
5781
5773
|
var shape = layer.findOne('.event-render-shape');
|
|
5782
5774
|
|
|
@@ -5974,6 +5966,7 @@
|
|
|
5974
5966
|
|
|
5975
5967
|
|
|
5976
5968
|
var setHovered = function (data) {
|
|
5969
|
+
if (!onMouseOverRef.current && !onMouseOutRef.current) return;
|
|
5977
5970
|
hoveredItemRef.current = data;
|
|
5978
5971
|
|
|
5979
5972
|
if (draggingRef.current) {
|
|
@@ -5998,7 +5991,8 @@
|
|
|
5998
5991
|
|
|
5999
5992
|
|
|
6000
5993
|
var handleLocalClick = function (data) {
|
|
6001
|
-
// 1. 선택 상태 업데이트
|
|
5994
|
+
if (!onClickRef.current) return; // 1. 선택 상태 업데이트
|
|
5995
|
+
|
|
6002
5996
|
if (enableMultiSelect) {
|
|
6003
5997
|
// 다중 선택: Set과 Map 동시 업데이트
|
|
6004
5998
|
var newSelected = new Set(selectedIdsRef.current);
|
|
@@ -6048,6 +6042,7 @@
|
|
|
6048
6042
|
var handleClick = function (event) {
|
|
6049
6043
|
var _a;
|
|
6050
6044
|
|
|
6045
|
+
if (!onClickRef.current) return;
|
|
6051
6046
|
if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
|
|
6052
6047
|
|
|
6053
6048
|
try {
|
|
@@ -6056,7 +6051,7 @@
|
|
|
6056
6051
|
|
|
6057
6052
|
if (data) {
|
|
6058
6053
|
handleLocalClick(data);
|
|
6059
|
-
|
|
6054
|
+
onClickRef.current(data, selectedIdsRef.current);
|
|
6060
6055
|
}
|
|
6061
6056
|
} catch (error) {
|
|
6062
6057
|
console.error('[WoongKonvaMarker] handleClick error:', error);
|
|
@@ -6070,6 +6065,7 @@
|
|
|
6070
6065
|
var handleMouseMove = function (event) {
|
|
6071
6066
|
var _a;
|
|
6072
6067
|
|
|
6068
|
+
if (!onMouseOverRef.current && !onMouseOutRef.current) return;
|
|
6073
6069
|
if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
|
|
6074
6070
|
|
|
6075
6071
|
try {
|
|
@@ -6079,8 +6075,8 @@
|
|
|
6079
6075
|
|
|
6080
6076
|
if (prevHovered !== hoveredItem) {
|
|
6081
6077
|
setHovered(hoveredItem);
|
|
6082
|
-
if (prevHovered &&
|
|
6083
|
-
if (hoveredItem &&
|
|
6078
|
+
if (prevHovered && onMouseOutRef.current) onMouseOutRef.current(prevHovered);
|
|
6079
|
+
if (hoveredItem && onMouseOverRef.current) onMouseOverRef.current(hoveredItem);
|
|
6084
6080
|
}
|
|
6085
6081
|
} catch (error) {
|
|
6086
6082
|
console.error('[WoongKonvaMarker] handleMouseMove error:', error);
|
|
@@ -6110,6 +6106,7 @@
|
|
|
6110
6106
|
|
|
6111
6107
|
|
|
6112
6108
|
var handleMouseLeave = function () {
|
|
6109
|
+
if (!onMouseOverRef.current && !onMouseOutRef.current) return;
|
|
6113
6110
|
var prevHovered = hoveredItemRef.current;
|
|
6114
6111
|
|
|
6115
6112
|
if (prevHovered) {
|
|
@@ -6117,8 +6114,8 @@
|
|
|
6117
6114
|
controller.setMapCursor('grab');
|
|
6118
6115
|
doRenderEvent();
|
|
6119
6116
|
|
|
6120
|
-
if (
|
|
6121
|
-
|
|
6117
|
+
if (onMouseOutRef.current) {
|
|
6118
|
+
onMouseOutRef.current(prevHovered);
|
|
6122
6119
|
}
|
|
6123
6120
|
}
|
|
6124
6121
|
}; // --------------------------------------------------------------------------
|
|
@@ -6219,13 +6216,20 @@
|
|
|
6219
6216
|
controller.addEventListener('IDLE', handleIdle);
|
|
6220
6217
|
controller.addEventListener('ZOOMSTART', handleZoomStart);
|
|
6221
6218
|
controller.addEventListener('ZOOM_CHANGED', handleZoomEnd);
|
|
6222
|
-
controller.addEventListener('CENTER_CHANGED', handleCenterChanged);
|
|
6223
|
-
|
|
6224
|
-
|
|
6225
|
-
|
|
6226
|
-
|
|
6219
|
+
controller.addEventListener('CENTER_CHANGED', handleCenterChanged); // onClick이 있을 때만 CLICK 이벤트 등록
|
|
6220
|
+
|
|
6221
|
+
if (onClick) {
|
|
6222
|
+
controller.addEventListener('CLICK', handleClick);
|
|
6223
|
+
} // onMouseOver/onMouseOut이 있을 때만 MOUSEMOVE 이벤트 등록
|
|
6224
|
+
|
|
6227
6225
|
|
|
6228
|
-
|
|
6226
|
+
if (onMouseOver || onMouseOut) {
|
|
6227
|
+
controller.addEventListener('MOUSEMOVE', handleMouseMove);
|
|
6228
|
+
mapDiv.addEventListener('mouseleave', handleMouseLeave);
|
|
6229
|
+
}
|
|
6230
|
+
|
|
6231
|
+
controller.addEventListener('DRAGSTART', handleDragStart);
|
|
6232
|
+
controller.addEventListener('DRAGEND', handleDragEnd);
|
|
6229
6233
|
renderAllImmediate(); // Context 사용 시 컴포넌트 등록 (다중 인스턴스 관리)
|
|
6230
6234
|
|
|
6231
6235
|
var componentInstance = null;
|
|
@@ -6263,11 +6267,18 @@
|
|
|
6263
6267
|
controller.removeEventListener('ZOOMSTART', handleZoomStart);
|
|
6264
6268
|
controller.removeEventListener('ZOOM_CHANGED', handleZoomEnd);
|
|
6265
6269
|
controller.removeEventListener('CENTER_CHANGED', handleCenterChanged);
|
|
6266
|
-
|
|
6267
|
-
|
|
6270
|
+
|
|
6271
|
+
if (onClick) {
|
|
6272
|
+
controller.removeEventListener('CLICK', handleClick);
|
|
6273
|
+
}
|
|
6274
|
+
|
|
6275
|
+
if (onMouseOver || onMouseOut) {
|
|
6276
|
+
controller.removeEventListener('MOUSEMOVE', handleMouseMove);
|
|
6277
|
+
mapDiv.removeEventListener('mouseleave', handleMouseLeave);
|
|
6278
|
+
}
|
|
6279
|
+
|
|
6268
6280
|
controller.removeEventListener('DRAGSTART', handleDragStart);
|
|
6269
|
-
controller.removeEventListener('DRAGEND', handleDragEnd);
|
|
6270
|
-
mapDiv.removeEventListener('mouseleave', handleMouseLeave); // Context 정리
|
|
6281
|
+
controller.removeEventListener('DRAGEND', handleDragEnd); // Context 정리
|
|
6271
6282
|
|
|
6272
6283
|
if (context && componentInstance) {
|
|
6273
6284
|
context.unregisterComponent(componentInstance);
|
|
@@ -6284,6 +6295,18 @@
|
|
|
6284
6295
|
spatialIndexRef.current.clear();
|
|
6285
6296
|
};
|
|
6286
6297
|
}, []); // --------------------------------------------------------------------------
|
|
6298
|
+
// Lifecycle: 이벤트 핸들러 ref 동기화
|
|
6299
|
+
// --------------------------------------------------------------------------
|
|
6300
|
+
|
|
6301
|
+
React.useEffect(function () {
|
|
6302
|
+
onClickRef.current = onClick;
|
|
6303
|
+
onMouseOverRef.current = onMouseOver;
|
|
6304
|
+
onMouseOutRef.current = onMouseOut; // Event Layer 다시 렌더링 (이벤트 핸들러 변경 반영)
|
|
6305
|
+
|
|
6306
|
+
if (stageRef.current) {
|
|
6307
|
+
doRenderEvent();
|
|
6308
|
+
}
|
|
6309
|
+
}, [onClick, onMouseOver, onMouseOut]); // --------------------------------------------------------------------------
|
|
6287
6310
|
// Lifecycle: 외부 selectedItems 동기화
|
|
6288
6311
|
// --------------------------------------------------------------------------
|
|
6289
6312
|
|
|
@@ -6374,14 +6397,23 @@
|
|
|
6374
6397
|
|
|
6375
6398
|
renderAllImmediate();
|
|
6376
6399
|
}, [markers]);
|
|
6400
|
+
var hasAnyHandler = onClick || onMouseOver || onMouseOut;
|
|
6377
6401
|
return reactDom.createPortal(React__default["default"].createElement("div", {
|
|
6402
|
+
style: {
|
|
6403
|
+
zIndex: options.zIndex !== undefined ? options.zIndex + 1 : 9999,
|
|
6404
|
+
position: 'absolute',
|
|
6405
|
+
width: '100%',
|
|
6406
|
+
height: '100%',
|
|
6407
|
+
pointerEvents: hasAnyHandler ? 'none' : 'auto'
|
|
6408
|
+
}
|
|
6409
|
+
}, React__default["default"].createElement("div", {
|
|
6378
6410
|
ref: containerRef,
|
|
6379
6411
|
style: {
|
|
6380
6412
|
position: 'absolute',
|
|
6381
6413
|
width: '100%',
|
|
6382
6414
|
height: '100%'
|
|
6383
6415
|
}
|
|
6384
|
-
}), divElement);
|
|
6416
|
+
})), divElement);
|
|
6385
6417
|
};
|
|
6386
6418
|
/**
|
|
6387
6419
|
* 🔥 React.memo 최적화: 마커 배열과 selectedItems 변경 체크
|
|
@@ -6389,33 +6421,29 @@
|
|
|
6389
6421
|
* 비교 전략:
|
|
6390
6422
|
* 1. markers 배열 비교
|
|
6391
6423
|
* 2. selectedItems 배열 비교 (외부 제어)
|
|
6424
|
+
* 3. 이벤트 핸들러 비교 (onClick, onMouseOver, onMouseOut)
|
|
6392
6425
|
*
|
|
6393
6426
|
* 주의: JSON.stringify() 사용 금지! (매우 느림)
|
|
6394
6427
|
*/
|
|
6395
6428
|
|
|
6396
6429
|
|
|
6397
6430
|
var WoongKonvaMarker = React__default["default"].memo(WoongKonvaMarkerComponent, function (prevProps, nextProps) {
|
|
6398
|
-
//
|
|
6399
|
-
|
|
6400
|
-
var nextMarkers = nextProps.markers; // 참조가 같으면 스킵
|
|
6431
|
+
// markers 배열 비교 (참조 비교)
|
|
6432
|
+
if (prevProps.markers !== nextProps.markers) return false; // selectedItems 배열 비교 (참조 비교)
|
|
6401
6433
|
|
|
6402
|
-
if (
|
|
6403
|
-
// 길이가 다르면 변경됨
|
|
6404
|
-
if (prevMarkers.length !== nextMarkers.length) return false; // 각 마커의 ID 비교
|
|
6434
|
+
if (prevProps.selectedItems !== nextProps.selectedItems) return false; // selectedItem 비교 (참조 비교)
|
|
6405
6435
|
|
|
6406
|
-
|
|
6407
|
-
if (prevMarkers[i].id !== nextMarkers[i].id) {
|
|
6408
|
-
return false; // 변경됨 → 리렌더링
|
|
6409
|
-
}
|
|
6410
|
-
}
|
|
6411
|
-
} // 2. selectedItems 비교 (참조만 비교)
|
|
6436
|
+
if (prevProps.selectedItem !== nextProps.selectedItem) return false; // 이벤트 핸들러 비교 (참조 비교)
|
|
6412
6437
|
|
|
6438
|
+
if (prevProps.onClick !== nextProps.onClick) return false;
|
|
6439
|
+
if (prevProps.onMouseOver !== nextProps.onMouseOver) return false;
|
|
6440
|
+
if (prevProps.onMouseOut !== nextProps.onMouseOut) return false; // renderBase, renderEvent 등 함수 비교
|
|
6413
6441
|
|
|
6414
|
-
if (prevProps.
|
|
6415
|
-
|
|
6416
|
-
|
|
6442
|
+
if (prevProps.renderBase !== nextProps.renderBase) return false;
|
|
6443
|
+
if (prevProps.renderEvent !== nextProps.renderEvent) return false;
|
|
6444
|
+
if (prevProps.renderAnimation !== nextProps.renderAnimation) return false; // 나머지 props는 변경되지 않는다고 가정
|
|
6417
6445
|
|
|
6418
|
-
return true;
|
|
6446
|
+
return true;
|
|
6419
6447
|
});
|
|
6420
6448
|
|
|
6421
6449
|
var css_248z = ".MintMapWrapper-module_mint-map-control-wrapper-container__DONh7 {\n position: absolute;\n width: 100%;\n height: 100%;\n display: flex;\n pointer-events: none;\n z-index: 101;\n}\n\n.MintMapWrapper-module_mint-map-overlay-wrapper__Jn4wV {\n position: absolute;\n z-index: 1;\n}";
|
|
@@ -7158,54 +7186,20 @@
|
|
|
7158
7186
|
}
|
|
7159
7187
|
};
|
|
7160
7188
|
|
|
7161
|
-
NaverMintMapController.prototype.getCurrentZIndex = function (marker) {
|
|
7162
|
-
if (this.map && marker.element && marker.element instanceof HTMLElement) {
|
|
7163
|
-
var parent_1 = marker.element.parentElement;
|
|
7164
|
-
|
|
7165
|
-
if (parent_1 && parent_1.style.zIndex) {
|
|
7166
|
-
var zIndex = Number(parent_1.style.zIndex);
|
|
7167
|
-
return isNaN(zIndex) ? undefined : zIndex;
|
|
7168
|
-
}
|
|
7169
|
-
}
|
|
7170
|
-
|
|
7171
|
-
return undefined;
|
|
7172
|
-
};
|
|
7173
|
-
|
|
7174
7189
|
NaverMintMapController.prototype.setMarkerZIndex = function (marker, zIndex) {
|
|
7175
7190
|
if (this.map && marker.element && marker.element instanceof HTMLElement) {
|
|
7176
|
-
var
|
|
7191
|
+
var parent_1 = marker.element.parentElement;
|
|
7177
7192
|
|
|
7178
|
-
if (
|
|
7179
|
-
|
|
7193
|
+
if (parent_1) {
|
|
7194
|
+
parent_1.style.zIndex = String(zIndex);
|
|
7180
7195
|
}
|
|
7181
7196
|
}
|
|
7182
7197
|
};
|
|
7183
7198
|
|
|
7184
7199
|
NaverMintMapController.prototype.markerToTheTop = function (marker) {
|
|
7185
|
-
// 이미 최상위로 올라간 상태면 (원래 zIndex가 이미 저장됨) 중복 실행 방지
|
|
7186
|
-
if (this.markerOriginalZIndex !== undefined) {
|
|
7187
|
-
return;
|
|
7188
|
-
}
|
|
7189
|
-
|
|
7190
|
-
var currentZIndex = this.getCurrentZIndex(marker); // undefined면 null로 저장 (원래 zIndex가 없었음을 표시)
|
|
7191
|
-
|
|
7192
|
-
this.markerOriginalZIndex = currentZIndex !== undefined ? currentZIndex : null;
|
|
7193
7200
|
this.setMarkerZIndex(marker, this.getMaxZIndex(1));
|
|
7194
7201
|
};
|
|
7195
7202
|
|
|
7196
|
-
NaverMintMapController.prototype.restoreMarkerZIndex = function (marker) {
|
|
7197
|
-
if (this.markerOriginalZIndex !== undefined) {
|
|
7198
|
-
if (this.markerOriginalZIndex === null) {
|
|
7199
|
-
// 원래 zIndex가 없었으면 제거 (또는 초기값 0으로)
|
|
7200
|
-
this.setMarkerZIndex(marker, 0);
|
|
7201
|
-
} else {
|
|
7202
|
-
this.setMarkerZIndex(marker, this.markerOriginalZIndex);
|
|
7203
|
-
}
|
|
7204
|
-
|
|
7205
|
-
this.markerOriginalZIndex = undefined;
|
|
7206
|
-
}
|
|
7207
|
-
};
|
|
7208
|
-
|
|
7209
7203
|
NaverMintMapController.prototype.clearDrawable = function (drawable) {
|
|
7210
7204
|
var _a;
|
|
7211
7205
|
|
|
@@ -7960,10 +7954,6 @@
|
|
|
7960
7954
|
}
|
|
7961
7955
|
};
|
|
7962
7956
|
|
|
7963
|
-
GoogleMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Google Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
|
|
7964
|
-
// 이 기능은 Naver Maps에서만 사용 가능합니다.
|
|
7965
|
-
};
|
|
7966
|
-
|
|
7967
7957
|
GoogleMintMapController.prototype.clearDrawable = function (drawable) {
|
|
7968
7958
|
if (drawable && drawable.native) {
|
|
7969
7959
|
if (drawable.native instanceof google.maps.Marker || drawable.native instanceof google.maps.Polygon || drawable.native instanceof google.maps.Polyline) {
|
|
@@ -8686,10 +8676,6 @@
|
|
|
8686
8676
|
}
|
|
8687
8677
|
};
|
|
8688
8678
|
|
|
8689
|
-
KakaoMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Kakao Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
|
|
8690
|
-
// 이 기능은 Naver Maps에서만 사용 가능합니다.
|
|
8691
|
-
};
|
|
8692
|
-
|
|
8693
8679
|
KakaoMintMapController.prototype.clearDrawable = function (drawable) {
|
|
8694
8680
|
var _this = this;
|
|
8695
8681
|
|