aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client/util/CurrentUserUtils.ts29
-rw-r--r--src/client/util/SharingManager.tsx2
-rw-r--r--src/client/views/DashboardView.tsx41
-rw-r--r--src/client/views/MainView.tsx12
-rw-r--r--src/client/views/collections/TabDocView.tsx11
-rw-r--r--src/fields/Doc.ts8
6 files changed, 86 insertions, 17 deletions
diff --git a/src/client/util/CurrentUserUtils.ts b/src/client/util/CurrentUserUtils.ts
index 6c80cf0f4..5fbecd741 100644
--- a/src/client/util/CurrentUserUtils.ts
+++ b/src/client/util/CurrentUserUtils.ts
@@ -1,3 +1,4 @@
+import { forOwn } from "lodash";
import { reaction } from "mobx";
import * as rp from 'request-promise';
import { Doc, DocListCast, DocListCastAsync, Opt } from "../../fields/Doc";
@@ -5,7 +6,7 @@ import { List } from "../../fields/List";
import { PrefetchProxy } from "../../fields/Proxy";
import { RichTextField } from "../../fields/RichTextField";
import { listSpec } from "../../fields/Schema";
-import { ScriptField } from "../../fields/ScriptField";
+import { ComputedField, ScriptField } from "../../fields/ScriptField";
import { Cast, DateCast, DocCast, PromiseValue, StrCast } from "../../fields/Types";
import { nullAudio } from "../../fields/URLField";
import { SetCachedGroups, SharingPermissions } from "../../fields/util";
@@ -278,7 +279,8 @@ export class CurrentUserUtils {
/// returns descriptions needed to buttons for the left sidebar to open up panes displaying different collections of documents
static leftSidebarMenuBtnDescriptions(doc: Doc):{title:string, target:Doc, icon:string, scripts:{[key:string]:any}, funcs?:{[key:string]:any}}[] {
- const badgeValue = "((len) => len && len !== '0' ? len: undefined)(docList(self.target.data).filter(doc => !docList(self.target.viewed).includes(doc)).length.toString())";
+ const badgeValue = "((len) => len && len !== '0' ? len: undefined)(docList(self.target.data).filter(doc => !docList(self.target.viewed).includes(doc)).length.toString())";
+ const getActiveDashTrails = "(() => Doc.ActiveDashboard?.myTrails)";
return [
{ title: "Dashboards", target: this.setupDashboards(doc, "myDashboards"), icon: "desktop", },
{ title: "Search", target: this.setupSearcher(doc, "mySearcher"), icon: "search", },
@@ -287,9 +289,17 @@ export class CurrentUserUtils {
{ title: "Imports", target: this.setupImportSidebar(doc, "myImports"), icon: "upload", },
{ title: "Recently Closed", target: this.setupRecentlyClosed(doc, "myRecentlyClosed"), icon: "archive", },
{ title: "Shared Docs", target: Doc.MySharedDocs, icon: "users", funcs:{badgeValue:badgeValue}},
- { title: "Trails", target: this.setupTrails(doc, "myTrails"), icon: "pres-trail", },
+ { 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
@@ -450,13 +460,19 @@ export class CurrentUserUtils {
}
/// initializes the left sidebar Trails pane
+ /// This creates button Document which has a target that is the collection of trails
+ /// the collection of trails is stored on the Doc.UserDoc() in the field 'myTrails"
static setupTrails(doc: Doc, field:string) {
+ // TODO: how to change this place so that I access the trail associated with the active dashboard
+
+ // this section iscreating the button document itself === myTrails = new Button
var myTrails = DocCast(doc[field]);
const reqdBtnOpts:DocumentOptions = { _forceActive: true, _width: 30, _height: 30, _stayInCollection: true, _hideContextMenu: true,
title: "New trail", toolTip: "Create new trail", btnType: ButtonType.ClickButton, buttonText: "New trail", icon: "plus", system: true };
const reqdBtnScript = {onClick: `createNewPresentation()`};
- const newTrailButton = DocUtils.AssignScripts(DocUtils.AssignOpts(DocCast(myTrails?.buttonMenuDoc), reqdBtnOpts) ?? Docs.Create.FontIconDocument(reqdBtnOpts), reqdBtnScript);
+ const newTrailButton = DocUtils.AssignScripts(DocUtils.AssignOpts(DocCast(doc[field]), reqdBtnOpts) ?? Docs.Create.FontIconDocument(reqdBtnOpts), reqdBtnScript);
+ // this section creates the collection of trails which will be storedon the user Doc and as the target of the button === Doc.UserDoc().myTrails = button
const reqdOpts:DocumentOptions = {
title: "My Trails", _showTitle: "title", _height: 100,
treeViewHideTitle: true, _fitWidth: true, _gridGap: 5, _forceActive: true, childDropAction: "alias",
@@ -466,7 +482,12 @@ export class CurrentUserUtils {
_lockedPosition: true, boxShadow: "0 0", childDontRegisterViews: true, targetDropAction: "same", system: true,
explainer: "All of the trails that you have created will appear here."
};
+ // 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 rathger in createDashbarod
+ // myTrail
myTrails = DocUtils.AssignDocField(doc, field, (opts) => Docs.Create.TreeDocument([], opts), reqdOpts);
+
+
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)!));
diff --git a/src/client/util/SharingManager.tsx b/src/client/util/SharingManager.tsx
index 793027ea1..f3ff842fb 100644
--- a/src/client/util/SharingManager.tsx
+++ b/src/client/util/SharingManager.tsx
@@ -373,7 +373,7 @@ export class SharingManager extends React.Component<{}> {
if (!uniform) dropdownValues.unshift('-multiple-');
if (override) dropdownValues.unshift('None');
return dropdownValues
- .filter(permission => !Doc.noviceMode || ![SharingPermissions.View, SharingPermissions.SelfEdit].includes(permission as any))
+ .filter(permission => !Doc.noviceMode || ![SharingPermissions.SelfEdit].includes(permission as any))
.map(permission => (
<option key={permission} value={permission}>
{permission}
diff --git a/src/client/views/DashboardView.tsx b/src/client/views/DashboardView.tsx
index 526a32f5a..982640266 100644
--- a/src/client/views/DashboardView.tsx
+++ b/src/client/views/DashboardView.tsx
@@ -5,9 +5,11 @@ import * as React from 'react';
import { DataSym, Doc, DocListCast, DocListCastAsync } from '../../fields/Doc';
import { Id } from '../../fields/FieldSymbols';
import { List } from '../../fields/List';
-import { Cast, ImageCast, StrCast } from '../../fields/Types';
+import { listSpec } from '../../fields/Schema';
+import { ScriptField } from '../../fields/ScriptField';
+import { Cast, DocCast, ImageCast, StrCast } from '../../fields/Types';
import { DocServer } from '../DocServer';
-import { Docs, DocumentOptions } from '../documents/Documents';
+import { Docs, DocumentOptions, DocUtils } from '../documents/Documents';
import { CollectionViewType } from '../documents/DocumentTypes';
import { HistoryUtil } from '../util/History';
import { ScriptingGlobals } from '../util/ScriptingGlobals';
@@ -18,6 +20,7 @@ import { CollectionView } from './collections/CollectionView';
import { ContextMenu } from './ContextMenu';
import './DashboardView.scss';
import { MainViewModal } from './MainViewModal';
+import { ButtonType } from './nodes/button/FontIconBox';
enum DashboardGroup {
MyDashboards,
@@ -255,7 +258,7 @@ export class DashboardView extends React.Component {
};
public static createNewDashboard = (id?: string, name?: string) => {
- const presentation = Doc.MakeCopy(Doc.UserDoc().emptyPresentation as Doc, true);
+ // const presentation = Doc.MakeCopy(Doc.UserDoc().emptyPresentation as Doc, true);
const dashboards = Doc.MyDashboards;
const dashboardCount = DocListCast(dashboards.data).length + 1;
const freeformOptions: DocumentOptions = {
@@ -277,12 +280,40 @@ export class DashboardView extends React.Component {
dashboardDoc.data = new List<Doc>(dashboardTabs);
dashboardDoc['pane-count'] = 1;
- Doc.ActivePresentation = presentation;
-
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 = { _forceActive: true, _width: 30, _height: 30, _stayInCollection: true, _hideContextMenu: true,
+ title: "New trail", toolTip: "Create new trail", btnType: ButtonType.ClickButton, buttonText: "New trail", icon: "plus", system: true };
+ 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
+ const reqdOpts:DocumentOptions = {
+ title: "My Trails", _showTitle: "title", _height: 100,
+ treeViewHideTitle: true, _fitWidth: true, _gridGap: 5, _forceActive: true, childDropAction: "alias",
+ treeViewTruncateTitleWidth: 150, ignoreClick: true, buttonMenu: true, buttonMenuDoc: myTrailsBtn,
+ contextMenuIcons: new List<string>(["plus"]),
+ contextMenuLabels: new List<string>(["Create New Trail"]),
+ _lockedPosition: true, boxShadow: "0 0", childDontRegisterViews: true, targetDropAction: "same", system: true,
+ explainer: "All of the trails that you have created will appear here."
+ };
+ const myTrails = Docs.Create.TreeDocument([], reqdOpts);
+
+ dashboardDoc.myTrails = myTrails;
+ console.log(myTrails)
+ 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)!));
+ }
+
};
}
diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index b61cd3409..437a97d0b 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -8,6 +8,7 @@ import { observer } from 'mobx-react';
import * as React from 'react';
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 { emptyFunction, returnEmptyDoclist, returnEmptyFilter, returnFalse, returnTrue, returnZero, setupMoveUpEvents, simulateMouseClick, Utils } from '../../Utils';
@@ -502,8 +503,15 @@ export class MainView extends React.Component {
createNewPresentation = async () => {
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');
- Doc.ActivePresentation = pres;
- Doc.AddDocToList(Doc.MyTrails, 'data', pres);
+
+ // add the presentation documents to dashboard doc
+ // const myTrails = new Doc;
+ // Doc.ActiveDashboard!.myTrails = myTrails;
+ // myTrails.trails = new List<Doc>([]) // todo: move to dashboard creation
+ // Doc.ActiveDashboard!.myTrails!.trails = new List<Doc>([])
+ console.log(Doc.ActiveDashboard!.myTrails)
+ // Doc.AddDocToList(myTrails, "trails", pres)
+ // Doc.ActivePresentation = pres
};
@action
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
diff --git a/src/fields/Doc.ts b/src/fields/Doc.ts
index 0c7504913..8879bd194 100644
--- a/src/fields/Doc.ts
+++ b/src/fields/Doc.ts
@@ -180,7 +180,7 @@ export class Doc extends RefField {
return DocCast(Doc.UserDoc().myRecentlyClosed);
}
public static get MyTrails() {
- return DocCast(Doc.UserDoc().myTrails);
+ return DocCast(Doc.ActiveDashboard?.myTrails);
}
public static get MyOverlayDocs() {
return DocCast(Doc.UserDoc().myOverlayDocs);
@@ -225,10 +225,12 @@ export class Doc extends RefField {
return StrCast(Doc.UserDoc().activeTool, InkTool.None) as InkTool;
}
public static get ActivePresentation() {
- return DocCast(Doc.UserDoc().activePresentation);
+ return DocCast(Doc.ActiveDashboard?.activePresentation);
}
public static set ActivePresentation(val) {
- Doc.UserDoc().activePresentation = val;
+ if (Doc.ActiveDashboard) {
+ Doc.ActiveDashboard.activePresentation = val;
+ }
}
constructor(id?: FieldId, forceSave?: boolean) {
super(id);