aboutsummaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
Diffstat (limited to 'src/client')
-rw-r--r--src/client/views/Main.tsx24
-rw-r--r--src/client/views/collections/CollectionFreeFormView.tsx38
-rw-r--r--src/client/views/collections/CollectionViewBase.tsx44
3 files changed, 55 insertions, 51 deletions
diff --git a/src/client/views/Main.tsx b/src/client/views/Main.tsx
index 268f70de1..fd756972b 100644
--- a/src/client/views/Main.tsx
+++ b/src/client/views/Main.tsx
@@ -39,6 +39,8 @@ import { faFilm } from '@fortawesome/free-solid-svg-icons';
import { faMusic } from '@fortawesome/free-solid-svg-icons';
import Measure from 'react-measure';
import { DashUserModel } from '../../server/authentication/models/user_model';
+import { ServerUtils } from '../../server/ServerUtil';
+import { UserUtils } from '../../server/authentication/models/user_utils';
@observer
export class Main extends React.Component {
@@ -61,6 +63,8 @@ export class Main extends React.Component {
this.mainDocId = pathname[pathname.length - 1];
}
+ UserUtils.loadCurrentUserId();
+
library.add(faFont);
library.add(faImage);
library.add(faFilePdf);
@@ -77,14 +81,6 @@ export class Main extends React.Component {
Documents.initProtos(() => {
this.initAuthenticationRouters();
});
-
- request.get(this.prepend(RouteStore.getCurrUser), (error, response, body) => {
- if (body) {
- this.currentUser = body as DashUserModel;
- } else {
- throw new Error("There should be a user! Why does Dash think there isn't one?")
- }
- })
}
initEventListeners = () => {
@@ -101,7 +97,7 @@ 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(this.prepend(RouteStore.getActiveWorkspace), (error, response, body) => {
+ request.get(ServerUtils.prepend(RouteStore.getActiveWorkspace), (error, response, body) => {
if (this.mainDocId || body) {
Server.GetField(this.mainDocId || body, field => {
if (field instanceof Document) {
@@ -122,7 +118,7 @@ export class Main extends React.Component {
createNewWorkspace = (init: boolean): void => {
let mainDoc = Documents.DockDocument(JSON.stringify({ content: [{ type: 'row', content: [] }] }), { title: `Main Container ${this.userWorkspaces.length + 1}` });
let newId = mainDoc.Id;
- request.post(this.prepend(RouteStore.addWorkspace), {
+ request.post(ServerUtils.prepend(RouteStore.addWorkspace), {
body: { target: newId },
json: true
}, () => { if (init) this.populateWorkspaces(); });
@@ -141,7 +137,7 @@ export class Main extends React.Component {
@action
populateWorkspaces = () => {
// retrieve all workspace documents from the server
- request.get(this.prepend(RouteStore.getAllWorkspaces), (error, res, body) => {
+ 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)));
});
@@ -149,7 +145,7 @@ export class Main extends React.Component {
@action
openWorkspace = (doc: Document): void => {
- request.post(this.prepend(RouteStore.setActiveWorkspace), {
+ request.post(ServerUtils.prepend(RouteStore.setActiveWorkspace), {
body: { target: doc.Id },
json: true
});
@@ -163,8 +159,6 @@ export class Main extends React.Component {
}
}
- prepend = (extension: string) => window.location.origin + extension;
-
render() {
let imgRef = React.createRef<HTMLDivElement>();
let pdfRef = React.createRef<HTMLDivElement>();
@@ -233,7 +227,7 @@ export class Main extends React.Component {
<div className="main-buttonDiv" style={{ top: '34px', left: '2px', position: 'absolute' }} ref={workspacesRef}>
<button onClick={this.toggleWorkspaces}>Workspaces</button></div>
<div className="main-buttonDiv" style={{ top: '34px', right: '1px', position: 'absolute' }} ref={logoutRef}>
- <button onClick={() => request.get(this.prepend(RouteStore.logout), () => { })}>Log Out</button></div>
+ <button onClick={() => request.get(ServerUtils.prepend(RouteStore.logout), () => { })}>Log Out</button></div>
<WorkspacesMenu active={this.mainContainer} open={this.openWorkspace} new={this.createNewWorkspace} allWorkspaces={this.userWorkspaces} />
{/* for the expandable add nodes menu. Not included with the above because once it expands it expands the whole div with it, making canvas interactions limited. */}
diff --git a/src/client/views/collections/CollectionFreeFormView.tsx b/src/client/views/collections/CollectionFreeFormView.tsx
index a3a596c37..89edd1397 100644
--- a/src/client/views/collections/CollectionFreeFormView.tsx
+++ b/src/client/views/collections/CollectionFreeFormView.tsx
@@ -322,7 +322,7 @@ export class CollectionFreeFormView extends CollectionViewBase {
return (
<div className={`collectionfreeformview${this.isAnnotationOverlay ? "-overlay" : "-container"}`}
onPointerDown={this.onPointerDown}
- onPointerMove={(e) => super.setCursorPosition(this.props.ScreenToLocalTransform().transformPoint(e.screenX, e.screenY))}
+ onPointerMove={(e) => super.setCursorPosition(this.getTransform().transformPoint(e.clientX, e.clientY))}
onWheel={this.onPointerWheel}
onDrop={this.onDrop.bind(this)}
onDragOver={this.onDragOver}
@@ -330,20 +330,6 @@ export class CollectionFreeFormView extends CollectionViewBase {
style={{ borderWidth: `${COLLECTION_BORDER_WIDTH}px`, }}
tabIndex={0}
ref={this.createDropTarget}>
- {super.getCursors().map(entry => {
- let point = entry.Data[1]
- return (
- <div
- style={{
- position: 'absolute',
- left: point[0],
- top: point[1],
- borderRadius: "50%",
- background: "pink"
- }}
- />
- );
- })}
<div className="collectionfreeformview"
style={{ transformOrigin: "left top", transform: `translate(${dx}px, ${dy}px) scale(${this.zoomScaling}, ${this.zoomScaling}) translate(${panx}px, ${pany}px)` }}
ref={this._canvasRef}>
@@ -351,11 +337,33 @@ export class CollectionFreeFormView extends CollectionViewBase {
<InkingCanvas getScreenTransform={this.getTransform} Document={this.props.Document} />
<PreviewCursor container={this} addLiveTextDocument={this.addLiveTextBox} getTransform={this.getTransform} />
{this.views}
+ {super.getCursors().map(entry => {
+ if (entry.Data.length > 0) {
+ let point = entry.Data[1]
+ return (
+ <div
+ key={entry.Data[0]}
+ style={{
+ position: 'absolute',
+ transform: `translate(${point[0] - 10}px, ${point[1] - 10}px)`,
+ zIndex: 10000,
+ transformOrigin: 'center center',
+ width: "20px",
+ height: "20px",
+ borderRadius: "50%",
+ background: "pink",
+ border: "2px solid black"
+ }}
+ />
+ );
+ }
+ })}
</div>
<MarqueeView container={this} activeDocuments={this.getActiveDocuments} selectDocuments={this.selectDocuments}
addDocument={this.props.addDocument} removeDocument={this.props.removeDocument}
getMarqueeTransform={this.getMarqueeTransform} getTransform={this.getTransform} />
{this.overlayView}
+
</div>
);
}
diff --git a/src/client/views/collections/CollectionViewBase.tsx b/src/client/views/collections/CollectionViewBase.tsx
index 81d7f4077..02ee49a38 100644
--- a/src/client/views/collections/CollectionViewBase.tsx
+++ b/src/client/views/collections/CollectionViewBase.tsx
@@ -13,8 +13,8 @@ import { Transform } from "../../util/Transform";
import { CollectionView } from "./CollectionView";
import { RouteStore } from "../../../server/RouteStore";
import { TupleField } from "../../../fields/TupleField";
-import { Server } from "mongodb";
import { DashUserModel } from "../../../server/authentication/models/user_model";
+import { UserUtils } from "../../../server/authentication/models/user_utils";
export interface CollectionViewProps {
fieldKey: Key;
@@ -34,10 +34,9 @@ export interface SubCollectionViewProps extends CollectionViewProps {
addDocument: (doc: Document) => void;
removeDocument: (doc: Document) => boolean;
CollectionView: CollectionView;
- currentUser?: DashUserModel;
}
-export type CursorEntry = TupleField<DashUserModel, [number, number]>;
+export type CursorEntry = TupleField<string, [number, number]>;
export class CollectionViewBase extends React.Component<SubCollectionViewProps> {
private dropDisposer?: DragManager.DragDropDisposer;
@@ -50,31 +49,34 @@ export class CollectionViewBase extends React.Component<SubCollectionViewProps>
}
}
+ @action
protected setCursorPosition(position: [number, number]) {
- let user = this.props.currentUser;
- if (user && user.id) {
- let ind;
- let doc = this.props.Document;
- let cursors = doc.GetOrCreate<ListField<CursorEntry>>(KeyStore.Cursors, ListField, false).Data;
- let entry = new TupleField<DashUserModel, [number, number]>([user.id, position]);
- // if ((ind = cursors.findIndex(entry => entry.Data[0] === user.id)) > -1) {
- // cursors[ind] = entry;
- // } else {
- // cursors.push(entry);
- // }
+ let ind;
+ let doc = this.props.Document;
+ let id = UserUtils.currentUserId;
+ if (id) {
+ doc.GetOrCreateAsync<ListField<CursorEntry>>(KeyStore.Cursors, ListField, field => {
+ let cursors = field.Data;
+ if (cursors.length > 0 && (ind = cursors.findIndex(entry => entry.Data[0] === id)) > -1) {
+ cursors[ind].Data[1] = position;
+ } else {
+ let entry = new TupleField<string, [number, number]>([id, position]);
+ cursors.push(entry);
+ }
+ })
+
+
}
}
protected getCursors(): CursorEntry[] {
- let user = this.props.currentUser;
- if (user && user.id) {
- let doc = this.props.Document;
- // return doc.GetList<CursorEntry>(KeyStore.Cursors, []).filter(entry => entry.Data[0] !== user.id);
- }
- return [];
+ let doc = this.props.Document;
+ let id = UserUtils.currentUserId;
+ let cursors = doc.GetList<CursorEntry>(KeyStore.Cursors, []);
+ let notMe = cursors.filter(entry => entry.Data[0] !== id);
+ return id ? notMe : [];
}
-
@undoBatch
@action
protected drop(e: Event, de: DragManager.DropEvent) {