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.tsx144
1 files changed, 48 insertions, 96 deletions
diff --git a/src/client/views/nodes/formattedText/SummaryView.tsx b/src/client/views/nodes/formattedText/SummaryView.tsx
index e5328496c..922285bd0 100644
--- a/src/client/views/nodes/formattedText/SummaryView.tsx
+++ b/src/client/views/nodes/formattedText/SummaryView.tsx
@@ -1,108 +1,45 @@
-import { IReactionDisposer, observable, computed, action } from "mobx";
-import { Fragment, Node, Slice } from "prosemirror-model";
import { TextSelection } from "prosemirror-state";
+import { Fragment, Node, Slice } from "prosemirror-model";
import * as ReactDOM from 'react-dom';
import React = require("react");
-// import { dom } from "@fortawesome/fontawesome-svg-core";
-// import { observer } from "mobx-react";
+// 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: HTMLDivElement; // container for label
+ _fieldWrapper: HTMLSpanElement; // container for label and value
constructor(node: any, view: any, getPos: any) {
- console.log("You are here")
- this._fieldWrapper = document.createElement("div");
- this._fieldWrapper.style.fontWeight = "bold";
- this._fieldWrapper.style.position = "relative";
- this._fieldWrapper.style.display = "inline-block";
+ 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);
- };
+ node.toJSON = function () { return js.apply(this, arguments); };
- console.log("rendering new SummaryViewInternal")
- ReactDOM.render(<SummaryViewInternal
- view={view}
- getPos={getPos}
- node={node}
-
- />, this._fieldWrapper);
+ ReactDOM.render(<SummaryViewInternal />, this._fieldWrapper);
(this as any).dom = this._fieldWrapper;
}
+ className = (visible: boolean) => "formattedTextBox-summarizer" + (visible ? "" : "-collapsed");
+ destroy() { ReactDOM.unmountComponentAtNode(this._fieldWrapper); }
selectNode() { }
- deselectNode() { }
-
- destroy() {
- ReactDOM.unmountComponentAtNode(this._fieldWrapper);
- }
-}
-
-interface ISummaryViewInternal {
- node: any;
- view: any;
- getPos: any;
-}
-
-export class SummaryViewInternal extends React.Component<ISummaryViewInternal>{
- _className: any;
- _view: any;
- _reactionDisposer: IReactionDisposer | undefined;
-
- constructor(props: ISummaryViewInternal) {
- super(props);
-
- this._className = this.className(this.props.node.attrs.visibility);
- this._view = this.props.view;
- this.onPointerDownCollapsed = this.onPointerDownCollapsed.bind(this);
- this.updateSummarizedText = this.updateSummarizedText.bind(this);
- }
-
- componentWillUnmount() {
- this._reactionDisposer?.();
- }
-
-
- className(visible: boolean) {
- return "formattedTextBox-summarizer" + (visible ? "" : "-collapsed");
- }
-
- onPointerDownCollapsed(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();
-
- this._className = this.className(visible);
-
- }
-
- updateSummarizedText(start?: any) {
- const mtype = this.props.view.state.schema.marks.summarize;
- const mtypeInc = this.props.view.state.schema.marks.summarizeInclusive;
+ 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) => {
+ 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);
@@ -112,18 +49,33 @@ export class SummaryViewInternal extends React.Component<ISummaryViewInternal>{
}
});
}
- return TextSelection.create(this.props.view.state.doc, start, endPos);
+ return TextSelection.create(view.state.doc, start, endPos);
}
- render() {
- return (
- <span
- className={this._className}
- onPointerDown={this.onPointerDownCollapsed}>
-
- </span>
- );
-
+ 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() {
+ return <> </>;
+ }
+} \ No newline at end of file