@mint-ui/map 1.2.0-test.2 → 1.2.0-test.4
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/README.md +7 -7
- package/dist/components/mint-map/core/MintMapController.d.ts +1 -0
- package/dist/components/mint-map/core/MintMapCore.js +1 -0
- package/dist/components/mint-map/core/advanced/index.d.ts +1 -4
- package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.d.ts +16 -14
- package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.js +51 -18
- package/dist/components/mint-map/core/advanced/woongCanvas/index.d.ts +1 -0
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.d.ts +7 -7
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.d.ts +21 -11
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.js +14 -0
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.d.ts +5 -5
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.js +2 -2
- package/dist/components/mint-map/core/wrapper/MapMarkerWrapper.js +22 -1
- package/dist/components/mint-map/google/GoogleMintMapController.d.ts +1 -0
- package/dist/components/mint-map/google/GoogleMintMapController.js +5 -0
- package/dist/components/mint-map/kakao/KakaoMintMapController.d.ts +1 -0
- package/dist/components/mint-map/kakao/KakaoMintMapController.js +5 -0
- package/dist/components/mint-map/naver/NaverMintMapController.d.ts +3 -0
- package/dist/components/mint-map/naver/NaverMintMapController.js +38 -3
- package/dist/index.es.js +127 -25
- package/dist/index.js +27 -13
- package/dist/index.umd.js +134 -24
- package/package.json +1 -1
- package/.claude/settings.local.json +0 -16
package/README.md
CHANGED
|
@@ -129,7 +129,7 @@ npm pack
|
|
|
129
129
|
#### 5. NPM에 배포
|
|
130
130
|
스코프 패키지(`@mint-ui/map`)는 기본적으로 private이므로 public으로 배포해야 합니다.
|
|
131
131
|
```bash
|
|
132
|
-
npm publish
|
|
132
|
+
npm publish
|
|
133
133
|
```
|
|
134
134
|
|
|
135
135
|
#### 6. 배포 완료 확인
|
|
@@ -154,7 +154,7 @@ npm version patch
|
|
|
154
154
|
npm pack
|
|
155
155
|
|
|
156
156
|
# 5단계: 배포
|
|
157
|
-
npm publish
|
|
157
|
+
npm publish
|
|
158
158
|
```
|
|
159
159
|
|
|
160
160
|
### 현재 패키지 정보
|
|
@@ -185,7 +185,7 @@ npm publish --access public
|
|
|
185
185
|
npm run build
|
|
186
186
|
|
|
187
187
|
# test tag로 배포
|
|
188
|
-
npm publish
|
|
188
|
+
npm publish --tag test
|
|
189
189
|
```
|
|
190
190
|
|
|
191
191
|
3. **변경사항 커밋 및 푸시**
|
|
@@ -202,7 +202,7 @@ npm publish --access public
|
|
|
202
202
|
|
|
203
203
|
# 빌드 및 배포
|
|
204
204
|
npm run build
|
|
205
|
-
npm publish
|
|
205
|
+
npm publish --tag test
|
|
206
206
|
|
|
207
207
|
# 커밋 및 푸시
|
|
208
208
|
git add .
|
|
@@ -215,7 +215,7 @@ npm publish --access public
|
|
|
215
215
|
git checkout -b 1.2.0-test.2
|
|
216
216
|
npm version 1.2.0-test.2 --no-git-tag-version
|
|
217
217
|
npm run build
|
|
218
|
-
npm publish
|
|
218
|
+
npm publish --tag test
|
|
219
219
|
git add .
|
|
220
220
|
git commit -m "chore: release 1.2.0-test.2"
|
|
221
221
|
git push origin 1.2.0-test.2
|
|
@@ -234,7 +234,7 @@ npm publish --access public
|
|
|
234
234
|
|
|
235
235
|
# 빌드 및 배포
|
|
236
236
|
npm run build
|
|
237
|
-
npm publish
|
|
237
|
+
npm publish
|
|
238
238
|
|
|
239
239
|
# main에 푸시
|
|
240
240
|
git push origin main
|
|
@@ -267,5 +267,5 @@ npm install @mint-ui/map@1.2.0-test.1
|
|
|
267
267
|
### 주의사항
|
|
268
268
|
- 배포하기 전에 반드시 `npm run build`를 실행해야 합니다
|
|
269
269
|
- 버전은 한 번 배포하면 되돌릴 수 없으니 신중하게 결정하세요
|
|
270
|
-
- 스코프 패키지는
|
|
270
|
+
- 스코프 패키지는 `` 옵션을 반드시 붙여야 합니다
|
|
271
271
|
- test tag로 배포할 때는 `--no-git-tag-version` 옵션을 사용하여 git tag 생성을 방지합니다
|
|
@@ -24,6 +24,7 @@ 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;
|
|
27
28
|
abstract isMapDragged(): boolean;
|
|
28
29
|
abstract setMapDragged(value: boolean): void;
|
|
29
30
|
abstract setMarkerZIndex(marker: Marker, zIndex: number): void;
|
|
@@ -8,6 +8,7 @@ var React = require('react');
|
|
|
8
8
|
var MapTypes = require('../types/MapTypes.js');
|
|
9
9
|
var MintMapProvider = require('./provider/MintMapProvider.js');
|
|
10
10
|
var MintMapCore_module = require('./MintMapCore.module.scss.js');
|
|
11
|
+
require('./advanced/woongCanvas/shared/types.js');
|
|
11
12
|
require('../types/MapDrawables.js');
|
|
12
13
|
require('../types/MapEventTypes.js');
|
|
13
14
|
var context = require('./advanced/woongCanvas/shared/context.js');
|
|
@@ -2,7 +2,4 @@ export * from './shapes';
|
|
|
2
2
|
export * from './canvas';
|
|
3
3
|
export * from './MapBuildingProjection';
|
|
4
4
|
export * from './MapLoadingComponents';
|
|
5
|
-
export
|
|
6
|
-
export type { WoongKonvaMarkerProps } from './woongCanvas/WoongKonvaMarker';
|
|
7
|
-
export { KonvaMarkerProvider, LRUCache, SpatialHashGrid, useKonvaMarkerContext } from './woongCanvas/shared';
|
|
8
|
-
export type { RenderUtils, CustomRenderBase, CustomRenderAnimation, CustomRenderEvent, RenderBaseParams, RenderAnimationParams, RenderEventParams } from './woongCanvas/shared';
|
|
5
|
+
export * from './woongCanvas';
|
|
@@ -1,27 +1,29 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { MarkerOptions } from "../../../types";
|
|
3
|
-
import {
|
|
4
|
-
export { KonvaMarkerProvider, LRUCache, SpatialHashGrid } from "./shared";
|
|
5
|
-
export type {
|
|
3
|
+
import { KonvaCanvasMarkerData, CanvasDataType, CustomRenderBase, CustomRenderAnimation, CustomRenderEvent } from "./shared";
|
|
4
|
+
export { KonvaMarkerProvider, LRUCache, SpatialHashGrid, CanvasDataType } from "./shared";
|
|
5
|
+
export type { KonvaCanvasMarkerOption, Paths, KonvaCanvasMarkerData, CustomRenderBase, CustomRenderAnimation, CustomRenderEvent, RenderUtils, RenderBaseParams, RenderAnimationParams, RenderEventParams } from "./shared";
|
|
6
6
|
/**
|
|
7
7
|
* WoongKonvaMarker 컴포넌트 Props
|
|
8
8
|
* @template T 마커 데이터의 추가 속성 타입
|
|
9
9
|
*/
|
|
10
10
|
export interface WoongKonvaMarkerProps<T> extends Pick<MarkerOptions, 'zIndex' | 'anchor' | 'visible'> {
|
|
11
11
|
/** 렌더링할 마커 데이터 배열 */
|
|
12
|
-
markers:
|
|
13
|
-
/**
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
|
|
12
|
+
markers: KonvaCanvasMarkerData<T>[];
|
|
13
|
+
/** 데이터 타입 (MARKER 또는 POLYGON) */
|
|
14
|
+
dataType: CanvasDataType;
|
|
15
|
+
/** 마커 클릭 시 호출되는 콜백 (선택) */
|
|
16
|
+
onClick?: (payload: KonvaCanvasMarkerData<T>, selectedIds: Set<string>) => void;
|
|
17
|
+
/** 마커에 마우스 오버 시 호출되는 콜백 (선택) */
|
|
18
|
+
onMouseOver?: (payload: KonvaCanvasMarkerData<T>) => void;
|
|
19
|
+
/** 마커에서 마우스 아웃 시 호출되는 콜백 (선택) */
|
|
20
|
+
onMouseOut?: (payload: KonvaCanvasMarkerData<T>) => void;
|
|
19
21
|
/** Base Layer 렌더링 함수 (필수) */
|
|
20
22
|
renderBase: CustomRenderBase<T>;
|
|
21
23
|
/** Animation Layer 렌더링 함수 (선택, 애니메이션용) */
|
|
22
24
|
renderAnimation?: CustomRenderAnimation<T>;
|
|
23
|
-
/** Event Layer 렌더링 함수 (
|
|
24
|
-
renderEvent
|
|
25
|
+
/** Event Layer 렌더링 함수 (선택) */
|
|
26
|
+
renderEvent?: CustomRenderEvent<T>;
|
|
25
27
|
/** 다중 선택 활성화 여부 (기본: false) */
|
|
26
28
|
enableMultiSelect?: boolean;
|
|
27
29
|
/** hover 시 마커를 최상단으로 표시 (기본: false) */
|
|
@@ -33,7 +35,7 @@ export interface WoongKonvaMarkerProps<T> extends Pick<MarkerOptions, 'zIndex' |
|
|
|
33
35
|
/** LRU 캐시 최대 크기 (기본: 10000) */
|
|
34
36
|
maxCacheSize?: number;
|
|
35
37
|
/** 외부에서 제어하는 선택된 항목 배열 (선택) */
|
|
36
|
-
selectedItems?:
|
|
38
|
+
selectedItems?: KonvaCanvasMarkerData<T>[];
|
|
37
39
|
}
|
|
38
40
|
/**
|
|
39
41
|
* 🔥 React.memo 최적화: 마커 배열과 selectedItems 변경 체크
|
|
@@ -44,5 +46,5 @@ export interface WoongKonvaMarkerProps<T> extends Pick<MarkerOptions, 'zIndex' |
|
|
|
44
46
|
*
|
|
45
47
|
* 주의: JSON.stringify() 사용 금지! (매우 느림)
|
|
46
48
|
*/
|
|
47
|
-
declare const WoongKonvaMarker: <T>({ markers, onClick, onMouseOver, onMouseOut, renderBase, renderAnimation, renderEvent, enableMultiSelect, topOnHover, enableViewportCulling, cullingMargin, maxCacheSize, selectedItems: externalSelectedItems, ...options }: WoongKonvaMarkerProps<T>) => React.ReactPortal;
|
|
49
|
+
declare const WoongKonvaMarker: <T>({ markers, dataType, onClick, onMouseOver, onMouseOut, renderBase, renderAnimation, renderEvent, enableMultiSelect, topOnHover, enableViewportCulling, cullingMargin, maxCacheSize, selectedItems: externalSelectedItems, ...options }: WoongKonvaMarkerProps<T>) => React.ReactPortal;
|
|
48
50
|
export default WoongKonvaMarker;
|
|
@@ -10,6 +10,7 @@ var MapDrawables = require('../../../types/MapDrawables.js');
|
|
|
10
10
|
require('../../../types/MapTypes.js');
|
|
11
11
|
require('../../../types/MapEventTypes.js');
|
|
12
12
|
var reactDom = require('react-dom');
|
|
13
|
+
var types = require('./shared/types.js');
|
|
13
14
|
var utils = require('./shared/utils.js');
|
|
14
15
|
var context = require('./shared/context.js');
|
|
15
16
|
var performance = require('./shared/performance.js');
|
|
@@ -36,6 +37,7 @@ var Konva__default = /*#__PURE__*/_interopDefaultLegacy(Konva);
|
|
|
36
37
|
|
|
37
38
|
var WoongKonvaMarkerComponent = function (_a) {
|
|
38
39
|
var markers = _a.markers,
|
|
40
|
+
dataType = _a.dataType,
|
|
39
41
|
onClick = _a.onClick,
|
|
40
42
|
onMouseOver = _a.onMouseOver,
|
|
41
43
|
onMouseOut = _a.onMouseOut,
|
|
@@ -53,7 +55,7 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
53
55
|
_f = _a.maxCacheSize,
|
|
54
56
|
maxCacheSize = _f === void 0 ? performance.DEFAULT_MAX_CACHE_SIZE : _f,
|
|
55
57
|
externalSelectedItems = _a.selectedItems,
|
|
56
|
-
options = tslib.__rest(_a, ["markers", "onClick", "onMouseOver", "onMouseOut", "renderBase", "renderAnimation", "renderEvent", "enableMultiSelect", "topOnHover", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems"]); // --------------------------------------------------------------------------
|
|
58
|
+
options = tslib.__rest(_a, ["markers", "dataType", "onClick", "onMouseOver", "onMouseOut", "renderBase", "renderAnimation", "renderEvent", "enableMultiSelect", "topOnHover", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems"]); // --------------------------------------------------------------------------
|
|
57
59
|
// Hooks & Context
|
|
58
60
|
// --------------------------------------------------------------------------
|
|
59
61
|
|
|
@@ -87,6 +89,9 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
87
89
|
/** 현재 Hover 중인 항목 */
|
|
88
90
|
|
|
89
91
|
var hoveredItemRef = React.useRef(null);
|
|
92
|
+
/** 마지막으로 클릭된 항목 */
|
|
93
|
+
|
|
94
|
+
var lastClickedItemRef = React.useRef(null);
|
|
90
95
|
/**
|
|
91
96
|
* 선택된 항목의 ID Set
|
|
92
97
|
*
|
|
@@ -170,7 +175,7 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
170
175
|
|
|
171
176
|
if (!bbox) {
|
|
172
177
|
// 폴리곤인 경우
|
|
173
|
-
if (
|
|
178
|
+
if (dataType === types.CanvasDataType.POLYGON) {
|
|
174
179
|
var offsets = getOrComputePolygonOffsets(item);
|
|
175
180
|
if (!offsets) return false; // 바운딩 박스 계산 (최적화: 직접 비교)
|
|
176
181
|
|
|
@@ -278,7 +283,7 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
278
283
|
for (var _i = 0, currentMarkers_1 = currentMarkers; _i < currentMarkers_1.length; _i++) {
|
|
279
284
|
var item = currentMarkers_1[_i];
|
|
280
285
|
|
|
281
|
-
if (
|
|
286
|
+
if (dataType === types.CanvasDataType.POLYGON) {
|
|
282
287
|
// 폴리곤: 바운딩 박스 계산 (최적화: 직접 비교)
|
|
283
288
|
var offsets = getOrComputePolygonOffsets(item);
|
|
284
289
|
|
|
@@ -414,6 +419,7 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
414
419
|
|
|
415
420
|
|
|
416
421
|
var doRenderEvent = function () {
|
|
422
|
+
if (!renderEvent) return;
|
|
417
423
|
var layer = eventLayerRef.current;
|
|
418
424
|
if (!layer) return; // 🔥 Shape 재사용: 이미 존재하면 재사용, 없으면 생성
|
|
419
425
|
|
|
@@ -432,7 +438,8 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
432
438
|
ctx: ctx,
|
|
433
439
|
hoveredItem: hoveredItemRef.current,
|
|
434
440
|
utils: renderUtils,
|
|
435
|
-
selectedItems: selectedItems
|
|
441
|
+
selectedItems: selectedItems,
|
|
442
|
+
lastClickedItem: lastClickedItemRef.current
|
|
436
443
|
});
|
|
437
444
|
},
|
|
438
445
|
perfectDrawEnabled: false,
|
|
@@ -564,7 +571,7 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
564
571
|
if (topOnHover && hoveredItemRef.current) {
|
|
565
572
|
var hovered = hoveredItemRef.current; // 폴리곤인 경우
|
|
566
573
|
|
|
567
|
-
if (
|
|
574
|
+
if (dataType === types.CanvasDataType.POLYGON) {
|
|
568
575
|
if (utils.isPointInPolygonData(offset, hovered, getOrComputePolygonOffsets)) {
|
|
569
576
|
return hovered; // 여전히 hover된 항목 위에 있음
|
|
570
577
|
}
|
|
@@ -577,23 +584,22 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
577
584
|
} // Spatial Index로 후보 항목만 빠르게 추출 (30,000개 → ~10개)
|
|
578
585
|
|
|
579
586
|
|
|
580
|
-
var candidates = spatialIndexRef.current.queryPoint(offset.x, offset.y); //
|
|
587
|
+
var candidates = spatialIndexRef.current.queryPoint(offset.x, offset.y); // 데이터 타입에 따라 적절한 히트 테스트 수행
|
|
581
588
|
|
|
582
|
-
|
|
583
|
-
|
|
589
|
+
if (dataType === types.CanvasDataType.MARKER) {
|
|
590
|
+
// 마커 체크
|
|
591
|
+
for (var i = candidates.length - 1; i >= 0; i--) {
|
|
592
|
+
var item = candidates[i];
|
|
584
593
|
|
|
585
|
-
if (!item.paths) {
|
|
586
594
|
if (utils.isPointInMarkerData(offset, item, getOrComputeMarkerOffset)) {
|
|
587
595
|
return item;
|
|
588
596
|
}
|
|
589
597
|
}
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
var item = candidates[i];
|
|
598
|
+
} else {
|
|
599
|
+
// 폴리곤 체크
|
|
600
|
+
for (var i = candidates.length - 1; i >= 0; i--) {
|
|
601
|
+
var item = candidates[i];
|
|
595
602
|
|
|
596
|
-
if (item.paths) {
|
|
597
603
|
if (utils.isPointInPolygonData(offset, item, getOrComputePolygonOffsets)) {
|
|
598
604
|
return item;
|
|
599
605
|
}
|
|
@@ -637,7 +643,9 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
637
643
|
|
|
638
644
|
|
|
639
645
|
var handleLocalClick = function (data) {
|
|
640
|
-
//
|
|
646
|
+
// 0. 마지막 클릭 항목 저장
|
|
647
|
+
lastClickedItemRef.current = data; // 1. 선택 상태 업데이트
|
|
648
|
+
|
|
641
649
|
if (enableMultiSelect) {
|
|
642
650
|
// 다중 선택: Set과 Map 동시 업데이트
|
|
643
651
|
var newSelected = new Set(selectedIdsRef.current);
|
|
@@ -742,6 +750,24 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
742
750
|
var handleDragEnd = function () {
|
|
743
751
|
draggingRef.current = false;
|
|
744
752
|
controller.setMapCursor('grab');
|
|
753
|
+
};
|
|
754
|
+
/**
|
|
755
|
+
* 마우스가 canvas를 벗어날 때 hover cleanup
|
|
756
|
+
*/
|
|
757
|
+
|
|
758
|
+
|
|
759
|
+
var handleMouseLeave = function () {
|
|
760
|
+
var prevHovered = hoveredItemRef.current;
|
|
761
|
+
|
|
762
|
+
if (prevHovered) {
|
|
763
|
+
hoveredItemRef.current = null;
|
|
764
|
+
controller.setMapCursor('grab');
|
|
765
|
+
doRenderEvent();
|
|
766
|
+
|
|
767
|
+
if (onMouseOut) {
|
|
768
|
+
onMouseOut(prevHovered);
|
|
769
|
+
}
|
|
770
|
+
}
|
|
745
771
|
}; // --------------------------------------------------------------------------
|
|
746
772
|
// Lifecycle: DOM 초기화
|
|
747
773
|
// --------------------------------------------------------------------------
|
|
@@ -844,7 +870,9 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
844
870
|
controller.addEventListener('CLICK', handleClick);
|
|
845
871
|
controller.addEventListener('MOUSEMOVE', handleMouseMove);
|
|
846
872
|
controller.addEventListener('DRAGSTART', handleDragStart);
|
|
847
|
-
controller.addEventListener('DRAGEND', handleDragEnd);
|
|
873
|
+
controller.addEventListener('DRAGEND', handleDragEnd); // 맵 컨테이너에 mouseleave 이벤트 추가
|
|
874
|
+
|
|
875
|
+
mapDiv.addEventListener('mouseleave', handleMouseLeave);
|
|
848
876
|
renderAllImmediate(); // Context 사용 시 컴포넌트 등록 (다중 인스턴스 관리)
|
|
849
877
|
|
|
850
878
|
var componentInstance = null;
|
|
@@ -885,7 +913,8 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
885
913
|
controller.removeEventListener('CLICK', handleClick);
|
|
886
914
|
controller.removeEventListener('MOUSEMOVE', handleMouseMove);
|
|
887
915
|
controller.removeEventListener('DRAGSTART', handleDragStart);
|
|
888
|
-
controller.removeEventListener('DRAGEND', handleDragEnd);
|
|
916
|
+
controller.removeEventListener('DRAGEND', handleDragEnd);
|
|
917
|
+
mapDiv.removeEventListener('mouseleave', handleMouseLeave); // Context 정리
|
|
889
918
|
|
|
890
919
|
if (context$1 && componentInstance) {
|
|
891
920
|
context$1.unregisterComponent(componentInstance);
|
|
@@ -1026,6 +1055,10 @@ var WoongKonvaMarker = React__default["default"].memo(WoongKonvaMarkerComponent,
|
|
|
1026
1055
|
return true; // 같음 → 리렌더링 스킵
|
|
1027
1056
|
});
|
|
1028
1057
|
|
|
1058
|
+
Object.defineProperty(exports, 'CanvasDataType', {
|
|
1059
|
+
enumerable: true,
|
|
1060
|
+
get: function () { return types.CanvasDataType; }
|
|
1061
|
+
});
|
|
1029
1062
|
exports.KonvaMarkerProvider = context.KonvaMarkerProvider;
|
|
1030
1063
|
exports.LRUCache = performance.LRUCache;
|
|
1031
1064
|
exports.SpatialHashGrid = performance.SpatialHashGrid;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { Offset } from "../../../../types";
|
|
3
|
-
import {
|
|
3
|
+
import { KonvaCanvasMarkerData } from "./types";
|
|
4
4
|
/**
|
|
5
5
|
* 다중 WoongKonvaMarker 인스턴스를 관리하기 위한 Context
|
|
6
6
|
*
|
|
@@ -12,12 +12,12 @@ import { CanvasMarkerData } from "./types";
|
|
|
12
12
|
export interface ComponentInstance<T> {
|
|
13
13
|
zIndex: number;
|
|
14
14
|
hitTest: (offset: Offset) => boolean;
|
|
15
|
-
onClick?: (payload:
|
|
16
|
-
onMouseOver?: (payload:
|
|
17
|
-
onMouseOut?: (payload:
|
|
18
|
-
findData: (offset: Offset) =>
|
|
19
|
-
setHovered: (data:
|
|
20
|
-
handleLocalClick: (data:
|
|
15
|
+
onClick?: (payload: KonvaCanvasMarkerData<T>, selectedIds: Set<string>) => void;
|
|
16
|
+
onMouseOver?: (payload: KonvaCanvasMarkerData<T>) => void;
|
|
17
|
+
onMouseOut?: (payload: KonvaCanvasMarkerData<T>) => void;
|
|
18
|
+
findData: (offset: Offset) => KonvaCanvasMarkerData<T> | null;
|
|
19
|
+
setHovered: (data: KonvaCanvasMarkerData<T> | null) => void;
|
|
20
|
+
handleLocalClick: (data: KonvaCanvasMarkerData<T>) => void;
|
|
21
21
|
getSelectedIds: () => Set<string>;
|
|
22
22
|
}
|
|
23
23
|
interface KonvaMarkerContextValue {
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import Konva from "konva";
|
|
2
2
|
import { Position, Offset } from "../../../../types";
|
|
3
|
+
/**
|
|
4
|
+
* 캔버스 데이터 타입 Enum
|
|
5
|
+
* 마커인지 폴리곤인지 구분하는 상수
|
|
6
|
+
*/
|
|
7
|
+
export declare enum CanvasDataType {
|
|
8
|
+
MARKER = "MARKER",
|
|
9
|
+
POLYGON = "POLYGON"
|
|
10
|
+
}
|
|
3
11
|
/**
|
|
4
12
|
* 폴리곤 경로 정의
|
|
5
13
|
*/
|
|
@@ -11,12 +19,12 @@ export interface Paths {
|
|
|
11
19
|
* 캔버스 마커/폴리곤 기본 옵션
|
|
12
20
|
*/
|
|
13
21
|
/**
|
|
14
|
-
* 캔버스 마커/폴리곤의 기본 필수 속성
|
|
22
|
+
* Konva 캔버스 마커/폴리곤의 기본 필수 속성
|
|
15
23
|
* (렌더링에 필요한 최소 정보)
|
|
16
24
|
*/
|
|
17
|
-
export interface
|
|
25
|
+
export interface KonvaCanvasMarkerOption {
|
|
18
26
|
id: string;
|
|
19
|
-
position: Position
|
|
27
|
+
position: Position;
|
|
20
28
|
boxWidth?: number;
|
|
21
29
|
boxHeight?: number;
|
|
22
30
|
paths?: Paths;
|
|
@@ -27,16 +35,16 @@ export interface CanvasMarkerOption {
|
|
|
27
35
|
* @template T 서버에서 받은 원본 데이터 타입 (예: Marker, Polygon)
|
|
28
36
|
* @example
|
|
29
37
|
* // API에서 받은 Marker 타입을 그대로 유지하면서 캔버스 렌더링 정보 추가
|
|
30
|
-
* type MarkerWithCanvas =
|
|
38
|
+
* type MarkerWithCanvas = KonvaCanvasMarkerData<Marker>
|
|
31
39
|
* // { raId, lat, lng, buildingName, totalArea } + { id, position, boxWidth, ... }
|
|
32
40
|
*/
|
|
33
|
-
export declare type
|
|
41
|
+
export declare type KonvaCanvasMarkerData<T = {}> = T & KonvaCanvasMarkerOption;
|
|
34
42
|
/**
|
|
35
43
|
* 렌더링 유틸리티 함수들
|
|
36
44
|
*/
|
|
37
45
|
export interface RenderUtils<T> {
|
|
38
|
-
getOrComputePolygonOffsets: (polygonData:
|
|
39
|
-
getOrComputeMarkerOffset: (markerData:
|
|
46
|
+
getOrComputePolygonOffsets: (polygonData: KonvaCanvasMarkerData<T>) => number[][][][] | null;
|
|
47
|
+
getOrComputeMarkerOffset: (markerData: KonvaCanvasMarkerData<T>) => Offset | null;
|
|
40
48
|
}
|
|
41
49
|
/**
|
|
42
50
|
* 커스텀 렌더링 함수 파라미터 - Base Layer
|
|
@@ -45,7 +53,7 @@ export interface RenderBaseParams<T> {
|
|
|
45
53
|
/** Canvas 2D 렌더링 컨텍스트 (순수 Canvas API) */
|
|
46
54
|
ctx: CanvasRenderingContext2D;
|
|
47
55
|
/** 렌더링할 마커 데이터 배열 */
|
|
48
|
-
items:
|
|
56
|
+
items: KonvaCanvasMarkerData<T>[];
|
|
49
57
|
/** 현재 선택된 마커 ID Set */
|
|
50
58
|
selectedIds: Set<string>;
|
|
51
59
|
/** 렌더링 유틸리티 함수들 */
|
|
@@ -75,7 +83,7 @@ export interface RenderAnimationParams<T> {
|
|
|
75
83
|
/** 현재 선택된 마커 ID Set */
|
|
76
84
|
selectedIds: Set<string>;
|
|
77
85
|
/** 전체 마커 데이터 배열 */
|
|
78
|
-
items:
|
|
86
|
+
items: KonvaCanvasMarkerData<T>[];
|
|
79
87
|
/** 렌더링 유틸리티 함수들 */
|
|
80
88
|
utils: RenderUtils<T>;
|
|
81
89
|
}
|
|
@@ -98,11 +106,13 @@ export interface RenderEventParams<T> {
|
|
|
98
106
|
/** Canvas 2D 렌더링 컨텍스트 (순수 Canvas API) */
|
|
99
107
|
ctx: CanvasRenderingContext2D;
|
|
100
108
|
/** 현재 hover된 마커 데이터 */
|
|
101
|
-
hoveredItem:
|
|
109
|
+
hoveredItem: KonvaCanvasMarkerData<T> | null;
|
|
102
110
|
/** 렌더링 유틸리티 함수들 */
|
|
103
111
|
utils: RenderUtils<T>;
|
|
104
112
|
/** 현재 선택된 마커 데이터 배열 (선택 강조용) */
|
|
105
|
-
selectedItems?:
|
|
113
|
+
selectedItems?: KonvaCanvasMarkerData<T>[];
|
|
114
|
+
/** 마지막으로 클릭된 마커 데이터 */
|
|
115
|
+
lastClickedItem: KonvaCanvasMarkerData<T> | null;
|
|
106
116
|
}
|
|
107
117
|
/**
|
|
108
118
|
* 커스텀 렌더링 함수 타입 - Event Layer
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 캔버스 데이터 타입 Enum
|
|
7
|
+
* 마커인지 폴리곤인지 구분하는 상수
|
|
8
|
+
*/
|
|
9
|
+
exports.CanvasDataType = void 0;
|
|
10
|
+
|
|
11
|
+
(function (CanvasDataType) {
|
|
12
|
+
CanvasDataType["MARKER"] = "MARKER";
|
|
13
|
+
CanvasDataType["POLYGON"] = "POLYGON";
|
|
14
|
+
})(exports.CanvasDataType || (exports.CanvasDataType = {}));
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { Offset } from "../../../../types";
|
|
2
2
|
import { MintMapController } from "../../../MintMapController";
|
|
3
|
-
import {
|
|
3
|
+
import { KonvaCanvasMarkerData } from "./types";
|
|
4
4
|
/**
|
|
5
5
|
* 폴리곤 offset 계산
|
|
6
6
|
*/
|
|
7
|
-
export declare const computePolygonOffsets: (polygonData:
|
|
7
|
+
export declare const computePolygonOffsets: (polygonData: KonvaCanvasMarkerData<any>, controller: MintMapController) => number[][][][] | null;
|
|
8
8
|
/**
|
|
9
9
|
* 마커 offset 계산
|
|
10
10
|
*/
|
|
11
|
-
export declare const computeMarkerOffset: (markerData:
|
|
11
|
+
export declare const computeMarkerOffset: (markerData: KonvaCanvasMarkerData<any>, controller: MintMapController) => Offset | null;
|
|
12
12
|
/**
|
|
13
13
|
* Point-in-Polygon 알고리즘
|
|
14
14
|
*/
|
|
@@ -16,8 +16,8 @@ export declare const isPointInPolygon: (point: Offset, polygon: number[][]) => b
|
|
|
16
16
|
/**
|
|
17
17
|
* 폴리곤 히트 테스트
|
|
18
18
|
*/
|
|
19
|
-
export declare const isPointInPolygonData: (clickedOffset: Offset, polygonData:
|
|
19
|
+
export declare const isPointInPolygonData: (clickedOffset: Offset, polygonData: KonvaCanvasMarkerData<any>, getPolygonOffsets: (data: KonvaCanvasMarkerData<any>) => number[][][][] | null) => boolean;
|
|
20
20
|
/**
|
|
21
21
|
* 마커 히트 테스트
|
|
22
22
|
*/
|
|
23
|
-
export declare const isPointInMarkerData: (clickedOffset: Offset, markerData:
|
|
23
|
+
export declare const isPointInMarkerData: (clickedOffset: Offset, markerData: KonvaCanvasMarkerData<any>, getMarkerOffset: (data: KonvaCanvasMarkerData<any>) => Offset | null) => boolean;
|
|
@@ -47,11 +47,11 @@ var computePolygonOffsets = function (polygonData, controller) {
|
|
|
47
47
|
*/
|
|
48
48
|
|
|
49
49
|
var computeMarkerOffset = function (markerData, controller) {
|
|
50
|
-
if (!markerData.position
|
|
50
|
+
if (!markerData.position) {
|
|
51
51
|
return null;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
return controller.positionToOffset(markerData.position
|
|
54
|
+
return controller.positionToOffset(markerData.position);
|
|
55
55
|
};
|
|
56
56
|
/**
|
|
57
57
|
* Point-in-Polygon 알고리즘
|
|
@@ -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;
|
|
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,6 +185,25 @@ 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
|
+
}
|
|
188
207
|
}; //create object
|
|
189
208
|
|
|
190
209
|
|
|
@@ -202,10 +221,12 @@ function MapMarkerWrapper(_a) {
|
|
|
202
221
|
}); //드래그 여부 초기화를 먼저 수행하기 위해 capture : true 처리
|
|
203
222
|
|
|
204
223
|
divElement.addEventListener('mouseover', onMouseOverHandler);
|
|
224
|
+
divElement.addEventListener('mouseleave', onMouseLeaveHandler);
|
|
205
225
|
return function () {
|
|
206
226
|
divElement.removeEventListener('click', onClickHandler);
|
|
207
227
|
divElement.removeEventListener('mousedown', onMousedownHandler);
|
|
208
228
|
divElement.removeEventListener('mouseover', onMouseOverHandler);
|
|
229
|
+
divElement.removeEventListener('mouseleave', onMouseLeaveHandler);
|
|
209
230
|
|
|
210
231
|
if (markerRef.current) {
|
|
211
232
|
controller.clearDrawable(markerRef.current);
|
|
@@ -28,6 +28,7 @@ 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;
|
|
31
32
|
clearDrawable(drawable: Drawable): boolean;
|
|
32
33
|
private dragged;
|
|
33
34
|
isMapDragged(): boolean;
|
|
@@ -21,6 +21,7 @@ require('../naver/NaverMintMapController.js');
|
|
|
21
21
|
require('../core/advanced/canvas/CanvasMarkerClaude.js');
|
|
22
22
|
require('../core/advanced/MapLoadingComponents.js');
|
|
23
23
|
require('../core/advanced/woongCanvas/WoongKonvaMarker.js');
|
|
24
|
+
require('../core/advanced/woongCanvas/shared/types.js');
|
|
24
25
|
require('../core/advanced/woongCanvas/shared/context.js');
|
|
25
26
|
require('../core/advanced/woongCanvas/shared/performance.js');
|
|
26
27
|
require('../core/wrapper/MapControlWrapper.js');
|
|
@@ -339,6 +340,10 @@ function (_super) {
|
|
|
339
340
|
}
|
|
340
341
|
};
|
|
341
342
|
|
|
343
|
+
GoogleMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Google Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
|
|
344
|
+
// 이 기능은 Naver Maps에서만 사용 가능합니다.
|
|
345
|
+
};
|
|
346
|
+
|
|
342
347
|
GoogleMintMapController.prototype.clearDrawable = function (drawable) {
|
|
343
348
|
if (drawable && drawable.native) {
|
|
344
349
|
if (drawable.native instanceof google.maps.Marker || drawable.native instanceof google.maps.Polygon || drawable.native instanceof google.maps.Polyline) {
|
|
@@ -31,6 +31,7 @@ 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;
|
|
34
35
|
clearDrawable(drawable: Drawable): boolean;
|
|
35
36
|
private dragged;
|
|
36
37
|
isMapDragged(): boolean;
|
|
@@ -22,6 +22,7 @@ require('../naver/NaverMintMapController.js');
|
|
|
22
22
|
require('../core/advanced/canvas/CanvasMarkerClaude.js');
|
|
23
23
|
require('../core/advanced/MapLoadingComponents.js');
|
|
24
24
|
require('../core/advanced/woongCanvas/WoongKonvaMarker.js');
|
|
25
|
+
require('../core/advanced/woongCanvas/shared/types.js');
|
|
25
26
|
require('../core/advanced/woongCanvas/shared/context.js');
|
|
26
27
|
require('../core/advanced/woongCanvas/shared/performance.js');
|
|
27
28
|
require('../core/wrapper/MapControlWrapper.js');
|
|
@@ -347,6 +348,10 @@ function (_super) {
|
|
|
347
348
|
}
|
|
348
349
|
};
|
|
349
350
|
|
|
351
|
+
KakaoMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Kakao Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
|
|
352
|
+
// 이 기능은 Naver Maps에서만 사용 가능합니다.
|
|
353
|
+
};
|
|
354
|
+
|
|
350
355
|
KakaoMintMapController.prototype.clearDrawable = function (drawable) {
|
|
351
356
|
var _this = this;
|
|
352
357
|
|
|
@@ -27,9 +27,12 @@ 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;
|
|
30
31
|
private getMaxZIndex;
|
|
32
|
+
private getCurrentZIndex;
|
|
31
33
|
setMarkerZIndex(marker: Marker, zIndex: number): void;
|
|
32
34
|
markerToTheTop(marker: Marker): void;
|
|
35
|
+
restoreMarkerZIndex(marker: Marker): void;
|
|
33
36
|
clearDrawable(drawable: Drawable): boolean;
|
|
34
37
|
private dragged;
|
|
35
38
|
isMapDragged(): boolean;
|