evui 3.4.155 → 3.4.157

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.
@@ -362,6 +362,81 @@ if(content.locals) module.exports = content.locals;
362
362
  var add = __webpack_require__("499e").default
363
363
  var update = add("5a9ac64a", content, true, {"sourceMap":false,"shadowMode":false});
364
364
 
365
+ /***/ }),
366
+
367
+ /***/ "10d1":
368
+ /***/ (function(module, exports, __webpack_require__) {
369
+
370
+ "use strict";
371
+
372
+ var global = __webpack_require__("da84");
373
+ var redefineAll = __webpack_require__("e2cc");
374
+ var InternalMetadataModule = __webpack_require__("f183");
375
+ var collection = __webpack_require__("6d61");
376
+ var collectionWeak = __webpack_require__("acac");
377
+ var isObject = __webpack_require__("861d");
378
+ var enforceIternalState = __webpack_require__("69f3").enforce;
379
+ var NATIVE_WEAK_MAP = __webpack_require__("7f9a");
380
+
381
+ var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;
382
+ var isExtensible = Object.isExtensible;
383
+ var InternalWeakMap;
384
+
385
+ var wrapper = function (init) {
386
+ return function WeakMap() {
387
+ return init(this, arguments.length ? arguments[0] : undefined);
388
+ };
389
+ };
390
+
391
+ // `WeakMap` constructor
392
+ // https://tc39.github.io/ecma262/#sec-weakmap-constructor
393
+ var $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak);
394
+
395
+ // IE11 WeakMap frozen keys fix
396
+ // We can't use feature detection because it crash some old IE builds
397
+ // https://github.com/zloirock/core-js/issues/485
398
+ if (NATIVE_WEAK_MAP && IS_IE11) {
399
+ InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);
400
+ InternalMetadataModule.REQUIRED = true;
401
+ var WeakMapPrototype = $WeakMap.prototype;
402
+ var nativeDelete = WeakMapPrototype['delete'];
403
+ var nativeHas = WeakMapPrototype.has;
404
+ var nativeGet = WeakMapPrototype.get;
405
+ var nativeSet = WeakMapPrototype.set;
406
+ redefineAll(WeakMapPrototype, {
407
+ 'delete': function (key) {
408
+ if (isObject(key) && !isExtensible(key)) {
409
+ var state = enforceIternalState(this);
410
+ if (!state.frozen) state.frozen = new InternalWeakMap();
411
+ return nativeDelete.call(this, key) || state.frozen['delete'](key);
412
+ } return nativeDelete.call(this, key);
413
+ },
414
+ has: function has(key) {
415
+ if (isObject(key) && !isExtensible(key)) {
416
+ var state = enforceIternalState(this);
417
+ if (!state.frozen) state.frozen = new InternalWeakMap();
418
+ return nativeHas.call(this, key) || state.frozen.has(key);
419
+ } return nativeHas.call(this, key);
420
+ },
421
+ get: function get(key) {
422
+ if (isObject(key) && !isExtensible(key)) {
423
+ var state = enforceIternalState(this);
424
+ if (!state.frozen) state.frozen = new InternalWeakMap();
425
+ return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);
426
+ } return nativeGet.call(this, key);
427
+ },
428
+ set: function set(key, value) {
429
+ if (isObject(key) && !isExtensible(key)) {
430
+ var state = enforceIternalState(this);
431
+ if (!state.frozen) state.frozen = new InternalWeakMap();
432
+ nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);
433
+ } else nativeSet.call(this, key, value);
434
+ return this;
435
+ }
436
+ });
437
+ }
438
+
439
+
365
440
  /***/ }),
366
441
 
367
442
  /***/ "1148":
@@ -11235,7 +11310,7 @@ $({ target: 'Number', stat: true }, {
11235
11310
  /***/ "9224":
11236
11311
  /***/ (function(module) {
11237
11312
 
11238
- module.exports = JSON.parse("{\"a\":\"3.4.155\"}");
11313
+ module.exports = JSON.parse("{\"a\":\"3.4.157\"}");
11239
11314
 
11240
11315
  /***/ }),
11241
11316
 
@@ -13076,6 +13151,135 @@ $({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {
13076
13151
  });
13077
13152
 
13078
13153
 
13154
+ /***/ }),
13155
+
13156
+ /***/ "acac":
13157
+ /***/ (function(module, exports, __webpack_require__) {
13158
+
13159
+ "use strict";
13160
+
13161
+ var redefineAll = __webpack_require__("e2cc");
13162
+ var getWeakData = __webpack_require__("f183").getWeakData;
13163
+ var anObject = __webpack_require__("825a");
13164
+ var isObject = __webpack_require__("861d");
13165
+ var anInstance = __webpack_require__("19aa");
13166
+ var iterate = __webpack_require__("2266");
13167
+ var ArrayIterationModule = __webpack_require__("b727");
13168
+ var $has = __webpack_require__("5135");
13169
+ var InternalStateModule = __webpack_require__("69f3");
13170
+
13171
+ var setInternalState = InternalStateModule.set;
13172
+ var internalStateGetterFor = InternalStateModule.getterFor;
13173
+ var find = ArrayIterationModule.find;
13174
+ var findIndex = ArrayIterationModule.findIndex;
13175
+ var id = 0;
13176
+
13177
+ // fallback for uncaught frozen keys
13178
+ var uncaughtFrozenStore = function (store) {
13179
+ return store.frozen || (store.frozen = new UncaughtFrozenStore());
13180
+ };
13181
+
13182
+ var UncaughtFrozenStore = function () {
13183
+ this.entries = [];
13184
+ };
13185
+
13186
+ var findUncaughtFrozen = function (store, key) {
13187
+ return find(store.entries, function (it) {
13188
+ return it[0] === key;
13189
+ });
13190
+ };
13191
+
13192
+ UncaughtFrozenStore.prototype = {
13193
+ get: function (key) {
13194
+ var entry = findUncaughtFrozen(this, key);
13195
+ if (entry) return entry[1];
13196
+ },
13197
+ has: function (key) {
13198
+ return !!findUncaughtFrozen(this, key);
13199
+ },
13200
+ set: function (key, value) {
13201
+ var entry = findUncaughtFrozen(this, key);
13202
+ if (entry) entry[1] = value;
13203
+ else this.entries.push([key, value]);
13204
+ },
13205
+ 'delete': function (key) {
13206
+ var index = findIndex(this.entries, function (it) {
13207
+ return it[0] === key;
13208
+ });
13209
+ if (~index) this.entries.splice(index, 1);
13210
+ return !!~index;
13211
+ }
13212
+ };
13213
+
13214
+ module.exports = {
13215
+ getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {
13216
+ var C = wrapper(function (that, iterable) {
13217
+ anInstance(that, C, CONSTRUCTOR_NAME);
13218
+ setInternalState(that, {
13219
+ type: CONSTRUCTOR_NAME,
13220
+ id: id++,
13221
+ frozen: undefined
13222
+ });
13223
+ if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
13224
+ });
13225
+
13226
+ var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);
13227
+
13228
+ var define = function (that, key, value) {
13229
+ var state = getInternalState(that);
13230
+ var data = getWeakData(anObject(key), true);
13231
+ if (data === true) uncaughtFrozenStore(state).set(key, value);
13232
+ else data[state.id] = value;
13233
+ return that;
13234
+ };
13235
+
13236
+ redefineAll(C.prototype, {
13237
+ // 23.3.3.2 WeakMap.prototype.delete(key)
13238
+ // 23.4.3.3 WeakSet.prototype.delete(value)
13239
+ 'delete': function (key) {
13240
+ var state = getInternalState(this);
13241
+ if (!isObject(key)) return false;
13242
+ var data = getWeakData(key);
13243
+ if (data === true) return uncaughtFrozenStore(state)['delete'](key);
13244
+ return data && $has(data, state.id) && delete data[state.id];
13245
+ },
13246
+ // 23.3.3.4 WeakMap.prototype.has(key)
13247
+ // 23.4.3.4 WeakSet.prototype.has(value)
13248
+ has: function has(key) {
13249
+ var state = getInternalState(this);
13250
+ if (!isObject(key)) return false;
13251
+ var data = getWeakData(key);
13252
+ if (data === true) return uncaughtFrozenStore(state).has(key);
13253
+ return data && $has(data, state.id);
13254
+ }
13255
+ });
13256
+
13257
+ redefineAll(C.prototype, IS_MAP ? {
13258
+ // 23.3.3.3 WeakMap.prototype.get(key)
13259
+ get: function get(key) {
13260
+ var state = getInternalState(this);
13261
+ if (isObject(key)) {
13262
+ var data = getWeakData(key);
13263
+ if (data === true) return uncaughtFrozenStore(state).get(key);
13264
+ return data ? data[state.id] : undefined;
13265
+ }
13266
+ },
13267
+ // 23.3.3.5 WeakMap.prototype.set(key, value)
13268
+ set: function set(key, value) {
13269
+ return define(this, key, value);
13270
+ }
13271
+ } : {
13272
+ // 23.4.3.1 WeakSet.prototype.add(value)
13273
+ add: function add(value) {
13274
+ return define(this, value, true);
13275
+ }
13276
+ });
13277
+
13278
+ return C;
13279
+ }
13280
+ };
13281
+
13282
+
13079
13283
  /***/ }),
