aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/linking
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views/linking')
-rw-r--r--src/client/views/linking/LinkEditor.tsx22
-rw-r--r--src/client/views/linking/LinkMenu.tsx31
-rw-r--r--src/client/views/linking/LinkMenuGroup.tsx65
-rw-r--r--src/client/views/linking/LinkMenuItem.scss6
-rw-r--r--src/client/views/linking/LinkMenuItem.tsx57
5 files changed, 94 insertions, 87 deletions
diff --git a/src/client/views/linking/LinkEditor.tsx b/src/client/views/linking/LinkEditor.tsx
index 07c20dae4..01e33708a 100644
--- a/src/client/views/linking/LinkEditor.tsx
+++ b/src/client/views/linking/LinkEditor.tsx
@@ -252,7 +252,7 @@ export class LinkEditor extends React.Component<LinkEditorProps> {
get followingDropdown() {
return (
<div className="linkEditor-followingDropdown">
- <div className="linkEditor-followingDropdown-label">Follow Behavior:</div>
+ <div className="linkEditor-followingDropdown-label">Follow by:</div>
<div className="linkEditor-followingDropdown-dropdown">
<div className="linkEditor-followingDropdown-header" onPointerDown={this.changeDropdown}>
{StrCast(this.props.linkDoc.followLinkLocation, 'default')}
@@ -263,28 +263,28 @@ export class LinkEditor extends React.Component<LinkEditorProps> {
Default
</div>
<div className="linkEditor-followingDropdown-option" onPointerDown={() => this.changeFollowBehavior('add:left')}>
- Always open in new left pane
+ Always opening in new left pane
</div>
<div className="linkEditor-followingDropdown-option" onPointerDown={() => this.changeFollowBehavior('add:right')}>
- Always open in new right pane
+ Always opening in new right pane
</div>
<div className="linkEditor-followingDropdown-option" onPointerDown={() => this.changeFollowBehavior('replace:right')}>
- Always replace right tab
+ Always replacing right tab
</div>
<div className="linkEditor-followingDropdown-option" onPointerDown={() => this.changeFollowBehavior('replace:left')}>
- Always replace left tab
+ Always replacing left tab
</div>
<div className="linkEditor-followingDropdown-option" onPointerDown={() => this.changeFollowBehavior('fullScreen')}>
- Always open full screen
+ Always opening full screen
</div>
<div className="linkEditor-followingDropdown-option" onPointerDown={() => this.changeFollowBehavior('add')}>
- Always open in a new tab
+ Always opening in a new tab
</div>
<div className="linkEditor-followingDropdown-option" onPointerDown={() => this.changeFollowBehavior('replace')}>
- Replace Tab
+ Replacing Tab
</div>
<div className="linkEditor-followingDropdown-option" onPointerDown={() => this.changeFollowBehavior('inPlace')}>
- In Place
+ Opening in Place
</div>
{this.props.linkDoc.linksToAnnotation ? (
<div className="linkEditor-followingDropdown-option" onPointerDown={() => this.changeFollowBehavior('openExternal')}>
@@ -320,7 +320,7 @@ export class LinkEditor extends React.Component<LinkEditorProps> {
get effectDropdown() {
return (
<div className="linkEditor-followingDropdown">
- <div className="linkEditor-followingDropdown-label">Transition Effect:</div>
+ <div className="linkEditor-followingDropdown-label">Animation:</div>
<div className="linkEditor-followingDropdown-dropdown">
<div className="linkEditor-followingDropdown-header" onPointerDown={this.changeEffectDropdown}>
{StrCast(this.destinationAnchor.presEffect, 'default')}
@@ -437,6 +437,8 @@ export class LinkEditor extends React.Component<LinkEditorProps> {
<div
className={'slider-headers'}
style={{
+ marginLeft: 30,
+ marginRight: 30,
display: 'grid',
justifyContent: 'space-between',
width: '100%',
diff --git a/src/client/views/linking/LinkMenu.tsx b/src/client/views/linking/LinkMenu.tsx
index 0096a58bd..0c46a6d96 100644
--- a/src/client/views/linking/LinkMenu.tsx
+++ b/src/client/views/linking/LinkMenu.tsx
@@ -8,12 +8,13 @@ import { LinkEditor } from './LinkEditor';
import './LinkMenu.scss';
import { LinkMenuGroup } from './LinkMenuGroup';
import React = require('react');
+import { emptyFunction } from '../../../Utils';
interface Props {
docView: DocumentView;
- position?: { x?: number; y?: number };
+ style?: { left: number; top: number };
itemHandler?: (doc: Doc) => void;
- clearLinkEditor: () => void;
+ clearLinkEditor?: () => void;
}
/**
@@ -25,26 +26,24 @@ export class LinkMenu extends React.Component<Props> {
@observable _editingLink?: Doc;
@observable _linkMenuRef = React.createRef<HTMLDivElement>();
- @computed get position() {
- return this.props.position ?? (dv => ({ x: dv?.left || 0, y: (dv?.bottom || 0) + 15 }))(this.props.docView.getBounds());
- }
-
- clear = action(() => {
- this.props.clearLinkEditor();
- this._editingLink = undefined;
- });
+ clear = !this.props.clearLinkEditor
+ ? undefined
+ : action(() => {
+ this.props.clearLinkEditor?.();
+ this._editingLink = undefined;
+ });
componentDidMount() {
- document.addEventListener('pointerdown', this.onPointerDown, true);
+ this.props.clearLinkEditor && document.addEventListener('pointerdown', this.onPointerDown, true);
}
componentWillUnmount() {
- document.removeEventListener('pointerdown', this.onPointerDown, true);
+ this.props.clearLinkEditor && document.removeEventListener('pointerdown', this.onPointerDown, true);
}
onPointerDown = action((e: PointerEvent) => {
LinkDocPreview.Clear();
if (!this._linkMenuRef.current?.contains(e.target as any) && !this._editorRef.current?.contains(e.target as any)) {
- this.clear();
+ this.clear?.();
}
});
@@ -67,13 +66,15 @@ export class LinkMenu extends React.Component<Props> {
/>
));
- return linkItems.length ? linkItems : this.props.position ? [<></>] : [<p key="">No links have been created yet. Drag the linking button onto another document to create a link.</p>];
+ return linkItems.length ? linkItems : this.props.style ? [<></>] : [<p key="">No links have been created yet. Drag the linking button onto another document to create a link.</p>];
};
render() {
const sourceDoc = this.props.docView.props.Document;
+ const style = this.props.style ?? (dv => ({ left: dv?.left || 0, top: this.props.docView.topMost ? undefined : (dv?.bottom || 0) + 15, bottom: this.props.docView.topMost ? 20 : undefined, maxWidth: 200 }))(this.props.docView.getBounds());
+
return (
- <div className="linkMenu" ref={this._linkMenuRef} style={{ left: this.position.x, top: this.props.docView.topMost ? undefined : this.position.y, bottom: this.props.docView.topMost ? 20 : undefined }}>
+ <div className="linkMenu" ref={this._linkMenuRef} style={{ ...style }}>
{this._editingLink ? (
<div className="linkMenu-listEditor">
<LinkEditor sourceDoc={sourceDoc} linkDoc={this._editingLink} showLinks={action(() => (this._editingLink = undefined))} />
diff --git a/src/client/views/linking/LinkMenuGroup.tsx b/src/client/views/linking/LinkMenuGroup.tsx
index fa6a2f506..9d2082e21 100644
--- a/src/client/views/linking/LinkMenuGroup.tsx
+++ b/src/client/views/linking/LinkMenuGroup.tsx
@@ -1,19 +1,19 @@
-import { observer } from "mobx-react";
-import { observable, action } from "mobx";
-import { Doc, StrListCast } from "../../../fields/Doc";
-import { Id } from "../../../fields/FieldSymbols";
-import { Cast } from "../../../fields/Types";
-import { LinkManager } from "../../util/LinkManager";
-import { DocumentView } from "../nodes/DocumentView";
+import { observer } from 'mobx-react';
+import { observable, action } from 'mobx';
+import { Doc, StrListCast } from '../../../fields/Doc';
+import { Id } from '../../../fields/FieldSymbols';
+import { Cast } from '../../../fields/Types';
+import { LinkManager } from '../../util/LinkManager';
+import { DocumentView } from '../nodes/DocumentView';
import './LinkMenu.scss';
-import { LinkMenuItem } from "./LinkMenuItem";
-import React = require("react");
+import { LinkMenuItem } from './LinkMenuItem';
+import React = require('react');
interface LinkMenuGroupProps {
sourceDoc: Doc;
group: Doc[];
groupType: string;
- clearLinkEditor: () => void;
+ clearLinkEditor?: () => void;
showEditor: (linkDoc: Doc) => void;
docView: DocumentView;
itemHandler?: (doc: Doc) => void;
@@ -26,49 +26,52 @@ export class LinkMenuGroup extends React.Component<LinkMenuGroupProps> {
getBackgroundColor = (): string => {
const linkRelationshipList = StrListCast(Doc.UserDoc().linkRelationshipList);
const linkColorList = StrListCast(Doc.UserDoc().linkColorList);
- let color = "white";
+ let color = 'white';
// if this link's relationship property is not default "link", set its color
if (linkRelationshipList) {
const relationshipIndex = linkRelationshipList.indexOf(this.props.groupType);
const RGBcolor: string = linkColorList[relationshipIndex];
if (RGBcolor) {
//set opacity to 0.25 by modifiying the rgb string
- color = RGBcolor.slice(0, RGBcolor.length - 1) + ", 0.25)";
+ color = RGBcolor.slice(0, RGBcolor.length - 1) + ', 0.25)';
}
}
return color;
- }
+ };
@observable _collapsed = false;
render() {
const set = new Set<Doc>(this.props.group);
const groupItems = Array.from(set.keys()).map(linkDoc => {
- const destination = LinkManager.getOppositeAnchor(linkDoc, this.props.sourceDoc) ||
+ const destination =
+ LinkManager.getOppositeAnchor(linkDoc, this.props.sourceDoc) ||
LinkManager.getOppositeAnchor(linkDoc, Cast(linkDoc.anchor2, Doc, null).annotationOn === this.props.sourceDoc ? Cast(linkDoc.anchor2, Doc, null) : Cast(linkDoc.anchor1, Doc, null));
if (destination && this.props.sourceDoc) {
- return <LinkMenuItem key={linkDoc[Id]}
- itemHandler={this.props.itemHandler}
- groupType={this.props.groupType}
- docView={this.props.docView}
- linkDoc={linkDoc}
- sourceDoc={this.props.sourceDoc}
- destinationDoc={destination}
- clearLinkEditor={this.props.clearLinkEditor}
- showEditor={this.props.showEditor}
- menuRef={this._menuRef} />;
+ return (
+ <LinkMenuItem
+ key={linkDoc[Id]}
+ itemHandler={this.props.itemHandler}
+ groupType={this.props.groupType}
+ docView={this.props.docView}
+ linkDoc={linkDoc}
+ sourceDoc={this.props.sourceDoc}
+ destinationDoc={destination}
+ clearLinkEditor={this.props.clearLinkEditor}
+ showEditor={this.props.showEditor}
+ menuRef={this._menuRef}
+ />
+ );
}
});
return (
<div className="linkMenu-group" ref={this._menuRef}>
- <div className="linkMenu-group-name" onClick={action(() => this._collapsed = !this._collapsed)} style={{ background: this.getBackgroundColor() }}>
- <p className={this.props.groupType === "*" || this.props.groupType === "" ? "" : "expand-one"}> {this.props.groupType}:</p>
+ <div className="linkMenu-group-name" onClick={action(() => (this._collapsed = !this._collapsed))} style={{ background: this.getBackgroundColor() }}>
+ <p className={this.props.groupType === '*' || this.props.groupType === '' ? '' : 'expand-one'}> {this.props.groupType}:</p>
</div>
- {this._collapsed ? (null) : <div className="linkMenu-group-wrapper">
- {groupItems}
- </div>}
- </div >
+ {this._collapsed ? null : <div className="linkMenu-group-wrapper">{groupItems}</div>}
+ </div>
);
}
-} \ No newline at end of file
+}
diff --git a/src/client/views/linking/LinkMenuItem.scss b/src/client/views/linking/LinkMenuItem.scss
index 2ca97a27d..806a2c381 100644
--- a/src/client/views/linking/LinkMenuItem.scss
+++ b/src/client/views/linking/LinkMenuItem.scss
@@ -79,7 +79,6 @@
font-size: 9px;
line-height: 0.9;
margin-left: 20px;
- max-width: 125px;
height: auto;
white-space: break-spaces;
}
@@ -110,7 +109,7 @@
background-color: rgb(201, 239, 252);
.linkMenu-item-buttons {
- display: flex;
+ opacity: 1;
}
.linkMenu-item-content {
@@ -127,7 +126,8 @@
.linkMenu-item-buttons {
//@extend: right;
position: relative;
- display: none;
+ display: flex;
+ opacity: 0;
.button {
width: 20px;
diff --git a/src/client/views/linking/LinkMenuItem.tsx b/src/client/views/linking/LinkMenuItem.tsx
index c3b5fa997..c3705b0e1 100644
--- a/src/client/views/linking/LinkMenuItem.tsx
+++ b/src/client/views/linking/LinkMenuItem.tsx
@@ -12,13 +12,12 @@ import { DocumentManager } from '../../util/DocumentManager';
import { DragManager } from '../../util/DragManager';
import { LinkFollower } from '../../util/LinkFollower';
import { LinkManager } from '../../util/LinkManager';
+import { SettingsManager } from '../../util/SettingsManager';
+import { undoBatch } from '../../util/UndoManager';
import { DocumentView } from '../nodes/DocumentView';
import { LinkDocPreview } from '../nodes/LinkDocPreview';
import './LinkMenuItem.scss';
import React = require('react');
-import { SettingsManager } from '../../util/SettingsManager';
-import { SelectionManager } from '../../util/SelectionManager';
-import { undoBatch } from '../../util/UndoManager';
interface LinkMenuItemProps {
groupType: string;
@@ -26,7 +25,7 @@ interface LinkMenuItemProps {
docView: DocumentView;
sourceDoc: Doc;
destinationDoc: Doc;
- clearLinkEditor: () => void;
+ clearLinkEditor?: () => void;
showEditor: (linkDoc: Doc) => void;
menuRef: React.Ref<HTMLDivElement>;
itemHandler?: (doc: Doc) => void;
@@ -71,7 +70,6 @@ export class LinkMenuItem extends React.Component<LinkMenuItemProps> {
private _drag = React.createRef<HTMLDivElement>();
_editRef = React.createRef<HTMLDivElement>();
- _buttonRef = React.createRef<HTMLDivElement>();
@observable private _showMore: boolean = false;
@action toggleShowMore(e: React.PointerEvent) {
@@ -89,7 +87,6 @@ export class LinkMenuItem extends React.Component<LinkMenuItemProps> {
}
@action
onEdit = (e: React.PointerEvent) => {
- const sel = SelectionManager.Views();
LinkManager.currentLink = this.props.linkDoc === LinkManager.currentLink ? undefined : this.props.linkDoc;
LinkManager.currentLinkAnchor = this.sourceAnchor;
setupMoveUpEvents(
@@ -119,12 +116,12 @@ export class LinkMenuItem extends React.Component<LinkMenuItemProps> {
const eleClone: any = this._drag.current!.cloneNode(true);
eleClone.style.transform = `translate(${e.x}px, ${e.y}px)`;
StartLinkTargetsDrag(eleClone, this.props.docView, e.x, e.y, this.props.sourceDoc, [this.props.linkDoc]);
- this.props.clearLinkEditor();
+ this.props.clearLinkEditor?.();
return true;
},
emptyFunction,
() => {
- this.props.clearLinkEditor();
+ this.props.clearLinkEditor?.();
if (this.props.itemHandler) {
this.props.itemHandler?.(this.props.linkDoc);
} else {
@@ -167,20 +164,29 @@ export class LinkMenuItem extends React.Component<LinkMenuItemProps> {
<div
ref={this._drag}
className="linkMenu-name" //title="drag to view target. click to customize."
- onPointerLeave={LinkDocPreview.Clear}
- onPointerEnter={e =>
- this.props.linkDoc &&
- LinkDocPreview.SetLinkInfo({
- docProps: this.props.docView.props,
- linkSrc: this.props.sourceDoc,
- linkDoc: this.props.linkDoc,
- showHeader: false,
- location: [this._drag.current?.getBoundingClientRect().right ?? 100, this._drag.current?.getBoundingClientRect().top ?? e.clientY],
- noPreview: false,
- })
- }
onPointerDown={this.onLinkButtonDown}>
- <div className="linkMenu-text">
+ <div className="linkMenu-item-buttons">
+ <Tooltip title={<div className="dash-tooltip">Edit Link</div>}>
+ <div className="button" style={{ background: LinkManager.currentLink === this.props.linkDoc ? 'black' : 'gray' }} ref={this._editRef} onPointerDown={this.onEdit} onClick={e => e.stopPropagation()}>
+ <FontAwesomeIcon className="fa-icon" icon="edit" size="sm" />
+ </div>
+ </Tooltip>
+ </div>
+ <div
+ className="linkMenu-text"
+ onPointerLeave={LinkDocPreview.Clear}
+ onPointerEnter={e =>
+ this.props.linkDoc &&
+ this.props.clearLinkEditor &&
+ LinkDocPreview.SetLinkInfo({
+ docProps: this.props.docView.props,
+ linkSrc: this.props.sourceDoc,
+ linkDoc: this.props.linkDoc,
+ showHeader: false,
+ location: [this._drag.current?.getBoundingClientRect().right ?? 100, this._drag.current?.getBoundingClientRect().top ?? e.clientY],
+ noPreview: false,
+ })
+ }>
{source ? (
<p className="linkMenu-source-title">
{' '}
@@ -198,14 +204,9 @@ export class LinkMenuItem extends React.Component<LinkMenuItemProps> {
{!this.props.linkDoc.description ? null : <p className="linkMenu-description">{StrCast(this.props.linkDoc.description)}</p>}
</div>
- <div className="linkMenu-item-buttons" ref={this._buttonRef}>
- <Tooltip title={<div className="dash-tooltip">Edit Link</div>}>
- <div className="button" ref={this._editRef} onPointerDown={this.onEdit} onClick={e => e.stopPropagation()}>
- <FontAwesomeIcon className="fa-icon" icon="chevron-down" size="sm" />
- </div>
- </Tooltip>
+ <div className="linkMenu-item-buttons">
<Tooltip title={<div className="dash-tooltip">Delete Link</div>}>
- <div className="button" style={{ background: 'red' }} ref={this._editRef} onPointerDown={this.deleteLink} onClick={e => e.stopPropagation()}>
+ <div className="button" style={{ background: 'red' }} onPointerDown={this.deleteLink} onClick={e => e.stopPropagation()}>
<FontAwesomeIcon className="fa-icon" icon="trash" size="sm" />
</div>
</Tooltip>