From 1ae415f3fc83edb248131f20ea4279d61a947392 Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Mon, 12 Sep 2022 20:22:59 -0400
Subject: fixed exception from switch of myTrails to dashboard from userDoc

---
 src/client/views/nodes/trails/PresBox.tsx | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

(limited to 'src/client/views/nodes/trails/PresBox.tsx')

diff --git a/src/client/views/nodes/trails/PresBox.tsx b/src/client/views/nodes/trails/PresBox.tsx
index 292c187e4..c95ece3da 100644
--- a/src/client/views/nodes/trails/PresBox.tsx
+++ b/src/client/views/nodes/trails/PresBox.tsx
@@ -193,7 +193,9 @@ export class PresBox extends ViewBoxBaseComponent<FieldViewProps>() {
         this.layoutDoc._gridGap = 0;
         this.layoutDoc._yMargin = 0;
         this.turnOffEdit(true);
-        DocListCastAsync(Doc.MyTrails.data).then(pres => !pres?.includes(this.rootDoc) && Doc.AddDocToList(Doc.MyTrails, 'data', this.rootDoc));
+        if (Doc.MyTrails) {
+            DocListCastAsync(Doc.MyTrails.data).then(pres => !pres?.includes(this.rootDoc) && Doc.AddDocToList(Doc.MyTrails, 'data', this.rootDoc));
+        }
         this._disposers.selection = reaction(
             () => SelectionManager.Views(),
             views => views.some(view => view.props.Document === this.rootDoc) && this.updateCurrentPresentation()
-- 
cgit v1.2.3-70-g09d2


From 743f4ab3a65babedb30b8ae9575e9b3583e52b3d Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Tue, 13 Sep 2022 12:51:37 -0400
Subject: fixed activePresentation to work properly with multiple dashboards. 
 fixed undoing PinDoc.

---
 src/client/util/CurrentUserUtils.ts         |   8 --
 src/client/views/DashboardView.tsx          |  24 +++---
 src/client/views/MainView.tsx               |   9 +--
 src/client/views/collections/TabDocView.tsx | 114 ++++++++++++++--------------
 src/client/views/nodes/trails/PresBox.tsx   |  14 +---
 src/fields/Doc.ts                           |   6 +-
 6 files changed, 78 insertions(+), 97 deletions(-)

(limited to 'src/client/views/nodes/trails/PresBox.tsx')

diff --git a/src/client/util/CurrentUserUtils.ts b/src/client/util/CurrentUserUtils.ts
index c2cf5dae0..7419750b1 100644
--- a/src/client/util/CurrentUserUtils.ts
+++ b/src/client/util/CurrentUserUtils.ts
@@ -336,14 +336,6 @@ export class CurrentUserUtils {
             { title: "Trails",          target: Doc.UserDoc(),                                     icon: "pres-trail",  funcs: {target: getActiveDashTrails}},
             { title: "User Doc View",   target: this.setupUserDocView(doc, "myUserDocView"),       icon: "address-card",funcs: {hidden: "IsNoviceMode()"} },
         ].map(tuple => ({...tuple, scripts:{onClick: 'selectMainMenu(self)'}}));
-      
-
-      //   Doc.UserDoc().myButtons.trailsBtn.target = Doc.ActiveDashboard.myTrails;
-      //   const foo = new Doc();
-      //   foo.a = 3;
-      //   foo.a = "bob";
-      //   foo.a = new List<number>([1]); // = []
-      //   foo.a = ComputedField.MakeFunction("() =>'hello'"); // () => "hello";
     }
 
     /// the empty panel that is filled with whichever left menu button's panel has been selected
diff --git a/src/client/views/DashboardView.tsx b/src/client/views/DashboardView.tsx
index 478234eb0..d1926951d 100644
--- a/src/client/views/DashboardView.tsx
+++ b/src/client/views/DashboardView.tsx
@@ -257,7 +257,6 @@ export class DashboardView extends React.Component {
     };
 
     public static createNewDashboard = (id?: string, name?: string) => {
-        //   const presentation = Doc.MakeCopy(Doc.UserDoc().emptyPresentation as Doc, true);
         const dashboards = Doc.MyDashboards;
         const dashboardCount = DocListCast(dashboards.data).length + 1;
         const freeformOptions: DocumentOptions = {
@@ -269,7 +268,7 @@ export class DashboardView extends React.Component {
             _backgroundGridShow: true,
             title: `Untitled Tab 1`,
         };
-        const title = name ? name : `Dashboard ${dashboardCount}`;
+        const title = name ?? `Dashboard ${dashboardCount}`;
         const freeformDoc = Doc.GuestTarget || Docs.Create.FreeformDocument([], freeformOptions);
         const dashboardDoc = Docs.Create.StandardCollectionDockingDocument([{ doc: freeformDoc, initialWidth: 600 }], { title: title }, id, 'row');
         freeformDoc.context = dashboardDoc;
@@ -280,9 +279,6 @@ export class DashboardView extends React.Component {
         dashboardDoc['pane-count'] = 1;
 
         Doc.AddDocToList(dashboards, 'data', dashboardDoc);
-        // open this new dashboard
-        Doc.ActiveDashboard = dashboardDoc;
-        Doc.ActivePage = 'dashboard';
 
         // this section is creating the button document itself  ===  myTrails = new Button
         const reqdBtnOpts: DocumentOptions = {
@@ -301,10 +297,9 @@ export class DashboardView extends React.Component {
         const reqdBtnScript = { onClick: `createNewPresentation()` };
         const myTrailsBtn = DocUtils.AssignScripts(Docs.Create.FontIconDocument(reqdBtnOpts), reqdBtnScript);
 
-        //  createa a list of presentations (as a tree view collection) and store i on the new dashboard
-        // instead of assigninbg Doc.UserDoc().myrails we want to assign Doc.AxtiveDashboard.myTrails
-        // but we don't wanbt to create the list of trails here-- but rather in createDashbarod
-        // myTrail
+        //  createa a list of presentations (as a tree view collection) and store it on the new dashboard
+        // instead of assigning Doc.UserDoc().myrails we want to assign Doc.AxtiveDashboard.myTrails
+        // but we don't want to create the list of trails here-- but rather in createDashboard
         const reqdOpts: DocumentOptions = {
             title: 'My Trails',
             _showTitle: 'title',
@@ -327,12 +322,15 @@ export class DashboardView extends React.Component {
             system: true,
             explainer: 'All of the trails that you have created will appear here.',
         };
-        const myTrails = DocUtils.AssignScripts(Docs.Create.TreeDocument([], reqdOpts), { treeViewChildDoubleClick: 'openPresentation(documentView.rootDoc)' });
+        dashboardDoc.myTrails = DocUtils.AssignScripts(Docs.Create.TreeDocument([], reqdOpts), { treeViewChildDoubleClick: 'openPresentation(documentView.rootDoc)' });
 
-        dashboardDoc.myTrails = myTrails;
+        // open this new dashboard
+        Doc.ActiveDashboard = dashboardDoc;
+        Doc.ActivePage = 'dashboard';
+        Doc.ActivePresentation = undefined;
         const contextMenuScripts = [reqdBtnScript.onClick];
-        if (Cast(myTrails.contextMenuScripts, listSpec(ScriptField), null)?.length !== contextMenuScripts.length) {
-            myTrails.contextMenuScripts = new List<ScriptField>(contextMenuScripts.map(script => ScriptField.MakeFunction(script)!));
+        if (Cast(Doc.MyTrails.contextMenuScripts, listSpec(ScriptField), null)?.length !== contextMenuScripts.length) {
+            Doc.MyTrails.contextMenuScripts = new List<ScriptField>(contextMenuScripts.map(script => ScriptField.MakeFunction(script)!));
         }
     };
 }
diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index 79f83b386..09ab49d1c 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -524,17 +524,14 @@ export class MainView extends React.Component {
     createNewPresentation = () => {
         const pres = Docs.Create.PresDocument({ title: 'Untitled Trail', _viewType: CollectionViewType.Stacking, _fitWidth: true, _width: 400, _height: 500, targetDropAction: 'alias', _chromeHidden: true, boxShadow: '0 0' });
         CollectionDockingView.AddSplit(pres, 'left');
-      
-        const myTrails = Doc.ActiveDashboard!.myTrails as Doc
-        console.log(Doc.ActiveDashboard!.myTrails)
-        Doc.AddDocToList(myTrails, "trails", pres)
-        Doc.ActivePresentation = pres
+        Doc.MyTrails && Doc.AddDocToList(Doc.MyTrails, 'data', pres); // Doc.MyTrails should be created in createDashboard
+        Doc.ActivePresentation = pres;
     };
 
     @action
     openPresentation = (pres: Doc) => {
         CollectionDockingView.AddSplit(pres, 'left');
-        Doc.ActivePresentation = pres;
+        Doc.MyTrails && (Doc.ActivePresentation = pres);
         Doc.AddDocToList(Doc.MyTrails, 'data', pres);
         this.closeFlyout();
     };
diff --git a/src/client/views/collections/TabDocView.tsx b/src/client/views/collections/TabDocView.tsx
index 7522affa7..042d39285 100644
--- a/src/client/views/collections/TabDocView.tsx
+++ b/src/client/views/collections/TabDocView.tsx
@@ -213,75 +213,75 @@ export class TabDocView extends React.Component<TabDocViewProps> {
     public static PinDoc(docs: Doc | Doc[], pinProps?: PinProps) {
         const docList = docs instanceof Doc ? [docs] : docs;
 
-        let curPres = Doc.ActivePresentation;
-        console.log(curPres);
-        if (!curPres) {
-            curPres = Doc.MakeCopy(Doc.UserDoc().emptyPresentation as Doc, true);
+        const batch = UndoManager.StartBatch('pinning doc');
+        const curPres = Doc.ActivePresentation ?? Doc.MakeCopy(Doc.UserDoc().emptyPresentation as Doc, true);
+
+        if (!Doc.ActivePresentation) {
+            Doc.AddDocToList(Doc.MyTrails, 'data', curPres);
             Doc.ActivePresentation = curPres;
         }
 
-        curPres &&
-            docList.forEach(doc => {
-                // Edge Case 1: Cannot pin document to itself
-                if (doc === curPres) {
-                    alert('Cannot pin presentation document to itself');
-                    return;
-                }
-                const pinDoc = Doc.MakeAlias(doc);
-                pinDoc.presentationTargetDoc = doc;
-                pinDoc.title = doc.title + ' - Slide';
-                pinDoc.data = new List<Doc>(); // the children of the alias' layout are the presentation slide children.  the alias' data field might be children of a collection, PDF data, etc -- in any case we don't want the tree view to "see" this data
-                pinDoc.presMovement = PresMovement.Zoom;
-                pinDoc.groupWithUp = false;
-                pinDoc.context = curPres;
-                // these should potentially all be props passed down by the CollectionTreeView to the TreeView elements.  That way the PresBox could configure all of its children at render time
-                pinDoc.treeViewRenderAsBulletHeader = true; // forces a tree view to render the document next to the bullet in the header area
-                pinDoc.treeViewHeaderWidth = '100%'; // forces the header to grow to be the same size as its largest sibling.
-                pinDoc.treeViewChildrenOnRoot = true; // tree view will look for hierarchical children on the root doc, not the data doc.
-                pinDoc.treeViewFieldKey = 'data'; // tree view will treat the 'data' field as the field where the hierarchical children are located instead of using the document's layout string field
-                pinDoc.treeViewExpandedView = 'data'; // in case the data doc has an expandedView set, this will mask that field and use the 'data' field when expanding the tree view
-                pinDoc.treeViewGrowsHorizontally = true; // the document expands horizontally when displayed as a tree view header
-                pinDoc.treeViewHideHeaderIfTemplate = true; // this will force the document to render itself as the tree view header
-                const presArray: Doc[] = PresBox.Instance?.sortArray();
-                const size: number = PresBox.Instance?.selectedArray.size;
-                const presSelected: Doc | undefined = presArray && size ? presArray[size - 1] : undefined;
-                const duration = NumCast(doc[`${Doc.LayoutFieldKey(pinDoc)}-duration`], null);
+        docList.forEach(doc => {
+            // Edge Case 1: Cannot pin document to itself
+            if (doc === curPres) {
+                alert('Cannot pin presentation document to itself');
+                return;
+            }
+            const pinDoc = Doc.MakeAlias(doc);
+            pinDoc.presentationTargetDoc = doc;
+            pinDoc.title = doc.title + ' - Slide';
+            pinDoc.data = new List<Doc>(); // the children of the alias' layout are the presentation slide children.  the alias' data field might be children of a collection, PDF data, etc -- in any case we don't want the tree view to "see" this data
+            pinDoc.presMovement = PresMovement.Zoom;
+            pinDoc.groupWithUp = false;
+            pinDoc.context = curPres;
+            // these should potentially all be props passed down by the CollectionTreeView to the TreeView elements.  That way the PresBox could configure all of its children at render time
+            pinDoc.treeViewRenderAsBulletHeader = true; // forces a tree view to render the document next to the bullet in the header area
+            pinDoc.treeViewHeaderWidth = '100%'; // forces the header to grow to be the same size as its largest sibling.
+            pinDoc.treeViewChildrenOnRoot = true; // tree view will look for hierarchical children on the root doc, not the data doc.
+            pinDoc.treeViewFieldKey = 'data'; // tree view will treat the 'data' field as the field where the hierarchical children are located instead of using the document's layout string field
+            pinDoc.treeViewExpandedView = 'data'; // in case the data doc has an expandedView set, this will mask that field and use the 'data' field when expanding the tree view
+            pinDoc.treeViewGrowsHorizontally = true; // the document expands horizontally when displayed as a tree view header
+            pinDoc.treeViewHideHeaderIfTemplate = true; // this will force the document to render itself as the tree view header
+            const presArray: Doc[] = PresBox.Instance?.sortArray();
+            const size: number = PresBox.Instance?.selectedArray.size;
+            const presSelected: Doc | undefined = presArray && size ? presArray[size - 1] : undefined;
+            const duration = NumCast(doc[`${Doc.LayoutFieldKey(pinDoc)}-duration`], null);
 
-                PresBox.pinDocView(pinDoc, pinProps, doc);
-                pinDoc.onClick = ScriptField.MakeFunction('navigateToDoc(self.presentationTargetDoc, self)');
-                Doc.AddDocToList(curPres, 'data', pinDoc, presSelected);
-                if (!pinProps?.audioRange && duration !== undefined) {
-                    pinDoc.mediaStart = 'manual';
-                    pinDoc.mediaStop = 'manual';
-                    pinDoc.presStartTime = NumCast(doc.clipStart);
-                    pinDoc.presEndTime = NumCast(doc.clipEnd, duration);
-                }
-                //save position
-                if (pinProps?.activeFrame !== undefined) {
-                    pinDoc.presActiveFrame = pinProps?.activeFrame;
-                    pinDoc.title = doc.title + ' (move)';
-                    pinDoc.presMovement = PresMovement.Pan;
-                }
-                if (pinDoc.isInkMask) {
-                    pinDoc.presHideAfter = true;
-                    pinDoc.presHideBefore = true;
-                    pinDoc.presMovement = PresMovement.None;
-                }
-                if (curPres.expandBoolean) pinDoc.presExpandInlineButton = true;
-                PresBox.Instance?.clearSelectedArray();
-                pinDoc && PresBox.Instance?.addToSelectedArray(pinDoc); //Update selected array
-            });
+            PresBox.pinDocView(pinDoc, pinProps, doc);
+            pinDoc.onClick = ScriptField.MakeFunction('navigateToDoc(self.presentationTargetDoc, self)');
+            Doc.AddDocToList(curPres, 'data', pinDoc, presSelected);
+            if (!pinProps?.audioRange && duration !== undefined) {
+                pinDoc.mediaStart = 'manual';
+                pinDoc.mediaStop = 'manual';
+                pinDoc.presStartTime = NumCast(doc.clipStart);
+                pinDoc.presEndTime = NumCast(doc.clipEnd, duration);
+            }
+            //save position
+            if (pinProps?.activeFrame !== undefined) {
+                pinDoc.presActiveFrame = pinProps?.activeFrame;
+                pinDoc.title = doc.title + ' (move)';
+                pinDoc.presMovement = PresMovement.Pan;
+            }
+            if (pinDoc.isInkMask) {
+                pinDoc.presHideAfter = true;
+                pinDoc.presHideBefore = true;
+                pinDoc.presMovement = PresMovement.None;
+            }
+            if (curPres.expandBoolean) pinDoc.presExpandInlineButton = true;
+            PresBox.Instance?.clearSelectedArray();
+            pinDoc && PresBox.Instance?.addToSelectedArray(pinDoc); //Update selected array
+        });
         if (
-            CollectionDockingView.Instance &&
-            !Array.from(CollectionDockingView.Instance.tabMap)
+            !Array.from(CollectionDockingView.Instance?.tabMap ?? [])
                 .map(d => d.DashDoc)
                 .includes(curPres)
         ) {
             const docs = Cast(Doc.MyOverlayDocs.data, listSpec(Doc), []);
             if (docs.includes(curPres)) docs.splice(docs.indexOf(curPres), 1);
-            CollectionDockingView.AddSplit(curPres, 'right');
+            CollectionDockingView.AddSplit(curPres, 'left');
             setTimeout(() => DocumentManager.Instance.jumpToDocument(docList.lastElement(), false, undefined, []), 100); // keeps the pinned doc in view since the sidebar shifts things
         }
+        setTimeout(batch.end, 500); // need to wait until dockingview (goldenlayout) updates all its structurs
     }
 
     componentDidMount() {
diff --git a/src/client/views/nodes/trails/PresBox.tsx b/src/client/views/nodes/trails/PresBox.tsx
index 82b8a8f90..1325a9d67 100644
--- a/src/client/views/nodes/trails/PresBox.tsx
+++ b/src/client/views/nodes/trails/PresBox.tsx
@@ -88,11 +88,6 @@ export class PresBox extends ViewBoxBaseComponent<FieldViewProps>() {
     private _disposers: { [name: string]: IReactionDisposer } = {};
     public selectedArray = new ObservableSet<Doc>();
 
-    constructor(props: any) {
-        super(props);
-        if ((Doc.ActivePresentation = this.rootDoc)) runInAction(() => (PresBox.Instance = this));
-    }
-
     @observable public static Instance: PresBox;
     @observable static startMarquee: boolean = false; // onclick "+ new slide" in presentation mode, set as true, then when marquee selection finish, onPointerUp automatically triggers PinWithView
 
@@ -199,9 +194,6 @@ export class PresBox extends ViewBoxBaseComponent<FieldViewProps>() {
         this.layoutDoc._gridGap = 0;
         this.layoutDoc._yMargin = 0;
         this.turnOffEdit(true);
-        if (Doc.MyTrails) {
-            DocListCastAsync(Doc.MyTrails.data).then(pres => !pres?.includes(this.rootDoc) && Doc.AddDocToList(Doc.MyTrails, 'data', this.rootDoc));
-        }
         this._disposers.selection = reaction(
             () => SelectionManager.Views(),
             views => views.some(view => view.props.Document === this.rootDoc) && this.updateCurrentPresentation()
@@ -2322,7 +2314,7 @@ export class PresBox extends ViewBoxBaseComponent<FieldViewProps>() {
         const mode = StrCast(this.rootDoc._viewType) as CollectionViewType;
         const isMini: boolean = this.toolbarWidth <= 100;
         return (
-            <div className="presBox-buttons" style={{ display: !this.rootDoc._chromeHidden ? 'none' : undefined }}>
+            <div className="presBox-buttons" style={{ background: Doc.ActivePresentation === this.rootDoc ? 'green' : undefined, display: !this.rootDoc._chromeHidden ? 'none' : undefined }}>
                 {isMini ? null : (
                     <select className="presBox-viewPicker" style={{ display: this.layoutDoc.presStatus === 'edit' ? 'block' : 'none' }} onPointerDown={e => e.stopPropagation()} onChange={this.viewChanged} value={mode}>
                         <option onPointerDown={StopEvent} value={CollectionViewType.Stacking}>
@@ -2584,7 +2576,9 @@ export class PresBox extends ViewBoxBaseComponent<FieldViewProps>() {
         const presStart: boolean = !this.layoutDoc.presLoop && this.itemIndex === 0;
         return DocListCast(Doc.MyOverlayDocs?.data).includes(this.rootDoc) ? (
             <div className="miniPres" onClick={e => e.stopPropagation()} onPointerEnter={action(e => (this._forceKeyEvents = true))}>
-                <div className="presPanelOverlay" style={{ display: 'inline-flex', height: 30, background: '#323232', top: 0, zIndex: 3000000, boxShadow: this._presKeyEvents ? '0 0 0px 3px ' + Colors.MEDIUM_BLUE : undefined }}>
+                <div
+                    className="presPanelOverlay"
+                    style={{ display: 'inline-flex', height: 30, background: Doc.ActivePresentation === this.rootDoc ? 'green' : '#323232', top: 0, zIndex: 3000000, boxShadow: this._presKeyEvents ? '0 0 0px 3px ' + Colors.MEDIUM_BLUE : undefined }}>
                     <Tooltip title={<div className="dash-tooltip">{'Loop'}</div>}>
                         <div
                             className="presPanel-button"
diff --git a/src/fields/Doc.ts b/src/fields/Doc.ts
index 86b4da792..cf505c45b 100644
--- a/src/fields/Doc.ts
+++ b/src/fields/Doc.ts
@@ -225,13 +225,13 @@ export class Doc extends RefField {
     public static get ActiveTool(): InkTool {
         return StrCast(Doc.UserDoc().activeTool, InkTool.None) as InkTool;
     }
-    public static get ActivePresentation() {
+    public static get ActivePresentation(): Opt<Doc> {
         return DocCast(Doc.ActiveDashboard?.activePresentation);
     }
     public static set ActivePresentation(val) {
-      if (Doc.ActiveDashboard) {
+        if (Doc.ActiveDashboard) {
             Doc.ActiveDashboard.activePresentation = val;
-      }
+        }
     }
     constructor(id?: FieldId, forceSave?: boolean) {
         super(id);
-- 
cgit v1.2.3-70-g09d2


From ef501d60faa2d843b65d9a12a03e979eb59f1655 Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Tue, 13 Sep 2022 14:51:50 -0400
Subject: made myTrails view navigate to docs the same way presBox does.

---
 src/client/views/MainView.tsx             | 17 +++++----
 src/client/views/nodes/trails/PresBox.tsx | 57 ++++++++++++++-----------------
 2 files changed, 37 insertions(+), 37 deletions(-)

(limited to 'src/client/views/nodes/trails/PresBox.tsx')

diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index 09ab49d1c..bf52e2af0 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -11,12 +11,12 @@ import * as ReactDOM from 'react-dom';
 import { Doc, DocListCast, Opt } from '../../fields/Doc';
 import { List } from '../../fields/List';
 import { ScriptField } from '../../fields/ScriptField';
-import { StrCast } from '../../fields/Types';
+import { DocCast, StrCast } from '../../fields/Types';
 import { emptyFunction, returnEmptyDoclist, returnEmptyFilter, returnFalse, returnTrue, returnZero, setupMoveUpEvents, simulateMouseClick, Utils } from '../../Utils';
 import { GoogleAuthenticationManager } from '../apis/GoogleAuthenticationManager';
 import { DocServer } from '../DocServer';
 import { Docs, DocUtils } from '../documents/Documents';
-import { CollectionViewType } from '../documents/DocumentTypes';
+import { CollectionViewType, DocumentType } from '../documents/DocumentTypes';
 import { CaptureManager } from '../util/CaptureManager';
 import { DocumentManager } from '../util/DocumentManager';
 import { GroupManager } from '../util/GroupManager';
@@ -58,6 +58,7 @@ import { LinkDescriptionPopup } from './nodes/LinkDescriptionPopup';
 import { LinkDocPreview } from './nodes/LinkDocPreview';
 import { RadialMenu } from './nodes/RadialMenu';
 import { TaskCompletionBox } from './nodes/TaskCompletedBox';
+import { PresBox } from './nodes/trails';
 import { WebBox } from './nodes/WebBox';
 import { OverlayView } from './OverlayView';
 import { AnchorMenu } from './pdf/AnchorMenu';
@@ -530,10 +531,14 @@ export class MainView extends React.Component {
 
     @action
     openPresentation = (pres: Doc) => {
-        CollectionDockingView.AddSplit(pres, 'left');
-        Doc.MyTrails && (Doc.ActivePresentation = pres);
-        Doc.AddDocToList(Doc.MyTrails, 'data', pres);
-        this.closeFlyout();
+        if (pres.type === DocumentType.PRES) {
+            CollectionDockingView.AddSplit(pres, 'left');
+            Doc.MyTrails && (Doc.ActivePresentation = pres);
+            Doc.AddDocToList(Doc.MyTrails, 'data', pres);
+            this.closeFlyout();
+        } else {
+            PresBox.NavigateToDoc(DocCast(pres.presentationTargetDoc), pres);
+        }
     };
 
     @action
diff --git a/src/client/views/nodes/trails/PresBox.tsx b/src/client/views/nodes/trails/PresBox.tsx
index 1325a9d67..1dd03c52c 100644
--- a/src/client/views/nodes/trails/PresBox.tsx
+++ b/src/client/views/nodes/trails/PresBox.tsx
@@ -345,7 +345,8 @@ export class PresBox extends ViewBoxBaseComponent<FieldViewProps>() {
             }
             if (!group) this.clearSelectedArray();
             this.childDocs[index] && this.addToSelectedArray(this.childDocs[index]); //Update selected array
-            this.navigateToElement(this.childDocs[index]); //Handles movement to element only when presTrail is list
+            this.turnOffEdit();
+            this.navigateToActiveItem(); //Handles movement to element only when presTrail is list
             this.onHideDocument(); //Handles hide after/before
         }
     });
@@ -360,7 +361,7 @@ export class PresBox extends ViewBoxBaseComponent<FieldViewProps>() {
     }
 
     @action
-    static restoreTargetDocView(bestTarget: Doc, activeItem: Doc, jumpToDoc: boolean) {
+    static restoreTargetDocView(bestTarget: Doc, activeItem: Doc) {
         const transTime = NumCast(activeItem.presTransition, 500);
         const presTransitionTime = `all ${transTime}ms`;
         const { scrollable, pannable, temporal, clippable, dataview, textview } = this.pinDataTypes(bestTarget);
@@ -427,7 +428,7 @@ export class PresBox extends ViewBoxBaseComponent<FieldViewProps>() {
         }
     }
 
-    _navTimer!: NodeJS.Timeout;
+    static _navTimer: NodeJS.Timeout;
     /**
      * This method makes sure that cursor navigates to the element that
      * has the option open and last in the group.
@@ -436,7 +437,7 @@ export class PresBox extends ViewBoxBaseComponent<FieldViewProps>() {
      * a new tab. If presCollection is undefined it will open the document
      * on the right.
      */
-    navigateToElement = async (curDoc: Doc) => {
+    navigateToActiveItem = () => {
         const activeItem: Doc = this.activeItem;
         const targetDoc: Doc = this.targetDoc;
         const srcContext = Cast(targetDoc.context, Doc, null) ?? Cast(Cast(targetDoc.annotationOn, Doc, null)?.context, Doc, null);
@@ -444,7 +445,6 @@ export class PresBox extends ViewBoxBaseComponent<FieldViewProps>() {
         const collectionDocView = presCollection ? DocumentManager.Instance.getDocumentView(presCollection) : undefined;
         const includesDoc: boolean = DocListCast(presCollection?.data).includes(targetDoc);
         const tab = CollectionDockingView.Instance && Array.from(CollectionDockingView.Instance.tabMap).find(tab => tab.DashDoc === srcContext);
-        this.turnOffEdit();
         // Handles the setting of presCollection
         if (includesDoc) {
             //Case 1: Pres collection should not change as it is already the same
@@ -467,7 +467,7 @@ export class PresBox extends ViewBoxBaseComponent<FieldViewProps>() {
             self._eleArray.splice(0, self._eleArray.length, ...eleViewCache);
         });
         const openInTab = (doc: Doc, finished?: () => void) => {
-            collectionDocView ? collectionDocView.props.addDocTab(doc, '') : this.props.addDocTab(doc, '');
+            (collectionDocView ?? this).props.addDocTab(doc, '');
             this.layoutDoc.presCollection = targetDoc;
             // this still needs some fixing
             setTimeout(resetSelection, 500);
@@ -477,6 +477,10 @@ export class PresBox extends ViewBoxBaseComponent<FieldViewProps>() {
                 finished?.();
             }
         };
+        PresBox.NavigateToTarget(targetDoc, activeItem, openInTab, srcContext, includesDoc || tab ? undefined : resetSelection);
+    };
+
+    static NavigateToTarget(targetDoc: Doc, activeItem: Doc, openInTab: any, srcContext: Doc, finished?: () => void) {
         if (activeItem.presPinView && DocCast(targetDoc.context)?._currentFrame === undefined) {
             const transTime = NumCast(activeItem.presTransition, 500);
             const presTransitionTime = `all ${transTime}ms`;
@@ -491,20 +495,20 @@ export class PresBox extends ViewBoxBaseComponent<FieldViewProps>() {
         // If openDocument is selected then it should open the document for the user
         if (activeItem.openDocument) {
             LightboxView.SetLightboxDoc(targetDoc); // openInTab(targetDoc);
-        } else if (targetDoc && curDoc.presMovement !== PresMovement.None && targetDoc) {
+        } else if (targetDoc && activeItem.presMovement !== PresMovement.None) {
             LightboxView.SetLightboxDoc(undefined);
-            const zooming = curDoc.presMovement !== PresMovement.Pan;
-            DocumentManager.Instance.jumpToDocument(targetDoc, zooming, openInTab, srcContext ? [srcContext] : [], undefined, undefined, undefined, includesDoc || tab ? undefined : resetSelection, undefined, true, NumCast(curDoc.presZoom));
+            const zooming = activeItem.presMovement !== PresMovement.Pan;
+            DocumentManager.Instance.jumpToDocument(targetDoc, zooming, openInTab, srcContext ? [srcContext] : [], undefined, undefined, undefined, finished, undefined, true, NumCast(activeItem.presZoom));
         }
         // After navigating to the document, if it is added as a presPinView then it will
         // adjust the pan and scale to that of the pinView when it was added.
         if (activeItem.presPinView) {
-            // if targetDoc is not displayed but one of its aliases is, then we need to modify that alias, not the original target
-            clearTimeout(this._navTimer);
+            clearTimeout(PresBox._navTimer);
+            // targetDoc may or may not be displayed.  this gets the first available document (or alias) view that matches targetDoc
             const bestTarget = DocumentManager.Instance.getFirstDocumentView(targetDoc)?.props.Document;
-            if (bestTarget) this._navTimer = PresBox.restoreTargetDocView(bestTarget, activeItem, false);
+            if (bestTarget) PresBox._navTimer = PresBox.restoreTargetDocView(bestTarget, activeItem);
         }
-    };
+    }
 
     /**
      * Uses the viewfinder to progressivize through the different views of a single collection.
@@ -2658,25 +2662,16 @@ export class PresBox extends ViewBoxBaseComponent<FieldViewProps>() {
             </div>
         );
     }
+    static NavigateToDoc(bestTarget: Doc, activeItem: Doc) {
+        const srcContext = Cast(bestTarget.context, Doc, null) ?? Cast(Cast(bestTarget.annotationOn, Doc, null)?.context, Doc, null);
+        const openInTab = (doc: Doc, finished?: () => void) => {
+            CollectionDockingView.AddSplit(doc, 'right');
+            finished?.();
+        };
+        PresBox.NavigateToTarget(bestTarget, activeItem, openInTab, srcContext);
+    }
 }
 
 ScriptingGlobals.add(function navigateToDoc(bestTarget: Doc, activeItem: Doc) {
-    const srcContext = Cast(bestTarget.context, Doc, null) ?? Cast(Cast(bestTarget.annotationOn, Doc, null)?.context, Doc, null);
-    const openInTab = (doc: Doc, finished?: () => void) => {
-        CollectionDockingView.AddSplit(doc, 'right');
-        finished?.();
-    };
-    DocumentManager.Instance.jumpToDocument(
-        bestTarget,
-        true,
-        openInTab,
-        srcContext ? [srcContext] : [],
-        undefined,
-        undefined,
-        undefined,
-        () => PresBox.restoreTargetDocView(bestTarget, activeItem, true),
-        undefined,
-        true,
-        NumCast(activeItem.presZoom)
-    );
+    PresBox.NavigateToDoc(bestTarget, activeItem);
 });
-- 
cgit v1.2.3-70-g09d2


From cea66bd846e886776bcb9d376f0aa7c88cf73504 Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Tue, 13 Sep 2022 21:43:59 -0400
Subject: made overlayX/overlayY instead of re-using x/y in order that overlay
 docs can be dragged in playground mode (for shared mini-player presentations)
 without necessarily allowing regular docs to be dragged in playground mode.

---
 src/client/views/MainView.tsx             |  4 ++--
 src/client/views/OverlayView.tsx          | 12 ++++++------
 src/client/views/nodes/trails/PresBox.tsx |  4 ++--
 3 files changed, 10 insertions(+), 10 deletions(-)

(limited to 'src/client/views/nodes/trails/PresBox.tsx')

diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index 2aa7f392b..4bf6bb881 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -167,8 +167,8 @@ export class MainView extends React.Component {
                 'timelineHeightPercent',
                 'panX',
                 'panY',
-                'x',
-                'y',
+                'overlayX',
+                'overlayY',
                 'fitWidth',
                 'nativeWidth',
                 'nativeHeight',
diff --git a/src/client/views/OverlayView.tsx b/src/client/views/OverlayView.tsx
index 5242fabb8..2354e84ff 100644
--- a/src/client/views/OverlayView.tsx
+++ b/src/client/views/OverlayView.tsx
@@ -164,7 +164,7 @@ export class OverlayView extends React.Component {
 
     docScreenToLocalXf = computedFn(
         function docScreenToLocalXf(this: any, doc: Doc) {
-            return () => new Transform(-NumCast(doc.x), -NumCast(doc.y), 1);
+            return () => new Transform(-NumCast(doc.overlayX), -NumCast(doc.overlayY), 1);
         }.bind(this)
     );
 
@@ -175,8 +175,8 @@ export class OverlayView extends React.Component {
             const dref = React.createRef<HTMLDivElement>();
             const onPointerMove = action((e: PointerEvent, down: number[]) => {
                 if (e.buttons === 1) {
-                    d.x = e.clientX + offsetx;
-                    d.y = e.clientY + offsety;
+                    d.overlayX = e.clientX + offsetx;
+                    d.overlayY = e.clientY + offsety;
                 }
                 if (e.metaKey) {
                     const dragData = new DragManager.DocumentDragData([d]);
@@ -198,8 +198,8 @@ export class OverlayView extends React.Component {
 
             const onPointerDown = (e: React.PointerEvent) => {
                 setupMoveUpEvents(this, e, onPointerMove, emptyFunction, emptyFunction);
-                offsetx = NumCast(d.x) - e.clientX;
-                offsety = NumCast(d.y) - e.clientY;
+                offsetx = NumCast(d.overlayX) - e.clientX;
+                offsety = NumCast(d.overlayY) - e.clientY;
             };
             return (
                 <div
@@ -207,7 +207,7 @@ export class OverlayView extends React.Component {
                     ref={dref}
                     key={d[Id]}
                     onPointerDown={onPointerDown}
-                    style={{ top: d.type === 'presentation' ? 0 : undefined, width: NumCast(d._width), height: NumCast(d._height), transform: `translate(${d.x}px, ${d.y}px)` }}>
+                    style={{ top: d.type === 'presentation' ? 0 : undefined, width: NumCast(d._width), height: NumCast(d._height), transform: `translate(${d.overlayX}px, ${d.overlayY}px)` }}>
                     <DocumentView
                         Document={d}
                         rootSelected={returnTrue}
diff --git a/src/client/views/nodes/trails/PresBox.tsx b/src/client/views/nodes/trails/PresBox.tsx
index 1dd03c52c..a4db2d777 100644
--- a/src/client/views/nodes/trails/PresBox.tsx
+++ b/src/client/views/nodes/trails/PresBox.tsx
@@ -715,8 +715,8 @@ export class PresBox extends ViewBoxBaseComponent<FieldViewProps>() {
             this.layoutDoc.presStatus = PresStatus.Edit;
             clearTimeout(this._presTimer);
             const pt = this.props.ScreenToLocalTransform().inverse().transformPoint(0, 0);
-            this.rootDoc.x = pt[0] + (this.props.PanelWidth() - 250);
-            this.rootDoc.y = pt[1] + 10;
+            this.rootDoc.overlayX = pt[0] + (this.props.PanelWidth() - 250);
+            this.rootDoc.overlayY = pt[1] + 10;
             this.rootDoc._height = 30;
             this.rootDoc._width = 248;
             Doc.AddDocToList(Doc.MyOverlayDocs, undefined, this.rootDoc);
-- 
cgit v1.2.3-70-g09d2

