aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/collections/collectionSchema/CollectionSchemaView.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views/collections/collectionSchema/CollectionSchemaView.tsx')
-rw-r--r--src/client/views/collections/collectionSchema/CollectionSchemaView.tsx78
1 files changed, 42 insertions, 36 deletions
diff --git a/src/client/views/collections/collectionSchema/CollectionSchemaView.tsx b/src/client/views/collections/collectionSchema/CollectionSchemaView.tsx
index 9ca1644e3..dc0cd8eac 100644
--- a/src/client/views/collections/collectionSchema/CollectionSchemaView.tsx
+++ b/src/client/views/collections/collectionSchema/CollectionSchemaView.tsx
@@ -1,18 +1,15 @@
import React = require('react');
-import { action, computed, observable, ObservableMap, ObservableSet } from 'mobx';
+import { action, computed, observable, ObservableSet } from 'mobx';
import { observer } from 'mobx-react';
import { Doc } from '../../../../fields/Doc';
import { List } from '../../../../fields/List';
import { listSpec } from '../../../../fields/Schema';
import { Cast } from '../../../../fields/Types';
+import { DragManager } from '../../../util/DragManager';
import { CollectionSubView } from '../CollectionSubView';
import './CollectionSchemaView.scss';
import { SchemaColumnHeader } from './SchemaColumnHeader';
import { SchemaRowBox } from './SchemaRowBox';
-import { DragManager } from '../../../util/DragManager';
-import { PresBox } from '../../nodes/trails/PresBox';
-import { UndoManager } from '../../../util/UndoManager';
-import { returnFalse } from '../../../../Utils';
export enum ColumnType {
Number,
@@ -26,9 +23,12 @@ const defaultColumnKeys: string[] = ['title', 'type', 'author', 'text', 'data',
@observer
export class CollectionSchemaView extends CollectionSubView() {
+ private _ref: HTMLDivElement | null = null;
private _lastSelectedRow: number | undefined;
+ private _selectedDocSortedArray: Doc[] = [];
+ private _closestDropIndex: number = 0;
- @observable _rowMenuWidth: number = 60;
+ @observable _rowMenuWidth: number = 100;
@observable _selectedDocs: ObservableSet = new ObservableSet<SchemaRowBox>();
@observable _isDragging: boolean = false;
@@ -53,13 +53,12 @@ export class CollectionSchemaView extends CollectionSubView() {
};
@action
- selectRow = (e: React.PointerEvent, doc: Doc) => {
+ selectRow = (e: React.PointerEvent, doc: Doc, index: number) => {
const ctrl = e.ctrlKey || e.metaKey;
const shift = e.shiftKey;
if (shift && this._lastSelectedRow !== undefined) {
- const currRowIndex = this.childDocs.indexOf(doc);
- const startRow = Math.min(this._lastSelectedRow, currRowIndex);
- const endRow = Math.max(this._lastSelectedRow, currRowIndex);
+ const startRow = Math.min(this._lastSelectedRow, index);
+ const endRow = Math.max(this._lastSelectedRow, index);
for (let i = startRow; i <= endRow; i++) {
const currDoc: Doc = this.childDocs[i];
if (!this._selectedDocs.has(currDoc)) this._selectedDocs.add(currDoc);
@@ -68,14 +67,14 @@ export class CollectionSchemaView extends CollectionSubView() {
} else if (ctrl) {
if (!this._selectedDocs.has(doc)) {
this._selectedDocs.add(doc);
- this._lastSelectedRow = this.childDocs.indexOf(doc);
+ this._lastSelectedRow = index;
} else {
this._selectedDocs.delete(doc);
}
} else {
this._selectedDocs.clear();
this._selectedDocs.add(doc);
- this._lastSelectedRow = this.childDocs.indexOf(doc);
+ this._lastSelectedRow = index;
}
};
@@ -84,17 +83,19 @@ export class CollectionSchemaView extends CollectionSubView() {
return this.childDocs.filter(doc => this._selectedDocs.has(doc));
};
- @action.bound
- moveDocument = (document: Doc | Doc[], targetCollection: Doc | undefined, addDocument: (document: Doc | Doc[]) => boolean) => {
- console.log('hello');
- console.log(targetCollection?.title);
- if (Doc.AreProtosEqual(this.props.Document, targetCollection)) {
- console.log('hi');
- return true;
- }
- const first = document instanceof Doc ? document : document[0];
- if (!first?._stayInCollection && addDocument !== returnFalse) {
- UndoManager.RunInTempBatch(() => this.props.removeDocument?.(document) && addDocument(document));
+ setDropIndex = (index: number) => {
+ this._closestDropIndex = index;
+ };
+
+ @action
+ onInternalDrop = (e: Event, de: DragManager.DropEvent) => {
+ if (super.onInternalDrop(e, de)) {
+ this._isDragging = false;
+ const pushedDocs: Doc[] = this.childDocs.filter((doc: Doc, index: number) => index >= this._closestDropIndex && !this._selectedDocs.has(doc));
+ this.props.removeDocument?.(pushedDocs);
+ this.props.removeDocument?.(this._selectedDocSortedArray);
+ this.addDocument(this._selectedDocSortedArray);
+ this.addDocument(pushedDocs);
return true;
}
return false;
@@ -102,14 +103,18 @@ export class CollectionSchemaView extends CollectionSubView() {
@action
startDrag = (e: React.PointerEvent, doc: Doc) => {
- if (this._selectedDocs.size === 0) this._selectedDocs.add(doc);
+ if (!this._selectedDocs.has(doc)) {
+ this._selectedDocs.clear();
+ this._selectedDocs.add(doc);
+ }
this._isDragging = true;
- const dragData = new DragManager.DocumentDragData(this.sortedSelectedDocs(), 'move');
- dragData.moveDocument = this.moveDocument;
+ this._selectedDocSortedArray = this.sortedSelectedDocs();
+ const dragData = new DragManager.DocumentDragData(this._selectedDocSortedArray, 'move');
+ dragData.moveDocument = this.props.moveDocument;
const dragItem: HTMLElement[] = [];
const dragDiv = document.createElement('div');
dragDiv.className = 'presItem-multiDrag';
- dragDiv.innerText = 'Move ' + this._selectedDocs.size + ' rows';
+ dragDiv.innerText = 'Move ' + this._selectedDocs.size + ' row' + (this._selectedDocs.size > 1 ? 's' : '');
dragDiv.style.position = 'absolute';
dragDiv.style.top = e.clientY + 'px';
dragDiv.style.left = e.clientX - 50 + 'px';
@@ -122,18 +127,18 @@ export class CollectionSchemaView extends CollectionSubView() {
e.clientY,
undefined
);
- this._isDragging = false;
return true;
};
- @action
- endDrag = (e: React.PointerEvent) => {
- // this._isDragging = false;
- };
-
render() {
return (
- <div className="collectionSchemaView">
+ <div
+ className="collectionSchemaView"
+ ref={(ele: HTMLDivElement | null) => {
+ this._ref = ele;
+ this.createDashEventsTarget(ele);
+ }}
+ onPointerDown={() => this._selectedDocs.clear()}>
<div className="schema-table">
<div className="schema-header-row">
{this.columnKeys.map((key, index) => (
@@ -141,20 +146,21 @@ export class CollectionSchemaView extends CollectionSubView() {
))}
</div>
<div className="schema-table-content">
- {this.childDocs.map((doc: Doc) => (
+ {this.childDocs.map((doc: Doc, index: number) => (
<SchemaRowBox
{...this.props}
Document={doc}
ContainingCollectionDoc={this.props.CollectionView?.props.Document}
ContainingCollectionView={this.props.CollectionView}
+ rowIndex={index}
columnKeys={this.columnKeys}
columnWidths={this.columnWidths}
rowMenuWidth={this._rowMenuWidth}
selectedRows={this._selectedDocs}
selectRow={this.selectRow}
startDrag={this.startDrag}
- endDrag={this.endDrag}
dragging={this._isDragging}
+ dropIndex={this.setDropIndex}
/>
))}
</div>