From a2820ffc0c9fd8323fa2f9a9ae5334da4c72283b Mon Sep 17 00:00:00 2001
From: Jenny Yu <jennyyu212@outlook.com>
Date: Mon, 12 Sep 2022 19:16:57 -0400
Subject: breaking: made trails belong to dashboard instead of userdoc

---
 src/client/views/collections/TabDocView.tsx | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

(limited to 'src/client/views/collections/TabDocView.tsx')

diff --git a/src/client/views/collections/TabDocView.tsx b/src/client/views/collections/TabDocView.tsx
index b8aaea622..7614154c0 100644
--- a/src/client/views/collections/TabDocView.tsx
+++ b/src/client/views/collections/TabDocView.tsx
@@ -214,8 +214,15 @@ export class TabDocView extends React.Component<TabDocViewProps> {
         const docList = docs instanceof Doc ? [docs] : docs;
         const batch = UndoManager.StartBatch('pinning doc');
 
-        // all docs will be added to the ActivePresentation as stored on CurrentUserUtils
-        const curPres = Doc.ActivePresentation;
+        let curPres = Doc.ActivePresentation
+        console.log(curPres)
+      //   let curPres = Doc.ActiveDashboard!['presentation'] 
+        if (!curPres) {
+            curPres = Doc.MakeCopy(Doc.UserDoc().emptyPresentation as Doc, true);
+            Doc.ActivePresentation = curPres
+            // Doc.ActiveDashboard!['presentation'] = curPres
+        }
+
         curPres &&
             docList.forEach(doc => {
                 // Edge Case 1: Cannot pin document to itself
-- 
cgit v1.2.3-70-g09d2


From ecc97b7d09f66b25a19b1e33d547e32d2f0a591d Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Tue, 13 Sep 2022 10:23:07 -0400
Subject: fixed errors.

---
 src/client/views/collections/TabDocView.tsx | 31 ++++++++++++++---------------
 src/mobile/MobileInterface.tsx              |  2 +-
 2 files changed, 16 insertions(+), 17 deletions(-)

(limited to 'src/client/views/collections/TabDocView.tsx')

diff --git a/src/client/views/collections/TabDocView.tsx b/src/client/views/collections/TabDocView.tsx
index 30fa33b52..7522affa7 100644
--- a/src/client/views/collections/TabDocView.tsx
+++ b/src/client/views/collections/TabDocView.tsx
@@ -213,11 +213,11 @@ 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)
+        let curPres = Doc.ActivePresentation;
+        console.log(curPres);
         if (!curPres) {
             curPres = Doc.MakeCopy(Doc.UserDoc().emptyPresentation as Doc, true);
-            Doc.ActivePresentation = curPres
+            Doc.ActivePresentation = curPres;
         }
 
         curPres &&
@@ -271,19 +271,18 @@ export class TabDocView extends React.Component<TabDocViewProps> {
                 PresBox.Instance?.clearSelectedArray();
                 pinDoc && PresBox.Instance?.addToSelectedArray(pinDoc); //Update selected array
             });
-            if (
-                CollectionDockingView.Instance &&
-                !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');
-                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
-      }
+        if (
+            CollectionDockingView.Instance &&
+            !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');
+            setTimeout(() => DocumentManager.Instance.jumpToDocument(docList.lastElement(), false, undefined, []), 100); // keeps the pinned doc in view since the sidebar shifts things
+        }
+    }
 
     componentDidMount() {
         new _global.ResizeObserver(
diff --git a/src/mobile/MobileInterface.tsx b/src/mobile/MobileInterface.tsx
index f19496d25..8265de445 100644
--- a/src/mobile/MobileInterface.tsx
+++ b/src/mobile/MobileInterface.tsx
@@ -832,7 +832,7 @@ export class MobileInterface extends React.Component {
                 </div>
                 {this.switchMenuView}
                 {this.inkMenu}
-                <GestureOverlay>
+                <GestureOverlay isActive={true}>
                     <div style={{ display: 'none' }}>
                         <RichTextMenu key="rich" />
                     </div>
-- 
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/collections/TabDocView.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 b55fefa87179b9f15fb72d088f527771e90b9bb8 Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Tue, 13 Sep 2022 15:04:06 -0400
Subject: made things consistent by renaming  emptyPresentation to emptyTrail
 and then always making copies of emptyTrail instead of calling the
 Docs.create constructor

---
 src/client/documents/Documents.ts           | 2 +-
 src/client/util/CurrentUserUtils.ts         | 4 ++--
 src/client/views/MainView.tsx               | 3 ++-
 src/client/views/collections/TabDocView.tsx | 2 +-
 4 files changed, 6 insertions(+), 5 deletions(-)

(limited to 'src/client/views/collections/TabDocView.tsx')

diff --git a/src/client/documents/Documents.ts b/src/client/documents/Documents.ts
index 75024d9c9..63080f8cf 100644
--- a/src/client/documents/Documents.ts
+++ b/src/client/documents/Documents.ts
@@ -1564,7 +1564,7 @@ export namespace DocUtils {
         const documentList: ContextMenuProps[] = DocListCast(DocListCast(Doc.MyTools?.data)[0]?.data)
             .filter(btnDoc => !btnDoc.hidden)
             .map(btnDoc => Cast(btnDoc?.dragFactory, Doc, null))
-            .filter(doc => doc && doc !== Doc.UserDoc().emptyPresentation)
+            .filter(doc => doc && doc !== Doc.UserDoc().emptyTrail)
             .map((dragDoc, i) => ({
                 description: ':' + StrCast(dragDoc.title).replace('Untitled ', ''),
                 event: undoBatch((args: { x: number; y: number }) => {
diff --git a/src/client/util/CurrentUserUtils.ts b/src/client/util/CurrentUserUtils.ts
index 7419750b1..3f3816a8a 100644
--- a/src/client/util/CurrentUserUtils.ts
+++ b/src/client/util/CurrentUserUtils.ts
@@ -207,7 +207,7 @@ export class CurrentUserUtils {
         DocUtils.AssignOpts(DocCast(doc[field]), {}, iconTemplates);
     }
 
-    /// initalizes the set of "empty<DocType>" versions of each document type with default fields.  e.g.,. emptyNote, emptyPresentation
+    /// initalizes the set of "empty<DocType>" versions of each document type with default fields.  e.g.,. emptyNote, emptyTrail
     static creatorBtnDescriptors(doc: Doc): {
         title: string, toolTip: string, icon: string,  ignoreClick?: boolean, dragFactory?: Doc, 
         backgroundColor?: string,  clickFactory?: Doc, scripts?: { onClick?: string, onDragStart?: string}, funcs?: {onDragStart?:string, hidden?: string},
@@ -269,7 +269,7 @@ export class CurrentUserUtils {
             {key: "Script",     creator: opts => Docs.Create.ScriptingDocument(null, opts), opts: { _width: 200, _height: 250, }},
             // {key: "DataViz",    creator: opts => Docs.Create.DataVizDocument(opts),         opts: { _width: 300, _height: 300 }},
             {key: "Header",     creator: headerTemplate,                                    opts: { _width: 300, _height: 70, _headerPointerEvents: "all", _headerHeight: 12, _headerFontSize: 9, _autoHeight: true,}},
-            {key: "Presentation",creator: Docs.Create.PresDocument,                         opts: { _width: 400, _height: 500, _viewType: CollectionViewType.Stacking, targetDropAction: "alias" as any, treeViewHideTitle: true,  _chromeHidden: true, boxShadow: "0 0" }},
+            {key: "Trail",      creator: Docs.Create.PresDocument,                          opts: { _width: 400, _height: 500, _viewType: CollectionViewType.Stacking, targetDropAction: "alias" as any, treeViewHideTitle: true,  _chromeHidden: true, boxShadow: "0 0" }},
             {key: "Tab",        creator: opts => Docs.Create.FreeformDocument([], opts),    opts: { _width: 500, _height: 800, _backgroundGridShow: true, }},
             {key: "Slide",      creator: opts => Docs.Create.TreeDocument([], opts),        opts: { _width: 300, _height: 200, _viewType: CollectionViewType.Tree, 
                                                                                                 treeViewHasOverlay: true, _fontSize: "20px", _autoHeight: true, 
diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index bf52e2af0..a96a04ec9 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -523,7 +523,8 @@ export class MainView extends React.Component {
 
     @action
     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' });
+        const pres = Doc.MakeCopy(Doc.UserDoc().emptyTrail as Doc, true);
+        Docs.Create.PresDocument({ title: 'Untitled Trail', _viewType: CollectionViewType.Stacking, _fitWidth: true, treeViewHideTitle: true, _width: 400, _height: 500, targetDropAction: 'alias', _chromeHidden: true, boxShadow: '0 0' });
         CollectionDockingView.AddSplit(pres, 'left');
         Doc.MyTrails && Doc.AddDocToList(Doc.MyTrails, 'data', pres); // Doc.MyTrails should be created in createDashboard
         Doc.ActivePresentation = pres;
diff --git a/src/client/views/collections/TabDocView.tsx b/src/client/views/collections/TabDocView.tsx
index 042d39285..46386fa71 100644
--- a/src/client/views/collections/TabDocView.tsx
+++ b/src/client/views/collections/TabDocView.tsx
@@ -214,7 +214,7 @@ export class TabDocView extends React.Component<TabDocViewProps> {
         const docList = docs instanceof Doc ? [docs] : docs;
 
         const batch = UndoManager.StartBatch('pinning doc');
-        const curPres = Doc.ActivePresentation ?? Doc.MakeCopy(Doc.UserDoc().emptyPresentation as Doc, true);
+        const curPres = Doc.ActivePresentation ?? Doc.MakeCopy(Doc.UserDoc().emptyTrail as Doc, true);
 
         if (!Doc.ActivePresentation) {
             Doc.AddDocToList(Doc.MyTrails, 'data', curPres);
-- 
cgit v1.2.3-70-g09d2

