@mint-ui/map 1.2.0-test.69 → 1.2.0-test.70
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/advanced/CanvasMarkerLayer/CanvasMarkerLayer.js +31 -74
- package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/types.d.ts +0 -14
- package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/CanvasPolygonLayer.d.ts +2 -2
- package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/CanvasPolygonLayer.js +28 -65
- package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/types.d.ts +0 -2
- package/dist/index.es.js +54 -138
- package/dist/index.umd.js +54 -138
- package/package.json +1 -1
|
@@ -28,17 +28,15 @@ var CanvasMarkerLayer = function (props) {
|
|
|
28
28
|
var hasRenderEvent = 'renderEvent' in props && props.renderEvent !== undefined; // renderEvent가 있는 경우와 없는 경우를 구분하여 props 추출
|
|
29
29
|
|
|
30
30
|
var data = props.data,
|
|
31
|
-
_a = props.
|
|
32
|
-
|
|
33
|
-
_b = props.
|
|
34
|
-
|
|
35
|
-
_c = props.maxCacheSize,
|
|
36
|
-
maxCacheSize = _c === void 0 ? performance.DEFAULT_MAX_CACHE_SIZE : _c,
|
|
31
|
+
_a = props.cullingMargin,
|
|
32
|
+
cullingMargin = _a === void 0 ? performance.DEFAULT_CULLING_MARGIN : _a,
|
|
33
|
+
_b = props.maxCacheSize,
|
|
34
|
+
maxCacheSize = _b === void 0 ? performance.DEFAULT_MAX_CACHE_SIZE : _b,
|
|
37
35
|
renderBase = props.renderBase,
|
|
38
|
-
options = tslib.__rest(props, ["data", "
|
|
36
|
+
options = tslib.__rest(props, ["data", "cullingMargin", "maxCacheSize", "renderBase"]); // renderEvent가 있는 경우에만 인터랙션 관련 props 추출
|
|
39
37
|
|
|
40
38
|
|
|
41
|
-
var
|
|
39
|
+
var _c = hasRenderEvent && 'renderEvent' in props ? props : {
|
|
42
40
|
disableInteraction: false,
|
|
43
41
|
onClick: undefined,
|
|
44
42
|
onMouseOut: undefined,
|
|
@@ -48,15 +46,15 @@ var CanvasMarkerLayer = function (props) {
|
|
|
48
46
|
selectedItems: undefined,
|
|
49
47
|
topStageZIndex: undefined
|
|
50
48
|
},
|
|
51
|
-
|
|
52
|
-
disableInteraction =
|
|
53
|
-
onClick =
|
|
54
|
-
onMouseOut =
|
|
55
|
-
onMouseOver =
|
|
56
|
-
renderEvent =
|
|
57
|
-
externalSelectedItem =
|
|
58
|
-
externalSelectedItems =
|
|
59
|
-
rawTopStageZIndex =
|
|
49
|
+
_d = _c.disableInteraction,
|
|
50
|
+
disableInteraction = _d === void 0 ? false : _d,
|
|
51
|
+
onClick = _c.onClick,
|
|
52
|
+
onMouseOut = _c.onMouseOut,
|
|
53
|
+
onMouseOver = _c.onMouseOver,
|
|
54
|
+
renderEvent = _c.renderEvent,
|
|
55
|
+
externalSelectedItem = _c.selectedItem,
|
|
56
|
+
externalSelectedItems = _c.selectedItems,
|
|
57
|
+
rawTopStageZIndex = _c.topStageZIndex; // topStageZIndex가 있으면 hover 최상단 표시 활성화, 없으면 비활성화 (성능 우선)
|
|
60
58
|
|
|
61
59
|
|
|
62
60
|
var topStageZIndex = rawTopStageZIndex;
|
|
@@ -82,7 +80,6 @@ var CanvasMarkerLayer = function (props) {
|
|
|
82
80
|
|
|
83
81
|
var dataRef = React.useRef(data);
|
|
84
82
|
var disableInteractionRef = React.useRef(disableInteraction);
|
|
85
|
-
var enableViewportCullingRef = React.useRef(enableViewportCulling);
|
|
86
83
|
var hoveredItemRef = React.useRef(null);
|
|
87
84
|
var selectedItemRef = React.useRef(externalSelectedItem);
|
|
88
85
|
var selectedIdsRef = React.useRef(new Set());
|
|
@@ -164,11 +161,11 @@ var CanvasMarkerLayer = function (props) {
|
|
|
164
161
|
name: 'base-render-shape',
|
|
165
162
|
perfectDrawEnabled: false,
|
|
166
163
|
sceneFunc: function (konvaContext) {
|
|
167
|
-
var ctx = konvaContext; // 뷰포트 컬링: 화면에 보이는 항목만 필터링
|
|
164
|
+
var ctx = konvaContext; // 뷰포트 컬링: 화면에 보이는 항목만 필터링 (항상 활성화)
|
|
168
165
|
|
|
169
|
-
var visibleItems =
|
|
166
|
+
var visibleItems = dataRef.current.filter(function (item) {
|
|
170
167
|
return isInViewport(item);
|
|
171
|
-
})
|
|
168
|
+
}); // Base Layer는 기본 마커만 렌더링 (hover된 항목도 포함)
|
|
172
169
|
// hover 스타일은 Event Layer와 Top Layer에서 덧그려짐
|
|
173
170
|
|
|
174
171
|
renderBase({
|
|
@@ -271,9 +268,9 @@ var CanvasMarkerLayer = function (props) {
|
|
|
271
268
|
var ctx = konvaContext;
|
|
272
269
|
var currentHovered = hoveredItemRef.current; // hover된 항목이 없으면 아무것도 그리지 않음
|
|
273
270
|
|
|
274
|
-
if (!currentHovered) return; // 뷰포트 컬링 확인
|
|
271
|
+
if (!currentHovered) return; // 뷰포트 컬링 확인 (항상 활성화)
|
|
275
272
|
|
|
276
|
-
if (
|
|
273
|
+
if (!isInViewport(currentHovered)) {
|
|
277
274
|
return;
|
|
278
275
|
}
|
|
279
276
|
|
|
@@ -313,10 +310,7 @@ var CanvasMarkerLayer = function (props) {
|
|
|
313
310
|
|
|
314
311
|
|
|
315
312
|
var renderAllImmediate = function () {
|
|
316
|
-
|
|
317
|
-
updateViewport();
|
|
318
|
-
}
|
|
319
|
-
|
|
313
|
+
updateViewport();
|
|
320
314
|
buildSpatialIndex();
|
|
321
315
|
doRenderBase();
|
|
322
316
|
doRenderEvent(); // 메인 stage의 transform을 topStage에도 동기화
|
|
@@ -331,7 +325,7 @@ var CanvasMarkerLayer = function (props) {
|
|
|
331
325
|
}; // 지도 이벤트 핸들러 생성
|
|
332
326
|
|
|
333
327
|
|
|
334
|
-
var
|
|
328
|
+
var _e = hooks.createMapEventHandlers({
|
|
335
329
|
accumTranslateRef: accumTranslateRef,
|
|
336
330
|
boundingBoxCacheRef: boundingBoxCacheRef,
|
|
337
331
|
containerRef: containerRef,
|
|
@@ -342,12 +336,12 @@ var CanvasMarkerLayer = function (props) {
|
|
|
342
336
|
prevCenterOffsetRef: prevCenterOffsetRef,
|
|
343
337
|
renderAllImmediate: renderAllImmediate
|
|
344
338
|
}),
|
|
345
|
-
handleIdleShared =
|
|
346
|
-
handleZoomStart =
|
|
347
|
-
handleZoomEnd =
|
|
348
|
-
handleCenterChangedShared =
|
|
349
|
-
handleDragStartShared =
|
|
350
|
-
handleDragEndShared =
|
|
339
|
+
handleIdleShared = _e.handleIdle,
|
|
340
|
+
handleZoomStart = _e.handleZoomStart,
|
|
341
|
+
handleZoomEnd = _e.handleZoomEnd,
|
|
342
|
+
handleCenterChangedShared = _e.handleCenterChanged,
|
|
343
|
+
handleDragStartShared = _e.handleDragStart,
|
|
344
|
+
handleDragEndShared = _e.handleDragEnd; // handleIdle 래핑: topStage transform 제거 추가
|
|
351
345
|
|
|
352
346
|
|
|
353
347
|
var handleIdle = function () {
|
|
@@ -601,11 +595,7 @@ var CanvasMarkerLayer = function (props) {
|
|
|
601
595
|
eventLayerRef.current = eventLayer;
|
|
602
596
|
stage.add(baseLayer);
|
|
603
597
|
stage.add(eventLayer);
|
|
604
|
-
|
|
605
|
-
if (enableViewportCulling) {
|
|
606
|
-
updateViewport();
|
|
607
|
-
} // ResizeObserver: 맵 크기 변경 감지 (RAF로 debounce)
|
|
608
|
-
|
|
598
|
+
updateViewport(); // ResizeObserver: 맵 크기 변경 감지 (RAF로 debounce)
|
|
609
599
|
|
|
610
600
|
var resizeRafId = null;
|
|
611
601
|
var resizeObserver = new ResizeObserver(function () {
|
|
@@ -618,11 +608,7 @@ var CanvasMarkerLayer = function (props) {
|
|
|
618
608
|
stage.height(mapDiv.offsetHeight);
|
|
619
609
|
offsetCacheRef.current.clear();
|
|
620
610
|
boundingBoxCacheRef.current.clear();
|
|
621
|
-
|
|
622
|
-
if (enableViewportCullingRef.current) {
|
|
623
|
-
updateViewport();
|
|
624
|
-
}
|
|
625
|
-
|
|
611
|
+
updateViewport();
|
|
626
612
|
renderAllImmediate();
|
|
627
613
|
resizeRafId = null;
|
|
628
614
|
});
|
|
@@ -704,36 +690,7 @@ var CanvasMarkerLayer = function (props) {
|
|
|
704
690
|
|
|
705
691
|
React.useEffect(function () {
|
|
706
692
|
disableInteractionRef.current = disableInteraction;
|
|
707
|
-
}, [disableInteraction]); //
|
|
708
|
-
|
|
709
|
-
React.useEffect(function () {
|
|
710
|
-
enableViewportCullingRef.current = enableViewportCulling;
|
|
711
|
-
|
|
712
|
-
if (stageRef.current) {
|
|
713
|
-
// 뷰포트 컬링 설정이 변경되면 shape 재생성 필요
|
|
714
|
-
var baseLayer = baseLayerRef.current;
|
|
715
|
-
|
|
716
|
-
if (baseLayer) {
|
|
717
|
-
var shape = baseLayer.findOne('.base-render-shape');
|
|
718
|
-
|
|
719
|
-
if (shape) {
|
|
720
|
-
shape.destroy();
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
|
|
724
|
-
var eventLayer = eventLayerRef.current;
|
|
725
|
-
|
|
726
|
-
if (eventLayer) {
|
|
727
|
-
var shape = eventLayer.findOne('.event-render-shape');
|
|
728
|
-
|
|
729
|
-
if (shape) {
|
|
730
|
-
shape.destroy();
|
|
731
|
-
}
|
|
732
|
-
}
|
|
733
|
-
|
|
734
|
-
renderAllImmediate();
|
|
735
|
-
}
|
|
736
|
-
}, [enableViewportCulling]); // Top Layer용 별도 캔버스 DOM 생성 (topStageZIndex가 설정된 경우)
|
|
693
|
+
}, [disableInteraction]); // Top Layer용 별도 캔버스 DOM 생성 (topStageZIndex가 설정된 경우)
|
|
737
694
|
|
|
738
695
|
React.useEffect(function () {
|
|
739
696
|
if (topStageZIndex === undefined) return;
|
|
@@ -8,8 +8,6 @@ import type { CanvasData, CustomRenderBase, CustomRenderEvent } from '../shared'
|
|
|
8
8
|
export interface CanvasMarkerLayerPropsWithoutEvent<T> extends Pick<MarkerOptions, 'zIndex' | 'anchor' | 'visible'> {
|
|
9
9
|
/** 렌더링할 마커 데이터 배열 */
|
|
10
10
|
data: CanvasData<T>[];
|
|
11
|
-
/** 뷰포트 컬링 활성화 여부 (기본값: false) */
|
|
12
|
-
enableViewportCulling?: boolean;
|
|
13
11
|
/** 뷰포트 컬링 여유 공간 (픽셀 단위, 기본값: 100) */
|
|
14
12
|
cullingMargin?: number;
|
|
15
13
|
/** Queue 캐시 최대 크기 (기본값: 30000) */
|
|
@@ -43,8 +41,6 @@ export interface CanvasMarkerLayerPropsWithEventWithSelectedItem<T> extends Pick
|
|
|
43
41
|
onMouseOver?: (payload: CanvasData<T>) => void;
|
|
44
42
|
/** 마커에서 마우스 아웃 시 호출되는 콜백 함수 */
|
|
45
43
|
onMouseOut?: (payload: CanvasData<T>) => void;
|
|
46
|
-
/** 뷰포트 컬링 활성화 여부 (기본값: false) */
|
|
47
|
-
enableViewportCulling?: boolean;
|
|
48
44
|
/** 뷰포트 컬링 여유 공간 (픽셀 단위, 기본값: 100) */
|
|
49
45
|
cullingMargin?: number;
|
|
50
46
|
/** Queue 캐시 최대 크기 (기본값: 30000) */
|
|
@@ -77,8 +73,6 @@ export interface CanvasMarkerLayerPropsWithEventWithSelectedItems<T> extends Pic
|
|
|
77
73
|
onMouseOver?: (payload: CanvasData<T>) => void;
|
|
78
74
|
/** 마커에서 마우스 아웃 시 호출되는 콜백 함수 */
|
|
79
75
|
onMouseOut?: (payload: CanvasData<T>) => void;
|
|
80
|
-
/** 뷰포트 컬링 활성화 여부 (기본값: false) */
|
|
81
|
-
enableViewportCulling?: boolean;
|
|
82
76
|
/** 뷰포트 컬링 여유 공간 (픽셀 단위, 기본값: 100) */
|
|
83
77
|
cullingMargin?: number;
|
|
84
78
|
/** Queue 캐시 최대 크기 (기본값: 30000) */
|
|
@@ -111,8 +105,6 @@ export interface CanvasMarkerLayerPropsWithEventWithoutSelection<T> extends Pick
|
|
|
111
105
|
onMouseOver?: (payload: CanvasData<T>) => void;
|
|
112
106
|
/** 마커에서 마우스 아웃 시 호출되는 콜백 함수 */
|
|
113
107
|
onMouseOut?: (payload: CanvasData<T>) => void;
|
|
114
|
-
/** 뷰포트 컬링 활성화 여부 (기본값: false) */
|
|
115
|
-
enableViewportCulling?: boolean;
|
|
116
108
|
/** 뷰포트 컬링 여유 공간 (픽셀 단위, 기본값: 100) */
|
|
117
109
|
cullingMargin?: number;
|
|
118
110
|
/** Queue 캐시 최대 크기 (기본값: 30000) */
|
|
@@ -146,8 +138,6 @@ export interface CanvasMarkerLayerPropsWithEventWithTopStageWithSelectedItem<T>
|
|
|
146
138
|
onMouseOver?: (payload: CanvasData<T>) => void;
|
|
147
139
|
/** 마커에서 마우스 아웃 시 호출되는 콜백 함수 */
|
|
148
140
|
onMouseOut?: (payload: CanvasData<T>) => void;
|
|
149
|
-
/** 뷰포트 컬링 활성화 여부 (기본값: false) */
|
|
150
|
-
enableViewportCulling?: boolean;
|
|
151
141
|
/** 뷰포트 컬링 여유 공간 (픽셀 단위, 기본값: 100) */
|
|
152
142
|
cullingMargin?: number;
|
|
153
143
|
/** Queue 캐시 최대 크기 (기본값: 30000) */
|
|
@@ -181,8 +171,6 @@ export interface CanvasMarkerLayerPropsWithEventWithTopStageWithSelectedItems<T>
|
|
|
181
171
|
onMouseOver?: (payload: CanvasData<T>) => void;
|
|
182
172
|
/** 마커에서 마우스 아웃 시 호출되는 콜백 함수 */
|
|
183
173
|
onMouseOut?: (payload: CanvasData<T>) => void;
|
|
184
|
-
/** 뷰포트 컬링 활성화 여부 (기본값: false) */
|
|
185
|
-
enableViewportCulling?: boolean;
|
|
186
174
|
/** 뷰포트 컬링 여유 공간 (픽셀 단위, 기본값: 100) */
|
|
187
175
|
cullingMargin?: number;
|
|
188
176
|
/** Queue 캐시 최대 크기 (기본값: 30000) */
|
|
@@ -216,8 +204,6 @@ export interface CanvasMarkerLayerPropsWithEventWithTopStageWithoutSelection<T>
|
|
|
216
204
|
onMouseOver?: (payload: CanvasData<T>) => void;
|
|
217
205
|
/** 마커에서 마우스 아웃 시 호출되는 콜백 함수 */
|
|
218
206
|
onMouseOut?: (payload: CanvasData<T>) => void;
|
|
219
|
-
/** 뷰포트 컬링 활성화 여부 (기본값: false) */
|
|
220
|
-
enableViewportCulling?: boolean;
|
|
221
207
|
/** 뷰포트 컬링 여유 공간 (픽셀 단위, 기본값: 100) */
|
|
222
208
|
cullingMargin?: number;
|
|
223
209
|
/** Queue 캐시 최대 크기 (기본값: 30000) */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { CanvasPolygonLayerProps } from './types';
|
|
3
|
-
export { CanvasProvider, QueueCache, SpatialHashGrid } from '../shared';
|
|
4
|
-
export type { CanvasData, CanvasOption, RenderUtils } from '../shared';
|
|
3
|
+
export { CanvasProvider, QueueCache, RenderSource, SpatialHashGrid } from '../shared';
|
|
4
|
+
export type { CanvasData, CanvasOption, CustomRenderEvent, RenderUtils } from '../shared';
|
|
5
5
|
export type { CanvasPolygonLayerBaseProps, CanvasPolygonLayerProps, CanvasPolygonLayerPropsWithCustomStyle, CanvasPolygonLayerPropsWithIndividualStyles, CanvasPolygonLayerPropsWithObjectStyle, PolygonStyle, PolygonStyleContext, PolygonStyleCustomizer, PolygonStyleCustomizerWithDeps, PolygonStyleObject } from './types';
|
|
6
6
|
declare const CanvasPolygonLayer: <T>(props: CanvasPolygonLayerProps<T>) => React.ReactPortal;
|
|
7
7
|
/**
|
|
@@ -15,7 +15,7 @@ var context = require('../shared/context.js');
|
|
|
15
15
|
var helpers = require('../shared/helpers.js');
|
|
16
16
|
var hooks = require('../shared/hooks.js');
|
|
17
17
|
var performance = require('../shared/performance.js');
|
|
18
|
-
require('../shared/types.js');
|
|
18
|
+
var types = require('../shared/types.js');
|
|
19
19
|
var utils = require('../shared/utils.js');
|
|
20
20
|
var viewport = require('../shared/viewport.js');
|
|
21
21
|
|
|
@@ -29,17 +29,15 @@ var CanvasPolygonLayer = function (props) {
|
|
|
29
29
|
onClick = props.onClick,
|
|
30
30
|
_a = props.enableMultiSelect,
|
|
31
31
|
enableMultiSelect = _a === void 0 ? false : _a,
|
|
32
|
-
_b = props.
|
|
33
|
-
|
|
34
|
-
_c = props.
|
|
35
|
-
|
|
36
|
-
_d = props.maxCacheSize,
|
|
37
|
-
maxCacheSize = _d === void 0 ? performance.DEFAULT_MAX_CACHE_SIZE : _d,
|
|
32
|
+
_b = props.cullingMargin,
|
|
33
|
+
cullingMargin = _b === void 0 ? performance.DEFAULT_CULLING_MARGIN : _b,
|
|
34
|
+
_c = props.maxCacheSize,
|
|
35
|
+
maxCacheSize = _c === void 0 ? performance.DEFAULT_MAX_CACHE_SIZE : _c,
|
|
38
36
|
externalSelectedItems = props.selectedItems,
|
|
39
37
|
externalSelectedItem = props.selectedItem,
|
|
40
|
-
|
|
41
|
-
disableInteraction =
|
|
42
|
-
options = tslib.__rest(props, ["data", "onClick", "enableMultiSelect", "
|
|
38
|
+
_d = props.disableInteraction,
|
|
39
|
+
disableInteraction = _d === void 0 ? false : _d,
|
|
40
|
+
options = tslib.__rest(props, ["data", "onClick", "enableMultiSelect", "cullingMargin", "maxCacheSize", "selectedItems", "selectedItem", "disableInteraction"]); // customStyle은 다른 방식과 함께 사용 가능
|
|
43
41
|
|
|
44
42
|
|
|
45
43
|
var hasCustomStyle = 'customStyle' in props && props.customStyle !== undefined;
|
|
@@ -70,7 +68,6 @@ var CanvasPolygonLayer = function (props) {
|
|
|
70
68
|
|
|
71
69
|
var dataRef = React.useRef(data);
|
|
72
70
|
var disableInteractionRef = React.useRef(disableInteraction);
|
|
73
|
-
var enableViewportCullingRef = React.useRef(enableViewportCulling);
|
|
74
71
|
var hoveredItemRef = React.useRef(null);
|
|
75
72
|
var selectedItemRef = React.useRef(externalSelectedItem);
|
|
76
73
|
var selectedIdsRef = React.useRef(new Set());
|
|
@@ -203,11 +200,11 @@ var CanvasPolygonLayer = function (props) {
|
|
|
203
200
|
perfectDrawEnabled: false,
|
|
204
201
|
sceneFunc: function (konvaContext) {
|
|
205
202
|
var ctx = konvaContext;
|
|
206
|
-
var hovered = hoveredItemRef.current; // 뷰포트 컬링: 화면에 보이는 항목만 필터링
|
|
203
|
+
var hovered = hoveredItemRef.current; // 뷰포트 컬링: 화면에 보이는 항목만 필터링 (항상 활성화)
|
|
207
204
|
|
|
208
|
-
var visibleItems =
|
|
205
|
+
var visibleItems = dataRef.current.filter(function (item) {
|
|
209
206
|
return isInViewport(item);
|
|
210
|
-
})
|
|
207
|
+
});
|
|
211
208
|
renderBase({
|
|
212
209
|
ctx: ctx,
|
|
213
210
|
hoveredItem: hovered,
|
|
@@ -241,7 +238,9 @@ var CanvasPolygonLayer = function (props) {
|
|
|
241
238
|
var selectedItems = helpers.mapValuesToArray(selectedItemsMapRef.current);
|
|
242
239
|
renderEvent({
|
|
243
240
|
ctx: ctx,
|
|
241
|
+
hasTopStage: false,
|
|
244
242
|
hoveredItem: hovered,
|
|
243
|
+
renderSource: types.RenderSource.EVENT,
|
|
245
244
|
selectedItem: selectedItemRef.current,
|
|
246
245
|
selectedItems: selectedItems,
|
|
247
246
|
utils: renderUtils
|
|
@@ -256,17 +255,14 @@ var CanvasPolygonLayer = function (props) {
|
|
|
256
255
|
|
|
257
256
|
|
|
258
257
|
var renderAllImmediate = function () {
|
|
259
|
-
|
|
260
|
-
updateViewport();
|
|
261
|
-
}
|
|
262
|
-
|
|
258
|
+
updateViewport();
|
|
263
259
|
buildSpatialIndex();
|
|
264
260
|
doRenderBase();
|
|
265
261
|
doRenderEvent();
|
|
266
262
|
}; // 지도 이벤트 핸들러 생성
|
|
267
263
|
|
|
268
264
|
|
|
269
|
-
var
|
|
265
|
+
var _e = hooks.createMapEventHandlers({
|
|
270
266
|
accumTranslateRef: accumTranslateRef,
|
|
271
267
|
boundingBoxCacheRef: boundingBoxCacheRef,
|
|
272
268
|
containerRef: containerRef,
|
|
@@ -277,12 +273,12 @@ var CanvasPolygonLayer = function (props) {
|
|
|
277
273
|
prevCenterOffsetRef: prevCenterOffsetRef,
|
|
278
274
|
renderAllImmediate: renderAllImmediate
|
|
279
275
|
}),
|
|
280
|
-
handleIdle =
|
|
281
|
-
handleZoomStart =
|
|
282
|
-
handleZoomEnd =
|
|
283
|
-
handleCenterChanged =
|
|
284
|
-
handleDragStartShared =
|
|
285
|
-
handleDragEndShared =
|
|
276
|
+
handleIdle = _e.handleIdle,
|
|
277
|
+
handleZoomStart = _e.handleZoomStart,
|
|
278
|
+
handleZoomEnd = _e.handleZoomEnd,
|
|
279
|
+
handleCenterChanged = _e.handleCenterChanged,
|
|
280
|
+
handleDragStartShared = _e.handleDragStart,
|
|
281
|
+
handleDragEndShared = _e.handleDragEnd;
|
|
286
282
|
|
|
287
283
|
var handleDragStart = function () {
|
|
288
284
|
handleDragStartShared(); // 드래그 시작 시점의 hover 상태 저장
|
|
@@ -455,11 +451,7 @@ var CanvasPolygonLayer = function (props) {
|
|
|
455
451
|
eventLayerRef.current = eventLayer;
|
|
456
452
|
stage.add(baseLayer);
|
|
457
453
|
stage.add(eventLayer);
|
|
458
|
-
|
|
459
|
-
if (enableViewportCulling) {
|
|
460
|
-
updateViewport();
|
|
461
|
-
} // ResizeObserver: 맵 크기 변경 감지 (RAF로 debounce)
|
|
462
|
-
|
|
454
|
+
updateViewport(); // ResizeObserver: 맵 크기 변경 감지 (RAF로 debounce)
|
|
463
455
|
|
|
464
456
|
var resizeRafId = null;
|
|
465
457
|
var resizeObserver = new ResizeObserver(function () {
|
|
@@ -472,11 +464,7 @@ var CanvasPolygonLayer = function (props) {
|
|
|
472
464
|
stage.height(mapDiv.offsetHeight);
|
|
473
465
|
offsetCacheRef.current.clear();
|
|
474
466
|
boundingBoxCacheRef.current.clear();
|
|
475
|
-
|
|
476
|
-
if (enableViewportCullingRef.current) {
|
|
477
|
-
updateViewport();
|
|
478
|
-
}
|
|
479
|
-
|
|
467
|
+
updateViewport();
|
|
480
468
|
renderAllImmediate();
|
|
481
469
|
resizeRafId = null;
|
|
482
470
|
});
|
|
@@ -546,36 +534,7 @@ var CanvasPolygonLayer = function (props) {
|
|
|
546
534
|
|
|
547
535
|
React.useEffect(function () {
|
|
548
536
|
disableInteractionRef.current = disableInteraction;
|
|
549
|
-
}, [disableInteraction]); //
|
|
550
|
-
|
|
551
|
-
React.useEffect(function () {
|
|
552
|
-
enableViewportCullingRef.current = enableViewportCulling;
|
|
553
|
-
|
|
554
|
-
if (stageRef.current) {
|
|
555
|
-
// 뷰포트 컬링 설정이 변경되면 shape 재생성 필요
|
|
556
|
-
var baseLayer = baseLayerRef.current;
|
|
557
|
-
|
|
558
|
-
if (baseLayer) {
|
|
559
|
-
var shape = baseLayer.findOne('.base-render-shape');
|
|
560
|
-
|
|
561
|
-
if (shape) {
|
|
562
|
-
shape.destroy();
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
var eventLayer = eventLayerRef.current;
|
|
567
|
-
|
|
568
|
-
if (eventLayer) {
|
|
569
|
-
var shape = eventLayer.findOne('.event-render-shape');
|
|
570
|
-
|
|
571
|
-
if (shape) {
|
|
572
|
-
shape.destroy();
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
renderAllImmediate();
|
|
577
|
-
}
|
|
578
|
-
}, [enableViewportCulling]); // 외부 selectedItems 동기화
|
|
537
|
+
}, [disableInteraction]); // 외부 selectedItems 동기화
|
|
579
538
|
|
|
580
539
|
React.useEffect(function () {
|
|
581
540
|
if (!stageRef.current) return;
|
|
@@ -631,4 +590,8 @@ var CanvasPolygonLayer = function (props) {
|
|
|
631
590
|
exports.CanvasProvider = context.CanvasProvider;
|
|
632
591
|
exports.QueueCache = performance.QueueCache;
|
|
633
592
|
exports.SpatialHashGrid = performance.SpatialHashGrid;
|
|
593
|
+
Object.defineProperty(exports, 'RenderSource', {
|
|
594
|
+
enumerable: true,
|
|
595
|
+
get: function () { return types.RenderSource; }
|
|
596
|
+
});
|
|
634
597
|
exports["default"] = CanvasPolygonLayer;
|
|
@@ -113,8 +113,6 @@ export interface CanvasPolygonLayerBaseProps<T> extends Pick<MarkerOptions, 'zIn
|
|
|
113
113
|
onClick?: (payload: CanvasData<T>, selectedIds: Set<string>) => void;
|
|
114
114
|
/** 다중 선택 활성화 여부 (기본값: false) */
|
|
115
115
|
enableMultiSelect?: boolean;
|
|
116
|
-
/** 뷰포트 컬링 활성화 여부 (기본값: false) */
|
|
117
|
-
enableViewportCulling?: boolean;
|
|
118
116
|
/** 뷰포트 컬링 여유 공간 (픽셀 단위, 기본값: 100) */
|
|
119
117
|
cullingMargin?: number;
|
|
120
118
|
/** Queue 캐시 최대 크기 (기본값: 30000) */
|
package/dist/index.es.js
CHANGED
|
@@ -3952,17 +3952,15 @@ var CanvasMarkerLayer = function (props) {
|
|
|
3952
3952
|
var hasRenderEvent = 'renderEvent' in props && props.renderEvent !== undefined; // renderEvent가 있는 경우와 없는 경우를 구분하여 props 추출
|
|
3953
3953
|
|
|
3954
3954
|
var data = props.data,
|
|
3955
|
-
_a = props.
|
|
3956
|
-
|
|
3957
|
-
_b = props.
|
|
3958
|
-
|
|
3959
|
-
_c = props.maxCacheSize,
|
|
3960
|
-
maxCacheSize = _c === void 0 ? DEFAULT_MAX_CACHE_SIZE : _c,
|
|
3955
|
+
_a = props.cullingMargin,
|
|
3956
|
+
cullingMargin = _a === void 0 ? DEFAULT_CULLING_MARGIN : _a,
|
|
3957
|
+
_b = props.maxCacheSize,
|
|
3958
|
+
maxCacheSize = _b === void 0 ? DEFAULT_MAX_CACHE_SIZE : _b,
|
|
3961
3959
|
renderBase = props.renderBase,
|
|
3962
|
-
options = __rest(props, ["data", "
|
|
3960
|
+
options = __rest(props, ["data", "cullingMargin", "maxCacheSize", "renderBase"]); // renderEvent가 있는 경우에만 인터랙션 관련 props 추출
|
|
3963
3961
|
|
|
3964
3962
|
|
|
3965
|
-
var
|
|
3963
|
+
var _c = hasRenderEvent && 'renderEvent' in props ? props : {
|
|
3966
3964
|
disableInteraction: false,
|
|
3967
3965
|
onClick: undefined,
|
|
3968
3966
|
onMouseOut: undefined,
|
|
@@ -3972,15 +3970,15 @@ var CanvasMarkerLayer = function (props) {
|
|
|
3972
3970
|
selectedItems: undefined,
|
|
3973
3971
|
topStageZIndex: undefined
|
|
3974
3972
|
},
|
|
3975
|
-
|
|
3976
|
-
disableInteraction =
|
|
3977
|
-
onClick =
|
|
3978
|
-
onMouseOut =
|
|
3979
|
-
onMouseOver =
|
|
3980
|
-
renderEvent =
|
|
3981
|
-
externalSelectedItem =
|
|
3982
|
-
externalSelectedItems =
|
|
3983
|
-
rawTopStageZIndex =
|
|
3973
|
+
_d = _c.disableInteraction,
|
|
3974
|
+
disableInteraction = _d === void 0 ? false : _d,
|
|
3975
|
+
onClick = _c.onClick,
|
|
3976
|
+
onMouseOut = _c.onMouseOut,
|
|
3977
|
+
onMouseOver = _c.onMouseOver,
|
|
3978
|
+
renderEvent = _c.renderEvent,
|
|
3979
|
+
externalSelectedItem = _c.selectedItem,
|
|
3980
|
+
externalSelectedItems = _c.selectedItems,
|
|
3981
|
+
rawTopStageZIndex = _c.topStageZIndex; // topStageZIndex가 있으면 hover 최상단 표시 활성화, 없으면 비활성화 (성능 우선)
|
|
3984
3982
|
|
|
3985
3983
|
|
|
3986
3984
|
var topStageZIndex = rawTopStageZIndex;
|
|
@@ -4006,7 +4004,6 @@ var CanvasMarkerLayer = function (props) {
|
|
|
4006
4004
|
|
|
4007
4005
|
var dataRef = useRef(data);
|
|
4008
4006
|
var disableInteractionRef = useRef(disableInteraction);
|
|
4009
|
-
var enableViewportCullingRef = useRef(enableViewportCulling);
|
|
4010
4007
|
var hoveredItemRef = useRef(null);
|
|
4011
4008
|
var selectedItemRef = useRef(externalSelectedItem);
|
|
4012
4009
|
var selectedIdsRef = useRef(new Set());
|
|
@@ -4088,11 +4085,11 @@ var CanvasMarkerLayer = function (props) {
|
|
|
4088
4085
|
name: 'base-render-shape',
|
|
4089
4086
|
perfectDrawEnabled: false,
|
|
4090
4087
|
sceneFunc: function (konvaContext) {
|
|
4091
|
-
var ctx = konvaContext; // 뷰포트 컬링: 화면에 보이는 항목만 필터링
|
|
4088
|
+
var ctx = konvaContext; // 뷰포트 컬링: 화면에 보이는 항목만 필터링 (항상 활성화)
|
|
4092
4089
|
|
|
4093
|
-
var visibleItems =
|
|
4090
|
+
var visibleItems = dataRef.current.filter(function (item) {
|
|
4094
4091
|
return isInViewport$1(item);
|
|
4095
|
-
})
|
|
4092
|
+
}); // Base Layer는 기본 마커만 렌더링 (hover된 항목도 포함)
|
|
4096
4093
|
// hover 스타일은 Event Layer와 Top Layer에서 덧그려짐
|
|
4097
4094
|
|
|
4098
4095
|
renderBase({
|
|
@@ -4195,9 +4192,9 @@ var CanvasMarkerLayer = function (props) {
|
|
|
4195
4192
|
var ctx = konvaContext;
|
|
4196
4193
|
var currentHovered = hoveredItemRef.current; // hover된 항목이 없으면 아무것도 그리지 않음
|
|
4197
4194
|
|
|
4198
|
-
if (!currentHovered) return; // 뷰포트 컬링 확인
|
|
4195
|
+
if (!currentHovered) return; // 뷰포트 컬링 확인 (항상 활성화)
|
|
4199
4196
|
|
|
4200
|
-
if (
|
|
4197
|
+
if (!isInViewport$1(currentHovered)) {
|
|
4201
4198
|
return;
|
|
4202
4199
|
}
|
|
4203
4200
|
|
|
@@ -4237,10 +4234,7 @@ var CanvasMarkerLayer = function (props) {
|
|
|
4237
4234
|
|
|
4238
4235
|
|
|
4239
4236
|
var renderAllImmediate = function () {
|
|
4240
|
-
|
|
4241
|
-
updateViewport$1();
|
|
4242
|
-
}
|
|
4243
|
-
|
|
4237
|
+
updateViewport$1();
|
|
4244
4238
|
buildSpatialIndex$1();
|
|
4245
4239
|
doRenderBase();
|
|
4246
4240
|
doRenderEvent(); // 메인 stage의 transform을 topStage에도 동기화
|
|
@@ -4255,7 +4249,7 @@ var CanvasMarkerLayer = function (props) {
|
|
|
4255
4249
|
}; // 지도 이벤트 핸들러 생성
|
|
4256
4250
|
|
|
4257
4251
|
|
|
4258
|
-
var
|
|
4252
|
+
var _e = createMapEventHandlers({
|
|
4259
4253
|
accumTranslateRef: accumTranslateRef,
|
|
4260
4254
|
boundingBoxCacheRef: boundingBoxCacheRef,
|
|
4261
4255
|
containerRef: containerRef,
|
|
@@ -4266,12 +4260,12 @@ var CanvasMarkerLayer = function (props) {
|
|
|
4266
4260
|
prevCenterOffsetRef: prevCenterOffsetRef,
|
|
4267
4261
|
renderAllImmediate: renderAllImmediate
|
|
4268
4262
|
}),
|
|
4269
|
-
handleIdleShared =
|
|
4270
|
-
handleZoomStart =
|
|
4271
|
-
handleZoomEnd =
|
|
4272
|
-
handleCenterChangedShared =
|
|
4273
|
-
handleDragStartShared =
|
|
4274
|
-
handleDragEndShared =
|
|
4263
|
+
handleIdleShared = _e.handleIdle,
|
|
4264
|
+
handleZoomStart = _e.handleZoomStart,
|
|
4265
|
+
handleZoomEnd = _e.handleZoomEnd,
|
|
4266
|
+
handleCenterChangedShared = _e.handleCenterChanged,
|
|
4267
|
+
handleDragStartShared = _e.handleDragStart,
|
|
4268
|
+
handleDragEndShared = _e.handleDragEnd; // handleIdle 래핑: topStage transform 제거 추가
|
|
4275
4269
|
|
|
4276
4270
|
|
|
4277
4271
|
var handleIdle = function () {
|
|
@@ -4525,11 +4519,7 @@ var CanvasMarkerLayer = function (props) {
|
|
|
4525
4519
|
eventLayerRef.current = eventLayer;
|
|
4526
4520
|
stage.add(baseLayer);
|
|
4527
4521
|
stage.add(eventLayer);
|
|
4528
|
-
|
|
4529
|
-
if (enableViewportCulling) {
|
|
4530
|
-
updateViewport$1();
|
|
4531
|
-
} // ResizeObserver: 맵 크기 변경 감지 (RAF로 debounce)
|
|
4532
|
-
|
|
4522
|
+
updateViewport$1(); // ResizeObserver: 맵 크기 변경 감지 (RAF로 debounce)
|
|
4533
4523
|
|
|
4534
4524
|
var resizeRafId = null;
|
|
4535
4525
|
var resizeObserver = new ResizeObserver(function () {
|
|
@@ -4542,11 +4532,7 @@ var CanvasMarkerLayer = function (props) {
|
|
|
4542
4532
|
stage.height(mapDiv.offsetHeight);
|
|
4543
4533
|
offsetCacheRef.current.clear();
|
|
4544
4534
|
boundingBoxCacheRef.current.clear();
|
|
4545
|
-
|
|
4546
|
-
if (enableViewportCullingRef.current) {
|
|
4547
|
-
updateViewport$1();
|
|
4548
|
-
}
|
|
4549
|
-
|
|
4535
|
+
updateViewport$1();
|
|
4550
4536
|
renderAllImmediate();
|
|
4551
4537
|
resizeRafId = null;
|
|
4552
4538
|
});
|
|
@@ -4628,36 +4614,7 @@ var CanvasMarkerLayer = function (props) {
|
|
|
4628
4614
|
|
|
4629
4615
|
useEffect(function () {
|
|
4630
4616
|
disableInteractionRef.current = disableInteraction;
|
|
4631
|
-
}, [disableInteraction]); //
|
|
4632
|
-
|
|
4633
|
-
useEffect(function () {
|
|
4634
|
-
enableViewportCullingRef.current = enableViewportCulling;
|
|
4635
|
-
|
|
4636
|
-
if (stageRef.current) {
|
|
4637
|
-
// 뷰포트 컬링 설정이 변경되면 shape 재생성 필요
|
|
4638
|
-
var baseLayer = baseLayerRef.current;
|
|
4639
|
-
|
|
4640
|
-
if (baseLayer) {
|
|
4641
|
-
var shape = baseLayer.findOne('.base-render-shape');
|
|
4642
|
-
|
|
4643
|
-
if (shape) {
|
|
4644
|
-
shape.destroy();
|
|
4645
|
-
}
|
|
4646
|
-
}
|
|
4647
|
-
|
|
4648
|
-
var eventLayer = eventLayerRef.current;
|
|
4649
|
-
|
|
4650
|
-
if (eventLayer) {
|
|
4651
|
-
var shape = eventLayer.findOne('.event-render-shape');
|
|
4652
|
-
|
|
4653
|
-
if (shape) {
|
|
4654
|
-
shape.destroy();
|
|
4655
|
-
}
|
|
4656
|
-
}
|
|
4657
|
-
|
|
4658
|
-
renderAllImmediate();
|
|
4659
|
-
}
|
|
4660
|
-
}, [enableViewportCulling]); // Top Layer용 별도 캔버스 DOM 생성 (topStageZIndex가 설정된 경우)
|
|
4617
|
+
}, [disableInteraction]); // Top Layer용 별도 캔버스 DOM 생성 (topStageZIndex가 설정된 경우)
|
|
4661
4618
|
|
|
4662
4619
|
useEffect(function () {
|
|
4663
4620
|
if (topStageZIndex === undefined) return;
|
|
@@ -5968,17 +5925,15 @@ var CanvasPolygonLayer = function (props) {
|
|
|
5968
5925
|
onClick = props.onClick,
|
|
5969
5926
|
_a = props.enableMultiSelect,
|
|
5970
5927
|
enableMultiSelect = _a === void 0 ? false : _a,
|
|
5971
|
-
_b = props.
|
|
5972
|
-
|
|
5973
|
-
_c = props.
|
|
5974
|
-
|
|
5975
|
-
_d = props.maxCacheSize,
|
|
5976
|
-
maxCacheSize = _d === void 0 ? DEFAULT_MAX_CACHE_SIZE : _d,
|
|
5928
|
+
_b = props.cullingMargin,
|
|
5929
|
+
cullingMargin = _b === void 0 ? DEFAULT_CULLING_MARGIN : _b,
|
|
5930
|
+
_c = props.maxCacheSize,
|
|
5931
|
+
maxCacheSize = _c === void 0 ? DEFAULT_MAX_CACHE_SIZE : _c,
|
|
5977
5932
|
externalSelectedItems = props.selectedItems,
|
|
5978
5933
|
externalSelectedItem = props.selectedItem,
|
|
5979
|
-
|
|
5980
|
-
disableInteraction =
|
|
5981
|
-
options = __rest(props, ["data", "onClick", "enableMultiSelect", "
|
|
5934
|
+
_d = props.disableInteraction,
|
|
5935
|
+
disableInteraction = _d === void 0 ? false : _d,
|
|
5936
|
+
options = __rest(props, ["data", "onClick", "enableMultiSelect", "cullingMargin", "maxCacheSize", "selectedItems", "selectedItem", "disableInteraction"]); // customStyle은 다른 방식과 함께 사용 가능
|
|
5982
5937
|
|
|
5983
5938
|
|
|
5984
5939
|
var hasCustomStyle = 'customStyle' in props && props.customStyle !== undefined;
|
|
@@ -6009,7 +5964,6 @@ var CanvasPolygonLayer = function (props) {
|
|
|
6009
5964
|
|
|
6010
5965
|
var dataRef = useRef(data);
|
|
6011
5966
|
var disableInteractionRef = useRef(disableInteraction);
|
|
6012
|
-
var enableViewportCullingRef = useRef(enableViewportCulling);
|
|
6013
5967
|
var hoveredItemRef = useRef(null);
|
|
6014
5968
|
var selectedItemRef = useRef(externalSelectedItem);
|
|
6015
5969
|
var selectedIdsRef = useRef(new Set());
|
|
@@ -6142,11 +6096,11 @@ var CanvasPolygonLayer = function (props) {
|
|
|
6142
6096
|
perfectDrawEnabled: false,
|
|
6143
6097
|
sceneFunc: function (konvaContext) {
|
|
6144
6098
|
var ctx = konvaContext;
|
|
6145
|
-
var hovered = hoveredItemRef.current; // 뷰포트 컬링: 화면에 보이는 항목만 필터링
|
|
6099
|
+
var hovered = hoveredItemRef.current; // 뷰포트 컬링: 화면에 보이는 항목만 필터링 (항상 활성화)
|
|
6146
6100
|
|
|
6147
|
-
var visibleItems =
|
|
6101
|
+
var visibleItems = dataRef.current.filter(function (item) {
|
|
6148
6102
|
return isInViewport$1(item);
|
|
6149
|
-
})
|
|
6103
|
+
});
|
|
6150
6104
|
renderBase({
|
|
6151
6105
|
ctx: ctx,
|
|
6152
6106
|
hoveredItem: hovered,
|
|
@@ -6180,7 +6134,9 @@ var CanvasPolygonLayer = function (props) {
|
|
|
6180
6134
|
var selectedItems = mapValuesToArray(selectedItemsMapRef.current);
|
|
6181
6135
|
renderEvent({
|
|
6182
6136
|
ctx: ctx,
|
|
6137
|
+
hasTopStage: false,
|
|
6183
6138
|
hoveredItem: hovered,
|
|
6139
|
+
renderSource: RenderSource.EVENT,
|
|
6184
6140
|
selectedItem: selectedItemRef.current,
|
|
6185
6141
|
selectedItems: selectedItems,
|
|
6186
6142
|
utils: renderUtils
|
|
@@ -6195,17 +6151,14 @@ var CanvasPolygonLayer = function (props) {
|
|
|
6195
6151
|
|
|
6196
6152
|
|
|
6197
6153
|
var renderAllImmediate = function () {
|
|
6198
|
-
|
|
6199
|
-
updateViewport$1();
|
|
6200
|
-
}
|
|
6201
|
-
|
|
6154
|
+
updateViewport$1();
|
|
6202
6155
|
buildSpatialIndex$1();
|
|
6203
6156
|
doRenderBase();
|
|
6204
6157
|
doRenderEvent();
|
|
6205
6158
|
}; // 지도 이벤트 핸들러 생성
|
|
6206
6159
|
|
|
6207
6160
|
|
|
6208
|
-
var
|
|
6161
|
+
var _e = createMapEventHandlers({
|
|
6209
6162
|
accumTranslateRef: accumTranslateRef,
|
|
6210
6163
|
boundingBoxCacheRef: boundingBoxCacheRef,
|
|
6211
6164
|
containerRef: containerRef,
|
|
@@ -6216,12 +6169,12 @@ var CanvasPolygonLayer = function (props) {
|
|
|
6216
6169
|
prevCenterOffsetRef: prevCenterOffsetRef,
|
|
6217
6170
|
renderAllImmediate: renderAllImmediate
|
|
6218
6171
|
}),
|
|
6219
|
-
handleIdle =
|
|
6220
|
-
handleZoomStart =
|
|
6221
|
-
handleZoomEnd =
|
|
6222
|
-
handleCenterChanged =
|
|
6223
|
-
handleDragStartShared =
|
|
6224
|
-
handleDragEndShared =
|
|
6172
|
+
handleIdle = _e.handleIdle,
|
|
6173
|
+
handleZoomStart = _e.handleZoomStart,
|
|
6174
|
+
handleZoomEnd = _e.handleZoomEnd,
|
|
6175
|
+
handleCenterChanged = _e.handleCenterChanged,
|
|
6176
|
+
handleDragStartShared = _e.handleDragStart,
|
|
6177
|
+
handleDragEndShared = _e.handleDragEnd;
|
|
6225
6178
|
|
|
6226
6179
|
var handleDragStart = function () {
|
|
6227
6180
|
handleDragStartShared(); // 드래그 시작 시점의 hover 상태 저장
|
|
@@ -6394,11 +6347,7 @@ var CanvasPolygonLayer = function (props) {
|
|
|
6394
6347
|
eventLayerRef.current = eventLayer;
|
|
6395
6348
|
stage.add(baseLayer);
|
|
6396
6349
|
stage.add(eventLayer);
|
|
6397
|
-
|
|
6398
|
-
if (enableViewportCulling) {
|
|
6399
|
-
updateViewport$1();
|
|
6400
|
-
} // ResizeObserver: 맵 크기 변경 감지 (RAF로 debounce)
|
|
6401
|
-
|
|
6350
|
+
updateViewport$1(); // ResizeObserver: 맵 크기 변경 감지 (RAF로 debounce)
|
|
6402
6351
|
|
|
6403
6352
|
var resizeRafId = null;
|
|
6404
6353
|
var resizeObserver = new ResizeObserver(function () {
|
|
@@ -6411,11 +6360,7 @@ var CanvasPolygonLayer = function (props) {
|
|
|
6411
6360
|
stage.height(mapDiv.offsetHeight);
|
|
6412
6361
|
offsetCacheRef.current.clear();
|
|
6413
6362
|
boundingBoxCacheRef.current.clear();
|
|
6414
|
-
|
|
6415
|
-
if (enableViewportCullingRef.current) {
|
|
6416
|
-
updateViewport$1();
|
|
6417
|
-
}
|
|
6418
|
-
|
|
6363
|
+
updateViewport$1();
|
|
6419
6364
|
renderAllImmediate();
|
|
6420
6365
|
resizeRafId = null;
|
|
6421
6366
|
});
|
|
@@ -6485,36 +6430,7 @@ var CanvasPolygonLayer = function (props) {
|
|
|
6485
6430
|
|
|
6486
6431
|
useEffect(function () {
|
|
6487
6432
|
disableInteractionRef.current = disableInteraction;
|
|
6488
|
-
}, [disableInteraction]); //
|
|
6489
|
-
|
|
6490
|
-
useEffect(function () {
|
|
6491
|
-
enableViewportCullingRef.current = enableViewportCulling;
|
|
6492
|
-
|
|
6493
|
-
if (stageRef.current) {
|
|
6494
|
-
// 뷰포트 컬링 설정이 변경되면 shape 재생성 필요
|
|
6495
|
-
var baseLayer = baseLayerRef.current;
|
|
6496
|
-
|
|
6497
|
-
if (baseLayer) {
|
|
6498
|
-
var shape = baseLayer.findOne('.base-render-shape');
|
|
6499
|
-
|
|
6500
|
-
if (shape) {
|
|
6501
|
-
shape.destroy();
|
|
6502
|
-
}
|
|
6503
|
-
}
|
|
6504
|
-
|
|
6505
|
-
var eventLayer = eventLayerRef.current;
|
|
6506
|
-
|
|
6507
|
-
if (eventLayer) {
|
|
6508
|
-
var shape = eventLayer.findOne('.event-render-shape');
|
|
6509
|
-
|
|
6510
|
-
if (shape) {
|
|
6511
|
-
shape.destroy();
|
|
6512
|
-
}
|
|
6513
|
-
}
|
|
6514
|
-
|
|
6515
|
-
renderAllImmediate();
|
|
6516
|
-
}
|
|
6517
|
-
}, [enableViewportCulling]); // 외부 selectedItems 동기화
|
|
6433
|
+
}, [disableInteraction]); // 외부 selectedItems 동기화
|
|
6518
6434
|
|
|
6519
6435
|
useEffect(function () {
|
|
6520
6436
|
if (!stageRef.current) return;
|
package/dist/index.umd.js
CHANGED
|
@@ -3956,17 +3956,15 @@
|
|
|
3956
3956
|
var hasRenderEvent = 'renderEvent' in props && props.renderEvent !== undefined; // renderEvent가 있는 경우와 없는 경우를 구분하여 props 추출
|
|
3957
3957
|
|
|
3958
3958
|
var data = props.data,
|
|
3959
|
-
_a = props.
|
|
3960
|
-
|
|
3961
|
-
_b = props.
|
|
3962
|
-
|
|
3963
|
-
_c = props.maxCacheSize,
|
|
3964
|
-
maxCacheSize = _c === void 0 ? DEFAULT_MAX_CACHE_SIZE : _c,
|
|
3959
|
+
_a = props.cullingMargin,
|
|
3960
|
+
cullingMargin = _a === void 0 ? DEFAULT_CULLING_MARGIN : _a,
|
|
3961
|
+
_b = props.maxCacheSize,
|
|
3962
|
+
maxCacheSize = _b === void 0 ? DEFAULT_MAX_CACHE_SIZE : _b,
|
|
3965
3963
|
renderBase = props.renderBase,
|
|
3966
|
-
options = tslib.__rest(props, ["data", "
|
|
3964
|
+
options = tslib.__rest(props, ["data", "cullingMargin", "maxCacheSize", "renderBase"]); // renderEvent가 있는 경우에만 인터랙션 관련 props 추출
|
|
3967
3965
|
|
|
3968
3966
|
|
|
3969
|
-
var
|
|
3967
|
+
var _c = hasRenderEvent && 'renderEvent' in props ? props : {
|
|
3970
3968
|
disableInteraction: false,
|
|
3971
3969
|
onClick: undefined,
|
|
3972
3970
|
onMouseOut: undefined,
|
|
@@ -3976,15 +3974,15 @@
|
|
|
3976
3974
|
selectedItems: undefined,
|
|
3977
3975
|
topStageZIndex: undefined
|
|
3978
3976
|
},
|
|
3979
|
-
|
|
3980
|
-
disableInteraction =
|
|
3981
|
-
onClick =
|
|
3982
|
-
onMouseOut =
|
|
3983
|
-
onMouseOver =
|
|
3984
|
-
renderEvent =
|
|
3985
|
-
externalSelectedItem =
|
|
3986
|
-
externalSelectedItems =
|
|
3987
|
-
rawTopStageZIndex =
|
|
3977
|
+
_d = _c.disableInteraction,
|
|
3978
|
+
disableInteraction = _d === void 0 ? false : _d,
|
|
3979
|
+
onClick = _c.onClick,
|
|
3980
|
+
onMouseOut = _c.onMouseOut,
|
|
3981
|
+
onMouseOver = _c.onMouseOver,
|
|
3982
|
+
renderEvent = _c.renderEvent,
|
|
3983
|
+
externalSelectedItem = _c.selectedItem,
|
|
3984
|
+
externalSelectedItems = _c.selectedItems,
|
|
3985
|
+
rawTopStageZIndex = _c.topStageZIndex; // topStageZIndex가 있으면 hover 최상단 표시 활성화, 없으면 비활성화 (성능 우선)
|
|
3988
3986
|
|
|
3989
3987
|
|
|
3990
3988
|
var topStageZIndex = rawTopStageZIndex;
|
|
@@ -4010,7 +4008,6 @@
|
|
|
4010
4008
|
|
|
4011
4009
|
var dataRef = React.useRef(data);
|
|
4012
4010
|
var disableInteractionRef = React.useRef(disableInteraction);
|
|
4013
|
-
var enableViewportCullingRef = React.useRef(enableViewportCulling);
|
|
4014
4011
|
var hoveredItemRef = React.useRef(null);
|
|
4015
4012
|
var selectedItemRef = React.useRef(externalSelectedItem);
|
|
4016
4013
|
var selectedIdsRef = React.useRef(new Set());
|
|
@@ -4092,11 +4089,11 @@
|
|
|
4092
4089
|
name: 'base-render-shape',
|
|
4093
4090
|
perfectDrawEnabled: false,
|
|
4094
4091
|
sceneFunc: function (konvaContext) {
|
|
4095
|
-
var ctx = konvaContext; // 뷰포트 컬링: 화면에 보이는 항목만 필터링
|
|
4092
|
+
var ctx = konvaContext; // 뷰포트 컬링: 화면에 보이는 항목만 필터링 (항상 활성화)
|
|
4096
4093
|
|
|
4097
|
-
var visibleItems =
|
|
4094
|
+
var visibleItems = dataRef.current.filter(function (item) {
|
|
4098
4095
|
return isInViewport$1(item);
|
|
4099
|
-
})
|
|
4096
|
+
}); // Base Layer는 기본 마커만 렌더링 (hover된 항목도 포함)
|
|
4100
4097
|
// hover 스타일은 Event Layer와 Top Layer에서 덧그려짐
|
|
4101
4098
|
|
|
4102
4099
|
renderBase({
|
|
@@ -4199,9 +4196,9 @@
|
|
|
4199
4196
|
var ctx = konvaContext;
|
|
4200
4197
|
var currentHovered = hoveredItemRef.current; // hover된 항목이 없으면 아무것도 그리지 않음
|
|
4201
4198
|
|
|
4202
|
-
if (!currentHovered) return; // 뷰포트 컬링 확인
|
|
4199
|
+
if (!currentHovered) return; // 뷰포트 컬링 확인 (항상 활성화)
|
|
4203
4200
|
|
|
4204
|
-
if (
|
|
4201
|
+
if (!isInViewport$1(currentHovered)) {
|
|
4205
4202
|
return;
|
|
4206
4203
|
}
|
|
4207
4204
|
|
|
@@ -4241,10 +4238,7 @@
|
|
|
4241
4238
|
|
|
4242
4239
|
|
|
4243
4240
|
var renderAllImmediate = function () {
|
|
4244
|
-
|
|
4245
|
-
updateViewport$1();
|
|
4246
|
-
}
|
|
4247
|
-
|
|
4241
|
+
updateViewport$1();
|
|
4248
4242
|
buildSpatialIndex$1();
|
|
4249
4243
|
doRenderBase();
|
|
4250
4244
|
doRenderEvent(); // 메인 stage의 transform을 topStage에도 동기화
|
|
@@ -4259,7 +4253,7 @@
|
|
|
4259
4253
|
}; // 지도 이벤트 핸들러 생성
|
|
4260
4254
|
|
|
4261
4255
|
|
|
4262
|
-
var
|
|
4256
|
+
var _e = createMapEventHandlers({
|
|
4263
4257
|
accumTranslateRef: accumTranslateRef,
|
|
4264
4258
|
boundingBoxCacheRef: boundingBoxCacheRef,
|
|
4265
4259
|
containerRef: containerRef,
|
|
@@ -4270,12 +4264,12 @@
|
|
|
4270
4264
|
prevCenterOffsetRef: prevCenterOffsetRef,
|
|
4271
4265
|
renderAllImmediate: renderAllImmediate
|
|
4272
4266
|
}),
|
|
4273
|
-
handleIdleShared =
|
|
4274
|
-
handleZoomStart =
|
|
4275
|
-
handleZoomEnd =
|
|
4276
|
-
handleCenterChangedShared =
|
|
4277
|
-
handleDragStartShared =
|
|
4278
|
-
handleDragEndShared =
|
|
4267
|
+
handleIdleShared = _e.handleIdle,
|
|
4268
|
+
handleZoomStart = _e.handleZoomStart,
|
|
4269
|
+
handleZoomEnd = _e.handleZoomEnd,
|
|
4270
|
+
handleCenterChangedShared = _e.handleCenterChanged,
|
|
4271
|
+
handleDragStartShared = _e.handleDragStart,
|
|
4272
|
+
handleDragEndShared = _e.handleDragEnd; // handleIdle 래핑: topStage transform 제거 추가
|
|
4279
4273
|
|
|
4280
4274
|
|
|
4281
4275
|
var handleIdle = function () {
|
|
@@ -4529,11 +4523,7 @@
|
|
|
4529
4523
|
eventLayerRef.current = eventLayer;
|
|
4530
4524
|
stage.add(baseLayer);
|
|
4531
4525
|
stage.add(eventLayer);
|
|
4532
|
-
|
|
4533
|
-
if (enableViewportCulling) {
|
|
4534
|
-
updateViewport$1();
|
|
4535
|
-
} // ResizeObserver: 맵 크기 변경 감지 (RAF로 debounce)
|
|
4536
|
-
|
|
4526
|
+
updateViewport$1(); // ResizeObserver: 맵 크기 변경 감지 (RAF로 debounce)
|
|
4537
4527
|
|
|
4538
4528
|
var resizeRafId = null;
|
|
4539
4529
|
var resizeObserver = new ResizeObserver(function () {
|
|
@@ -4546,11 +4536,7 @@
|
|
|
4546
4536
|
stage.height(mapDiv.offsetHeight);
|
|
4547
4537
|
offsetCacheRef.current.clear();
|
|
4548
4538
|
boundingBoxCacheRef.current.clear();
|
|
4549
|
-
|
|
4550
|
-
if (enableViewportCullingRef.current) {
|
|
4551
|
-
updateViewport$1();
|
|
4552
|
-
}
|
|
4553
|
-
|
|
4539
|
+
updateViewport$1();
|
|
4554
4540
|
renderAllImmediate();
|
|
4555
4541
|
resizeRafId = null;
|
|
4556
4542
|
});
|
|
@@ -4632,36 +4618,7 @@
|
|
|
4632
4618
|
|
|
4633
4619
|
React.useEffect(function () {
|
|
4634
4620
|
disableInteractionRef.current = disableInteraction;
|
|
4635
|
-
}, [disableInteraction]); //
|
|
4636
|
-
|
|
4637
|
-
React.useEffect(function () {
|
|
4638
|
-
enableViewportCullingRef.current = enableViewportCulling;
|
|
4639
|
-
|
|
4640
|
-
if (stageRef.current) {
|
|
4641
|
-
// 뷰포트 컬링 설정이 변경되면 shape 재생성 필요
|
|
4642
|
-
var baseLayer = baseLayerRef.current;
|
|
4643
|
-
|
|
4644
|
-
if (baseLayer) {
|
|
4645
|
-
var shape = baseLayer.findOne('.base-render-shape');
|
|
4646
|
-
|
|
4647
|
-
if (shape) {
|
|
4648
|
-
shape.destroy();
|
|
4649
|
-
}
|
|
4650
|
-
}
|
|
4651
|
-
|
|
4652
|
-
var eventLayer = eventLayerRef.current;
|
|
4653
|
-
|
|
4654
|
-
if (eventLayer) {
|
|
4655
|
-
var shape = eventLayer.findOne('.event-render-shape');
|
|
4656
|
-
|
|
4657
|
-
if (shape) {
|
|
4658
|
-
shape.destroy();
|
|
4659
|
-
}
|
|
4660
|
-
}
|
|
4661
|
-
|
|
4662
|
-
renderAllImmediate();
|
|
4663
|
-
}
|
|
4664
|
-
}, [enableViewportCulling]); // Top Layer용 별도 캔버스 DOM 생성 (topStageZIndex가 설정된 경우)
|
|
4621
|
+
}, [disableInteraction]); // Top Layer용 별도 캔버스 DOM 생성 (topStageZIndex가 설정된 경우)
|
|
4665
4622
|
|
|
4666
4623
|
React.useEffect(function () {
|
|
4667
4624
|
if (topStageZIndex === undefined) return;
|
|
@@ -5972,17 +5929,15 @@
|
|
|
5972
5929
|
onClick = props.onClick,
|
|
5973
5930
|
_a = props.enableMultiSelect,
|
|
5974
5931
|
enableMultiSelect = _a === void 0 ? false : _a,
|
|
5975
|
-
_b = props.
|
|
5976
|
-
|
|
5977
|
-
_c = props.
|
|
5978
|
-
|
|
5979
|
-
_d = props.maxCacheSize,
|
|
5980
|
-
maxCacheSize = _d === void 0 ? DEFAULT_MAX_CACHE_SIZE : _d,
|
|
5932
|
+
_b = props.cullingMargin,
|
|
5933
|
+
cullingMargin = _b === void 0 ? DEFAULT_CULLING_MARGIN : _b,
|
|
5934
|
+
_c = props.maxCacheSize,
|
|
5935
|
+
maxCacheSize = _c === void 0 ? DEFAULT_MAX_CACHE_SIZE : _c,
|
|
5981
5936
|
externalSelectedItems = props.selectedItems,
|
|
5982
5937
|
externalSelectedItem = props.selectedItem,
|
|
5983
|
-
|
|
5984
|
-
disableInteraction =
|
|
5985
|
-
options = tslib.__rest(props, ["data", "onClick", "enableMultiSelect", "
|
|
5938
|
+
_d = props.disableInteraction,
|
|
5939
|
+
disableInteraction = _d === void 0 ? false : _d,
|
|
5940
|
+
options = tslib.__rest(props, ["data", "onClick", "enableMultiSelect", "cullingMargin", "maxCacheSize", "selectedItems", "selectedItem", "disableInteraction"]); // customStyle은 다른 방식과 함께 사용 가능
|
|
5986
5941
|
|
|
5987
5942
|
|
|
5988
5943
|
var hasCustomStyle = 'customStyle' in props && props.customStyle !== undefined;
|
|
@@ -6013,7 +5968,6 @@
|
|
|
6013
5968
|
|
|
6014
5969
|
var dataRef = React.useRef(data);
|
|
6015
5970
|
var disableInteractionRef = React.useRef(disableInteraction);
|
|
6016
|
-
var enableViewportCullingRef = React.useRef(enableViewportCulling);
|
|
6017
5971
|
var hoveredItemRef = React.useRef(null);
|
|
6018
5972
|
var selectedItemRef = React.useRef(externalSelectedItem);
|
|
6019
5973
|
var selectedIdsRef = React.useRef(new Set());
|
|
@@ -6146,11 +6100,11 @@
|
|
|
6146
6100
|
perfectDrawEnabled: false,
|
|
6147
6101
|
sceneFunc: function (konvaContext) {
|
|
6148
6102
|
var ctx = konvaContext;
|
|
6149
|
-
var hovered = hoveredItemRef.current; // 뷰포트 컬링: 화면에 보이는 항목만 필터링
|
|
6103
|
+
var hovered = hoveredItemRef.current; // 뷰포트 컬링: 화면에 보이는 항목만 필터링 (항상 활성화)
|
|
6150
6104
|
|
|
6151
|
-
var visibleItems =
|
|
6105
|
+
var visibleItems = dataRef.current.filter(function (item) {
|
|
6152
6106
|
return isInViewport$1(item);
|
|
6153
|
-
})
|
|
6107
|
+
});
|
|
6154
6108
|
renderBase({
|
|
6155
6109
|
ctx: ctx,
|
|
6156
6110
|
hoveredItem: hovered,
|
|
@@ -6184,7 +6138,9 @@
|
|
|
6184
6138
|
var selectedItems = mapValuesToArray(selectedItemsMapRef.current);
|
|
6185
6139
|
renderEvent({
|
|
6186
6140
|
ctx: ctx,
|
|
6141
|
+
hasTopStage: false,
|
|
6187
6142
|
hoveredItem: hovered,
|
|
6143
|
+
renderSource: exports.RenderSource.EVENT,
|
|
6188
6144
|
selectedItem: selectedItemRef.current,
|
|
6189
6145
|
selectedItems: selectedItems,
|
|
6190
6146
|
utils: renderUtils
|
|
@@ -6199,17 +6155,14 @@
|
|
|
6199
6155
|
|
|
6200
6156
|
|
|
6201
6157
|
var renderAllImmediate = function () {
|
|
6202
|
-
|
|
6203
|
-
updateViewport$1();
|
|
6204
|
-
}
|
|
6205
|
-
|
|
6158
|
+
updateViewport$1();
|
|
6206
6159
|
buildSpatialIndex$1();
|
|
6207
6160
|
doRenderBase();
|
|
6208
6161
|
doRenderEvent();
|
|
6209
6162
|
}; // 지도 이벤트 핸들러 생성
|
|
6210
6163
|
|
|
6211
6164
|
|
|
6212
|
-
var
|
|
6165
|
+
var _e = createMapEventHandlers({
|
|
6213
6166
|
accumTranslateRef: accumTranslateRef,
|
|
6214
6167
|
boundingBoxCacheRef: boundingBoxCacheRef,
|
|
6215
6168
|
containerRef: containerRef,
|
|
@@ -6220,12 +6173,12 @@
|
|
|
6220
6173
|
prevCenterOffsetRef: prevCenterOffsetRef,
|
|
6221
6174
|
renderAllImmediate: renderAllImmediate
|
|
6222
6175
|
}),
|
|
6223
|
-
handleIdle =
|
|
6224
|
-
handleZoomStart =
|
|
6225
|
-
handleZoomEnd =
|
|
6226
|
-
handleCenterChanged =
|
|
6227
|
-
handleDragStartShared =
|
|
6228
|
-
handleDragEndShared =
|
|
6176
|
+
handleIdle = _e.handleIdle,
|
|
6177
|
+
handleZoomStart = _e.handleZoomStart,
|
|
6178
|
+
handleZoomEnd = _e.handleZoomEnd,
|
|
6179
|
+
handleCenterChanged = _e.handleCenterChanged,
|
|
6180
|
+
handleDragStartShared = _e.handleDragStart,
|
|
6181
|
+
handleDragEndShared = _e.handleDragEnd;
|
|
6229
6182
|
|
|
6230
6183
|
var handleDragStart = function () {
|
|
6231
6184
|
handleDragStartShared(); // 드래그 시작 시점의 hover 상태 저장
|
|
@@ -6398,11 +6351,7 @@
|
|
|
6398
6351
|
eventLayerRef.current = eventLayer;
|
|
6399
6352
|
stage.add(baseLayer);
|
|
6400
6353
|
stage.add(eventLayer);
|
|
6401
|
-
|
|
6402
|
-
if (enableViewportCulling) {
|
|
6403
|
-
updateViewport$1();
|
|
6404
|
-
} // ResizeObserver: 맵 크기 변경 감지 (RAF로 debounce)
|
|
6405
|
-
|
|
6354
|
+
updateViewport$1(); // ResizeObserver: 맵 크기 변경 감지 (RAF로 debounce)
|
|
6406
6355
|
|
|
6407
6356
|
var resizeRafId = null;
|
|
6408
6357
|
var resizeObserver = new ResizeObserver(function () {
|
|
@@ -6415,11 +6364,7 @@
|
|
|
6415
6364
|
stage.height(mapDiv.offsetHeight);
|
|
6416
6365
|
offsetCacheRef.current.clear();
|
|
6417
6366
|
boundingBoxCacheRef.current.clear();
|
|
6418
|
-
|
|
6419
|
-
if (enableViewportCullingRef.current) {
|
|
6420
|
-
updateViewport$1();
|
|
6421
|
-
}
|
|
6422
|
-
|
|
6367
|
+
updateViewport$1();
|
|
6423
6368
|
renderAllImmediate();
|
|
6424
6369
|
resizeRafId = null;
|
|
6425
6370
|
});
|
|
@@ -6489,36 +6434,7 @@
|
|
|
6489
6434
|
|
|
6490
6435
|
React.useEffect(function () {
|
|
6491
6436
|
disableInteractionRef.current = disableInteraction;
|
|
6492
|
-
}, [disableInteraction]); //
|
|
6493
|
-
|
|
6494
|
-
React.useEffect(function () {
|
|
6495
|
-
enableViewportCullingRef.current = enableViewportCulling;
|
|
6496
|
-
|
|
6497
|
-
if (stageRef.current) {
|
|
6498
|
-
// 뷰포트 컬링 설정이 변경되면 shape 재생성 필요
|
|
6499
|
-
var baseLayer = baseLayerRef.current;
|
|
6500
|
-
|
|
6501
|
-
if (baseLayer) {
|
|
6502
|
-
var shape = baseLayer.findOne('.base-render-shape');
|
|
6503
|
-
|
|
6504
|
-
if (shape) {
|
|
6505
|
-
shape.destroy();
|
|
6506
|
-
}
|
|
6507
|
-
}
|
|
6508
|
-
|
|
6509
|
-
var eventLayer = eventLayerRef.current;
|
|
6510
|
-
|
|
6511
|
-
if (eventLayer) {
|
|
6512
|
-
var shape = eventLayer.findOne('.event-render-shape');
|
|
6513
|
-
|
|
6514
|
-
if (shape) {
|
|
6515
|
-
shape.destroy();
|
|
6516
|
-
}
|
|
6517
|
-
}
|
|
6518
|
-
|
|
6519
|
-
renderAllImmediate();
|
|
6520
|
-
}
|
|
6521
|
-
}, [enableViewportCulling]); // 외부 selectedItems 동기화
|
|
6437
|
+
}, [disableInteraction]); // 외부 selectedItems 동기화
|
|
6522
6438
|
|
|
6523
6439
|
React.useEffect(function () {
|
|
6524
6440
|
if (!stageRef.current) return;
|