aboutsummaryrefslogtreecommitdiff
path: root/src/mobile/MobileInterface.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/mobile/MobileInterface.tsx')
-rw-r--r--src/mobile/MobileInterface.tsx602
1 files changed, 400 insertions, 202 deletions
diff --git a/src/mobile/MobileInterface.tsx b/src/mobile/MobileInterface.tsx
index bf06faeb9..e1360553a 100644
--- a/src/mobile/MobileInterface.tsx
+++ b/src/mobile/MobileInterface.tsx
@@ -1,52 +1,236 @@
-
import { library } from '@fortawesome/fontawesome-svg-core';
import {
- faTasks, faReply, faQuoteLeft, faHandPointLeft, faFolderOpen, faAngleDoubleLeft, faExternalLinkSquareAlt, faMobile, faThLarge, faWindowClose, faEdit, faTrashAlt, faPalette, faAngleRight, faBell, faTrash, faCamera, faExpand, faCaretDown, faCaretLeft, faCaretRight, faCaretSquareDown, faCaretSquareRight, faArrowsAltH, faPlus, faMinus,
- faTerminal, faToggleOn, faFile as fileSolid, faExternalLinkAlt, faLocationArrow, faSearch, faFileDownload, faStop, faCalculator, faWindowMaximize, faAddressCard,
- faQuestionCircle, faArrowLeft, faArrowRight, faArrowDown, faArrowUp, faBolt, faBullseye, faCaretUp, faCat, faCheck, faChevronRight, faClipboard, faClone, faCloudUploadAlt,
- faCommentAlt, faCompressArrowsAlt, faCut, faEllipsisV, faEraser, faExclamation, faFileAlt, faFileAudio, faFilePdf, faFilm, faFilter, faFont, faGlobeAsia, faHighlighter,
- faLongArrowAltRight, faMicrophone, faMousePointer, faMusic, faObjectGroup, faPause, faPen, faPenNib, faPhone, faPlay, faPortrait, faRedoAlt, faStamp, faStickyNote,
- faThumbtack, faTree, faTv, faBook, faUndoAlt, faVideo, faAsterisk, faBrain, faImage, faPaintBrush, faTimes, faEye, faHome, faLongArrowAltLeft, faBars, faTh, faChevronLeft,
- faAlignRight, faAlignLeft
+ faTasks,
+ faReply,
+ faQuoteLeft,
+ faHandPointLeft,
+ faFolderOpen,
+ faAngleDoubleLeft,
+ faExternalLinkSquareAlt,
+ faMobile,
+ faThLarge,
+ faWindowClose,
+ faEdit,
+ faTrashAlt,
+ faPalette,
+ faAngleRight,
+ faBell,
+ faTrash,
+ faCamera,
+ faExpand,
+ faCaretDown,
+ faCaretLeft,
+ faCaretRight,
+ faCaretSquareDown,
+ faCaretSquareRight,
+ faArrowsAltH,
+ faPlus,
+ faMinus,
+ faTerminal,
+ faToggleOn,
+ faFile as fileSolid,
+ faExternalLinkAlt,
+ faLocationArrow,
+ faSearch,
+ faFileDownload,
+ faStop,
+ faCalculator,
+ faWindowMaximize,
+ faAddressCard,
+ faQuestionCircle,
+ faArrowLeft,
+ faArrowRight,
+ faArrowDown,
+ faArrowUp,
+ faBolt,
+ faBullseye,
+ faCaretUp,
+ faCat,
+ faCheck,
+ faChevronRight,
+ faClipboard,
+ faClone,
+ faCloudUploadAlt,
+ faCommentAlt,
+ faCompressArrowsAlt,
+ faCut,
+ faEllipsisV,
+ faEraser,
+ faExclamation,
+ faFileAlt,
+ faFileAudio,
+ faFilePdf,
+ faFilm,
+ faFilter,
+ faFont,
+ faGlobeAsia,
+ faHighlighter,
+ faLongArrowAltRight,
+ faMicrophone,
+ faMousePointer,
+ faMusic,
+ faObjectGroup,
+ faPause,
+ faPen,
+ faPenNib,
+ faPhone,
+ faPlay,
+ faPortrait,
+ faRedoAlt,
+ faStamp,
+ faStickyNote,
+ faThumbtack,
+ faTree,
+ faTv,
+ faBook,
+ faUndoAlt,
+ faVideo,
+ faAsterisk,
+ faBrain,
+ faImage,
+ faPaintBrush,
+ faTimes,
+ faEye,
+ faHome,
+ faLongArrowAltLeft,
+ faBars,
+ faTh,
+ faChevronLeft,
+ faAlignRight,
+ faAlignLeft,
} from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { action, computed, observable, runInAction } from 'mobx';
import { observer } from 'mobx-react';
-import * as React from "react";
+import * as React from 'react';
import { Docs, DocumentOptions, DocUtils } from '../client/documents/Documents';
-import { DocumentType } from "../client/documents/DocumentTypes";
+import { DocumentType } from '../client/documents/DocumentTypes';
import { CurrentUserUtils } from '../client/util/CurrentUserUtils';
import { ScriptingGlobals } from '../client/util/ScriptingGlobals';
import { SettingsManager, ColorScheme } from '../client/util/SettingsManager';
import { Transform } from '../client/util/Transform';
-import { UndoManager } from "../client/util/UndoManager";
+import { UndoManager } from '../client/util/UndoManager';
import { TabDocView } from '../client/views/collections/TabDocView';
-import { CollectionViewType } from "../client/views/collections/CollectionView";
-import { GestureOverlay } from "../client/views/GestureOverlay";
-import { AudioBox } from "../client/views/nodes/AudioBox";
+import { CollectionViewType } from '../client/views/collections/CollectionView';
+import { GestureOverlay } from '../client/views/GestureOverlay';
+import { AudioBox } from '../client/views/nodes/AudioBox';
import { DocumentView } from '../client/views/nodes/DocumentView';
-import { RichTextMenu } from "../client/views/nodes/formattedText/RichTextMenu";
-import { RadialMenu } from "../client/views/nodes/RadialMenu";
+import { RichTextMenu } from '../client/views/nodes/formattedText/RichTextMenu';
+import { RadialMenu } from '../client/views/nodes/RadialMenu';
import { Doc, DocListCast } from '../fields/Doc';
import { InkTool } from '../fields/InkField';
-import { List } from "../fields/List";
-import { ScriptField } from "../fields/ScriptField";
-import { Cast, FieldValue } from '../fields/Types';
+import { List } from '../fields/List';
+import { ScriptField } from '../fields/ScriptField';
+import { Cast, FieldValue, StrCast } from '../fields/Types';
import { emptyFunction, emptyPath, returnEmptyDoclist, returnEmptyFilter, returnFalse, returnOne, returnTrue, returnZero } from '../Utils';
-import { AudioUpload } from "./AudioUpload";
-import { Uploader } from "./ImageUpload";
-import "./AudioUpload.scss";
-import "./ImageUpload.scss";
-import "./MobileInterface.scss";
-
-library.add(...[faTasks, faReply, faQuoteLeft, faHandPointLeft, faFolderOpen, faAngleDoubleLeft, faExternalLinkSquareAlt, faMobile, faThLarge, faWindowClose, faEdit, faTrashAlt, faPalette, faAngleRight, faBell, faTrash, faCamera, faExpand, faCaretDown, faCaretLeft, faCaretRight, faCaretSquareDown, faCaretSquareRight, faArrowsAltH, faPlus, faMinus,
- faTerminal, faToggleOn, fileSolid, faExternalLinkAlt, faLocationArrow, faSearch, faFileDownload, faStop, faCalculator, faWindowMaximize, faAddressCard,
- faQuestionCircle, faArrowLeft, faArrowRight, faArrowDown, faArrowUp, faBolt, faBullseye, faCaretUp, faCat, faCheck, faChevronRight, faClipboard, faClone, faCloudUploadAlt,
- faCommentAlt, faCompressArrowsAlt, faCut, faEllipsisV, faEraser, faExclamation, faFileAlt, faFileAudio, faFilePdf, faFilm, faFilter, faFont, faGlobeAsia, faHighlighter,
- faLongArrowAltRight, faMicrophone, faMousePointer, faMusic, faObjectGroup, faPause, faPen, faPenNib, faPhone, faPlay, faPortrait, faRedoAlt, faStamp, faStickyNote,
- faThumbtack, faTree, faTv, faUndoAlt, faBook, faVideo, faAsterisk, faBrain, faImage, faPaintBrush, faTimes, faEye, faHome, faLongArrowAltLeft, faBars, faTh, faChevronLeft,
- faAlignLeft, faAlignRight].map(m => m as any));
-
+import { AudioUpload } from './AudioUpload';
+import { Uploader } from './ImageUpload';
+import './AudioUpload.scss';
+import './ImageUpload.scss';
+import './MobileInterface.scss';
+
+library.add(
+ ...[
+ faTasks,
+ faReply,
+ faQuoteLeft,
+ faHandPointLeft,
+ faFolderOpen,
+ faAngleDoubleLeft,
+ faExternalLinkSquareAlt,
+ faMobile,
+ faThLarge,
+ faWindowClose,
+ faEdit,
+ faTrashAlt,
+ faPalette,
+ faAngleRight,
+ faBell,
+ faTrash,
+ faCamera,
+ faExpand,
+ faCaretDown,
+ faCaretLeft,
+ faCaretRight,
+ faCaretSquareDown,
+ faCaretSquareRight,
+ faArrowsAltH,
+ faPlus,
+ faMinus,
+ faTerminal,
+ faToggleOn,
+ fileSolid,
+ faExternalLinkAlt,
+ faLocationArrow,
+ faSearch,
+ faFileDownload,
+ faStop,
+ faCalculator,
+ faWindowMaximize,
+ faAddressCard,
+ faQuestionCircle,
+ faArrowLeft,
+ faArrowRight,
+ faArrowDown,
+ faArrowUp,
+ faBolt,
+ faBullseye,
+ faCaretUp,
+ faCat,
+ faCheck,
+ faChevronRight,
+ faClipboard,
+ faClone,
+ faCloudUploadAlt,
+ faCommentAlt,
+ faCompressArrowsAlt,
+ faCut,
+ faEllipsisV,
+ faEraser,
+ faExclamation,
+ faFileAlt,
+ faFileAudio,
+ faFilePdf,
+ faFilm,
+ faFilter,
+ faFont,
+ faGlobeAsia,
+ faHighlighter,
+ faLongArrowAltRight,
+ faMicrophone,
+ faMousePointer,
+ faMusic,
+ faObjectGroup,
+ faPause,
+ faPen,
+ faPenNib,
+ faPhone,
+ faPlay,
+ faPortrait,
+ faRedoAlt,
+ faStamp,
+ faStickyNote,
+ faThumbtack,
+ faTree,
+ faTv,
+ faUndoAlt,
+ faBook,
+ faVideo,
+ faAsterisk,
+ faBrain,
+ faImage,
+ faPaintBrush,
+ faTimes,
+ faEye,
+ faHome,
+ faLongArrowAltLeft,
+ faBars,
+ faTh,
+ faChevronLeft,
+ faAlignLeft,
+ faAlignRight,
+ ].map(m => m as any)
+);
@observer
export class MobileInterface extends React.Component {
@@ -64,36 +248,38 @@ export class MobileInterface extends React.Component {
@observable private _homeDoc: Doc = this._mainDoc; // home menu as a document
@observable private _parents: Array<Doc> = []; // array of parent docs (for pathbar)
- @computed private get mainContainer() { return Doc.UserDoc() ? FieldValue(Cast(Doc.UserDoc().activeMobile, Doc)) : CurrentUserUtils.GuestMobile; }
+ @computed private get mainContainer() {
+ return Doc.UserDoc() ? FieldValue(Cast(Doc.UserDoc().activeMobile, Doc)) : CurrentUserUtils.GuestMobile;
+ }
constructor(props: Readonly<{}>) {
super(props);
- this._library = CurrentUserUtils.setupDashboards(Doc.UserDoc(), "myDashboards"); // to access documents in Dash Web
+ this._library = CurrentUserUtils.setupDashboards(Doc.UserDoc(), 'myDashboards'); // to access documents in Dash Web
MobileInterface.Instance = this;
}
@action
componentDidMount = () => {
// if the home menu is in list view -> adjust the menu toggle appropriately
- this._menuListView = this._homeDoc._viewType === "stacking" ? true : false;
+ this._menuListView = this._homeDoc._viewType === 'stacking' ? true : false;
CurrentUserUtils.ActiveTool = InkTool.None; // ink should intially be set to none
Doc.UserDoc().activeMobile = this._homeDoc; // active mobile set to home
AudioBox.Enabled = true;
// remove double click to avoid mobile zoom in
- document.removeEventListener("dblclick", this.onReactDoubleClick);
- document.addEventListener("dblclick", this.onReactDoubleClick);
- }
+ document.removeEventListener('dblclick', this.onReactDoubleClick);
+ document.addEventListener('dblclick', this.onReactDoubleClick);
+ };
@action
componentWillUnmount = () => {
document.removeEventListener('dblclick', this.onReactDoubleClick);
- }
+ };
// Prevent zooming in when double tapping the screen
onReactDoubleClick = (e: MouseEvent) => {
e.stopPropagation();
- }
+ };
// Switch the mobile view to the given doc
@action
@@ -110,7 +296,7 @@ export class MobileInterface extends React.Component {
// Ensures that switching to home is not registed
UndoManager.undoStack.length = 0;
UndoManager.redoStack.length = 0;
- }
+ };
// For toggling the hamburger menu
@action
@@ -120,29 +306,29 @@ export class MobileInterface extends React.Component {
if (this._ink) {
this.onSwitchInking();
}
- }
+ };
/**
* Method called when 'Library' button is pressed on the home screen
*/
switchToLibrary = async () => {
this.switchCurrentView(this._library);
- runInAction(() => this._homeMenu = false);
+ runInAction(() => (this._homeMenu = false));
this.toggleSidebar();
- }
+ };
/**
* Back method for navigating through items
*/
@action
back = () => {
- const header = document.getElementById("header") as HTMLElement;
+ const header = document.getElementById('header') as HTMLElement;
const doc = Cast(this._parents.pop(), Doc) as Doc; // Parent document
// Case 1: Parent document is 'dashboards'
- if (doc === Cast(this._library, Doc) as Doc) {
+ if (doc === (Cast(this._library, Doc) as Doc)) {
this.dashboards = null;
this.switchCurrentView(this._library);
// Case 2: Parent document is the 'home' menu (root node)
- } else if (doc === Cast(this._homeDoc, Doc) as Doc) {
+ } else if (doc === (Cast(this._homeDoc, Doc) as Doc)) {
this._homeMenu = true;
this._parents = [];
this.dashboards = null;
@@ -155,7 +341,7 @@ export class MobileInterface extends React.Component {
header.textContent = String(doc.title);
}
this._ink = false; // turns ink off
- }
+ };
/**
* Return 'Home", which implies returning to 'Home' menu buttons
@@ -171,7 +357,7 @@ export class MobileInterface extends React.Component {
if (this._sidebarActive) {
this.toggleSidebar();
}
- }
+ };
/**
* Return to primary Dashboard in library (Dashboards Doc)
@@ -182,7 +368,7 @@ export class MobileInterface extends React.Component {
this.switchCurrentView(this._library);
this._homeMenu = false;
this.dashboards = null;
- }
+ };
/**
* Note: window.innerWidth and window.screen.width compute different values.
@@ -190,14 +376,14 @@ export class MobileInterface extends React.Component {
* display resolution which computes differently.
*/
returnWidth = () => window.innerWidth; //The windows width
- returnHeight = () => (window.innerHeight - 300); //Calculating the windows height (-300 to account for topbar)
- whitebackground = () => "white";
+ returnHeight = () => window.innerHeight - 300; //Calculating the windows height (-300 to account for topbar)
+ whitebackground = () => 'white';
/**
* DocumentView for graphic display of all documents
*/
@computed get displayDashboards() {
- return !this.mainContainer ? (null) :
- <div style={{ position: "relative", top: '198px', height: `calc(100% - 350px)`, width: "100%", left: "0%" }}>
+ return !this.mainContainer ? null : (
+ <div style={{ position: 'relative', top: '198px', height: `calc(100% - 350px)`, width: '100%', left: '0%' }}>
<DocumentView
Document={this.mainContainer}
DataDoc={undefined}
@@ -223,7 +409,8 @@ export class MobileInterface extends React.Component {
ContainingCollectionView={undefined}
ContainingCollectionDoc={undefined}
/>
- </div>;
+ </div>
+ );
}
/**
@@ -233,20 +420,19 @@ export class MobileInterface extends React.Component {
*/
handleClick = async (doc: Doc) => {
runInAction(() => {
- if (doc.type !== "collection" && this._sidebarActive) {
+ if (doc.type !== 'collection' && this._sidebarActive) {
this._parents.push(this._activeDoc);
this.switchCurrentView(doc);
this._homeMenu = false;
this.toggleSidebar();
- }
- else {
+ } else {
this._parents.push(this._activeDoc);
this.switchCurrentView(doc);
this._homeMenu = false;
this.dashboards = doc;
}
});
- }
+ };
/**
* Called when an item in the library is clicked and should
@@ -260,30 +446,31 @@ export class MobileInterface extends React.Component {
this._homeMenu = false;
this.dashboards = doc;
this.toggleSidebar();
- }
+ };
// Renders the graphical pathbar
renderPathbar = () => {
const docPath = [...this._parents, this._activeDoc];
- const items = docPath.map((doc: Doc, index: any) =>
+ const items = docPath.map((doc: Doc, index: any) => (
<div className="pathbarItem" key={index}>
- {index === 0 ? (null) : <FontAwesomeIcon key="icon" className="pathIcon" icon="angle-right" size="lg" />}
- <div className="pathbarText"
- style={{ backgroundColor: this._homeMenu || doc === this._activeDoc ? "rgb(119,17,37)" : undefined }}
- onClick={() => this.handlePathClick(doc, index)}>{doc.title}
+ {index === 0 ? null : <FontAwesomeIcon key="icon" className="pathIcon" icon="angle-right" size="lg" />}
+ <div className="pathbarText" style={{ backgroundColor: this._homeMenu || doc === this._activeDoc ? 'rgb(119,17,37)' : undefined }} onClick={() => this.handlePathClick(doc, index)}>
+ {StrCast(doc.title)}
</div>
- </div>);
- return (<div className="pathbar">
- <div className="scrollmenu">
- {items}
</div>
- {!this._parents.length ? (null) :
- <div className="back" >
- <FontAwesomeIcon onClick={this.back} icon={"chevron-left"} color="white" size={"2x"} />
- </div>}
- <div className="hidePath" />
- </div>);
- }
+ ));
+ return (
+ <div className="pathbar">
+ <div className="scrollmenu">{items}</div>
+ {!this._parents.length ? null : (
+ <div className="back">
+ <FontAwesomeIcon onClick={this.back} icon={'chevron-left'} color="white" size={'2x'} />
+ </div>
+ )}
+ <div className="hidePath" />
+ </div>
+ );
+ };
// Handles when user clicks on a document in the pathbar
@action
@@ -300,7 +487,7 @@ export class MobileInterface extends React.Component {
this.switchCurrentView(doc);
this._parents.length = index;
}
- }
+ };
// Renders the contents of the menu and sidebar
@computed get renderDefaultContent() {
@@ -309,7 +496,9 @@ export class MobileInterface extends React.Component {
<div>
<div className="navbar">
<FontAwesomeIcon className="home" icon="home" onClick={this.returnHome} />
- <div className="header" id="header">{this._homeDoc.title}</div>
+ <div className="header" id="header">
+ {StrCast(this._homeDoc.title)}
+ </div>
<div className="cover" id="cover" onClick={e => e.stopPropagation()}></div>
<div className="toggle-btn" id="menuButton" onClick={this.toggleSidebar}>
<span></span>
@@ -328,14 +517,17 @@ export class MobileInterface extends React.Component {
}
// returns a list of navbar buttons as 'buttons'
const buttons = DocListCast(dashboards.data).map((doc: Doc, index: any) => {
- if (doc.type !== "ink") {
+ if (doc.type !== 'ink') {
return (
- <div
- className="item"
- key={index}>
- <div className="item-title" onClick={() => this.handleClick(doc)}> {doc.title} </div>
- <div className="item-type" onClick={() => this.handleClick(doc)}>{doc.type}</div>
- <FontAwesomeIcon onClick={() => this.handleClick(doc)} className="right" icon="angle-right" size="lg" style={{ display: `${doc.type === "collection" ? "block" : "none"}` }} />
+ <div className="item" key={index}>
+ <div className="item-title" onClick={() => this.handleClick(doc)}>
+ {' '}
+ {doc.title as string}{' '}
+ </div>
+ <div className="item-type" onClick={() => this.handleClick(doc)}>
+ {doc.type as string}
+ </div>
+ <FontAwesomeIcon onClick={() => this.handleClick(doc)} className="right" icon="angle-right" size="lg" style={{ display: `${doc.type === 'collection' ? 'block' : 'none'}` }} />
<FontAwesomeIcon className="open" onClick={() => this.openFromSidebar(doc)} icon="external-link-alt" size="lg" />
</div>
);
@@ -346,43 +538,39 @@ export class MobileInterface extends React.Component {
<div>
<div className="navbar">
<FontAwesomeIcon className="home" icon="home" onClick={this.returnHome} />
- <div className="header" id="header">{this._sidebarActive ? "library" : this._activeDoc.title}</div>
- <div className={`toggle-btn ${this._sidebarActive ? "active" : ""}`} onClick={this.toggleSidebar}>
+ <div className="header" id="header">
+ {this._sidebarActive ? 'library' : (this._activeDoc.title as string)}
+ </div>
+ <div className={`toggle-btn ${this._sidebarActive ? 'active' : ''}`} onClick={this.toggleSidebar}>
<span></span>
<span></span>
<span></span>
</div>
- <div className={`background ${this._sidebarActive ? "active" : ""}`} onClick={this.toggleSidebar}></div>
+ <div className={`background ${this._sidebarActive ? 'active' : ''}`} onClick={this.toggleSidebar}></div>
</div>
{this.renderPathbar()}
- <div className={`sidebar ${this._sidebarActive ? "active" : ""}`}>
+ <div className={`sidebar ${this._sidebarActive ? 'active' : ''}`}>
<div className="sidebarButtons">
- {this.dashboards ?
+ {this.dashboards ? (
<>
{buttons}
- <div
- className="item" key="home"
- onClick={this.returnMain}
- style={{ opacity: 0.7 }}>
+ <div className="item" key="home" onClick={this.returnMain} style={{ opacity: 0.7 }}>
<FontAwesomeIcon className="right" icon="angle-double-left" size="lg" />
<div className="item-type">Return to dashboards</div>
</div>
- </> :
+ </>
+ ) : (
<>
{buttons}
- <div
- className="item"
- style={{ opacity: 0.7 }}
- onClick={() => this.createNewDashboard()}>
+ <div className="item" style={{ opacity: 0.7 }} onClick={() => this.createNewDashboard()}>
<FontAwesomeIcon className="right" icon="plus" size="lg" />
<div className="item-type">Create New Dashboard</div>
</div>
</>
- }
+ )}
</div>
</div>
- <div className={`blanket ${this._sidebarActive ? "active" : ""}`} onClick={this.toggleSidebar}>
- </div>
+ <div className={`blanket ${this._sidebarActive ? 'active' : ''}`} onClick={this.toggleSidebar}></div>
</div>
);
}
@@ -397,26 +585,26 @@ export class MobileInterface extends React.Component {
const freeformOptions: DocumentOptions = {
x: 0,
y: 400,
- title: "Collection " + dashboardCount,
+ title: 'Collection ' + 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: `Dashboard ${dashboardCount}` }, id, 'row');
const toggleTheme = ScriptField.MakeScript(`self.colorScheme = self.colorScheme ? undefined: ${ColorScheme.Dark}}`);
const toggleComic = ScriptField.MakeScript(`toggleComicMode()`);
const cloneDashboard = ScriptField.MakeScript(`cloneDashboard()`);
dashboardDoc.contextMenuScripts = new List<ScriptField>([toggleTheme!, toggleComic!, cloneDashboard!]);
- dashboardDoc.contextMenuLabels = new List<string>(["Toggle Theme Colors", "Toggle Comic Mode", "New Dashboard Layout"]);
+ dashboardDoc.contextMenuLabels = new List<string>(['Toggle Theme Colors', 'Toggle Comic Mode', 'New Dashboard Layout']);
- Doc.AddDocToList(scens, "data", dashboardDoc);
- }
+ Doc.AddDocToList(scens, 'data', dashboardDoc);
+ };
// Button for switching between pen and ink mode
@action
onSwitchInking = () => {
- const button = document.getElementById("inkButton") as HTMLElement;
- button.style.backgroundColor = this._ink ? "white" : "black";
- button.style.color = this._ink ? "black" : "white";
+ const button = document.getElementById('inkButton') as HTMLElement;
+ button.style.backgroundColor = this._ink ? 'white' : 'black';
+ button.style.color = this._ink ? 'black' : 'white';
if (!this._ink) {
CurrentUserUtils.ActiveTool = InkTool.Pen;
@@ -425,23 +613,20 @@ export class MobileInterface extends React.Component {
CurrentUserUtils.ActiveTool = InkTool.None;
this._ink = false;
}
- }
+ };
// The static ink menu that appears at the top
@computed get inkMenu() {
- return this._activeDoc._viewType !== CollectionViewType.Docking || !this._ink ? (null) :
- <div className="colorSelector">
- {/* <CollectionFreeFormViewChrome /> */}
- </div>;
+ return this._activeDoc._viewType !== CollectionViewType.Docking || !this._ink ? null : <div className="colorSelector">{/* <CollectionFreeFormViewChrome /> */}</div>;
}
// DocButton that uses UndoManager and handles the opacity change if CanUndo is true
@computed get undo() {
- if (this.mainContainer && this._activeDoc.type === "collection" && this._activeDoc !== this._homeDoc &&
- this._activeDoc !== Doc.SharingDoc() && this._activeDoc.title !== "WORKSPACES") {
+ if (this.mainContainer && this._activeDoc.type === 'collection' && this._activeDoc !== this._homeDoc && this._activeDoc !== Doc.SharingDoc() && this._activeDoc.title !== 'WORKSPACES') {
return (
- <div className="docButton"
- style={{ backgroundColor: "black", color: "white", fontSize: "60", opacity: UndoManager.CanUndo() ? "1" : "0.4", }}
+ <div
+ className="docButton"
+ style={{ backgroundColor: 'black', color: 'white', fontSize: '60', opacity: UndoManager.CanUndo() ? '1' : '0.4' }}
id="undoButton"
title="undo"
onClick={(e: React.MouseEvent) => {
@@ -449,17 +634,18 @@ export class MobileInterface extends React.Component {
e.stopPropagation();
}}>
<FontAwesomeIcon className="documentdecorations-icon" size="sm" icon="undo-alt" />
- </div>);
- } else return (null);
+ </div>
+ );
+ } else return null;
}
// DocButton that uses UndoManager and handles the opacity change if CanRedo is true
@computed get redo() {
- if (this.mainContainer && this._activeDoc.type === "collection" && this._activeDoc !== this._homeDoc &&
- this._activeDoc !== Doc.SharingDoc() && this._activeDoc.title !== "WORKSPACES") {
+ if (this.mainContainer && this._activeDoc.type === 'collection' && this._activeDoc !== this._homeDoc && this._activeDoc !== Doc.SharingDoc() && this._activeDoc.title !== 'WORKSPACES') {
return (
- <div className="docButton"
- style={{ backgroundColor: "black", color: "white", fontSize: "60", opacity: UndoManager.CanRedo() ? "1" : "0.4", }}
+ <div
+ className="docButton"
+ style={{ backgroundColor: 'black', color: 'white', fontSize: '60', opacity: UndoManager.CanRedo() ? '1' : '0.4' }}
id="undoButton"
title="redo"
onClick={(e: React.MouseEvent) => {
@@ -467,78 +653,81 @@ export class MobileInterface extends React.Component {
e.stopPropagation();
}}>
<FontAwesomeIcon className="documentdecorations-icon" size="sm" icon="redo-alt" />
- </div>);
- } else return (null);
+ </div>
+ );
+ } else return null;
}
// DocButton for switching into ink mode
@computed get drawInk() {
- return !this.mainContainer || this._activeDoc._viewType !== CollectionViewType.Docking ? (null) :
- <div className="docButton"
- id="inkButton"
- title={Doc.isDocPinned(this._activeDoc) ? "Pen on" : "Pen off"}
- onClick={this.onSwitchInking}>
+ return !this.mainContainer || this._activeDoc._viewType !== CollectionViewType.Docking ? null : (
+ <div className="docButton" id="inkButton" title={Doc.isDocPinned(this._activeDoc) ? 'Pen on' : 'Pen off'} onClick={this.onSwitchInking}>
<FontAwesomeIcon className="documentdecorations-icon" size="sm" icon="pen-nib" />
- </div>;
+ </div>
+ );
}
// DocButton: Button that appears on the bottom of the screen to initiate image upload
@computed get uploadImageButton() {
- if (this._activeDoc.type === DocumentType.COL && this._activeDoc !== this._homeDoc && this._activeDoc._viewType !== CollectionViewType.Docking && this._activeDoc.title !== "WORKSPACES") {
- return <div className="docButton"
- id="imageButton"
- title={Doc.isDocPinned(this._activeDoc) ? "Pen on" : "Pen off"}
- onClick={this.toggleUpload}>
- <FontAwesomeIcon className="documentdecorations-icon" size="sm" icon="upload" />
- </div>;
- } else return (null);
+ if (this._activeDoc.type === DocumentType.COL && this._activeDoc !== this._homeDoc && this._activeDoc._viewType !== CollectionViewType.Docking && this._activeDoc.title !== 'WORKSPACES') {
+ return (
+ <div className="docButton" id="imageButton" title={Doc.isDocPinned(this._activeDoc) ? 'Pen on' : 'Pen off'} onClick={this.toggleUpload}>
+ <FontAwesomeIcon className="documentdecorations-icon" size="sm" icon="upload" />
+ </div>
+ );
+ } else return null;
}
// DocButton to download images on the mobile
@computed get downloadDocument() {
- if (this._activeDoc.type === "image" || this._activeDoc.type === "pdf" || this._activeDoc.type === "video") {
- return <div className="docButton"
- title={"Download Image"}
- style={{ backgroundColor: "white", color: "black" }}
- onClick={e => window.open(this._activeDoc["data-path"]?.toString())}> {/* daa-path holds the url */}
- <FontAwesomeIcon className="documentdecorations-icon" size="sm" icon="download" />
- </div>;
- } else return (null);
+ if (this._activeDoc.type === 'image' || this._activeDoc.type === 'pdf' || this._activeDoc.type === 'video') {
+ return (
+ <div className="docButton" title={'Download Image'} style={{ backgroundColor: 'white', color: 'black' }} onClick={e => window.open(this._activeDoc['data-path']?.toString())}>
+ {' '}
+ {/* daa-path holds the url */}
+ <FontAwesomeIcon className="documentdecorations-icon" size="sm" icon="download" />
+ </div>
+ );
+ } else return null;
}
// DocButton for pinning images to presentation
@computed get pinToPresentation() {
// Only making button available if it is an image
- if (!(this._activeDoc.type === "collection" || this._activeDoc.type === "presentation")) {
+ if (!(this._activeDoc.type === 'collection' || this._activeDoc.type === 'presentation')) {
const isPinned = this._activeDoc && Doc.isDocPinned(this._activeDoc);
- return <div className="docButton"
- title={Doc.isDocPinned(this._activeDoc) ? "Unpin from presentation" : "Pin to presentation"}
- style={{ backgroundColor: isPinned ? "black" : "white", color: isPinned ? "white" : "black" }}
- onClick={e => TabDocView.PinDoc(this._activeDoc)}>
- <FontAwesomeIcon className="documentdecorations-icon" size="sm" icon="map-pin" />
- </div>;
- } else return (null);
+ return (
+ <div
+ className="docButton"
+ title={Doc.isDocPinned(this._activeDoc) ? 'Unpin from presentation' : 'Pin to presentation'}
+ style={{ backgroundColor: isPinned ? 'black' : 'white', color: isPinned ? 'white' : 'black' }}
+ onClick={e => TabDocView.PinDoc(this._activeDoc)}>
+ <FontAwesomeIcon className="documentdecorations-icon" size="sm" icon="map-pin" />
+ </div>
+ );
+ } else return null;
}
// Buttons for switching the menu between large and small icons
@computed get switchMenuView() {
- return this._activeDoc.title !== this._homeDoc.title ? (null) :
+ return this._activeDoc.title !== this._homeDoc.title ? null : (
<div className="homeSwitch">
- <div className={`list ${!this._menuListView ? "active" : ""}`} onClick={this.changeToIconView}>
+ <div className={`list ${!this._menuListView ? 'active' : ''}`} onClick={this.changeToIconView}>
<FontAwesomeIcon size="sm" icon="th-large" />
</div>
- <div className={`list ${this._menuListView ? "active" : ""}`} onClick={this.changeToListView}>
+ <div className={`list ${this._menuListView ? 'active' : ''}`} onClick={this.changeToListView}>
<FontAwesomeIcon size="sm" icon="bars" />
</div>
- </div>;
+ </div>
+ );
}
// Logic for switching the menu into the icons
@action
changeToIconView = () => {
- if (this._homeDoc._viewType = "stacking") {
+ if ((this._homeDoc._viewType = 'stacking')) {
this._menuListView = false;
- this._homeDoc._viewType = "masonry";
+ this._homeDoc._viewType = 'masonry';
this._homeDoc.columnWidth = 300;
this._homeDoc._columnWidth = 300;
const menuButtons = DocListCast(this._homeDoc.data);
@@ -551,13 +740,13 @@ export class MobileInterface extends React.Component {
doc._nativeWidth = 400;
});
}
- }
+ };
// Logic for switching the menu into the stacking view
@action
changeToListView = () => {
- if (this._homeDoc._viewType = "masonry") {
- this._homeDoc._viewType = "stacking";
+ if ((this._homeDoc._viewType = 'masonry')) {
+ this._homeDoc._viewType = 'stacking';
this._menuListView = true;
const menuButtons = DocListCast(this._homeDoc.data);
menuButtons.map(doc => {
@@ -568,7 +757,7 @@ export class MobileInterface extends React.Component {
doc._nativeWidth = 900;
});
}
- }
+ };
// For setting up the presentation document for the home menu
@action
@@ -579,49 +768,48 @@ export class MobileInterface extends React.Component {
this.switchCurrentView(presentation);
this._homeMenu = false;
}
- }
+ };
// For toggling image upload pop up
@action
- toggleUpload = () => this._imageUploadActive = !this._imageUploadActive
+ toggleUpload = () => (this._imageUploadActive = !this._imageUploadActive);
// For toggling audio record and dictate pop up
@action
- toggleAudio = () => this._audioUploadActive = !this._audioUploadActive
+ toggleAudio = () => (this._audioUploadActive = !this._audioUploadActive);
// Button for toggling the upload pop up in a collection
@action
toggleUploadInCollection = () => {
- const button = document.getElementById("imageButton") as HTMLElement;
- button.style.backgroundColor = this._imageUploadActive ? "white" : "black";
- button.style.color = this._imageUploadActive ? "black" : "white";
+ const button = document.getElementById('imageButton') as HTMLElement;
+ button.style.backgroundColor = this._imageUploadActive ? 'white' : 'black';
+ button.style.color = this._imageUploadActive ? 'black' : 'white';
this._imageUploadActive = !this._imageUploadActive;
- }
+ };
// For closing the image upload pop up
@action
closeUpload = () => {
this._imageUploadActive = false;
- }
+ };
// Returns the image upload pop up
@computed get uploadImage() {
- const doc = !this._homeMenu ? this._activeDoc : Cast(Doc.SharingDoc(), Doc) as Doc;
+ const doc = !this._homeMenu ? this._activeDoc : (Cast(Doc.SharingDoc(), Doc) as Doc);
return <Uploader Document={doc} />;
}
- // Radial menu can only be used if it is a colleciton and it is not a homeDoc
+ // Radial menu can only be used if it is a colleciton and it is not a homeDoc
// (and cannot be used on Dashboard to avoid pin to presentation opening on right)
@computed get displayRadialMenu() {
- return this._activeDoc.type === "collection" && this._activeDoc !== this._homeDoc &&
- this._activeDoc._viewType !== CollectionViewType.Docking ? <RadialMenu /> : (null);
+ return this._activeDoc.type === 'collection' && this._activeDoc !== this._homeDoc && this._activeDoc._viewType !== CollectionViewType.Docking ? <RadialMenu /> : null;
}
onDragOver = (e: React.DragEvent) => {
e.preventDefault();
e.stopPropagation();
- }
+ };
/**
* MENU BUTTON
@@ -633,22 +821,22 @@ export class MobileInterface extends React.Component {
const mobileUpload = Cast(Doc.SharingDoc(), Doc) as Doc;
this.switchCurrentView(mobileUpload);
this._homeMenu = false;
- }
+ };
render() {
return (
<div className="mobileInterface-container" onDragOver={this.onDragOver}>
<SettingsManager />
- <div className={`image-upload ${this._imageUploadActive ? "active" : ""}`}>
- {this.uploadImage}
- </div>
- <div className={`audio-upload ${this._audioUploadActive ? "active" : ""}`}>
+ <div className={`image-upload ${this._imageUploadActive ? 'active' : ''}`}>{this.uploadImage}</div>
+ <div className={`audio-upload ${this._audioUploadActive ? 'active' : ''}`}>
<AudioUpload />
</div>
{this.switchMenuView}
{this.inkMenu}
<GestureOverlay>
- <div style={{ display: "none" }}><RichTextMenu key="rich" /></div>
+ <div style={{ display: 'none' }}>
+ <RichTextMenu key="rich" />
+ </div>
<div className="docButtonContainer">
{this.pinToPresentation}
{this.downloadDocument}
@@ -666,21 +854,31 @@ export class MobileInterface extends React.Component {
}
}
-
//Global functions for mobile menu
-ScriptingGlobals.add(function switchToMobileLibrary() { return MobileInterface.Instance.switchToLibrary(); },
- "opens the library to navigate through dashboards on Dash Mobile");
-ScriptingGlobals.add(function openMobileUploads() { return MobileInterface.Instance.toggleUpload(); },
- "opens the upload files menu for Dash Mobile");
-ScriptingGlobals.add(function switchToMobileUploadCollection() { return MobileInterface.Instance.switchToMobileUploads(); },
- "opens the mobile uploads collection on Dash Mobile");
-ScriptingGlobals.add(function openMobileAudio() { return MobileInterface.Instance.toggleAudio(); },
- "opens the record and dictate menu on Dash Mobile");
-ScriptingGlobals.add(function switchToMobilePresentation() { return MobileInterface.Instance.setupDefaultPresentation(); },
- "opens the presentation on Dash Mobile");
-ScriptingGlobals.add(function openMobileSettings() { return SettingsManager.Instance.open(); },
- "opens settings on Dash Mobile");
+ScriptingGlobals.add(function switchToMobileLibrary() {
+ return MobileInterface.Instance.switchToLibrary();
+}, 'opens the library to navigate through dashboards on Dash Mobile');
+ScriptingGlobals.add(function openMobileUploads() {
+ return MobileInterface.Instance.toggleUpload();
+}, 'opens the upload files menu for Dash Mobile');
+ScriptingGlobals.add(function switchToMobileUploadCollection() {
+ return MobileInterface.Instance.switchToMobileUploads();
+}, 'opens the mobile uploads collection on Dash Mobile');
+ScriptingGlobals.add(function openMobileAudio() {
+ return MobileInterface.Instance.toggleAudio();
+}, 'opens the record and dictate menu on Dash Mobile');
+ScriptingGlobals.add(function switchToMobilePresentation() {
+ return MobileInterface.Instance.setupDefaultPresentation();
+}, 'opens the presentation on Dash Mobile');
+ScriptingGlobals.add(function openMobileSettings() {
+ return SettingsManager.Instance.open();
+}, 'opens settings on Dash Mobile');
// Other global functions for mobile
-ScriptingGlobals.add(function switchMobileView(doc: Doc, renderView?: () => JSX.Element, onSwitch?: () => void) { return MobileInterface.Instance.switchCurrentView(doc, renderView, onSwitch); },
- "changes the active document displayed on the Dash Mobile", "(doc: any)"); \ No newline at end of file
+ScriptingGlobals.add(
+ function switchMobileView(doc: Doc, renderView?: () => JSX.Element, onSwitch?: () => void) {
+ return MobileInterface.Instance.switchCurrentView(doc, renderView, onSwitch);
+ },
+ 'changes the active document displayed on the Dash Mobile',
+ '(doc: any)'
+);