aboutsummaryrefslogtreecommitdiff
path: root/src/fields/ObjectField.ts
blob: c533cb596723cad2e277fc66b8cb8570ec3542ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import { ScriptingGlobals } from '../client/util/ScriptingGlobals';
import { Copy, FieldChanged, Parent, ToJavascriptString, ToScriptString, ToString } from './FieldSymbols';
import { RefField } from './RefField';

export type serializedFieldType = { fieldId: string; heading?: string; __type: string };
export type serializedFieldsType = { [key: string]: { fields: serializedFieldType[] } };
export interface serializedDoctype {
    readonly id: string;
    readonly fields?: serializedFieldsType;
}

export type serverOpType = {
    $set?: serializedFieldsType; //
    $unset?: { [key: string]: unknown };
    $remFromSet?: { [key: string]: { fields: serializedFieldType[] } | { deleteCount: number; start: number } | number | undefined; length: number; hint: { deleteCount: number; start: number } | undefined };
    $addToSet?: { [key: string]: { fields: serializedFieldType[] } | number | undefined; length: number };
};
export abstract class ObjectField {
    // prettier-ignore
    public [FieldChanged]?: (diff?: { op: '$addToSet' | '$remFromSet' | '$set'; 
                             // eslint-disable-next-line no-use-before-define
                             items: FieldType[] | undefined; 
                             length: number | undefined; 
                             hint?: { deleteCount: number, start: number} }, 
                             serverOp?: serverOpType) => void;
    // eslint-disable-next-line no-use-before-define
    public [Parent]?: RefField | ObjectField;
    abstract [Copy](): ObjectField;

    abstract [ToJavascriptString](): string;
    abstract [ToScriptString](): string;
    abstract [ToString](): string;
    static MakeCopy<T extends ObjectField>(field: T) {
        return field?.[Copy]();
    }
}
export type FieldType = number | string | boolean | ObjectField | RefField; // bcz: hack for now .. must match the type definition in Doc.ts .. put here to avoid import cycles

ScriptingGlobals.add(ObjectField);