aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client/util/SerializationHelper.ts5
-rw-r--r--src/new_fields/Doc.ts20
-rw-r--r--src/new_fields/List.ts26
-rw-r--r--src/new_fields/util.ts14
-rw-r--r--src/server/database.ts2
5 files changed, 51 insertions, 16 deletions
diff --git a/src/client/util/SerializationHelper.ts b/src/client/util/SerializationHelper.ts
index ac70aba9d..1a8cc3a44 100644
--- a/src/client/util/SerializationHelper.ts
+++ b/src/client/util/SerializationHelper.ts
@@ -63,6 +63,11 @@ export function Deserializable(name: string): DeserializableOpts;
export function Deserializable(constructor: Function): void;
export function Deserializable(constructor: Function | string): DeserializableOpts | void {
function addToMap(name: string, ctor: Function) {
+ const schema = getDefaultModelSchema(ctor as any) as any;
+ if (schema.targetClass !== ctor) {
+ const newSchema = { ...schema, factory: () => new (ctor as any)() };
+ setDefaultModelSchema(ctor as any, newSchema);
+ }
if (!(name in serializationTypes)) {
serializationTypes[name] = ctor;
reverseMap[ctor.name] = name;
diff --git a/src/new_fields/Doc.ts b/src/new_fields/Doc.ts
index 4ef2a465f..d15b6309d 100644
--- a/src/new_fields/Doc.ts
+++ b/src/new_fields/Doc.ts
@@ -3,12 +3,12 @@ import { serializable, primitive, map, alias, list } from "serializr";
import { autoObject, SerializationHelper, Deserializable } from "../client/util/SerializationHelper";
import { Utils } from "../Utils";
import { DocServer } from "../client/DocServer";
-import { setter, getter, getField } from "./util";
+import { setter, getter, getField, updateFunction } from "./util";
import { Cast, ToConstructor, PromiseValue, FieldValue } from "./Types";
import { UndoManager, undoBatch } from "../client/util/UndoManager";
import { listSpec } from "./Schema";
import { List } from "./List";
-import { ObjectField } from "./ObjectField";
+import { ObjectField, Parent, OnUpdate } from "./ObjectField";
import { RefField, FieldId, Id } from "./RefField";
export function IsField(field: any): field is Field {
@@ -47,9 +47,23 @@ export class Doc extends RefField {
[key: string]: FieldResult;
@serializable(alias("fields", map(autoObject())))
+ private get __fields() {
+ return this.___fields;
+ }
+
+ private set __fields(value) {
+ this.___fields = value;
+ for (const key in value) {
+ const field = value[key];
+ if (!(field instanceof ObjectField)) continue;
+ field[Parent] = this[Self];
+ field[OnUpdate] = updateFunction(this[Self], key, field);
+ }
+ }
+
@observable
//{ [key: string]: Field | FieldWaiting | undefined }
- private __fields: any = {};
+ private ___fields: any = {};
private [Update] = (diff: any) => {
DocServer.UpdateField(this[Id], diff);
diff --git a/src/new_fields/List.ts b/src/new_fields/List.ts
index ecde4edc7..e4a80f7a1 100644
--- a/src/new_fields/List.ts
+++ b/src/new_fields/List.ts
@@ -2,13 +2,13 @@ import { Deserializable, autoObject } from "../client/util/SerializationHelper";
import { Field, Update, Self } from "./Doc";
import { setter, getter } from "./util";
import { serializable, alias, list } from "serializr";
-import { observable, observe, IArrayChange, IArraySplice, IObservableArray, Lambda } from "mobx";
+import { observable, observe, IArrayChange, IArraySplice, IObservableArray, Lambda, reaction } from "mobx";
import { ObjectField, OnUpdate } from "./ObjectField";
const listHandlers: any = {
push(...items: any[]) {
- console.log("push");
- console.log(...items);
+ // console.log("push");
+ // console.log(...items);
return this[Self].__fields.push(...items);
},
pop(): any {
@@ -62,7 +62,7 @@ function listObserver<T extends Field>(this: ListImpl<T>, change: IArrayChange<T
class ListImpl<T extends Field> extends ObjectField {
constructor(fields: T[] = []) {
super();
- this.__fields = fields;
+ this.___fields = fields;
this[ObserveDisposer] = observe(this.__fields as IObservableArray<T>, listObserver.bind(this));
const list = new Proxy<this>(this, {
set: setter,
@@ -76,13 +76,25 @@ class ListImpl<T extends Field> extends ObjectField {
[key: number]: T | null | undefined;
@serializable(alias("fields", list(autoObject())))
+ private get __fields() {
+ return this.___fields;
+ }
+
+ private set __fields(value) {
+ this.___fields = value;
+ this[ObserveDisposer]();
+ this[ObserveDisposer] = observe(this.__fields as IObservableArray<T>, listObserver.bind(this));
+ }
+
+ // @serializable(alias("fields", list(autoObject())))
@observable
- private __fields: (T | null | undefined)[];
+ private ___fields: (T | null | undefined)[];
private [Update] = (diff: any) => {
- console.log(diff);
+ // console.log(diff);
const update = this[OnUpdate];
- update && update(diff);
+ // update && update(diff);
+ update && update();
}
private [ObserveDisposer]: Lambda;
diff --git a/src/new_fields/util.ts b/src/new_fields/util.ts
index b2299f34a..511820115 100644
--- a/src/new_fields/util.ts
+++ b/src/new_fields/util.ts
@@ -31,17 +31,14 @@ export const setter = action(function (target: any, prop: string | symbol | numb
throw new Error("Can't put the same object in multiple documents at the same time");
}
value[Parent] = target;
- value[OnUpdate] = (diff?: any) => {
- if (!diff) diff = SerializationHelper.Serialize(value);
- target[Update]({ [prop]: diff });
- };
+ value[OnUpdate] = updateFunction(target, prop, value);
}
if (curValue instanceof ObjectField) {
delete curValue[Parent];
delete curValue[OnUpdate];
}
target.__fields[prop] = value;
- target[Update]({ ["fields." + prop]: value instanceof ObjectField ? SerializationHelper.Serialize(value) : (value === undefined ? null : value) });
+ target[Update]({ '$set': { ["fields." + prop]: value instanceof ObjectField ? SerializationHelper.Serialize(value) : (value === undefined ? null : value) } });
UndoManager.AddEvent({
redo: () => receiver[prop] = value,
undo: () => receiver[prop] = curValue
@@ -80,3 +77,10 @@ export function getField(target: any, prop: string | number, ignoreProto: boolea
callback && callback(field);
return field;
}
+
+export function updateFunction(target: any, prop: any, value: any) {
+ return (diff?: any) => {
+ if (!diff) diff = { '$set': { ["fields." + prop]: SerializationHelper.Serialize(value) } };
+ target[Update](diff);
+ };
+} \ No newline at end of file
diff --git a/src/server/database.ts b/src/server/database.ts
index 4775c0eeb..37cfcf3a3 100644
--- a/src/server/database.ts
+++ b/src/server/database.ts
@@ -20,7 +20,7 @@ export class Database {
let newProm: Promise<void>;
const run = (): Promise<void> => {
return new Promise<void>(resolve => {
- collection.updateOne({ _id: id }, { $set: value }, { upsert }
+ collection.updateOne({ _id: id }, value, { upsert }
, (err, res) => {
if (err) {
console.log(err.message);