mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
99878c08ed
Summary: Add ValueParser file, base class, and subclasses for column types. Only NumericParser is used for now. Add valueParser field to ViewFieldRec. Use valueParser when parsing pasted text data in Grid and Detail views. Test Plan: Add test to nbrowser CopyPaste suite, copying into a numeric column with different currency and locale settings. Reviewers: dsagal Reviewed By: dsagal Differential Revision: https://phab.getgrist.com/D3082
75 lines
2.1 KiB
TypeScript
75 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 { parseDate } from 'app/common/parseDate';
|
|
import { 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 parseDate(value, this.widgetOpts);
|
|
}
|
|
}
|
|
|
|
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.Date;
|
|
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);
|
|
}
|
|
}
|