diff options
| author | Andy Rickert <andrew_rickert@brown.edu> | 2020-04-15 20:02:58 -0700 | 
|---|---|---|
| committer | Andy Rickert <andrew_rickert@brown.edu> | 2020-04-15 20:02:58 -0700 | 
| commit | 1d5c4510dff326a0f12b914868ac8614ab460e83 (patch) | |
| tree | 7173f465175c6eb6b5bbfe96c932b49fd621f0b0 /src/server/authentication | |
| parent | c7c146adbd0b188eba56139ab914edaf73774d3f (diff) | |
| parent | e0f16b89cba102a4fcd156bb3d4148432eca2ab7 (diff) | |
merge
Diffstat (limited to 'src/server/authentication')
| -rw-r--r-- | src/server/authentication/models/current_user_utils.ts | 147 | 
1 files changed, 49 insertions, 98 deletions
| diff --git a/src/server/authentication/models/current_user_utils.ts b/src/server/authentication/models/current_user_utils.ts index fc6e36485..9235a97b0 100644 --- a/src/server/authentication/models/current_user_utils.ts +++ b/src/server/authentication/models/current_user_utils.ts @@ -2,8 +2,6 @@ import { action, computed, observable, reaction } from "mobx";  import * as rp from 'request-promise';  import { DocServer } from "../../../client/DocServer";  import { Docs, DocumentOptions } from "../../../client/documents/Documents"; -import { Attribute, AttributeGroup, Catalog, Schema } from "../../../client/northstar/model/idea/idea"; -import { ArrayUtil } from "../../../client/northstar/utils/ArrayUtil";  import { UndoManager } from "../../../client/util/UndoManager";  import { Doc, DocListCast } from "../../../new_fields/Doc";  import { List } from "../../../new_fields/List"; @@ -14,7 +12,7 @@ import { Utils } from "../../../Utils";  import { nullAudio, ImageField } from "../../../new_fields/URLField";  import { DragManager } from "../../../client/util/DragManager";  import { InkingControl } from "../../../client/views/InkingControl"; -import { Scripting } from "../../../client/util/Scripting"; +import { Scripting, CompileScript } from "../../../client/util/Scripting";  import { CollectionViewType } from "../../../client/views/collections/CollectionView";  import { makeTemplate } from "../../../client/util/DropConverter";  import { RichTextField } from "../../../new_fields/RichTextField"; @@ -59,9 +57,9 @@ export class CurrentUserUtils {          doc.iconView = new PrefetchProxy(Docs.Create.TextDocument("", { title: "icon", _width: 150, _height: 30, isTemplateDoc: true, onClick: ScriptField.MakeScript("deiconifyView(this)") }));          Doc.GetProto(doc.iconView as any as Doc).icon = new RichTextField('{"doc":{"type":"doc","content":[{"type":"paragraph","attrs":{"align":null,"color":null,"id":null,"indent":null,"inset":null,"lineSpacing":null,"paddingBottom":null,"paddingTop":null},"content":[{"type":"dashField","attrs":{"fieldKey":"title","docid":""}}]}]},"selection":{"type":"text","anchor":2,"head":2},"storedMarks":[]}', "");          doc.isTemplateDoc = makeTemplate(doc.iconView as any as Doc); -        doc.iconImageView = new PrefetchProxy(Docs.Create.ImageDocument("http://www.cs.brown.edu/~bcz/face.gif", { title: "data", _width: 50, isTemplateDoc: true, onClick: ScriptField.MakeScript("deiconifyView(this)") })); +        doc.iconImageView = new PrefetchProxy(Docs.Create.ImageDocument("http://www.cs.brown.edu/~bcz/face.gif", { title: "data", _width: 50, isTemplateDoc: true, onClick: ScriptField.MakeScript("deiconifyView(self)") }));          doc.isTemplateDoc = makeTemplate(doc.iconImageView as any as Doc, true, "image_icon"); -        doc.iconColView = new PrefetchProxy(Docs.Create.TreeDocument([], { title: "data", _width: 180, _height: 80, isTemplateDoc: true, onClick: ScriptField.MakeScript("deiconifyView(this)") })); +        doc.iconColView = new PrefetchProxy(Docs.Create.TreeDocument([], { title: "data", _width: 180, _height: 80, isTemplateDoc: true, onClick: ScriptField.MakeScript("deiconifyView(self)") }));          doc.isTemplateDoc = makeTemplate(doc.iconColView as any as Doc, true, "collection_icon");          doc.iconViews = Docs.Create.TreeDocument([doc.iconView as any as Doc, doc.iconImageView as any as Doc, doc.iconColView as any as Doc], { title: "icon types", _height: 75 });      } @@ -75,13 +73,13 @@ export class CurrentUserUtils {              { title: "collection", icon: "folder", click: 'openOnRight(getCopy(this.dragFactory, true))', drag: 'getCopy(this.dragFactory, true)', dragFactory: emptyCollection },              { title: "preview", icon: "expand", ignoreClick: true, drag: 'Docs.Create.DocumentDocument(ComputedField.MakeFunction("selectedDocs(this,this.excludeCollections,[_last_])?.[0]"), { _width: 250, _height: 250, title: "container" })' },              { title: "web page", icon: "globe-asia", ignoreClick: true, drag: 'Docs.Create.WebDocument("https://en.wikipedia.org/wiki/Hedgehog", {_width: 300, _height: 300, title: "New Webpage" })' }, -            { title: "cat image", icon: "cat", ignoreClick: true, drag: 'Docs.Create.ImageDocument("https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/1200px-Cat03.jpg", { _width: 200, title: "an image of a cat" })' }, -            { title: "buxton", icon: "cloud-upload-alt", ignoreClick: true, drag: "Docs.Create.Buxton()" }, +            { title: "cat image", icon: "cat", ignoreClick: true, drag: 'Docs.Create.ImageDocument("https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/1200px-Cat03.jpg", { _width: 250, _nativeWidth:250, title: "an image of a cat" })' },              { title: "screenshot", icon: "photo-video", ignoreClick: true, drag: 'Docs.Create.ScreenshotDocument("", { _width: 400, _height: 200, title: "screen snapshot" })' },              { title: "webcam", icon: "video", ignoreClick: true, drag: 'Docs.Create.WebCamDocument("", { _width: 400, _height: 400, title: "a test cam" })' },              { title: "record", icon: "microphone", ignoreClick: true, drag: `Docs.Create.AudioDocument("${nullAudio}", { _width: 200, title: "ready to record audio" })` },              { title: "clickable button", icon: "bolt", ignoreClick: true, drag: 'Docs.Create.ButtonDocument({ _width: 150, _height: 50, title: "Button" })' },              { title: "presentation", icon: "tv", click: 'openOnRight(Doc.UserDoc().curPresentation = getCopy(this.dragFactory, true))', drag: `Doc.UserDoc().curPresentation = getCopy(this.dragFactory,true)`, dragFactory: emptyPresentation }, +            { title: "script", icon: "terminal", ignoreClick: true, drag: 'Docs.Create.ScriptingDocument(undefined, { _width: 200, _height: 250 title: "untitled script" })' },              { title: "import folder", icon: "cloud-upload-alt", ignoreClick: true, drag: 'Docs.Create.DirectoryImportDocument({ title: "Directory Import", _width: 400, _height: 400 })' },              { title: "mobile view", icon: "phone", ignoreClick: true, drag: 'Doc.UserDoc().activeMobile' },              { title: "use pen", icon: "pen-nib", click: 'activatePen(this.activePen.pen = sameDocs(this.activePen.pen, this) ? undefined : this,2, this.backgroundColor)', backgroundColor: "blue", ischecked: `sameDocs(this.activePen.pen,  this)`, activePen: doc }, @@ -90,8 +88,7 @@ export class CurrentUserUtils {              { title: "use eraser", icon: "eraser", click: 'activateEraser(this.activePen.pen = sameDocs(this.activePen.pen, this) ? undefined : this);', ischecked: `sameDocs(this.activePen.pen, this)`, backgroundColor: "pink", activePen: doc },              { title: "use drag", icon: "mouse-pointer", click: 'deactivateInk();this.activePen.pen = this;', ischecked: `sameDocs(this.activePen.pen, this)`, backgroundColor: "white", activePen: doc },              { title: "query", icon: "bolt", ignoreClick: true, drag: 'Docs.Create.QueryDocument({ _width: 200, title: "an image of a cat" })' }, - - +            // { title: "buxton", icon: "cloud-upload-alt", ignoreClick: true, drag: "Docs.Create.Buxton()" },          ];          return docProtoData.filter(d => !alreadyCreatedButtons?.includes(d.title)).map(data => Docs.Create.FontIconDocument({              _nativeWidth: 100, _nativeHeight: 100, _width: 100, _height: 100, @@ -99,9 +96,12 @@ export class CurrentUserUtils {              title: data.title,              ignoreClick: data.ignoreClick,              dropAction: data.click ? "copy" : undefined, -            onDragStart: data.drag ? ScriptField.MakeFunction(data.drag) : undefined, onClick: data.click ? ScriptField.MakeScript(data.click) : undefined, -            ischecked: data.ischecked ? ComputedField.MakeFunction(data.ischecked) : undefined, activePen: data.activePen, dontDecorateSelection: true, -            backgroundColor: data.backgroundColor, removeDropProperties: new List<string>(["dropAction"]), dragFactory: data.dragFactory, +            onDragStart: data.drag ? ScriptField.MakeFunction(data.drag) : undefined, +            onClick: data.click ? ScriptField.MakeScript(data.click) : undefined, +            ischecked: data.ischecked ? ComputedField.MakeFunction(data.ischecked) : undefined, +            activePen: data.activePen, +            backgroundColor: data.backgroundColor, removeDropProperties: new List<string>(["dropAction"]), +            dragFactory: data.dragFactory,          }));      } @@ -166,9 +166,12 @@ export class CurrentUserUtils {      static setupThumbDoc(userDoc: Doc) {          if (!userDoc.thumbDoc) {              const thumbDoc = Docs.Create.LinearDocument(CurrentUserUtils.setupThumbButtons(userDoc), { -                _width: 100, _height: 50, ignoreClick: true, lockedPosition: true, _chromeStatus: "disabled", title: "buttons", _autoHeight: true, _yMargin: 5, linearViewIsExpanded: true, backgroundColor: "white" +                _width: 100, _height: 50, ignoreClick: true, lockedPosition: true, _chromeStatus: "disabled", title: "buttons", +                _autoHeight: true, _yMargin: 5, linearViewIsExpanded: true, backgroundColor: "white" +            }); +            thumbDoc.inkToTextDoc = Docs.Create.LinearDocument([], { +                _width: 300, _height: 25, _autoHeight: true, _chromeStatus: "disabled", linearViewIsExpanded: true, flexDirection: "column"              }); -            thumbDoc.inkToTextDoc = Docs.Create.LinearDocument([], { _width: 300, _height: 25, _autoHeight: true, _chromeStatus: "disabled", linearViewIsExpanded: true, flexDirection: "column" });              userDoc.thumbDoc = thumbDoc;          }          return Cast(userDoc.thumbDoc, Doc); @@ -210,7 +213,7 @@ export class CurrentUserUtils {          });          return Docs.Create.ButtonDocument({ -            _width: 35, _height: 25, title: "Tools", fontSize: 10, targetContainer: sidebarContainer, dontDecorateSelection: true, +            _width: 35, _height: 25, title: "Tools", fontSize: 10, targetContainer: sidebarContainer,              letterSpacing: "0px", textTransform: "unset", borderRounding: "5px 5px 0px 0px", boxShadow: "3px 3px 0px rgb(34, 34, 34)",              sourcePanel: Docs.Create.StackingDocument([dragCreators, color], {                  _width: 500, lockedPosition: true, _chromeStatus: "disabled", title: "tools stack", forceActive: true @@ -236,7 +239,7 @@ export class CurrentUserUtils {          });          return Docs.Create.ButtonDocument({ -            _width: 50, _height: 25, title: "Library", fontSize: 10, dontDecorateSelection: true, +            _width: 50, _height: 25, title: "Library", fontSize: 10,              letterSpacing: "0px", textTransform: "unset", borderRounding: "5px 5px 0px 0px", boxShadow: "3px 3px 0px rgb(34, 34, 34)",              sourcePanel: Docs.Create.TreeDocument([doc.workspaces as Doc, doc.documents as Doc, Docs.Prototypes.MainLinkDocument(), doc, doc.recentlyClosed as Doc], {                  title: "Library", _xMargin: 5, _yMargin: 5, _gridGap: 5, forceActive: true, childDropAction: "place", lockedPosition: true, boxShadow: "0 0", dontRegisterChildren: true @@ -249,7 +252,7 @@ export class CurrentUserUtils {      // setup the Search button which will display the search panel.        static setupSearchPanel(sidebarContainer: Doc) {          return Docs.Create.ButtonDocument({ -            _width: 50, _height: 25, title: "Search", fontSize: 10, dontDecorateSelection: true, +            _width: 50, _height: 25, title: "Search", fontSize: 10,              letterSpacing: "0px", textTransform: "unset", borderRounding: "5px 5px 0px 0px", boxShadow: "3px 3px 0px rgb(34, 34, 34)",              sourcePanel: Docs.Create.QueryDocument({ title: "search stack", }),              targetContainer: sidebarContainer, @@ -280,26 +283,29 @@ export class CurrentUserUtils {      static setupExpandingButtons(doc: Doc) {          const queryTemplate = Docs.Create.MulticolumnDocument(              [ -                Docs.Create.QueryDocument({ title: "query", _height: 200 }), +                Docs.Create.QueryDocument({ title: "query", _height: 200, forceActive: true }),                  Docs.Create.FreeformDocument([], { title: "data", _height: 100, _LODdisable: true, forceActive: true })              ],              { _width: 400, _height: 300, title: "queryView", _chromeStatus: "disabled", _xMargin: 3, _yMargin: 3, _autoHeight: false, forceActive: true, hideFilterView: true });          queryTemplate.isTemplateDoc = makeTemplate(queryTemplate);          const slideTemplate = Docs.Create.MultirowDocument(              [ -                Docs.Create.MulticolumnDocument([], { title: "data", _height: 200 }), -                Docs.Create.TextDocument("", { title: "text", _height: 100 }) +                Docs.Create.MulticolumnDocument([], { title: "data", _height: 200, forceActive: true }), +                Docs.Create.TextDocument("", { title: "text", _height: 100, forceActive: true })              ], -            { _width: 400, _height: 300, title: "slideView", _chromeStatus: "disabled", _xMargin: 3, _yMargin: 3, _autoHeight: false }); +            { _width: 400, _height: 300, title: "slideView", _chromeStatus: "disabled", _xMargin: 3, _yMargin: 3, _autoHeight: false, forceActive: true, hideFilterView: true });          slideTemplate.isTemplateDoc = makeTemplate(slideTemplate);          const descriptionTemplate = Docs.Create.TextDocument("", { title: "text", _height: 100, _showTitle: "title" });          Doc.GetProto(descriptionTemplate).layout = FormattedTextBox.LayoutString("description");          descriptionTemplate.isTemplateDoc = makeTemplate(descriptionTemplate, true, "descriptionView"); -        const ficon = (opts: DocumentOptions) => new PrefetchProxy(Docs.Create.FontIconDocument({ ...opts, dontDecorateSelection: true, dropAction: "alias", removeDropProperties: new List<string>(["dropAction"]), _nativeWidth: 100, _nativeHeight: 100, _width: 100, _height: 100 })) as any as Doc; +        const ficon = (opts: DocumentOptions) => new PrefetchProxy(Docs.Create.FontIconDocument({ +            ...opts, +            dropAction: "alias", removeDropProperties: new List<string>(["dropAction"]), _nativeWidth: 100, _nativeHeight: 100, _width: 100, _height: 100 +        })) as any as Doc;          const blist = (opts: DocumentOptions, docs: Doc[]) => new PrefetchProxy(Docs.Create.LinearDocument(docs, {              ...opts, -            _gridGap: 5, _xMargin: 5, _yMargin: 5, _height: 42, _width: 100, boxShadow: "0 0", dontDecorateSelection: true, forceActive: true, +            _gridGap: 5, _xMargin: 5, _yMargin: 5, _height: 42, _width: 100, boxShadow: "0 0", forceActive: true,              dropConverter: ScriptField.MakeScript("convertToButtons(dragData)", { dragData: DragManager.DocumentDragData.name }),              backgroundColor: "black", treeViewPreventOpen: true, lockedPosition: true, _chromeStatus: "disabled", linearViewIsExpanded: true          })) as any as Doc; @@ -309,9 +315,9 @@ export class CurrentUserUtils {          doc.slidesBtn = ficon({ onDragStart: ScriptField.MakeFunction('getCopy(this.dragFactory, true)'), dragFactory: slideTemplate, removeDropProperties: new List<string>(["dropAction"]), title: "presentation slide", icon: "sticky-note" });          doc.descriptionBtn = ficon({ onDragStart: ScriptField.MakeFunction('getCopy(this.dragFactory, true)'), dragFactory: descriptionTemplate, removeDropProperties: new List<string>(["dropAction"]), title: "description view", icon: "sticky-note" });          doc.queryBtn = ficon({ onDragStart: ScriptField.MakeFunction('getCopy(this.dragFactory, true)'), dragFactory: queryTemplate, removeDropProperties: new List<string>(["dropAction"]), title: "query view", icon: "sticky-note" }); -        doc.templateButtons = blist({ title: "template buttons" }, [doc.slidesBtn as Doc, doc.descriptionBtn as Doc, doc.queryBtn as Doc]); -        doc.expandingButtons = blist({ title: "expanding buttons" }, [doc.undoBtn as Doc, doc.redoBtn as Doc, doc.templateButtons as Doc]); -        doc.templateDocs = new PrefetchProxy(Docs.Create.TreeDocument([doc.noteTypes as Doc, doc.templateButtons as Doc], { +        doc.templateButtons = blist({ title: "template buttons", ignoreClick: true }, [doc.slidesBtn as Doc, doc.descriptionBtn as Doc, doc.queryBtn as Doc]); +        doc.expandingButtons = blist({ title: "expanding buttons", ignoreClick: true }, [doc.undoBtn as Doc, doc.redoBtn as Doc, doc.templateButtons as Doc]); +        doc.templateDocs = new PrefetchProxy(Docs.Create.TreeDocument([doc.noteTypes as Doc, doc.templateButtons as Doc, doc.clickFuncs as Doc], {              title: "template layouts", _xPadding: 0,              dropConverter: ScriptField.MakeScript("convertToButtons(dragData)", { dragData: DragManager.DocumentDragData.name })          })); @@ -324,7 +330,7 @@ export class CurrentUserUtils {      // the initial presentation Doc to use      static setupDefaultPresentation(doc: Doc) { -        doc.presentationTemplate = new PrefetchProxy(Docs.Create.PresElementBoxDocument({ backgroundColor: "transparent", _xMargin: 5, _height: 46, isTemplateDoc: true, isTemplateForField: "data" })); +        doc.presentationTemplate = new PrefetchProxy(Docs.Create.PresElementBoxDocument({ title: "pres element template", backgroundColor: "transparent", _xMargin: 5, _height: 46, isTemplateDoc: true, isTemplateForField: "data" }));          doc.curPresentation = Docs.Create.PresDocument(new List<Doc>(), { title: "Presentation", _viewType: CollectionViewType.Stacking, _LODdisable: true, _chromeStatus: "replaced", _showTitle: "title", boxShadow: "0 0" });      } @@ -332,21 +338,37 @@ export class CurrentUserUtils {          doc.optionalRightCollection = new PrefetchProxy(Docs.Create.StackingDocument([], { title: "New mobile uploads" }));      } +    static setupChildClicks(doc: Doc) { +        const openInTarget = Docs.Create.ScriptingDocument(ScriptField.MakeScript( +            "docCast(thisContainer.target).then((target) => { target && docCast(this.source).then((source) => { target.proto.data = new List([source || this]); } ); } )", +            { target: Doc.name }), { title: "On Child Clicked (open in target)", _width: 300, _height: 200 }); +        const onClick = Docs.Create.ScriptingDocument(undefined, { title: "onClick", "onClick-rawScript": "console.log('click')", isTemplateDoc: true, isTemplateForField: "onClick", _width: 300, _height: 200 }, "onClick"); +        const onCheckedClick = Docs.Create.ScriptingDocument(undefined, +            { title: "onCheckedClick", "onCheckedClick-rawScript": "console.log(heading + checked + containingTreeView)", "onCheckedClick-params": new List<string>(["heading", "checked", "containingTreeView"]), isTemplateDoc: true, isTemplateForField: "onCheckedClick", _width: 300, _height: 200 }, "onCheckedClick"); +        doc.childClickFuncs = Docs.Create.TreeDocument([openInTarget], { title: "on Child Click function templates" }); +        doc.clickFuncs = Docs.Create.TreeDocument([onClick, onCheckedClick], { title: "onClick funcs" }); +    } +      static updateUserDocument(doc: Doc) {          doc.title = Doc.CurrentUserEmail;          new InkingControl();          (doc.iconTypes === undefined) && CurrentUserUtils.setupDefaultIconTypes(doc);          (doc.noteTypes === undefined) && CurrentUserUtils.setupDefaultDocTemplates(doc); +        (doc.childClickFuncs === undefined) && CurrentUserUtils.setupChildClicks(doc);          (doc.optionalRightCollection === undefined) && CurrentUserUtils.setupMobileUploads(doc);          (doc.overlays === undefined) && CurrentUserUtils.setupOverlays(doc);          (doc.expandingButtons === undefined) && CurrentUserUtils.setupExpandingButtons(doc);          (doc.curPresentation === undefined) && CurrentUserUtils.setupDefaultPresentation(doc);          (doc.sidebarButtons === undefined) && CurrentUserUtils.setupSidebarButtons(doc); +        // this is equivalent to using PrefetchProxies to make sure all the childClickFuncs have been retrieved. +        PromiseValue(Cast(doc.childClickFuncs, Doc)).then(func => func && PromiseValue(func.data).then(DocListCast));          // this is equivalent to using PrefetchProxies to make sure the recentlyClosed doc is ready          PromiseValue(Cast(doc.recentlyClosed, Doc)).then(recent => recent && PromiseValue(recent.data).then(DocListCast));          // this is equivalent to using PrefetchProxies to make sure all the sidebarButtons and noteType internal Doc's have been retrieved.          PromiseValue(Cast(doc.noteTypes, Doc)).then(noteTypes => noteTypes && PromiseValue(noteTypes.data).then(DocListCast)); +        PromiseValue(Cast(doc.clickFuncs, Doc)).then(func => func && PromiseValue(func.data).then(DocListCast)); +        PromiseValue(Cast(doc.childClickFuncs, Doc)).then(func => func && PromiseValue(func.data).then(DocListCast));          PromiseValue(Cast(doc.sidebarButtons, Doc)).then(stackingDoc => {              stackingDoc && PromiseValue(Cast(stackingDoc.data, listSpec(Doc))).then(sidebarButtons => {                  sidebarButtons && sidebarButtons.map((sidebarBtn, i) => { @@ -396,77 +418,6 @@ export class CurrentUserUtils {                  throw new Error("There should be a user id! Why does Dash think there isn't one?");              }          }); -        // try { -        //     const getEnvironment = await fetch("/assets/env.json", { redirect: "follow", method: "GET", credentials: "include" }); -        //     NorthstarSettings.Instance.UpdateEnvironment(await getEnvironment.json()); -        //     await Gateway.Instance.ClearCatalog(); -        //     const extraSchemas = Cast(CurrentUserUtils.UserDocument.DBSchemas, listSpec("string"), []); -        //     let extras = await Promise.all(extraSchemas.map(sc => Gateway.Instance.GetSchema("", sc))); -        //     let catprom = CurrentUserUtils.SetNorthstarCatalog(await Gateway.Instance.GetCatalog(), extras); -        //     // if (catprom) await Promise.all(catprom); -        // } catch (e) { - -        // } -    } - -    /* Northstar catalog ... really just for testing so this should eventually go away */ -    // --------------- Northstar hooks ------------- / -    static _northstarSchemas: Doc[] = []; -    @observable private static _northstarCatalog?: Catalog; -    @computed public static get NorthstarDBCatalog() { return this._northstarCatalog; } - -    @action static SetNorthstarCatalog(ctlog: Catalog, extras: Catalog[]) { -        CurrentUserUtils.NorthstarDBCatalog = ctlog; -        // if (ctlog && ctlog.schemas) { -        //     extras.map(ex => ctlog.schemas!.push(ex)); -        //     return ctlog.schemas.map(async schema => { -        //         let schemaDocuments: Doc[] = []; -        //         let attributesToBecomeDocs = CurrentUserUtils.GetAllNorthstarColumnAttributes(schema); -        //         await Promise.all(attributesToBecomeDocs.reduce((promises, attr) => { -        //             promises.push(DocServer.GetRefField(attr.displayName! + ".alias").then(action((field: Opt<Field>) => { -        //                 if (field instanceof Doc) { -        //                     schemaDocuments.push(field); -        //                 } else { -        //                     var atmod = new ColumnAttributeModel(attr); -        //                     let histoOp = new HistogramOperation(schema.displayName!, -        //                         new AttributeTransformationModel(atmod, AggregateFunction.None), -        //                         new AttributeTransformationModel(atmod, AggregateFunction.Count), -        //                         new AttributeTransformationModel(atmod, AggregateFunction.Count)); -        //                     schemaDocuments.push(Docs.Create.HistogramDocument(histoOp, { width: 200, height: 200, title: attr.displayName! })); -        //                 } -        //             }))); -        //             return promises; -        //         }, [] as Promise<void>[])); -        //         return CurrentUserUtils._northstarSchemas.push(Docs.Create.TreeDocument(schemaDocuments, { width: 50, height: 100, title: schema.displayName! })); -        //     }); -        // } -    } -    public static set NorthstarDBCatalog(ctlog: Catalog | undefined) { this._northstarCatalog = ctlog; } - -    public static AddNorthstarSchema(schema: Schema, schemaDoc: Doc) { -        if (this._northstarCatalog && CurrentUserUtils._northstarSchemas) { -            this._northstarCatalog.schemas!.push(schema); -            CurrentUserUtils._northstarSchemas.push(schemaDoc); -            const schemas = Cast(CurrentUserUtils.UserDocument.DBSchemas, listSpec("string"), []); -            schemas.push(schema.displayName!); -            CurrentUserUtils.UserDocument.DBSchemas = new List<string>(schemas); -        } -    } -    public static GetNorthstarSchema(name: string): Schema | undefined { -        return !this._northstarCatalog || !this._northstarCatalog.schemas ? undefined : -            ArrayUtil.FirstOrDefault<Schema>(this._northstarCatalog.schemas, (s: Schema) => s.displayName === name); -    } -    public static GetAllNorthstarColumnAttributes(schema: Schema) { -        const recurs = (attrs: Attribute[], g?: AttributeGroup) => { -            if (g && g.attributes) { -                attrs.push.apply(attrs, g.attributes); -                if (g.attributeGroups) { -                    g.attributeGroups.forEach(ng => recurs(attrs, ng)); -                } -            } -            return attrs; -        }; -        return recurs([] as Attribute[], schema ? schema.rootAttributeGroup : undefined);      }  } | 
