aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTyler Schicke <tyler_schicke@brown.edu>2019-04-21 00:39:09 -0400
committerTyler Schicke <tyler_schicke@brown.edu>2019-04-21 00:39:09 -0400
commit3556aae6d063d8b654509330e70bc67606f16613 (patch)
tree1413a7efaae48bb5b3f9567b75e3a79528c9dad3
parent8ddec1c70c01b3d7d919908299e1168b75698dc7 (diff)
More changes
-rw-r--r--src/client/views/collections/CollectionDockingView.tsx38
-rw-r--r--src/client/views/nodes/CollectionFreeFormDocumentView.tsx43
-rw-r--r--src/new_fields/Doc.ts9
-rw-r--r--src/new_fields/Proxy.ts2
-rw-r--r--src/new_fields/Types.ts22
5 files changed, 65 insertions, 49 deletions
diff --git a/src/client/views/collections/CollectionDockingView.tsx b/src/client/views/collections/CollectionDockingView.tsx
index b6c87231f..7b204cbdc 100644
--- a/src/client/views/collections/CollectionDockingView.tsx
+++ b/src/client/views/collections/CollectionDockingView.tsx
@@ -250,28 +250,26 @@ export class CollectionDockingView extends React.Component<SubCollectionViewProp
tabCreated = (tab: any) => {
if (tab.hasOwnProperty("contentItem") && tab.contentItem.config.type !== "stack") {
- Server.GetField(tab.contentItem.config.props.documentId, action((f: Opt<Field>) => {
- if (f !== undefined && f instanceof Document) {
- f.GetTAsync(KeyStore.Title, TextField, (tfield) => {
- if (tfield !== undefined) {
- tab.titleElement[0].textContent = f.Title;
- }
- });
- f.GetTAsync(KeyStore.LinkedFromDocs, ListField).then(lf =>
- f.GetTAsync(KeyStore.LinkedToDocs, ListField).then(lt => {
- let count = (lf ? lf.Data.length : 0) + (lt ? lt.Data.length : 0);
- let counter: any = this.htmlToElement(`<div class="messageCounter">${count}</div>`);
- tab.element.append(counter);
- counter.DashDocId = tab.contentItem.config.props.documentId;
- tab.reactionDisposer = reaction((): [List<Field> | null | undefined, List<Field> | null | undefined] => [Cast(f.linkedFromDocs, List), Cast(f.linkedToDocs, List)],
- ([linkedFrom, linkedTo]) => {
- let count = (linkedFrom ? linkedFrom.length : 0) + (linkedTo ? linkedTo.length : 0);
- counter.innerHTML = count;
- });
- }));
+ DocServer.GetRefField(tab.contentItem.config.props.documentId).then(async f => {
+ if (f instanceof Doc) {
+ const tfield = await Cast(f.title, "string");
+ if (tfield !== undefined) {
+ tab.titleElement[0].textContent = f.Title;
+ }
+ const lf = await Cast(f.linkedFromDocs, List);
+ const lt = await Cast(f.linkedToDocs, List);
+ let count = (lf ? lf.length : 0) + (lt ? lt.length : 0);
+ let counter: any = this.htmlToElement(`<div class="messageCounter">${count}</div>`);
+ tab.element.append(counter);
+ counter.DashDocId = tab.contentItem.config.props.documentId;
+ tab.reactionDisposer = reaction((): [List<Field> | null | undefined, List<Field> | null | undefined] => [lf, lt],
+ ([linkedFrom, linkedTo]) => {
+ let count = (linkedFrom ? linkedFrom.length : 0) + (linkedTo ? linkedTo.length : 0);
+ counter.innerHTML = count;
+ });
tab.titleElement[0].DashDocId = tab.contentItem.config.props.documentId;
}
- }));
+ });
}
tab.closeElement.off('click') //unbind the current click handler
.click(function () {
diff --git a/src/client/views/nodes/CollectionFreeFormDocumentView.tsx b/src/client/views/nodes/CollectionFreeFormDocumentView.tsx
index 1d42b3899..27fd25b5c 100644
--- a/src/client/views/nodes/CollectionFreeFormDocumentView.tsx
+++ b/src/client/views/nodes/CollectionFreeFormDocumentView.tsx
@@ -1,18 +1,27 @@
import { computed, trace } from "mobx";
import { observer } from "mobx-react";
-import { KeyStore } from "../../../fields/KeyStore";
-import { NumberField } from "../../../fields/NumberField";
import { Transform } from "../../util/Transform";
-import { DocumentView, DocumentViewProps } from "./DocumentView";
+import { DocumentView, DocumentViewProps, positionSchema } from "./DocumentView";
import "./DocumentView.scss";
import React = require("react");
import { OmitKeys } from "../../../Utils";
+import { DocComponent } from "../DocComponent";
+import { createSchema, makeInterface } from "../../../new_fields/Schema";
+import { FieldValue } from "../../../new_fields/Types";
export interface CollectionFreeFormDocumentViewProps extends DocumentViewProps {
}
+const schema = createSchema({
+ zoom: "number",
+ zIndex: "number"
+});
+
+type FreeformDocument = makeInterface<[typeof schema, typeof positionSchema]>;
+const FreeformDocument = makeInterface([schema, positionSchema]);
+
@observer
-export class CollectionFreeFormDocumentView extends React.Component<CollectionFreeFormDocumentViewProps> {
+export class CollectionFreeFormDocumentView extends DocComponent<CollectionFreeFormDocumentViewProps, FreeformDocument>(FreeformDocument) {
private _mainCont = React.createRef<HTMLDivElement>();
@computed
@@ -20,36 +29,36 @@ export class CollectionFreeFormDocumentView extends React.Component<CollectionFr
return `scale(${this.props.ContentScaling()}, ${this.props.ContentScaling()}) translate(${this.X}px, ${this.Y}px) scale(${this.zoom}, ${this.zoom}) `;
}
- @computed get zoom(): number { return 1 / this.props.Document.GetNumber(KeyStore.Zoom, 1); }
- @computed get zIndex(): number { return this.props.Document.GetNumber(KeyStore.ZIndex, 0); }
- @computed get width(): number { return this.props.Document.Width(); }
- @computed get height(): number { return this.props.Document.Height(); }
- @computed get nativeWidth(): number { return this.props.Document.GetNumber(KeyStore.NativeWidth, 0); }
- @computed get nativeHeight(): number { return this.props.Document.GetNumber(KeyStore.NativeHeight, 0); }
+ @computed get zoom(): number { return 1 / FieldValue(this.Document.zoom, 1); }
+ @computed get zIndex(): number { return FieldValue(this.Document.zIndex, 0); }
+ @computed get width(): number { return FieldValue(this.Document.width, 0); }
+ @computed get height(): number { return FieldValue(this.Document.height, 0); }
+ @computed get nativeWidth(): number { return FieldValue(this.Document.nativeWidth, 0); }
+ @computed get nativeHeight(): number { return FieldValue(this.Document.nativeHeight, 0); }
set width(w: number) {
- this.props.Document.SetData(KeyStore.Width, w, NumberField);
+ this.Document.width = w;
if (this.nativeWidth && this.nativeHeight) {
- this.props.Document.SetNumber(KeyStore.Height, this.nativeHeight / this.nativeWidth * w);
+ this.Document.height = this.nativeHeight / this.nativeWidth * w;
}
}
set height(h: number) {
- this.props.Document.SetData(KeyStore.Height, h, NumberField);
+ this.Document.height = h;
if (this.nativeWidth && this.nativeHeight) {
- this.props.Document.SetNumber(KeyStore.Width, this.nativeWidth / this.nativeHeight * h);
+ this.Document.width = this.nativeWidth / this.nativeHeight * h;
}
}
set zIndex(h: number) {
- this.props.Document.SetData(KeyStore.ZIndex, h, NumberField);
+ this.Document.zIndex = h;
}
get X() {
- return this.props.Document.GetNumber(KeyStore.X, 0);
+ return FieldValue(this.Document.x, 0);
}
get Y() {
- return this.props.Document.GetNumber(KeyStore.Y, 0);
+ return FieldValue(this.Document.y, 0);
}
getTransform = (): Transform =>
this.props.ScreenToLocalTransform()
diff --git a/src/new_fields/Doc.ts b/src/new_fields/Doc.ts
index 8cbd8cf38..10e8fe7ec 100644
--- a/src/new_fields/Doc.ts
+++ b/src/new_fields/Doc.ts
@@ -32,9 +32,8 @@ export class ObjectField {
export type Field = number | string | boolean | ObjectField | RefField;
export type Opt<T> = T | undefined;
-export type FieldWaiting = null;
-export const FieldWaiting: FieldWaiting = null;
-export type FieldValue<T extends Field = Field> = Opt<T> | FieldWaiting;
+export type FieldWaiting<T extends Field = Field> = Promise<T | undefined>;
+export type FieldValue<T extends Field = Field> = Opt<T> | FieldWaiting<T>;
export const Self = Symbol("Self");
@@ -58,7 +57,7 @@ export class Doc extends RefField {
@serializable(alias("fields", map(autoObject())))
@observable
- private __fields: { [key: string]: Field | null | undefined } = {};
+ private __fields: { [key: string]: Field | FieldWaiting | undefined } = {};
private [Update] = (diff: any) => {
DocServer.UpdateField(this[Id], diff);
@@ -78,7 +77,7 @@ export namespace Doc {
return Cast(field, ctor);
});
}
- export function Get(doc: Doc, key: string, ignoreProto: boolean = false): Field | null | undefined {
+ export function Get(doc: Doc, key: string, ignoreProto: boolean = false): FieldValue {
const self = doc[Self];
return getField(self, key, ignoreProto);
}
diff --git a/src/new_fields/Proxy.ts b/src/new_fields/Proxy.ts
index 6a78388c1..2aa78731e 100644
--- a/src/new_fields/Proxy.ts
+++ b/src/new_fields/Proxy.ts
@@ -50,6 +50,6 @@ export class ProxyField<T extends RefField> extends ObjectField {
}));
}
callback && this.promise.then(callback);
- return null;
+ return this.promise;
}
}
diff --git a/src/new_fields/Types.ts b/src/new_fields/Types.ts
index 0fbd8984c..0392dc2fb 100644
--- a/src/new_fields/Types.ts
+++ b/src/new_fields/Types.ts
@@ -1,4 +1,4 @@
-import { Field, Opt } from "./Doc";
+import { Field, Opt, FieldWaiting, FieldValue } from "./Doc";
import { List } from "./List";
export type ToType<T> =
@@ -6,7 +6,7 @@ export type ToType<T> =
T extends "number" ? number :
T extends "boolean" ? boolean :
T extends ListSpec<infer U> ? List<U> :
- T extends { new(...args: any[]): infer R } ? R : never;
+ T extends { new(...args: any[]): infer R } ? (R | Promise<R>) : never;
export type ToConstructor<T> =
T extends string ? "string" :
@@ -35,10 +35,13 @@ export interface Interface {
export type FieldCtor<T extends Field> = T extends List<infer R> ? ListSpec<R> : ToConstructor<T>;
-export function Cast<T extends FieldCtor<Field>>(field: Field | null | undefined, ctor: T): ToType<T> | null | undefined;
-export function Cast<T extends FieldCtor<Field>>(field: Field | null | undefined, ctor: T, defaultVal: ToType<T>): ToType<T>;
-export function Cast<T extends FieldCtor<Field>>(field: Field | null | undefined, ctor: T, defaultVal?: ToType<T>): ToType<T> | null | undefined {
- if (field !== undefined && field !== null) {
+export function Cast<T extends FieldCtor<Field>>(field: Field | FieldWaiting | undefined, ctor: T): FieldValue<ToType<T>>;
+export function Cast<T extends FieldCtor<Field>>(field: Field | FieldWaiting | undefined, ctor: T, defaultVal: ToType<T>): ToType<T>;
+export function Cast<T extends FieldCtor<Field>>(field: Field | FieldWaiting | undefined, ctor: T, defaultVal?: ToType<T>): FieldValue<ToType<T>> | undefined {
+ if (field instanceof Promise) {
+ return defaultVal === undefined ? field.then(f => Cast(f, ctor) as any) : defaultVal;
+ }
+ if (field !== undefined && !(field instanceof Promise)) {
if (typeof ctor === "string") {
if (typeof field === ctor) {
return field as ToType<T>;
@@ -59,3 +62,10 @@ export function FieldValue<T extends Field>(field: Opt<T> | Promise<Opt<T>>): Op
export function FieldValue<T extends Field>(field: Opt<T> | Promise<Opt<T>>, defaultValue?: T): Opt<T> {
return field instanceof Promise ? defaultValue : field;
}
+
+export interface PromiseLike<T> {
+ then(callback: (field: Opt<T> | PromiseLike<T>) => void): void;
+}
+export function PromiseValue<T extends Field>(field: FieldValue<T>): PromiseLike<Opt<T>> {
+ return field instanceof Promise ? field : { then(cb: ((field: Opt<T>) => void)) { return cb(field); } };
+} \ No newline at end of file