mirror of
https://github.com/apache/superset.git
synced 2024-09-19 20:19:37 -04:00
feat: add more support for undefined format to number and time formatters (#308)
* feat: add more support for undefined format * test: add unit tests * fix: handle empty string
This commit is contained in:
parent
64dca92eb2
commit
5966ff10be
@ -23,7 +23,11 @@ export default class NumberFormatterRegistry extends RegistryWithDefaultKey<
|
||||
}
|
||||
|
||||
get(formatterId?: string) {
|
||||
const targetFormat = `${formatterId ?? this.defaultKey}`.trim();
|
||||
const targetFormat = `${
|
||||
formatterId === null || typeof formatterId === 'undefined' || formatterId === ''
|
||||
? this.defaultKey
|
||||
: formatterId
|
||||
}`.trim();
|
||||
|
||||
if (this.has(targetFormat)) {
|
||||
return super.get(targetFormat) as NumberFormatter;
|
||||
|
@ -5,10 +5,10 @@ const getInstance = makeSingleton(NumberFormatterRegistry);
|
||||
|
||||
export default getInstance;
|
||||
|
||||
export function getNumberFormatter(format: string) {
|
||||
export function getNumberFormatter(format?: string) {
|
||||
return getInstance().get(format);
|
||||
}
|
||||
|
||||
export function formatNumber(format: string, value: number | null | undefined) {
|
||||
export function formatNumber(format: string | undefined, value: number | null | undefined) {
|
||||
return getInstance().format(format, value);
|
||||
}
|
||||
|
@ -26,6 +26,22 @@ describe('NumberFormatterRegistry', () => {
|
||||
const formatter = registry.get();
|
||||
expect(formatter.format(100)).toEqual('100.0');
|
||||
});
|
||||
it('falls back to default format if format is null', () => {
|
||||
registry.setDefaultKey('.1f');
|
||||
// @ts-ignore
|
||||
const formatter = registry.get(null);
|
||||
expect(formatter.format(100)).toEqual('100.0');
|
||||
});
|
||||
it('falls back to default format if format is undefined', () => {
|
||||
registry.setDefaultKey('.1f');
|
||||
const formatter = registry.get(undefined);
|
||||
expect(formatter.format(100)).toEqual('100.0');
|
||||
});
|
||||
it('falls back to default format if format is empty string', () => {
|
||||
registry.setDefaultKey('.1f');
|
||||
const formatter = registry.get('');
|
||||
expect(formatter.format(100)).toEqual('100.0');
|
||||
});
|
||||
it('removes leading and trailing spaces from format', () => {
|
||||
const formatter = registry.get(' .2f');
|
||||
expect(formatter).toBeInstanceOf(NumberFormatter);
|
||||
|
@ -19,11 +19,18 @@ describe('NumberFormatterRegistrySingleton', () => {
|
||||
const format = getNumberFormatter('xkcd');
|
||||
expect(format(12345)).toEqual('12345 (Invalid format: xkcd)');
|
||||
});
|
||||
it('falls back to default format if format is not specified', () => {
|
||||
const formatter = getNumberFormatter();
|
||||
expect(formatter.format(100)).toEqual('100');
|
||||
});
|
||||
});
|
||||
describe('formatNumber(format, value)', () => {
|
||||
it('format the given number using the specified format', () => {
|
||||
const output = formatNumber('.3s', 12345);
|
||||
expect(output).toEqual('12.3k');
|
||||
});
|
||||
it('falls back to the default formatter if the format is undefined', () => {
|
||||
expect(formatNumber(undefined, 1000)).toEqual('1k');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -16,7 +16,9 @@ export default class TimeFormatterRegistry extends RegistryWithDefaultKey<
|
||||
}
|
||||
|
||||
get(format?: string) {
|
||||
const targetFormat = `${format ?? this.defaultKey}`.trim();
|
||||
const targetFormat = `${
|
||||
format === null || typeof format === 'undefined' || format === '' ? this.defaultKey : format
|
||||
}`.trim();
|
||||
|
||||
if (this.has(targetFormat)) {
|
||||
return super.get(targetFormat) as TimeFormatter;
|
||||
|
@ -5,10 +5,10 @@ const getInstance = makeSingleton(TimeFormatterRegistry);
|
||||
|
||||
export default getInstance;
|
||||
|
||||
export function getTimeFormatter(formatId: string) {
|
||||
export function getTimeFormatter(formatId?: string) {
|
||||
return getInstance().get(formatId);
|
||||
}
|
||||
|
||||
export function formatTime(formatId: string, value: Date | null | undefined) {
|
||||
export function formatTime(formatId: string | undefined, value: Date | null | undefined) {
|
||||
return getInstance().format(formatId, value);
|
||||
}
|
||||
|
@ -22,6 +22,22 @@ describe('TimeFormatterRegistry', () => {
|
||||
const formatter = registry.get();
|
||||
expect(formatter.format(PREVIEW_TIME)).toEqual('14/02/2017');
|
||||
});
|
||||
it('falls back to default format if format is null', () => {
|
||||
registry.setDefaultKey(TimeFormats.INTERNATIONAL_DATE);
|
||||
// @ts-ignore
|
||||
const formatter = registry.get(null);
|
||||
expect(formatter.format(PREVIEW_TIME)).toEqual('14/02/2017');
|
||||
});
|
||||
it('falls back to default format if format is undefined', () => {
|
||||
registry.setDefaultKey(TimeFormats.INTERNATIONAL_DATE);
|
||||
const formatter = registry.get(undefined);
|
||||
expect(formatter.format(PREVIEW_TIME)).toEqual('14/02/2017');
|
||||
});
|
||||
it('falls back to default format if format is empty string', () => {
|
||||
registry.setDefaultKey(TimeFormats.INTERNATIONAL_DATE);
|
||||
const formatter = registry.get('');
|
||||
expect(formatter.format(PREVIEW_TIME)).toEqual('14/02/2017');
|
||||
});
|
||||
it('removes leading and trailing spaces from format', () => {
|
||||
const formatter = registry.get(' %Y ');
|
||||
expect(formatter).toBeInstanceOf(TimeFormatter);
|
||||
|
@ -16,11 +16,18 @@ describe('TimeFormatterRegistrySingleton', () => {
|
||||
const format = getTimeFormatter('%d/%m/%Y');
|
||||
expect(format(PREVIEW_TIME)).toEqual('14/02/2017');
|
||||
});
|
||||
it('falls back to default format if format is not specified', () => {
|
||||
const formatter = getTimeFormatter();
|
||||
expect(formatter.format(PREVIEW_TIME)).toEqual('2017-02-14 11:22:33');
|
||||
});
|
||||
});
|
||||
describe('formatTime(format, value)', () => {
|
||||
it('format the given time using the specified format', () => {
|
||||
const output = formatTime('%Y-%m-%d', PREVIEW_TIME);
|
||||
expect(output).toEqual('2017-02-14');
|
||||
});
|
||||
it('falls back to the default formatter if the format is undefined', () => {
|
||||
expect(formatTime(undefined, PREVIEW_TIME)).toEqual('2017-02-14 11:22:33');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user