From 95d0f3f9b341020c742cf0df8402a564cc7c5dec Mon Sep 17 00:00:00 2001
From: Jenny Yu <jennyyu212@outlook.com>
Date: Sun, 12 Jun 2022 22:45:23 -0700
Subject: fix: filtering dashboards

---
 src/client/views/DashboardView.tsx | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

(limited to 'src/client/views/DashboardView.tsx')

diff --git a/src/client/views/DashboardView.tsx b/src/client/views/DashboardView.tsx
index efc1644fe..e48c1bde1 100644
--- a/src/client/views/DashboardView.tsx
+++ b/src/client/views/DashboardView.tsx
@@ -40,10 +40,13 @@ export class DashboardView extends React.Component {
       }
 
       getDashboards = () => {
-            const allDashbaords = DocListCast(CurrentUserUtils.MyDashboards.data);
-            // TODO: filter the dashboards
-            // return allDashbaords.filter(...)
-            return allDashbaords
+            const allDashboards = DocListCast(CurrentUserUtils.MyDashboards.data);
+            if (this.selectedDashboardGroup === DashboardGroup.MyDashboards) {
+                  return allDashboards.filter((dashboard) => dashboard.author === Doc.CurrentUserEmail)
+            } else {
+                  allDashboards.map(d => console.log(d.author))
+                  return allDashboards.filter((dashboard) => dashboard.author !== Doc.CurrentUserEmail)
+            }
       }
 
       render() {
-- 
cgit v1.2.3-70-g09d2


From 576e5d1832349ffcf6d64367fa0c35f96e222fe4 Mon Sep 17 00:00:00 2001
From: Jenny Yu <jennyyu212@outlook.com>
Date: Mon, 13 Jun 2022 09:19:24 -0700
Subject: fix: separation between my dashboard and shared dashboards

---
 src/client/views/DashboardView.tsx | 5 ++---
 src/client/views/topbar/TopBar.tsx | 4 ++--
 2 files changed, 4 insertions(+), 5 deletions(-)

(limited to 'src/client/views/DashboardView.tsx')

diff --git a/src/client/views/DashboardView.tsx b/src/client/views/DashboardView.tsx
index e48c1bde1..5aacec61f 100644
--- a/src/client/views/DashboardView.tsx
+++ b/src/client/views/DashboardView.tsx
@@ -42,10 +42,9 @@ export class DashboardView extends React.Component {
       getDashboards = () => {
             const allDashboards = DocListCast(CurrentUserUtils.MyDashboards.data);
             if (this.selectedDashboardGroup === DashboardGroup.MyDashboards) {
-                  return allDashboards.filter((dashboard) => dashboard.author === Doc.CurrentUserEmail)
+                  return allDashboards.filter((dashboard) => Doc.GetProto(dashboard).author === Doc.CurrentUserEmail)
             } else {
-                  allDashboards.map(d => console.log(d.author))
-                  return allDashboards.filter((dashboard) => dashboard.author !== Doc.CurrentUserEmail)
+                  return allDashboards.filter((dashboard) => Doc.GetProto(dashboard).author !== Doc.CurrentUserEmail)
             }
       }
 
diff --git a/src/client/views/topbar/TopBar.tsx b/src/client/views/topbar/TopBar.tsx
index 214fe1dbf..7ff7063cd 100644
--- a/src/client/views/topbar/TopBar.tsx
+++ b/src/client/views/topbar/TopBar.tsx
@@ -69,8 +69,8 @@ export class TopBar extends React.Component {
                                     {CurrentUserUtils.ActiveDashboard ? <div className="topbar-button-text" onClick={() => {SharingManager.Instance.open(undefined, activeDashboard)}}>
                                         {/* TODO: if I have edit access to the dashboard, display share
                                         if this is a shared dashboard, display "view original or view annotated" */}
-                                        { Doc.GetProto(CurrentUserUtils.ActiveDashboard)?.author ===  Doc.CurrentUserEmail ?  "Share": "view original" }
-                                        {/* { GetEffectiveAcl(Doc) === AclAdmin ?  "Share": "view original" } */}
+                                        {/* { Doc.GetProto(CurrentUserUtils.ActiveDashboard)?.author ===  Doc.CurrentUserEmail ?  "Share": "view original" } */}
+                                        { GetEffectiveAcl(Doc.GetProto(CurrentUserUtils.ActiveDashboard)) === AclAdmin ?  "Share": "view original" }
                                     </div> : (null)}
                                     <div className="topbar-button-icon" onClick={() => window.open(
                                           "https://brown-dash.github.io/Dash-Documentation/", "_blank")}>
-- 
cgit v1.2.3-70-g09d2


From 526fb50ba814d91cf9c69d75cb5b95a91c2dd924 Mon Sep 17 00:00:00 2001
From: Jenny Yu <jennyyu212@outlook.com>
Date: Mon, 13 Jun 2022 21:27:33 -0700
Subject: feat: pop up modal for naming dashboard

---
 src/client/util/CurrentUserUtils.ts |  9 +++--
 src/client/views/DashboardView.scss |  2 ++
 src/client/views/DashboardView.tsx  | 71 ++++++++++++++++++++++++-------------
 3 files changed, 55 insertions(+), 27 deletions(-)

(limited to 'src/client/views/DashboardView.tsx')

diff --git a/src/client/util/CurrentUserUtils.ts b/src/client/util/CurrentUserUtils.ts
index 60bfc165b..aa7c2a39b 100644
--- a/src/client/util/CurrentUserUtils.ts
+++ b/src/client/util/CurrentUserUtils.ts
@@ -1222,7 +1222,8 @@ export class CurrentUserUtils {
           Doc.UserDoc().activeDashboard = undefined;
     }
 
-    public static createNewDashboard = async (userDoc: Doc, id?: string) => {
+    public static createNewDashboard = async (userDoc: Doc, id?: string, name?: string) => {
+          console.log(name)
         const presentation = Doc.MakeCopy(userDoc.emptyPresentation as Doc, true);
         const dashboards = await Cast(userDoc.myDashboards, Doc) as Doc;
         const dashboardCount = DocListCast(dashboards.data).length + 1;
@@ -1235,8 +1236,9 @@ export class CurrentUserUtils {
             _backgroundGridShow: true,
             title: `Untitled Tab 1`,
         };
+        const title = name ? name : `Dashboard ${dashboardCount}`
         const freeformDoc = CurrentUserUtils.GuestTarget || Docs.Create.FreeformDocument([], freeformOptions);
-        const dashboardDoc = Docs.Create.StandardCollectionDockingDocument([{ doc: freeformDoc, initialWidth: 600 }], { title: `Dashboard ${dashboardCount}` }, id, "row");
+        const dashboardDoc = Docs.Create.StandardCollectionDockingDocument([{ doc: freeformDoc, initialWidth: 600 }], { title: title }, id, "row");
         freeformDoc.context = dashboardDoc;
 
         // switching the tabs from the datadoc to the regular doc
@@ -1247,7 +1249,8 @@ export class CurrentUserUtils {
         userDoc.activePresentation = presentation;
 
         Doc.AddDocToList(dashboards, "data", dashboardDoc);
-      //   CurrentUserUtils.openDashboard(userDoc, dashboardDoc);
+        // open this new dashboard 
+      //   Doc.UserDoc().activeDashboard = dashboardDoc;
     }
 
     public static GetNewTextDoc(title: string, x: number, y: number, width?: number, height?: number, noMargins?: boolean, annotationOn?: Doc, maxHeight?: number, backgroundColor?: string) {
diff --git a/src/client/views/DashboardView.scss b/src/client/views/DashboardView.scss
index 67587dd2b..06f331c13 100644
--- a/src/client/views/DashboardView.scss
+++ b/src/client/views/DashboardView.scss
@@ -2,6 +2,8 @@
       padding: 50px;
       display: flex;
       flex-direction: row;
+      width: 100%;
+      position: absolute;
 
       .left-menu {
             display: flex;
diff --git a/src/client/views/DashboardView.tsx b/src/client/views/DashboardView.tsx
index 5aacec61f..fa8a98402 100644
--- a/src/client/views/DashboardView.tsx
+++ b/src/client/views/DashboardView.tsx
@@ -1,4 +1,4 @@
-import { action, observable } from "mobx";
+import { action, computed, observable } from "mobx";
 import { extname } from 'path';
 import { observer } from "mobx-react";
 import * as React from 'react';
@@ -8,6 +8,7 @@ import { Cast, ImageCast, StrCast } from "../../fields/Types";
 import { CurrentUserUtils } from "../util/CurrentUserUtils";
 import { UndoManager } from "../util/UndoManager";
 import "./DashboardView.scss"
+import { MainViewModal } from "./MainViewModal";
 
 enum DashboardGroup {
       MyDashboards, SharedDashboards
@@ -18,20 +19,17 @@ export class DashboardView extends React.Component {
 
       //TODO: delete dashboard, share dashboard, etc.
 
-      @observable
-      private selectedDashboardGroup = DashboardGroup.MyDashboards;
+      @observable private selectedDashboardGroup = DashboardGroup.MyDashboards;
+
+      @observable private newDashboardName: string | undefined = undefined;
+      @action abortCreateNewDashboard = () => { this.newDashboardName = undefined }
+      @action setNewDashboardName(name: string) { this.newDashboardName = name}
 
       @action
       selectDashboardGroup = (group: DashboardGroup) => {
             this.selectedDashboardGroup = group
       }
 
-      newDashboard = async () => {
-            const batch = UndoManager.StartBatch("new dash");
-            await CurrentUserUtils.createNewDashboard(Doc.UserDoc());
-            batch.end();
-      }
-
       clickDashboard = async (e: React.MouseEvent, dashboard: Doc) => {
             if (e.detail === 2) {
                   Doc.UserDoc().activeDashboard = dashboard;
@@ -48,24 +46,49 @@ export class DashboardView extends React.Component {
             }
       }
 
+      createNewDashboard = async (name: string) => {
+            const batch = UndoManager.StartBatch("new dash");
+            await CurrentUserUtils.createNewDashboard(Doc.UserDoc(), undefined, name);
+            batch.end();
+            this.abortCreateNewDashboard();
+      }
+
+      @computed
+      get namingInterface() {
+            return <div>
+                  <input className="password-inputs" placeholder="Untitled Dashboard" onChange={e => this.setNewDashboardName((e.target as any).value)} />
+                  <button className="password-submit" onClick={this.abortCreateNewDashboard}>Cancel</button>
+                  <button className="password-submit" onClick={() => { this.createNewDashboard(this.newDashboardName!) }}>Create</button>
+            </div>;
+      }
+
       render() {
-            return <div className="dashboard-view">
-                  <div className="left-menu">
-                        <div className="text-button" onClick={this.newDashboard}>New</div>
-                        <div className={`text-button ${this.selectedDashboardGroup === DashboardGroup.MyDashboards && 'selected'}`}onClick={() => this.selectDashboardGroup(DashboardGroup.MyDashboards) }>My Dashboards</div>
-                        <div className={`text-button ${this.selectedDashboardGroup === DashboardGroup.SharedDashboards && 'selected'}`} onClick={() => this.selectDashboardGroup(DashboardGroup.SharedDashboards) }>Shared Dashboards</div>
-                  </div>
-                  <div className="all-dashboards">
-                        {this.getDashboards().map((dashboard) => {
-                              const href = ImageCast((dashboard.thumb as Doc)?.data)?.url.href;
-                              return <div className="dashboard-container" key={dashboard[Id]} onClick={e => this.clickDashboard(e, dashboard)}>
-                                    <img src={href ?? "https://media.istockphoto.com/photos/hot-air-balloons-flying-over-the-botan-canyon-in-turkey-picture-id1297349747?b=1&k=20&m=1297349747&s=170667a&w=0&h=oH31fJty_4xWl_JQ4OIQWZKP8C6ji9Mz7L4XmEnbqRU="}></img>
-                                    <div className="title"> {StrCast(dashboard.title)} </div>
-                              </div>
+            return <>
+                  <div className="dashboard-view">
+                        <div className="left-menu">
+                              <div className="text-button" onClick={() => { this.setNewDashboardName("") }}>New</div>
+                              <div className={`text-button ${this.selectedDashboardGroup === DashboardGroup.MyDashboards && 'selected'}`} onClick={() => this.selectDashboardGroup(DashboardGroup.MyDashboards)}>My Dashboards</div>
+                              <div className={`text-button ${this.selectedDashboardGroup === DashboardGroup.SharedDashboards && 'selected'}`} onClick={() => this.selectDashboardGroup(DashboardGroup.SharedDashboards)}>Shared Dashboards</div>
+                        </div>
+                        <div className="all-dashboards">
+                              {this.getDashboards().map((dashboard) => {
+                                    const href = ImageCast((dashboard.thumb as Doc)?.data)?.url.href;
+                                    return <div className="dashboard-container" key={dashboard[Id]} onClick={e => this.clickDashboard(e, dashboard)}>
+                                          <img src={href ?? "https://media.istockphoto.com/photos/hot-air-balloons-flying-over-the-botan-canyon-in-turkey-picture-id1297349747?b=1&k=20&m=1297349747&s=170667a&w=0&h=oH31fJty_4xWl_JQ4OIQWZKP8C6ji9Mz7L4XmEnbqRU="}></img>
+                                          <div className="title"> {StrCast(dashboard.title)} </div>
+                                    </div>
 
-                        })}
+                              })}
 
+                        </div>
                   </div>
-            </div>
+                  <MainViewModal
+                        contents={this.namingInterface}
+                        isDisplayed={this.newDashboardName !== undefined}
+                        interactive={true}
+                        closeOnExternalClick={this.abortCreateNewDashboard}
+                        dialogueBoxStyle={{ width: "500px", height: "300px", background: Cast(Doc.SharingDoc().userColor, "string", null) }} />;
+            </>
+
       }
 }
-- 
cgit v1.2.3-70-g09d2


From a42db3ee7baf57772df13726d10c43996039c014 Mon Sep 17 00:00:00 2001
From: Jenny Yu <jennyyu212@outlook.com>
Date: Wed, 15 Jun 2022 13:50:14 -0700
Subject: fix: do not auto create dashboard

---
 src/client/views/DashboardView.scss | 16 ++++++++++++++++
 src/client/views/DashboardView.tsx  | 29 +++++++++++++++++++++++++++--
 src/client/views/MainView.tsx       | 10 ++--------
 src/client/views/topbar/TopBar.scss |  2 +-
 4 files changed, 46 insertions(+), 11 deletions(-)

(limited to 'src/client/views/DashboardView.tsx')

diff --git a/src/client/views/DashboardView.scss b/src/client/views/DashboardView.scss
index 06f331c13..3db23b86f 100644
--- a/src/client/views/DashboardView.scss
+++ b/src/client/views/DashboardView.scss
@@ -47,4 +47,20 @@
             margin: 10px;
             font-weight: 500;
       }
+
+      img {
+            width: auto;
+            height: 80%;
+      }
+
+      .info {
+            display: flex;
+            flex-direction: row;
+            justify-content: space-between;
+            align-items: center;
+      }
+
+      .more {
+            z-index: 100;
+      }
 }
\ No newline at end of file
diff --git a/src/client/views/DashboardView.tsx b/src/client/views/DashboardView.tsx
index fa8a98402..027cfd376 100644
--- a/src/client/views/DashboardView.tsx
+++ b/src/client/views/DashboardView.tsx
@@ -9,11 +9,16 @@ import { CurrentUserUtils } from "../util/CurrentUserUtils";
 import { UndoManager } from "../util/UndoManager";
 import "./DashboardView.scss"
 import { MainViewModal } from "./MainViewModal";
+import { ContextMenu } from "./ContextMenu";
+import { DocumentManager } from "../util/DocumentManager";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
 
 enum DashboardGroup {
       MyDashboards, SharedDashboards
 }
 
+// DashboardView is the view with the dashboard previews, rendered when the app first loads
+
 @observer
 export class DashboardView extends React.Component {
 
@@ -23,7 +28,7 @@ export class DashboardView extends React.Component {
 
       @observable private newDashboardName: string | undefined = undefined;
       @action abortCreateNewDashboard = () => { this.newDashboardName = undefined }
-      @action setNewDashboardName(name: string) { this.newDashboardName = name}
+      @action setNewDashboardName(name: string) { this.newDashboardName = name }
 
       @action
       selectDashboardGroup = (group: DashboardGroup) => {
@@ -75,7 +80,27 @@ export class DashboardView extends React.Component {
                                     const href = ImageCast((dashboard.thumb as Doc)?.data)?.url.href;
                                     return <div className="dashboard-container" key={dashboard[Id]} onClick={e => this.clickDashboard(e, dashboard)}>
                                           <img src={href ?? "https://media.istockphoto.com/photos/hot-air-balloons-flying-over-the-botan-canyon-in-turkey-picture-id1297349747?b=1&k=20&m=1297349747&s=170667a&w=0&h=oH31fJty_4xWl_JQ4OIQWZKP8C6ji9Mz7L4XmEnbqRU="}></img>
-                                          <div className="title"> {StrCast(dashboard.title)} </div>
+                                          <div className="info">
+                                                <div className="title"> {StrCast(dashboard.title)} </div>
+                                                <div className="more" onClick={e => {
+                                                      const dashView = DocumentManager.Instance.getDocumentView(dashboard);
+                                                      console.log(dashView)
+                                                      ContextMenu.Instance.addItem({
+                                                            description: "Share Dashboard", event: async () => {
+                                                               // ...
+                                                            }, icon: "edit"
+                                                      });
+                                                      ContextMenu.Instance.addItem({
+                                                            description: "Delete Dashboard", event: async () => {
+                                                               // ...
+                                                            }, icon: "trash"
+                                                      });
+                                                      dashView?.showContextMenu(e.clientX + 20, e.clientY + 30);
+                                                }}>
+                                                      <FontAwesomeIcon color="black" size="lg" icon="bars" />
+                                                </div>
+                                          </div>
+
                                     </div>
 
                               })}
diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index 5fd76c388..c32198f68 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -222,16 +222,10 @@ export class MainView extends React.Component {
     }
 
     initAuthenticationRouters = async () => {
-        // Load the user's active dashboard, or create a new one if initial session after signup
         const received = CurrentUserUtils.MainDocId;
         if (received && !this.userDoc) {
-            reaction(() => CurrentUserUtils.GuestTarget, target => target && CurrentUserUtils.createNewDashboard(Doc.UserDoc()), { fireImmediately: true });
-        } else {
-            PromiseValue(this.userDoc.activeDashboard).then(dash => {
-                if (dash instanceof Doc) CurrentUserUtils.openDashboard(this.userDoc, dash);
-                else CurrentUserUtils.createNewDashboard(this.userDoc);
-            });
-        }
+            reaction(() => CurrentUserUtils.GuestTarget, target => target);
+        } 
     }
 
     @action
diff --git a/src/client/views/topbar/TopBar.scss b/src/client/views/topbar/TopBar.scss
index c5b340514..214b20193 100644
--- a/src/client/views/topbar/TopBar.scss
+++ b/src/client/views/topbar/TopBar.scss
@@ -2,7 +2,6 @@
 
 
 .topbar-container {
-      display: flex;
       flex-direction: column;
       font-size: 10px;
       line-height: 1;
@@ -11,6 +10,7 @@
       background: $dark-gray;
       overflow: visible;
       z-index: 1000;
+      align-items: center;
       height: $topbar-height;
       background-color: $dark-gray;
 
-- 
cgit v1.2.3-70-g09d2


From 07a95abd2f2ec2a5ebafce6633f92932087c1bd0 Mon Sep 17 00:00:00 2001
From: Jenny Yu <jennyyu212@outlook.com>
Date: Wed, 15 Jun 2022 17:48:54 -0700
Subject: not triggering context menu event

---
 src/client/views/DashboardView.tsx | 37 ++++++++++++++++++++++---------------
 1 file changed, 22 insertions(+), 15 deletions(-)

(limited to 'src/client/views/DashboardView.tsx')

diff --git a/src/client/views/DashboardView.tsx b/src/client/views/DashboardView.tsx
index 027cfd376..f754c1ff5 100644
--- a/src/client/views/DashboardView.tsx
+++ b/src/client/views/DashboardView.tsx
@@ -12,6 +12,8 @@ import { MainViewModal } from "./MainViewModal";
 import { ContextMenu } from "./ContextMenu";
 import { DocumentManager } from "../util/DocumentManager";
 import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { ContextMenuProps } from "./ContextMenuItem";
+import { simulateMouseClick } from "../../Utils";
 
 enum DashboardGroup {
       MyDashboards, SharedDashboards
@@ -58,6 +60,25 @@ export class DashboardView extends React.Component {
             this.abortCreateNewDashboard();
       }
 
+      onContextMenu = (e: React.MouseEvent): void => {
+            ContextMenu.Instance.addItem({
+                  description: "Share Dashboard", event: async () => {
+                     // ...
+                  }, icon: "edit"
+            });
+            ContextMenu.Instance.addItem({
+                  description: "Delete Dashboard", event: async () => {
+                     // ...
+                  }, icon: "trash"
+            });
+        }
+
+        showContextMenu = (e: React.MouseEvent) => {
+            // DocumentViewInternal.SelectAfterContextMenu = false;
+            // simulateMouseClick(this._docRef?.ContentDiv, e.clientX, e.clientY + 30, e.screenX, e.screenY + 30);
+            // DocumentViewInternal.SelectAfterContextMenu = true;
+        }
+
       @computed
       get namingInterface() {
             return <div>
@@ -82,21 +103,7 @@ export class DashboardView extends React.Component {
                                           <img src={href ?? "https://media.istockphoto.com/photos/hot-air-balloons-flying-over-the-botan-canyon-in-turkey-picture-id1297349747?b=1&k=20&m=1297349747&s=170667a&w=0&h=oH31fJty_4xWl_JQ4OIQWZKP8C6ji9Mz7L4XmEnbqRU="}></img>
                                           <div className="info">
                                                 <div className="title"> {StrCast(dashboard.title)} </div>
-                                                <div className="more" onClick={e => {
-                                                      const dashView = DocumentManager.Instance.getDocumentView(dashboard);
-                                                      console.log(dashView)
-                                                      ContextMenu.Instance.addItem({
-                                                            description: "Share Dashboard", event: async () => {
-                                                               // ...
-                                                            }, icon: "edit"
-                                                      });
-                                                      ContextMenu.Instance.addItem({
-                                                            description: "Delete Dashboard", event: async () => {
-                                                               // ...
-                                                            }, icon: "trash"
-                                                      });
-                                                      dashView?.showContextMenu(e.clientX + 20, e.clientY + 30);
-                                                }}>
+                                                <div className="more" onClick={this.showContextMenu} onContextMenu={this.onContextMenu}>
                                                       <FontAwesomeIcon color="black" size="lg" icon="bars" />
                                                 </div>
                                           </div>
-- 
cgit v1.2.3-70-g09d2


From 1bb2772ee619e29ebd800192eb3df69dc0f38205 Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Wed, 15 Jun 2022 21:07:19 -0400
Subject: added contextMenus to dashboards in dashboardView

---
 src/client/views/DashboardView.tsx | 52 ++++++++++++++++++++++++++------------
 1 file changed, 36 insertions(+), 16 deletions(-)

(limited to 'src/client/views/DashboardView.tsx')

diff --git a/src/client/views/DashboardView.tsx b/src/client/views/DashboardView.tsx
index 027cfd376..d24cde149 100644
--- a/src/client/views/DashboardView.tsx
+++ b/src/client/views/DashboardView.tsx
@@ -66,6 +66,35 @@ export class DashboardView extends React.Component {
                   <button className="password-submit" onClick={() => { this.createNewDashboard(this.newDashboardName!) }}>Create</button>
             </div>;
       }
+      
+      _downX: number = 0;
+      _downY: number = 0;
+      @action
+      onContextMenu = (e?: React.MouseEvent, pageX?: number, pageY?: number) => {
+          // the touch onContextMenu is button 0, the pointer onContextMenu is button 2
+          if (e) {
+              e.preventDefault();
+              e.stopPropagation();
+              e.persist();
+  
+              if (!navigator.userAgent.includes("Mozilla") && (Math.abs(this._downX - e?.clientX) > 3 || Math.abs(this._downY - e?.clientY) > 3)) {
+                  return;
+              }
+              const cm = ContextMenu.Instance;
+             cm.addItem({
+                    description: "Share Dashboard", event: async () => {
+                       // ...
+                    }, icon: "edit"
+              });
+              cm.addItem({
+                    description: "Delete Dashboard", event: async () => {
+                       // ...
+                    }, icon: "trash"
+              });
+              cm.displayMenu((e?.pageX || pageX || 0) - 15, (e?.pageY || pageY || 0) - 15);
+          }
+        }
+  
 
       render() {
             return <>
@@ -78,25 +107,16 @@ export class DashboardView extends React.Component {
                         <div className="all-dashboards">
                               {this.getDashboards().map((dashboard) => {
                                     const href = ImageCast((dashboard.thumb as Doc)?.data)?.url.href;
-                                    return <div className="dashboard-container" key={dashboard[Id]} onClick={e => this.clickDashboard(e, dashboard)}>
+                                    return <div className="dashboard-container" key={dashboard[Id]}
+                                              onContextMenu={this.onContextMenu}  
+                                              onClick={e => this.clickDashboard(e, dashboard)}>
                                           <img src={href ?? "https://media.istockphoto.com/photos/hot-air-balloons-flying-over-the-botan-canyon-in-turkey-picture-id1297349747?b=1&k=20&m=1297349747&s=170667a&w=0&h=oH31fJty_4xWl_JQ4OIQWZKP8C6ji9Mz7L4XmEnbqRU="}></img>
                                           <div className="info">
                                                 <div className="title"> {StrCast(dashboard.title)} </div>
-                                                <div className="more" onClick={e => {
-                                                      const dashView = DocumentManager.Instance.getDocumentView(dashboard);
-                                                      console.log(dashView)
-                                                      ContextMenu.Instance.addItem({
-                                                            description: "Share Dashboard", event: async () => {
-                                                               // ...
-                                                            }, icon: "edit"
-                                                      });
-                                                      ContextMenu.Instance.addItem({
-                                                            description: "Delete Dashboard", event: async () => {
-                                                               // ...
-                                                            }, icon: "trash"
-                                                      });
-                                                      dashView?.showContextMenu(e.clientX + 20, e.clientY + 30);
-                                                }}>
+                                                <div className="more" onPointerDown={e => {
+                                                    this._downX = e.clientX;
+                                                    this._downY = e.clientY;
+                                                }} onClick={this.onContextMenu}>
                                                       <FontAwesomeIcon color="black" size="lg" icon="bars" />
                                                 </div>
                                           </div>
-- 
cgit v1.2.3-70-g09d2


From 51c60d4d349c66432e57255f459c3d175ac3b251 Mon Sep 17 00:00:00 2001
From: Jenny Yu <jennyyu212@outlook.com>
Date: Wed, 15 Jun 2022 18:19:36 -0700
Subject: fix merge conflicts

---
 src/client/views/DashboardView.tsx | 4 ----
 1 file changed, 4 deletions(-)

(limited to 'src/client/views/DashboardView.tsx')

diff --git a/src/client/views/DashboardView.tsx b/src/client/views/DashboardView.tsx
index c7631da84..716653ea5 100644
--- a/src/client/views/DashboardView.tsx
+++ b/src/client/views/DashboardView.tsx
@@ -121,14 +121,10 @@ export class DashboardView extends React.Component {
                                           <img src={href ?? "https://media.istockphoto.com/photos/hot-air-balloons-flying-over-the-botan-canyon-in-turkey-picture-id1297349747?b=1&k=20&m=1297349747&s=170667a&w=0&h=oH31fJty_4xWl_JQ4OIQWZKP8C6ji9Mz7L4XmEnbqRU="}></img>
                                           <div className="info">
                                                 <div className="title"> {StrCast(dashboard.title)} </div>
-<<<<<<< HEAD
-                                                <div className="more" onClick={this.showContextMenu} onContextMenu={this.onContextMenu}>
-=======
                                                 <div className="more" onPointerDown={e => {
                                                     this._downX = e.clientX;
                                                     this._downY = e.clientY;
                                                 }} onClick={this.onContextMenu}>
->>>>>>> 1bb2772ee619e29ebd800192eb3df69dc0f38205
                                                       <FontAwesomeIcon color="black" size="lg" icon="bars" />
                                                 </div>
                                           </div>
-- 
cgit v1.2.3-70-g09d2


From 6dc7a0d37f055c57135b91d4d54174ee156b61f5 Mon Sep 17 00:00:00 2001
From: Jenny Yu <jennyyu212@outlook.com>
Date: Wed, 15 Jun 2022 19:46:10 -0700
Subject: share and remove dashboard from context menu

---
 src/client/util/CurrentUserUtils.ts |  7 +++++++
 src/client/views/DashboardView.tsx  | 19 ++++++++-----------
 src/client/views/topbar/TopBar.tsx  |  3 ---
 3 files changed, 15 insertions(+), 14 deletions(-)

(limited to 'src/client/views/DashboardView.tsx')

diff --git a/src/client/util/CurrentUserUtils.ts b/src/client/util/CurrentUserUtils.ts
index 199ef701d..c0318e86b 100644
--- a/src/client/util/CurrentUserUtils.ts
+++ b/src/client/util/CurrentUserUtils.ts
@@ -1226,6 +1226,13 @@ export class CurrentUserUtils {
           Doc.UserDoc().activeDashboard = undefined;
     }
 
+    public static async removeDashboard(dashboard: Doc) {
+      const dashboards = await DocListCastAsync(CurrentUserUtils.MyDashboards.data);
+      if (dashboards && dashboards.length > 0) {
+          Doc.RemoveDocFromList(CurrentUserUtils.MyDashboards, "data", dashboard);
+      }
+    }
+
     public static createNewDashboard = async (userDoc: Doc, id?: string, name?: string) => {
           console.log(name)
         const presentation = Doc.MakeCopy(userDoc.emptyPresentation as Doc, true);
diff --git a/src/client/views/DashboardView.tsx b/src/client/views/DashboardView.tsx
index 716653ea5..37a70f165 100644
--- a/src/client/views/DashboardView.tsx
+++ b/src/client/views/DashboardView.tsx
@@ -14,6 +14,7 @@ import { DocumentManager } from "../util/DocumentManager";
 import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
 import { ContextMenuProps } from "./ContextMenuItem";
 import { simulateMouseClick } from "../../Utils";
+import { SharingManager } from "../util/SharingManager";
 
 enum DashboardGroup {
       MyDashboards, SharedDashboards
@@ -60,12 +61,6 @@ export class DashboardView extends React.Component {
             this.abortCreateNewDashboard();
       }
 
-        showContextMenu = (e: React.MouseEvent) => {
-            // DocumentViewInternal.SelectAfterContextMenu = false;
-            // simulateMouseClick(this._docRef?.ContentDiv, e.clientX, e.clientY + 30, e.screenX, e.screenY + 30);
-            // DocumentViewInternal.SelectAfterContextMenu = true;
-        }
-
       @computed
       get namingInterface() {
             return <div>
@@ -78,7 +73,7 @@ export class DashboardView extends React.Component {
       _downX: number = 0;
       _downY: number = 0;
       @action
-      onContextMenu = (e?: React.MouseEvent, pageX?: number, pageY?: number) => {
+      onContextMenu = (dashboard: Doc, e?: React.MouseEvent, pageX?: number, pageY?: number) => {
           // the touch onContextMenu is button 0, the pointer onContextMenu is button 2
           if (e) {
               e.preventDefault();
@@ -91,12 +86,12 @@ export class DashboardView extends React.Component {
               const cm = ContextMenu.Instance;
              cm.addItem({
                     description: "Share Dashboard", event: async () => {
-                       // ...
+                        SharingManager.Instance.open(undefined, dashboard)
                     }, icon: "edit"
               });
               cm.addItem({
                     description: "Delete Dashboard", event: async () => {
-                       // ...
+                          CurrentUserUtils.removeDashboard(dashboard)
                     }, icon: "trash"
               });
               cm.displayMenu((e?.pageX || pageX || 0) - 15, (e?.pageY || pageY || 0) - 15);
@@ -116,7 +111,7 @@ export class DashboardView extends React.Component {
                               {this.getDashboards().map((dashboard) => {
                                     const href = ImageCast((dashboard.thumb as Doc)?.data)?.url.href;
                                     return <div className="dashboard-container" key={dashboard[Id]}
-                                              onContextMenu={this.onContextMenu}  
+                                              onContextMenu={(e) => {this.onContextMenu(dashboard, e)}}  
                                               onClick={e => this.clickDashboard(e, dashboard)}>
                                           <img src={href ?? "https://media.istockphoto.com/photos/hot-air-balloons-flying-over-the-botan-canyon-in-turkey-picture-id1297349747?b=1&k=20&m=1297349747&s=170667a&w=0&h=oH31fJty_4xWl_JQ4OIQWZKP8C6ji9Mz7L4XmEnbqRU="}></img>
                                           <div className="info">
@@ -124,7 +119,9 @@ export class DashboardView extends React.Component {
                                                 <div className="more" onPointerDown={e => {
                                                     this._downX = e.clientX;
                                                     this._downY = e.clientY;
-                                                }} onClick={this.onContextMenu}>
+                                                }} 
+                                                onContextMenu={(e) => {this.onContextMenu(dashboard, e)}}
+                                                >
                                                       <FontAwesomeIcon color="black" size="lg" icon="bars" />
                                                 </div>
                                           </div>
diff --git a/src/client/views/topbar/TopBar.tsx b/src/client/views/topbar/TopBar.tsx
index 0665e79ed..e4f48adce 100644
--- a/src/client/views/topbar/TopBar.tsx
+++ b/src/client/views/topbar/TopBar.tsx
@@ -76,9 +76,6 @@ export class TopBar extends React.Component {
                               </div>
                               <div className="topbar-right" >
                                     {CurrentUserUtils.ActiveDashboard ? <div className="topbar-button-text" onClick={() => { SharingManager.Instance.open(undefined, activeDashboard) }}>
-                                          {/* TODO: if I have edit access to the dashboard, display share
-                                        if this is a shared dashboard, display "view original or view annotated" */}
-                                          {/* { Doc.GetProto(CurrentUserUtils.ActiveDashboard)?.author ===  Doc.CurrentUserEmail ?  "Share": "view original" } */}
                                           {GetEffectiveAcl(Doc.GetProto(CurrentUserUtils.ActiveDashboard)) === AclAdmin ? "Share" : "view original"}
                                     </div> : (null)}
                                     <div className="topbar-button-icon" onClick={() => window.open(
-- 
cgit v1.2.3-70-g09d2


From 0706f875f2869111699cd11c43f65e792ece7d7e Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Thu, 16 Jun 2022 09:08:07 -0400
Subject: fixed clicking on context menu icon in dashboard view to open
 contexts menu

---
 src/client/views/DashboardView.tsx | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

(limited to 'src/client/views/DashboardView.tsx')

diff --git a/src/client/views/DashboardView.tsx b/src/client/views/DashboardView.tsx
index 37a70f165..9f497dcbf 100644
--- a/src/client/views/DashboardView.tsx
+++ b/src/client/views/DashboardView.tsx
@@ -117,10 +117,10 @@ export class DashboardView extends React.Component {
                                           <div className="info">
                                                 <div className="title"> {StrCast(dashboard.title)} </div>
                                                 <div className="more" onPointerDown={e => {
-                                                    this._downX = e.clientX;
-                                                    this._downY = e.clientY;
-                                                }} 
-                                                onContextMenu={(e) => {this.onContextMenu(dashboard, e)}}
+                                                        this._downX = e.clientX;
+                                                        this._downY = e.clientY;
+                                                    }} 
+                                                    onClick={(e) => {this.onContextMenu(dashboard, e)}}
                                                 >
                                                       <FontAwesomeIcon color="black" size="lg" icon="bars" />
                                                 </div>
-- 
cgit v1.2.3-70-g09d2


From 950440f9c73746867454e20f0e5c3a38297728b9 Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Thu, 16 Jun 2022 09:28:00 -0400
Subject: added unviewed shared dashboards to dashboard view

---
 src/client/util/CurrentUserUtils.ts |  1 +
 src/client/views/DashboardView.tsx  | 31 +++++++++++++++++++++++++++++++
 2 files changed, 32 insertions(+)

(limited to 'src/client/views/DashboardView.tsx')

diff --git a/src/client/util/CurrentUserUtils.ts b/src/client/util/CurrentUserUtils.ts
index c0318e86b..3085e7e72 100644
--- a/src/client/util/CurrentUserUtils.ts
+++ b/src/client/util/CurrentUserUtils.ts
@@ -1286,6 +1286,7 @@ export class CurrentUserUtils {
     public static get ActivePresentation() { return Cast(Doc.UserDoc().activePresentation, Doc, null); }
     public static get MyRecentlyClosed() { return Cast(Doc.UserDoc().myRecentlyClosedDocs, Doc, null); }
     public static get MyDashboards() { return Cast(Doc.UserDoc().myDashboards, Doc, null); }
+    public static get MySharedDocs() { return Cast(Doc.UserDoc().mySharedDocs, Doc, null); }
     public static get EmptyPane() { return Cast(Doc.UserDoc().emptyPane, Doc, null); }
     public static get OverlayDocs() { return DocListCast((Doc.UserDoc().myOverlayDocs as Doc)?.data); }
     public static set SelectedTool(tool: InkTool) { Doc.UserDoc().activeInkTool = tool; }
diff --git a/src/client/views/DashboardView.tsx b/src/client/views/DashboardView.tsx
index 9f497dcbf..a105e0790 100644
--- a/src/client/views/DashboardView.tsx
+++ b/src/client/views/DashboardView.tsx
@@ -15,6 +15,7 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
 import { ContextMenuProps } from "./ContextMenuItem";
 import { simulateMouseClick } from "../../Utils";
 import { SharingManager } from "../util/SharingManager";
+import { CollectionViewType } from "./collections/CollectionView";
 
 enum DashboardGroup {
       MyDashboards, SharedDashboards
@@ -54,6 +55,11 @@ export class DashboardView extends React.Component {
             }
       }
 
+      getSharedDashboards = () => {
+            const sharedDashs = DocListCast(CurrentUserUtils.MySharedDocs.data).filter(doc => doc._viewType === CollectionViewType.Docking);
+            return sharedDashs.filter((dashboard) => !DocListCast(CurrentUserUtils.MySharedDocs.viewed).includes(dashboard))
+      }
+
       createNewDashboard = async (name: string) => {
             const batch = UndoManager.StartBatch("new dash");
             await CurrentUserUtils.createNewDashboard(Doc.UserDoc(), undefined, name);
@@ -129,6 +135,31 @@ export class DashboardView extends React.Component {
                                     </div>
 
                               })}
+                            </div>
+
+                        <div style={{display:"block"}} > UNVIEWED SHARED DASHBOARDS </div>
+                        <div className="all-dashboards">
+                              {this.getSharedDashboards().map((dashboard) => {
+                                    const href = ImageCast((dashboard.thumb as Doc)?.data)?.url.href;
+                                    return <div className="dashboard-container" key={dashboard[Id]}
+                                              onContextMenu={(e) => {this.onContextMenu(dashboard, e)}}  
+                                              onClick={e => this.clickDashboard(e, dashboard)}>
+                                          <img src={href ?? "https://media.istockphoto.com/photos/hot-air-balloons-flying-over-the-botan-canyon-in-turkey-picture-id1297349747?b=1&k=20&m=1297349747&s=170667a&w=0&h=oH31fJty_4xWl_JQ4OIQWZKP8C6ji9Mz7L4XmEnbqRU="}></img>
+                                          <div className="info">
+                                                <div className="title"> {StrCast(dashboard.title)} </div>
+                                                <div className="more" onPointerDown={e => {
+                                                        this._downX = e.clientX;
+                                                        this._downY = e.clientY;
+                                                    }} 
+                                                    onClick={(e) => {this.onContextMenu(dashboard, e)}}
+                                                >
+                                                      <FontAwesomeIcon color="black" size="lg" icon="bars" />
+                                                </div>
+                                          </div>
+
+                                    </div>
+
+                              })}
 
                         </div>
                   </div>
-- 
cgit v1.2.3-70-g09d2


From de60c684c063f4a1cac733071405b3be549db86b Mon Sep 17 00:00:00 2001
From: Jenny Yu <jennyyu212@outlook.com>
Date: Fri, 17 Jun 2022 22:17:13 -0700
Subject: viewed and unviewed dashboards

---
 src/client/views/DashboardView.tsx | 42 +++++++++++++++-----------------------
 1 file changed, 16 insertions(+), 26 deletions(-)

(limited to 'src/client/views/DashboardView.tsx')

diff --git a/src/client/views/DashboardView.tsx b/src/client/views/DashboardView.tsx
index a105e0790..b5dfab237 100644
--- a/src/client/views/DashboardView.tsx
+++ b/src/client/views/DashboardView.tsx
@@ -41,6 +41,7 @@ export class DashboardView extends React.Component {
 
       clickDashboard = async (e: React.MouseEvent, dashboard: Doc) => {
             if (e.detail === 2) {
+                  Doc.AddDocToList(CurrentUserUtils.MySharedDocs, "viewed", dashboard)
                   Doc.UserDoc().activeDashboard = dashboard;
                   Doc.UserDoc().activePage = "dashboard";
             }
@@ -51,10 +52,16 @@ export class DashboardView extends React.Component {
             if (this.selectedDashboardGroup === DashboardGroup.MyDashboards) {
                   return allDashboards.filter((dashboard) => Doc.GetProto(dashboard).author === Doc.CurrentUserEmail)
             } else {
-                  return allDashboards.filter((dashboard) => Doc.GetProto(dashboard).author !== Doc.CurrentUserEmail)
+                  const sharedDashboards = DocListCast(CurrentUserUtils.MySharedDocs.data).filter(doc => doc._viewType === CollectionViewType.Docking);
+                  return sharedDashboards
             }
       }
 
+      isUnviewedSharedDashboard = (dashboard: Doc): boolean => {
+            // const sharedDashboards = DocListCast(CurrentUserUtils.MySharedDocs.data).filter(doc => doc._viewType === CollectionViewType.Docking);
+            return !DocListCast(CurrentUserUtils.MySharedDocs.viewed).includes(dashboard)
+      }
+
       getSharedDashboards = () => {
             const sharedDashs = DocListCast(CurrentUserUtils.MySharedDocs.data).filter(doc => doc._viewType === CollectionViewType.Docking);
             return sharedDashs.filter((dashboard) => !DocListCast(CurrentUserUtils.MySharedDocs.viewed).includes(dashboard))
@@ -122,6 +129,9 @@ export class DashboardView extends React.Component {
                                           <img src={href ?? "https://media.istockphoto.com/photos/hot-air-balloons-flying-over-the-botan-canyon-in-turkey-picture-id1297349747?b=1&k=20&m=1297349747&s=170667a&w=0&h=oH31fJty_4xWl_JQ4OIQWZKP8C6ji9Mz7L4XmEnbqRU="}></img>
                                           <div className="info">
                                                 <div className="title"> {StrCast(dashboard.title)} </div>
+                                                {this.selectedDashboardGroup === DashboardGroup.SharedDashboards && this.isUnviewedSharedDashboard(dashboard) ?
+                                                 <div>unviewed</div> : <div></div>
+                                                }
                                                 <div className="more" onPointerDown={e => {
                                                         this._downX = e.clientX;
                                                         this._downY = e.clientY;
@@ -137,31 +147,6 @@ export class DashboardView extends React.Component {
                               })}
                             </div>
 
-                        <div style={{display:"block"}} > UNVIEWED SHARED DASHBOARDS </div>
-                        <div className="all-dashboards">
-                              {this.getSharedDashboards().map((dashboard) => {
-                                    const href = ImageCast((dashboard.thumb as Doc)?.data)?.url.href;
-                                    return <div className="dashboard-container" key={dashboard[Id]}
-                                              onContextMenu={(e) => {this.onContextMenu(dashboard, e)}}  
-                                              onClick={e => this.clickDashboard(e, dashboard)}>
-                                          <img src={href ?? "https://media.istockphoto.com/photos/hot-air-balloons-flying-over-the-botan-canyon-in-turkey-picture-id1297349747?b=1&k=20&m=1297349747&s=170667a&w=0&h=oH31fJty_4xWl_JQ4OIQWZKP8C6ji9Mz7L4XmEnbqRU="}></img>
-                                          <div className="info">
-                                                <div className="title"> {StrCast(dashboard.title)} </div>
-                                                <div className="more" onPointerDown={e => {
-                                                        this._downX = e.clientX;
-                                                        this._downY = e.clientY;
-                                                    }} 
-                                                    onClick={(e) => {this.onContextMenu(dashboard, e)}}
-                                                >
-                                                      <FontAwesomeIcon color="black" size="lg" icon="bars" />
-                                                </div>
-                                          </div>
-
-                                    </div>
-
-                              })}
-
-                        </div>
                   </div>
                   <MainViewModal
                         contents={this.namingInterface}
@@ -173,3 +158,8 @@ export class DashboardView extends React.Component {
 
       }
 }
+
+export function AddToList(MySharedDocs: Doc, arg1: string, dash: any) {
+      throw new Error("Function not implemented.");
+}
+
-- 
cgit v1.2.3-70-g09d2

