aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/PropertiesButtons.tsx
diff options
context:
space:
mode:
authorbrynnchernosky <56202540+brynnchernosky@users.noreply.github.com>2023-01-19 14:33:22 -0500
committerbrynnchernosky <56202540+brynnchernosky@users.noreply.github.com>2023-01-19 14:33:22 -0500
commit0ef7050b0792ce183c7d5cda637cb79b7a92b704 (patch)
treed1dca8f09ddc2954c2ce88439172aeded672c0b6 /src/client/views/PropertiesButtons.tsx
parentceb338752aacc383c97a0e3a9b608365a1cf39b6 (diff)
parentd5f796b433d7e72130d4109a3775347ccb10c454 (diff)
Merge branch 'master' of github.com:brown-dash/Dash-Web into master
Diffstat (limited to 'src/client/views/PropertiesButtons.tsx')
-rw-r--r--src/client/views/PropertiesButtons.tsx55
1 files changed, 51 insertions, 4 deletions
diff --git a/src/client/views/PropertiesButtons.tsx b/src/client/views/PropertiesButtons.tsx
index 80c2c7705..66c3ed439 100644
--- a/src/client/views/PropertiesButtons.tsx
+++ b/src/client/views/PropertiesButtons.tsx
@@ -2,7 +2,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Tooltip } from '@material-ui/core';
import { action, computed, observable } from 'mobx';
import { observer } from 'mobx-react';
-import { Doc, Opt } from '../../fields/Doc';
+import { Doc, DocListCast, Opt } from '../../fields/Doc';
import { Id } from '../../fields/FieldSymbols';
import { InkField } from '../../fields/InkField';
import { RichTextField } from '../../fields/RichTextField';
@@ -14,7 +14,7 @@ import { SelectionManager } from '../util/SelectionManager';
import { undoBatch } from '../util/UndoManager';
import { Colors } from './global/globalEnums';
import { InkingStroke } from './InkingStroke';
-import { DocumentView } from './nodes/DocumentView';
+import { DocumentView, OpenWhere } from './nodes/DocumentView';
import { VideoBox } from './nodes/VideoBox';
import { pasteImageBitmap } from './nodes/WebBoxRenderer';
import './PropertiesButtons.scss';
@@ -93,6 +93,14 @@ export class PropertiesButtons extends React.Component<{}, {}> {
on => 'lock'
);
}
+ @computed get forceActiveButton() {
+ return this.propertyToggleBtn(
+ 'Active',
+ '_forceActive',
+ on => `${on ? 'Select to activate' : 'Contents always active'} `,
+ on => 'eye'
+ );
+ }
@computed get fitContentButton() {
return this.propertyToggleBtn(
'View All',
@@ -101,6 +109,43 @@ export class PropertiesButtons extends React.Component<{}, {}> {
on => 'eye'
);
}
+ // this implments a container pattern by marking the targetDoc (collection) as an inPlace container,
+ // and then making the contained collection be a "menu" such that when any of its contents are clicked,
+ // they will open their targets in the outer container. To get back to the "menu", you click on the main container.
+ @computed get inPlaceContainerButton() {
+ return this.propertyToggleBtn(
+ 'In Place',
+ 'isInPlaceContainer',
+ on => `${on ? 'Make' : 'Remove'} in place container flag`,
+ on => 'window-restore',
+ onClick => {
+ SelectionManager.Views().forEach(dv => {
+ const containerDoc = dv.rootDoc;
+ containerDoc.followAllLinks =
+ containerDoc.noShadow =
+ containerDoc.noHighlighting =
+ containerDoc._isLinkButton =
+ containerDoc._fitContentsToBox =
+ containerDoc._forceActive =
+ containerDoc._isInPlaceContainer =
+ !containerDoc._isInPlaceContainer;
+ containerDoc.followLinkLocation = containerDoc._isInPlaceContainer ? OpenWhere.inPlace : undefined;
+ containerDoc._xPadding = containerDoc._yPadding = containerDoc._isInPlaceContainer ? 10 : undefined;
+ const menuDoc = DocListCast(dv.dataDoc[dv.props.fieldKey ?? Doc.LayoutFieldKey(containerDoc)]).lastElement();
+ if (menuDoc) {
+ menuDoc.hideDecorations = menuDoc._forceActive = menuDoc._fitContentsToBox = menuDoc._isLinkButton = menuDoc._noShadow = menuDoc.noHighlighting = containerDoc._isInPlaceContainer;
+ if (!dv.allLinks.find(link => link.anchor1 === menuDoc || link.anchor2 === menuDoc)) {
+ DocUtils.MakeLink({ doc: dv.rootDoc }, { doc: menuDoc }, 'back link to container');
+ }
+ DocListCast(menuDoc[Doc.LayoutFieldKey(menuDoc)]).forEach(menuItem => {
+ menuItem.followLinkAudio = menuItem.followAllLinks = menuItem._isLinkButton = true;
+ menuItem._followLinkLocation = OpenWhere.inPlace;
+ });
+ }
+ });
+ }
+ );
+ }
@computed get fitWidthButton() {
return this.propertyToggleBtn(
'Fit\xA0Width',
@@ -256,7 +301,7 @@ export class PropertiesButtons extends React.Component<{}, {}> {
docView.setToggleDetail();
break;
case 'linkInPlace':
- docView.toggleFollowLink('inPlace', true, false);
+ docView.toggleFollowLink('inPlace', false, false);
break;
case 'linkOnRight':
docView.toggleFollowLink('add:right', false, false);
@@ -277,7 +322,7 @@ export class PropertiesButtons extends React.Component<{}, {}> {
['nothing', 'Select Document'],
['enterPortal', 'Enter Portal'],
['toggleDetail', 'Toggle Detail'],
- ['linkInPlace', 'Follow Link'],
+ ['linkInPlace', 'Open in Place'],
['linkOnRight', 'Open Link on Right'],
];
const currentSelection = this.selectedDoc.onClickBehavior;
@@ -360,7 +405,9 @@ export class PropertiesButtons extends React.Component<{}, {}> {
{toggle(this.onClickButton)}
{toggle(this.fitWidthButton)}
{toggle(this.freezeThumb)}
+ {toggle(this.forceActiveButton, { display: !isFreeForm && !isMap ? 'none' : '' })}
{toggle(this.fitContentButton, { display: !isFreeForm && !isMap ? 'none' : '' })}
+ {toggle(this.inPlaceContainerButton, { display: !isFreeForm && !isMap ? 'none' : '' })}
{toggle(this.autoHeightButton, { display: !isText && !isStacking && !isTree ? 'none' : '' })}
{toggle(this.maskButton, { display: !isInk ? 'none' : '' })}
{toggle(this.chromeButton, { display: !isCollection || isNovice ? 'none' : '' })}