aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Wilkins <abdullah_ahmed@brown.edu>2019-04-30 20:41:51 -0400
committerSam Wilkins <abdullah_ahmed@brown.edu>2019-04-30 20:41:51 -0400
commitee31019f719b46db57de486e66158e9600515edd (patch)
treeab197fb9eb1063cb5a91a7ca9e7d8cab2594e7e3
parent43ed4e7fd2d6120598733e537a301a8f87379239 (diff)
all non-list object field [Copy] implemented
-rw-r--r--src/Utils.ts16
-rw-r--r--src/client/northstar/dash-fields/HistogramField.ts4
-rw-r--r--src/new_fields/HtmlField.ts6
-rw-r--r--src/new_fields/IconField.ts6
-rw-r--r--src/new_fields/InkField.ts9
-rw-r--r--src/new_fields/List.ts6
-rw-r--r--src/new_fields/ObjectField.ts12
-rw-r--r--src/new_fields/Proxy.ts14
-rw-r--r--src/new_fields/RichTextField.ts6
-rw-r--r--src/new_fields/URLField.ts6
10 files changed, 67 insertions, 18 deletions
diff --git a/src/Utils.ts b/src/Utils.ts
index c1ad88e2f..d4b6f5377 100644
--- a/src/Utils.ts
+++ b/src/Utils.ts
@@ -116,4 +116,18 @@ export function returnZero() { return 0; }
export function emptyFunction() { }
-export type Without<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>; \ No newline at end of file
+export type Without<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
+
+export type Predicate<K, V> = (entry: [K, V]) => boolean;
+
+export function deepCopy<K, V>(source: Map<K, V>, predicate?: Predicate<K, V>) {
+ let deepCopy = new Map<K, V>();
+ let entries = source.entries(), next = entries.next();
+ while (!next.done) {
+ let entry = next.value;
+ if (!predicate || predicate(entry)) {
+ deepCopy.set(entry[0], entry[1]);
+ }
+ }
+ return deepCopy;
+} \ No newline at end of file
diff --git a/src/client/northstar/dash-fields/HistogramField.ts b/src/client/northstar/dash-fields/HistogramField.ts
index 730289536..f01f08487 100644
--- a/src/client/northstar/dash-fields/HistogramField.ts
+++ b/src/client/northstar/dash-fields/HistogramField.ts
@@ -3,7 +3,7 @@ import { custom, serializable } from "serializr";
import { ColumnAttributeModel } from "../../../client/northstar/core/attribute/AttributeModel";
import { AttributeTransformationModel } from "../../../client/northstar/core/attribute/AttributeTransformationModel";
import { HistogramOperation } from "../../../client/northstar/operations/HistogramOperation";
-import { ObjectField } from "../../../new_fields/ObjectField";
+import { ObjectField, Copy } from "../../../new_fields/ObjectField";
import { CurrentUserUtils } from "../../../server/authentication/models/current_user_utils";
import { OmitKeys } from "../../../Utils";
import { Deserializable } from "../../util/SerializationHelper";
@@ -49,7 +49,7 @@ export class HistogramField extends ObjectField {
return JSON.stringify(OmitKeys(this.HistoOp, ['Links', 'BrushLinks', 'Result', 'BrushColors', 'FilterModels', 'FilterOperand']).omit);
}
- Copy(): HistogramField {
+ [Copy]() {
return new HistogramField(this.HistoOp.Copy());
}
} \ No newline at end of file
diff --git a/src/new_fields/HtmlField.ts b/src/new_fields/HtmlField.ts
index 808a3499b..d998746bb 100644
--- a/src/new_fields/HtmlField.ts
+++ b/src/new_fields/HtmlField.ts
@@ -1,6 +1,6 @@
import { Deserializable } from "../client/util/SerializationHelper";
import { serializable, primitive } from "serializr";
-import { ObjectField } from "./ObjectField";
+import { ObjectField, Copy } from "./ObjectField";
@Deserializable("html")
export class HtmlField extends ObjectField {
@@ -11,4 +11,8 @@ export class HtmlField extends ObjectField {
super();
this.html = html;
}
+
+ [Copy]() {
+ return new HtmlField(this.html);
+ }
}
diff --git a/src/new_fields/IconField.ts b/src/new_fields/IconField.ts
index c79a2f79a..1a928389d 100644
--- a/src/new_fields/IconField.ts
+++ b/src/new_fields/IconField.ts
@@ -1,6 +1,6 @@
import { Deserializable } from "../client/util/SerializationHelper";
import { serializable, primitive } from "serializr";
-import { ObjectField } from "./ObjectField";
+import { ObjectField, Copy } from "./ObjectField";
@Deserializable("icon")
export class IconField extends ObjectField {
@@ -11,4 +11,8 @@ export class IconField extends ObjectField {
super();
this.icon = icon;
}
+
+ [Copy]() {
+ return new IconField(this.icon);
+ }
}
diff --git a/src/new_fields/InkField.ts b/src/new_fields/InkField.ts
index f95952c2e..86a8bd18a 100644
--- a/src/new_fields/InkField.ts
+++ b/src/new_fields/InkField.ts
@@ -1,6 +1,9 @@
import { Deserializable } from "../client/util/SerializationHelper";
import { serializable, custom, createSimpleSchema, list, object, map } from "serializr";
-import { ObjectField } from "./ObjectField";
+import { ObjectField, Copy } from "./ObjectField";
+import { number } from "prop-types";
+import { any } from "bluebird";
+import { deepCopy } from "../Utils";
export enum InkTool {
None,
@@ -34,4 +37,8 @@ export class InkField extends ObjectField {
super();
this.inkData = data || new Map;
}
+
+ [Copy]() {
+ return new InkField(deepCopy(this.inkData))
+ }
}
diff --git a/src/new_fields/List.ts b/src/new_fields/List.ts
index ec1bf44a9..c1bd15cd1 100644
--- a/src/new_fields/List.ts
+++ b/src/new_fields/List.ts
@@ -3,7 +3,7 @@ import { Field, Update, Self } from "./Doc";
import { setter, getter, deleteProperty } from "./util";
import { serializable, alias, list } from "serializr";
import { observable, observe, IArrayChange, IArraySplice, IObservableArray, Lambda, reaction } from "mobx";
-import { ObjectField, OnUpdate } from "./ObjectField";
+import { ObjectField, OnUpdate, Copy } from "./ObjectField";
import { RefField } from "./RefField";
import { ProxyField } from "./Proxy";
@@ -215,6 +215,10 @@ class ListImpl<T extends Field> extends ObjectField {
this.___fields = value;
}
+ [Copy]() {
+ return new ListImpl<T>();
+ }
+
// @serializable(alias("fields", list(autoObject())))
@observable
private ___fields: (T | null | undefined)[];
diff --git a/src/new_fields/ObjectField.ts b/src/new_fields/ObjectField.ts
index 9cac2c528..0f3777af6 100644
--- a/src/new_fields/ObjectField.ts
+++ b/src/new_fields/ObjectField.ts
@@ -2,16 +2,16 @@ import { Doc } from "./Doc";
export const OnUpdate = Symbol("OnUpdate");
export const Parent = Symbol("Parent");
-const Id = Symbol("Object Id");
-export class ObjectField {
+export const Copy = Symbol("Copy");
+
+export abstract class ObjectField {
protected [OnUpdate]?: (diff?: any) => void;
private [Parent]?: Doc;
- readonly [Id] = "";
+ abstract [Copy](): ObjectField;
}
export namespace ObjectField {
- export function MakeCopy(field: ObjectField) {
- //TODO Types
- return field;
+ export function MakeCopy<T extends ObjectField>(field: T) {
+ return field[Copy]();
}
}
diff --git a/src/new_fields/Proxy.ts b/src/new_fields/Proxy.ts
index 56e41cc0f..fd99ae1c0 100644
--- a/src/new_fields/Proxy.ts
+++ b/src/new_fields/Proxy.ts
@@ -4,20 +4,28 @@ import { primitive, serializable } from "serializr";
import { observable, action } from "mobx";
import { DocServer } from "../client/DocServer";
import { RefField, Id } from "./RefField";
-import { ObjectField } from "./ObjectField";
+import { ObjectField, Copy } from "./ObjectField";
@Deserializable("proxy")
export class ProxyField<T extends RefField> extends ObjectField {
constructor();
constructor(value: T);
- constructor(value?: T) {
+ constructor(fieldId: string);
+ constructor(value?: T | string) {
super();
- if (value) {
+ if (typeof value === "string") {
+ this.fieldId = value;
+ } else if (value) {
this.cache = value;
this.fieldId = value[Id];
}
}
+ [Copy]() {
+ if (this.cache) return new ProxyField<T>(this.cache);
+ return new ProxyField<T>(this.fieldId);
+ }
+
@serializable(primitive())
readonly fieldId: string = "";
diff --git a/src/new_fields/RichTextField.ts b/src/new_fields/RichTextField.ts
index f2033d5a7..eb30e76de 100644
--- a/src/new_fields/RichTextField.ts
+++ b/src/new_fields/RichTextField.ts
@@ -1,4 +1,4 @@
-import { ObjectField } from "./ObjectField";
+import { ObjectField, Copy } from "./ObjectField";
import { serializable } from "serializr";
import { Deserializable } from "../client/util/SerializationHelper";
@@ -11,4 +11,8 @@ export class RichTextField extends ObjectField {
super();
this.Data = data;
}
+
+ [Copy]() {
+ return new RichTextField(this.Data);
+ }
} \ No newline at end of file
diff --git a/src/new_fields/URLField.ts b/src/new_fields/URLField.ts
index 95c679df7..d7120a5d2 100644
--- a/src/new_fields/URLField.ts
+++ b/src/new_fields/URLField.ts
@@ -1,6 +1,6 @@
import { Deserializable } from "../client/util/SerializationHelper";
import { serializable, custom } from "serializr";
-import { ObjectField } from "./ObjectField";
+import { ObjectField, Copy } from "./ObjectField";
function url() {
return custom(
@@ -21,6 +21,10 @@ export class URLField extends ObjectField {
super();
this.url = url;
}
+
+ [Copy]() {
+ return new URLField(this.url);
+ }
}
@Deserializable("audio") export class AudioField extends URLField { }