13080
13284
 
13081
13285
  /***/ "ad6d":
@@ -22274,9 +22478,9 @@ var _Set_Set = _getNative(_root["a" /* default */], 'Set');
22274
22478
 
22275
22479
 
22276
22480
  /* Built-in method references that are verified to be native. */
22277
- var WeakMap = _getNative(_root["a" /* default */], 'WeakMap');
22481
+ var _WeakMap_WeakMap = _getNative(_root["a" /* default */], 'WeakMap');
22278
22482
 
22279
- /* harmony default export */ var _WeakMap = (WeakMap);
22483
+ /* harmony default export */ var _WeakMap = (_WeakMap_WeakMap);
22280
22484
 
22281
22485
  // CONCATENATED MODULE: ./node_modules/lodash-es/_getTag.js
22282
22486
 
@@ -38937,6 +39141,30 @@ var textMeasureCtx = textMeasureCanvas.getContext('2d');
38937
39141
  }
38938
39142
 
38939
39143
  return "".concat(color, "80");
39144
+ },
39145
+
39146
+ /**
39147
+ * 클릭 좌표(cx, cy)에서 데이터 포인트까지의 거리²를 반환한다.
39148
+ * w/h 가 있으면 박스 외벽까지의 거리(내부면 0), 없으면 포인트까지의 유클리드 거리².
39149
+ * @param {object} data - 데이터 포인트 (xp, yp, w?, h?)
39150
+ * @param {number} cx - 클릭 x 좌표
39151
+ * @param {number} cy - 클릭 y 좌표
39152
+ * @returns {number}
39153
+ */
39154
+ calcBoxDistance: function calcBoxDistance(data, cx, cy) {
39155
+ if (data.w !== null && data.w !== undefined && data.h !== null && data.h !== undefined) {
39156
+ var sx = data.xp;
39157
+ var sy = data.yp;
39158
+ var xMin = Math.min(sx, sx + data.w);
39159
+ var xMax = Math.max(sx, sx + data.w);
39160
+ var yMin = Math.min(sy, sy + data.h);
39161
+ var yMax = Math.max(sy, sy + data.h);
39162
+ var dx = Math.max(0, xMin - cx, cx - xMax);
39163
+ var dy = Math.max(0, yMin - cy, cy - yMax);
39164
+ return dx * dx + dy * dy;
39165
+ }
39166
+
39167
+ return Math.pow(data.xp - cx, 2) + Math.pow(data.yp - cy, 2);
38940
39168
  }
38941
39169
  });
38942
39170
  // CONCATENATED MODULE: ./src/components/chart/model/model.store.js
@@ -38963,6 +39191,8 @@ var textMeasureCtx = textMeasureCanvas.getContext('2d');
38963
39191
 
38964
39192
 
38965
39193
 
39194
+
39195
+
38966
39196
 
38967
39197
 
38968
39198
 
@@ -39902,7 +40132,7 @@ var modules = {
39902
40132
  return null;
39903
40133
  }
39904
40134
 
39905
- itemPosition = [this.getItemByPosition([dataInfo.xp, dataInfo.yp], useApproximate, dataIndex, true)];
40135
+ itemPosition = [this.getHitItemByPosition([dataInfo.xp, dataInfo.yp], useApproximate, dataIndex, true)];
39906
40136
  } else {
39907
40137
  var seriesList = Object.entries(this.seriesList);
39908
40138
  var firShowSeriesID;
@@ -39927,7 +40157,7 @@ var modules = {
39927
40157
  return null;
39928
40158
  }
39929
40159
 
39930
- return _this7.getItemByPosition([(_dataInfo$xp = dataInfo === null || dataInfo === void 0 ? void 0 : dataInfo.xp) !== null && _dataInfo$xp !== void 0 ? _dataInfo$xp : 0, (_dataInfo$yp = dataInfo === null || dataInfo === void 0 ? void 0 : dataInfo.yp) !== null && _dataInfo$yp !== void 0 ? _dataInfo$yp : 0], useApproximate, idx, true);
40160
+ return _this7.getHitItemByPosition([(_dataInfo$xp = dataInfo === null || dataInfo === void 0 ? void 0 : dataInfo.xp) !== null && _dataInfo$xp !== void 0 ? _dataInfo$xp : 0, (_dataInfo$yp = dataInfo === null || dataInfo === void 0 ? void 0 : dataInfo.yp) !== null && _dataInfo$yp !== void 0 ? _dataInfo$yp : 0], useApproximate, idx, true);
39931
40161
  });
39932
40162
  }
39933
40163
 
@@ -39951,30 +40181,110 @@ var modules = {
39951
40181
  },
39952
40182
 
39953
40183
  /**
39954
- * Find graph item by position x and y
40184
+ * Find the hit item at the given position (x, y).
40185
+ *
40186
+ * 선택 우선순위:
40187
+ * 1. directHit (bar 박스 내부 클릭) — 가장 가까운 것
40188
+ * 2. hit (line 포인트 근접 등) — 가장 가까운 것
40189
+ * 3. hit 없으면 클릭 좌표에 가장 가까운 시리즈로 fallback (distance 기반)
40190
+ *
39955
40191
  * @param {array} offset position x and y
39956
40192
  * @param {boolean} useApproximate if it's true. it'll look for closed item on mouse position
39957
40193
  * @param {number} dataIndex selected data index
39958
40194
  * @param {boolean} useSelectLabelOrItem used to display select label/item at tooltip location
40195
+ * @param {boolean} disableNullLabelSnap true 이면 all-null 라벨도 그대로 반환 (click/dblclick 용)
39959
40196
  *
39960
- * @returns {object} clicked item information
40197
+ * @returns {object} hit item information
39961
40198
  */
