Feature/refactor animation configuration (#1337)
* Refactor animation configuration * Update changelog
This commit is contained in:
parent
44dfd2bd48
commit
8f3a9bdfbb
@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## Unreleased
|
||||
|
||||
### Added
|
||||
|
||||
- Supported a progressive line animation in the line chart component
|
||||
|
||||
### Changed
|
||||
|
||||
- Moved the benchmark comparator from experimental to general availability
|
||||
|
@ -2,6 +2,7 @@
|
||||
<gf-line-chart
|
||||
class="mb-4"
|
||||
[historicalDataItems]="historicalDataItems"
|
||||
[isAnimated]="true"
|
||||
[locale]="locale"
|
||||
[showXAxis]="true"
|
||||
[showYAxis]="true"
|
||||
|
@ -11,6 +11,7 @@
|
||||
yMax="100"
|
||||
yMin="0"
|
||||
[historicalDataItems]="historicalData"
|
||||
[isAnimated]="true"
|
||||
[locale]="user?.settings?.locale"
|
||||
[showXAxis]="true"
|
||||
[showYAxis]="true"
|
||||
|
@ -18,6 +18,7 @@
|
||||
unit="%"
|
||||
[historicalDataItems]="historicalDataItems"
|
||||
[hidden]="historicalDataItems?.length === 0"
|
||||
[isAnimated]="user?.settings?.dateRange === '1d' ? false : true"
|
||||
[locale]="user?.settings?.locale"
|
||||
[ngClass]="{ 'pr-3': deviceType === 'mobile' }"
|
||||
[showGradient]="true"
|
||||
|
@ -25,6 +25,7 @@
|
||||
[benchmarkDataItems]="benchmarkDataItems"
|
||||
[currency]="SymbolProfile?.currency"
|
||||
[historicalDataItems]="historicalDataItems"
|
||||
[isAnimated]="true"
|
||||
[locale]="data.locale"
|
||||
[showGradient]="true"
|
||||
[showXAxis]="true"
|
||||
|
@ -230,5 +230,6 @@ Simple.args = {
|
||||
date: '2021-03-18',
|
||||
value: 86666.03082624623
|
||||
}
|
||||
]
|
||||
],
|
||||
isAnimated: true
|
||||
};
|
||||
|
@ -48,7 +48,7 @@ export class LineChartComponent implements AfterViewInit, OnChanges, OnDestroy {
|
||||
@Input() benchmarkLabel = '';
|
||||
@Input() currency: string;
|
||||
@Input() historicalDataItems: LineChartItem[];
|
||||
@Input() isAnimated = true;
|
||||
@Input() isAnimated = false;
|
||||
@Input() locale: string;
|
||||
@Input() showGradient = false;
|
||||
@Input() showLegend = false;
|
||||
@ -67,6 +67,8 @@ export class LineChartComponent implements AfterViewInit, OnChanges, OnDestroy {
|
||||
public chart: Chart;
|
||||
public isLoading = true;
|
||||
|
||||
private readonly ANIMATION_DURATION = 1200;
|
||||
|
||||
public constructor(private changeDetectorRef: ChangeDetectorRef) {
|
||||
Chart.register(
|
||||
Filler,
|
||||
@ -115,7 +117,7 @@ export class LineChartComponent implements AfterViewInit, OnChanges, OnDestroy {
|
||||
private initialize() {
|
||||
this.isLoading = true;
|
||||
const benchmarkPrices = [];
|
||||
const labels = [];
|
||||
const labels: string[] = [];
|
||||
const marketPrices = [];
|
||||
|
||||
this.historicalDataItems?.forEach((historicalDataItem, index) => {
|
||||
@ -164,51 +166,29 @@ export class LineChartComponent implements AfterViewInit, OnChanges, OnDestroy {
|
||||
]
|
||||
};
|
||||
|
||||
const animationDuration = 1000;
|
||||
|
||||
const delayBetweenPoints = animationDuration / labels.length;
|
||||
const animation = {
|
||||
x: {
|
||||
type: 'number',
|
||||
easing: 'linear',
|
||||
duration: delayBetweenPoints,
|
||||
from: NaN,
|
||||
delay(ctx) {
|
||||
if (ctx.type !== 'data' || ctx.xStarted) {
|
||||
return 0;
|
||||
}
|
||||
ctx.xStarted = true;
|
||||
return ctx.index * delayBetweenPoints;
|
||||
}
|
||||
},
|
||||
y: {
|
||||
type: 'number',
|
||||
easing: 'linear',
|
||||
duration: delayBetweenPoints,
|
||||
from: 0,
|
||||
delay(ctx) {
|
||||
if (ctx.type !== 'data' || ctx.yStarted) {
|
||||
return 0;
|
||||
}
|
||||
ctx.yStarted = true;
|
||||
return ctx.index * delayBetweenPoints;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if (this.chartCanvas) {
|
||||
if (this.chart) {
|
||||
this.chart.data = data;
|
||||
this.chart.options.plugins.tooltip = <unknown>(
|
||||
this.getTooltipPluginConfiguration()
|
||||
);
|
||||
this.chart.options.animation = this.isAnimated && <unknown>animation;
|
||||
this.chart.options.animation =
|
||||
this.isAnimated &&
|
||||
<unknown>{
|
||||
x: this.getAnimationConfigurationForAxis({ labels, axis: 'x' }),
|
||||
y: this.getAnimationConfigurationForAxis({ labels, axis: 'y' })
|
||||
};
|
||||
this.chart.update();
|
||||
} else {
|
||||
this.chart = new Chart(this.chartCanvas.nativeElement, {
|
||||
data,
|
||||
options: {
|
||||
animation: this.isAnimated && <unknown>animation,
|
||||
animation:
|
||||
this.isAnimated &&
|
||||
<unknown>{
|
||||
x: this.getAnimationConfigurationForAxis({ labels, axis: 'x' }),
|
||||
y: this.getAnimationConfigurationForAxis({ labels, axis: 'y' })
|
||||
},
|
||||
aspectRatio: 16 / 9,
|
||||
elements: {
|
||||
point: {
|
||||
@ -291,6 +271,31 @@ export class LineChartComponent implements AfterViewInit, OnChanges, OnDestroy {
|
||||
this.isLoading = false;
|
||||
}
|
||||
|
||||
private getAnimationConfigurationForAxis({
|
||||
axis,
|
||||
labels
|
||||
}: {
|
||||
axis: 'x' | 'y';
|
||||
labels: string[];
|
||||
}) {
|
||||
const delayBetweenPoints = this.ANIMATION_DURATION / labels.length;
|
||||
|
||||
return {
|
||||
delay(context) {
|
||||
if (context.type !== 'data' || context[`${axis}Started`]) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
context[`${axis}Started`] = true;
|
||||
return context.index * delayBetweenPoints;
|
||||
},
|
||||
duration: delayBetweenPoints,
|
||||
easing: 'linear',
|
||||
from: NaN,
|
||||
type: 'number'
|
||||
};
|
||||
}
|
||||
|
||||
private getTooltipPluginConfiguration() {
|
||||
return {
|
||||
...getTooltipOptions({
|
||||
|
Loading…
x
Reference in New Issue
Block a user