UNPKG

@mcdevsl/superset-ui

Version:
194 lines (170 loc) 5.32 kB
/** Type checking is disabled for this file due to reselect only supporting * TS declarations for selectors with up to 12 arguments. */ // @ts-nocheck import { createSelector } from 'reselect'; import { AppSection, Behavior, convertKeysToCamelCase, Datasource, FilterState, JsonObject, } from '../..'; import { HandlerFunction, PlainObject, SetDataMaskHook } from '../types/Base'; import { QueryData, DataRecordFilters } from '..'; // TODO: more specific typing for these fields of ChartProps type AnnotationData = PlainObject; type SnakeCaseDatasource = PlainObject; type CamelCaseFormData = PlainObject; type SnakeCaseFormData = PlainObject; type RawFormData = CamelCaseFormData | SnakeCaseFormData; type ChartPropsSelector = (c: ChartPropsConfig) => ChartProps; /** Optional field for event handlers, renderers */ type Hooks = { /** * sync active filters between chart and dashboard, "add" actually * also handles "change" and "remove". */ onAddFilter?: (newFilters: DataRecordFilters, merge?: boolean) => void; /** handle errors */ onError?: HandlerFunction; /** use the vis as control to update state */ setControlValue?: HandlerFunction; /** handle external filters */ setDataMask?: SetDataMaskHook; /** handle tooltip */ setTooltip?: HandlerFunction; } & PlainObject; /** * Preferred format for ChartProps config */ export interface ChartPropsConfig { annotationData?: AnnotationData; /** Datasource metadata */ datasource?: SnakeCaseDatasource; /** * Formerly called "filters", which was misleading because it is actually * initial values of the filter_box and table vis */ initialValues?: DataRecordFilters; /** Main configuration of the chart */ formData?: RawFormData; /** Chart height */ height?: number; /** Programmatic overrides such as event handlers, renderers */ hooks?: Hooks; /** The data returned for all queries objects in the request */ queriesData?: QueryData[]; /** Chart width */ width?: number; /** Own chart state that saved in dashboard */ ownState?: JsonObject; /** Filter state that saved in dashboard */ filterState?: FilterState; /** Set of actual behaviors that this instance of chart should use */ behaviors?: Behavior[]; /** Application section of the chart on the screen (in what components/screen it placed) */ appSection?: AppSection; /** is the chart refreshing its contents */ isRefreshing?: boolean; } const DEFAULT_WIDTH = 800; const DEFAULT_HEIGHT = 600; export default class ChartProps<FormData extends RawFormData = RawFormData> { static createSelector: () => ChartPropsSelector; annotationData: AnnotationData; datasource: Datasource; rawDatasource: SnakeCaseDatasource; initialValues: DataRecordFilters; formData: CamelCaseFormData; rawFormData: FormData; height: number; hooks: Hooks; ownState: JsonObject; filterState: FilterState; queriesData: QueryData[]; width: number; behaviors: Behavior[]; appSection?: AppSection; isRefreshing?: boolean; constructor(config: ChartPropsConfig & { formData?: FormData } = {}) { const { annotationData = {}, datasource = {}, formData = {} as FormData, hooks = {}, ownState = {}, filterState = {}, initialValues = {}, queriesData = [], behaviors = [], width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT, appSection, isRefreshing, } = config; this.width = width; this.height = height; this.annotationData = annotationData; this.datasource = convertKeysToCamelCase(datasource) as Datasource; this.rawDatasource = datasource; this.formData = convertKeysToCamelCase(formData); this.rawFormData = formData; this.hooks = hooks; this.initialValues = initialValues; this.queriesData = queriesData; this.ownState = ownState; this.filterState = filterState; this.behaviors = behaviors; this.appSection = appSection; this.isRefreshing = isRefreshing; } } // eslint-disable-next-line func-name-matching ChartProps.createSelector = function create(): ChartPropsSelector { return createSelector( (input: ChartPropsConfig) => input.annotationData, input => input.datasource, input => input.formData, input => input.height, input => input.hooks, input => input.initialValues, input => input.queriesData, input => input.width, input => input.ownState, input => input.filterState, input => input.behaviors, input => input.appSection, input => input.isRefreshing, ( annotationData, datasource, formData, height, hooks, initialValues, queriesData, width, ownState, filterState, behaviors, appSection, isRefreshing, ) => new ChartProps({ annotationData, datasource, formData, height, hooks, initialValues, queriesData, ownState, filterState, width, behaviors, appSection, isRefreshing, }), ); };