diff options
author | Tyler Schicke <tyler_schicke@brown.edu> | 2019-04-29 01:36:00 -0400 |
---|---|---|
committer | Tyler Schicke <tyler_schicke@brown.edu> | 2019-04-29 01:36:15 -0400 |
commit | 307564d9b02ed9d4de8ffa4229b0494bf8d671bd (patch) | |
tree | 23ea5bb4f2bbbef28c5c102c112e6ac00f4f1959 | |
parent | a60abe83ce1e780968e6fd0601cfabce6979a110 (diff) |
Fixes
-rw-r--r-- | src/client/util/SerializationHelper.ts | 5 | ||||
-rw-r--r-- | src/new_fields/Doc.ts | 20 | ||||
-rw-r--r-- | src/new_fields/List.ts | 26 | ||||
-rw-r--r-- | src/new_fields/util.ts | 14 | ||||
-rw-r--r-- | src/server/database.ts | 2 |
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); |