mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
e58df5df5b
Summary: Adds parseDateStrict function based on parseDate, uses it in DateParser subclass of ValueParser. Test Plan: Tweaked parseDate test to check parseDateStrict. Extended test in CopyPaste to test parsing dates as well as numbers. Reviewers: dsagal Reviewed By: dsagal Differential Revision: https://phab.getgrist.com/D3088
74 lines
2.1 KiB
TypeScript
74 lines
2.1 KiB
TypeScript
import { DocumentSettings } from 'app/common/DocumentSettings';
|
|
import * as gristTypes from 'app/common/gristTypes';
|
|
import * as gutil from 'app/common/gutil';
|
|
import { getCurrency, NumberFormatOptions } from 'app/common/NumberFormat';
|
|
import NumberParse from 'app/common/NumberParse';
|
|
import { parseDateStrict } from 'app/common/parseDate';
|
|
import { DateFormatOptions, DateTimeFormatOptions, FormatOptions } from 'app/common/ValueFormatter';
|
|
|
|
|
|
export class ValueParser {
|
|
constructor(public type: string, public widgetOpts: object, public docSettings: DocumentSettings) {
|
|
}
|
|
|
|
public cleanParse(value: string): any {
|
|
if (!value) {
|
|
return value;
|
|
}
|
|
return this.parse(value) ?? value;
|
|
}
|
|
|
|
public parse(value: string): any {
|
|
return value;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
export class NumericParser extends ValueParser {
|
|
private _parse: NumberParse;
|
|
|
|
constructor(type: string, options: NumberFormatOptions, docSettings: DocumentSettings) {
|
|
super(type, options, docSettings);
|
|
this._parse = new NumberParse(docSettings.locale, getCurrency(options, docSettings));
|
|
}
|
|
|
|
public parse(value: string): number | null {
|
|
return this._parse.parse(value);
|
|
}
|
|
}
|
|
|
|
class DateParser extends ValueParser {
|
|
public parse(value: string): any {
|
|
return parseDateStrict(value, (this.widgetOpts as DateFormatOptions).dateFormat!);
|
|
}
|
|
}
|
|
|
|
class DateTimeParser extends DateParser {
|
|
constructor(type: string, widgetOpts: DateTimeFormatOptions, docSettings: DocumentSettings) {
|
|
super(type, widgetOpts, docSettings);
|
|
const timezone = gutil.removePrefix(type, "DateTime:") || '';
|
|
this.widgetOpts = {...widgetOpts, timezone};
|
|
}
|
|
}
|
|
|
|
const parsers: { [type: string]: typeof ValueParser } = {
|
|
Numeric: NumericParser,
|
|
Int: NumericParser,
|
|
Date: DateParser,
|
|
DateTime: DateTimeParser,
|
|
};
|
|
|
|
// TODO these are not ready yet
|
|
delete parsers.DateTime;
|
|
|
|
export function createParser(
|
|
type: string, widgetOpts: FormatOptions, docSettings: DocumentSettings
|
|
): ((value: string) => any) | undefined {
|
|
const cls = parsers[gristTypes.extractTypeFromColType(type)];
|
|
if (cls) {
|
|
const parser = new cls(type, widgetOpts, docSettings);
|
|
return parser.cleanParse.bind(parser);
|
|
}
|
|
}
|