aboutsummaryrefslogtreecommitdiff
path: root/src/new_fields/Doc.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/new_fields/Doc.ts')
-rw-r--r--src/new_fields/Doc.ts38
1 files changed, 30 insertions, 8 deletions
diff --git a/src/new_fields/Doc.ts b/src/new_fields/Doc.ts
index 529634990..bc2d5c49e 100644
--- a/src/new_fields/Doc.ts
+++ b/src/new_fields/Doc.ts
@@ -1,4 +1,4 @@
-import { observable, ObservableMap, runInAction, action } from "mobx";
+import { observable, ObservableMap, runInAction, action, computed } from "mobx";
import { alias, map, serializable } from "serializr";
import { DocServer } from "../client/DocServer";
import { DocumentType } from "../client/documents/DocumentTypes";
@@ -90,6 +90,7 @@ export function DocListCast(field: FieldResult): Doc[] {
export const WidthSym = Symbol("Width");
export const HeightSym = Symbol("Height");
export const DataSym = Symbol("Data");
+export const LayoutSym = Symbol("Layout");
export const UpdatingFromServer = Symbol("UpdatingFromServer");
const CachedUpdates = Symbol("Cached updates");
@@ -111,8 +112,11 @@ export class Doc extends RefField {
get: getter,
// getPrototypeOf: (target) => Cast(target[SelfProxy].proto, Doc) || null, // TODO this might be able to replace the proto logic in getter
has: (target, key) => key in target.__fields,
- ownKeys: target => Object.keys(target.__fields),
+ ownKeys: target => Object.keys(target.__allfields),
getOwnPropertyDescriptor: (target, prop) => {
+ if (prop.toString() === "__LAYOUT__") {
+ return Reflect.getOwnPropertyDescriptor(target, prop);
+ }
if (prop in target.__fields) {
return {
configurable: true,//TODO Should configurable be true?
@@ -139,6 +143,13 @@ export class Doc extends RefField {
private get __fields() {
return this.___fields;
}
+ private get __allfields() {
+ let obj = {} as any;
+ Object.assign(obj, this.___fields);
+ runInAction(() => obj.__LAYOUT__ = this.__LAYOUT__);
+ return obj;
+ }
+
private set __fields(value) {
this.___fields = value;
@@ -168,6 +179,15 @@ export class Doc extends RefField {
public [WidthSym] = () => NumCast(this[SelfProxy]._width);
public [HeightSym] = () => NumCast(this[SelfProxy]._height);
public get [DataSym]() { return Cast(this[SelfProxy].resolvedDataDoc, Doc, null) || this[SelfProxy]; }
+ @computed public get __LAYOUT__() {
+ const layoutKey = StrCast(this[SelfProxy].layoutKey);
+ const resolvedLayout = Cast(layoutKey, Doc);
+ if (resolvedLayout instanceof Doc) {
+ let layout = (resolvedLayout.layout as string).split("'")[1];
+ return this[SelfProxy][layout + "-layout[" + resolvedLayout[Id] + "]"] || resolvedLayout;
+ }
+ return undefined;
+ }
[ToScriptString]() {
return "invalid";
@@ -672,12 +692,14 @@ export namespace Doc {
// the document containing the view layout information - will be the Document itself unless the Document has
// a layout field. In that case, all layout information comes from there unless overriden by Document
export function Layout(doc: Doc): Doc {
- let templateLayoutDoc = Cast(Doc.LayoutField(doc), Doc, null);
- if (templateLayoutDoc) {
- const renderFieldKey = Doc.LayoutFieldKey(templateLayoutDoc);
- return Cast(doc[renderFieldKey + "-layout[" + templateLayoutDoc[Id] + "]"], Doc, null) || templateLayoutDoc;
- }
- return doc;
+ return doc.__LAYOUT__ || Cast(Doc.LayoutField(doc), Doc, null) || doc;
+ // let templateLayoutDoc = Cast(Doc.LayoutField(doc), Doc, null);
+ // if (templateLayoutDoc) {
+ // const renderFieldKey = Doc.LayoutFieldKey(templateLayoutDoc);
+ // const layout = Cast(doc[renderFieldKey + "-layout[" + templateLayoutDoc[Id] + "]"], Doc, null) || templateLayoutDoc;
+ // return layout;
+ // }
+ // return doc;
}
export function SetLayout(doc: Doc, layout: Doc | string) { doc[StrCast(doc.layoutKey, "layout")] = layout; }
export function LayoutField(doc: Doc) { return doc[StrCast(doc.layoutKey, "layout")]; }