aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBob Zeleznik <zzzman@gmail.com>2019-08-31 13:27:17 -0400
committerBob Zeleznik <zzzman@gmail.com>2019-08-31 13:27:17 -0400
commitdc7990e969bff201fefe050ac321b2d2d1d58059 (patch)
treef6c78b6f232f895bf2f3cfbe758e8d8247bf55a4 /src
parentea25f19b08fba66b1ec281afdadf719ae6a6ed54 (diff)
added text tooltip for links
Diffstat (limited to 'src')
-rw-r--r--src/client/views/nodes/FormattedTextBox.tsx19
-rw-r--r--src/client/views/nodes/FormattedTextBoxComment.tsx46
2 files changed, 45 insertions, 20 deletions
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 0f349780e..93ac2f06f 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -713,24 +713,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
}
onPointerUp = (e: React.PointerEvent): void => {
- let view = this._editorView!;
- const pos = view.posAtCoords({ left: e.clientX, top: e.clientY });
- const rpos = pos && view.state.doc.resolve(pos.pos);
- let noselection = view.state.selection.$from === view.state.selection.$to;
- let set = false;
- if (pos && rpos) {
- let nbef = findStartOfMark(rpos, view, findOtherUserMark);
- let naft = findEndOfMark(rpos, view, findOtherUserMark);
- const spos = pos.pos - nbef;
- const epos = pos.pos + naft;
- let child = rpos.nodeBefore || rpos.nodeAfter;
- let mark = child && findOtherUserMark(child.marks);
- if (mark && child && (nbef || naft) && (!mark.attrs.opened || noselection)) {
- SelectionSizeTooltip.SetState(this, mark.attrs.opened, spos, epos, mark);
- set = true;
- }
- }
- !set && SelectionSizeTooltip.Hide();
+ SelectionSizeTooltip.textBox = this;
if (e.buttons === 1 && this.props.isSelected() && !e.altKey) {
e.stopPropagation();
}
diff --git a/src/client/views/nodes/FormattedTextBoxComment.tsx b/src/client/views/nodes/FormattedTextBoxComment.tsx
index 0287d93a9..c368a3f34 100644
--- a/src/client/views/nodes/FormattedTextBoxComment.tsx
+++ b/src/client/views/nodes/FormattedTextBoxComment.tsx
@@ -3,6 +3,10 @@ import './FormattedTextBoxComment.scss';
import { ResolvedPos, Mark } from "prosemirror-model";
import { EditorView } from "prosemirror-view";
import { Doc } from "../../../new_fields/Doc";
+import { schema } from "../../util/RichTextSchema";
+import { DocServer } from "../../DocServer";
+import { Utils } from "../../../Utils";
+import { StrCast } from "../../../new_fields/Types";
export let selectionSizePlugin = new Plugin({
view(editorView) { return new SelectionSizeTooltip(editorView); }
@@ -13,6 +17,9 @@ export function findOtherUserMark(marks: Mark[]): Mark | undefined {
export function findUserMark(marks: Mark[]): Mark | undefined {
return marks.find(m => m.attrs.userid);
}
+export function findLinkMark(marks: Mark[]): Mark | undefined {
+ return marks.find(m => m.type === schema.marks.link);
+}
export function findStartOfMark(rpos: ResolvedPos, view: EditorView, finder: (marks: Mark[]) => Mark | undefined) {
let before = 0;
let nbef = rpos.nodeBefore;
@@ -57,7 +64,7 @@ export class SelectionSizeTooltip {
SelectionSizeTooltip.tooltip.onpointerdown = (e: PointerEvent) => {
let keep = e.target && (e.target as any).type === "checkbox";
SelectionSizeTooltip.opened = keep || !SelectionSizeTooltip.opened;
- SelectionSizeTooltip.textBox.setAnnotation(
+ SelectionSizeTooltip.textBox && SelectionSizeTooltip.textBox.setAnnotation(
SelectionSizeTooltip.start, SelectionSizeTooltip.end, SelectionSizeTooltip.mark,
SelectionSizeTooltip.opened, keep);
};
@@ -76,7 +83,7 @@ export class SelectionSizeTooltip {
SelectionSizeTooltip.end = end;
SelectionSizeTooltip.mark = mark;
SelectionSizeTooltip.opened = opened;
- SelectionSizeTooltip.textBox && SelectionSizeTooltip.tooltip && (SelectionSizeTooltip.tooltip.style.display = "");
+ SelectionSizeTooltip.tooltip && (SelectionSizeTooltip.tooltip.style.display = "");
}
update(view: EditorView, lastState?: EditorState) {
@@ -85,11 +92,18 @@ export class SelectionSizeTooltip {
if (lastState && lastState.doc.eq(state.doc) &&
lastState.selection.eq(state.selection)) return;
+ let set = "none"
if (state.selection.$from) {
let nbef = findStartOfMark(state.selection.$from, view, findOtherUserMark);
let naft = findEndOfMark(state.selection.$from, view, findOtherUserMark);
+ const spos = state.selection.$from.pos - nbef;
+ const epos = state.selection.$from.pos + naft;
let child = state.selection.$from.nodeBefore;
let mark = child && findOtherUserMark(child.marks);
+ let noselection = view.state.selection.$from === view.state.selection.$to;
+ if (mark && child && (nbef || naft) && (!mark.attrs.opened || noselection)) {
+ SelectionSizeTooltip.SetState(this, mark.attrs.opened, spos, epos, mark);
+ }
if (mark && child && nbef && naft) {
SelectionSizeTooltip.tooltipText.textContent = mark.attrs.userid + " " + mark.attrs.modified;
// These are in screen coordinates
@@ -102,8 +116,36 @@ export class SelectionSizeTooltip {
let left = Math.max((start.left + end.left) / 2, start.left + 3);
SelectionSizeTooltip.tooltip.style.left = (left - box.left) + "px";
SelectionSizeTooltip.tooltip.style.bottom = (box.bottom - start.top) + "px";
+ set = "";
+ }
+ }
+ if (set === "none" && state.selection.$from) {
+ SelectionSizeTooltip.textBox = undefined;
+ let nbef = findStartOfMark(state.selection.$from, view, findLinkMark);
+ let naft = findEndOfMark(state.selection.$from, view, findLinkMark);
+ let child = state.selection.$from.nodeBefore;
+ let mark = child && findLinkMark(child.marks);
+ if (mark && child && nbef && naft) {
+ SelectionSizeTooltip.tooltipText.textContent = "link : " + (mark.attrs.title || mark.attrs.href);
+ if (mark.attrs.href.indexOf(Utils.prepend("/doc/")) === 0) {
+ let docTarget = mark.attrs.href.replace(Utils.prepend("/doc/"), "").split("?")[0];
+ docTarget && DocServer.GetRefField(docTarget).then(linkDoc =>
+ (linkDoc as Doc) && (SelectionSizeTooltip.tooltipText.textContent = "link :" + StrCast((linkDoc as Doc)!.title)));
+ }
+ // These are in screen coordinates
+ // let start = view.coordsAtPos(state.selection.from), end = view.coordsAtPos(state.selection.to);
+ let start = view.coordsAtPos(state.selection.from - nbef), end = view.coordsAtPos(state.selection.from - nbef);
+ // The box in which the tooltip is positioned, to use as base
+ let box = (document.getElementById("main-div") as any).getBoundingClientRect();
+ // Find a center-ish x position from the selection endpoints (when
+ // crossing lines, end may be more to the left)
+ let left = Math.max((start.left + end.left) / 2, start.left + 3);
+ SelectionSizeTooltip.tooltip.style.left = (left - box.left) + "px";
+ SelectionSizeTooltip.tooltip.style.bottom = (box.bottom - start.top) + "px";
+ set = "";
}
}
+ SelectionSizeTooltip.tooltip && (SelectionSizeTooltip.tooltip.style.display = set);
}
destroy() { SelectionSizeTooltip.tooltip.style.display = "none"; }