aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/nodes/formattedText/SummaryView.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views/nodes/formattedText/SummaryView.tsx')
-rw-r--r--src/client/views/nodes/formattedText/SummaryView.tsx116
1 files changed, 58 insertions, 58 deletions
diff --git a/src/client/views/nodes/formattedText/SummaryView.tsx b/src/client/views/nodes/formattedText/SummaryView.tsx
index 89908d8ee..c017db034 100644
--- a/src/client/views/nodes/formattedText/SummaryView.tsx
+++ b/src/client/views/nodes/formattedText/SummaryView.tsx
@@ -1,81 +1,81 @@
import { TextSelection } from "prosemirror-state";
import { Fragment, Node, Slice } from "prosemirror-model";
-
+import * as ReactDOM from 'react-dom';
import React = require("react");
-interface ISummaryView {
- node: any;
- view: any;
- getPos: any;
- self: any;
-}
-export class SummaryView extends React.Component<ISummaryView> {
+// an elidable textblock that collapses when its '<-' is clicked and expands when its '...' anchor is clicked.
+// this node actively edits prosemirror (as opposed to just changing how things are rendered) and thus doesn't
+// really need a react view. However, it would be cleaner to figure out how to do this just as a react rendering
+// method instead of changing prosemirror's text when the expand/elide buttons are clicked.
+export class SummaryView {
+ _fieldWrapper: HTMLSpanElement; // container for label and value
- onPointerDown = (e: any) => {
- const visible = !this.props.node.attrs.visibility;
- const attrs = { ...this.props.node.attrs, visibility: visible };
- let textSelection = TextSelection.create(this.props.view.state.doc, this.props.getPos() + 1);
- if (!visible) { // update summarized text and save in attrs
- textSelection = this.updateSummarizedText(this.props.getPos() + 1);
- attrs.text = textSelection.content();
- attrs.textslice = attrs.text.toJSON();
- }
- this.props.view.dispatch(this.props.view.state.tr.
- setSelection(textSelection). // select the current summarized text (or where it will be if its collapsed)
- replaceSelection(!visible ? new Slice(Fragment.fromArray([]), 0, 0) : this.props.node.attrs.text). // collapse/expand it
- setNodeMarkup(this.props.getPos(), undefined, attrs)); // update the attrs
- e.preventDefault();
- e.stopPropagation();
- const _collapsed = document.getElementById('collapse') as HTMLElement;
- _collapsed.className = this.className(visible);
+ constructor(node: any, view: any, getPos: any) {
+ const self = this;
+ this._fieldWrapper = document.createElement("span");
+ this._fieldWrapper.className = this.className(node.attrs.visibility);
+ this._fieldWrapper.onpointerdown = function (e: any) { self.onPointerDown(e, node, view, getPos); };
+ this._fieldWrapper.onkeypress = function (e: any) { e.stopPropagation(); };
+ this._fieldWrapper.onkeydown = function (e: any) { e.stopPropagation(); };
+ this._fieldWrapper.onkeyup = function (e: any) { e.stopPropagation(); };
+ this._fieldWrapper.onmousedown = function (e: any) { e.stopPropagation(); };
+
+ const js = node.toJSON;
+ node.toJSON = function () { return js.apply(this, arguments); };
+
+ ReactDOM.render(<SummaryViewInternal />, this._fieldWrapper);
+ (this as any).dom = this._fieldWrapper;
}
- updateSummarizedText(start?: any) {
- const mtype = this.props.view.state.schema.marks.summarize;
- const mtypeInc = this.props.view.state.schema.marks.summarizeInclusive;
+ className = (visible: boolean) => "formattedTextBox-summarizer" + (visible ? "" : "-collapsed");
+ destroy() { ReactDOM.unmountComponentAtNode(this._fieldWrapper); }
+ selectNode() { }
+
+ updateSummarizedText(start: any, view: any) {
+ const mtype = view.state.schema.marks.summarize;
+ const mtypeInc = view.state.schema.marks.summarizeInclusive;
let endPos = start;
const visited = new Set();
- for (let i: number = start + 1; i < this.props.view.state.doc.nodeSize - 1; i++) {
+ for (let i: number = start + 1; i < view.state.doc.nodeSize - 1; i++) {
let skip = false;
- this.props.view.state.doc.nodesBetween(start, i, (node: Node, pos: number, parent: Node, index: number) => {
- if (this.props.node.isLeaf && !visited.has(node) && !skip) {
- if (this.props.node.marks.find((m: any) => m.type === mtype || m.type === mtypeInc)) {
+ view.state.doc.nodesBetween(start, i, (node: Node, pos: number, parent: Node, index: number) => {
+ if (node.isLeaf && !visited.has(node) && !skip) {
+ if (node.marks.find((m: any) => m.type === mtype || m.type === mtypeInc)) {
visited.add(node);
- endPos = i + this.props.node.nodeSize - 1;
+ endPos = i + node.nodeSize - 1;
}
else skip = true;
}
});
}
- return TextSelection.create(this.props.view.state.doc, start, endPos);
+ return TextSelection.create(view.state.doc, start, endPos);
}
- className = (visible: boolean) => "formattedTextBox-summarizer" + (visible ? "" : "-collapsed");
-
- selectNode() { }
-
- deselectNode() { }
+ onPointerDown = (e: any, node: any, view: any, getPos: any) => {
+ const visible = !node.attrs.visibility;
+ const attrs = { ...node.attrs, visibility: visible };
+ let textSelection = TextSelection.create(view.state.doc, getPos() + 1);
+ if (!visible) { // update summarized text and save in attrs
+ textSelection = this.updateSummarizedText(getPos() + 1, view);
+ attrs.text = textSelection.content();
+ attrs.textslice = attrs.text.toJSON();
+ }
+ view.dispatch(view.state.tr.
+ setSelection(textSelection). // select the current summarized text (or where it will be if its collapsed)
+ replaceSelection(!visible ? new Slice(Fragment.fromArray([]), 0, 0) : node.attrs.text). // collapse/expand it
+ setNodeMarkup(getPos(), undefined, attrs)); // update the attrs
+ e.preventDefault();
+ e.stopPropagation();
+ this._fieldWrapper.className = this.className(visible);
+ }
+}
+interface ISummaryView {
+}
+// currently nothing needs to be rendered for the internal view of a summary.
+export class SummaryViewInternal extends React.Component<ISummaryView> {
render() {
- const _view = this.props.node.view;
- const js = this.props.node.toJSon;
-
- this.props.node.toJSON = function () {
- return js.apply(this, arguments);
- };
-
- const spanCollapsedClassName = this.className(this.props.node.attrs.visibility);
-
- return (
- <span
- className={spanCollapsedClassName}
- id='collapse'
- onPointerDown={this.onPointerDown}
- >
-
- </span>
- );
-
+ return <> </>;
}
} \ No newline at end of file