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} /> ); }