UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

519 lines 69.7 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"; import * as i2 from "@angular/common"; import * as i3 from "../../../effect-directive/e2e-attribute-binding.directive"; import * as i4 from "@alauda/ui"; import * as i5 from "../../../core/pipes/pure.pipe"; import * as i6 from "../../../translate/translate.pipe"; 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); } }, dependencies: [i2.NgForOf, i2.NgIf, i2.NgTemplateOutlet, i3.E2eAttributeBindingDirective, i4.TooltipDirective, i5.PurePipe, i6.TranslatePipe], 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY2hhcnQvY29tbW9uL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY2hhcnQvY29tbW9uL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxLQUFLLEVBR0wsV0FBVyxFQUVYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEtBQXFCLE1BQU0sT0FBTyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFhLE1BQU0sMEJBQTBCLENBQUM7QUFFdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUQsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixPQUFPLEVBQ1AsbUJBQW1CLEdBQ3BCLE1BQU0sYUFBYSxDQUFDOzs7Ozs7Ozs7Ozs7O0lDcEJuQiw0QkFXYzs7Ozs7Ozs7O0lBZmhCLHlCQUdDO0lBQ0MsMEZBV0M7SUFDSCxpQkFBUTs7OztJQVJhLGNBQXlCO0lBQXpCLDZGQUF5Qjs7O0lBZ0MxQyxBQURGLDhCQUE2QixjQUNSO0lBQ2pCLDRCQUdnQjtJQUNsQixpQkFBTTtJQUNOLCtCQUFxQjtJQUNuQiw0QkFHZ0I7O0lBRXBCLEFBREUsaUJBQU0sRUFDRjtJQUNOLDBCQUVPOzs7Ozs7SUFiRCxlQUEwRDtJQUMx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WUFFRyxRQUFRO2tCQUFoQixLQUFLO1lBRUcsV0FBVztrQkFBbkIsS0FBSztZQUVHLGdCQUFnQjtrQkFBeEIsS0FBSztZQUVHLFdBQVc7a0JBQW5CLEtBQUs7WUFFZ0IsYUFBYTtrQkFBbEMsU0FBUzttQkFBQyxTQUFTOztrRkEzQlQscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZVRvb2x0aXAgfSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFRlbXBsYXRlUmVmLFxuICBUcmFja0J5RnVuY3Rpb24sXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTY2FsZUJhbmQgfSBmcm9tICdkMyc7XG5pbXBvcnQgZGF5anMsIHsgQ29uZmlnVHlwZSB9IGZyb20gJ2RheWpzJztcbmltcG9ydCB7IGdldCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgREFURV9USU1FX0ZPUk1BVCwgU3RyaW5nTWFwIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IENoYXJ0RGF0YSwgQ2hhcnREYXRhSXRlbSB9IGZyb20gJy4uLy4uLy4uL3ZpZXctY2hhcnQvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBDb250ZXh0Q2hhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY2hhcnQuc2VydmljZSc7XG5pbXBvcnQge1xuICBmaW5kQ2xvc2VzdFBvaW50SW5kZXgsXG4gIGdldFhQb3MsXG4gIHRvb2x0aXBTdWZmaXhGb3JtYXQsXG59IGZyb20gJy4uLy4uL3V0aWxzJztcblxudHlwZSBYVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBEYXRlO1xuZXhwb3J0IGludGVyZmFjZSBDb250ZXh0SXRlbSB7XG4gIG5hbWU6IHN0cmluZztcbiAgY29sb3I6IHN0cmluZztcbiAgeDogWFZhbHVlO1xuICB5OiBudW1iZXI7XG4gIHVuaXQ/OiBzdHJpbmc7XG4gIGFjdGl2ZT86IGJvb2xlYW47XG59XG5pbnRlcmZhY2UgQ3VycmVudFBvc2l0aW9uSXRlbSB7XG4gIHgxOiBudW1iZXI7XG4gIHgyOiBudW1iZXI7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGdyb3VwTmFtZTogc3RyaW5nO1xuICBpbmRleDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVG9vbHRpcENvbnRleHQge1xuICB0aXRsZTogWFZhbHVlO1xuICBzb3VyY2U6IENoYXJ0RGF0YVtdO1xuICB2YWx1ZXM6IENvbnRleHRJdGVtW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVEYXRlRm9ybWF0KGRhdGU6IENvbmZpZ1R5cGUsIGZvcm1hdCA9IERBVEVfVElNRV9GT1JNQVQpIHtcbiAgcmV0dXJuIFN0cmluZyhkYXlqcyhkYXRlKS5pc1ZhbGlkKCkgPyBkYXlqcyhkYXRlKS5mb3JtYXQoZm9ybWF0KSA6IGRhdGUpO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdnW2FjbFRvb2x0aXBdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rvb2x0aXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90b29sdGlwLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydFRvb2x0aXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGRhdGVGb3JtYXQgPSBEQVRFX1RJTUVfRk9STUFUO1xuXG4gIEBJbnB1dCgpIHZhbHVlUHJlZml4OiBzdHJpbmc7XG5cbiAgQElucHV0KCkgdmFsdWVTdWZmaXg6IHN0cmluZztcblxuICBASW5wdXQoKSBjb2x1bW5MYXlvdXQgPSBmYWxzZTtcblxuICBASW5wdXQoKSB0b29sdGlwVGVtcGxhdGU6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBJbnB1dCgpIHBvaW50VGVtcGxhdGU6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBJbnB1dCgpIHBvaW50TmFtZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBASW5wdXQoKSBwb2ludFRlbXBsYXRlQ29udGV4dDogdW5rbm93bjtcblxuICBASW5wdXQoKSB0aXRsZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBASW5wdXQoKSBhdXRvU29ydCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uID0gdHJ1ZTtcblxuICBASW5wdXQoKSB0aXRsZVRyYW5zbGF0aW9uOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpIHBvaW50Rm9ybWF0OiAoZDogQ29udGV4dEl0ZW0pID0+IHN0cmluZyB8IG51bWJlciA9IGQgPT4gZC55O1xuXG4gIEBWaWV3Q2hpbGQoJ3Rvb2x0aXAnKSBhdWlUb29sdGlwUmVmOiBCYXNlVG9vbHRpcDtcblxuICB2aWV3OiB7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgfTtcblxuICBkZXN0cm95JCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGFuY2hvclBvcyA9IDA7XG4gIGFuY2hvck9wYWNpdHkgPSAwO1xuICBhbmNob3JIZWlnaHQgPSAwO1xuICBhbmNob3JZID0gMDtcbiAgbGFzdEFuY2hvclBvczogbnVtYmVyO1xuICB0b29sdGlwQ29udGV4dDogVG9vbHRpcENvbnRleHQ7XG5cbiAgaGFja2VkID0gZmFsc2U7XG5cbiAgaGFuZGxlRGF0ZUZvcm1hdCA9IGhhbmRsZURhdGVGb3JtYXQ7XG5cbiAgdG9vbHRpcFN1ZmZpeEZvcm1hdCA9IHRvb2x0aXBTdWZmaXhGb3JtYXQ7XG5cbiAgYWN0aXZlTGVnZW5kOiBzdHJpbmc7XG5cbiAgZ2V0IHR5cGVTdGFuZGFyZCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0U2VydmljZS5iYXJPcHRpb25zLnR5cGUgPT09ICdzdGFuZGFy