diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/DataGridTable.tsx b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/DataGridTable.tsx index 948d7f18b0..668072587e 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/DataGridTable.tsx +++ b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/DataGridTable.tsx @@ -98,9 +98,15 @@ export const DataGridTable: React.FC = observer(function DataGridTable({ return; } + const idx = tableData.getColumnIndexFromKey(data.column); + + if (idx === null) { + return; + } + editingContext.closeEditor({ rowIdx: data.row, - idx: tableData.getColumnIndexFromKey(data.column), + idx, }); } @@ -110,6 +116,18 @@ export const DataGridTable: React.FC = observer(function DataGridTable({ }, [model.source, resultIndex]); const handleFocusChange = (position: Position) => { + const key = tableData.getColumnKeyFromColumnIndex(position.idx); + const column = tableData.getColumnInfo(key); + + if (column) { + selectionAction.focus({ + row: position.rowIdx, + column: key, + }); + } else { + selectionAction.focus(null); + } + if (!editingContext.isEditing(position)) { editingContext.close(); } 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 dbd380098c..f530280e70 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/TableDataContext.ts +++ b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/TableDataContext.ts @@ -19,7 +19,7 @@ export interface ITableData { getCellValue: (rowIndex: number, key: string | number) => any; getColumnInfo: (key: string | number) => SqlResultColumn | undefined; getColumnsInRange: (startIndex: number, endIndex: number) => Array>; - getColumnIndexFromKey: (columnKey: string | number) => number; + getColumnIndexFromKey: (columnKey: string | number) => number | null; isIndexColumn: (columnKey: string | number) => boolean; isIndexColumnInRange: (columnsRange: Array>) => boolean; getColumnKeyFromColumnIndex: (columnIndex: number) => number; 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 659c49cc63..ed9e03d5d9 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/useTableData.ts +++ b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/useTableData.ts @@ -87,7 +87,8 @@ export function useTableData(modelResultData: IDatabaseResultSet | null): ITable return props.modelResultData?.data?.columns?.[Number(key)]; }, getColumnIndexFromKey(key: string | number) { - return this.columns.findIndex((column: any) => column.key === String(key)); + const index = this.columns.findIndex((column: any) => column.key === String(key)); + return index === -1 ? null : index; }, getColumnsInRange(startIndex: number, endIndex: number) { if (startIndex === endIndex) { diff --git a/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/IDatabaseDataSelectAction.ts b/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/IDatabaseDataSelectAction.ts index 130f8fa9d4..5bad50a1a8 100644 --- a/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/IDatabaseDataSelectAction.ts +++ b/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/IDatabaseDataSelectAction.ts @@ -26,8 +26,10 @@ export interface IDatabaseDataSelectAction>; isSelected: () => boolean; isElementSelected: (key: TKey) => boolean; + getFocusedElement: () => TKey | null; getSelectedElements: () => TKey[]; getRowSelection: (row: number) => number[]; set: (key: TKey, selected: boolean) => void; + focus: (key: TKey | null) => void; clear: () => void; } diff --git a/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/ResultSetSelectAction.ts b/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/ResultSetSelectAction.ts index 87a44bef90..71493a7d39 100644 --- a/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/ResultSetSelectAction.ts +++ b/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/ResultSetSelectAction.ts @@ -29,13 +29,17 @@ export class ResultSetSelectAction implements IDatabaseDataSelectAction>; readonly selectedElements: Map; + private focusedElement: IResultSetSelectKey | null; + constructor(result: IDatabaseResultSet) { this.result = result; this.actions = new Executor(); this.selectedElements = new Map(); + this.focusedElement = null; - makeObservable(this, { + makeObservable(this, { selectedElements: observable, + focusedElement: observable, }); } @@ -72,6 +76,10 @@ export class ResultSetSelectAction implements IDatabaseDataSelectAction> { const selectedKeys: Array> = []; @@ -137,6 +145,10 @@ export class ResultSetSelectAction implements IDatabaseDataSelectAction