39962
- getItemByPosition: function getItemByPosition(offset) {
39963
- var _maxValue;
40199
+ getHitItemByPosition: function getHitItemByPosition(offset) {
40200
+ var _this8 = this,
40201
+ _ref4;
39964
40202
 
39965
40203
  var useApproximate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
39966
40204
  var dataIndex = arguments.length > 2 ? arguments[2] : undefined;
39967
40205
  var useSelectLabelOrItem = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
40206
+ var disableNullLabelSnap = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
39968
40207
  var seriesIDs = Object.keys(this.seriesList);
39969
40208
  var isHorizontal = !!this.options.horizontal;
39970
- var maxType = null;
39971
- var maxLabel = null;
39972
- var maxValuePos = null;
39973
- var maxValue = null;
39974
- var maxSeriesID = '';
40209
+
40210
+ var _offset = _slicedToArray(offset, 2),
40211
+ cx = _offset[0],
40212
+ cy = _offset[1]; // dataIndex 미지정 시 클릭 좌표에 가장 가까운 valid 라벨 인덱스 결정.
40213
+ // disableNullLabelSnap=true 이면 all-null 라벨도 후보로 인정.
40214
+
40215
+
40216
+ var resolvedDataIndex = dataIndex;
40217
+
40218
+ if (resolvedDataIndex === undefined && !useApproximate) {
40219
+ var refSeriesID = seriesIDs.find(function (sId) {
40220
+ var _s$data;
40221
+
40222
+ var s = _this8.seriesList[sId];
40223
+ return (s === null || s === void 0 ? void 0 : s.show) && (s === null || s === void 0 ? void 0 : (_s$data = s.data) === null || _s$data === void 0 ? void 0 : _s$data.length) > 0;
40224
+ });
40225
+
40226
+ if (refSeriesID) {
40227
+ var refData = this.seriesList[refSeriesID].data;
40228
+ var clickPos = isHorizontal ? offset[1] : offset[0];
40229
+ var nearestDistance = Infinity;
40230
+ var nearestIndex = -1;
40231
+
40232
+ var _loop = function _loop(i) {
40233
+ var hasValidData = disableNullLabelSnap || seriesIDs.some(function (sId) {
40234
+ var _s$data2, _s$data2$i, _s$data3, _s$data3$i;
40235
+
40236
+ var s = _this8.seriesList[sId];
40237
+ return (s === null || s === void 0 ? void 0 : s.show) && ((_s$data2 = s.data) === null || _s$data2 === void 0 ? void 0 : (_s$data2$i = _s$data2[i]) === null || _s$data2$i === void 0 ? void 0 : _s$data2$i.o) !== null && ((_s$data3 = s.data) === null || _s$data3 === void 0 ? void 0 : (_s$data3$i = _s$data3[i]) === null || _s$data3$i === void 0 ? void 0 : _s$data3$i.o) !== undefined;
40238
+ });
40239
+ var p = refData[i];
40240
+
40241
+ if (hasValidData && p) {
40242
+ var labelPos;
40243
+
40244
+ if (isHorizontal) {
40245
+ labelPos = p.h ? p.yp + p.h / 2 : p.yp;
40246
+ } else {
40247
+ labelPos = p.w ? p.xp + p.w / 2 : p.xp;
40248
+ }
40249
+
40250
+ if (labelPos !== null && labelPos !== undefined) {
40251
+ var d = Math.abs(clickPos - labelPos);
40252
+
40253
+ if (d < nearestDistance) {
40254
+ nearestDistance = d;
40255
+ nearestIndex = i;
40256
+ }
40257
+ }
40258
+ }
40259
+ };
40260
+
40261
+ for (var i = 0; i < refData.length; i++) {
40262
+ _loop(i);
40263
+ }
40264
+
40265
+ if (nearestIndex !== -1) resolvedDataIndex = nearestIndex;
40266
+ }
40267
+ } // hit 기반 결과 (최우선)
40268
+
40269
+
40270
+ var hitType = null;
40271
+ var hitLabel = null;
40272
+ var hitValuePos = null;
40273
+ var hitValue = null;
40274
+ var hitSeriesID = '';
40275
+ var hitDataIndex = null;
40276
+ var hitDistance = Infinity;
40277
+ var hasDirectHit = false; // hit 없을 때 쓸 fallback — 값이 있는 시리즈 중 클릭 좌표에 가장 가까운 것.
40278
+
40279
+ var fallbackType = null;
40280
+ var fallbackLabel = null;
40281
+ var fallbackValuePos = null;
40282
+ var fallbackValue = null;
40283
+ var fallbackSeriesID = '';
40284
+ var fallbackDataIndex = null;
40285
+ var fallbackDistance = Infinity;
39975
40286
  var acc = 0;
39976
40287
  var useStack = false;
39977
- var maxIndex = null;
39978
40288
 
39979
40289
  for (var ix = 0; ix < seriesIDs.length; ix++) {
39980
40290
  var seriesID = seriesIDs[ix];
@@ -39982,18 +40292,19 @@ var modules = {
39982
40292
  var findFn = useApproximate ? series.findApproximateData : series.findGraphData;
39983
40293
 
39984
40294
  if (findFn) {
39985
- var item = findFn.call(series, offset, isHorizontal, dataIndex, useSelectLabelOrItem);
40295
+ var item = findFn.call(series, offset, isHorizontal, resolvedDataIndex, useSelectLabelOrItem);
39986
40296
  var data = item.data;
39987
40297
  var index = item.index;
39988
40298
 
39989
40299
  if (data) {
39990
40300
  if (helpers_util.isPieType(item.type)) {
39991
- maxLabel = seriesID;
39992
- maxSeriesID = seriesID;
39993
- maxValuePos = (data.ea - data.sa) / 2;
39994
- maxValue = data.o;
39995
- maxIndex = data.index;
39996
- maxType = item.type;
40301
+ // pie 차트는 hit detection 체계가 달라 기존 동작 유지 (단일 pie 시리즈가 일반적)
40302
+ hitType = item.type;
40303
+ hitLabel = seriesID;
40304
+ hitSeriesID = seriesID;
40305
+ hitValuePos = (data.ea - data.sa) / 2;
40306
+ hitValue = data.o;
40307
+ hitDataIndex = data.index;
39997
40308
  } else {
39998
40309
  var ldata = isHorizontal ? data.y : data.x;
39999
40310
  var lp = isHorizontal ? data.yp : data.xp;
@@ -40006,47 +40317,108 @@ var modules = {
40006
40317
  useStack = true;
40007
40318
  } else {
40008
40319
  acc += data.y;
40009
- }
40320
+ } // fallback 후보: 값이 있는 시리즈 중 거리가 가장 가까운 쪽.
40321
+ // 값이 null 인 시리즈는 제외.
40322
+
40323
+
40324
+ var hasMeaningfulValue = g !== null && g !== undefined && !Number.isNaN(g);
40325
+ var hasCoords = data.xp !== null && data.xp !== undefined && data.yp !== null && data.yp !== undefined;
40010
40326
 
40011
- if (maxType === 'bar' && useStack) {
40012
- if (item.hit) {
40013
- maxValue = g;
40014
- maxSeriesID = seriesID;
40015
- maxIndex = index;
40016
- maxLabel = ldata;
40017
- maxValuePos = lp;
40018
- maxType = series.type;
40327
+ if (hasMeaningfulValue && hasCoords) {
40328
+ var distance = helpers_util.calcBoxDistance(data, cx, cy);
40329
+
40330
+ if (fallbackSeriesID === '' || distance < fallbackDistance) {
40331
+ fallbackDistance = distance;
40332
+ fallbackType = series.type;
40333
+ fallbackLabel = ldata;
40334
+ fallbackValuePos = lp;
40335
+ fallbackValue = g;
40336
+ fallbackSeriesID = seriesID;
40337
+ fallbackDataIndex = index;
40338
+ }
40339
+ } else if (hasMeaningfulValue && fallbackSeriesID === '') {
40340
+ // 좌표 없는 예외 케이스 — 첫 후보로만 등록
40341
+ fallbackType = series.type;
40342
+ fallbackLabel = ldata;
40343
+ fallbackValuePos = lp;
40344
+ fallbackValue = g;
40345
+ fallbackSeriesID = seriesID;
40346
+ fallbackDataIndex = index;
40347
+ } // hit 기반 선택: item.hit이 true이고 유효한 좌표가 있을 때만 고려
40348
+
40349
+
40350
+ if (item.hit && data.xp !== undefined && data.yp !== undefined) {
40351
+ var _distance = Math.pow(data.xp - offset[0], 2) + Math.pow(data.yp - offset[1], 2);
40352
+
40353
+ if (item.directHit) {
40354
+ // 직접 박스 히트는 최우선. 여러 개이면 가장 가까운 것.
40355
+ if (!hasDirectHit || _distance < hitDistance) {
40356
+ hitDistance = _distance;
40357
+ hitType = series.type;
40358
+ hitLabel = ldata;
40359
+ hitValuePos = lp;
40360
+ hitValue = g;
40361
+ hitSeriesID = seriesID;
40362
+ hitDataIndex = index;
40363
+ }
40364
+
40365
+ hasDirectHit = true;
40366
+ } else if (!hasDirectHit) {
40367
+ // directHit가 없을 때만 일반 hit 거리 비교 참여
40368
+ // (라인 근접 히트가 박스 직접 히트를 이기지 못하도록)
40369
+ if (_distance < hitDistance) {
40370
+ hitDistance = _distance;
40371
+ hitType = series.type;
40372
+ hitLabel = ldata;
40373
+ hitValuePos = lp;
40374
+ hitValue = g;
40375
+ hitSeriesID = seriesID;
40376
+ hitDataIndex = index;
40377
+ }
40019
40378
  }
40020
- } else if (maxValue === null || maxValue <= g) {
40021
- maxValue = g;
40022
- maxSeriesID = seriesID;
40023
- maxLabel = ldata;
40024
- maxValuePos = lp;
40025
- maxIndex = index;
40026
- maxType = series.type;
40027
40379
  }
40028
40380
  }
40029
40381
  }
40030
40382
  }
40031
40383
  }
40384
+ } // all-null 라벨인 경우 label/dataIndex 만 채워 반환 (sId='', value=0).
40385
+
40386
+
40387
+ if (disableNullLabelSnap && hitSeriesID === '' && fallbackSeriesID === '' && resolvedDataIndex !== undefined && resolvedDataIndex >= 0) {
40388
+ var _this$seriesList$_ref;
40389
+
40390
+ var _refSeriesID = seriesIDs.find(function (sId) {
40391
+ var _s$data4;
40392
+
40393
+ var s = _this8.seriesList[sId];
40394
+ return (s === null || s === void 0 ? void 0 : s.show) && (s === null || s === void 0 ? void 0 : (_s$data4 = s.data) === null || _s$data4 === void 0 ? void 0 : _s$data4.length) > 0;
40395
+ });
40396
+
40397
+ var refPoint = _refSeriesID ? (_this$seriesList$_ref = this.seriesList[_refSeriesID].data) === null || _this$seriesList$_ref === void 0 ? void 0 : _this$seriesList$_ref[resolvedDataIndex] : null;
40398
+
40399
+ if (refPoint) {
40400
+ fallbackLabel = isHorizontal ? refPoint.y : refPoint.x;
40401
+ fallbackDataIndex = resolvedDataIndex;
40402
+ }
40032
40403
  }
40033
40404
 
40405
+ var hasHit = hitSeriesID !== '';
40034
40406
  return {
40035
- type: maxType,
40036
- label: maxLabel,
40037
- pos: maxValuePos,
40038
- value: (_maxValue = maxValue) !== null && _maxValue !== void 0 ? _maxValue : 0,
40039
- sId: maxSeriesID,
40407
+ type: hasHit ? hitType : fallbackType,
40408
+ label: hasHit ? hitLabel : fallbackLabel,
40409
+ pos: hasHit ? hitValuePos : fallbackValuePos,
40410
+ value: (_ref4 = hasHit ? hitValue : fallbackValue) !== null && _ref4 !== void 0 ? _ref4 : 0,
40411
+ sId: hasHit ? hitSeriesID : fallbackSeriesID,
40040
40412
  acc: acc,
40041
40413
  useStack: useStack,
40042
- maxIndex: maxIndex
40414
+ dataIndex: hasHit ? hitDataIndex : fallbackDataIndex
40043
40415
  };
40044
40416
  },
40045
40417
 
40046
40418
  /**
40047
40419
  * @typedef {Object} LabelInfoResult
40048
40420
  * @property {number} labelIndex - 선택된 라벨의 인덱스
40049
- * @property {object} hitInfo - 해당 위치에서의 히트 정보 (getItemByPosition 반환값)
40421
+ * @property {object} hitInfo - 해당 위치에서의 히트 정보 (getHitItemByPosition 반환값)
40050
40422
  */
40051
40423
 
40052
40424
  /**
@@ -40059,9 +40431,9 @@ var modules = {
40059
40431
  getLabelInfoByPosition: function getLabelInfoByPosition(offset, targetAxis) {
40060
40432
  var _Object$values$sort$, _Object$values$sort$2, _scrollbarOpt, _scale, _scale$labels, _scale3, _scale3$labels;
40061
40433
 
40062
- var _offset = _slicedToArray(offset, 2),
40063
- x = _offset[0],
40064
- y = _offset[1];
40434
+ var _offset2 = _slicedToArray(offset, 2),
40435
+ x = _offset2[0],
40436
+ y = _offset2[1];
40065
40437
 
40066
40438
  var aPos = {
40067
40439
  x1: this.chartRect.x1 + this.labelOffset.left,
@@ -40071,9 +40443,9 @@ var modules = {
40071
40443
  };
40072
40444
  var seriesList = this.data.series;
40073
40445
  var pointSize = (_Object$values$sort$ = (_Object$values$sort$2 = Object.values(seriesList).sort(function (a, b) {
40074
- var _ref4, _b$pointSize;
40446
+ var _ref5, _b$pointSize;
40075
40447
 
40076
- return (_ref4 = (_b$pointSize = b.pointSize) !== null && _b$pointSize !== void 0 ? _b$pointSize : 0 - a.pointSize) !== null && _ref4 !== void 0 ? _ref4 : 0;
40448
+ return (_ref5 = (_b$pointSize = b.pointSize) !== null && _b$pointSize !== void 0 ? _b$pointSize : 0 - a.pointSize) !== null && _ref5 !== void 0 ? _ref5 : 0;
40077
40449
  })[0]) === null || _Object$values$sort$2 === void 0 ? void 0 : _Object$values$sort$2.pointSize) !== null && _Object$values$sort$ !== void 0 ? _Object$values$sort$ : 3; // default pointSize 3
40078
40450
 
40079
40451
  var _this$options = this.options,
@@ -40105,10 +40477,10 @@ var modules = {
40105
40477
  _scrollbarOpt2$interv = _scrollbarOpt2.interval,
40106
40478
  interval = _scrollbarOpt2$interv === void 0 ? 1 : _scrollbarOpt2$interv;
40107
40479
 
40108
- var _ref5 = range !== null && range !== void 0 ? range : [0, scale.labels.length],
40109
- _ref6 = _slicedToArray(_ref5, 2),
40110
- min = _ref6[0],
40111
- max = _ref6[1];
40480
+ var _ref6 = range !== null && range !== void 0 ? range : [0, scale.labels.length],
40481
+ _ref7 = _slicedToArray(_ref6, 2),
40482
+ min = _ref7[0],
40483
+ max = _ref7[1];
40112
40484
 
40113
40485
  var labelCount = Math.floor((+max - +min) / interval) + 1;
40114
40486
  var labelGap = (endPoint - startPoint) / labelCount;
@@ -40134,7 +40506,7 @@ var modules = {
40134
40506
 
40135
40507
  labelIndex = scale.labels.length > _index ? _index : -1;
40136
40508
  } else {
40137
- var _hitInfo$maxIndex;
40509
+ var _hitInfo$dataIndex;
40138
40510
 
40139
40511
  var offsetX;
40140
40512
  var dataIndex;
@@ -40149,8 +40521,8 @@ var modules = {
40149
40521
  offsetX = x;
40150
40522
  }
40151
40523
 
40152
- hitInfo = this.getItemByPosition([offsetX, y], selectLabel === null || selectLabel === void 0 ? void 0 : selectLabel.useApproximateValue, dataIndex, true);
40153
- labelIndex = (_hitInfo$maxIndex = hitInfo.maxIndex) !== null && _hitInfo$maxIndex !== void 0 ? _hitInfo$maxIndex : -1;
40524
+ hitInfo = this.getHitItemByPosition([offsetX, y], selectLabel === null || selectLabel === void 0 ? void 0 : selectLabel.useApproximateValue, dataIndex, true);
40525
+ labelIndex = (_hitInfo$dataIndex = hitInfo.dataIndex) !== null && _hitInfo$dataIndex !== void 0 ? _hitInfo$dataIndex : -1;
40154
40526
  }
40155
40527
 
40156
40528
  return {
@@ -40171,7 +40543,7 @@ var modules = {
40171
40543
  * @returns {MouseLabelValue} current mouse target label value
40172
40544
  */
40173
40545
  getCurMouseLabelVal: function getCurMouseLabelVal(targetAxis, offset, labelIndex) {
40174
- var _this8 = this;
40546
+ var _this9 = this;
40175
40547
 
40176
40548
  var _this$options2 = this.options,
40177
40549
  chartType = _this$options2.type,
@@ -40188,13 +40560,13 @@ var modules = {
40188
40560
  case 'bar':
40189
40561
  case 'line':
40190
40562
  {
40191
- result = horizontal && !isXAxis || !horizontal && isXAxis ? _this8.data.labels[labelIndex] : '';
40563
+ result = horizontal && !isXAxis || !horizontal && isXAxis ? _this9.data.labels[labelIndex] : '';
40192
40564
  break;
40193
40565
  }
40194
40566
 
40195
40567
  case 'heatMap':
40196
40568
  {
40197
- result = _this8.data.labels[targetAxisDirection][labelIndex];
40569
+ result = _this9.data.labels[targetAxisDirection][labelIndex];
40198
40570
  break;
40199
40571
  }
40200
40572
 
@@ -40208,19 +40580,19 @@ var modules = {
40208
40580
  var calLabelValUseMousePos = function calLabelValUseMousePos() {
40209
40581
  var result = '';
40210
40582
  var aPos = {
40211
- x1: _this8.chartRect.x1 + _this8.labelOffset.left,
40212
- x2: _this8.chartRect.x2 - _this8.labelOffset.right,
40213
- y1: _this8.chartRect.y1 + _this8.labelOffset.top,
40214
- y2: _this8.chartRect.y2 - _this8.labelOffset.bottom
40583
+ x1: _this9.chartRect.x1 + _this9.labelOffset.left,
40584
+ x2: _this9.chartRect.x2 - _this9.labelOffset.right,
40585
+ y1: _this9.chartRect.y1 + _this9.labelOffset.top,
40586
+ y2: _this9.chartRect.y2 - _this9.labelOffset.bottom
40215
40587
  };
40216
- var _this8$axesSteps$targ = _this8.axesSteps[targetAxisDirection][0],
40217
- steps = _this8$axesSteps$targ.steps,
40218
- labelValInterval = _this8$axesSteps$targ.interval,
40219
- graphMin = _this8$axesSteps$targ.graphMin;
40220
- var _this8$axesRange$targ = _this8.axesRange[targetAxisDirection][0].size,
40221
- labelWidth = _this8$axesRange$targ.width,
40222
- labelHeight = _this8$axesRange$targ.height;
40223
- var axes = isXAxis ? _this8.axesX : _this8.axesY;
40588
+ var _this9$axesSteps$targ = _this9.axesSteps[targetAxisDirection][0],
40589
+ steps = _this9$axesSteps$targ.steps,
40590
+ labelValInterval = _this9$axesSteps$targ.interval,
40591
+ graphMin = _this9$axesSteps$targ.graphMin;
40592
+ var _this9$axesRange$targ = _this9.axesRange[targetAxisDirection][0].size,
40593
+ labelWidth = _this9$axesRange$targ.width,
40594
+ labelHeight = _this9$axesRange$targ.height;
40595
+ var axes = isXAxis ? _this9.axesX : _this9.axesY;
40224
40596
  var axisStartPoint = aPos[axes[0].units.rectStart];
40225
40597
  var axisEndPoint = aPos[axes[0].units.rectEnd];
40226
40598
  var curMousePosInAxis = Math.abs(offset[isXAxis ? 0 : 1] - axisStartPoint);
@@ -40258,7 +40630,7 @@ var modules = {
40258
40630
  * @returns {object} min/max info for all of data
40259
40631
  */
40260
40632
  getStoreMinMax: function getStoreMinMax() {
40261
- var _this9 = this;
40633
+ var _this10 = this;
40262
40634
 
40263
40635
  var keys = Object.keys(this.seriesList);
40264
40636
  var isHorizontal = this.options.horizontal;
@@ -40276,7 +40648,7 @@ var modules = {
40276
40648
  if (keys.length) {
40277
40649
  return keys.reduce(function (acc, key) {
40278
40650
  var minmax = acc;
40279
- var series = _this9.seriesList[key];
40651
+ var series = _this10.seriesList[key];
40280
40652
  var smm = series.minMax;
40281
40653
  var axisX = series.xAxisIndex;
40282
40654
  var axisY = series.yAxisIndex;
@@ -42133,7 +42505,7 @@ var element_line_Line = /*#__PURE__*/function () {
42133
42505
  }, {
42134
42506
  key: "findGraphData",
42135
42507
  value: function findGraphData(offset, isHorizontal, dataIndex, useSelectLabelOrItem) {
42136
- var _item$data;
42508
+ var _this$pointSize, _item$data;
42137
42509
 
42138
42510
  var xp = offset[0];
42139
42511
  var yp = offset[1];
@@ -42145,7 +42517,23 @@ var element_line_Line = /*#__PURE__*/function () {
42145
42517
  var gdata = this.data.filter(function (data) {
42146
42518
  return !helpers_util.isNullOrUndefined(data.x);
42147
42519
  });
42148
- var isLinearInterpolation = this.useLinearInterpolation();
42520
+ var isLinearInterpolation = this.useLinearInterpolation(); // line 포인트 "정확 히트" 판정용 반경.
42521
+ // combo 차트에서 line 포인트 중심을 직격한 경우, 같은 좌표의 bar(directHit)보다
42522
+ // line이 우선되도록 item.directHit = true로 표시한다. 그 외(단순 Y축 근접)는 기존처럼 hit만.
42523
+ // 포인트 반지름에 기본 포인트 크기(LINE_OPTION.pointSize)만큼의 클릭 여유 마진을 더하고,
42524
+ // 시각적으로 하이라이트되는 포인트 반경(highlight.maxSize)을 최소 보장값으로 사용한다.
42525
+
42526
+ var directHitRadius = Math.max(((_this$pointSize = this.pointSize) !== null && _this$pointSize !== void 0 ? _this$pointSize : LINE_OPTION.pointSize) + LINE_OPTION.pointSize, LINE_OPTION.highlight.maxSize);
42527
+
42528
+ var isLinePointDirectHit = function isLinePointDirectHit(point) {
42529
+ if (!point || point.xp === undefined || point.yp === undefined) {
42530
+ return false;
42531
+ }
42532
+
42533
+ var dx = xp - point.xp;
42534
+ var dy = yp - point.yp;
42535
+ return dx * dx + dy * dy <= directHitRadius * directHitRadius;
42536
+ };
42149
42537
 
42150
42538
  if (gdata !== null && gdata !== void 0 && gdata.length) {
42151
42539
  if (typeof dataIndex === 'number' && this.show) {
@@ -42160,6 +42548,11 @@ var element_line_Line = /*#__PURE__*/function () {
42160
42548
  if (yDist <= directHitThreshold) {
42161
42549
  item.hit = true;
42162
42550
  }
42551
+
42552
+ if (isLinePointDirectHit(point)) {
42553
+ item.hit = true;
42554
+ item.directHit = true;
42555
+ }
42163
42556
  }
42164
42557
  } else if (typeof this.beforeFindItemIndex === 'number' && this.beforeFindItemIndex !== -1 && this.show && useSelectLabelOrItem) {
42165
42558
  item.data = gdata[this.beforeFindItemIndex];
@@ -42308,6 +42701,11 @@ var element_line_Line = /*#__PURE__*/function () {
42308
42701
  if (_yDist <= _directHitThreshold) {
42309
42702
  item.hit = true;
42310
42703
  }
42704
+
42705
+ if (isLinePointDirectHit(_point3)) {
42706
+ item.hit = true;
42707
+ item.directHit = true;
42708
+ }
42311
42709
  }
42312
42710
  }
42313
42711
  }
@@ -43248,7 +43646,10 @@ var element_bar_Bar = /*#__PURE__*/function () {
43248
43646
  if (barData[clampedIndex]) {
43249
43647
  item.data = barData[clampedIndex];
43250
43648
  item.index = clampedIndex;
43251
- item.hit = this.isPointInBar(offset, barData[clampedIndex]);
43649
+ item.hit = this.isPointInBar(offset, barData[clampedIndex]); // bar 박스 내부 클릭은 "직접 박스 히트"로 표시.
43650
+ // findHitItem에서 line 포인트 근접 히트보다 우선 선택되도록 하기 위함.
43651
+
43652
+ item.directHit = item.hit;
43252
43653
  }
43253
43654
 
43254
43655
  return item;
@@ -43305,7 +43706,9 @@ var element_bar_Bar = /*#__PURE__*/function () {
43305
43706
  if (inRange) {
43306
43707
  item.data = barData;
43307
43708
  item.index = barData.index;
43308
- item.hit = this.isPointInBar(offset, barData);
43709
+ item.hit = this.isPointInBar(offset, barData); // bar 박스 내부 클릭은 "직접 박스 히트"로 표시 (findHitItem 우선순위용).
43710
+
43711
+ item.directHit = item.hit;
43309
43712
  return item;
43310
43713
  }
43311
43714
 
@@ -46783,6 +47186,9 @@ var scale_logarithmic_LogarithmicScale = /*#__PURE__*/function (_Scale) {
46783
47186
  }(scale_scale);
46784
47187
 
46785
47188
  /* harmony default export */ var scale_logarithmic = (scale_logarithmic_LogarithmicScale);
47189
+ // EXTERNAL MODULE: ./node_modules/core-js/modules/es.weak-map.js
47190
+ var es_weak_map = __webpack_require__("10d1");
47191
+
46786
47192
  // CONCATENATED MODULE: ./src/components/chart/scale/scale.step.js
46787
47193
 
46788
47194
 
@@ -46802,6 +47208,16 @@ var scale_logarithmic_LogarithmicScale = /*#__PURE__*/function (_Scale) {
46802
47208
 
46803
47209
 
46804
47210
 
47211
+
47212
+
47213
+
47214
+
47215
+ /**
47216
+ * scrollbar 사용 시 스크롤마다 labels 전체를 재순회하지 않도록 결과를 캐시
47217
+ */
47218
+
47219
+ var stringMinMaxByLabels = new WeakMap();
47220
+
46805
47221
  var scale_step_StepScale = /*#__PURE__*/function (_Scale) {
46806
47222
  _inherits(StepScale, _Scale);
46807
47223
 
@@ -46817,21 +47233,43 @@ var scale_step_StepScale = /*#__PURE__*/function (_Scale) {
46817
47233
  return _this;
46818
47234
  }
46819
47235
  /**
46820
- * Calculate min/max value, label and size information for step scale
46821
- * @param {object} minMax min/max information (unused on step scale)
46822
- * @param {object} scrollbarOpt scroll bar option
46823
- * @param {object} chartRect chart size information
46824
- *
46825
- * @returns {object} min/max value and label
47236
+ * labels 배열의 문자열 min/max 반환
47237
+ * - alignToGridLine: 전달받은 minMax 그대로 사용
47238
+ * - scrollbar 사용: WeakMap 캐시를 통해 O(n) → O(1)로 단축
47239
+ * - 일반: 매번 getStringMinMax 계산
47240
+ * @param {object} minMax 축 min/max 정보 (alignToGridLine 시 사용)
47241
+ * @param {object} scrollbarOpt 스크롤바 옵션
47242
+ * @returns {{ min: string, max: string }}
46826
47243
  */
46827
47244
 
46828
47245
 
46829
47246
  _createClass(StepScale, [{
47247
+ key: "getStepMinMax",
47248
+ value: function getStepMinMax(minMax, scrollbarOpt) {
47249
+ if (this.labelStyle.alignToGridLine) return minMax;
47250
+ if (!(scrollbarOpt !== null && scrollbarOpt !== void 0 && scrollbarOpt.use)) return helpers_util.getStringMinMax(this.labels);
47251
+
47252
+ if (!stringMinMaxByLabels.has(this.labels)) {
47253
+ stringMinMaxByLabels.set(this.labels, helpers_util.getStringMinMax(this.labels));
47254
+ }
47255
+
47256
+ return stringMinMaxByLabels.get(this.labels);
47257
+ }
47258
+ /**
47259
+ * Calculate min/max value, label and size information for step scale
47260
+ * @param {object} minMax min/max information (unused on step scale)
47261
+ * @param {object} scrollbarOpt scroll bar option
47262
+ * @param {object} chartRect chart size information
47263
+ *
47264
+ * @returns {object} min/max value and label
47265
+ */
47266
+
47267
+ }, {
46830
47268
  key: "calculateScaleRange",
46831
47269
  value: function calculateScaleRange(minMax, scrollbarOpt, chartRect) {
46832
47270
  var _this$labelStyle$maxW, _this$labelStyle;
46833
47271
 
46834
- var stepMinMax = this.labelStyle.alignToGridLine ? minMax : helpers_util.getStringMinMax(this.labels);
47272
+ var stepMinMax = this.getStepMinMax(minMax, scrollbarOpt);
46835
47273
  var maxValue = stepMinMax.max;
46836
47274
  var minValue = stepMinMax.min;
46837
47275
  var minIndex = 0;
@@ -50296,9 +50734,18 @@ var plugins_scrollbar_module = {
50296
50734
  var isResetPosition = dir === 'x' ? (_this$options$axesX2 = this.options.axesX) === null || _this$options$axesX2 === void 0 ? void 0 : (_this$options$axesX2$ = _this$options$axesX2[0]) === null || _this$options$axesX2$ === void 0 ? void 0 : (_this$options$axesX2$2 = _this$options$axesX2$.scrollbar) === null || _this$options$axesX2$2 === void 0 ? void 0 : _this$options$axesX2$2.resetPosition : (_this$options$axesY2 = this.options.axesY) === null || _this$options$axesY2 === void 0 ? void 0 : (_this$options$axesY2$ = _this$options$axesY2[0]) === null || _this$options$axesY2$ === void 0 ? void 0 : (_this$options$axesY2$2 = _this$options$axesY2$.scrollbar) === null || _this$options$axesY2$2 === void 0 ? void 0 : _this$options$axesY2$2.resetPosition;
50297
50735
 
50298
50736
  if (isUpdateAxesRange) {
50299
- var _newOpt$5, _newOpt$5$range, _newOpt$6;
50737
+ var _newOpt$5;
50738
+
50739
+ var newOptRange = newOpt === null || newOpt === void 0 ? void 0 : (_newOpt$5 = newOpt[0]) === null || _newOpt$5 === void 0 ? void 0 : _newOpt$5.range;
50740
+ var currentRange = this.scrollbar[dir].range;
50300
50741
 
50301
- this.scrollbar[dir].range = newOpt !== null && newOpt !== void 0 && (_newOpt$5 = newOpt[0]) !== null && _newOpt$5 !== void 0 && (_newOpt$5$range = _newOpt$5.range) !== null && _newOpt$5$range !== void 0 && _newOpt$5$range.length ? _toConsumableArray(newOpt === null || newOpt === void 0 ? void 0 : (_newOpt$6 = newOpt[0]) === null || _newOpt$6 === void 0 ? void 0 : _newOpt$6.range) : null;
50742
+ if (!isResetPosition && newOptRange !== null && newOptRange !== void 0 && newOptRange.length && currentRange !== null && currentRange !== void 0 && currentRange.length) {
50743
+ // 리사이즈 등으로 range 크기만 변경된 경우, 현재 스크롤 위치(min)를 유지하고 크기만 조정
50744
+ var newSize = newOptRange[1] - newOptRange[0];
50745
+ this.scrollbar[dir].range = [currentRange[0], currentRange[0] + newSize];
50746
+ } else {
50747
+ this.scrollbar[dir].range = newOptRange !== null && newOptRange !== void 0 && newOptRange.length ? _toConsumableArray(newOptRange) : null;
50748
+ }
50302
50749
  }
50303
50750
 
50304
50751
  if (isResetPosition || updateData) {
@@ -51473,6 +51920,7 @@ function inRange_inRange(number, start, end) {
51473
51920
 
51474
51921
 
51475
51922
 
51923
+
51476
51924
 
51477
51925
 
51478
51926
  var plugins_interaction_modules = {
@@ -51686,10 +52134,12 @@ var plugins_interaction_modules = {
51686
52134
  }
51687
52135
 
51688
52136
  var setSelectedItemInfo = function setSelectedItemInfo() {
51689
- var hitInfo = _this.findHitItem(offset); // 실제 클릭된 아이템의 정보 추출 (hitId가 있으면 해당 아이템, 없으면 첫 번째 아이템)
52137
+ var _hitInfo$hitId;
51690
52138
 
52139
+ var hitInfo = _this.findHitItem(offset, true); // 실제 클릭된 아이템의 정보 추출 (hitId가 있으면 해당 아이템, 없으면 첫 번째 아이템)
51691
52140
 
51692
- var hitItemId = hitInfo.hitId || Object.keys(hitInfo.items)[0];
52141
+
52142
+ var hitItemId = (_hitInfo$hitId = hitInfo.hitId) !== null && _hitInfo$hitId !== void 0 ? _hitInfo$hitId : Object.keys(hitInfo.items)[0];
51693
52143
  var hitItem = hitInfo.items[hitItemId];
51694
52144
 
51695
52145
  if (hitItem) {
@@ -51704,9 +52154,11 @@ var plugins_interaction_modules = {
51704
52154
  };
51705
52155
 
51706
52156
  var setSelectedLabelInfo = function setSelectedLabelInfo(targetAxis) {
51707
- var hitInfo = _this.findHitItem(offset);
52157
+ var _hitInfo$hitId2;
52158
+
52159
+ var hitInfo = _this.findHitItem(offset, true);
51708
52160
 
51709
- var hitItemId = hitInfo.hitId || Object.keys(hitInfo.items)[0];
52161
+ var hitItemId = (_hitInfo$hitId2 = hitInfo.hitId) !== null && _hitInfo$hitId2 !== void 0 ? _hitInfo$hitId2 : Object.keys(hitInfo.items)[0];
51710
52162
  var hitItem = hitInfo.items[hitItemId];
51711
52163
 
51712
52164
  var _this$getLabelInfoByP = _this.getLabelInfoByPosition(offset, targetAxis),
@@ -51729,9 +52181,11 @@ var plugins_interaction_modules = {
51729
52181
  };
51730
52182
 
51731
52183
  var setSelectedSeriesInfo = function setSelectedSeriesInfo() {
51732
- var hitInfo = _this.findHitItem(offset);
52184
+ var _hitInfo$hitId3;
51733
52185
 
51734
- var hitItemId = hitInfo.hitId || Object.keys(hitInfo.items)[0];
52186
+ var hitInfo = _this.findHitItem(offset, true);
52187
+
52188
+ var hitItemId = (_hitInfo$hitId3 = hitInfo.hitId) !== null && _hitInfo$hitId3 !== void 0 ? _hitInfo$hitId3 : Object.keys(hitInfo.items)[0];
51735
52189
  var hitItem = hitInfo.items[hitItemId];
51736
52190
 
51737
52191
  if (hitItemId !== null) {
@@ -51814,19 +52268,19 @@ var plugins_interaction_modules = {
51814
52268
  var useSelectSeries = (selectSeriesOpt === null || selectSeriesOpt === void 0 ? void 0 : selectSeriesOpt.use) && (selectSeriesOpt === null || selectSeriesOpt === void 0 ? void 0 : selectSeriesOpt.useClick);
51815
52269
 
51816
52270
  var setSelectedItemInfo = function setSelectedItemInfo() {
51817
- var hitInfo = _this.getItemByPosition(offset, false);
52271
+ var hitInfo = _this.getHitItemByPosition(offset, false, undefined, false, true);
51818
52272
 
51819
52273
  args.label = hitInfo.label;
51820
52274
  args.value = hitInfo.value;
51821
52275
  args.seriesId = hitInfo.sId;
51822
- args.dataIndex = hitInfo.maxIndex;
52276
+ args.dataIndex = hitInfo.dataIndex;
51823
52277
  args.acc = hitInfo.acc;
51824
52278
 
51825
52279
  if (hitInfo !== null && hitInfo !== void 0 && hitInfo.sId) {
51826
52280
  args.selected = {
51827
52281
  eventTarget: 'item',
51828
52282
  seriesId: _this.isDeselectItem(hitInfo) ? null : hitInfo.sId,
51829
- dataIndex: _this.isDeselectItem(hitInfo) ? null : hitInfo.maxIndex
52283
+ dataIndex: _this.isDeselectItem(hitInfo) ? null : hitInfo.dataIndex
51830
52284
  };
51831
52285
  }
51832
52286
  };
@@ -51854,9 +52308,11 @@ var plugins_interaction_modules = {
51854
52308
  };
51855
52309
 
51856
52310
  var setSelectedSeriesInfo = function setSelectedSeriesInfo() {
51857
- var hitInfo = _this.findHitItem(offset);
52311
+ var _hitInfo$hitId4;
52312
+
52313
+ var hitInfo = _this.findHitItem(offset, true);
51858
52314
 
51859
- var hitItemId = hitInfo.hitId || Object.keys(hitInfo.items)[0];
52315
+ var hitItemId = (_hitInfo$hitId4 = hitInfo.hitId) !== null && _hitInfo$hitId4 !== void 0 ? _hitInfo$hitId4 : Object.keys(hitInfo.items)[0];
51860
52316
  var hitItem = hitInfo.items[hitItemId];
51861
52317
 
51862
52318
  if (hitItemId !== null) {
@@ -52490,19 +52946,30 @@ var plugins_interaction_modules = {
52490
52946
  findHitItem: function findHitItem(offset) {
52491
52947
  var _this4 = this;
52492
52948
 
52949
+ var disableNullLabelSnap = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
52493
52950
  var sIds = Object.keys(this.seriesList);
52494
52951
  var items = {};
52495
52952
  var isHorizontal = !!this.options.horizontal;
52496
52953
  var ctx = this.tooltipCtx;
52954
+
52955
+ var _offset = _slicedToArray(offset, 2),
52956
+ cx = _offset[0],
52957
+ cy = _offset[1];
52958
+
52497
52959
  var hitId = null;
52498
52960
  var maxs = '';
52499
52961
  var maxsw = 0;
52500
52962
  var maxv = '';
52501
52963
  var maxg = null;
52502
52964
  var maxSID = null;
52503
- var minDistance = Infinity; // 1. 먼저 공통으로 사용할 데이터 인덱스 결정
52965
+ var minDistance = Infinity; // directHit 하나라도 있으면 일반 hit 는 hitId 후보에서 배제.
52966
+
52967
+ var hasDirectHit = false; // hit 이 없을 때 거리 기반으로 선택할 fallback (기존 "첫 시리즈 고정" 대체).
52968
+
52969
+ var fallbackId = null;
52970
+ var fallbackDistance = Infinity; // 1. 먼저 공통으로 사용할 데이터 인덱스 결정
52504
52971
 
52505
- var targetDataIndex = this.findClosestDataIndex(offset, sIds);
52972
+ var targetDataIndex = this.findClosestDataIndex(offset, sIds, disableNullLabelSnap);
52506
52973
 
52507
52974
  if (targetDataIndex === -1 && !this.isNotUseIndicator()) {
52508
52975
  return {
@@ -52576,24 +53043,79 @@ var plugins_interaction_modules = {
52576
53043
  if (maxg === null || maxg <= gdata) {
52577
53044
  maxg = gdata;
52578
53045
  maxSID = sId;
52579
- } // 마우스 위치와의 거리 계산하여 가장 가까운 시리즈 선택
53046
+ } // hit 기반 선택: directHit 최우선, 일반 hit 는 directHit 없을 때만.
52580
53047
 
52581
53048
 
52582
53049
  if (item.hit && item.data.xp !== undefined && item.data.yp !== undefined) {
52583
53050
  var distance = Math.pow(item.data.xp - offset[0], 2) + Math.pow(item.data.yp - offset[1], 2);
52584
53051
 
52585
- if (distance < minDistance) {
53052
+ if (item.directHit) {
53053
+ if (!hasDirectHit || distance < minDistance) {
53054
+ minDistance = distance;
53055
+ hitId = sId;
53056
+ }
53057
+
53058
+ hasDirectHit = true;
53059
+ } else if (!hasDirectHit && distance < minDistance) {
52586
53060
  minDistance = distance;
52587
53061
  hitId = sId;
52588
53062
  }
53063
+ } // fallback 후보: hit 여부와 무관하게 거리가 가장 가까운 시리즈.
53064
+ // 참고: 이 블록은 outer `if (gdata !== null && gdata !== undefined)` 안에 있어서
53065
+ // 값이 null 인 시리즈는 items 수집 단계에서 이미 걸러진 상태. 별도 null 값 가드 불필요.
53066
+
53067
+
53068
+ if (item.data.xp !== undefined && item.data.yp !== undefined && item.data.xp !== null && item.data.yp !== null) {
53069
+ var fbDistance = helpers_util.calcBoxDistance(item.data, cx, cy);
53070
+
53071
+ if (fbDistance < fallbackDistance) {
53072
+ fallbackDistance = fbDistance;
53073
+ fallbackId = sId;
53074
+ }
52589
53075
  }
52590
53076
  }
52591
53077
  }
52592
53078
  }
53079
+ } // hit 없으면 거리 기반 fallback, 그것도 없으면 items 첫 키(항상 비어있을 가능성 방어).
53080
+
53081
+
53082
+ if (hitId === null) {
53083
+ hitId = fallbackId !== null ? fallbackId : Object.keys(items)[0];
53084
+ }
53085
+
53086
+ var maxHighlight = maxg !== null ? [maxSID, maxg] : null; // all-null 라벨인 경우 synthetic items[''] 로 label/index 만 채워 전달.
53087
+
53088
+ if (disableNullLabelSnap && Object.keys(items).length === 0 && targetDataIndex !== -1) {
53089
+ var _this$seriesList$refS;
53090
+
53091
+ var refSeriesID = sIds.find(function (sId) {
53092
+ var _s$data;
53093
+
53094
+ var s = _this4.seriesList[sId];
53095
+ return (s === null || s === void 0 ? void 0 : s.show) && (s === null || s === void 0 ? void 0 : (_s$data = s.data) === null || _s$data === void 0 ? void 0 : _s$data.length) > 0;
53096
+ });
53097
+ var refPoint = refSeriesID ? (_this$seriesList$refS = this.seriesList[refSeriesID].data) === null || _this$seriesList$refS === void 0 ? void 0 : _this$seriesList$refS[targetDataIndex] : null;
53098
+
53099
+ if (refPoint) {
53100
+ items[''] = {
53101
+ id: '',
53102
+ name: '',
53103
+ label: isHorizontal ? refPoint.y : refPoint.x,
53104
+ index: targetDataIndex,
53105
+ axis: {
53106
+ x: 0,
53107
+ y: 0
53108
+ },
53109
+ data: {
53110
+ o: undefined,
53111
+ x: refPoint.x,
53112
+ y: refPoint.y
53113
+ }
53114
+ };
53115
+ hitId = '';
53116
+ }
52593
53117
  }
52594
53118
 
52595
- hitId = hitId === null ? Object.keys(items)[0] : hitId;
52596
- var maxHighlight = maxg !== null ? [maxSID, maxg] : null;
52597
53119
  return {
52598
53120
  items: items,
52599
53121
  hitId: hitId,
@@ -52612,9 +53134,11 @@ var plugins_interaction_modules = {
52612
53134
  var _this5 = this,
52613
53135
  _this$seriesList$refe;
52614
53136
 
52615
- var _offset = _slicedToArray(offset, 2),
52616
- xp = _offset[0],
52617
- yp = _offset[1];
53137
+ var disableNullLabelSnap = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
53138
+
53139
+ var _offset2 = _slicedToArray(offset, 2),
53140
+ xp = _offset2[0],
53141
+ yp = _offset2[1];
52618
53142
 
52619
53143
  var isHorizontal = !!this.options.horizontal;
52620
53144
  var mousePos = isHorizontal ? yp : xp; // 데이터 있는 시리즈를 기준으로 라벨 위치 확인
@@ -52667,11 +53191,10 @@ var plugins_interaction_modules = {
52667
53191
  }
52668
53192
 
52669
53193
  var closestDistance = Infinity;
52670
- var closestIndex = -1; // 각 라벨에서 가장 가까운 것 찾기
53194
+ var closestIndex = -1; // 각 라벨에서 가장 가까운 것 찾기 (disableNullLabelSnap=true 면 all-null 라벨도 후보)
52671
53195
 
52672
53196
  var _loop = function _loop(_i) {
52673
- // 라벨에 유효한 데이터가 있는 시리즈가 하나 이상 있는지 확인
52674
- var hasValidData = sIds.some(function (sId) {
53197
+ var hasValidData = disableNullLabelSnap || sIds.some(function (sId) {
52675
53198
  var _series$data2, _series$data2$_i, _series$data3, _series$data3$_i;
52676
53199
 
52677
53200
  var series = _this5.seriesList[sId];
@@ -53278,7 +53801,7 @@ var plugins_interaction_modules = {
53278
53801
  isDeselectItem: function isDeselectItem(hitInfo) {
53279
53802
  var _this$defaultSelectIt, _this$defaultSelectIt2;
53280
53803
 
53281
- return this.options.selectItem.useDeselectItem && (hitInfo === null || hitInfo === void 0 ? void 0 : hitInfo.maxIndex) === ((_this$defaultSelectIt = this.defaultSelectItemInfo) === null || _this$defaultSelectIt === void 0 ? void 0 : _this$defaultSelectIt.dataIndex) && (hitInfo === null || hitInfo === void 0 ? void 0 : hitInfo.sId) === ((_this$defaultSelectIt2 = this.defaultSelectItemInfo) === null || _this$defaultSelectIt2 === void 0 ? void 0 : _this$defaultSelectIt2.seriesID) && !isNaN(hitInfo === null || hitInfo === void 0 ? void 0 : hitInfo.maxIndex);
53804
+ return this.options.selectItem.useDeselectItem && (hitInfo === null || hitInfo === void 0 ? void 0 : hitInfo.dataIndex) === ((_this$defaultSelectIt = this.defaultSelectItemInfo) === null || _this$defaultSelectIt === void 0 ? void 0 : _this$defaultSelectIt.dataIndex) && (hitInfo === null || hitInfo === void 0 ? void 0 : hitInfo.sId) === ((_this$defaultSelectIt2 = this.defaultSelectItemInfo) === null || _this$defaultSelectIt2 === void 0 ? void 0 : _this$defaultSelectIt2.seriesID) && !isNaN(hitInfo === null || hitInfo === void 0 ? void 0 : hitInfo.dataIndex);
53282
53805
  },
53283
53806
 
53284
53807
  /**
@@ -53287,9 +53810,9 @@ var plugins_interaction_modules = {
53287
53810
  * @returns {string}
53288
53811
  */
53289
53812
  getCurMouseLocation: function getCurMouseLocation(offset) {
53290
- var _offset2 = _slicedToArray(offset, 2),
53291
- offsetX = _offset2[0],
53292
- offsetY = _offset2[1];
53813
+ var _offset3 = _slicedToArray(offset, 2),
53814
+ offsetX = _offset3[0],
53815
+ offsetY = _offset3[1];
53293
53816
 
53294
53817
  var aPos = {
53295
53818
  x1: this.chartRect.x1 + this.labelOffset.left,
@@ -54952,7 +55475,7 @@ var element_tip_modules = {
54952
55475
 
54953
55476
  if (tipType === 'sel') {
54954
55477
  if (hitInfo && hitInfo.label !== null) {
54955
- lastTip.pos = type === 'bar' ? hitInfo.maxIndex : hitInfo.label;
55478
+ lastTip.pos = type === 'bar' ? hitInfo.dataIndex : hitInfo.label;
54956
55479
  ldata = lastTip.pos;
54957
55480
  } else if (lastTip.pos !== null) {
54958
55481
  ldata = lastTip.pos;
@@ -56051,10 +56574,10 @@ var chart_core_EvChart = /*#__PURE__*/function () {
56051
56574
  var lastHitInfo = this.lastHitInfo;
56052
56575
  var defaultSelectInfo = this.defaultSelectItemInfo;
56053
56576
 
56054
- if (lastHitInfo !== null && lastHitInfo !== void 0 && lastHitInfo.maxIndex || (lastHitInfo === null || lastHitInfo === void 0 ? void 0 : lastHitInfo.maxIndex) === 0) {
56577
+ if (lastHitInfo !== null && lastHitInfo !== void 0 && lastHitInfo.dataIndex || (lastHitInfo === null || lastHitInfo === void 0 ? void 0 : lastHitInfo.dataIndex) === 0) {
56055
56578
  _selectInfo = {
56056
56579
  seriesID: lastHitInfo.sId,
56057
- dataIndex: lastHitInfo.maxIndex
56580
+ dataIndex: lastHitInfo.dataIndex
56058
56581
  };
56059
56582
  } else if (defaultSelectInfo !== null && defaultSelectInfo !== void 0 && defaultSelectInfo.dataIndex || (defaultSelectInfo === null || defaultSelectInfo === void 0 ? void 0 : defaultSelectInfo.dataIndex) === 0) {
56060
56583
  _selectInfo = _objectSpread2({}, defaultSelectInfo);