aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/views/Main.tsx132
-rw-r--r--src/fields/KeyStore.ts2
-rw-r--r--src/mobile/ImageUpload.tsx38
-rw-r--r--src/server/RouteStore.ts5
-rw-r--r--src/server/authentication/controllers/WorkspacesMenu.tsx19
-rw-r--r--src/server/authentication/controllers/user_controller.ts3
-rw-r--r--src/server/authentication/models/current_user_utils.ts46
-rw-r--r--src/server/authentication/models/user_model.ts11
-rw-r--r--src/server/index.ts33
9 files changed, 144 insertions, 145 deletions
diff --git a/src/client/views/Main.tsx b/src/client/views/Main.tsx
index ac51a7d87..a1a6cc475 100644
--- a/src/client/views/Main.tsx
+++ b/src/client/views/Main.tsx
@@ -8,6 +8,7 @@ import "./Main.scss";
import { MessageStore } from '../../server/Message';
import { Utils } from '../../Utils';
import * as request from 'request'
+import * as rp from 'request-promise'
import { Documents } from '../documents/Documents';
import { Server } from '../Server';
import { setupDrag } from '../util/DragManager';
@@ -40,7 +41,7 @@ import Measure from 'react-measure';
import { DashUserModel } from '../../server/authentication/models/user_model';
import { ServerUtils } from '../../server/ServerUtil';
import { CurrentUserUtils } from '../../server/authentication/models/current_user_utils';
-import { Field, Opt } from '../../fields/Field';
+import { Field, Opt, FieldWaiting } from '../../fields/Field';
import { ListField } from '../../fields/ListField';
import { map } from 'bluebird';
import { Gateway, Settings } from '../northstar/manager/Gateway';
@@ -49,13 +50,26 @@ import { Catalog } from '../northstar/model/idea/idea';
@observer
export class Main extends React.Component {
// dummy initializations keep the compiler happy
- @observable private mainContainer?: Document;
@observable private mainfreeform?: Document;
- @observable private userWorkspaces: Document[] = [];
@observable public pwidth: number = 0;
@observable public pheight: number = 0;
@observable private _northstarCatalog: Catalog | undefined = undefined;
+ @computed private get mainContainer(): Document | undefined {
+ let doc = this.userDocument.GetT(KeyStore.ActiveWorkspace, Document);
+ return doc == FieldWaiting ? undefined : doc;
+ }
+
+ private set mainContainer(doc: Document | undefined) {
+ if (doc) {
+ this.userDocument.Set(KeyStore.ActiveWorkspace, doc);
+ }
+ }
+
+ private get userDocument(): Document {
+ return CurrentUserUtils.UserDocument;
+ }
+
public mainDocId: string | undefined;
private currentUser?: DashUserModel;
public static Instance: Main;
@@ -67,12 +81,12 @@ export class Main extends React.Component {
configure({ enforceActions: "observed" });
if (window.location.pathname !== RouteStore.home) {
let pathname = window.location.pathname.split("/");
- this.mainDocId = pathname[pathname.length - 1];
+ if (pathname.length > 1 && pathname[pathname.length - 2] == 'doc') {
+ this.mainDocId = pathname[pathname.length - 1];
+ }
};
- this.initializeNorthstar();
-
- CurrentUserUtils.loadCurrentUser();
+ // this.initializeNorthstar();
library.add(faFont);
library.add(faImage);
@@ -143,63 +157,50 @@ export class Main extends React.Component {
initAuthenticationRouters = () => {
// Load the user's active workspace, or create a new one if initial session after signup
- request.get(ServerUtils.prepend(RouteStore.getActiveWorkspace), (error, response, body) => {
- if (this.mainDocId || body) {
- Server.GetField(this.mainDocId || body, field => {
- if (field instanceof Document) {
- this.openWorkspace(field);
- this.populateWorkspaces();
- } else {
- this.createNewWorkspace(true, this.mainDocId);
- }
- });
- } else {
- this.createNewWorkspace(true, this.mainDocId);
- }
- });
- }
-
- @action
- createNewWorkspace = (init: boolean, id?: string): void => {
- let mainDoc = Documents.DockDocument(JSON.stringify({ content: [{ type: 'row', content: [] }] }), { title: `Main Container ${this.userWorkspaces.length + 1}` }, id);
- let newId = mainDoc.Id;
- request.post(ServerUtils.prepend(RouteStore.addWorkspace), {
- body: { target: newId },
- json: true
- }, () => { if (init) this.populateWorkspaces(); });
-
- // bcz: strangely, we need a timeout to prevent exceptions/issues initializing GoldenLayout (the rendering engine for Main Container)
- setTimeout(() => {
- let freeformDoc = Documents.FreeformDocument([], { x: 0, y: 400, title: "mini collection" });
- var dockingLayout = { content: [{ type: 'row', content: [CollectionDockingView.makeDocumentConfig(freeformDoc)] }] };
- mainDoc.SetText(KeyStore.Data, JSON.stringify(dockingLayout));
- mainDoc.Set(KeyStore.ActiveFrame, freeformDoc);
- this.openWorkspace(mainDoc);
- let pendingDocument = Documents.SchemaDocument([], { title: "New Mobile Uploads" })
- mainDoc.Set(KeyStore.OptionalRightCollection, pendingDocument);
- }, 0);
- this.userWorkspaces.push(mainDoc);
+ if (!this.mainDocId) {
+ this.userDocument.GetTAsync(KeyStore.ActiveWorkspace, Document).then(doc => {
+ if (doc) {
+ this.openWorkspace(doc);
+ } else {
+ this.createNewWorkspace();
+ }
+ })
+ } else {
+ Server.GetField(this.mainDocId).then(field => {
+ if (field instanceof Document) {
+ this.openWorkspace(field)
+ } else {
+ this.createNewWorkspace(this.mainDocId);
+ }
+ })
+ }
}
@action
- populateWorkspaces = () => {
- // retrieve all workspace documents from the server
- request.get(ServerUtils.prepend(RouteStore.getAllWorkspaces), (error, res, body) => {
- let ids = JSON.parse(body) as string[];
- Server.GetFields(ids, action((fields: { [id: string]: Field }) => this.userWorkspaces = ids.map(id => fields[id] as Document)));
- });
+ createNewWorkspace = (id?: string): void => {
+ this.userDocument.GetTAsync<ListField<Document>>(KeyStore.Workspaces, ListField).then(action((list: Opt<ListField<Document>>) => {
+ if (list) {
+ let freeformDoc = Documents.FreeformDocument([], { x: 0, y: 400, title: "mini collection" });
+ var dockingLayout = { content: [{ type: 'row', content: [CollectionDockingView.makeDocumentConfig(freeformDoc)] }] };
+ let mainDoc = Documents.DockDocument(JSON.stringify(dockingLayout), { title: `Main Container ${list.Data.length + 1}` }, id);
+ list.Data.push(mainDoc);
+ // bcz: strangely, we need a timeout to prevent exceptions/issues initializing GoldenLayout (the rendering engine for Main Container)
+ setTimeout(() => {
+ mainDoc.Set(KeyStore.ActiveFrame, freeformDoc);
+ this.openWorkspace(mainDoc);
+ let pendingDocument = Documents.SchemaDocument([], { title: "New Mobile Uploads" })
+ mainDoc.Set(KeyStore.OptionalRightCollection, pendingDocument);
+ }, 0);
+ }
+ }));
}
@action
openWorkspace = (doc: Document, fromHistory = false): void => {
- request.post(ServerUtils.prepend(RouteStore.setActiveWorkspace), {
- body: { target: doc.Id },
- json: true
- });
this.mainContainer = doc;
fromHistory || window.history.pushState(null, doc.Title, "/doc/" + doc.Id);
this.mainContainer.GetTAsync(KeyStore.ActiveFrame, Document, field => this.mainfreeform = field);
- this.mainContainer.GetTAsync(KeyStore.OptionalRightCollection, Document, col => {
+ this.userDocument.GetTAsync(KeyStore.OptionalRightCollection, Document).then(col => {
// if there is a pending doc, and it has new data, show it (syip: we use a timeout to prevent collection docking view from being uninitialized)
setTimeout(() => {
if (col) {
@@ -213,10 +214,15 @@ export class Main extends React.Component {
});
}
+ @observable
+ workspacesShown: boolean = false;
+
+ areWorkspacesShown = () => {
+ return this.workspacesShown;
+ }
+ @action
toggleWorkspaces = () => {
- if (WorkspacesMenu.Instance) {
- WorkspacesMenu.Instance.toggle()
- }
+ this.workspacesShown = !this.workspacesShown;
}
screenToLocalTransform = () => Transform.Identity
@@ -310,6 +316,12 @@ export class Main extends React.Component {
}
render() {
+ let workspaceMenu: any = null;
+ let workspaces = this.userDocument.GetT<ListField<Document>>(KeyStore.Workspaces, ListField);
+ if (workspaces && workspaces !== FieldWaiting) {
+ workspaceMenu = <WorkspacesMenu active={this.mainContainer} open={this.openWorkspace} new={this.createNewWorkspace} allWorkspaces={workspaces.Data}
+ isShown={this.areWorkspacesShown} toggle={this.toggleWorkspaces} />
+ }
return (
<div id="main-div">
<Measure onResize={(r: any) => runInAction(() => {
@@ -326,11 +338,13 @@ export class Main extends React.Component {
<ContextMenu />
{this.nodesMenu}
{this.miscButtons}
- <WorkspacesMenu active={this.mainContainer} open={this.openWorkspace} new={this.createNewWorkspace} allWorkspaces={this.userWorkspaces} />
+ {workspaceMenu}
<InkingControl />
</div>
);
}
}
-ReactDOM.render(<Main />, document.getElementById('root'));
+CurrentUserUtils.loadCurrentUser().then(() => {
+ ReactDOM.render(<Main />, document.getElementById('root'));
+});
diff --git a/src/fields/KeyStore.ts b/src/fields/KeyStore.ts
index 68883d6f1..891caaa81 100644
--- a/src/fields/KeyStore.ts
+++ b/src/fields/KeyStore.ts
@@ -28,6 +28,7 @@ export namespace KeyStore {
export const SchemaSplitPercentage = new Key("SchemaSplitPercentage");
export const Caption = new Key("Caption");
export const ActiveFrame = new Key("ActiveFrame");
+ export const ActiveWorkspace = new Key("ActiveWorkspace");
export const DocumentText = new Key("DocumentText");
export const LinkedToDocs = new Key("LinkedToDocs");
export const LinkedFromDocs = new Key("LinkedFromDocs");
@@ -41,4 +42,5 @@ export namespace KeyStore {
export const OptionalRightCollection = new Key("OptionalRightCollection");
export const Archives = new Key("Archives");
export const Updated = new Key("Updated");
+ export const Workspaces = new Key("Workspaces");
}
diff --git a/src/mobile/ImageUpload.tsx b/src/mobile/ImageUpload.tsx
index 16808a598..47b9d8f0b 100644
--- a/src/mobile/ImageUpload.tsx
+++ b/src/mobile/ImageUpload.tsx
@@ -7,7 +7,7 @@ import { Server } from '../client/Server';
import { Documents } from '../client/documents/Documents';
import { ListField } from '../fields/ListField';
import { ImageField } from '../fields/ImageField';
-import request = require('request');
+import * as rp from 'request-promise'
import { ServerUtils } from '../server/ServerUtil';
import { RouteStore } from '../server/RouteStore';
@@ -40,28 +40,24 @@ const onFileLoad = (file: any) => {
json.map((file: any) => {
let path = window.location.origin + file
var doc: Document = Documents.ImageDocument(path, { nativeWidth: 200, width: 200 })
- doc.GetTAsync(KeyStore.Data, ImageField, (i) => {
- if (i) {
- document.getElementById("message")!.innerText = i.Data.href;
+
+ rp.get(ServerUtils.prepend(RouteStore.getUserDocumentId)).then(res => {
+ if (res) {
+ return Server.GetField(res);
+ }
+ throw new Error("No user id returned");
+ }).then(field => {
+ if (field instanceof Document) {
+ return field.GetTAsync(KeyStore.OptionalRightCollection, Document)
}
- })
- request.get(ServerUtils.prepend(RouteStore.getActiveWorkspace), (error, response, body) => {
- if (body) {
- Server.GetField(body, field => {
- if (field instanceof Document) {
- field.GetTAsync(KeyStore.OptionalRightCollection, Document,
- pending => {
- if (pending) {
- pending.GetOrCreateAsync(KeyStore.Data, ListField, list => {
- list.Data.push(doc);
- })
- }
- })
- }
- }
- );
+ }).then(pending => {
+ if (pending) {
+ pending.GetOrCreateAsync(KeyStore.Data, ListField, list => {
+ list.Data.push(doc);
+ })
}
- })
+ });
+
// console.log(window.location.origin + file[0])
//imgPrev.setAttribute("src", window.location.origin + files[0].name)
diff --git a/src/server/RouteStore.ts b/src/server/RouteStore.ts
index fb06b878b..fdf5b6a5c 100644
--- a/src/server/RouteStore.ts
+++ b/src/server/RouteStore.ts
@@ -15,10 +15,7 @@ export enum RouteStore {
// USER AND WORKSPACES
getCurrUser = "/getCurrentUser",
- addWorkspace = "/addWorkspaceId",
- getAllWorkspaces = "/getAllWorkspaceIds",
- getActiveWorkspace = "/getActiveWorkspaceId",
- setActiveWorkspace = "/setActiveWorkspaceId",
+ getUserDocumentId = "/getUserDocumentId",
updateCursor = "/updateCursor",
openDocumentWithId = "/doc/:docId",
diff --git a/src/server/authentication/controllers/WorkspacesMenu.tsx b/src/server/authentication/controllers/WorkspacesMenu.tsx
index 1533b1e62..8e14cf98e 100644
--- a/src/server/authentication/controllers/WorkspacesMenu.tsx
+++ b/src/server/authentication/controllers/WorkspacesMenu.tsx
@@ -9,30 +9,23 @@ import { KeyStore } from '../../../fields/KeyStore';
export interface WorkspaceMenuProps {
active: Document | undefined;
open: (workspace: Document) => void;
- new: (init: boolean) => void;
+ new: () => void;
allWorkspaces: Document[];
+ isShown: () => boolean;
+ toggle: () => void;
}
@observer
export class WorkspacesMenu extends React.Component<WorkspaceMenuProps> {
- static Instance: WorkspacesMenu;
- @observable private workspacesExposed: boolean = false;
-
constructor(props: WorkspaceMenuProps) {
super(props);
- WorkspacesMenu.Instance = this;
this.addNewWorkspace = this.addNewWorkspace.bind(this);
}
@action
addNewWorkspace() {
- this.props.new(false);
- this.toggle();
- }
-
- @action
- toggle() {
- this.workspacesExposed = !this.workspacesExposed;
+ this.props.new();
+ this.props.toggle();
}
render() {
@@ -45,7 +38,7 @@ export class WorkspacesMenu extends React.Component<WorkspaceMenuProps> {
borderRadius: 5,
position: "absolute",
top: 78,
- left: this.workspacesExposed ? 11 : -500,
+ left: this.props.isShown() ? 11 : -500,
background: "white",
border: "black solid 2px",
transition: "all 1s ease",
diff --git a/src/server/authentication/controllers/user_controller.ts b/src/server/authentication/controllers/user_controller.ts
index 2cef958e8..e365b8dce 100644
--- a/src/server/authentication/controllers/user_controller.ts
+++ b/src/server/authentication/controllers/user_controller.ts
@@ -11,6 +11,7 @@ import * as async from 'async';
import * as nodemailer from 'nodemailer';
import c = require("crypto");
import { RouteStore } from "../../RouteStore";
+import { Utils } from "../../../Utils";
/**
* GET /signup
@@ -54,7 +55,7 @@ export let postSignup = (req: Request, res: Response, next: NextFunction) => {
const user = new User({
email,
password,
- userDoc: "document here"
+ userDocumentId: Utils.GenerateGuid()
});
User.findOne({ email }, (err, existingUser) => {
diff --git a/src/server/authentication/models/current_user_utils.ts b/src/server/authentication/models/current_user_utils.ts
index cc433eb73..17a6d493b 100644
--- a/src/server/authentication/models/current_user_utils.ts
+++ b/src/server/authentication/models/current_user_utils.ts
@@ -1,29 +1,61 @@
import { DashUserModel } from "./user_model";
-import * as request from 'request'
+import * as rp from 'request-promise';
import { RouteStore } from "../../RouteStore";
import { ServerUtils } from "../../ServerUtil";
+import { Server } from "../../../client/Server";
+import { Document } from "../../../fields/Document";
+import { KeyStore } from "../../../fields/KeyStore";
+import { ListField } from "../../../fields/ListField";
+import { Documents } from "../../../client/documents/Documents";
export class CurrentUserUtils {
private static curr_email: string;
private static curr_id: string;
+ private static user_document: Document;
- public static get email() {
+ public static get email(): string {
return CurrentUserUtils.curr_email;
}
- public static get id() {
+ public static get id(): string {
return CurrentUserUtils.curr_id;
}
- public static loadCurrentUser() {
- request.get(ServerUtils.prepend(RouteStore.getCurrUser), (error, response, body) => {
- if (body) {
- let obj = JSON.parse(body);
+ public static get UserDocument(): Document {
+ return CurrentUserUtils.user_document;
+ }
+
+ private static createUserDocument(id: string): Document {
+ let doc = new Document(id);
+
+ doc.Set(KeyStore.Workspaces, new ListField<Document>());
+ doc.Set(KeyStore.OptionalRightCollection, Documents.SchemaDocument([], { title: "Pending documents" }))
+ return doc;
+ }
+
+ public static loadCurrentUser(): Promise<any> {
+ let userPromise = rp.get(ServerUtils.prepend(RouteStore.getCurrUser)).then((response) => {
+ if (response) {
+ let obj = JSON.parse(response);
CurrentUserUtils.curr_id = obj.id as string;
CurrentUserUtils.curr_email = obj.email as string;
} else {
throw new Error("There should be a user! Why does Dash think there isn't one?")
}
});
+ let userDocPromise = rp.get(ServerUtils.prepend(RouteStore.getUserDocumentId)).then(id => {
+ if (id) {
+ return Server.GetField(id).then(field => {
+ if (field instanceof Document) {
+ this.user_document = field;
+ } else {
+ this.user_document = this.createUserDocument(id);
+ }
+ })
+ } else {
+ throw new Error("There should be a user id! Why does Dash think there isn't one?")
+ }
+ });
+ return Promise.all([userPromise, userDocPromise]);
}
} \ No newline at end of file
diff --git a/src/server/authentication/models/user_model.ts b/src/server/authentication/models/user_model.ts
index 3d4ed6896..81580aad5 100644
--- a/src/server/authentication/models/user_model.ts
+++ b/src/server/authentication/models/user_model.ts
@@ -21,9 +21,7 @@ export type DashUserModel = mongoose.Document & {
passwordResetToken: string | undefined,
passwordResetExpires: Date | undefined,
- allWorkspaceIds: Array<String>,
- activeWorkspaceId: String,
- activeUsersId: String,
+ userDocumentId: string;
profile: {
name: string,
@@ -49,12 +47,7 @@ const userSchema = new mongoose.Schema({
passwordResetToken: String,
passwordResetExpires: Date,
- allWorkspaceIds: {
- type: Array,
- default: []
- },
- activeWorkspaceId: String,
- activeUsersId: String,
+ userDocumentId: String,
facebook: String,
twitter: String,
diff --git a/src/server/index.ts b/src/server/index.ts
index d1eb6847d..16304f1c5 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -156,16 +156,9 @@ addSecureRoute(
addSecureRoute(
Method.GET,
- (user, res) => res.send(user.activeWorkspaceId || ""),
+ (user, res) => res.send(user.userDocumentId || ""),
undefined,
- RouteStore.getActiveWorkspace,
-);
-
-addSecureRoute(
- Method.GET,
- (user, res) => res.send(JSON.stringify(user.allWorkspaceIds)),
- undefined,
- RouteStore.getAllWorkspaces
+ RouteStore.getUserDocumentId,
);
addSecureRoute(
@@ -185,28 +178,6 @@ addSecureRoute(
addSecureRoute(
Method.POST,
(user, res, req) => {
- user.update({ $set: { activeWorkspaceId: req.body.target } }, (err, raw) => {
- res.sendStatus(err ? 500 : 200);
- });
- },
- undefined,
- RouteStore.setActiveWorkspace
-);
-
-addSecureRoute(
- Method.POST,
- (user, res, req) => {
- user.update({ $push: { allWorkspaceIds: req.body.target } }, (err, raw) => {
- res.sendStatus(err ? 500 : 200);
- });
- },
- undefined,
- RouteStore.addWorkspace
-);
-
-addSecureRoute(
- Method.POST,
- (user, res, req) => {
let form = new formidable.IncomingForm()
form.uploadDir = __dirname + "/public/files/"
form.keepExtensions = true