mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
d63da496a8
Summary: Handle reference columns in ViewFieldRec.valueParser. Extracted code for reuse from ReferenceEditor to look up values in the visible column. While I was at it, also extracted a bit of common code from ReferenceEditor and ReferenceListEditor into a new class ReferenceUtils. More refactoring could be done in this area but it's out of scope. Changed NTextEditor to use field.valueParser, which affects numeric and reference fields. In particular this means numbers are parsed on data entry, it doesn't change anything for references. Test Plan: Added more CopyPaste testing to test references. Tested entering slightly formatted numbers in NumberFormatting. Reviewers: dsagal Reviewed By: dsagal Differential Revision: https://phab.getgrist.com/D3094
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 { 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 {
|
|
const cls = parsers[gristTypes.extractTypeFromColType(type)];
|
|
if (cls) {
|
|
const parser = new cls(type, widgetOpts, docSettings);
|
|
return parser.cleanParse.bind(parser);
|
|
}
|
|
return value => value;
|
|
}
|