diff options
Diffstat (limited to 'src/client/views/collections/CollectionSchemaMovableTableHOC.tsx')
| -rw-r--r-- | src/client/views/collections/CollectionSchemaMovableTableHOC.tsx | 38 | 
1 files changed, 26 insertions, 12 deletions
| diff --git a/src/client/views/collections/CollectionSchemaMovableTableHOC.tsx b/src/client/views/collections/CollectionSchemaMovableTableHOC.tsx index 7342ede7a..ec40043cc 100644 --- a/src/client/views/collections/CollectionSchemaMovableTableHOC.tsx +++ b/src/client/views/collections/CollectionSchemaMovableTableHOC.tsx @@ -13,6 +13,7 @@ import { faGripVertical, faTrash } from '@fortawesome/free-solid-svg-icons';  import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';  import { DocumentManager } from "../../util/DocumentManager";  import { PastelSchemaPalette, SchemaHeaderField } from "../../../new_fields/SchemaHeaderField"; +import { undoBatch } from "../../util/UndoManager";  library.add(faGripVertical, faTrash); @@ -26,6 +27,9 @@ export interface MovableColumnProps {  export class MovableColumn extends React.Component<MovableColumnProps> {      private _header?: React.RefObject<HTMLDivElement> = React.createRef();      private _colDropDisposer?: DragManager.DragDropDisposer; +    private _startDragPosition: { x: number, y: number } = { x: 0, y: 0 }; +    private _sensitivity: number = 16; +    private _dragRef: React.RefObject<HTMLDivElement> = React.createRef();      onPointerEnter = (e: React.PointerEvent): void => {          if (e.buttons === 1 && SelectionManager.GetIsDragging()) { @@ -36,6 +40,7 @@ export class MovableColumn extends React.Component<MovableColumnProps> {      onPointerLeave = (e: React.PointerEvent): void => {          this._header!.current!.className = "collectionSchema-col-wrapper";          document.removeEventListener("pointermove", this.onDragMove, true); +        document.removeEventListener("pointermove", this.onPointerMove);      }      onDragMove = (e: PointerEvent): void => {          let x = this.props.ScreenToLocalTransform().transformPoint(e.clientX, e.clientY); @@ -68,7 +73,7 @@ export class MovableColumn extends React.Component<MovableColumnProps> {          return false;      } -    setupDrag(ref: React.RefObject<HTMLElement>) { +    onPointerMove = (e: PointerEvent) => {          let onRowMove = (e: PointerEvent) => {              e.stopPropagation();              e.preventDefault(); @@ -76,35 +81,44 @@ export class MovableColumn extends React.Component<MovableColumnProps> {              document.removeEventListener("pointermove", onRowMove);              document.removeEventListener('pointerup', onRowUp);              let dragData = new DragManager.ColumnDragData(this.props.columnValue); -            DragManager.StartColumnDrag(ref.current!, dragData, e.x, e.y); +            DragManager.StartColumnDrag(this._dragRef.current!, dragData, e.x, e.y);          };          let onRowUp = (): void => {              document.removeEventListener("pointermove", onRowMove);              document.removeEventListener('pointerup', onRowUp);          }; -        let onItemDown = (e: React.PointerEvent) => { -            if (e.button === 0) { +        if (e.buttons === 1) { +            let [dx, dy] = this.props.ScreenToLocalTransform().transformDirection(e.clientX - this._startDragPosition.x, e.clientY - this._startDragPosition.y); +            if (Math.abs(dx) + Math.abs(dy) > this._sensitivity) { +                document.removeEventListener("pointermove", this.onPointerMove);                  e.stopPropagation(); +                  document.addEventListener("pointermove", onRowMove);                  document.addEventListener("pointerup", onRowUp);              } -        }; -        return onItemDown; +        }      } -    // onColDrag = (e: React.DragEvent, ref: React.RefObject<HTMLDivElement>) => { -    //     this.setupDrag(reference); -    // } +    onPointerUp = (e: React.PointerEvent) => { +        document.removeEventListener("pointermove", this.onPointerMove); +    } + +    @action +    onPointerDown = (e: React.PointerEvent, ref: React.RefObject<HTMLDivElement>) => { +        this._dragRef = ref; +        let [dx, dy] = this.props.ScreenToLocalTransform().transformDirection(e.clientX, e.clientY); +        this._startDragPosition = { x: dx, y: dy }; +        document.addEventListener("pointermove", this.onPointerMove); +    }      render() {          let reference = React.createRef<HTMLDivElement>(); -        let onItemDown = this.setupDrag(reference);          return (              <div className="collectionSchema-col" ref={this.createColDropTarget}>                  <div className="collectionSchema-col-wrapper" ref={this._header} onPointerEnter={this.onPointerEnter} onPointerLeave={this.onPointerLeave}> -                    <div className="col-dragger" ref={reference} onPointerDown={onItemDown} > +                    <div className="col-dragger" ref={reference} onPointerDown={e => this.onPointerDown(e, reference)} onPointerUp={this.onPointerUp}>                          {this.props.columnRenderer}                      </div>                  </div> @@ -183,6 +197,7 @@ export class MovableRow extends React.Component<MovableRowProps> {          ContextMenu.Instance.addItem({ description: description, event: () => this.props.textWrapRow(this.props.rowInfo.original), icon: "file-pdf" });      } +    @undoBatch      @action      move: DragManager.MoveFunction = (doc: Doc, target: Doc, addDoc) => {          let targetView = DocumentManager.Instance.getDocumentView(target); @@ -212,7 +227,6 @@ export class MovableRow extends React.Component<MovableRowProps> {          let className = "collectionSchema-row";          if (this.props.rowFocused) className += " row-focused";          if (this.props.rowWrapped) className += " row-wrapped"; -        // if (!this.props.rowWrapped) className += " row-unwrapped";          return (              <div className={className} ref={this.createRowDropTarget} onContextMenu={this.onRowContextMenu}> | 
