UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

514 lines 69.3 kB
import { BaseTooltip } from '@alauda/ui'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, TemplateRef, ViewChild, } from '@angular/core'; import dayjs from 'dayjs'; import { get } from 'lodash-es'; import { Subject, takeUntil } from 'rxjs'; import { DATE_TIME_FORMAT } from '../../../core/public-api'; import { ContextChartService } from '../../chart.service'; import { findClosestPointIndex, getXPos, tooltipSuffixFormat, } from '../../utils'; import * as i0 from "@angular/core"; import * as i1 from "../../chart.service"; const _c0 = ["tooltip"]; const _c1 = ["aclTooltip", ""]; const _c2 = a0 => ({ context: a0 }); function ChartTooltipComponent__svg_g_0__svg_circle_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵnamespaceSVG(); i0.ɵɵelement(0, "circle", 8); i0.ɵɵpipe(1, "pure"); } if (rf & 2) { const item_r1 = ctx.$implicit; const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵattribute("visibility", ctx_r1.contextService.disabledLegend.has(item_r1.name) ? "hidden" : "")("stroke", item_r1.color)("cx", ctx_r1.anchorPos)("cy", item_r1.y ? i0.ɵɵpipeBind2(1, 4, item_r1.y, ctx_r1.contextService.y) || 0 : 1000); } } function ChartTooltipComponent__svg_g_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵnamespaceSVG(); i0.ɵɵelementStart(0, "g"); i0.ɵɵtemplate(1, ChartTooltipComponent__svg_g_0__svg_circle_1_Template, 2, 7, "circle", 7); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵattribute("opacity", ctx_r1.anchorOpacity); i0.ɵɵadvance(); i0.ɵɵproperty("ngForOf", ctx_r1.tooltipContext == null ? null : ctx_r1.tooltipContext.values); } } function ChartTooltipComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 9)(1, "div", 10); i0.ɵɵelementContainer(2, 11); i0.ɵɵelementEnd(); i0.ɵɵelementStart(3, "div", 12); i0.ɵɵelementContainer(4, 11); i0.ɵɵpipe(5, "pure"); i0.ɵɵelementEnd()(); i0.ɵɵelement(6, "div", 13); } if (rf & 2) { const context_r3 = ctx.context; const ctx_r1 = i0.ɵɵnextContext(); const defaultTitleTemplate_r4 = i0.ɵɵreference(6); const defaultPointTemplate_r5 = i0.ɵɵreference(8); i0.ɵɵadvance(2); i0.ɵɵproperty("ngTemplateOutlet", ctx_r1.titleTemplate || defaultTitleTemplate_r4)("ngTemplateOutletContext", i0.ɵɵpureFunction1(7, _c2, context_r3)); i0.ɵɵadvance(2); i0.ɵɵproperty("ngTemplateOutlet", ctx_r1.pointTemplate || defaultPointTemplate_r5)("ngTemplateOutletContext", i0.ɵɵpipeBind2(5, 4, context_r3, ctx_r1.mergePointContext)); } } function ChartTooltipComponent_ng_template_5_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtext(0); i0.ɵɵpipe(1, "translate"); i0.ɵɵpipe(2, "pure"); } if (rf & 2) { const context_r6 = ctx.context; const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtextInterpolate1(" ", ctx_r1.titleTranslation ? i0.ɵɵpipeBind1(1, 1, context_r6 == null ? null : context_r6.title) : i0.ɵɵpipeBind3(2, 3, context_r6 == null ? null : context_r6.title, ctx_r1.handleDateFormat, ctx_r1.dateFormat), "\n"); } } function ChartTooltipComponent_ng_template_7_li_1_ng_container_4_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵelementContainer(1, 11); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const item_r7 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵadvance(); i0.ɵɵproperty("ngTemplateOutlet", ctx_r1.pointNameTemplate)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c2, item_r7)); } } function ChartTooltipComponent_ng_template_7_li_1_ng_template_5_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtext(0); i0.ɵɵpipe(1, "translate"); } if (rf & 2) { const item_r7 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtextInterpolate1(" ", ctx_r1.translation ? i0.ɵɵpipeBind1(1, 1, item_r7.name) : item_r7.name, " "); } } function ChartTooltipComponent_ng_template_7_li_1_ng_container_8_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtext(1, ": "); i0.ɵɵelementContainerEnd(); } } function ChartTooltipComponent_ng_template_7_li_1_span_9_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "span", 25); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵadvance(); i0.ɵɵtextInterpolate(ctx_r1.valuePrefix); } } function ChartTooltipComponent_ng_template_7_li_1_span_13_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "span", 26); i0.ɵɵtext(1); i0.ɵɵpipe(2, "pure"); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵadvance(); i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(2, 1, ctx_r1.valueSuffix, ctx_r1.tooltipSuffixFormat)); } } function ChartTooltipComponent_ng_template_7_li_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "li", 16)(1, "div", 17); i0.ɵɵelement(2, "span", 18); i0.ɵɵelementStart(3, "span", 19); i0.ɵɵtemplate(4, ChartTooltipComponent_ng_template_7_li_1_ng_container_4_Template, 2, 4, "ng-container", 20)(5, ChartTooltipComponent_ng_template_7_li_1_ng_template_5_Template, 2, 3, "ng-template", null, 4, i0.ɵɵtemplateRefExtractor); i0.ɵɵelementEnd()(); i0.ɵɵelementStart(7, "div", 21); i0.ɵɵtemplate(8, ChartTooltipComponent_ng_template_7_li_1_ng_container_8_Template, 2, 0, "ng-container", 5)(9, ChartTooltipComponent_ng_template_7_li_1_span_9_Template, 2, 1, "span", 22); i0.ɵɵelementStart(10, "span", 23); i0.ɵɵtext(11); i0.ɵɵpipe(12, "pure"); i0.ɵɵelementEnd(); i0.ɵɵtemplate(13, ChartTooltipComponent_ng_template_7_li_1_span_13_Template, 3, 4, "span", 24); i0.ɵɵelementEnd()(); } if (rf & 2) { const item_r7 = ctx.$implicit; const elseTemplate_r8 = i0.ɵɵreference(6); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵclassProp("active", item_r7 == null ? null : item_r7.active); i0.ɵɵadvance(2); i0.ɵɵstyleProp("background", item_r7.color); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", ctx_r1.pointNameTemplate)("ngIfElse", elseTemplate_r8); i0.ɵɵadvance(4); i0.ɵɵproperty("ngIf", !ctx_r1.columnLayout); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", ctx_r1.valuePrefix); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(12, 10, item_r7, ctx_r1.pointFormat)); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", ctx_r1.valueSuffix); } } function ChartTooltipComponent_ng_template_7_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "ul", 14); i0.ɵɵtemplate(1, ChartTooltipComponent_ng_template_7_li_1_Template, 14, 13, "li", 15); i0.ɵɵelementEnd(); } if (rf & 2) { const context_r9 = ctx.context; const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵclassProp("column-layout", ctx_r1.columnLayout); i0.ɵɵadvance(); i0.ɵɵproperty("ngForOf", context_r9)("ngForTrackBy", ctx_r1.itemTrackBy); } } export function handleDateFormat(date, format = DATE_TIME_FORMAT) { return String(dayjs(date).isValid() ? dayjs(date).format(format) : date); } export class ChartTooltipComponent { get typeStandard() { return this.contextService.barOptions.type === 'standard'; } get isBand() { return this.contextService.barOptions.isBand; } get anchorVisibility() { return this.contextService.disabledLegend.size === (this.typeStandard ? this.contextService.innerDomain.length : this.contextService.chartData?.length) ? 'hidden' : ''; } get groupPosition() { // 计算 group 开始结束位置 return this.contextService.xSeriesValue.map((item, index) => { const x = this.contextService.x; const x1 = x(item); return { x1, x2: x1 + x.bandwidth(), index, groupName: item }; }); } get calculationItemPosition() { // 根据 group 计算 item 开始结束位置 return this.groupPosition.reduce((acc, position, index) => [ ...acc, ...this.contextService.innerDomain.map((inner, i) => { const barInnerScale = this.contextService.barInnerScale(); const x1 = barInnerScale(inner); return { x1: x1 + position.x1, x2: x1 + position.x1 + barInnerScale.bandwidth(), name: inner, groupName: this.contextService.xSeriesValue[index], index: i, }; }), ], []); } constructor(contextService, cdr) { this.contextService = contextService; this.cdr = cdr; this.dateFormat = DATE_TIME_FORMAT; this.columnLayout = false; this.autoSort = false; this.translation = true; this.pointFormat = d => d.y; this.destroy$$ = new Subject(); this.anchorPos = 0; this.anchorOpacity = 0; this.anchorHeight = 0; this.anchorY = 0; this.hacked = false; this.handleDateFormat = handleDateFormat; this.tooltipSuffixFormat = tooltipSuffixFormat; this.calculateY = (_) => 0; this.mergePointContext = (context) => ({ context: this.limitMaxContext(context.values), source: context.source, ...this.pointTemplateContext, }); this.itemTrackBy = (_, value) => value.name; } ngOnInit() { this.contextService.update$$ .pipe(takeUntil(this.destroy$$)) .subscribe(() => { this.anchorHeight = this.contextService.chartView.height; this.view = this.contextService.chartView; this.cdr.detectChanges(); }); this.contextService.legendActivate$$ .pipe(takeUntil(this.destroy$$)) .subscribe(legend => { this.activeLegend = legend; if (this.tooltipContext?.values) { this.tooltipContext = { ...this.tooltipContext, values: this.tooltipContext.values.map(item => ({ ...item, active: item.name === legend, })), }; } this.cdr.detectChanges(); }); } mouseMove(e, rectDom) { const xPos = getXPos(e, this.contextService, rectDom); const closestIndex = findClosestPointIndex(xPos, this.contextService); const closestPoint = this.contextService.xSeriesValue[closestIndex]; if (this.contextService.barOptions.isBand) { this.barMouseMove(e); return; } this.anchorPos = xPos; if (this.anchorPos !== this.lastAnchorPos && closestPoint) { this.tooltipContext = this.getTooltipContext(closestIndex, closestPoint); // 值为 null 不展示 tooltip const noData = !this.tooltipContext?.values?.some(d => d.y !== null); if (noData) { this.anchorOpacity = 0; this.lastAnchorPos = -1; this.hideTooltip(); } else { this.lastAnchorPos = this.anchorPos; this.anchorOpacity = 0.7; this.showTooltip(); } } this.cdr.detectChanges(); } mouseLeave() { this.anchorOpacity = 0; this.lastAnchorPos = -1; this.hideTooltip(); this.cdr.detectChanges(); } // bar mouseMove 处理 barMouseMove(e) { const xPos = getXPos(e, this.contextService); const currPosition = this.getCurrentMouseMovePositionValue(this.typeStandard ? this.calculationItemPosition : this.groupPosition, xPos); if (currPosition) { this.getBarXAnchorPos(currPosition); this.getBarHight(this.contextService.xSeriesValue[currPosition.index], currPosition); this.getBarYAnchorPos(currPosition); this.tooltipContext = this.getBarTooltipContext(currPosition); this.showTooltip(); this.cdr.detectChanges(); } } getBarHight(groupName, value) { this.anchorHeight = this.contextService.horizontal ? this.typeStandard ? this.contextService.barInnerScale().bandwidth() : this.contextService.x.bandwidth() : this.getVerticalBarHeight(groupName, value); } /** * 计算 bar 垂直 类型下 高度 * 标准:直接根据 y(0) - y(value) 计算 bar item 的高度 * 堆叠:计算 group 下所有item 的高度相加 得到堆叠的 bar 高度 */ getVerticalBarHeight(groupName, value) { return this.typeStandard ? this.contextService.y(0) - this.contextService.y(this.getBarYValue(value.groupName, value.name)) : this.contextService.chartData.reduce((prev, curr) => { if (curr.name === groupName) { return (curr.values.reduce((acc, val) => { if (!this.contextService.disabledLegend.has(val.x)) { return (this.contextService.y(0) - this.contextService.y(val.y) + acc); } return acc; }, 0) + prev); } return prev; }, 0); } // 获取当前鼠标移入 bar y 值 getBarYValue(groupName, name) { let result = 0; for (const [, item] of this.contextService.chartData.entries()) { if (item.name === groupName) { for (const [, val] of item.values.entries()) { if (val.x === name) { result = val.y; break; } } break; } } return result; } // line area chart 获取 tooltip 展示数据 getTooltipContext(index, xValue) { const values = this.contextService.chartData.reduce((acc, group) => { if (!this.contextService.disabledLegend.has(group.name)) { const item = group.values[index]; return [ ...acc, { ...item, name: group.name, color: group.color, unit: group.unit, }, ]; } return acc; }, []); return { title: xValue, source: this.contextService.chartData, values: this.autoSort ? values.sort((a, b) => b.y - a.y) : values, }; } /** * 获取 bar tooltip 展示数据 */ getBarTooltipContext(value) { const values = this.contextService.chartData.reduce((acc, group) => { if (group.name === value.groupName) { return [ ...acc, ...group.values.reduce((prev, curr, index) => { if (!this.contextService.disabledLegend.has(curr.x) && (value.name ? curr.x === value.name : true)) { return [ ...prev, { ...curr, name: curr.x, color: curr.color || this.contextService.getChartDefaultColor(index), }, ]; } return prev; }, []), ]; } return acc; }, []); return { title: value.groupName, source: this.contextService.chartData, values, }; } /** * 暂时先 通过 hack 方式 修改 pointer event 行为 * TODO: 后续内部实现 tooltip 不使用 aui tooltip */ hackOverlayPaneStyle(style) { const tooltipPaneDom = get(this.auiTooltipRef.overlayRef, '_pane'); if (tooltipPaneDom) { tooltipPaneDom.style.pointerEvents = style; } } /** * 获取鼠标移动的位置所在的 bar value * @param data 当前 bar 开始结束 x 位置 * @param xPos 当前鼠标位置 */ getCurrentMouseMovePositionValue(data, xPos) { let result; for (const [, position] of data.entries()) { if (xPos >= position.x1 && xPos <= position.x2) { result = position; break; } } return result; } /** * 计算锚点 x 位置 * 当前 bar 数据 x 位置 + 当前 bar 宽度的一般 * @param currPosition 当前鼠标移入的bar 数据 */ getBarXAnchorPos(currPosition) { const bandwidth = this.typeStandard ? this.contextService.barInnerScale().bandwidth() / 2 : this.contextService.x.bandwidth() / 2; this.anchorPos = this.contextService.horizontal ? Math.abs(this.getVerticalBarHeight(this.contextService.xSeriesValue[currPosition.index], currPosition) / 2) : currPosition.x1 + bandwidth; } /** * 计算锚点 y 位置 * 水平:当前 bar 数据 x 位置 * 垂直:总高度 - bar 高度 (需要先计算出 bar高度) */ getBarYAnchorPos(currPosition) { this.anchorY = this.contextService.horizontal ? currPosition.x1 : this.view.height - this.anchorHeight; } showTooltip() { if (!this.auiTooltipRef?.isCreated) { this.auiTooltipRef?.show(); } if (!this.hacked) { this.hackOverlayPaneStyle('none'); } this.hacked = true; } hideTooltip() { this.hacked = false; this.hackOverlayPaneStyle('auto'); this.auiTooltipRef?.hide(); } limitMaxContext(context, limit = 15) { const values = context.slice(0, limit); const existActive = values.some(item => item.name === this.activeLegend); if (!existActive && this.activeLegend) { const data = context.find(item => item.name === this.activeLegend); this.activeLegend = ''; return data ? [...values.slice(0, limit - 1), data] : values; } return values; } ngOnDestroy() { this.destroy$$.next(); this.destroy$$.complete(); } static { this.ɵfac = function ChartTooltipComponent_Factory(t) { return new (t || ChartTooltipComponent)(i0.ɵɵdirectiveInject(i1.ContextChartService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; } static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ChartTooltipComponent, selectors: [["g", "aclTooltip", ""]], viewQuery: function ChartTooltipComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 5); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.auiTooltipRef = _t.first); } }, inputs: { dateFormat: "dateFormat", valuePrefix: "valuePrefix", valueSuffix: "valueSuffix", columnLayout: "columnLayout", tooltipTemplate: "tooltipTemplate", pointTemplate: "pointTemplate", pointNameTemplate: "pointNameTemplate", pointTemplateContext: "pointTemplateContext", titleTemplate: "titleTemplate", autoSort: "autoSort", translation: "translation", titleTranslation: "titleTranslation", pointFormat: "pointFormat" }, attrs: _c1, decls: 9, vars: 13, consts: [["tooltip", "auiTooltip"], ["defaultTooltipTemplate", ""], ["defaultTitleTemplate", ""], ["defaultPointTemplate", ""], ["elseTemplate", ""], [4, "ngIf"], ["stroke", "#999", "auiTooltipTrigger", "manual", "auiTooltipClass", "tooltipClass", 3, "auiTooltip", "auiTooltipContext", "auiTooltipDisabled", "auiTooltipPosition"], ["r", "2.5", "stroke-width", "1", "fill", "#fff", 4, "ngFor", "ngForOf"], ["r", "2.5", "stroke-width", "1", "fill", "#fff"], [1, "tooltip-content"], [1, "title"], [3, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "context"], [2, "position", "absolute", "pointer-events", "none", "width", "100%", "height", "100%"], [1, "context-list"], ["class", "context-item", 3, "active", 4, "ngFor", "ngForOf", "ngForTrackBy"], [1, "context-item"], [1, "left"], [1, "item-icon"], [1, "item-name"], [4, "ngIf", "ngIfElse"], [1, "right"], ["class", "item-prefix", 4, "ngIf"], [1, "item-value"], ["class", "item-suffix", 4, "ngIf"], [1, "item-prefix"], [1, "item-suffix"]], template: function ChartTooltipComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, ChartTooltipComponent__svg_g_0_Template, 2, 2, "g", 5); i0.ɵɵnamespaceSVG(); i0.ɵɵelement(1, "rect", 6, 0); i0.ɵɵtemplate(3, ChartTooltipComponent_ng_template_3_Template, 7, 9, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor)(5, ChartTooltipComponent_ng_template_5_Template, 3, 7, "ng-template", null, 2, i0.ɵɵtemplateRefExtractor)(7, ChartTooltipComponent_ng_template_7_Template, 2, 4, "ng-template", null, 3, i0.ɵɵtemplateRefExtractor); } if (rf & 2) { const defaultTooltipTemplate_r10 = i0.ɵɵreference(4); i0.ɵɵproperty("ngIf", !ctx.isBand); i0.ɵɵadvance(); i0.ɵɵproperty("auiTooltip", ctx.tooltipTemplate || defaultTooltipTemplate_r10)("auiTooltipContext", i0.ɵɵpureFunction1(11, _c2, ctx.tooltipContext))("auiTooltipDisabled", ctx.anchorVisibility)("auiTooltipPosition", ctx.typeStandard && ctx.isBand ? "top" : "start"); i0.ɵɵattribute("x", ctx.anchorPos)("visibility", ctx.anchorVisibility)("y", ctx.anchorY)("width", 0.5)("height", ctx.anchorHeight)("opacity", ctx.anchorOpacity); } }, styles: [".tooltipClass{pointer-events:none;max-width:800px!important}.tooltip-content[_ngcontent-%COMP%]{color:rgb(var(--aui-color-n-6))}.tooltip-content[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{margin-bottom:8px}.tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] ul[_ngcontent-%COMP%], .tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{padding:0;margin:0;list-style:none}.tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] ul[_ngcontent-%COMP%]:not(:last-child), .tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:not(:last-child){margin-bottom:6px}.tooltip-content[_ngcontent-%COMP%] .context-list[_ngcontent-%COMP%]{display:flex;flex-direction:column}.tooltip-content[_ngcontent-%COMP%] .context-list[_ngcontent-%COMP%] .active[_ngcontent-%COMP%]{color:rgb(var(--aui-color-n-10))}.tooltip-content[_ngcontent-%COMP%] .context-item[_ngcontent-%COMP%]{display:flex}.tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] .left[_ngcontent-%COMP%]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] .right[_ngcontent-%COMP%]{text-align:right;white-space:nowrap}.tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] .column-layout[_ngcontent-%COMP%] .right[_ngcontent-%COMP%]{flex:1 1 auto;text-align:right}.tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] .column-layout[_ngcontent-%COMP%] .left[_ngcontent-%COMP%]{margin-right:8px}.tooltip-content[_ngcontent-%COMP%] .context[_ngcontent-%COMP%] .item-icon[_ngcontent-%COMP%]{margin-right:4px;width:6px;border-radius:50%;height:6px;background-color:rgb(var(--aui-color-n-10));display:inline-block;font-size:6px}"], changeDetection: 0 }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ChartTooltipComponent, [{ type: Component, args: [{ selector: 'g[aclTooltip]', changeDetection: ChangeDetectionStrategy.OnPush, template: "<svg:g\n [attr.opacity]=\"anchorOpacity\"\n *ngIf=\"!isBand\"\n>\n <svg:circle\n [attr.visibility]=\"\n contextService.disabledLegend.has(item.name) ? 'hidden' : ''\n \"\n *ngFor=\"let item of tooltipContext?.values\"\n r=\"2.5\"\n [attr.stroke]=\"item.color\"\n stroke-width=\"1\"\n fill=\"#fff\"\n [attr.cx]=\"anchorPos\"\n [attr.cy]=\"item.y ? (item.y | pure: contextService.y) || 0 : 1000\"\n ></svg:circle>\n</svg:g>\n\n<svg:rect\n stroke=\"#999\"\n [attr.x]=\"anchorPos\"\n [attr.visibility]=\"anchorVisibility\"\n [attr.y]=\"anchorY\"\n [attr.width]=\"0.5\"\n [attr.height]=\"anchorHeight\"\n #tooltip=\"auiTooltip\"\n [attr.opacity]=\"anchorOpacity\"\n [auiTooltip]=\"tooltipTemplate || defaultTooltipTemplate\"\n [auiTooltipContext]=\"{ context: tooltipContext }\"\n [auiTooltipDisabled]=\"anchorVisibility\"\n auiTooltipTrigger=\"manual\"\n [auiTooltipPosition]=\"typeStandard && isBand ? 'top' : 'start'\"\n auiTooltipClass=\"tooltipClass\"\n/>\n\n<ng-template\n #defaultTooltipTemplate\n let-context=\"context\"\n>\n <div class=\"tooltip-content\">\n <div class=\"title\">\n <ng-container\n [ngTemplateOutlet]=\"titleTemplate || defaultTitleTemplate\"\n [ngTemplateOutletContext]=\"{ context: context }\"\n ></ng-container>\n </div>\n <div class=\"context\">\n <ng-container\n [ngTemplateOutlet]=\"pointTemplate || defaultPointTemplate\"\n [ngTemplateOutletContext]=\"context | pure: mergePointContext\"\n ></ng-container>\n </div>\n </div>\n <div\n style=\"position: absolute; pointer-events: none; width: 100%; height: 100%\"\n ></div>\n</ng-template>\n\n<ng-template\n #defaultTitleTemplate\n let-context=\"context\"\n>\n {{\n titleTranslation\n ? (context?.title | translate)\n : (context?.title | pure: handleDateFormat : dateFormat)\n }}\n</ng-template>\n\n<ng-template\n #defaultPointTemplate\n let-context=\"context\"\n let-source=\"source\"\n>\n <ul\n class=\"context-list\"\n [class.column-layout]=\"columnLayout\"\n >\n <li\n class=\"context-item\"\n *ngFor=\"let item of context; trackBy: itemTrackBy\"\n [class.active]=\"item?.active\"\n >\n <div class=\"left\">\n <span\n class=\"item-icon\"\n [style.background]=\"item.color\"\n ></span>\n <span class=\"item-name\">\n <ng-container *ngIf=\"pointNameTemplate; else elseTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"pointNameTemplate\"\n [ngTemplateOutletContext]=\"{ context: item }\"\n ></ng-container>\n </ng-container>\n <ng-template #elseTemplate>\n {{ translation ? (item.name | translate) : item.name }}\n </ng-template>\n </span>\n </div>\n\n <div class=\"right\">\n <ng-container *ngIf=\"!columnLayout\">: </ng-container>\n <span\n class=\"item-prefix\"\n *ngIf=\"valuePrefix\"\n >{{ valuePrefix }}</span\n >\n <span class=\"item-value\">{{ item | pure: pointFormat }}</span>\n <span\n class=\"item-suffix\"\n *ngIf=\"valueSuffix\"\n >{{ valueSuffix | pure: tooltipSuffixFormat }}</span\n >\n </div>\n </li>\n </ul>\n</ng-template>\n", styles: ["::ng-deep .tooltipClass{pointer-events:none;max-width:800px!important}.tooltip-content{color:rgb(var(--aui-color-n-6))}.tooltip-content .title{margin-bottom:8px}.tooltip-content .context ul,.tooltip-content .context li{padding:0;margin:0;list-style:none}.tooltip-content .context ul:not(:last-child),.tooltip-content .context li:not(:last-child){margin-bottom:6px}.tooltip-content .context-list{display:flex;flex-direction:column}.tooltip-content .context-list .active{color:rgb(var(--aui-color-n-10))}.tooltip-content .context-item{display:flex}.tooltip-content .context .left{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tooltip-content .context .right{text-align:right;white-space:nowrap}.tooltip-content .context .column-layout .right{flex:1 1 auto;text-align:right}.tooltip-content .context .column-layout .left{margin-right:8px}.tooltip-content .context .item-icon{margin-right:4px;width:6px;border-radius:50%;height:6px;background-color:rgb(var(--aui-color-n-10));display:inline-block;font-size:6px}\n"] }] }], () => [{ type: i1.ContextChartService }, { type: i0.ChangeDetectorRef }], { dateFormat: [{ type: Input }], valuePrefix: [{ type: Input }], valueSuffix: [{ type: Input }], columnLayout: [{ type: Input }], tooltipTemplate: [{ type: Input }], pointTemplate: [{ type: Input }], pointNameTemplate: [{ type: Input }], pointTemplateContext: [{ type: Input }], titleTemplate: [{ type: Input }], autoSort: [{ type: Input }], translation: [{ type: Input }], titleTranslation: [{ type: Input }], pointFormat: [{ type: Input }], auiTooltipRef: [{ type: ViewChild, args: ['tooltip'] }] }); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ChartTooltipComponent, { className: "ChartTooltipComponent" }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY2hhcnQvY29tbW9uL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY2hhcnQvY29tbW9uL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxLQUFLLEVBR0wsV0FBVyxFQUVYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEtBQXFCLE1BQU0sT0FBTyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFhLE1BQU0sMEJBQTBCLENBQUM7QUFFdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUQsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixPQUFPLEVBQ1AsbUJBQW1CLEdBQ3BCLE1BQU0sYUFBYSxDQUFDOzs7Ozs7OztJQ3BCbkIsNEJBV2M7Ozs7Ozs7OztJQWZoQix5QkFHQztJQUNDLDBGQVdDO0lBQ0gsaUJBQVE7Ozs7SUFSYSxjQUF5QjtJQUF6Qiw2RkFBeUI7OztJQWdDMUMsQUFERiw4QkFBNkIsY0FDUjtJQUNqQiw0QkFHZ0I7SUFDbEIsaUJBQU07SUFDTiwrQkFBcUI7SUFDbkIsNEJBR2dCOztJQUVwQixBQURFLGlCQUFNLEVBQ0Y7SUFDTiwwQkFFTzs7Ozs7O0lBYkQsZUFBMEQ7SUFDMUQsQUFE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UUFBUTtrQkFBaEIsS0FBSztZQUVHLFdBQVc7a0JBQW5CLEtBQUs7WUFFRyxnQkFBZ0I7a0JBQXhCLEtBQUs7WUFFRyxXQUFXO2tCQUFuQixLQUFLO1lBRWdCLGFBQWE7a0JBQWxDLFNBQVM7bUJBQUMsU0FBUzs7a0ZBM0JULHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VUb29sdGlwIH0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBUZW1wbGF0ZVJlZixcbiAgVHJhY2tCeUZ1bmN0aW9uLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2NhbGVCYW5kIH0gZnJvbSAnZDMnO1xuaW1wb3J0IGRheWpzLCB7IENvbmZpZ1R5cGUgfSBmcm9tICdkYXlqcyc7XG5pbXBvcnQgeyBnZXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IERBVEVfVElNRV9GT1JNQVQsIFN0cmluZ01hcCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBDaGFydERhdGEsIENoYXJ0RGF0YUl0ZW0gfSBmcm9tICcuLi8uLi8uLi92aWV3LWNoYXJ0L3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgQ29udGV4dENoYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uL2NoYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgZmluZENsb3Nlc3RQb2ludEluZGV4LFxuICBnZXRYUG9zLFxuICB0b29sdGlwU3VmZml4Rm9ybWF0LFxufSBmcm9tICcuLi8uLi91dGlscyc7XG5cbnR5cGUgWFZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZTtcbmV4cG9ydCBpbnRlcmZhY2UgQ29udGV4dEl0ZW0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvbG9yOiBzdHJpbmc7XG4gIHg6IFhWYWx1ZTtcbiAgeTogbnVtYmVyO1xuICB1bml0Pzogc3RyaW5nO1xuICBhY3RpdmU/OiBib29sZWFuO1xufVxuaW50ZXJmYWNlIEN1cnJlbnRQb3NpdGlvbkl0ZW0ge1xuICB4MTogbnVtYmVyO1xuICB4MjogbnVtYmVyO1xuICBuYW1lPzogc3RyaW5nO1xuICBncm91cE5hbWU6IHN0cmluZztcbiAgaW5kZXg6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFRvb2x0aXBDb250ZXh0IHtcbiAgdGl0bGU6IFhWYWx1ZTtcbiAgc291cmNlOiBDaGFydERhdGFbXTtcbiAgdmFsdWVzOiBDb250ZXh0SXRlbVtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRGF0ZUZvcm1hdChkYXRlOiBDb25maWdUeXBlLCBmb3JtYXQgPSBEQVRFX1RJTUVfRk9STUFUKSB7XG4gIHJldHVybiBTdHJpbmcoZGF5anMoZGF0ZSkuaXNWYWxpZCgpID8gZGF5anMoZGF0ZSkuZm9ybWF0KGZvcm1hdCkgOiBkYXRlKTtcbn1cblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnZ1thY2xUb29sdGlwXScsXG4gIHRlbXBsYXRlVXJsOiAnLi90b29sdGlwLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdG9vbHRpcC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhcnRUb29sdGlwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBkYXRlRm9ybWF0ID0gREFURV9USU1FX0ZPUk1BVDtcblxuICBASW5wdXQoKSB2YWx1ZVByZWZpeDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHZhbHVlU3VmZml4OiBzdHJpbmc7XG5cbiAgQElucHV0KCkgY29sdW1uTGF5b3V0ID0gZmFsc2U7XG5cbiAgQElucHV0KCkgdG9vbHRpcFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBASW5wdXQoKSBwb2ludFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBASW5wdXQoKSBwb2ludE5hbWVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQElucHV0KCkgcG9pbnRUZW1wbGF0ZUNvbnRleHQ6IHVua25vd247XG5cbiAgQElucHV0KCkgdGl0bGVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQElucHV0KCkgYXV0b1NvcnQgPSBmYWxzZTtcblxuICBASW5wdXQoKSB0cmFuc2xhdGlvbiA9IHRydWU7XG5cbiAgQElucHV0KCkgdGl0bGVUcmFuc2xhdGlvbjogYm9vbGVhbjtcblxuICBASW5wdXQoKSBwb2ludEZvcm1hdDogKGQ6IENvbnRleHRJdGVtKSA9PiBzdHJpbmcgfCBudW1iZXIgPSBkID0+IGQueTtcblxuICBAVmlld0NoaWxkKCd0b29sdGlwJykgYXVpVG9vbHRpcFJlZjogQmFzZVRvb2x0aXA7XG5cbiAgdmlldzoge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gIH07XG5cbiAgZGVzdHJveSQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBhbmNob3JQb3MgPSAwO1xuICBhbmNob3JPcGFjaXR5ID0gMDtcbiAgYW5jaG9ySGVpZ2h0ID0gMDtcbiAgYW5jaG9yWSA9IDA7XG4gIGxhc3RBbmNob3JQb3M6IG51bWJlcjtcbiAgdG9vbHRpcENvbnRleHQ6IFRvb2x0aXBDb250ZXh0O1xuXG4gIGhhY2tlZCA9IGZhbHNlO1xuXG4gIGhhbmRsZURhdGVGb3JtYXQgPSBoYW5kbGVEYXRlRm9ybWF0O1xuXG4gIHRvb2x0aXBTdWZmaXhGb3JtYXQgPSB0b29sdGlwU3VmZml4Rm9ybWF0O1xuXG4gIGFjdGl2ZUxlZ2VuZDogc3RyaW5nO1xuXG4gIGdldCB0eXBlU3RhbmRhcmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dFNlcnZpY2UuYmFyT3B0aW9ucy50eXBlID09PSAnc3RhbmRhcmQnO1xuICB9XG5cbiAgZ2V0IGlzQmFuZCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0U2VydmljZS5iYXJPcHRpb25zLmlzQmFuZDtcbiAgfVxuXG4gIGdldCBhbmNob3JWaXNpYmlsaXR5KCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHRTZXJ2aWNlLmRpc2FibGVkTGVnZW5kLnNpemUgPT09XG4gICAgICAodGhpcy50eXBlU3RhbmRhcmRcbiAgICAgICAgPyB0aGlzLmNvbnRleHRTZXJ2aWNlLmlubmVyRG9tYWluLmxlbmd0aFxuICAgICAgICA6IHRoaXMuY29udGV4dFNlcnZpY2UuY2hhcnREYXRhPy5sZW5ndGgpXG4gICAgICA/ICdoaWR