@alauda-fe/common
Version:
Alauda frontend team common codes.
514 lines • 69.3 kB
JavaScript
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