diff options
| author | andrewdkim <adkim414@gmail.com> | 2019-09-21 14:24:05 -0400 | 
|---|---|---|
| committer | andrewdkim <adkim414@gmail.com> | 2019-09-21 14:24:05 -0400 | 
| commit | c0dc4928c29e043ae897f4f7c58168831c3d8fd5 (patch) | |
| tree | 214173886faf8a7bcd47fd384e3341c2f8158658 /src/client/util | |
| parent | 53c4f6ddad5534101d7a7482332cddb02ba99c21 (diff) | |
| parent | 1d5dc3eb4095cea017412de9519b8eaee979c16c (diff) | |
merge from master
Diffstat (limited to 'src/client/util')
| -rw-r--r-- | src/client/util/DictationManager.ts | 2 | ||||
| -rw-r--r-- | src/client/util/DocumentManager.ts | 44 | ||||
| -rw-r--r-- | src/client/util/DragManager.ts | 28 | ||||
| -rw-r--r-- | src/client/util/Import & Export/DirectoryImportBox.tsx | 5 | ||||
| -rw-r--r-- | src/client/util/ProsemirrorExampleTransfer.ts | 4 | ||||
| -rw-r--r-- | src/client/util/RichTextRules.ts | 6 | ||||
| -rw-r--r-- | src/client/util/RichTextSchema.tsx | 14 | ||||
| -rw-r--r-- | src/client/util/Scripting.ts | 8 | ||||
| -rw-r--r-- | src/client/util/SelectionManager.ts | 4 | ||||
| -rw-r--r-- | src/client/util/TooltipTextMenu.tsx | 16 | 
10 files changed, 77 insertions, 54 deletions
| diff --git a/src/client/util/DictationManager.ts b/src/client/util/DictationManager.ts index fb3c15cea..c4016d2a5 100644 --- a/src/client/util/DictationManager.ts +++ b/src/client/util/DictationManager.ts @@ -313,7 +313,7 @@ export namespace DictationManager {              ["open fields", {                  action: (target: DocumentView) => {                      let kvp = Docs.Create.KVPDocument(target.props.Document, { width: 300, height: 300 }); -                    target.props.addDocTab(kvp, target.dataDoc, "onRight"); +                    target.props.addDocTab(kvp, target.props.DataDoc, "onRight");                  }              }], diff --git a/src/client/util/DocumentManager.ts b/src/client/util/DocumentManager.ts index ec731da84..a3c7429b9 100644 --- a/src/client/util/DocumentManager.ts +++ b/src/client/util/DocumentManager.ts @@ -10,6 +10,7 @@ import { DocumentView } from '../views/nodes/DocumentView';  import { LinkManager } from './LinkManager';  import { undoBatch, UndoManager } from './UndoManager';  import { Scripting } from './Scripting'; +import { List } from '../../new_fields/List';  export class DocumentManager { @@ -146,6 +147,7 @@ export class DocumentManager {              if (!contextDoc) {                  let docs = docContext ? await DocListCastAsync(docContext.data) : undefined;                  let found = false; +                // bcz: this just searches within the context for the target -- perhaps it should recursively search through all children?                  docs && docs.map(d => found = found || Doc.AreProtosEqual(d, docDelegate));                  if (docContext && found) {                      let targetContextView: DocumentView | null; @@ -154,16 +156,19 @@ export class DocumentManager {                          docContext.panTransformType = "Ease";                          targetContextView.props.focus(docDelegate, willZoom);                      } else { -                        (dockFunc || CollectionDockingView.Instance.AddRightSplit)(docContext, undefined); +                        (dockFunc || CollectionDockingView.AddRightSplit)(docContext, undefined);                          setTimeout(() => { -                            this.jumpToDocument(docDelegate, willZoom, forceDockFunc, dockFunc, linkPage); -                        }, 10); +                            let dv = DocumentManager.Instance.getDocumentView(docContext); +                            dv && this.jumpToDocument(docDelegate, willZoom, forceDockFunc, +                                doc => dv!.props.focus(dv!.props.Document, true, 1, () => dv!.props.addDocTab(doc, undefined, "inPlace")), +                                linkPage); +                        }, 1050);                      }                  } else {                      const actualDoc = Doc.MakeAlias(docDelegate);                      Doc.BrushDoc(actualDoc);                      if (linkPage !== undefined) actualDoc.curPage = linkPage; -                    (dockFunc || CollectionDockingView.Instance.AddRightSplit)(actualDoc, undefined); +                    (dockFunc || CollectionDockingView.AddRightSplit)(actualDoc, undefined);                  }              } else {                  let contextView: DocumentView | null; @@ -172,7 +177,7 @@ export class DocumentManager {                      contextDoc.panTransformType = "Ease";                      contextView.props.focus(docDelegate, willZoom);                  } else { -                    (dockFunc || CollectionDockingView.Instance.AddRightSplit)(contextDoc, undefined); +                    (dockFunc || CollectionDockingView.AddRightSplit)(contextDoc, undefined);                      setTimeout(() => {                          this.jumpToDocument(docDelegate, willZoom, forceDockFunc, dockFunc, linkPage);                      }, 10); @@ -203,5 +208,34 @@ export class DocumentManager {              return 1;          }      } + +    @action +    animateBetweenPoint = (scrpt: number[], expandedDocs: Doc[] | undefined): void => { +        expandedDocs && expandedDocs.map(expDoc => { +            if (expDoc.isMinimized || expDoc.isAnimating === "min") { // MAXIMIZE DOC +                if (expDoc.isMinimized) {  // docs are never actaully at the minimized location.  so when we unminimize one, we have to set our overrides to make it look like it was at the minimize location +                    expDoc.isMinimized = false; +                    expDoc.animateToPos = new List<number>([...scrpt, 0]); +                    expDoc.animateToDimensions = new List<number>([0, 0]); +                } +                setTimeout(() => { +                    expDoc.isAnimating = "max"; +                    expDoc.animateToPos = new List<number>([0, 0, 1]); +                    expDoc.animateToDimensions = new List<number>([NumCast(expDoc.width), NumCast(expDoc.height)]); +                    setTimeout(() => expDoc.isAnimating === "max" && (expDoc.isAnimating = expDoc.animateToPos = expDoc.animateToDimensions = undefined), 600); +                }, 0); +            } else {  // MINIMIZE DOC +                expDoc.isAnimating = "min"; +                expDoc.animateToPos = new List<number>([...scrpt, 0]); +                expDoc.animateToDimensions = new List<number>([0, 0]); +                setTimeout(() => { +                    if (expDoc.isAnimating === "min") { +                        expDoc.isMinimized = true; +                        expDoc.isAnimating = expDoc.animateToPos = expDoc.animateToDimensions = undefined; +                    } +                }, 600); +            } +        }); +    }  }  Scripting.addGlobal(function focus(doc: any) { DocumentManager.Instance.getDocumentViews(Doc.GetProto(doc)).map(view => view.props.focus(doc, true)); });
\ No newline at end of file diff --git a/src/client/util/DragManager.ts b/src/client/util/DragManager.ts index 252accefa..56496c99b 100644 --- a/src/client/util/DragManager.ts +++ b/src/client/util/DragManager.ts @@ -66,7 +66,7 @@ export function SetupDrag(  function moveLinkedDocument(doc: Doc, targetCollection: Doc, addDocument: (doc: Doc) => boolean): boolean {      const document = SelectionManager.SelectedDocuments()[0]; -    document.props.removeDocument && document.props.removeDocument(doc); +    document && document.props.removeDocument && document.props.removeDocument(doc);      addDocument(doc);      return true;  } @@ -204,13 +204,11 @@ export namespace DragManager {          constructor(dragDoc: Doc[]) {              this.draggedDocuments = dragDoc;              this.droppedDocuments = dragDoc; -            this.xOffset = 0; -            this.yOffset = 0; +            this.offset = [0, 0];          }          draggedDocuments: Doc[];          droppedDocuments: Doc[]; -        xOffset: number; -        yOffset: number; +        offset: number[];          dropAction: dropActionType;          userDropAction: dropActionType;          moveDocument?: MoveFunction; @@ -223,14 +221,13 @@ export namespace DragManager {              this.dragDocument = dragDoc;              this.dropDocument = dropDoc;              this.annotationDocument = annotationDoc; -            this.xOffset = this.yOffset = 0; +            this.offset = [0, 0];          }          targetContext: Doc | undefined;          dragDocument: Doc;          annotationDocument: Doc;          dropDocument: Doc; -        xOffset: number; -        yOffset: number; +        offset: number[];          dropAction: dropActionType;          userDropAction: dropActionType;      } @@ -250,21 +247,13 @@ export namespace DragManager {              });      } -    export function StartButtonDrag(eles: HTMLElement[], script: string, title: string, vars: { [name: string]: Field }, params: string[], initialize?: (button: Doc) => void, downX: number, downY: number, options?: DragOptions) { +    export function StartButtonDrag(eles: HTMLElement[], script: string, title: string, vars: { [name: string]: Field }, params: string[], initialize: (button: Doc) => void, downX: number, downY: number, options?: DragOptions) {          let dragData = new DragManager.DocumentDragData([]);          runInAction(() => StartDragFunctions.map(func => func()));          StartDrag(eles, dragData, downX, downY, options, options && options.finishDrag ? options.finishDrag :              (dropData: { [id: string]: any }) => {                  let bd = Docs.Create.ButtonDocument({ width: 150, height: 50, title: title }); -                let compiled = CompileScript(script, { -                    params: { doc: Doc.name }, -                    typecheck: false, -                    editable: true -                }); -                if (compiled.compiled) { -                    let scriptField = new ScriptField(compiled); -                    bd.onClick = scriptField; -                } +                bd.onClick = ScriptField.MakeScript(script);                  params.map(p => Object.keys(vars).indexOf(p) !== -1 && (Doc.GetProto(bd)[p] = new PrefetchProxy(vars[p] as Doc)));                  initialize && initialize(bd);                  bd.buttonParams = new List<string>(params); @@ -281,7 +270,8 @@ export namespace DragManager {                  let droppedDocuments: Doc[] = dragData.draggedDocuments.reduce((droppedDocs: Doc[], d) => {                      let dvs = DocumentManager.Instance.getDocumentViews(d);                      if (dvs.length) { -                        let inContext = dvs.filter(dv => dv.props.ContainingCollectionView === SelectionManager.SelectedDocuments()[0].props.ContainingCollectionView); +                        let containingView = SelectionManager.SelectedDocuments()[0] ? SelectionManager.SelectedDocuments()[0].props.ContainingCollectionView : undefined; +                        let inContext = dvs.filter(dv => dv.props.ContainingCollectionView === containingView);                          if (inContext.length) {                              inContext.forEach(dv => droppedDocs.push(dv.props.Document));                          } else { diff --git a/src/client/util/Import & Export/DirectoryImportBox.tsx b/src/client/util/Import & Export/DirectoryImportBox.tsx index 75b0b52a7..dc6a0cb7a 100644 --- a/src/client/util/Import & Export/DirectoryImportBox.tsx +++ b/src/client/util/Import & Export/DirectoryImportBox.tsx @@ -134,11 +134,10 @@ export default class DirectoryImportBox extends React.Component<FieldViewProps>              x: NumCast(doc.x),              y: NumCast(doc.y) + offset          }; -        let parent = this.props.ContainingCollectionView; -        if (parent) { +        if (this.props.ContainingCollectionDoc) {              let importContainer = Docs.Create.StackingDocument(docs, options);              importContainer.singleColumn = false; -            Doc.AddDocToList(Doc.GetProto(parent.props.Document), "data", importContainer); +            Doc.AddDocToList(Doc.GetProto(this.props.ContainingCollectionDoc), "data", importContainer);              !this.persistent && this.props.removeDocument && this.props.removeDocument(doc);              DocumentManager.Instance.jumpToDocument(importContainer, true); diff --git a/src/client/util/ProsemirrorExampleTransfer.ts b/src/client/util/ProsemirrorExampleTransfer.ts index 1d2d33800..3e3d3155c 100644 --- a/src/client/util/ProsemirrorExampleTransfer.ts +++ b/src/client/util/ProsemirrorExampleTransfer.ts @@ -97,7 +97,7 @@ export default function buildKeymap<S extends Schema<any>>(schema: S, mapKeys?:          tx2.doc.descendants((node: any, offset: any, index: any) => {              if (node.type === schema.nodes.ordered_list || node.type === schema.nodes.list_item) {                  let path = (tx2.doc.resolve(offset) as any).path; -                let depth = Array.from(path).reduce((p: number, c: any) => p + (c.hasOwnProperty("type") && (c as any).type === schema.nodes.ordered_list ? 1 : 0), 0); +                let depth = Array.from(path).reduce((p: number, c: any) => p + (c.hasOwnProperty("type") && c.type === schema.nodes.ordered_list ? 1 : 0), 0);                  if (node.type === schema.nodes.ordered_list) depth++;                  tx2.setNodeMarkup(offset, node.type, { ...node.attrs, mapStyle: node.attrs.mapStyle, bulletStyle: depth }, node.marks);              } @@ -145,7 +145,7 @@ export default function buildKeymap<S extends Schema<any>>(schema: S, mapKeys?:          marks && tx.ensureMarks(marks.filter((val: any) => val.type !== schema.marks.metadata && val.type !== schema.marks.metadataKey && val.type !== schema.marks.metadataVal));          marks && tx.setStoredMarks(marks.filter((val: any) => val.type !== schema.marks.metadata && val.type !== schema.marks.metadataKey && val.type !== schema.marks.metadataVal));          return tx; -    } +    };      bind("Enter", (state: EditorState<S>, dispatch: (tx: Transaction<S>) => void) => {          var marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());          if (!splitListItem(schema.nodes.list_item)(state, (tx3: Transaction) => dispatch(tx3))) { diff --git a/src/client/util/RichTextRules.ts b/src/client/util/RichTextRules.ts index c727eec73..cd37ea0bb 100644 --- a/src/client/util/RichTextRules.ts +++ b/src/client/util/RichTextRules.ts @@ -20,7 +20,7 @@ export const inpRules = {              /^1\.\s$/,              schema.nodes.ordered_list,              () => { -                return ({ mapStyle: "decimal", bulletStyle: 1 }) +                return ({ mapStyle: "decimal", bulletStyle: 1 });              },              (match: any, node: any) => {                  return node.childCount + node.attrs.order === +match[1]; @@ -33,7 +33,7 @@ export const inpRules = {              schema.nodes.ordered_list,              // match => {              () => { -                return ({ mapStyle: "alpha", bulletStyle: 1 }) +                return ({ mapStyle: "alpha", bulletStyle: 1 });                  // return ({ order: +match[1] })              },              (match: any, node: any) => { @@ -67,7 +67,7 @@ export const inpRules = {                      (Cast(FormattedTextBox.InputBoxOverlay!.props.Document, Doc) as Doc).heading = Number(match[1]);                      return state.tr.deleteRange(start, end);                  } -                return state.tr.deleteRange(start, end).addStoredMark(schema.marks.pFontSize.create({ fontSize: Number(match[1]) })) +                return state.tr.deleteRange(start, end).addStoredMark(schema.marks.pFontSize.create({ fontSize: Number(match[1]) }));              }),          new InputRule(              new RegExp(/^\^\^\s$/), diff --git a/src/client/util/RichTextSchema.tsx b/src/client/util/RichTextSchema.tsx index f027a4bf7..ba4b92a25 100644 --- a/src/client/util/RichTextSchema.tsx +++ b/src/client/util/RichTextSchema.tsx @@ -349,8 +349,9 @@ export const marks: { [index: string]: MarkSpec } = {                          let style = getComputedStyle(p);                          if (style.textDecoration === "underline") return null;                          if (p.parentElement.outerHTML.indexOf("text-decoration: underline") !== -1 && -                            p.parentElement.outerHTML.indexOf("text-decoration-style: dotted") !== -1) +                            p.parentElement.outerHTML.indexOf("text-decoration-style: dotted") !== -1) {                              return null; +                        }                      }                      return false;                  } @@ -371,10 +372,9 @@ export const marks: { [index: string]: MarkSpec } = {                  getAttrs: (p: any) => {                      if (typeof (p) !== "string") {                          let style = getComputedStyle(p); -                        if (style.textDecoration === "underline") -                            return null; -                        if (p.parentElement.outerHTML.indexOf("text-decoration-style:line") !== -1) +                        if (style.textDecoration === "underline" || p.parentElement.outerHTML.indexOf("text-decoration-style:line") !== -1) {                              return null; +                        }                      }                      return false;                  } @@ -633,11 +633,11 @@ export class ImageResizeView {                              DocumentManager.Instance.jumpToDocument(jumpToDoc, e.ctrlKey, false, document => addDocTab(document, undefined, location ? location : "inTab"));                          } else {                              DocumentManager.Instance.jumpToDocument(linkDoc, e.ctrlKey, false, document => addDocTab(document, undefined, location ? location : "inTab")); -                        } e.ctrlKey +                        }                      }                  });              } -        } +        };          this._handle.onpointerdown = function (e: any) {              e.preventDefault();              e.stopPropagation(); @@ -776,7 +776,7 @@ export class FootnoteView {          this.innerView.updateState(state);          if (!tr.getMeta("fromOutside")) { -            let outerTr = this.outerView.state.tr, offsetMap = StepMap.offset(this.getPos() + 1) +            let outerTr = this.outerView.state.tr, offsetMap = StepMap.offset(this.getPos() + 1);              for (let i = 0; i < transactions.length; i++) {                  let steps = transactions[i].steps;                  for (let j = 0; j < steps.length; j++) { diff --git a/src/client/util/Scripting.ts b/src/client/util/Scripting.ts index 1d0916ac0..ff4451824 100644 --- a/src/client/util/Scripting.ts +++ b/src/client/util/Scripting.ts @@ -19,6 +19,7 @@ export interface ScriptSucccess {  export interface ScriptError {      success: false;      error: any; +    result: any;  }  export type ScriptResult = ScriptSucccess | ScriptError; @@ -27,7 +28,7 @@ export interface CompiledScript {      readonly compiled: true;      readonly originalScript: string;      readonly options: Readonly<ScriptOptions>; -    run(args?: { [name: string]: any }): ScriptResult; +    run(args?: { [name: string]: any }, onError?: (res: any) => void, errorVal?: any): ScriptResult;  }  export interface CompileError { @@ -100,7 +101,7 @@ function Run(script: string | undefined, customParams: string[], diagnostics: an      // let params: any[] = [Docs, ...fieldTypes];      let compiledFunction = new Function(...paramNames, `return ${script}`);      let { capturedVariables = {} } = options; -    let run = (args: { [name: string]: any } = {}): ScriptResult => { +    let run = (args: { [name: string]: any } = {}, onError?: (e: any) => void, errorVal?: any): ScriptResult => {          let argsArray: any[] = [];          for (let name of customParams) {              if (name === "this") { @@ -127,7 +128,8 @@ function Run(script: string | undefined, customParams: string[], diagnostics: an              if (batch) {                  batch.end();              } -            return { success: false, error }; +            onError && onError(error); +            return { success: false, error, result: errorVal };          }      };      return { compiled: true, run, originalScript, options }; diff --git a/src/client/util/SelectionManager.ts b/src/client/util/SelectionManager.ts index 9efef888d..4c97a1056 100644 --- a/src/client/util/SelectionManager.ts +++ b/src/client/util/SelectionManager.ts @@ -24,6 +24,10 @@ export namespace SelectionManager {                  manager.SelectedDocuments.push(docView);                  // console.log(manager.SelectedDocuments);                  docView.props.whenActiveChanged(true); +            } else if (!ctrlPressed && manager.SelectedDocuments.length > 1) { +                manager.SelectedDocuments.map(dv => dv !== docView && dv.props.whenActiveChanged(false)); +                manager.SelectedDocuments = [docView]; +                FormattedTextBox.InputBoxOverlay = undefined;              }          }          @action diff --git a/src/client/util/TooltipTextMenu.tsx b/src/client/util/TooltipTextMenu.tsx index 84d045e6f..b6de048e4 100644 --- a/src/client/util/TooltipTextMenu.tsx +++ b/src/client/util/TooltipTextMenu.tsx @@ -58,10 +58,6 @@ export class TooltipTextMenu {      private _collapsed: boolean = false; -    @observable -    private _storedMarks: Mark<any>[] | null | undefined; - -      constructor(view: EditorView, editorProps: FieldViewProps & FormattedTextBoxProps) {          this.view = view;          this.editorProps = editorProps; @@ -84,8 +80,6 @@ export class TooltipTextMenu {          this.dragElement(dragger); -        this._storedMarks = this.view.state.storedMarks; -          // this.createCollapse();          // if (this._collapseBtn) {          //     this.tooltip.appendChild(this._collapseBtn.render(this.view).dom); @@ -280,7 +274,7 @@ export class TooltipTextMenu {                                  if (DocumentManager.Instance.getDocumentView(f)) {                                      DocumentManager.Instance.getDocumentView(f)!.props.focus(f, false);                                  } -                                else if (CollectionDockingView.Instance) CollectionDockingView.Instance.AddRightSplit(f, undefined); +                                else this.editorProps.addDocTab(f, undefined, "onRight");                              }                          }));                      } @@ -310,8 +304,8 @@ export class TooltipTextMenu {                              dragComplete: action(() => {                                  let linkDoc = dragData.linkDocument;                                  let proto = Doc.GetProto(linkDoc); -                                if (proto && docView && docView.props.ContainingCollectionView) { -                                    proto.sourceContext = docView.props.ContainingCollectionView.props.Document; +                                if (proto && docView) { +                                    proto.sourceContext = docView.props.ContainingCollectionDoc;                                  }                                  linkDoc instanceof Doc && this.makeLink(Utils.prepend("/doc/" + linkDoc[Id]), ctrlKey ? "onRight" : "inTab");                              }), @@ -523,12 +517,12 @@ export class TooltipTextMenu {          tx2.doc.descendants((node: any, offset: any, index: any) => {              if (node.type === schema.nodes.ordered_list || node.type === schema.nodes.list_item) {                  let path = (tx2.doc.resolve(offset) as any).path; -                let depth = Array.from(path).reduce((p: number, c: any) => p + (c.hasOwnProperty("type") && (c as any).type === schema.nodes.ordered_list ? 1 : 0), 0); +                let depth = Array.from(path).reduce((p: number, c: any) => p + (c.hasOwnProperty("type") && c.type === schema.nodes.ordered_list ? 1 : 0), 0);                  if (node.type === schema.nodes.ordered_list) depth++;                  tx2.setNodeMarkup(offset, node.type, { mapStyle: style, bulletStyle: depth }, node.marks);              }          }); -    }; +    }      //remove all node typeand apply the passed-in one to the selected text      changeToNodeType = (nodeType: NodeType | undefined, view: EditorView) => {          //remove oldif (nodeType) { //add new | 
