diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-core/test/models/ExtensibleFunction.test.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-core/test/models/ExtensibleFunction.test.ts index c7e43d112259..c2c28fdda1a1 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-core/test/models/ExtensibleFunction.test.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-core/test/models/ExtensibleFunction.test.ts @@ -1,11 +1,20 @@ import { ExtensibleFunction } from '../../src'; describe('ExtensibleFunction', () => { + interface Func1 { + (): number; + } + class Func1 extends ExtensibleFunction { constructor(x: unknown) { super(() => x); // closure } } + + interface Func2 { + (): number; + } + class Func2 extends ExtensibleFunction { x: unknown; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-number-format/src/NumberFormatter.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-number-format/src/NumberFormatter.ts index 4dd6854e153e..2ceb5401cea5 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-number-format/src/NumberFormatter.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-number-format/src/NumberFormatter.ts @@ -11,7 +11,13 @@ export interface NumberFormatterConfig { isInvalid?: boolean; } -export default class NumberFormatter extends ExtensibleFunction { +// Use type augmentation to indicate that +// an instance of NumberFormatter is also a function +interface NumberFormatter { + (value: number | null | undefined): string; +} + +class NumberFormatter extends ExtensibleFunction { id: string; label: string; @@ -57,3 +63,5 @@ export default class NumberFormatter extends ExtensibleFunction { return `${value} => ${this.format(value)}`; } } + +export default NumberFormatter; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-time-format/src/TimeFormatter.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-time-format/src/TimeFormatter.ts index 84fa191469c2..0896ea05ad40 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-time-format/src/TimeFormatter.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-time-format/src/TimeFormatter.ts @@ -3,7 +3,13 @@ import { TimeFormatFunction } from './types'; export const PREVIEW_TIME = new Date(Date.UTC(2017, 1, 14, 11, 22, 33)); -export default class TimeFormatter extends ExtensibleFunction { +// Use type augmentation to indicate that +// an instance of TimeFormatter is also a function +interface TimeFormatter { + (value: Date | number | null | undefined): string; +} + +class TimeFormatter extends ExtensibleFunction { id: string; label: string; @@ -21,7 +27,7 @@ export default class TimeFormatter extends ExtensibleFunction { formatFunc: TimeFormatFunction; useLocalTime?: boolean; }) { - super((value: Date | null | undefined) => this.format(value)); + super((value: Date | number | null | undefined) => this.format(value)); const { id = isRequired('config.id'), @@ -38,15 +44,17 @@ export default class TimeFormatter extends ExtensibleFunction { this.useLocalTime = useLocalTime; } - format(value: Date | null | undefined) { + format(value: Date | number | null | undefined) { if (value === null || value === undefined) { return `${value}`; } - return this.formatFunc(value); + return this.formatFunc(value instanceof Date ? value : new Date(value)); } preview(value: Date = PREVIEW_TIME) { return `${value.toUTCString()} => ${this.format(value)}`; } } + +export default TimeFormatter; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-time-format/test/TimeFormatter.test.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-time-format/test/TimeFormatter.test.ts index 31a6826c5365..282578b6a9f2 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-time-format/test/TimeFormatter.test.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-time-format/test/TimeFormatter.test.ts @@ -45,6 +45,9 @@ describe('TimeFormatter', () => { it('handles undefined', () => { expect(formatter.format(undefined)).toEqual('undefined'); }); + it('handles number, treating it as a timestamp', () => { + expect(formatter.format(PREVIEW_TIME.getTime())).toEqual('2017'); + }); it('otherwise returns formatted value', () => { expect(formatter.format(PREVIEW_TIME)).toEqual('2017'); });