mirror of
https://github.com/gristlabs/grist-core.git
synced 2026-03-02 04:09:24 +00:00
(core) Value parsing for refs, parsing data entry for numbers
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
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
import { ColumnRec, DocModel, IRowModel, refRecord, ViewSectionRec } from 'app/client/models/DocModel';
|
||||
import * as modelUtil from 'app/client/models/modelUtil';
|
||||
import { ReferenceUtils } from 'app/client/lib/ReferenceUtils';
|
||||
import * as UserType from 'app/client/widgets/UserType';
|
||||
import { DocumentSettings } from 'app/common/DocumentSettings';
|
||||
import { extractTypeFromColType } from 'app/common/gristTypes';
|
||||
import { BaseFormatter, createFormatter } from 'app/common/ValueFormatter';
|
||||
import { createParser } from 'app/common/ValueParser';
|
||||
import { Computed, fromKo } from 'grainjs';
|
||||
@@ -76,7 +78,7 @@ export interface ViewFieldRec extends IRowModel<"_grist_Views_section_field"> {
|
||||
|
||||
documentSettings: ko.PureComputed<DocumentSettings>;
|
||||
|
||||
valueParser: ko.Computed<((value: string) => any) | undefined>;
|
||||
valueParser: ko.Computed<(value: string) => any>;
|
||||
|
||||
// Helper which adds/removes/updates field's displayCol to match the formula.
|
||||
saveDisplayFormula(formula: string): Promise<void>|undefined;
|
||||
@@ -180,9 +182,19 @@ export function createViewFieldRec(this: ViewFieldRec, docModel: DocModel): void
|
||||
createFormatter(this.column().type(), this.widgetOptionsJson(), this.documentSettings());
|
||||
};
|
||||
|
||||
this.valueParser = ko.pureComputed(() =>
|
||||
createParser(this.column().type(), this.widgetOptionsJson(), this.documentSettings())
|
||||
);
|
||||
this.valueParser = ko.pureComputed(() => {
|
||||
const docSettings = this.documentSettings();
|
||||
const type = this.column().type();
|
||||
|
||||
if (extractTypeFromColType(type) === "Ref") { // TODO reflists
|
||||
const vcol = this.visibleColModel();
|
||||
const vcolParser = createParser(vcol.type(), vcol.widgetOptionsJson(), docSettings);
|
||||
const refUtils = new ReferenceUtils(this, docModel.docData); // uses several more observables immediately
|
||||
return (s: string) => refUtils.parseValue(vcolParser(s));
|
||||
} else {
|
||||
return createParser(type, this.widgetOptionsJson(), docSettings);
|
||||
}
|
||||
});
|
||||
|
||||
// The widgetOptions to read and write: either the column's or the field's own.
|
||||
this._widgetOptionsStr = modelUtil.savingComputed({
|
||||
|
||||
Reference in New Issue
Block a user