aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/views/collections/CollectionSchemaCells.tsx12
-rw-r--r--src/client/views/collections/CollectionSchemaHeaders.tsx3
-rw-r--r--src/client/views/collections/CollectionSchemaMovableTableHOC.tsx261
-rw-r--r--src/client/views/collections/CollectionSchemaView.scss82
-rw-r--r--src/client/views/collections/CollectionSchemaView.tsx183
5 files changed, 476 insertions, 65 deletions
diff --git a/src/client/views/collections/CollectionSchemaCells.tsx b/src/client/views/collections/CollectionSchemaCells.tsx
index 1bb661f88..51e9016b7 100644
--- a/src/client/views/collections/CollectionSchemaCells.tsx
+++ b/src/client/views/collections/CollectionSchemaCells.tsx
@@ -109,8 +109,8 @@ export class CollectionSchemaCell extends React.Component<CellProps> {
};
let reference = React.createRef<HTMLDivElement>();
let onItemDown = (e: React.PointerEvent) => {
- // (!this.props.CollectionView.props.isSelected() ? undefined :
- // SetupDrag(reference, () => props.Document, this.props.moveDocument, this.props.Document.schemaDoc ? "copy" : undefined)(e));
+ (!this.props.CollectionView.props.isSelected() ? undefined :
+ SetupDrag(reference, () => props.Document, this.props.moveDocument, this.props.Document.schemaDoc ? "copy" : undefined)(e));
};
let field = props.Document[props.fieldKey];
@@ -201,8 +201,8 @@ export class CollectionSchemaCheckboxCell extends CollectionSchemaCell {
render() {
let reference = React.createRef<HTMLDivElement>();
let onItemDown = (e: React.PointerEvent) => {
- // (!this.props.CollectionView.props.isSelected() ? undefined :
- // SetupDrag(reference, () => props.Document, this.props.moveDocument, this.props.Document.schemaDoc ? "copy" : undefined)(e));
+ (!this.props.CollectionView.props.isSelected() ? undefined :
+ SetupDrag(reference, () => this._document, this.props.moveDocument, this.props.Document.schemaDoc ? "copy" : undefined)(e));
};
return (
<div className="collectionSchemaView-cellWrapper" ref={this._focusRef} tabIndex={-1} onPointerDown={this.onPointerDown}>
@@ -219,8 +219,8 @@ export class CollectionSchemaDocCell extends CollectionSchemaCell {
render() {
let reference = React.createRef<HTMLDivElement>();
let onItemDown = (e: React.PointerEvent) => {
- // (!this.props.CollectionView.props.isSelected() ? undefined :
- // SetupDrag(reference, () => props.Document, this.props.moveDocument, this.props.Document.schemaDoc ? "copy" : undefined)(e));
+ (!this.props.CollectionView.props.isSelected() ? undefined :
+ SetupDrag(reference, () => this._document, this.props.moveDocument, this.props.Document.schemaDoc ? "copy" : undefined)(e));
};
return (
<div className="collectionSchemaView-cellWrapper" ref={this._focusRef} tabIndex={-1} onPointerDown={this.onPointerDown}>
diff --git a/src/client/views/collections/CollectionSchemaHeaders.tsx b/src/client/views/collections/CollectionSchemaHeaders.tsx
index d6ebaf8d8..c81cf1aef 100644
--- a/src/client/views/collections/CollectionSchemaHeaders.tsx
+++ b/src/client/views/collections/CollectionSchemaHeaders.tsx
@@ -177,7 +177,10 @@ export class CollectionSchemaColumnMenu extends React.Component<ColumnMenuProps>
return (
<div className="collectionSchema-header-menu">
<Flyout anchorPoint={anchorPoints.TOP_CENTER} content={this.renderContent()}>
+ {/* <div onClick={this.toggleIsOpen}> */}
<div className="collectionSchema-header-toggler" onClick={() => { this.props.setIsEditing(true); }}>{this.props.menuButtonContent}</div>
+ {/* {this._isOpen ? this.renderContent() : <></>} */}
+ {/* </div> */}
</ Flyout >
</div>
);
diff --git a/src/client/views/collections/CollectionSchemaMovableTableHOC.tsx b/src/client/views/collections/CollectionSchemaMovableTableHOC.tsx
new file mode 100644
index 000000000..44a134d31
--- /dev/null
+++ b/src/client/views/collections/CollectionSchemaMovableTableHOC.tsx
@@ -0,0 +1,261 @@
+import React = require("react");
+import { TableProps, ReactTableDefaults, Column, TableCellRenderer, ComponentPropsGetterR, ComponentPropsGetter0 } from "react-table";
+import { ComponentType, ComponentClass } from 'react';
+import { action } from "mobx";
+import "./CollectionSchemaView.scss";
+import { library } from '@fortawesome/fontawesome-svg-core';
+import { faBars } from '@fortawesome/free-solid-svg-icons';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { Transform } from "../../util/Transform";
+import { Doc } from "../../../new_fields/Doc";
+import { DragManager, SetupDrag } from "../../util/DragManager";
+import { SelectionManager } from "../../util/SelectionManager";
+import { Cast, FieldValue } from "../../../new_fields/Types";
+
+library.add(faBars);
+
+// export interface MovableSchemaProps {
+// ScreenToLocalTransform: () => Transform;
+// addDoc: (doc: Doc, relativeTo?: Doc, before?: boolean) => boolean;
+// moveDoc: DragManager.MoveFunction;
+// columnsValues: string[];
+// columnsList: Column<any>[];
+// setColumnsOrder: (columns: string[]) => void;
+// numImmovableColumns?: number;
+// }
+
+// export default function CollectionSchemaMovableHOC<Props extends Partial<TableProps>>(WrappedComponent: ComponentType<Props>): ComponentClass<Props & MovableSchemaProps> {
+// return class CollectionSchemaMovableSchemaHOC extends React.Component<Props & MovableSchemaProps> {
+// constructor(props: any) {
+// super(props);
+// }
+
+// reorderColumns(toMove: string, relativeTo: string, before: boolean, columnsValues: string[], setColumnsOrder: (columns: string[]) => void) {
+// let columns = [...columnsValues];
+// let oldIndex = columns.indexOf(toMove);
+// let relIndex = columns.indexOf(relativeTo);
+// let newIndex = (oldIndex > relIndex && !before) ? relIndex + 1 : (oldIndex < relIndex && before) ? relIndex - 1 : relIndex;
+
+// if (oldIndex === newIndex) return;
+
+// columns.splice(newIndex, 0, columns.splice(oldIndex, 1)[0]);
+// setColumnsOrder(columns);
+// }
+
+// createColumns(columnsValues: string[], columnsList: Column<any>[], setColumnsOrder: (columnsValues: string[]) => void, ScreenToLocalTransform: () => Transform): Column<any>[] {
+// let immovableIndex = this.props.numImmovableColumns ? columnsList.length - this.props.numImmovableColumns! : columnsList.length;
+// return columnsList.map((col, index) => {
+// if (index >= immovableIndex) {
+// return col;
+// } else {
+// return ({ ...col, Header: MovableColumn(col.Header, columnsValues[index], columnsValues, setColumnsOrder, this.reorderColumns, ScreenToLocalTransform) });
+// }
+// });
+// }
+
+// render() {
+// console.log("THIS IS THE RIGHT HOC");
+// const { ScreenToLocalTransform, addDoc, moveDoc, columnsValues, columnsList, setColumnsOrder, getTrProps, ...props } = this.props;
+// return (
+// <WrappedComponent {...props as Props} ></WrappedComponent>
+// );
+// }
+
+// };
+// }
+// //TrComponent={MovableRow(ScreenToLocalTransform, addDoc, moveDoc)}
+// //columns={this.createColumns(columnsValues, columnsList, setColumnsOrder, ScreenToLocalTransform)}
+
+// export function MovableSchemaHOC<Props extends Partial<TableProps>>(WrappedComponent: ComponentType<Props>): ComponentClass<Props & MovableSchemaProps> {
+// return class MovableSchemaHOC extends React.Component<Props & MovableSchemaProps> {
+// constructor(props: any) {
+// super(props);
+// }
+
+// createColumns(columnsValues: string[], columnsList: Column<any>[], setColumnsOrder: (columnsValues: string[]) => void, ScreenToLocalTransform: () => Transform): Column<any>[] {
+// let immovableIndex = this.props.numImmovableColumns ? columnsList.length - this.props.numImmovableColumns! : columnsList.length;
+// return columnsList.map((col, index) => {
+// if (index >= immovableIndex) {
+// return col;
+// } else {
+// return ({ ...col, Header: MovableColumn(col.Header, columnsValues[index], columnsValues, setColumnsOrder, this.reorderColumns, ScreenToLocalTransform) });
+// }
+// });
+// }
+
+// reorderColumns(toMove: string, relativeTo: string, before: boolean, columnsValues: string[], setColumnsOrder: (columns: string[]) => void) {
+// let columns = [...columnsValues];
+// let oldIndex = columns.indexOf(toMove);
+// let relIndex = columns.indexOf(relativeTo);
+// let newIndex = (oldIndex > relIndex && !before) ? relIndex + 1 : (oldIndex < relIndex && before) ? relIndex - 1 : relIndex;
+
+// if (oldIndex === newIndex) return;
+
+// columns.splice(newIndex, 0, columns.splice(oldIndex, 1)[0]);
+// setColumnsOrder(columns);
+// }
+
+// render() {
+// const { ScreenToLocalTransform, addDoc, moveDoc, columnsValues, columnsList, setColumnsOrder, getTrProps, ...props } = this.props;
+// return (
+// <WrappedComponent {...props as Props} columns={this.createColumns(columnsValues, columnsList, setColumnsOrder, ScreenToLocalTransform)} TrComponent={MovableRow(ScreenToLocalTransform, addDoc, moveDoc)} ></WrappedComponent>
+// );
+// }
+// };
+// }
+
+
+
+
+export interface MovableColumnProps {
+ columnRenderer: TableCellRenderer;
+ columnValue: string;
+ allColumns: string[];
+ reorderColumns: (toMove: string, relativeTo: string, before: boolean, columns: string[]) => void;
+ ScreenToLocalTransform: () => Transform;
+}
+export class MovableColumn extends React.Component<MovableColumnProps> {
+ // private _ref: React.RefObject<HTMLDivElement> = React.createRef();
+
+ onDragStart = (e: React.DragEvent<HTMLDivElement>, ref: React.RefObject<HTMLDivElement>): void => {
+ console.log("drag start");
+ e.dataTransfer.setData("column", this.props.columnValue);
+ }
+
+ onDragOver = (e: React.DragEvent<HTMLDivElement>,ref: React.RefObject<HTMLDivElement>): void => {
+ console.log("drag over");
+ let x = this.props.ScreenToLocalTransform().transformPoint(e.clientX, e.clientY);
+ let rect = ref.current!.getBoundingClientRect();
+ let bounds = this.props.ScreenToLocalTransform().transformPoint(rect.left + ((rect.right - rect.left) / 2), rect.top);
+ let before = x[0] < bounds[0];
+
+ ref.current!.className = "collectionSchema-column-header";
+ if (before) ref.current!.className += " col-before";
+ if (!before) ref.current!.className += " col-after";
+ // e.stopPropagation();
+ }
+
+ onDragLeave = (e: React.DragEvent<HTMLDivElement>, ref: React.RefObject<HTMLDivElement>): void => {
+ console.log("drag leave");
+ ref.current!.className = "collectionSchema-column-header";
+ e.stopPropagation();
+ }
+
+ onDrop = (e: React.DragEvent<HTMLDivElement>,ref: React.RefObject<HTMLDivElement>): void => {
+ console.log("on drop");
+ // TODO: get column being dropped and before/after
+ let x = this.props.ScreenToLocalTransform().transformPoint(e.clientX, e.clientY);
+ let rect = ref.current!.getBoundingClientRect();
+ let bounds = this.props.ScreenToLocalTransform().transformPoint(rect.left + ((rect.right - rect.left) / 2), rect.top);
+ let before = x[0] < bounds[0];
+
+ this.props.reorderColumns(e.dataTransfer.getData("column"), this.props.columnValue, before, this.props.allColumns);
+ ref.current!.className = "collectionSchema-column-header";
+ }
+
+ render() {
+ let ref: React.RefObject<HTMLDivElement> = React.createRef();
+ return (
+ <div className="collectionSchema-column-header" ref={ref} draggable={true}
+ onPointerDown={() => console.log("pointer down")} onPointerEnter={() => console.log("pointer enter")} onPointerOut={() => console.log("pointer exit")}
+ onDragStart={e => this.onDragStart(e, ref)} onDragOver={e => this.onDragOver(e, ref)} onDragLeave={e => this.onDragLeave(e, ref)} onDrop={e => this.onDrop(e, ref)}>
+ {this.props.columnRenderer}
+ </div>
+ );
+ }
+}
+
+// export function MovableColumn(columnRenderer: TableCellRenderer, columnValue: string, allColumns: string[],
+// reorderColumns: (toMove: string, relativeTo: string, before: boolean, columns: string[]) => void,
+// ScreenToLocalTransform: () => Transform) {
+// return ;
+// }
+
+export function MovableRow(ScreenToLocalTransform: () => Transform, addDoc: (doc: Doc, relativeTo?: Doc, before?: boolean) => boolean, moveDoc: DragManager.MoveFunction) {
+ return class MovableRow extends React.Component {
+ private _header?: React.RefObject<HTMLDivElement> = React.createRef();
+ private _treedropDisposer?: DragManager.DragDropDisposer;
+
+ onPointerEnter = (e: React.PointerEvent): void => {
+ if (e.buttons === 1 && SelectionManager.GetIsDragging()) {
+ this._header!.current!.className = "collectionSchema-row-wrapper";
+ document.addEventListener("pointermove", this.onDragMove, true);
+ }
+ }
+ onPointerLeave = (e: React.PointerEvent): void => {
+ this._header!.current!.className = "collectionSchema-row-wrapper";
+ document.removeEventListener("pointermove", this.onDragMove, true);
+ }
+ onDragMove = (e: PointerEvent): void => {
+ let x = ScreenToLocalTransform().transformPoint(e.clientX, e.clientY);
+ let rect = this._header!.current!.getBoundingClientRect();
+ let bounds = ScreenToLocalTransform().transformPoint(rect.left, rect.top + rect.height / 2);
+ let before = x[1] < bounds[1];
+ this._header!.current!.className = "collectionSchema-row-wrapper";
+ if (before) this._header!.current!.className += " row-above";
+ if (!before) this._header!.current!.className += " row-below";
+ e.stopPropagation();
+ }
+
+ createTreeDropTarget = (ele: HTMLDivElement) => {
+ this._treedropDisposer && this._treedropDisposer();
+ if (ele) {
+ this._treedropDisposer = DragManager.MakeDropTarget(ele, { handlers: { drop: this.treeDrop.bind(this) } });
+ }
+ }
+
+ treeDrop = (e: Event, de: DragManager.DropEvent) => {
+ const { children = null, rowInfo } = this.props;
+ if (!rowInfo) return false;
+
+ const { original } = rowInfo;
+ const rowDoc = FieldValue(Cast(original, Doc));
+ if (!rowDoc) return false;
+
+ let x = ScreenToLocalTransform().transformPoint(de.x, de.y);
+ let rect = this._header!.current!.getBoundingClientRect();
+ let bounds = ScreenToLocalTransform().transformPoint(rect.left, rect.top + rect.height / 2);
+ let before = x[1] < bounds[1];
+ if (de.data instanceof DragManager.DocumentDragData) {
+ e.stopPropagation();
+ if (de.data.draggedDocuments[0] === rowDoc) return true;
+ let addDocument = (doc: Doc) => addDoc(doc, rowDoc, before);
+ let movedDocs = de.data.draggedDocuments; //(de.data.options === this.props.treeViewId ? de.data.draggedDocuments : de.data.droppedDocuments);
+ return (de.data.dropAction || de.data.userDropAction) ?
+ de.data.droppedDocuments.reduce((added: boolean, d) => addDoc(d, rowDoc, before) || added, false)
+ : (de.data.moveDocument) ?
+ movedDocs.reduce((added: boolean, d) => de.data.moveDocument(d, rowDoc, addDocument) || added, false)
+ : de.data.droppedDocuments.reduce((added: boolean, d) => addDoc(d, rowDoc, before), false);
+ }
+ return false;
+ }
+
+ render() {
+ const { children = null, rowInfo } = this.props;
+ if (!rowInfo) {
+ console.log("no rowinfo");
+ return <ReactTableDefaults.TrComponent>{children}</ReactTableDefaults.TrComponent>;
+ }
+
+ const { original } = rowInfo;
+ const doc = FieldValue(Cast(original, Doc));
+ if (!doc) return <></>;
+
+ let reference = React.createRef<HTMLDivElement>();
+ let onItemDown = SetupDrag(reference, () => doc, moveDoc);
+
+ return (
+ <div className="collectionSchema-row" ref={this.createTreeDropTarget}>
+ <div className="collectionSchema-row-wrapper" ref={this._header} onPointerEnter={this.onPointerEnter} onPointerLeave={this.onPointerLeave}>
+ <div className="row-dragger" ref={reference} onPointerDown={onItemDown}>
+ <ReactTableDefaults.TrComponent>
+ {children}
+ </ReactTableDefaults.TrComponent>
+ </div>
+ </div>
+ </div>
+ );
+ }
+ };
+}
+
diff --git a/src/client/views/collections/CollectionSchemaView.scss b/src/client/views/collections/CollectionSchemaView.scss
index 4bc7a778c..fce1c8833 100644
--- a/src/client/views/collections/CollectionSchemaView.scss
+++ b/src/client/views/collections/CollectionSchemaView.scss
@@ -105,6 +105,14 @@
direction: ltr;
max-height: $MAX_ROW_HEIGHT;
+ &:nth-child(even) {
+ background-color: $light-color;
+ }
+
+ &:nth-child(odd) {
+ background-color: $light-color-secondary;
+ }
+
&:last-child {
border-bottom: $intermediate-color;
border-bottom-style: solid;
@@ -112,6 +120,10 @@
}
}
+ .rt-tr {
+ width: 100%;
+ }
+
.rt-td {
border-width: 1px;
border-right-color: $intermediate-color;
@@ -149,6 +161,18 @@
background: $light-color;
}
+.collectionSchema-column-header {
+ height: 100%;
+ background-color: green;
+
+ &.col-before {
+ border-left: 2px solid red;
+ }
+ &.col-after {
+ border-right: 2px solid red;
+ }
+}
+
.collectionSchemaView-header {
height: 100%;
@@ -168,16 +192,8 @@
}
.collectionSchema-header-menuOptions {
- // position: absolute;
- // top: 30px;
- // left: 50%;
- // transform: translateX(-50%);
- // z-index: 9999;
- // background-color: $light-color-secondary;
color: black;
- // border: 1px solid $main-accent;
width: 175px;
- // padding: 10px;
text-align: left;
.collectionSchema-headerMenu-group {
@@ -235,15 +251,51 @@
}
}
-#preview-schema-checkbox-div {
- margin-left: 20px;
- font-size: 12px;
+.collectionSchema-row {
+ height: $MAX_ROW_HEIGHT;
+ // display: flex;
+
+ .row-dragger {
+ height: $MAX_ROW_HEIGHT;
+ }
+
+ .collectionSchema-row-wrapper {
+ max-height: $MAX_ROW_HEIGHT;
+ // width: 100%;
+ // border: 1px solid lightgray;
+
+ &.row-above {
+ border-top: 1px solid red;
+ }
+ &.row-below {
+ border-bottom: 1px solid red;
+ }
+ &.row-inside {
+ border: 1px solid red;
+ }
+ }
}
-.-even {
- background: $light-color !important;
+
+.collectionSchemaView-cellWrapper {
+ // height: $MAX_ROW_HEIGHT;
+ // background-color: red;
+ height: 100%;
+ padding: 4px;
+
+ &.focused {
+ // background-color: yellowgreen;
+ border: 2px solid yellowgreen;
+
+ input {
+ outline: 0;
+ border: none;
+ background-color: yellow;
+ }
+ }
}
-.-odd {
- background: $light-color-secondary !important;
+#preview-schema-checkbox-div {
+ margin-left: 20px;
+ font-size: 12px;
} \ No newline at end of file
diff --git a/src/client/views/collections/CollectionSchemaView.tsx b/src/client/views/collections/CollectionSchemaView.tsx
index 3ef58bcaf..4746e637b 100644
--- a/src/client/views/collections/CollectionSchemaView.tsx
+++ b/src/client/views/collections/CollectionSchemaView.tsx
@@ -4,7 +4,7 @@ import { faCog, faPlus } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { action, computed, observable, trace, untracked } from "mobx";
import { observer } from "mobx-react";
-import ReactTable, { CellInfo, ComponentPropsGetterR, ReactTableDefaults, TableCellRenderer } from "react-table";
+import ReactTable, { CellInfo, ComponentPropsGetterR, ReactTableDefaults, TableCellRenderer, Column } from "react-table";
import "react-table/react-table.css";
import { emptyFunction, returnFalse, returnZero, returnOne } from "../../../Utils";
import { Doc, DocListCast, DocListCastAsync, Field, FieldResult } from "../../../new_fields/Doc";
@@ -33,12 +33,14 @@ import { undoBatch } from "../../util/UndoManager";
import { timesSeries } from "async";
import { CollectionSchemaHeader, CollectionSchemaAddColumnHeader } from "./CollectionSchemaHeaders";
import { CellProps, CollectionSchemaCell, CollectionSchemaNumberCell, CollectionSchemaStringCell, CollectionSchemaBooleanCell, CollectionSchemaCheckboxCell } from "./CollectionSchemaCells";
-
+import { MovableColumn, MovableRow } from "./CollectionSchemaMovableTableHOC";
library.add(faCog);
library.add(faPlus);
// bcz: need to add drag and drop of rows and columns. This seems like it might work for rows: https://codesandbox.io/s/l94mn1q657
+// const MovableTable = CollectionSchemaMovableSchemaHOC(ReactTable);
+
export enum ColumnType {
Any,
Number,
@@ -54,22 +56,6 @@ const columnTypes: Map<string, ColumnType> = new Map([
["page", ColumnType.Number], ["curPage", ColumnType.Number], ["libraryBrush", ColumnType.Boolean], ["zIndex", ColumnType.Number]
]);
-// @observer
-// class KeyToggle extends React.Component<{ keyName: string, checked: boolean, toggle: (key: string) => void }> {
-// constructor(props: any) {
-// super(props);
-// }
-
-// render() {
-// return (
-// <div key={this.props.keyName}>
-// <input type="checkbox" checked={this.props.checked} onChange={() => this.props.toggle(this.props.keyName)} />
-// {this.props.keyName}
-// </div>
-// );
-// }
-// }
-
@observer
export class CollectionSchemaView extends CollectionSubView(doc => doc) {
private _mainCont?: HTMLDivElement;
@@ -83,6 +69,8 @@ export class CollectionSchemaView extends CollectionSubView(doc => doc) {
@observable _newKeyName: string = "";
@observable previewScript: string = "";
@observable _headerIsEditing: boolean = false;
+ @observable _cellIsEditing: boolean = false;
+ @observable _focusedCell: {row: number, col: number} = {row: 0, col: 0};
@computed get previewWidth() { return () => NumCast(this.props.Document.schemaPreviewWidth); }
@computed get previewHeight() { return () => this.props.PanelHeight() - 2 * this.borderWidth; }
@@ -90,10 +78,25 @@ export class CollectionSchemaView extends CollectionSubView(doc => doc) {
@computed get columns() { return Cast(this.props.Document.schemaColumns, listSpec("string"), []); }
set columns(columns: string[]) { this.props.Document.schemaColumns = new List<string>(columns); }
@computed get borderWidth() { return Number(COLLECTION_BORDER_WIDTH); }
- @computed get tableColumns() {
+ @computed get tableColumns(): Column<Doc>[] {
let possibleKeys = this.documentKeys.filter(key => this.columns.findIndex(existingKey => existingKey.toUpperCase() === key.toUpperCase()) === -1);
let cols = this.columns.map(col => {
+ let focusedRow = this._focusedCell.row;
+ let focusedCol = this._focusedCell.col;
+ let isEditable = !this._headerIsEditing;
+ let header = <CollectionSchemaHeader
+ keyValue={col}
+ possibleKeys={possibleKeys}
+ existingKeys={this.columns}
+ keyType={this.getColumnType(col)}
+ typeConst={columnTypes.get(col) !== undefined}
+ onSelect={this.changeColumns}
+ setIsEditing={this.setHeaderIsEditing}
+ deleteColumn={this.deleteColumn}
+ setColumnType={this.setColumnType}
+ />;
+
return {
Header: <CollectionSchemaHeader
keyValue={col}
@@ -106,37 +109,37 @@ export class CollectionSchemaView extends CollectionSubView(doc => doc) {
deleteColumn={this.deleteColumn}
setColumnType={this.setColumnType}
/>,
+ // Header: <MovableColumn columnRenderer={header} columnValue={col} allColumns={this.columns} reorderColumns={this.reorderColumns} ScreenToLocalTransform={this.props.ScreenToLocalTransform} />,
accessor: (doc: Doc) => doc ? doc[col] : 0,
id: col,
Cell: (rowProps: CellInfo) => {
let row = rowProps.index;
let column = this.columns.indexOf(rowProps.column.id!);
- // let isFocused = focusedRow === row && focusedCol === column;
- let isFocused = false;
+ let isFocused = focusedRow === row && focusedCol === column;
let props: CellProps = {
row: row,
col: column,
rowProps: rowProps,
isFocused: isFocused,
- changeFocusedCellByDirection: action(emptyFunction),//this.changeFocusedCellByDirection,
- changeFocusedCellByIndex: action(emptyFunction), //this.changeFocusedCellByIndex,
+ changeFocusedCellByDirection: this.changeFocusedCellByDirection,
+ changeFocusedCellByIndex: this.changeFocusedCellByIndex,
CollectionView: this.props.CollectionView,
ContainingCollection: this.props.ContainingCollectionView,
Document: this.props.Document,
fieldKey: this.props.fieldKey,
renderDepth: this.props.renderDepth, addDocTab: this.props.addDocTab,
moveDocument: this.props.moveDocument,
- setIsEditing: action(emptyFunction), //this.setCellIsEditing,
- isEditable: true //isEditable
+ setIsEditing: this.setCellIsEditing,
+ isEditable: isEditable
};
let colType = this.getColumnType(col);
- if (colType === ColumnType.Number) return <CollectionSchemaNumberCell {...props}/>
- if (colType === ColumnType.String) return <CollectionSchemaStringCell {...props}/>
- if (colType === ColumnType.Boolean) return <CollectionSchemaBooleanCell {...props} />
- if (colType === ColumnType.Checkbox) return <CollectionSchemaCheckboxCell {...props} />
- return <CollectionSchemaCell {...props}/>
+ if (colType === ColumnType.Number) return <CollectionSchemaNumberCell {...props}/>;
+ if (colType === ColumnType.String) return <CollectionSchemaStringCell {...props}/>;
+ if (colType === ColumnType.Boolean) return <CollectionSchemaBooleanCell {...props} />;
+ if (colType === ColumnType.Checkbox) return <CollectionSchemaCheckboxCell {...props} />;
+ return <CollectionSchemaCell {...props}/>;
}
};
}) as {Header: TableCellRenderer, accessor: (doc: Doc) => FieldResult<Field>, id: string, Cell: (rowProps: CellInfo) => JSX.Element}[];
@@ -156,6 +159,19 @@ export class CollectionSchemaView extends CollectionSubView(doc => doc) {
return cols;
}
+ reorderColumns(toMove: string, relativeTo: string, before: boolean, columnsValues: string[]) {
+ let columns = [...columnsValues];
+ let oldIndex = columns.indexOf(toMove);
+ let relIndex = columns.indexOf(relativeTo);
+ let newIndex = (oldIndex > relIndex && !before) ? relIndex + 1 : (oldIndex < relIndex && before) ? relIndex - 1 : relIndex;
+
+ if (oldIndex === newIndex) return;
+
+ columns.splice(newIndex, 0, columns.splice(oldIndex, 1)[0]);
+ this.columns = columns;
+ }
+
+
onHeaderDrag = (columnName: string) => {
let schemaDoc = Cast(this.props.Document.schemaDoc, Doc);
if (schemaDoc instanceof Doc) {
@@ -170,12 +186,21 @@ export class CollectionSchemaView extends CollectionSubView(doc => doc) {
return this.props.Document;
}
+ componentDidMount() {
+ document.addEventListener("keydown", this.onKeyDown);
+ }
+
+ componentWillUnmount() {
+ document.removeEventListener("keydown", this.onKeyDown);
+ }
+
private getTrProps: ComponentPropsGetterR = (state, rowInfo) => {
const that = this;
if (!rowInfo) {
return {};
}
return {
+ rowInfo,
onClick: action((e: React.MouseEvent, handleOriginal: Function) => {
that.props.select(e.ctrlKey);
that._selectedIndex = rowInfo.index;
@@ -195,27 +220,63 @@ export class CollectionSchemaView extends CollectionSubView(doc => doc) {
this._mainCont = ele;
super.CreateDropTarget(ele);
}
+ @action
+ changeFocusedCellByDirection = (direction: string): void => {
+ switch (direction) {
+ case "tab":
+ if (this._focusedCell.col + 1 === this.columns.length && this._focusedCell.row + 1 === this.childDocs.length) {
+ this._focusedCell = { row: 0, col: 0 };
+ } else if (this._focusedCell.col + 1 === this.columns.length) {
+ this._focusedCell = { row: this._focusedCell.row + 1, col: 0 };
+ } else {
+ this._focusedCell = { row: this._focusedCell.row, col: this._focusedCell.col + 1 };
+ }
+ break;
+ case "right":
+ this._focusedCell = { row: this._focusedCell.row, col: this._focusedCell.col + 1 === this.columns.length ? this._focusedCell.col : this._focusedCell.col + 1 };
+ break;
+ case "left":
+ this._focusedCell = { row: this._focusedCell.row, col: this._focusedCell.col === 0 ? this._focusedCell.col : this._focusedCell.col - 1 };
+ break;
+ case "up":
+ this._focusedCell = { row: this._focusedCell.row === 0 ? this._focusedCell.row : this._focusedCell.row - 1, col: this._focusedCell.col };
+ break;
+ case "down":
+ this._focusedCell = { row: this._focusedCell.row + 1 === this.childDocs.length ? this._focusedCell.row : this._focusedCell.row + 1, col: this._focusedCell.col };
+ break;
+ }
+ }
@action
- setHeaderIsEditing = (isEditing: boolean) => {
- this._headerIsEditing = isEditing;
+ changeFocusedCellByIndex = (row: number, col: number): void => {
+ this._focusedCell = { row: row, col: col };
}
@action
- toggleKey = (key: string) => {
- let list = Cast(this.props.Document.schemaColumns, listSpec("string"));
- if (list === undefined) {
- this.props.Document.schemaColumns = list = new List<string>([key]);
- } else {
- const index = list.indexOf(key);
- if (index === -1) {
- list.push(key);
- } else {
- list.splice(index, 1);
- }
- }
+ setCellIsEditing = (isEditing: boolean): void => {
+ this._cellIsEditing = isEditing;
}
+ @action
+ setHeaderIsEditing = (isEditing: boolean): void => {
+ this._headerIsEditing = isEditing;
+ }
+
+ // @action
+ // toggleKey = (key: string) => {
+ // let list = Cast(this.props.Document.schemaColumns, listSpec("string"));
+ // if (list === undefined) {
+ // this.props.Document.schemaColumns = list = new List<string>([key]);
+ // } else {
+ // const index = list.indexOf(key);
+ // if (index === -1) {
+ // list.push(key);
+ // } else {
+ // list.splice(index, 1);
+ // }
+ // }
+ // }
+
//toggles preview side-panel of schema
@action
toggleExpander = () => {
@@ -262,6 +323,13 @@ export class CollectionSchemaView extends CollectionSubView(doc => doc) {
}
}
+ onKeyDown = (e: KeyboardEvent): void => {
+ if (!this._cellIsEditing && !this._headerIsEditing) {
+ let direction = e.key === "Tab" ? "tab" : e.which === 39 ? "right" : e.which === 37 ? "left" : e.which === 38 ? "up" : e.which === 40 ? "down" : "";
+ this.changeFocusedCellByDirection(direction);
+ }
+ }
+
@action
makeDB = async () => {
let csv: string = this.columns.reduce((val, col) => val + col + ",", "");
@@ -410,7 +478,31 @@ export class CollectionSchemaView extends CollectionSubView(doc => doc) {
@computed
get reactTable() {
+ let addDoc = (doc: Doc, relativeTo?: Doc, before?: boolean) => Doc.AddDocToList(this.props.Document, this.props.fieldKey, doc, relativeTo, before);
+ let moveDoc = (d: Doc, target: Doc, addDoc: (doc: Doc) => boolean) => this.props.moveDocument(d, target, addDoc);
let previewWidth = this.previewWidth() + 2 * this.borderWidth + this.DIVIDER_WIDTH + 1;
+
+ // return <MovableTable
+ // style={{ position: "relative", float: "left", width: `calc(100% - ${previewWidth}px` }}
+ // data={this.childDocs}
+ // page={0}
+ // pageSize={this.childDocs.length}
+ // showPagination={false}
+ // columns={this.tableColumns}
+ // sortable={false}
+ // getTrProps={this.getTrProps}
+
+ // ScreenToLocalTransform={this.props.ScreenToLocalTransform}
+ // addDoc={addDoc}
+ // moveDoc={moveDoc}
+ // columnsValues={this.columns}
+ // columnsList={this.tableColumns}
+ // setColumnsOrder={(columns: string[]) => this.columns = columns}
+ // numImmovableColumns={1}
+ // />;
+
+
+ // // let previewWidth = this.previewWidth() + 2 * this.borderWidth + this.DIVIDER_WIDTH + 1;
return <ReactTable
style={{ position: "relative", float: "left", width: `calc(100% - ${previewWidth}px` }}
data={this.childDocs}
@@ -421,6 +513,8 @@ export class CollectionSchemaView extends CollectionSubView(doc => doc) {
// column={{ ...ReactTableDefaults.column, Cell: this.renderCell, }}
getTrProps={this.getTrProps}
sortable={false}
+
+ TrComponent={MovableRow(this.props.ScreenToLocalTransform, addDoc, moveDoc)}
/>;
}
@@ -472,6 +566,7 @@ export class CollectionSchemaView extends CollectionSubView(doc => doc) {
return (
<div className="collectionSchemaView-container" onPointerDown={this.onPointerDown} onWheel={this.onWheel}
onDrop={(e: React.DragEvent) => this.onDrop(e, {})} onContextMenu={this.onContextMenu} ref={this.createTarget}>
+ <div draggable={true} style={{backgroundColor: "green"}}>TESTER</div>
{this.reactTable}
{this.dividerDragger}
{!this.previewWidth() ? (null) : this.previewPanel}