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 } | undefined; hint?: { deleteCount: number; start: number } }; $addToSet?: serializedFieldsType; 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(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);