diff --git a/packages/superset-ui-encodeable/package.json b/packages/superset-ui-encodeable/package.json index 8e3e226b43..6be1193bb0 100644 --- a/packages/superset-ui-encodeable/package.json +++ b/packages/superset-ui-encodeable/package.json @@ -26,7 +26,8 @@ "private": true, "dependencies": { "vega": "^5.4.0", - "vega-lite": "^3.4.0" + "vega-lite": "^3.4.0", + "lodash": "^4.17.15" }, "peerDependencies": { "@superset-ui/time-format": "^0.11.14", diff --git a/packages/superset-ui-encodeable/src/parsers/createFormatterFromChannelDef.ts b/packages/superset-ui-encodeable/src/parsers/createFormatterFromChannelDef.ts index cf002cc3d4..78d0005abc 100644 --- a/packages/superset-ui-encodeable/src/parsers/createFormatterFromChannelDef.ts +++ b/packages/superset-ui-encodeable/src/parsers/createFormatterFromChannelDef.ts @@ -2,9 +2,8 @@ import { ChannelDef } from '../types/ChannelDef'; import { isTypedFieldDef } from '../typeGuards/ChannelDef'; import fallbackFormatter from './fallbackFormatter'; import createFormatterFromFieldTypeAndFormat from './createFormatterFromFieldTypeAndFormat'; -import { Value } from '../types/VegaLite'; -export default function createFormatterFromChannelDef(definition: ChannelDef) { +export default function createFormatterFromChannelDef(definition: ChannelDef) { if (isTypedFieldDef(definition)) { const { type, format = '' } = definition; diff --git a/packages/superset-ui-encodeable/src/parsers/createGetterFromChannelDef.ts b/packages/superset-ui-encodeable/src/parsers/createGetterFromChannelDef.ts new file mode 100644 index 0000000000..7c76066ca0 --- /dev/null +++ b/packages/superset-ui-encodeable/src/parsers/createGetterFromChannelDef.ts @@ -0,0 +1,14 @@ +import { get } from 'lodash/fp'; +import identity from '../utils/identity'; +import { ChannelDef } from '../types/ChannelDef'; +import { isValueDef } from '../typeGuards/ChannelDef'; + +export default function createGetterFromChannelDef(definition: ChannelDef): (x?: any) => any { + if (isValueDef(definition)) { + return () => definition.value; + } else if (typeof definition.field !== 'undefined') { + return get(definition.field); + } + + return identity; +} diff --git a/packages/superset-ui-encodeable/test/parsers/createGetterFromChannelDef.test.ts b/packages/superset-ui-encodeable/test/parsers/createGetterFromChannelDef.test.ts new file mode 100644 index 0000000000..468deae693 --- /dev/null +++ b/packages/superset-ui-encodeable/test/parsers/createGetterFromChannelDef.test.ts @@ -0,0 +1,21 @@ +import createGetterFromChannelDef from '../../src/parsers/createGetterFromChannelDef'; + +describe('createGetterFromChannelDef(definition)', () => { + it('handles ValueDef', () => { + const getter = createGetterFromChannelDef({ value: 1 }); + expect(getter()).toBe(1); + }); + it('handleFieldDef', () => { + const getter = createGetterFromChannelDef({ field: 'cost' }); + expect(getter({ cost: 10 })).toBe(10); + }); + it('handleFieldDef with nested field', () => { + const getter = createGetterFromChannelDef({ field: 'fuel.cost' }); + expect(getter({ fuel: { cost: 10 } })).toBe(10); + }); + it('otherwise return identity', () => { + // @ts-ignore + const getter = createGetterFromChannelDef({}); + expect(getter(300)).toBe(300); + }); +});