From a879ddbc111c4486225bbc5a7ca4e1e36c55798d Mon Sep 17 00:00:00 2001 From: Wroud Date: Mon, 23 Aug 2021 23:22:48 +0300 Subject: [PATCH] fix(plugin-data-spreadsheet-new): CB-817 inline editor --- .../src/DataGrid/CellEditor/CellEditor.tsx | 4 +++ .../src/DataGrid/DataGridTable.tsx | 27 +++++++++++++------ .../CellFormatters/TextFormatter.tsx | 2 +- .../src/DataGrid/TableDataContext.ts | 8 ++++++ .../src/DataGrid/useTableData.ts | 26 ++++++++++++++++-- 5 files changed, 56 insertions(+), 11 deletions(-) diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/CellEditor/CellEditor.tsx b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/CellEditor/CellEditor.tsx index 63dc63b1e3..0cf6597af1 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/CellEditor/CellEditor.tsx +++ b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/CellEditor/CellEditor.tsx @@ -55,6 +55,9 @@ export const CellEditor = observer, 'row' | ' const [popperRef, setPopperRef] = useState(null); const popper = usePopper(elementRef, popperRef, { placement: 'right', + modifiers: [ + { name: 'flip', enabled: false }, + ], }); if (!dataGridContext || !tableDataContext || column.columnDataIndex === null) { @@ -132,6 +135,7 @@ export const CellEditor = observer, 'row' | ' > = observer(function DataGridTable({ model, actions, resultIndex, className }) { - const gridContainerRef = useRef(null); - const dataGridRef = useRef(null); + const gridContainerRef = useRef(null); const editorRef = useRef(null); + const dataGridDivRef = useRef(null); + const dataGridRef = useRef(null); const styles = useStyles(reactGridStyles, baseStyles); const [columnResize] = useState(() => new Executor()); const selectionAction = model.source.getAction(resultIndex, ResultSetSelectAction); - const tableData = useTableData(model, resultIndex); + const tableData = useTableData(model, resultIndex, dataGridDivRef); const focusSyncRef = useRef(null); const gridSelectionContext = useGridSelectionContext(tableData, selectionAction); @@ -79,6 +80,18 @@ export const DataGridTable: React.FC { @@ -110,13 +123,11 @@ export const DataGridTable: React.FC = observer(function TextFormatter({ row, rowIdx, column, isCellSelected }) { +export const TextFormatter: React.FC = observer(function TextFormatter({ row, column, isCellSelected }) { const editorRef = useRef(null); const context = useContext(DataGridContext); const editingContext = useContext(EditingContext); diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/TableDataContext.ts b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/TableDataContext.ts index f656b15ab1..349717081a 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/TableDataContext.ts +++ b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/TableDataContext.ts @@ -19,6 +19,12 @@ declare module 'react-data-grid' { } } +interface IColumnMetrics { + width: number; + left: number; + right: number; +} + export interface ITableData { format: ResultSetFormatAction; data: ResultSetDataAction; @@ -27,6 +33,8 @@ export interface ITableData { columns: Array>; columnKeys: IResultSetColumnKey[]; rows: IResultSetRowKey[]; + gridDiv: HTMLDivElement | null; + getMetrics: (columnIndex: number) => IColumnMetrics; getRow: (rowIndex: number) => IResultSetRowKey; getColumn: (columnIndex: number) => Column; getColumnByDataIndex: (key: IResultSetColumnKey) => Column; diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/useTableData.ts b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/useTableData.ts index fb73a019b3..b54fbf560c 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/useTableData.ts +++ b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/useTableData.ts @@ -19,7 +19,7 @@ import { TableIndexColumnHeader } from './TableColumnHeader/TableIndexColumnHead import type { ITableData } from './TableDataContext'; export const indexColumn: Column = { - key: '#', + key: 'index', columnDataIndex: null, name: '#', minWidth: 60, @@ -30,13 +30,20 @@ export const indexColumn: Column = { formatter: IndexFormatter, }; -export function useTableData(model: IDatabaseDataModel, resultIndex: number): ITableData { +export function useTableData( + model: IDatabaseDataModel, + resultIndex: number, + gridDIVElement: React.RefObject +): ITableData { const format = model.source.getAction(resultIndex, ResultSetFormatAction); const data = model.source.getAction(resultIndex, ResultSetDataAction); const editor = model.source.getAction(resultIndex, ResultSetEditAction); const view = model.source.getAction(resultIndex, ResultSetViewAction); return useObservableRef(() => ({ + get gridDiv(): HTMLDivElement | null { + return gridDIVElement.current; + }, get columnKeys(): IResultSetColumnKey[] { return this.view.columnKeys; }, @@ -75,6 +82,21 @@ export function useTableData(model: IDatabaseDataModel, return columns; }, + getMetrics(columnIndex) { + let left = 0; + for (let i = 0; i < columnIndex; i++) { + const column = this.columns[i]; + left += column.width as number; + } + + const column = this.getColumn(columnIndex); + + return { + left, + right: left + (column.width as number), + width: column.width as number, + }; + }, getRow(rowIndex) { return this.rows[rowIndex]; },