aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx105
-rw-r--r--src/new_fields/Types.ts2
-rw-r--r--src/server/ServerUtil.ts62
-rw-r--r--test/test.ts166
4 files changed, 69 insertions, 266 deletions
diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
index ee7d65d23..3a9c9780b 100644
--- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
+++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
@@ -19,7 +19,7 @@ import "./CollectionFreeFormView.scss";
import { MarqueeView } from "./MarqueeView";
import React = require("react");
import v5 = require("uuid/v5");
-import { createSchema, makeInterface } from "../../../../new_fields/Schema";
+import { createSchema, makeInterface, listSpec } from "../../../../new_fields/Schema";
import { Doc, Id } from "../../../../new_fields/Doc";
import { FieldValue, Cast } from "../../../../new_fields/Types";
import { pageSchema } from "../../nodes/ImageBox";
@@ -83,19 +83,19 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {
const [x, y] = this.getTransform().transformPoint(de.x - de.data.xOffset, de.y - de.data.yOffset);
if (de.data.droppedDocuments.length) {
let dragDoc = de.data.droppedDocuments[0];
- let dropX = dragDoc.GetNumber(KeyStore.X, 0);
- let dropY = dragDoc.GetNumber(KeyStore.Y, 0);
+ let dropX = Cast(dragDoc.x, "number", 0);
+ let dropY = Cast(dragDoc.y, "number", 0);
de.data.droppedDocuments.map(d => {
- d.SetNumber(KeyStore.X, x + (d.GetNumber(KeyStore.X, 0)) - dropX);
- d.SetNumber(KeyStore.Y, y + (d.GetNumber(KeyStore.Y, 0)) - dropY);
- if (!d.GetBoolean(KeyStore.IsMinimized, false)) {
- if (!d.GetNumber(KeyStore.Width, 0)) {
- d.SetNumber(KeyStore.Width, 300);
+ d.x = x + Cast(d.x, "number", 0) - dropX;
+ d.y = y + Cast(d.y, "number", 0) - dropY;
+ if (!Cast(d.isMinimized, "boolean", false)) {
+ if (!Cast(d.width, "number", 0)) {
+ d.width = 300;
}
- if (!d.GetNumber(KeyStore.Height, 0)) {
- let nw = d.GetNumber(KeyStore.NativeWidth, 0);
- let nh = d.GetNumber(KeyStore.NativeHeight, 0);
- d.SetNumber(KeyStore.Height, nw && nh ? nh / nw * d.Width() : 300);
+ if (!Cast(d.height, "number", 0)) {
+ let nw = Cast(d.nativeWidth, "number", 0);
+ let nh = Cast(d.nativeHeight, "number", 0);
+ d.height = nw && nh ? nh / nw * Cast(d.width, "number", 0) : 300;
}
}
this.bringToFront(d);
@@ -115,7 +115,7 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {
@action
onPointerDown = (e: React.PointerEvent): void => {
- let childSelected = this.props.Document.GetList(this.props.fieldKey, [] as Document[]).filter(doc => doc).reduce((childSelected, doc) => {
+ let childSelected = Cast(this.props.Document[this.props.fieldKey], listSpec(Doc), [] as Doc[]).filter(doc => doc).reduce((childSelected, doc) => {
var dv = DocumentManager.Instance.getDocumentView(doc);
return childSelected || (dv && SelectionManager.IsSelected(dv) ? true : false);
}, false);
@@ -139,20 +139,20 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {
@action
onPointerMove = (e: PointerEvent): void => {
if (!e.cancelBubble) {
- let x = this.props.Document.GetNumber(KeyStore.PanX, 0);
- let y = this.props.Document.GetNumber(KeyStore.PanY, 0);
- let docs = this.props.Document.GetList(this.props.fieldKey, [] as Document[]);
+ let x = Cast(this.props.Document.panX, "number", 0);
+ let y = Cast(this.props.Document.panY, "number", 0);
+ let docs = this.children || [];
let [dx, dy] = this.getTransform().transformDirection(e.clientX - this._lastX, e.clientY - this._lastY);
if (!this.isAnnotationOverlay) {
- let minx = docs.length ? docs[0].GetNumber(KeyStore.X, 0) : 0;
- let maxx = docs.length ? docs[0].Width() + minx : minx;
- let miny = docs.length ? docs[0].GetNumber(KeyStore.Y, 0) : 0;
- let maxy = docs.length ? docs[0].Height() + miny : miny;
+ let minx = docs.length ? Cast(docs[0].x, "number", 0) : 0;
+ let maxx = docs.length ? Cast(docs[0].width, "number", 0) + minx : minx;
+ let miny = docs.length ? Cast(docs[0].y, "number", 0) : 0;
+ let maxy = docs.length ? Cast(docs[0].height, "number", 0) + miny : miny;
let ranges = docs.filter(doc => doc).reduce((range, doc) => {
- let x = doc.GetNumber(KeyStore.X, 0);
- let xe = x + doc.GetNumber(KeyStore.Width, 0);
- let y = doc.GetNumber(KeyStore.Y, 0);
- let ye = y + doc.GetNumber(KeyStore.Height, 0);
+ let x = Cast(doc.x, "number", 0);
+ let xe = x + Cast(doc.width, "number", 0);
+ let y = Cast(doc.y, "number", 0);
+ let ye = y + Cast(doc.height, "number", 0);
return [[range[0][0] > x ? x : range[0][0], range[0][1] < xe ? xe : range[0][1]],
[range[1][0] > y ? y : range[1][0], range[1][1] < ye ? ye : range[1][1]]];
}, [[minx, maxx], [miny, maxy]]);
@@ -176,10 +176,10 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {
// if (!this.props.active()) {
// return;
// }
- let childSelected = this.props.Document.GetList(this.props.fieldKey, [] as Document[]).filter(doc => doc).reduce((childSelected, doc) => {
+ let childSelected = (this.children || []).filter(doc => doc).some(doc => {
var dv = DocumentManager.Instance.getDocumentView(doc);
- return childSelected || (dv && SelectionManager.IsSelected(dv) ? true : false);
- }, false);
+ return dv && SelectionManager.IsSelected(dv) ? true : false;
+ });
if (!this.props.isSelected() && !childSelected && !this.props.isTopMost) {
return;
}
@@ -188,8 +188,8 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {
if (e.ctrlKey) {
let deltaScale = (1 - (e.deltaY / coefficient));
- this.props.Document.SetNumber(KeyStore.NativeWidth, this.nativeWidth * deltaScale);
- this.props.Document.SetNumber(KeyStore.NativeHeight, this.nativeHeight * deltaScale);
+ this.props.Document.nativeWidth = this.nativeWidth * deltaScale;
+ this.props.Document.nativeHeight = this.nativeHeight * deltaScale;
e.stopPropagation();
e.preventDefault();
} else {
@@ -204,7 +204,7 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {
let localTransform = this.getLocalTransform().inverse().scaleAbout(deltaScale, x, y);
let safeScale = Math.abs(localTransform.Scale);
- this.props.Document.SetNumber(KeyStore.Scale, Math.abs(safeScale));
+ this.props.Document.scale = Math.abs(safeScale);
this.setPan(-localTransform.TranslateX / safeScale, -localTransform.TranslateY / safeScale);
e.stopPropagation();
}
@@ -216,8 +216,8 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {
var scale = this.getLocalTransform().inverse().Scale;
const newPanX = Math.min((1 - 1 / scale) * this.nativeWidth, Math.max(0, panX));
const newPanY = Math.min((1 - 1 / scale) * this.nativeHeight, Math.max(0, panY));
- this.props.Document.SetNumber(KeyStore.PanX, this.isAnnotationOverlay ? newPanX : panX);
- this.props.Document.SetNumber(KeyStore.PanY, this.isAnnotationOverlay ? newPanY : panY);
+ this.props.Document.panX = this.isAnnotationOverlay ? newPanX : panX;
+ this.props.Document.panY = this.isAnnotationOverlay ? newPanY : panY;
}
@action
@@ -230,23 +230,23 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {
}
@action
- bringToFront(doc: Document) {
- this.props.Document.GetList(this.props.fieldKey, [] as Document[]).slice().sort((doc1, doc2) => {
+ bringToFront(doc: Doc) {
+ (this.children || []).slice().sort((doc1, doc2) => {
if (doc1 === doc) return 1;
if (doc2 === doc) return -1;
- return doc1.GetNumber(KeyStore.ZIndex, 0) - doc2.GetNumber(KeyStore.ZIndex, 0);
- }).map((doc, index) => doc.SetNumber(KeyStore.ZIndex, index + 1));
+ return Cast(doc1.zIndex, "number", 0) - Cast(doc2.zIndex, "number", 0);
+ }).forEach((doc, index) => doc.zIndex = index + 1);
return doc;
}
- focusDocument = (doc: Document) => {
+ focusDocument = (doc: Doc) => {
this.setPan(
- doc.GetNumber(KeyStore.X, 0) + doc.Width() / 2,
- doc.GetNumber(KeyStore.Y, 0) + doc.Height() / 2);
+ Cast(doc.x, "number", 0) + Cast(doc.width, "number", 0) / 2,
+ Cast(doc.y, "number", 0) + Cast(doc.height, "number", 0) / 2);
this.props.focus(this.props.Document);
}
- getDocumentViewProps(document: Document): DocumentViewProps {
+ getDocumentViewProps(document: Doc): DocumentViewProps {
return {
Document: document,
addDocument: this.props.addDocument,
@@ -255,8 +255,8 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {
ScreenToLocalTransform: this.getTransform,
isTopMost: false,
selectOnLoad: document.Id === this._selectOnLoaded,
- PanelWidth: document.Width,
- PanelHeight: document.Height,
+ PanelWidth: () => Cast(document.width, "number", 0),//TODO Types These are inline functions
+ PanelHeight: () => Cast(document.height, "number", 0),
ContentScaling: returnOne,
ContainingCollectionView: this.props.CollectionView,
focus: this.focusDocument,
@@ -267,13 +267,14 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {
@computed
get views() {
- var curPage = this.props.Document.GetNumber(KeyStore.CurPage, -1);
- let docviews = this.props.Document.GetList(this.props.fieldKey, [] as Document[]).filter(doc => doc).reduce((prev, doc) => {
- var page = doc.GetNumber(KeyStore.Page, -1);
+ let curPage = FieldValue(this.Document.curPage, -1);
+ let docviews = (this.children || []).filter(doc => doc).reduce((prev, doc) => {
+ var page = Cast(doc.page, "number", -1);
if (page === curPage || page === -1) {
- let minim = doc.GetT(KeyStore.IsMinimized, BooleanField);
- if (minim === undefined || (minim && !minim.Data))
- prev.push(<CollectionFreeFormDocumentView key={doc.Id} {...this.getDocumentViewProps(doc)} />);
+ let minim = Cast(doc.isMinimized, "boolean");
+ if (minim === undefined || !minim) {
+ prev.push(<CollectionFreeFormDocumentView key={doc[Id]} {...this.getDocumentViewProps(doc)} />);
+ }
}
return prev;
}, [] as JSX.Element[]);
@@ -316,9 +317,9 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {
@observer
class CollectionFreeFormOverlayView extends React.Component<DocumentViewProps> {
@computed get overlayView() {
- let overlayLayout = this.props.Document.GetText(KeyStore.OverlayLayout, "");
+ let overlayLayout = Cast(this.props.Document.overlayLayout, "string", "");
return !overlayLayout ? (null) :
- (<DocumentContentsView {...this.props} layoutKey={KeyStore.OverlayLayout}
+ (<DocumentContentsView {...this.props} layoutKey={"overlayLayout"}
isTopMost={this.props.isTopMost} isSelected={returnFalse} select={emptyFunction} />);
}
render() {
@@ -329,9 +330,9 @@ class CollectionFreeFormOverlayView extends React.Component<DocumentViewProps> {
@observer
class CollectionFreeFormBackgroundView extends React.Component<DocumentViewProps> {
@computed get backgroundView() {
- let backgroundLayout = this.props.Document.GetText(KeyStore.BackgroundLayout, "");
+ let backgroundLayout = Cast(this.props.Document.backgroundLayout, "string", "");
return !backgroundLayout ? (null) :
- (<DocumentContentsView {...this.props} layoutKey={KeyStore.BackgroundLayout}
+ (<DocumentContentsView {...this.props} layoutKey={"backgroundLayout"}
isTopMost={this.props.isTopMost} isSelected={returnFalse} select={emptyFunction} />);
}
render() {
diff --git a/src/new_fields/Types.ts b/src/new_fields/Types.ts
index 55083765a..4ad8dcade 100644
--- a/src/new_fields/Types.ts
+++ b/src/new_fields/Types.ts
@@ -38,7 +38,7 @@ export interface Interface {
}
export function Cast<T extends ToConstructor<Field> | ListSpec<Field>>(field: FieldResult, ctor: T): FieldResult<ToType<T>>;
-export function Cast<T extends ToConstructor<Field> | ListSpec<Field>>(field: FieldResult, ctor: T, defaultVal: ToType<T>): ToType<T>;
+export function Cast<T extends ToConstructor<Field> | ListSpec<Field>>(field: FieldResult, ctor: T, defaultVal: WithoutList<ToType<T>>): WithoutList<ToType<T>>;
export function Cast<T extends ToConstructor<Field> | ListSpec<Field>>(field: FieldResult, ctor: T, defaultVal?: ToType<T>): FieldResult<ToType<T>> | undefined {
if (field instanceof Promise) {
return defaultVal === undefined ? field.then(f => Cast(f, ctor) as any) as any : defaultVal;
diff --git a/src/server/ServerUtil.ts b/src/server/ServerUtil.ts
deleted file mode 100644
index 79ca5e55d..000000000
--- a/src/server/ServerUtil.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import { HistogramField } from "../client/northstar/dash-fields/HistogramField";
-import { AudioField } from "../fields/AudioField";
-import { BooleanField } from "../fields/BooleanField";
-import { HtmlField } from "../fields/HtmlField";
-import { InkField } from "../fields/InkField";
-import { PDFField } from "../fields/PDFField";
-import { ScriptField } from "../fields/ScriptField";
-import { TupleField } from "../fields/TupleField";
-import { VideoField } from "../fields/VideoField";
-import { WebField } from "../fields/WebField";
-import { Utils } from "../Utils";
-import { Document } from "./../fields/Document";
-import { Field } from "./../fields/Field";
-import { ImageField } from "./../fields/ImageField";
-import { Key } from "./../fields/Key";
-import { ListField } from "./../fields/ListField";
-import { NumberField } from "./../fields/NumberField";
-import { RichTextField } from "./../fields/RichTextField";
-import { TextField } from "./../fields/TextField";
-import { Transferable, Types } from "./Message";
-import { IconField } from "../fields/IconFIeld";
-
-export class ServerUtils {
- public static prepend(extension: string): string {
- return window.location.origin + extension;
- }
-
- public static FromJson(json: Transferable): Field {
-
- if (!(json.data !== undefined && json.id && json.type !== undefined)) {
- console.log(
- "how did you manage to get an object that doesn't have a data or an id?"
- );
- return new TextField("Something to fill the space", Utils.GenerateGuid());
- }
-
- switch (json.type) {
- case Types.Boolean: return new BooleanField(json.data, json.id, false);
- case Types.Number: return new NumberField(json.data, json.id, false);
- case Types.Text: return new TextField(json.data, json.id, false);
- case Types.Icon: return new IconField(json.data, json.id, false);
- case Types.Html: return new HtmlField(json.data, json.id, false);
- case Types.Web: return new WebField(new URL(json.data), json.id, false);
- case Types.RichText: return new RichTextField(json.data, json.id, false);
- case Types.Key: return new Key(json.data, json.id, false);
- case Types.Image: return new ImageField(new URL(json.data), json.id, false);
- case Types.HistogramOp: return HistogramField.FromJson(json.id, json.data);
- case Types.PDF: return new PDFField(new URL(json.data), json.id, false);
- case Types.List: return ListField.FromJson(json.id, json.data);
- case Types.Script: return ScriptField.FromJson(json.id, json.data);
- case Types.Audio: return new AudioField(new URL(json.data), json.id, false);
- case Types.Video: return new VideoField(new URL(json.data), json.id, false);
- case Types.Tuple: return new TupleField(json.data, json.id, false);
- case Types.Ink: return InkField.FromJson(json.id, json.data);
- case Types.Document: return Document.FromJson(json.data, json.id, false);
- default:
- throw Error(
- "Error, unrecognized field type received from server. If you just created a new field type, be sure to add it here"
- );
- }
- }
-}
diff --git a/test/test.ts b/test/test.ts
index 16cace026..91dc43379 100644
--- a/test/test.ts
+++ b/test/test.ts
@@ -1,171 +1,35 @@
-import { NumberField } from "../src/fields/NumberField";
import { expect } from 'chai';
import 'mocha';
-import { Key } from "../src/fields/Key";
-import { Document } from "../src/fields/Document";
import { autorun, reaction } from "mobx";
-import { DocumentReference } from "../src/fields/DocumentReference";
-import { TextField } from "../src/fields/TextField";
-import { Field, FieldWaiting } from "../src/fields/Field";
-
-describe('Number Controller', () => {
- it('Should be constructable', () => {
- const numController = new NumberField(15);
- expect(numController.Data).to.equal(15);
- });
-
- it('Should update', () => {
- const numController = new NumberField(15);
- let ran = false;
- reaction(() => numController.Data, (data) => { ran = true; });
- expect(ran).to.equal(false);
- numController.Data = 5;
- expect(ran).to.equal(true);
- });
-});
+import { Doc } from '../src/new_fields/Doc';
+import { Cast } from '../src/new_fields/Types';
describe("Document", () => {
it('should hold fields', () => {
- let key = new Key("Test");
- let key2 = new Key("Test2");
- let field = new NumberField(15);
- let doc = new Document();
- doc.Set(key, field);
- let getField = doc.GetT(key, NumberField);
- let getField2 = doc.GetT(key2, NumberField);
+ let key = "Test";
+ let key2 = "Test2";
+ let field = 15;
+ let doc = new Doc();
+ doc[key] = field;
+ let getField = Cast(doc[key], "number");
+ let getField2 = Cast(doc[key2], "number");
expect(getField).to.equal(field);
expect(getField2).to.equal(undefined);
});
it('should update', () => {
- let doc = new Document();
- let key = new Key("Test");
- let key2 = new Key("Test2");
+ let doc = new Doc();
+ let key = "Test";
+ let key2 = "Test2";
let ran = false;
- reaction(() => doc.Get(key), (field) => { ran = true; });
+ reaction(() => doc[key], (field) => { ran = true; });
expect(ran).to.equal(false);
- doc.Set(key2, new NumberField(4));
+ doc[key2] = 4;
expect(ran).to.equal(false);
- doc.Set(key, new NumberField(5));
+ doc[key] = 5;
expect(ran).to.equal(true);
});
});
-
-describe("Reference", () => {
- it('should dereference', () => {
- let doc = new Document();
- let doc2 = new Document();
- const key = new Key("test");
- const key2 = new Key("test2");
-
- const numCont = new NumberField(55);
- doc.Set(key, numCont);
- let ref = new DocumentReference(doc, key);
- let ref2 = new DocumentReference(doc, key2);
- doc2.Set(key2, ref);
-
- let ref3 = new DocumentReference(doc2, key2);
- let ref4 = new DocumentReference(doc2, key);
-
- expect(ref.Dereference()).to.equal(numCont);
- expect(ref.DereferenceToRoot()).to.equal(numCont);
- expect(ref2.Dereference()).to.equal(undefined);
- expect(ref2.DereferenceToRoot()).to.equal(undefined);
- expect(ref3.Dereference()).to.equal(ref);
- expect(ref3.DereferenceToRoot()).to.equal(numCont);
- expect(ref4.Dereference()).to.equal(undefined);
- expect(ref4.DereferenceToRoot()).to.equal(undefined);
- });
-
- it('should work with prototypes', () => {
- let doc = new Document;
- let doc2 = doc.MakeDelegate();
- let key = new Key("test");
- expect(doc.Get(key)).to.equal(undefined);
- expect(doc2.Get(key)).to.equal(undefined);
- let num = new NumberField(55);
- let num2 = new NumberField(56);
-
- doc.Set(key, num);
- expect(doc.Get(key)).to.equal(num);
- expect(doc2.Get(key)).to.equal(num);
-
- doc2.Set(key, num2);
- expect(doc.Get(key)).to.equal(num);
- expect(doc2.Get(key)).to.equal(num2);
- });
-
- it('should update through layers', () => {
- let doc = new Document();
- let doc2 = new Document();
- let doc3 = new Document();
- const key = new Key("test");
- const key2 = new Key("test2");
- const key3 = new Key("test3");
-
- const numCont = new NumberField(55);
- doc.Set(key, numCont);
- const ref = new DocumentReference(doc, key);
- doc2.Set(key2, ref);
- const ref3 = new DocumentReference(doc2, key2);
- doc3.Set(key3, ref3);
-
- let ran = false;
- reaction(() => {
- let field = (<Field>(<Field>doc3.Get(key3)).DereferenceToRoot()).GetValue();
- return field;
- }, (field) => {
- ran = true;
- });
- expect(ran).to.equal(false);
-
- numCont.Data = 44;
- expect(ran).to.equal(true);
- ran = false;
-
- doc.Set(key, new NumberField(33));
- expect(ran).to.equal(true);
- ran = false;
-
- doc.Set(key2, new NumberField(4));
- expect(ran).to.equal(false);
-
- doc2.Set(key2, new TextField("hello"));
- expect(ran).to.equal(true);
- ran = false;
-
- doc3.Set(key3, new TextField("world"));
- expect(ran).to.equal(true);
- ran = false;
- });
-
- it('should update with prototypes', () => {
- let doc = new Document();
- let doc2 = doc.MakeDelegate();
- const key = new Key("test");
-
- const numCont = new NumberField(55);
-
- let ran = false;
- reaction(() => {
- let field = doc2.GetT(key, NumberField);
- if (field && field !== FieldWaiting) {
- return field.Data;
- }
- return undefined;
- }, (field) => {
- ran = true;
- });
- expect(ran).to.equal(false);
-
- doc.Set(key, numCont);
- expect(ran).to.equal(true);
-
- ran = false;
- numCont.Data = 1;
- expect(ran).to.equal(true);
- });
-}); \ No newline at end of file