This repository has been archived by the owner on Dec 10, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 271
/
ChartPlugin.ts
85 lines (73 loc) · 2.98 KB
/
ChartPlugin.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
import { isRequired, Plugin } from '@superset-ui/core';
import ChartMetadata from './ChartMetadata';
import ChartProps from './ChartProps';
import getChartMetadataRegistry from '../registries/ChartMetadataRegistrySingleton';
import getChartBuildQueryRegistry from '../registries/ChartBuildQueryRegistrySingleton';
import getChartComponentRegistry from '../registries/ChartComponentRegistrySingleton';
import getChartTransformPropsRegistry from '../registries/ChartTransformPropsRegistrySingleton';
import { ChartFormData } from '../types/ChartFormData';
import { QueryContext } from '../types/Query';
const IDENTITY = (x: any) => x;
type PromiseOrValue<T> = Promise<T> | T;
type PromiseOrValueLoader<T> = () => PromiseOrValue<T> | PromiseOrValue<{ default: T }>;
export type BuildQueryFunction<T extends ChartFormData> = (formData: T) => QueryContext;
export type TransformPropsFunction = (
chartProps: ChartProps,
) => {
[key: string]: any;
};
interface ChartPluginConfig<T extends ChartFormData> {
metadata: ChartMetadata;
// use buildQuery for immediate value
buildQuery?: BuildQueryFunction<T>;
// use loadBuildQuery for dynamic import (lazy-loading)
loadBuildQuery?: PromiseOrValueLoader<BuildQueryFunction<T>>;
// use transformProps for immediate value
transformProps?: TransformPropsFunction;
// use loadTransformProps for dynamic import (lazy-loading)
loadTransformProps?: PromiseOrValueLoader<TransformPropsFunction>;
// use Chart for immediate value
Chart?: Function;
// use loadChart for dynamic import (lazy-loading)
loadChart?: PromiseOrValueLoader<Function>;
}
export default class ChartPlugin<T extends ChartFormData = ChartFormData> extends Plugin {
metadata: ChartMetadata;
loadBuildQuery?: PromiseOrValueLoader<BuildQueryFunction<T>>;
loadTransformProps: PromiseOrValueLoader<TransformPropsFunction>;
loadChart: PromiseOrValueLoader<Function>;
constructor(config: ChartPluginConfig<T>) {
super();
const {
metadata,
buildQuery,
loadBuildQuery,
transformProps = IDENTITY,
loadTransformProps,
Chart,
loadChart,
} = config;
this.metadata = metadata;
this.loadBuildQuery = loadBuildQuery || (buildQuery ? () => buildQuery : undefined);
this.loadTransformProps = loadTransformProps || (() => transformProps);
if (loadChart) {
this.loadChart = loadChart;
} else if (Chart) {
this.loadChart = () => Chart;
} else {
throw new Error('Chart or loadChart is required');
}
}
register() {
const { key = isRequired('config.key') } = this.config;
getChartMetadataRegistry().registerValue(key, this.metadata);
getChartBuildQueryRegistry().registerLoader(key, this.loadBuildQuery);
getChartComponentRegistry().registerLoader(key, this.loadChart);
getChartTransformPropsRegistry().registerLoader(key, this.loadTransformProps);
return this;
}
configure(config: { [key: string]: any }, replace?: boolean) {
super.configure(config, replace);
return this;
}
}