-
-
Notifications
You must be signed in to change notification settings - Fork 22
/
ViolinController.ts
113 lines (103 loc) · 3.56 KB
/
ViolinController.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import {
Chart,
BarController,
ChartItem,
ControllerDatasetOptions,
ScriptableAndArrayOptions,
CommonHoverOptions,
ChartConfiguration,
LinearScale,
CategoryScale,
AnimationOptions,
ScriptableContext,
CartesianScaleTypeRegistry,
} from 'chart.js';
import { merge } from 'chart.js/helpers';
import { asViolinStats, IViolin, IViolinOptions } from '../data';
import { StatsBase, baseDefaults, defaultOverrides } from './StatsBase';
import { baseOptionKeys } from '../elements/base';
import { IViolinElementOptions, Violin } from '../elements';
import { interpolateKdeCoords } from '../animation';
import patchController from './patchController';
export class ViolinController extends StatsBase<IViolin, Required<IViolinOptions>> {
/**
* @hidden
*/
// eslint-disable-next-line class-methods-use-this,@typescript-eslint/explicit-module-boundary-types
protected _parseStats(value: any, config: IViolinOptions): IViolin | undefined {
return asViolinStats(value, config);
}
/**
* @hidden
*/
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
protected _transformStats<T>(target: any, source: IViolin, mapper: (v: number) => T): void {
super._transformStats(target, source, mapper);
// eslint-disable-next-line no-param-reassign
target.maxEstimate = source.maxEstimate;
if (Array.isArray(source.coords)) {
// eslint-disable-next-line no-param-reassign
target.coords = source.coords.map((c) => ({ ...c, v: mapper(c.v) }));
}
}
static readonly id = 'violin';
/**
* @hidden
*/
static readonly defaults: any = /* #__PURE__ */ merge({}, [
BarController.defaults,
baseDefaults(baseOptionKeys),
{
points: 100,
animations: {
numbers: {
type: 'number',
properties: (BarController.defaults as any).animations.numbers.properties.concat(
['q1', 'q3', 'min', 'max', 'median', 'maxEstimate'],
baseOptionKeys.filter((c) => !c.endsWith('Color'))
),
},
kdeCoords: {
fn: interpolateKdeCoords,
properties: ['coords'],
},
},
dataElementType: Violin.id,
},
]);
/**
* @hidden
*/
static readonly overrides: any = /* #__PURE__ */ merge({}, [(BarController as any).overrides, defaultOverrides()]);
}
export type ViolinDataPoint = number[] | (Partial<IViolin> & Pick<IViolin, 'median' | 'coords'>);
export interface ViolinControllerDatasetOptions
extends ControllerDatasetOptions,
IViolinOptions,
ScriptableAndArrayOptions<IViolinElementOptions, ScriptableContext<'violin'>>,
ScriptableAndArrayOptions<CommonHoverOptions, ScriptableContext<'violin'>>,
AnimationOptions<'violin'> {}
// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface IViolinChartOptions extends IViolinOptions {}
declare module 'chart.js' {
export interface ChartTypeRegistry {
violin: {
chartOptions: IViolinChartOptions;
datasetOptions: ViolinControllerDatasetOptions;
defaultDataPoint: ViolinDataPoint;
scales: keyof CartesianScaleTypeRegistry;
metaExtensions: {};
parsedDataType: IViolin & ChartTypeRegistry['bar']['parsedDataType'];
};
}
}
export class ViolinChart<DATA extends unknown[] = ViolinDataPoint[], LABEL = string> extends Chart<
'violin',
DATA,
LABEL
> {
static id = ViolinController.id;
constructor(item: ChartItem, config: Omit<ChartConfiguration<'violin', DATA, LABEL>, 'type'>) {
super(item, patchController('violin', config, ViolinController, Violin, [LinearScale, CategoryScale]));
}
}