From 3f68efb593553f9315b6c5f40500a2b80212971a Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Wed, 20 Mar 2019 15:23:54 -0700 Subject: [PATCH] feat: add encodeable utilities for chart (#15) * feat: add encodeable utilities * feat: add types back * refactor: simplify function calls * refactor: rename generic type * refactor: more edits * refactor: remove unused function * refactor: rename file * fix: address comments * fix: add vega back --- plugins/superset-ui-plugins/package.json | 9 +- .../superset-ui-preset-chart-xy/package.json | 12 ++- .../src/Line/Encoder.ts | 49 +++++++++ .../src/encodeable/AbstractEncoder.ts | 98 +++++++++++++++++ .../src/encodeable/ChannelEncoder.ts | 100 ++++++++++++++++++ .../src/encodeable/parsers/extractAxis.ts | 35 ++++++ .../src/encodeable/parsers/extractFormat.ts | 20 ++++ .../src/encodeable/parsers/extractGetter.ts | 13 +++ .../src/encodeable/parsers/extractScale.ts | 38 +++++++ .../src/encodeable/types/Axis.ts | 27 +++++ .../src/encodeable/types/Channel.ts | 5 + .../src/encodeable/types/Data.ts | 8 ++ .../src/encodeable/types/FieldDef.ts | 88 +++++++++++++++ .../src/encodeable/types/Legend.ts | 5 + .../src/encodeable/types/Scale.ts | 13 +++ .../src/encodeable/types/Specification.ts | 13 +++ .../src/encodeable/utils/identity.ts | 3 + .../src/encodeable/utils/isDisabled.ts | 11 ++ .../src/encodeable/utils/isEnabled.ts | 13 +++ 19 files changed, 556 insertions(+), 4 deletions(-) create mode 100644 plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/Encoder.ts create mode 100644 plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/AbstractEncoder.ts create mode 100644 plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/ChannelEncoder.ts create mode 100644 plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractAxis.ts create mode 100644 plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractFormat.ts create mode 100644 plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractGetter.ts create mode 100644 plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractScale.ts create mode 100644 plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Axis.ts create mode 100644 plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Channel.ts create mode 100644 plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Data.ts create mode 100644 plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/FieldDef.ts create mode 100644 plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Legend.ts create mode 100644 plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Scale.ts create mode 100644 plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Specification.ts create mode 100644 plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/identity.ts create mode 100644 plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/isDisabled.ts create mode 100644 plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/isEnabled.ts diff --git a/plugins/superset-ui-plugins/package.json b/plugins/superset-ui-plugins/package.json index 043138e857..ca1bb7cbe3 100644 --- a/plugins/superset-ui-plugins/package.json +++ b/plugins/superset-ui-plugins/package.json @@ -73,7 +73,14 @@ }, "prettier", "typescript" - ] + ], + "typescript": { + "compilerOptions": { + "typeRoots": [ + "../../node_modules/vega-lite/typings" + ] + } + } }, "workspaces": [ "./packages/*" diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/package.json b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/package.json index 77a32fc719..29b1ed7073 100644 --- a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/package.json +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/package.json @@ -29,21 +29,27 @@ "dependencies": { "@data-ui/theme": "^0.0.75", "@data-ui/xy-chart": "^0.0.76", + "@types/d3-scale": "^2.1.1", "@vx/axis": "^0.0.184", "@vx/group": "^0.0.183", "@vx/legend": "^0.0.183", "@vx/responsive": "^0.0.184", "@vx/scale": "^0.0.182", "@vx/shape": "^0.0.184", + "csstype": "^2.6.3", "d3-array": "^2.0.3", "d3-scale": "^2.2.2", - "prop-types": "^15.6.2" + "lodash": "^4.17.11", + "prop-types": "^15.6.2", + "reselect" : "^4.0.0", + "vega": "^5.2.0", + "vega-lite": "^3.0.0-rc15" }, "peerDependencies": { - "@superset-ui/chart": "^0.10.0", + "@superset-ui/chart": "^0.10.2", "@superset-ui/color": "^0.10.0", "@superset-ui/core": "^0.10.0", - "@superset-ui/dimension": "^0.10.0", + "@superset-ui/dimension": "^0.10.4", "@superset-ui/number-format": "^0.10.0", "@superset-ui/time-format": "^0.10.0", "@superset-ui/translation": "^0.10.0", diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/Encoder.ts b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/Encoder.ts new file mode 100644 index 0000000000..c0e99eeccb --- /dev/null +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/Encoder.ts @@ -0,0 +1,49 @@ +import { MarkPropChannelDef, XFieldDef, YFieldDef } from '../encodeable/types/FieldDef'; +import AbstractEncoder from '../encodeable/AbstractEncoder'; +import { PartialSpec } from '../encodeable/types/Specification'; + +/** + * Define output type for each channel + */ +export interface Outputs { + x: number | null; + y: number | null; + color: string; + fill: boolean; + strokeDasharray: string; +} + +/** + * Define encoding config for each channel + */ +export interface Encoding { + x: XFieldDef; + y: YFieldDef; + color: MarkPropChannelDef; + fill: MarkPropChannelDef; + strokeDasharray: MarkPropChannelDef; +} + +export default class Encoder extends AbstractEncoder { + static DEFAULT_ENCODINGS: Encoding = { + color: { value: '#222' }, + fill: { value: false }, + strokeDasharray: { value: '' }, + x: { field: 'x', type: 'quantitative' }, + y: { field: 'y', type: 'quantitative' }, + }; + + constructor(spec: PartialSpec) { + super(spec, Encoder.DEFAULT_ENCODINGS); + } + + createChannels() { + return { + color: this.createChannel('color'), + fill: this.createChannel('fill', { legend: false }), + strokeDasharray: this.createChannel('strokeDasharray'), + x: this.createChannel('x'), + y: this.createChannel('y'), + }; + } +} diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/AbstractEncoder.ts b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/AbstractEncoder.ts new file mode 100644 index 0000000000..6e041dfc79 --- /dev/null +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/AbstractEncoder.ts @@ -0,0 +1,98 @@ +import { Value } from 'vega-lite/build/src/fielddef'; +import ChannelEncoder from './ChannelEncoder'; +import { ChannelOptions } from './types/Channel'; +import { ChannelDef, isFieldDef } from './types/FieldDef'; +import { FullSpec, BaseOptions, PartialSpec } from './types/Specification'; + +export type ObjectWithKeysFromAndValueType = { [key in keyof T]: V }; + +export type ChannelOutputs = ObjectWithKeysFromAndValueType; + +export type BaseEncoding> = { + [key in keyof Output]: ChannelDef +}; + +export type Channels< + Outputs extends ChannelOutputs, + Encoding extends BaseEncoding +> = { readonly [k in keyof Outputs]: ChannelEncoder }; + +export default abstract class AbstractEncoder< + Outputs extends ChannelOutputs, + Encoding extends BaseEncoding, + Options extends BaseOptions = BaseOptions +> { + readonly spec: FullSpec; + readonly channels: Channels; + + readonly legends: { + [key: string]: (keyof Encoding)[]; + }; + + constructor(spec: PartialSpec, defaultEncoding?: Encoding) { + this.spec = this.createFullSpec(spec, defaultEncoding); + this.channels = this.createChannels(); + this.legends = {}; + + // Group the channels that use the same field together + // so they can share the same legend. + (Object.keys(this.channels) as (keyof Encoding)[]) + .map((key: keyof Encoding) => this.channels[key]) + .filter(c => c.hasLegend()) + .forEach(c => { + if (isFieldDef(c.definition)) { + const key = c.name as keyof Encoding; + const { field } = c.definition; + if (this.legends[field]) { + this.legends[field].push(key); + } else { + this.legends[field] = [key]; + } + } + }); + } + + /** + * subclass can override this + */ + protected createFullSpec(spec: PartialSpec, defaultEncoding?: Encoding) { + if (typeof defaultEncoding === 'undefined') { + return spec as FullSpec; + } + + const { encoding, ...rest } = spec; + + return { + ...rest, + encoding: { + ...defaultEncoding, + ...encoding, + }, + }; + } + + protected createChannel( + name: ChannelName, + options?: ChannelOptions, + ) { + const { encoding } = this.spec; + + return new ChannelEncoder( + `${name}`, + encoding[name], + { + ...this.spec.options, + ...options, + }, + ); + } + + /** + * subclass should override this + */ + protected abstract createChannels(): Channels; + + hasLegend() { + return Object.keys(this.legends).length > 0; + } +} diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/ChannelEncoder.ts b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/ChannelEncoder.ts new file mode 100644 index 0000000000..6e5d989042 --- /dev/null +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/ChannelEncoder.ts @@ -0,0 +1,100 @@ +import { Value } from 'vega-lite/build/src/fielddef'; +import { CategoricalColorScale } from '@superset-ui/color'; +import { ScaleOrdinal } from 'd3-scale'; +import { TimeFormatter } from '@superset-ui/time-format'; +import { NumberFormatter } from '@superset-ui/number-format'; +import { + ChannelDef, + Formatter, + isScaleFieldDef, + isMarkPropFieldDef, + isValueDef, +} from './types/FieldDef'; +import { PlainObject } from './types/Data'; +import extractScale from './parsers/extractScale'; +import extractGetter from './parsers/extractGetter'; +import extractFormat from './parsers/extractFormat'; +import extractAxis, { isXYChannel } from './parsers/extractAxis'; +import isEnabled from './utils/isEnabled'; +import isDisabled from './utils/isDisabled'; +import { ChannelOptions } from './types/Channel'; +import identity from './utils/identity'; + +export default class ChannelEncoder, Output extends Value = Value> { + readonly name: string; + readonly definition: Def; + readonly options: ChannelOptions; + + readonly axis?: PlainObject; + protected readonly getValue: (datum: PlainObject) => Value; + readonly scale?: ScaleOrdinal | CategoricalColorScale | ((x: any) => Output); + readonly formatter: Formatter; + + readonly encodeValue: (value: any) => Output; + readonly formatValue: (value: any) => string; + + constructor(name: string, definition: Def, options: ChannelOptions = {}) { + this.name = name; + this.definition = definition; + this.options = options; + + this.getValue = extractGetter(definition); + + const formatter = extractFormat(definition); + this.formatter = formatter; + if (formatter instanceof NumberFormatter) { + this.formatValue = (value: any) => formatter(value); + } else if (formatter instanceof TimeFormatter) { + this.formatValue = (value: any) => formatter(value); + } else { + this.formatValue = formatter; + } + + const scale = extractScale(definition, options.namespace); + this.scale = scale; + if (typeof scale === 'undefined') { + this.encodeValue = identity; + } else if (scale instanceof CategoricalColorScale) { + this.encodeValue = (value: any) => scale(`${value}`); + } else { + this.encodeValue = (value: any) => scale(value); + } + + this.axis = extractAxis(name, definition, this.formatter); + } + + get(datum: PlainObject, otherwise?: any) { + const value = this.getValue(datum); + + return otherwise !== undefined && (value === null || value === undefined) ? otherwise : value; + } + + encode(datum: PlainObject, otherwise?: Output) { + const output = this.encodeValue(this.get(datum)); + + return otherwise !== undefined && (output === null || output === undefined) + ? otherwise + : output; + } + + format(datum: PlainObject): string { + return this.formatValue(this.get(datum)); + } + + hasLegend() { + if (isDisabled(this.options.legend)) { + return false; + } + if (isXYChannel(this.name)) { + return false; + } + if (isValueDef(this.definition)) { + return false; + } + if (isMarkPropFieldDef(this.definition)) { + return isEnabled(this.definition.legend); + } + + return isScaleFieldDef(this.definition); + } +} diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractAxis.ts b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractAxis.ts new file mode 100644 index 0000000000..358871709d --- /dev/null +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractAxis.ts @@ -0,0 +1,35 @@ +import { cloneDeep } from 'lodash'; +import { Axis } from 'vega-lite/build/src/axis'; +import { ChannelDef, isPositionFieldDef, Formatter } from '../types/FieldDef'; +import extractFormat from './extractFormat'; +import { PlainObject } from '../types/Data'; + +export function isXYChannel(channelName: string) { + return channelName === 'x' || channelName === 'y'; +} + +function isAxis(axis: Axis | null | undefined | false): axis is Axis { + return axis !== false && axis !== null && axis !== undefined; +} + +export default function extractAxis( + channelName: string, + definition: ChannelDef, + defaultFormatter: Formatter, +) { + if (isXYChannel(channelName) && isPositionFieldDef(definition)) { + const { type, axis } = definition; + if (isAxis(axis)) { + const parsedAxis: PlainObject = cloneDeep(axis); + const { labels } = parsedAxis; + const { format } = labels; + parsedAxis.format = format + ? extractFormat({ field: definition.field, format: axis.format, type }) + : defaultFormatter; + + return parsedAxis; + } + } + + return undefined; +} diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractFormat.ts b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractFormat.ts new file mode 100644 index 0000000000..fedcc8e391 --- /dev/null +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractFormat.ts @@ -0,0 +1,20 @@ +import { getNumberFormatter } from '@superset-ui/number-format'; +import { getTimeFormatter } from '@superset-ui/time-format'; +import { isTypedFieldDef, ChannelDef } from '../types/FieldDef'; + +export default function extractFormat(definition: ChannelDef) { + if (isTypedFieldDef(definition)) { + const { type } = definition; + const format = + 'format' in definition && definition.format !== undefined ? definition.format : ''; + switch (type) { + case 'quantitative': + return getNumberFormatter(format); + case 'temporal': + return getTimeFormatter(format); + default: + } + } + + return (v: any) => `${v}`; +} diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractGetter.ts b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractGetter.ts new file mode 100644 index 0000000000..a439332761 --- /dev/null +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractGetter.ts @@ -0,0 +1,13 @@ +import { get } from 'lodash/fp'; +import { isValueDef, ChannelDef } from '../types/FieldDef'; +import identity from '../utils/identity'; + +export default function extractGetter(definition: ChannelDef) { + if (isValueDef(definition)) { + return () => definition.value; + } else if ('field' in definition && definition.field !== undefined) { + return get(definition.field); + } + + return identity; +} diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractScale.ts b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractScale.ts new file mode 100644 index 0000000000..8be76db4fa --- /dev/null +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractScale.ts @@ -0,0 +1,38 @@ +import { CategoricalColorNamespace } from '@superset-ui/color'; +import { scaleOrdinal } from 'd3-scale'; +import { Value } from 'vega-lite/build/src/fielddef'; +import isEnabled from '../utils/isEnabled'; +import { isScaleFieldDef, ChannelDef, isPositionFieldDef } from '../types/FieldDef'; + +export default function extractScale( + definition: ChannelDef, + namespace?: string, +) { + if (isScaleFieldDef(definition)) { + const { scale, type } = definition; + if (isEnabled(scale) && !isPositionFieldDef(definition)) { + if (scale) { + const { domain, range, scheme } = scale; + if (type === 'nominal') { + if (scheme) { + return CategoricalColorNamespace.getScale(scheme, namespace); + } + + const scaleFn = scaleOrdinal(); + if (domain) { + scaleFn.domain(domain); + } + if (range) { + scaleFn.range(range); + } + + return scaleFn; + } + } else if (type === 'nominal') { + return CategoricalColorNamespace.getScale(undefined, namespace); + } + } + } + + return undefined; +} diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Axis.ts b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Axis.ts new file mode 100644 index 0000000000..c64f1d0a6f --- /dev/null +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Axis.ts @@ -0,0 +1,27 @@ +interface Axis { + title: string; + tickCount: number; + format: string; +} + +export type XAxis = Axis & { + orient: 'top' | 'bottom'; + labelAngle: number; + labelOverlap: string; +}; + +export interface WithXAxis { + axis?: XAxis; +} + +export type YAxis = Axis & { + orient: 'left' | 'right'; +}; + +export interface WithYAxis { + axis?: YAxis; +} + +export interface WithAxis { + axis?: XAxis | YAxis; +} diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Channel.ts b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Channel.ts new file mode 100644 index 0000000000..8342892522 --- /dev/null +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Channel.ts @@ -0,0 +1,5 @@ +// eslint-disable-next-line import/prefer-default-export +export interface ChannelOptions { + namespace?: string; + legend?: boolean; +} diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Data.ts b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Data.ts new file mode 100644 index 0000000000..d2c32d524a --- /dev/null +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Data.ts @@ -0,0 +1,8 @@ +export type PlainObject = { + [key in Key]: Value +}; + +export type Dataset = { + keys: T[]; + values: Partial>[]; +}; diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/FieldDef.ts b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/FieldDef.ts new file mode 100644 index 0000000000..7cce9f7fa9 --- /dev/null +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/FieldDef.ts @@ -0,0 +1,88 @@ +// eslint-disable no-unused-vars +import { ValueDef, Value } from 'vega-lite/build/src/fielddef'; +import { Type } from 'vega-lite/build/src/type'; +import { TimeFormatter } from '@superset-ui/time-format'; +import { NumberFormatter } from '@superset-ui/number-format'; +import { WithScale } from './Scale'; +import { WithXAxis, WithYAxis, WithAxis } from './Axis'; +import { WithLegend } from './Legend'; + +export type Formatter = NumberFormatter | TimeFormatter | ((d: any) => string); + +// ValueDef is { value: xxx } + +export interface FieldDef { + field: string; + format?: string; +} + +export interface TypedFieldDef extends FieldDef { + type: Type; +} + +export type TextFieldDef = FieldDef; + +// PropFieldDef is { field: 'fieldName', scale: xxx } + +type ScaleFieldDef = TypedFieldDef & WithScale; + +export type MarkPropFieldDef = ScaleFieldDef & WithLegend; + +// PositionFieldDef is { field: 'fieldName', scale: xxx, axis: xxx } + +type PositionFieldDefBase = ScaleFieldDef; + +export type XFieldDef = PositionFieldDefBase & WithXAxis; + +export type YFieldDef = PositionFieldDefBase & WithYAxis; + +export type PositionFieldDef = ScaleFieldDef & WithAxis; + +export type MarkPropChannelDef = + | MarkPropFieldDef + | ValueDef; + +export type TextChannelDef = TextFieldDef | ValueDef; + +export type ChannelDef = + | XFieldDef + | YFieldDef + | MarkPropFieldDef + | TextFieldDef + | ValueDef; + +export function isValueDef( + channelDef: ChannelDef, +): channelDef is ValueDef { + return channelDef && 'value' in channelDef && !!channelDef.value; +} + +export function isFieldDef( + channelDef: ChannelDef, +): channelDef is FieldDef { + return channelDef && 'field' in channelDef && !!channelDef.field; +} + +export function isTypedFieldDef( + channelDef: ChannelDef, +): channelDef is TypedFieldDef { + return isFieldDef(channelDef) && 'type' in channelDef && !!channelDef.type; +} + +export function isScaleFieldDef( + channelDef: ChannelDef, +): channelDef is ScaleFieldDef { + return channelDef && ('scale' in channelDef || 'sort' in channelDef); +} + +export function isMarkPropFieldDef( + channelDef: ChannelDef, +): channelDef is MarkPropFieldDef { + return channelDef && 'legend' in channelDef; +} + +export function isPositionFieldDef( + channelDef: ChannelDef, +): channelDef is PositionFieldDef { + return channelDef && ('axis' in channelDef || 'stack' in channelDef || 'impute' in channelDef); +} diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Legend.ts b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Legend.ts new file mode 100644 index 0000000000..407a8b26e0 --- /dev/null +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Legend.ts @@ -0,0 +1,5 @@ +export type Legend = boolean | null; + +export interface WithLegend { + legend?: Legend; +} diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Scale.ts b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Scale.ts new file mode 100644 index 0000000000..466ce07af7 --- /dev/null +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Scale.ts @@ -0,0 +1,13 @@ +import { ScaleType } from 'vega-lite/build/src/scale'; +import { Value } from 'vega-lite/build/src/fielddef'; + +export interface Scale { + type?: ScaleType; + domain?: any[]; + range?: Output[]; + scheme?: string; +} + +export interface WithScale { + scale?: Scale; +} diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Specification.ts b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Specification.ts new file mode 100644 index 0000000000..7631de62ee --- /dev/null +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Specification.ts @@ -0,0 +1,13 @@ +export interface BaseOptions { + namespace?: string; +} + +export interface PartialSpec { + encoding: Partial; + options?: Options; +} + +export interface FullSpec { + encoding: Encoding; + options?: Options; +} diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/identity.ts b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/identity.ts new file mode 100644 index 0000000000..6ba7d59300 --- /dev/null +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/identity.ts @@ -0,0 +1,3 @@ +const identity = (x: any) => x; + +export default identity; diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/isDisabled.ts b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/isDisabled.ts new file mode 100644 index 0000000000..d5b87caf8f --- /dev/null +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/isDisabled.ts @@ -0,0 +1,11 @@ +export default function isDisabled( + config: + | { + [key: string]: any; + } + | boolean + | null + | undefined, +) { + return config === false || config === null; +} diff --git a/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/isEnabled.ts b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/isEnabled.ts new file mode 100644 index 0000000000..0397ed22a5 --- /dev/null +++ b/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/isEnabled.ts @@ -0,0 +1,13 @@ +import isDisabled from './isDisabled'; + +export default function isEnabled( + config: + | { + [key: string]: any; + } + | boolean + | null + | undefined, +) { + return !isDisabled(config); +}