aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/nodes/FormattedTextBox.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views/nodes/FormattedTextBox.tsx')
-rw-r--r--src/client/views/nodes/FormattedTextBox.tsx65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index d6ba1700a..41344cf50 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -135,6 +135,68 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
}
document.addEventListener("paste", this.paste);
+
+ reaction(
+ () => StrCast(this.props.Document.guid),
+ (guid) => {
+ let start = -1;
+
+ if (this._editorView && guid) {
+ let editor = this._editorView;
+ console.log(guid);
+ let ret = findLinkFrag(editor.state.doc.content, editor);
+
+ if (ret.frag.size > 2) { // fragment is not empty
+ console.log('here is frag', ret.frag);
+ let tr;
+ let index = 0;
+ while (ret.frag.child(index).nodeSize === 2) {
+ index++;
+ }
+
+ // TODO find how to select correct child.............................
+ if (ret.frag.child(index)) {
+ tr = editor.state.tr.setSelection(TextSelection.between(editor.state.doc.resolve(ret.start), editor.state.doc.resolve(ret.start + ret.frag.child(index).nodeSize)));
+ } else { // fallback
+ tr = editor.state.tr.setSelection(TextSelection.near(editor.state.doc.resolve(ret.start)));
+ }
+ editor.focus();
+ editor.dispatch(tr.scrollIntoView());
+ this.props.Document.guid = "";
+ }
+ }
+
+ function findLinkFrag(frag: Fragment, editor: EditorView) {
+ const nodes: Node[] = [];
+ frag.forEach((node, index) => {
+ let examinedNode = findLinkNode(node, editor);
+ if (examinedNode) {
+ nodes.push(examinedNode);
+ if (index > start) {
+ start = index;
+ }
+ }
+ });
+ return { frag: Fragment.fromArray(nodes), start: start };
+ }
+ function findLinkNode(node: Node, editor: EditorView) {
+ if (!node.isText) {
+ const content = findLinkFrag(node.content, editor);
+ return node.copy(content.frag);
+ }
+ const marks = [...node.marks];
+ const linkIndex = marks.findIndex(mark => mark.type.name === "link");
+ if (linkIndex !== -1) {
+ if (guid === marks[linkIndex].attrs.guid) {
+ return node;
+ }
+ return undefined;
+ } else {
+ return undefined;
+ }
+ }
+ }
+ );
}
@computed get extensionDoc() { return Doc.resolvedFieldDataDoc(this.dataDoc, this.props.fieldKey, "dummy"); }
@@ -565,9 +627,12 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
if (link) {
cbe.clipboardData!.setData("dash/linkDoc", link[Id]);
linkId = link[Id];
+ let guid = StrCast(link.guid);
+ link.guid = guid;
let frag = addMarkToFrag(slice.content);
slice = new Slice(frag, slice.openStart, slice.openEnd);
var tr = view.state.tr.replaceSelection(slice);
+
view.dispatch(tr.scrollIntoView().setMeta("paste", true).setMeta("uiEvent", "paste"));
}
});