diff --git a/packages/web/src/datagrid/DataGridCore.js b/packages/web/src/datagrid/DataGridCore.js
index ba8b6b155..60a351ee1 100644
--- a/packages/web/src/datagrid/DataGridCore.js
+++ b/packages/web/src/datagrid/DataGridCore.js
@@ -972,7 +972,7 @@ export default function DataGridCore(props) {
viewportRatio={visibleRowCountUpperBound / grider.rowCount}
/>
{allRowCount && {rowCountInfo}}
- {props.toolbarPortalRef &&
+ {props.toolbarPortalRef && props.toolbarPortalRef.current &&
tabVisible &&
ReactDOM.createPortal(
{
+ if (event.keyCode == keycodes.enter) {
+ onEnter(editorRef.current.value);
+ editorRef.current.value = '';
+ if (blurOnEnter) editorRef.current.blur();
+ }
+ if (event.keyCode == keycodes.escape) {
+ editorRef.current.value = '';
+ editorRef.current.blur();
+ }
+ };
+ const handleBlur = () => {
+ if (editorRef.current.value) {
+ onEnter(editorRef.current.value);
+ editorRef.current.value = '';
+ }
+ if (onBlur) onBlur();
+ };
+ React.useEffect(() => {
+ if (focusOnCreate) editorRef.current.focus();
+ }, [focusOnCreate]);
+ return ;
+}
+
+function exchange(array, i1, i2) {
+ const i1r = (i1 + array.length) % array.length;
+ const i2r = (i2 + array.length) % array.length;
+ const res = [...array];
+ [res[i1r], res[i2r]] = [res[i2r], res[i1r]];
+ return res;
+}
+
+function ColumnManagerRow({ column, onEdit, onRemove, onUp, onDown }) {
+ const [isHover, setIsHover] = React.useState(false);
+ return (
+ setIsHover(true)} onMouseLeave={() => setIsHover(false)}>
+ {column.columnName}
+
+
+
+
+
+
+
+ );
+}
+
+function dispatchChangeColumns(props, func) {
+ const { modelState, dispatchModel } = props;
+ const model = modelState.value;
+
+ dispatchModel({
+ type: 'set',
+ value: {
+ ...model,
+ structure: {
+ ...model.structure,
+ columns: func(model.structure.columns),
+ },
+ },
+ });
+}
+
+export default function FreeTableColumnEditor(props) {
+ const { modelState, dispatchModel } = props;
+ const [editingColumn, setEditingColumn] = React.useState(null);
+ const model = modelState.value;
+ return (
+ <>
+ Columns
+
+ {model.structure.columns.map((column, index) =>
+ index == editingColumn ? (
+ {
+ dispatchChangeColumns(props, (cols) => cols.map((col, i) => (index == i ? { columnName } : col)));
+ }}
+ onBlur={() => setEditingColumn(null)}
+ focusOnCreate
+ blurOnEnter
+ />
+ ) : (
+ setEditingColumn(index)}
+ onRemove={() => {
+ dispatchChangeColumns(props, (cols) => cols.filter((c, i) => i != index));
+ }}
+ onUp={() => {
+ dispatchChangeColumns(props, (cols) => exchange(cols, index, index - 1));
+ }}
+ onDown={() => {
+ dispatchChangeColumns(props, (cols) => exchange(cols, index, index + 1));
+ }}
+ />
+ )
+ )}
+ {
+ dispatchChangeColumns(props, (cols) => [...cols, { columnName }]);
+ }}
+ placeholder="New column"
+ />
+
+ >
+ );
+}
diff --git a/packages/web/src/freetable/FreeTableGrid.js b/packages/web/src/freetable/FreeTableGrid.js
index 8d060eb5f..549ae2d86 100644
--- a/packages/web/src/freetable/FreeTableGrid.js
+++ b/packages/web/src/freetable/FreeTableGrid.js
@@ -3,6 +3,7 @@ import styled from 'styled-components';
import { ManagerMainContainer, ManagerOuterContainerFull } from '../datagrid/ManagerStyles';
import { HorizontalSplitter } from '../widgets/Splitter';
+import FreeTableColumnEditor from './FreeTableColumnEditor';
import FreeTableGridCore from './FreeTableGridCore';
const LeftContainer = styled.div`
@@ -23,8 +24,7 @@ export default function FreeTableGrid(props) {
- COLUMNS
- {/* */}
+
diff --git a/packages/web/src/freetable/FreeTableGrider.ts b/packages/web/src/freetable/FreeTableGrider.ts
index 283c7c0a1..2a1cd5fa8 100644
--- a/packages/web/src/freetable/FreeTableGrider.ts
+++ b/packages/web/src/freetable/FreeTableGrider.ts
@@ -22,4 +22,16 @@ export default class FreeTableGrider extends Grider {
static factoryDeps({ modelState, dispatchModel }) {
return [modelState, dispatchModel];
}
+ undo() {
+ this.dispatchModel({ type: 'undo' });
+ }
+ redo() {
+ this.dispatchModel({ type: 'redo' });
+ }
+ get canUndo() {
+ return this.modelState.canUndo;
+ }
+ get canRedo() {
+ return this.modelState.canRedo;
+ }
}
diff --git a/packages/web/src/tabs/FreeTableTab.js b/packages/web/src/tabs/FreeTableTab.js
index f90400398..070ab1da6 100644
--- a/packages/web/src/tabs/FreeTableTab.js
+++ b/packages/web/src/tabs/FreeTableTab.js
@@ -19,7 +19,7 @@ export default function FreeDataTab({ conid, database, schemaName, pureName, tab
modelState={modelState}
dispatchModel={dispatchModel}
tabVisible={tabVisible}
- // toolbarPortalRef={toolbarPortalRef}
+ toolbarPortalRef={toolbarPortalRef}
/>
);
}