aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/documents/DocumentTypes.ts1
-rw-r--r--src/client/documents/Documents.ts4
-rw-r--r--src/client/util/CurrentUserUtils.ts6
-rw-r--r--src/client/views/nodes/FilterBox.tsx2
-rw-r--r--src/client/views/nodes/SliderBox.tsx2
-rw-r--r--src/client/views/nodes/formattedText/DashDocView.tsx343
-rw-r--r--src/client/views/nodes/formattedText/FormattedTextBox.scss5
-rw-r--r--src/client/views/nodes/formattedText/FormattedTextBox.tsx65
-rw-r--r--src/client/views/nodes/formattedText/RichTextSchema.tsx188
-rw-r--r--src/client/views/nodes/formattedText/nodes_rts.ts3
-rw-r--r--src/client/views/search/SearchBox.tsx2
-rw-r--r--src/fields/Doc.ts3
12 files changed, 175 insertions, 449 deletions
diff --git a/src/client/documents/DocumentTypes.ts b/src/client/documents/DocumentTypes.ts
index 58b120e7d..851e78336 100644
--- a/src/client/documents/DocumentTypes.ts
+++ b/src/client/documents/DocumentTypes.ts
@@ -33,7 +33,6 @@ export enum DocumentType {
PRESELEMENT = "preselement",// presentation item (view of a document in a collection)
COLOR = "color", // color picker (view of a color picker for a color string)
YOUTUBE = "youtube", // youtube directory (view of you tube search results)
- DOCHOLDER = "docholder", // nested document (view of a document)
SEARCHITEM = "searchitem",
COMPARISON = "comparison", // before/after view with slider (view of 2 images)
GROUP = "group", // group of users
diff --git a/src/client/documents/Documents.ts b/src/client/documents/Documents.ts
index 357b82cd6..1726c42d3 100644
--- a/src/client/documents/Documents.ts
+++ b/src/client/documents/Documents.ts
@@ -833,10 +833,6 @@ export namespace Docs {
return InstanceFromProto(Prototypes.get(DocumentType.KVP), document, { _fitWidth: true, title: document.title + ".kvp", ...options });
}
- export function DocumentDocument(document?: Doc, options: DocumentOptions = {}) {
- return InstanceFromProto(Prototypes.get(DocumentType.DOCHOLDER), document, { title: document ? document.title + "" : "container", targetDropAction: "move", ...options });
- }
-
export function TextanchorDocument(options: DocumentOptions = {}, id?: string) {
return InstanceFromProto(Prototypes.get(DocumentType.TEXTANCHOR), undefined, { targetDropAction: "move", ...options }, id);
}
diff --git a/src/client/util/CurrentUserUtils.ts b/src/client/util/CurrentUserUtils.ts
index 743ce24a6..7b57ec4a3 100644
--- a/src/client/util/CurrentUserUtils.ts
+++ b/src/client/util/CurrentUserUtils.ts
@@ -438,11 +438,6 @@ export class CurrentUserUtils {
doc.emptyButton = Docs.Create.ButtonDocument({ _width: 150, _height: 50, _xPadding: 10, _yPadding: 10, title: "Button", system: true, cloneFieldFilter: new List<string>(["system"]) });
((doc.emptyButton as Doc).proto as Doc)["dragFactory-count"] = 0;
}
- if (doc.emptyDocHolder === undefined) {
- doc.emptyDocHolder = Docs.Create.DocumentDocument(
- ComputedField.MakeFunction("selectedDocs(this,this.excludeCollections,[_last_])?.[0]") as any,
- { _width: 250, _height: 250, title: "container", system: true, cloneFieldFilter: new List<string>(["system"]) });
- }
if (doc.emptyWebpage === undefined) {
doc.emptyWebpage = Docs.Create.WebDocument("", { title: "webpage", _nativeWidth: 850, isTemplateDoc: true, _height: 512, _width: 400, useCors: true, system: true, cloneFieldFilter: new List<string>(["system"]) });
}
@@ -462,7 +457,6 @@ export class CurrentUserUtils {
{ toolTip: "Tap to create a presentation in a new pane, drag for a presentation", title: "Trails", icon: "pres-trail", click: 'openOnRight(Doc.UserDoc().activePresentation = copyDragFactory(this.dragFactory))', drag: `Doc.UserDoc().activePresentation = copyDragFactory(this.dragFactory)`, dragFactory: doc.emptyPresentation as Doc, noviceMode: true },
{ toolTip: "Tap to create a scripting box in a new pane, drag for a scripting box", title: "Script", icon: "terminal", click: 'openOnRight(copyDragFactory(this.dragFactory))', drag: 'copyDragFactory(this.dragFactory)', dragFactory: doc.emptyScript as Doc },
{ toolTip: "Tap to create a mobile view in a new pane, drag for a mobile view", title: "Phone", icon: "mobile", click: 'openOnRight(Doc.UserDoc().activeMobileMenu)', drag: 'this.dragFactory', dragFactory: doc.activeMobileMenu as Doc },
- { toolTip: "Tap to create a document previewer in a new pane, drag for a document previewer", title: "Prev", icon: "expand", click: 'openOnRight(copyDragFactory(this.dragFactory))', drag: 'copyDragFactory(this.dragFactory)', dragFactory: doc.emptyDocHolder as Doc },
{ toolTip: "Tap to create a custom header note document, drag for a custom header note", title: "Custom", icon: "window-maximize", click: 'openOnRight(delegateDragFactory(this.dragFactory))', drag: 'delegateDragFactory(this.dragFactory)', dragFactory: doc.emptyHeader as Doc },
{ toolTip: "Toggle a Calculator REPL", title: "repl", icon: "calculator", click: 'addOverlayWindow("ScriptingRepl", { x: 300, y: 100, width: 200, height: 200, title: "Scripting REPL" })' },
];
diff --git a/src/client/views/nodes/FilterBox.tsx b/src/client/views/nodes/FilterBox.tsx
index 0f8dcad9d..569f0d23b 100644
--- a/src/client/views/nodes/FilterBox.tsx
+++ b/src/client/views/nodes/FilterBox.tsx
@@ -214,7 +214,7 @@ export class FilterBox extends ViewBoxBaseComponent<FieldViewProps, FilterBoxDoc
const ranged = Doc.readDocRangeFilter(targetDoc, facetHeader);
Doc.GetProto(newFacet).type = DocumentType.COL; // forces item to show an open/close button instead ofa checkbox
const extendedMinVal = minVal - Math.min(1, Math.floor(Math.abs(maxVal - minVal) * .1));
- const extendedMaxVal = maxVal + Math.min(1, Math.ceil(Math.abs(maxVal - minVal) * .05));
+ const extendedMaxVal = Math.max(minVal + 1, maxVal + Math.min(1, Math.ceil(Math.abs(maxVal - minVal) * .05)));
newFacet[newFacetField + "-min"] = ranged === undefined ? extendedMinVal : ranged[0];
newFacet[newFacetField + "-max"] = ranged === undefined ? extendedMaxVal : ranged[1];
Doc.GetProto(newFacet)[newFacetField + "-minThumb"] = extendedMinVal;
diff --git a/src/client/views/nodes/SliderBox.tsx b/src/client/views/nodes/SliderBox.tsx
index bfe07c22b..67f8aed3c 100644
--- a/src/client/views/nodes/SliderBox.tsx
+++ b/src/client/views/nodes/SliderBox.tsx
@@ -61,7 +61,7 @@ export class SliderBox extends ViewBoxBaseComponent<FieldViewProps, SliderDocume
}} >
<Slider
mode={2}
- step={1}
+ step={Math.min(1, .1 * (domain[1] - domain[0]))}
domain={domain}
rootStyle={{ position: "relative", width: "100%" }}
onChange={this.onChange}
diff --git a/src/client/views/nodes/formattedText/DashDocView.tsx b/src/client/views/nodes/formattedText/DashDocView.tsx
index 91d123efe..86a9f4347 100644
--- a/src/client/views/nodes/formattedText/DashDocView.tsx
+++ b/src/client/views/nodes/formattedText/DashDocView.tsx
@@ -1,7 +1,6 @@
-import { IReactionDisposer, reaction } from "mobx";
+import { IReactionDisposer, reaction, observable, action } from "mobx";
import { NodeSelection } from "prosemirror-state";
import { Doc, HeightSym, WidthSym } from "../../../../fields/Doc";
-import { Id } from "../../../../fields/FieldSymbols";
import { Cast, StrCast } from "../../../../fields/Types";
import { emptyFunction, returnEmptyDoclist, returnEmptyFilter, returnEmptyString, returnFalse, Utils } from "../../../../Utils";
import { DocServer } from "../../../DocServer";
@@ -11,250 +10,182 @@ import { Transform } from "../../../util/Transform";
import { DocumentView } from "../DocumentView";
import { FormattedTextBox } from "./FormattedTextBox";
import React = require("react");
+import * as ReactDOM from 'react-dom';
+import { observer } from "mobx-react";
+
+export class DashDocView {
+ _fieldWrapper: HTMLSpanElement; // container for label and value
+
+ constructor(node: any, view: any, getPos: any, tbox: FormattedTextBox) {
+ this._fieldWrapper = document.createElement("span");
+ this._fieldWrapper.style.position = "relative";
+ this._fieldWrapper.style.textIndent = "0";
+ this._fieldWrapper.style.border = "1px solid " + StrCast(tbox.layoutDoc.color, (CurrentUserUtils.ActiveDashboard.darkScheme ? "dimGray" : "lightGray"));
+ this._fieldWrapper.style.width = node.attrs.width;
+ this._fieldWrapper.style.height = node.attrs.height;
+ this._fieldWrapper.style.display = node.attrs.hidden ? "none" : "inline-block";
+ (this._fieldWrapper.style as any).float = node.attrs.float;
+ 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(); };
+
+ ReactDOM.render(<DashDocViewInternal
+ docid={node.attrs.docid}
+ alias={node.attrs.alias}
+ width={node.attrs.width}
+ height={node.attrs.height}
+ hidden={node.attrs.hidden}
+ fieldKey={node.attrs.fieldKey}
+ tbox={tbox}
+ view={view}
+ node={node}
+ getPos={getPos}
+ />, this._fieldWrapper);
+ (this as any).dom = this._fieldWrapper;
+ }
+ destroy() { ReactDOM.unmountComponentAtNode(this._fieldWrapper); }
+ selectNode() { }
+}
-interface IDashDocView {
- node: any;
+interface IDashDocViewInternal {
+ docid: string;
+ alias: string;
+ tbox: FormattedTextBox;
+ width: string;
+ height: string;
+ hidden: boolean;
+ fieldKey: string;
view: any;
+ node: any;
getPos: any;
- tbox?: FormattedTextBox;
- self: any;
}
-
-export class DashDocView extends React.Component<IDashDocView> {
-
- _dashDoc: Doc | undefined;
- _reactionDisposer: IReactionDisposer | undefined;
- _renderDisposer: IReactionDisposer | undefined;
+@observer
+export class DashDocViewInternal extends React.Component<IDashDocViewInternal> {
+ _spanRef = React.createRef<HTMLDivElement>();
+ _disposers: { [name: string]: IReactionDisposer } = {};
_textBox: FormattedTextBox;
- _finalLayout: any;
- _resolvedDataDoc: any;
-
-
- // constructor(node: any, view: any, getPos: any, tbox: FormattedTextBox) {
+ @observable _dashDoc: Doc | undefined;
+ @observable _finalLayout: any;
+ @observable _resolvedDataDoc: any;
- constructor(props: IDashDocView) {
+ constructor(props: IDashDocViewInternal) {
super(props);
-
- const node = this.props.node;
this._textBox = this.props.tbox as FormattedTextBox;
- const alias = node.attrs.alias;
- const docid = node.attrs.docid || this._textBox.props.Document[Id];
+ const updateDoc = action((dashDoc: Doc) => {
+ this._dashDoc = dashDoc;
+ this._finalLayout = this.props.docid ? dashDoc : Doc.expandTemplateLayout(Doc.Layout(dashDoc), dashDoc, this.props.fieldKey);
- DocServer.GetRefField(docid + alias).then(async dashDoc => {
+ if (this._finalLayout) {
+ if (!Doc.AreProtosEqual(this._finalLayout, dashDoc)) {
+ this._finalLayout.rootDocument = dashDoc.aliasOf;
+ }
+ this._resolvedDataDoc = Cast(this._finalLayout.resolvedDataDoc, Doc, null);
+ }
+ if (this.props.width !== (this._dashDoc?._width ?? "") + "px" || this.props.height !== (this._dashDoc?._height ?? "") + "px") {
+ try { // bcz: an exception will be thrown if two aliases are open at the same time when a doc view comment is made
+ this.props.view.dispatch(this.props.view.state.tr.setNodeMarkup(this.props.getPos(), null, {
+ ...this.props.node.attrs, width: (this._dashDoc?._width ?? "") + "px", height: (this._dashDoc?._height ?? "") + "px"
+ }));
+ } catch (e) {
+ console.log("DashDocView:" + e);
+ }
+ }
+ });
+
+ DocServer.GetRefField(this.props.docid + this.props.alias).then(async dashDoc => {
if (!(dashDoc instanceof Doc)) {
- alias && DocServer.GetRefField(docid).then(async dashDocBase => {
+ this.props.alias && DocServer.GetRefField(this.props.docid).then(async dashDocBase => {
if (dashDocBase instanceof Doc) {
- const aliasedDoc = Doc.MakeAlias(dashDocBase, docid + alias);
+ const aliasedDoc = Doc.MakeAlias(dashDocBase, this.props.docid + this.props.alias);
aliasedDoc.layoutKey = "layout";
- node.attrs.fieldKey && DocUtils.makeCustomViewClicked(aliasedDoc, Docs.Create.StackingDocument, node.attrs.fieldKey, undefined);
- this._dashDoc = aliasedDoc;
- // self.doRender(aliasedDoc, removeDoc, node, view, getPos);
+ this.props.fieldKey && DocUtils.makeCustomViewClicked(aliasedDoc, Docs.Create.StackingDocument, this.props.fieldKey, undefined);
+ updateDoc(aliasedDoc)
}
});
} else {
- this._dashDoc = dashDoc;
- // self.doRender(dashDoc, removeDoc, node, view, getPos);
+ updateDoc(dashDoc);
}
});
-
- this.onPointerLeave = this.onPointerLeave.bind(this);
- this.onPointerEnter = this.onPointerEnter.bind(this);
- this.onKeyDown = this.onKeyDown.bind(this);
- this.onKeyPress = this.onKeyPress.bind(this);
- this.onKeyUp = this.onKeyUp.bind(this);
- this.onWheel = this.onWheel.bind(this);
}
- /* #region Internal functions */
removeDoc = () => {
- const view = this.props.view;
- const pos = this.props.getPos();
- const ns = new NodeSelection(view.state.doc.resolve(pos));
- view.dispatch(view.state.tr.setSelection(ns).deleteSelection());
+ this.props.view.dispatch(this.props.view.state.tr
+ .setSelection(new NodeSelection(this.props.view.state.doc.resolve(this.props.getPos())))
+ .deleteSelection());
return true;
}
getDocTransform = () => {
- const outerElement = document.getElementById('dash-document-view-outer') as HTMLElement;
- const { scale, translateX, translateY } = Utils.GetScreenTransform(outerElement);
- return new Transform(-translateX, -translateY, 1).scale(1 / this.contentScaling() / scale);
+ if (!this._spanRef.current) return Transform.Identity();
+ const { scale, translateX, translateY } = Utils.GetScreenTransform(this._spanRef.current);
+ return new Transform(-translateX, -translateY, 1).scale(1 / scale);
}
- contentScaling = () => Doc.NativeWidth(this._dashDoc) > 0 ? this._dashDoc![WidthSym]() / Doc.NativeWidth(this._dashDoc) : 1;
-
outerFocus = (target: Doc) => this._textBox.props.focus(this._textBox.props.Document); // ideally, this would scroll to show the focus target
- onKeyPress = (e: any) => {
- e.stopPropagation();
- }
- onWheel = (e: any) => {
- e.preventDefault();
- }
- onKeyUp = (e: any) => {
- e.stopPropagation();
- }
onKeyDown = (e: any) => {
e.stopPropagation();
if (e.key === "Tab" || e.key === "Enter") {
e.preventDefault();
}
}
+
onPointerLeave = () => {
- const ele = document.getElementById("DashDocCommentView-" + this.props.node.attrs.docid);
- if (ele) {
- (ele as HTMLDivElement).style.backgroundColor = "";
- }
+ const ele = document.getElementById("DashDocCommentView-" + this.props.docid) as HTMLDivElement;
+ ele && (ele.style.backgroundColor = "");
}
- onPointerEnter = () => {
- const ele = document.getElementById("DashDocCommentView-" + this.props.node.attrs.docid);
- if (ele) {
- (ele as HTMLDivElement).style.backgroundColor = "orange";
- }
- }
- /*endregion*/
- componentWillUnmount = () => {
- this._reactionDisposer?.();
+ onPointerEnter = () => {
+ const ele = document.getElementById("DashDocCommentView-" + this.props.docid) as HTMLDivElement;
+ ele && (ele.style.backgroundColor = "orange");
}
- componentDidUpdate = () => {
-
- this._renderDisposer?.();
- this._renderDisposer = reaction(() => {
-
- const dashDoc = this._dashDoc as Doc;
- const dashLayoutDoc = Doc.Layout(dashDoc);
- const finalLayout = this.props.node.attrs.docid ? dashDoc : Doc.expandTemplateLayout(dashLayoutDoc, dashDoc, this.props.node.attrs.fieldKey);
-
- if (finalLayout) {
- if (!Doc.AreProtosEqual(finalLayout, dashDoc)) {
- finalLayout.rootDocument = dashDoc.aliasOf;
- }
- this._finalLayout = finalLayout;
- this._resolvedDataDoc = Cast(finalLayout.resolvedDataDoc, Doc, null);
- return { finalLayout, resolvedDataDoc: Cast(finalLayout.resolvedDataDoc, Doc, null) };
- }
- },
- (res) => {
-
- if (res) {
- this._finalLayout = res.finalLayout;
- this._resolvedDataDoc = res.resolvedDataDoc;
-
- this.forceUpdate(); // doReactRender(res.finalLayout, res.resolvedDataDoc),
- }
- },
- { fireImmediately: true });
-
- }
+ componentWillUnmount = () => Object.values(this._disposers).forEach(disposer => disposer?.());
render() {
- // doRender(dashDoc: Doc, removeDoc: any, node: any, view: any, getPos: any) {
-
- const node = this.props.node;
- const view = this.props.view;
- const getPos = this.props.getPos;
-
- const spanStyle = {
- width: this.props.node.props.width,
- height: this.props.node.props.height,
- position: 'absolute' as 'absolute',
- display: 'inline-block'
- };
-
-
- const outerStyle = {
- position: "relative" as "relative",
- textIndent: "0",
- border: "1px solid " + StrCast(this._textBox.Document.color, (CurrentUserUtils.ActiveDashboard.darkScheme ? "dimGray" : "lightGray")),
- width: this.props.node.props.width,
- height: this.props.node.props.height,
- display: this.props.node.props.hidden ? "none" : "inline-block",
- float: this.props.node.props.float,
- };
-
- const dashDoc = this._dashDoc as Doc;
- const self = this;
- const dashLayoutDoc = Doc.Layout(dashDoc);
- const finalLayout = node.attrs.docid ? dashDoc : Doc.expandTemplateLayout(dashLayoutDoc, dashDoc, node.attrs.fieldKey);
- const resolvedDataDoc = this._resolvedDataDoc; //Added this
-
- if (!finalLayout) {
- return <div></div>;
- // if (!finalLayout) setTimeout(() => self.doRender(dashDoc, removeDoc, node, view, getPos), 0);
- } else {
-
- this._reactionDisposer?.();
- this._reactionDisposer = reaction(() =>
- ({
- dim: [finalLayout[WidthSym](), finalLayout[HeightSym]()],
- color: finalLayout.color
- }),
- ({ dim, color }) => {
- spanStyle.width = outerStyle.width = Math.max(20, dim[0]) + "px";
- spanStyle.height = outerStyle.height = Math.max(20, dim[1]) + "px";
- outerStyle.border = "1px solid " + StrCast(finalLayout.color, (CurrentUserUtils.ActiveDashboard.darkScheme ? "dimGray" : "lightGray"));
- }, { fireImmediately: true });
-
- if (node.attrs.width !== dashDoc._width + "px" || node.attrs.height !== dashDoc._height + "px") {
- try { // bcz: an exception will be thrown if two aliases are open at the same time when a doc view comment is made
- view.dispatch(view.state.tr.setNodeMarkup(getPos(), null, { ...node.attrs, width: dashDoc._width + "px", height: dashDoc._height + "px" }));
- } catch (e) {
- console.log("DashDocView:" + e);
- }
- }
-
-
- //const doReactRender = (finalLayout: Doc, resolvedDataDoc: Doc) => {
- // ReactDOM.unmountComponentAtNode(this._dashSpan);
-
- return (
- <span id="dash-document-view-outer"
- className="outer"
- style={outerStyle}
- >
- <div id="dashSpan"
- className="dash-span"
- style={spanStyle}
- onPointerLeave={this.onPointerLeave}
- onPointerEnter={this.onPointerEnter}
- onKeyDown={this.onKeyDown}
- onKeyPress={this.onKeyPress}
- onKeyUp={this.onKeyUp}
- onWheel={this.onWheel}
- >
- <DocumentView
- Document={finalLayout}
- DataDoc={resolvedDataDoc}
- addDocument={returnFalse}
- rootSelected={this._textBox.props.isSelected}
- removeDocument={this.removeDoc}
- ScreenToLocalTransform={this.getDocTransform}
- addDocTab={this._textBox.props.addDocTab}
- pinToPres={returnFalse}
- renderDepth={self._textBox.props.renderDepth + 1}
- PanelWidth={finalLayout[WidthSym]}
- PanelHeight={finalLayout[HeightSym]}
- focus={this.outerFocus}
- styleProvider={self._textBox.props.styleProvider}
- layerProvider={self._textBox.props.layerProvider}
- docViewPath={self._textBox.props.docViewPath}
- parentActive={returnFalse}
- whenActiveChanged={returnFalse}
- bringToFront={emptyFunction}
- dontRegisterView={false}
- docFilters={this.props.tbox?.props.docFilters || returnEmptyFilter}
- docRangeFilters={this.props.tbox?.props.docRangeFilters || returnEmptyFilter}
- searchFilterDocs={this.props.tbox?.props.searchFilterDocs || returnEmptyDoclist}
- ContainingCollectionView={this._textBox.props.ContainingCollectionView}
- ContainingCollectionDoc={this._textBox.props.ContainingCollectionDoc}
- />
-
- </div>
- </span>
- );
-
- }
+ return !this._dashDoc || !this._finalLayout || this.props.hidden ? null :
+ <div ref={this._spanRef}
+ className="dash-span"
+ style={{
+ width: this.props.width,
+ height: this.props.height,
+ position: 'absolute',
+ display: 'inline-block'
+ }}
+ onPointerLeave={this.onPointerLeave}
+ onPointerEnter={this.onPointerEnter}
+ onKeyDown={this.onKeyDown}
+ onKeyPress={e => e.stopPropagation()}
+ onKeyUp={e => e.stopPropagation()}
+ onWheel={e => e.preventDefault()}
+ >
+ <DocumentView
+ Document={this._finalLayout}
+ DataDoc={this._resolvedDataDoc}
+ addDocument={returnFalse}
+ rootSelected={this._textBox.props.isSelected}
+ removeDocument={this.removeDoc}
+ layerProvider={this._textBox.props.layerProvider}
+ styleProvider={this._textBox.props.styleProvider}
+ docViewPath={this._textBox.props.docViewPath}
+ ScreenToLocalTransform={this.getDocTransform}
+ addDocTab={this._textBox.props.addDocTab}
+ pinToPres={returnFalse}
+ renderDepth={this._textBox.props.renderDepth + 1}
+ PanelWidth={this._finalLayout[WidthSym]}
+ PanelHeight={this._finalLayout[HeightSym]}
+ focus={this.outerFocus}
+ parentActive={returnFalse}
+ whenActiveChanged={returnFalse}
+ bringToFront={emptyFunction}
+ dontRegisterView={false}
+ docFilters={this.props.tbox?.props.docFilters}
+ docRangeFilters={this.props.tbox?.props.docRangeFilters}
+ searchFilterDocs={this.props.tbox?.props.searchFilterDocs}
+ ContainingCollectionView={this._textBox.props.ContainingCollectionView}
+ ContainingCollectionDoc={this._textBox.props.ContainingCollectionDoc}
+ />
+ </div>;
}
-
} \ No newline at end of file
diff --git a/src/client/views/nodes/formattedText/FormattedTextBox.scss b/src/client/views/nodes/formattedText/FormattedTextBox.scss
index 0f2f9cdb7..6fcd0eb8f 100644
--- a/src/client/views/nodes/formattedText/FormattedTextBox.scss
+++ b/src/client/views/nodes/formattedText/FormattedTextBox.scss
@@ -126,13 +126,12 @@ audiotag:hover {
}
.formattedTextBox-inner-rounded-selected,
.formattedTextBox-inner-selected {
- .ProseMirror {
+ > .ProseMirror {
padding:10px;
}
}
.formattedTextBox-outer-selected {
-
- .ProseMirror:hover {
+ > .ProseMirror:hover {
background: unset;
}
}
diff --git a/src/client/views/nodes/formattedText/FormattedTextBox.tsx b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
index ad11d55bf..9c620e729 100644
--- a/src/client/views/nodes/formattedText/FormattedTextBox.tsx
+++ b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
@@ -1,71 +1,68 @@
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { isEqual, max } from "lodash";
-import { action, computed, IReactionDisposer, Lambda, observable, reaction, runInAction, trace } from "mobx";
+import { isEqual } from "lodash";
+import { action, computed, IReactionDisposer, reaction, runInAction } from "mobx";
import { observer } from "mobx-react";
import { baseKeymap, selectAll } from "prosemirror-commands";
import { history } from "prosemirror-history";
import { inputRules } from 'prosemirror-inputrules';
import { keymap } from "prosemirror-keymap";
-import { Fragment, Mark, Node, Slice, Schema } from "prosemirror-model";
-import { EditorState, NodeSelection, Plugin, TextSelection, Transaction } from "prosemirror-state";
+import { Fragment, Mark, Node, Slice } from "prosemirror-model";
import { ReplaceStep } from 'prosemirror-transform';
+import { EditorState, NodeSelection, Plugin, TextSelection, Transaction } from "prosemirror-state";
import { EditorView } from "prosemirror-view";
import { DateField } from '../../../../fields/DateField';
-import { DataSym, Doc, DocListCast, DocListCastAsync, Field, HeightSym, Opt, WidthSym, AclEdit, AclAdmin, UpdatingFromServer, ForceServerWrite } from "../../../../fields/Doc";
+import { AclAdmin, AclEdit, DataSym, Doc, DocListCast, DocListCastAsync, Field, ForceServerWrite, HeightSym, Opt, UpdatingFromServer, WidthSym } from "../../../../fields/Doc";
import { documentSchema } from '../../../../fields/documentSchemas';
-import applyDevTools = require("prosemirror-dev-tools");
-import { removeMarkWithAttrs } from "./prosemirrorPatches";
import { Id } from '../../../../fields/FieldSymbols';
import { InkTool } from '../../../../fields/InkField';
import { PrefetchProxy } from '../../../../fields/Proxy';
import { RichTextField } from "../../../../fields/RichTextField";
import { RichTextUtils } from '../../../../fields/RichTextUtils';
import { makeInterface } from "../../../../fields/Schema";
-import { Cast, DateCast, NumCast, StrCast, ScriptCast, BoolCast } from "../../../../fields/Types";
-import { TraceMobx, GetEffectiveAcl } from '../../../../fields/util';
-import { addStyleSheet, addStyleSheetRule, clearStyleSheetRules, emptyFunction, numberRange, returnOne, returnZero, Utils, setupMoveUpEvents, OmitKeys, smoothScroll } from '../../../../Utils';
+import { Cast, DateCast, NumCast, ScriptCast, StrCast } from "../../../../fields/Types";
+import { GetEffectiveAcl, TraceMobx } from '../../../../fields/util';
+import { addStyleSheet, addStyleSheetRule, clearStyleSheetRules, emptyFunction, numberRange, OmitKeys, returnZero, setupMoveUpEvents, smoothScroll, Utils } from '../../../../Utils';
import { GoogleApiClientUtils, Pulls, Pushes } from '../../../apis/google_docs/GoogleApiClientUtils';
import { DocServer } from "../../../DocServer";
import { Docs, DocUtils } from '../../../documents/Documents';
import { DocumentType } from '../../../documents/DocumentTypes';
+import { CurrentUserUtils } from '../../../util/CurrentUserUtils';
import { DictationManager } from '../../../util/DictationManager';
+import { DocumentManager } from '../../../util/DocumentManager';
import { DragManager } from "../../../util/DragManager";
import { makeTemplate } from '../../../util/DropConverter';
-import { buildKeymap, updateBullets } from "./ProsemirrorExampleTransfer";
-import { RichTextMenu, RichTextMenuPlugin } from './RichTextMenu';
-import { RichTextRules } from "./RichTextRules";
-
-//import { DashDocView } from "./DashDocView";
-import { DashDocView } from "./RichTextSchema";
-
-import { DashDocCommentView } from "./DashDocCommentView";
-import { DashFieldView } from "./DashFieldView";
-import { EquationView } from "./EquationView";
-import { SummaryView } from "./SummaryView";
-import { OrderedListView } from "./OrderedListView";
-import { FootnoteView } from "./FootnoteView";
-
-import { schema } from "./schema_rts";
import { SelectionManager } from "../../../util/SelectionManager";
+import { SnappingManager } from '../../../util/SnappingManager';
import { undoBatch, UndoManager } from "../../../util/UndoManager";
import { CollectionFreeFormView } from '../../collections/collectionFreeForm/CollectionFreeFormView';
+import { CollectionStackingView } from '../../collections/CollectionStackingView';
import { ContextMenu } from '../../ContextMenu';
import { ContextMenuProps } from '../../ContextMenuItem';
import { ViewBoxAnnotatableComponent } from "../../DocComponent";
import { DocumentButtonBar } from '../../DocumentButtonBar';
+import { LightboxView } from '../../LightboxView';
+import { AnchorMenu } from '../../pdf/AnchorMenu';
+import { StyleProp } from '../../StyleProvider';
import { AudioBox } from '../AudioBox';
import { FieldView, FieldViewProps } from "../FieldView";
+import { LinkDocPreview } from '../LinkDocPreview';
+import { DashDocCommentView } from "./DashDocCommentView";
+import { DashDocView } from "./DashDocView";
+import { DashFieldView } from "./DashFieldView";
+import { EquationView } from "./EquationView";
+import { FootnoteView } from "./FootnoteView";
import "./FormattedTextBox.scss";
-import { FormattedTextBoxComment, findLinkMark } from './FormattedTextBoxComment';
+import { findLinkMark, FormattedTextBoxComment } from './FormattedTextBoxComment';
+import { OrderedListView } from "./OrderedListView";
+import { buildKeymap, updateBullets } from "./ProsemirrorExampleTransfer";
+import { removeMarkWithAttrs } from "./prosemirrorPatches";
+import { RichTextMenu, RichTextMenuPlugin } from './RichTextMenu';
+import { RichTextRules } from "./RichTextRules";
+import { schema } from "./schema_rts";
+import { SummaryView } from "./SummaryView";
+import applyDevTools = require("prosemirror-dev-tools");
+
import React = require("react");
-import { CollectionStackingView } from '../../collections/CollectionStackingView';
-import { SnappingManager } from '../../../util/SnappingManager';
-import { LinkDocPreview } from '../LinkDocPreview';
-import { StyleProp } from '../../StyleProvider';
-import { AnchorMenu } from '../../pdf/AnchorMenu';
-import { CurrentUserUtils } from '../../../util/CurrentUserUtils';
-import { DocumentManager } from '../../../util/DocumentManager';
-import { LightboxView } from '../../LightboxView';
const translateGoogleApi = require("translate-google-api");
export interface FormattedTextBoxProps {
diff --git a/src/client/views/nodes/formattedText/RichTextSchema.tsx b/src/client/views/nodes/formattedText/RichTextSchema.tsx
deleted file mode 100644
index 2252de3d6..000000000
--- a/src/client/views/nodes/formattedText/RichTextSchema.tsx
+++ /dev/null
@@ -1,188 +0,0 @@
-import { IReactionDisposer, reaction } from "mobx";
-import { NodeSelection } from "prosemirror-state";
-import * as ReactDOM from 'react-dom';
-import { Doc, HeightSym, WidthSym } from "../../../../fields/Doc";
-import { Id } from "../../../../fields/FieldSymbols";
-import { Cast, StrCast } from "../../../../fields/Types";
-import { emptyFunction, returnFalse, Utils } from "../../../../Utils";
-import { DocServer } from "../../../DocServer";
-import { Docs, DocUtils } from "../../../documents/Documents";
-import { CurrentUserUtils } from "../../../util/CurrentUserUtils";
-import { Transform } from "../../../util/Transform";
-import { DefaultStyleProvider } from "../../StyleProvider";
-import { DocumentView } from "../DocumentView";
-import { FormattedTextBox } from "./FormattedTextBox";
-import React = require("react");
-
-
-export class DashDocView {
- _dashSpan: HTMLDivElement;
- _outer: HTMLElement;
- _dashDoc: Doc | undefined;
- _reactionDisposer: IReactionDisposer | undefined;
- _renderDisposer: IReactionDisposer | undefined;
- _textBox: FormattedTextBox;
-
- //moved
- getDocTransform = () => {
- const { scale, translateX, translateY } = Utils.GetScreenTransform(this._outer);
- return new Transform(-translateX, -translateY, 1).scale(1 / scale);
- }
-
-
- //moved
- outerFocus = (target: Doc) => this._textBox.props.focus(this._textBox.props.Document); // ideally, this would scroll to show the focus target
-
- constructor(node: any, view: any, getPos: any, tbox: FormattedTextBox) {
- //moved
- this._textBox = tbox;
-
- this._dashSpan = document.createElement("div");
- this._outer = document.createElement("span");
- this._outer.style.position = "relative";
- this._outer.style.textIndent = "0";
- this._outer.style.border = "1px solid " + StrCast(tbox.layoutDoc.color, (CurrentUserUtils.ActiveDashboard.darkScheme ? "dimGray" : "lightGray"));
- this._outer.style.width = node.attrs.width;
- this._outer.style.height = node.attrs.height;
- this._outer.style.display = node.attrs.hidden ? "none" : "inline-block";
- // this._outer.style.overflow = "hidden"; // bcz: not sure if this is needed. if it's used, then the doc doesn't highlight when you hover over a docComment
- (this._outer.style as any).float = node.attrs.float;
-
- this._dashSpan.style.width = node.attrs.width;
- this._dashSpan.style.height = node.attrs.height;
- this._dashSpan.style.position = "absolute";
- this._dashSpan.style.display = "inline-block";
- this._dashSpan.style.left = "0";
- this._dashSpan.style.top = "0";
- this._dashSpan.style.whiteSpace = "normal";
-
- this._dashSpan.onpointerleave = () => {
- const ele = document.getElementById("DashDocCommentView-" + node.attrs.docid);
- if (ele) {
- (ele as HTMLDivElement).style.backgroundColor = "";
- }
- };
-
- this._dashSpan.onpointerenter = () => {
- const ele = document.getElementById("DashDocCommentView-" + node.attrs.docid);
- if (ele) {
- (ele as HTMLDivElement).style.backgroundColor = "orange";
- }
- };
-
- const removeDoc = () => {
- console.log("DashDocView.removeDoc"); // SMM
- const pos = getPos();
- const ns = new NodeSelection(view.state.doc.resolve(pos));
- view.dispatch(view.state.tr.setSelection(ns).deleteSelection());
- return true;
- };
-
- const alias = node.attrs.alias;
- const self = this;
- const docid = node.attrs.docid || tbox.props.Document[Id];// tbox.props.DataDoc?.[Id] || tbox.dataDoc?.[Id];
-
- DocServer.GetRefField(docid + alias).then(async dashDoc => {
-
- if (!(dashDoc instanceof Doc)) {
- alias && DocServer.GetRefField(docid).then(async dashDocBase => {
- if (dashDocBase instanceof Doc) {
- const aliasedDoc = Doc.MakeAlias(dashDocBase, docid + alias);
- aliasedDoc.layoutKey = "layout";
- node.attrs.fieldKey && DocUtils.makeCustomViewClicked(aliasedDoc, Docs.Create.StackingDocument, node.attrs.fieldKey, undefined);
- self.doRender(aliasedDoc, removeDoc, node, view, getPos);
- }
- });
- } else {
- self.doRender(dashDoc, removeDoc, node, view, getPos);
- }
- });
-
-
- this._dashSpan.onkeydown = function (e: any) {
- e.stopPropagation();
- if (e.key === "Tab" || e.key === "Enter") {
- e.preventDefault();
- }
- };
- this._dashSpan.onkeypress = function (e: any) { e.stopPropagation(); };
- this._dashSpan.onwheel = function (e: any) { e.preventDefault(); };
- this._dashSpan.onkeyup = function (e: any) { e.stopPropagation(); };
- this._outer.appendChild(this._dashSpan);
- (this as any).dom = this._outer;
- }
-
- doRender(dashDoc: Doc, removeDoc: any, node: any, view: any, getPos: any) {
- this._dashDoc = dashDoc;
- const self = this;
- const dashLayoutDoc = Doc.Layout(dashDoc);
- const finalLayout = node.attrs.docid ? dashDoc : Doc.expandTemplateLayout(dashLayoutDoc, dashDoc, node.attrs.fieldKey);
-
- if (!finalLayout) setTimeout(() => self.doRender(dashDoc, removeDoc, node, view, getPos), 0);
- else {
- this._reactionDisposer?.();
- this._reactionDisposer = reaction(() => ({ dim: [finalLayout[WidthSym](), finalLayout[HeightSym]()], color: finalLayout.color }), ({ dim, color }) => {
- this._dashSpan.style.width = this._outer.style.width = Math.max(20, dim[0]) + "px";
- this._dashSpan.style.height = this._outer.style.height = Math.max(20, dim[1]) + "px";
- this._outer.style.border = "1px solid " + StrCast(finalLayout.color, (CurrentUserUtils.ActiveDashboard.darkScheme ? "dimGray" : "lightGray"));
- }, { fireImmediately: true });
-
- const doReactRender = (finalLayout: Doc, resolvedDataDoc: Doc) => {
- ReactDOM.unmountComponentAtNode(this._dashSpan);
-
- ReactDOM.render(<DocumentView
- Document={finalLayout}
- DataDoc={resolvedDataDoc}
- addDocument={returnFalse}
- rootSelected={this._textBox.props.isSelected}
- removeDocument={removeDoc}
- layerProvider={this._textBox.props.layerProvider}
- styleProvider={this._textBox.props.styleProvider}
- docViewPath={this._textBox.props.docViewPath}
- ScreenToLocalTransform={this.getDocTransform}
- addDocTab={this._textBox.props.addDocTab}
- pinToPres={returnFalse}
- renderDepth={self._textBox.props.renderDepth + 1}
- PanelWidth={finalLayout[WidthSym]}
- PanelHeight={finalLayout[HeightSym]}
- focus={this.outerFocus}
- parentActive={returnFalse}
- whenActiveChanged={returnFalse}
- bringToFront={emptyFunction}
- dontRegisterView={false}
- docFilters={this._textBox.props.docFilters}
- docRangeFilters={this._textBox.props.docRangeFilters}
- searchFilterDocs={this._textBox.props.searchFilterDocs}
- ContainingCollectionView={this._textBox.props.ContainingCollectionView}
- ContainingCollectionDoc={this._textBox.props.ContainingCollectionDoc}
- />, this._dashSpan);
-
- if (node.attrs.width !== dashDoc._width + "px" || node.attrs.height !== dashDoc._height + "px") {
- try { // bcz: an exception will be thrown if two aliases are open at the same time when a doc view comment is made
- if (getPos() !== undefined) {
- const node = view.state.tr.doc.nodeAt(getPos());
- if (node.attrs.width !== dashDoc._width + "px" ||
- node.attrs.height !== dashDoc._height + "px") {
- view.dispatch(view.state.tr.setNodeMarkup(getPos(), null, { ...node.attrs, width: dashDoc._width + "px", height: dashDoc._height + "px" }));
- }
- }
- } catch (e) {
- console.log("RichTextSchema: " + e);
- }
- }
- };
-
- this._renderDisposer?.();
- this._renderDisposer = reaction(() => {
- return { finalLayout, resolvedDataDoc: Cast(finalLayout.resolvedDataDoc, Doc, null) };
- },
- (res) => doReactRender(res.finalLayout, res.resolvedDataDoc),
- { fireImmediately: true });
- }
- }
-
- destroy() {
- ReactDOM.unmountComponentAtNode(this._dashSpan);
- this._reactionDisposer?.();
- }
-}
diff --git a/src/client/views/nodes/formattedText/nodes_rts.ts b/src/client/views/nodes/formattedText/nodes_rts.ts
index 9893da3bb..df93fc117 100644
--- a/src/client/views/nodes/formattedText/nodes_rts.ts
+++ b/src/client/views/nodes/formattedText/nodes_rts.ts
@@ -213,8 +213,7 @@ export const nodes: { [index: string]: NodeSpec } = {
height: { default: 100 },
title: { default: null },
float: { default: "right" },
- location: { default: "add:right" },
- hidden: { default: false },
+ hidden: { default: false }, // whether dashComment node has toggle the dashDoc's display off
fieldKey: { default: "" },
docid: { default: "" },
alias: { default: "" }
diff --git a/src/client/views/search/SearchBox.tsx b/src/client/views/search/SearchBox.tsx
index 899fac66d..5c168d8a9 100644
--- a/src/client/views/search/SearchBox.tsx
+++ b/src/client/views/search/SearchBox.tsx
@@ -47,7 +47,7 @@ export class SearchBox extends ViewBoxBaseComponent<FieldViewProps, SearchBoxDoc
private _maxSearchIndex: number = 0;
private _curRequest?: Promise<any> = undefined;
private _disposers: { [name: string]: IReactionDisposer } = {};
- private _blockedTypes = [DocumentType.PRESELEMENT, DocumentType.KVP, DocumentType.FILTER, DocumentType.DOCHOLDER, DocumentType.SEARCH, DocumentType.SEARCHITEM, DocumentType.FONTICON, DocumentType.BUTTON, DocumentType.SCRIPTING];
+ private _blockedTypes = [DocumentType.PRESELEMENT, DocumentType.KVP, DocumentType.FILTER, DocumentType.SEARCH, DocumentType.SEARCHITEM, DocumentType.FONTICON, DocumentType.BUTTON, DocumentType.SCRIPTING];
private docsforfilter: Doc[] | undefined = [];
private realTotalResults: number = 0;
diff --git a/src/fields/Doc.ts b/src/fields/Doc.ts
index c2f5efadc..75d15c409 100644
--- a/src/fields/Doc.ts
+++ b/src/fields/Doc.ts
@@ -1160,7 +1160,6 @@ export namespace Doc {
case DocumentType.PRES: return "tv";
case DocumentType.SCRIPTING: return "terminal";
case DocumentType.IMPORT: return "cloud-upload-alt";
- case DocumentType.DOCHOLDER: return "expand";
case DocumentType.VID: return "video";
case DocumentType.INK: return "pen-nib";
case DocumentType.PDF: return "file-pdf";
@@ -1335,7 +1334,7 @@ Scripting.addGlobal(function activePresentationItem() {
});
Scripting.addGlobal(function selectedDocs(container: Doc, excludeCollections: boolean, prevValue: any) {
const docs = SelectionManager.Views().map(dv => dv.props.Document).
- filter(d => !Doc.AreProtosEqual(d, container) && !d.annotationOn && d.type !== DocumentType.DOCHOLDER && d.type !== DocumentType.KVP &&
+ filter(d => !Doc.AreProtosEqual(d, container) && !d.annotationOn && d.type !== DocumentType.KVP &&
(!excludeCollections || d.type !== DocumentType.COL || !Cast(d.data, listSpec(Doc), null)));
return docs.length ? new List(docs) : prevValue;
});