UNPKG

@visactor/vchart

Version:

charts lib based @visactor/VGrammar

228 lines (221 loc) 13.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: !0 }), exports.getMarkInfoList = exports.showTooltip = void 0; const type_1 = require("../../../series/interface/type"), event_1 = require("../../../constant/event"), vutils_1 = require("@visactor/vutils"), vchart_1 = require("../../../core/vchart"), vscale_1 = require("@visactor/vscale"), getDataArrayFromFieldArray = (fields, datum) => (0, vutils_1.isValid)(datum) ? fields.map((f => datum[f])) : void 0, datumContainsArray = (fields, data) => datum => fields.every(((key, i) => datum[key] === (null == data ? void 0 : data[i]))), hasData = data => !(0, vutils_1.isNil)(data) && ((0, vutils_1.isArray)(data) ? data.length > 0 && data.every(vutils_1.isValid) : Object.keys(data).length > 0); function showTooltip(datum, options, component) { var _a, _b, _c; const opt = Object.assign({ regionIndex: 0 }, options), componentOptions = component.getOption(), region = componentOptions.getRegionsInUserIdOrIndex((0, vutils_1.isValid)(opt.regionId) ? [ opt.regionId ] : void 0, (0, vutils_1.isValid)(opt.regionIndex) ? [ opt.regionIndex ] : void 0)[0]; if (!region) return "none"; const markInfoList = (0, exports.getMarkInfoList)(datum, region), activeType = null !== (_a = opt.activeType) && void 0 !== _a ? _a : markInfoList.length > 1 ? "dimension" : "mark", regionPos = region.getLayoutStartPoint(), regionRect = region.getLayoutRect(), container = componentOptions.globalInstance.getContainer(), containerPos = Object.assign({ x: 0, y: 0 }, container ? (0, vutils_1.getElementAbsolutePosition)(container) : {}), getOriginDatum = info => { var _a; const {dimensionFields: dimensionFields, dimensionData: dimensionData, measureFields: measureFields, measureData: measureData, groupField: groupField, groupData: groupData} = info.data, originDatum = null === (_a = info.series.getViewData()) || void 0 === _a ? void 0 : _a.latestData.find((datum => datumContainsArray(dimensionFields, dimensionData)(datum) && datumContainsArray(measureFields, measureData)(datum) && ((0, vutils_1.isNil)(groupField) || datumContainsArray([ groupField ], [ groupData ])(datum)))); return originDatum; }, getMockEvent = originPos => { var _a, _b; const pos = (pos => ({ x: Math.min(Math.max(pos.x, 0), regionRect.width), y: Math.min(Math.max(pos.y, 0), regionRect.height) }))(originPos), canvasX = null !== (_a = opt.x) && void 0 !== _a ? _a : regionPos.x + pos.x, canvasY = null !== (_b = opt.y) && void 0 !== _b ? _b : regionPos.y + pos.y; return { canvasX: canvasX, canvasY: canvasY, clientX: containerPos.x + canvasX, clientY: containerPos.y + canvasY }; }; if ("dimension" === activeType) { const firstInfo = markInfoList[0]; if (!firstInfo) return "none"; const markInfoSeriesMap = new Map; markInfoList.forEach((info => { var _a; markInfoSeriesMap.has(info.series) || markInfoSeriesMap.set(info.series, []), null === (_a = markInfoSeriesMap.get(info.series)) || void 0 === _a || _a.push(info); })); const mockDimensionInfo = [ { value: datum[firstInfo.data.dimensionFields[0]], data: [ ...markInfoSeriesMap.keys() ].map((series => { var _a, _b; return { series: series, datum: null !== (_b = null === (_a = markInfoSeriesMap.get(series)) || void 0 === _a ? void 0 : _a.map((info => getOriginDatum(info)))) && void 0 !== _b ? _b : [] }; })) } ]; (0, vutils_1.isValid)(firstInfo.dimType) && (mockDimensionInfo[0].position = firstInfo.pos[firstInfo.dimType], mockDimensionInfo[0].dimType = firstInfo.dimType); const mockParams = { changePositionOnly: !1, action: "enter", tooltip: null, dimensionInfo: mockDimensionInfo, chart: null !== (_b = componentOptions.globalInstance.getChart()) && void 0 !== _b ? _b : void 0, datum: void 0, model: void 0, source: event_1.Event_Source_Type.chart, event: getMockEvent({ x: markInfoList.reduce(((sum, info) => sum + info.pos.x), 0) / markInfoList.length, y: markInfoList.reduce(((sum, info) => sum + info.pos.y), 0) / markInfoList.length }), item: void 0 }; component.processor.dimension.showTooltip(mockDimensionInfo, mockParams, !1); const vchart = componentOptions.globalInstance; return vchart_1.VChart.globalConfig.uniqueTooltip && vchart_1.VChart.hideTooltip(vchart.id), activeType; } if ("mark" === activeType) { const info = markInfoList[0]; if (!info) return "none"; const mockDatum = Object.assign(Object.assign({}, getOriginDatum(info)), datum), mockDimensionData = [ { datum: [ mockDatum ], series: info.series } ], mockParams = { changePositionOnly: !1, tooltip: null, dimensionInfo: [ { value: mockDatum[info.data.dimensionFields[0]], data: mockDimensionData } ], chart: null !== (_c = componentOptions.globalInstance.getChart()) && void 0 !== _c ? _c : void 0, datum: mockDatum, model: info.series, source: event_1.Event_Source_Type.chart, event: getMockEvent(info.pos), item: void 0 }; component.processor.mark.showTooltip({ datum: mockDatum, mark: null, series: info.series }, mockParams, !1); const vchart = componentOptions.globalInstance; return vchart_1.VChart.globalConfig.uniqueTooltip && vchart_1.VChart.hideTooltip(vchart.id), activeType; } return "none"; } exports.showTooltip = showTooltip; const getMarkInfoList = (datum, region) => { const seriesList = region.getSeries(), markInfoList = []; return seriesList.forEach((series => { var _a, _b, _c, _d, _e, _f, _g; const dimensionFields = series.getDimensionField(), measureFields = series.getMeasureField(), groupField = series.getSeriesField(), groupData = (0, vutils_1.isValid)(groupField) ? datum[groupField] : void 0, groupDomain = (0, vutils_1.isValid)(groupField) && null !== (_d = null === (_c = null === (_b = null === (_a = series.getViewDataStatistics) || void 0 === _a ? void 0 : _a.call(series)) || void 0 === _b ? void 0 : _b.latestData[groupField]) || void 0 === _c ? void 0 : _c.values) && void 0 !== _d ? _d : [], dimensionData = getDataArrayFromFieldArray(dimensionFields, datum); let measureData = getDataArrayFromFieldArray(measureFields, datum); const hasMeasureData = hasData(measureData), isMultiGroups = !hasMeasureData && (0, vutils_1.isValid)(groupField) && (0, vutils_1.isNil)(groupData) && groupDomain.length > 0, parseMarkInfoOfSimpleSeries = () => { var _a; const originDatum = null === (_a = series.getViewData()) || void 0 === _a ? void 0 : _a.latestData.find(datumContainsArray(dimensionFields, dimensionData)); if (!hasMeasureData && (measureData = getDataArrayFromFieldArray(measureFields, originDatum), !hasData(measureData))) return; const pos = series.type === type_1.SeriesTypeEnum.pie ? series.dataToCentralPosition(originDatum) : series.dataToPosition(originDatum); (0, vutils_1.isNil)(pos) || isNaN(pos.x) || isNaN(pos.y) || markInfoList.push({ pos: pos, data: { dimensionFields: dimensionFields, dimensionData: dimensionData, measureFields: measureFields, measureData: measureData, hasMeasureData: hasMeasureData, groupField: groupField, groupData: groupData }, series: series }); }; if ("cartesian" === series.coordinate) { const cartesianSeries = series, dimType = (0, vscale_1.isDiscrete)(null === (_f = null === (_e = series.getYAxisHelper()) || void 0 === _e ? void 0 : _e.getScale(0)) || void 0 === _f ? void 0 : _f.type) ? "y" : "x", invalidDimensionFields = dimensionFields.map(((field, i) => [ field, i ])).filter((([, i]) => (0, vutils_1.isNil)(null == dimensionData ? void 0 : dimensionData[i]))); let dimensionDataList = [ null != dimensionData ? dimensionData : [] ]; invalidDimensionFields.length > 0 && invalidDimensionFields.forEach((([field, i]) => { var _a, _b, _c, _d; const domain = null !== (_d = null === (_c = null === (_b = null === (_a = series.getViewDataStatistics) || void 0 === _a ? void 0 : _a.call(series)) || void 0 === _b ? void 0 : _b.latestData[field]) || void 0 === _c ? void 0 : _c.values) && void 0 !== _d ? _d : [], nextList = []; dimensionDataList.forEach((dimensionData => { domain.forEach((value => { var _a; const newData = null !== (_a = null == dimensionData ? void 0 : dimensionData.slice()) && void 0 !== _a ? _a : []; newData[i] = value, nextList.push(newData); })); })), dimensionDataList = nextList; })), dimensionDataList.forEach((dimensionData => { var _a, _b; if (isMultiGroups) { const measureDataList = null === (_a = cartesianSeries.getViewData()) || void 0 === _a ? void 0 : _a.latestData.filter(datumContainsArray(dimensionFields, dimensionData)); groupDomain.forEach((groupData => { const originDatum = measureDataList.find((d => d[groupField] === groupData)); if (measureData = getDataArrayFromFieldArray(measureFields, originDatum), !hasData(measureData)) return; const pos = cartesianSeries.dataToPosition(originDatum); (0, vutils_1.isNil)(pos) || isNaN(pos.x) || isNaN(pos.y) || markInfoList.push({ pos: pos, data: { dimensionFields: dimensionFields, dimensionData: dimensionData, measureFields: measureFields, measureData: measureData, hasMeasureData: hasMeasureData, groupField: groupField, groupData: groupData }, series: series, dimType: dimType }); })); } else { const originDatum = null === (_b = cartesianSeries.getViewData()) || void 0 === _b ? void 0 : _b.latestData.find(datumContainsArray(dimensionFields, dimensionData)); if (!hasMeasureData && (measureData = getDataArrayFromFieldArray(measureFields, originDatum), !hasData(measureData))) return; const pos = cartesianSeries.dataToPosition(originDatum); if ((0, vutils_1.isNil)(pos) || isNaN(pos.x) || isNaN(pos.y)) return; markInfoList.push({ pos: pos, data: { dimensionFields: dimensionFields, dimensionData: dimensionData, measureFields: measureFields, measureData: measureData, hasMeasureData: hasMeasureData, groupField: groupField, groupData: groupData }, dimType: dimType, series: series }); } })); } else if ("polar" === series.coordinate) if (series.type === type_1.SeriesTypeEnum.pie) parseMarkInfoOfSimpleSeries(); else { const polarSeries = series; if (isMultiGroups) { const originDatum = (null === (_g = polarSeries.getViewData()) || void 0 === _g ? void 0 : _g.latestData.filter(datumContainsArray(dimensionFields, dimensionData))).find((d => d[groupField] === groupData)); groupDomain.forEach((groupData => { if (measureData = getDataArrayFromFieldArray(measureFields, originDatum), !hasData(measureData)) return; const pos = polarSeries.dataToPosition(originDatum); (0, vutils_1.isNil)(pos) || isNaN(pos.x) || isNaN(pos.y) || markInfoList.push({ pos: pos, data: { dimensionFields: dimensionFields, dimensionData: dimensionData, measureFields: measureFields, measureData: measureData, hasMeasureData: hasMeasureData, groupField: groupField, groupData: groupData }, series: series }); })); } else parseMarkInfoOfSimpleSeries(); } else "geo" === series.coordinate && parseMarkInfoOfSimpleSeries(); })), markInfoList; }; exports.getMarkInfoList = getMarkInfoList; //# sourceMappingURL=show-tooltip.js.map