diff --git a/packages/web/src/datagrid/DataGridCell.svelte b/packages/web/src/datagrid/DataGridCell.svelte
index d626d489f..a41e0c357 100644
--- a/packages/web/src/datagrid/DataGridCell.svelte
+++ b/packages/web/src/datagrid/DataGridCell.svelte
@@ -32,6 +32,7 @@
export let isInserted = false;
export let isDeleted = false;
export let isAutofillSelected = false;
+ export let isFocusedColumn = false;
$: value = (rowData || {})[col.uniqueName];
@@ -46,6 +47,7 @@
class:isInserted
class:isDeleted
class:isAutofillSelected
+ class:isFocusedColumn
style={`width:${col.width}px; min-width:${col.width}px; max-width:${col.width}px`}
>
{#if value == null}
@@ -107,6 +109,9 @@
outline: 3px solid var(--theme-bg-selected);
outline-offset: -3px;
}
+ td.isFocusedColumn {
+ background: var(--theme-bg-alt);
+ }
td.isModifiedRow {
background: var(--theme-bg-gold);
}
diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte
index 74ae094c3..b2a00757a 100644
--- a/packages/web/src/datagrid/DataGridCore.svelte
+++ b/packages/web/src/datagrid/DataGridCore.svelte
@@ -46,6 +46,7 @@
import ColumnHeaderControl from './ColumnHeaderControl.svelte';
import DataGridRow from './DataGridRow.svelte';
import { getFilterType, getFilterValueExpression } from 'dbgate-filterparser';
+ import { tick } from 'svelte';
import {
cellIsSelected,
countColumnSizes,
@@ -135,6 +136,51 @@
}
}
+ $: {
+ if (display && display.focusedColumn) {
+ const invMap = _.invert(realColumnUniqueNames);
+ const colIndex = invMap[display.focusedColumn];
+ if (colIndex) {
+ scrollIntoView([null, colIndex]);
+ }
+ }
+ }
+
+ function scrollIntoView(cell) {
+ const [row, col] = cell;
+
+ if (row != null) {
+ let newRow = null;
+ const rowCount = grider.rowCount;
+ if (rowCount == 0) return;
+
+ if (row < firstVisibleRowScrollIndex) newRow = row;
+ else if (row + 1 >= firstVisibleRowScrollIndex + visibleRowCountLowerBound)
+ newRow = row - visibleRowCountLowerBound + 2;
+
+ if (newRow < 0) newRow = 0;
+ if (newRow >= rowCount) newRow = rowCount - 1;
+
+ if (newRow != null) {
+ firstVisibleRowScrollIndex = newRow;
+ domVerticalScroll.scroll(newRow);
+ }
+ }
+
+ if (col != null) {
+ if (col >= columnSizes.frozenCount) {
+ let newColumn = columnSizes.scrollInView(
+ firstVisibleColumnScrollIndex,
+ col - columnSizes.frozenCount,
+ gridScrollAreaWidth
+ );
+ firstVisibleColumnScrollIndex = newColumn;
+
+ domHorizontalScroll.scroll(newColumn);
+ }
+ }
+ }
+
function handleGridMouseDown(event) {
if (event.target.closest('.buttonLike')) return;
if (event.target.closest('.resizeHandleControl')) return;
@@ -341,6 +387,7 @@
{autofillSelectedCells}
selectedCells={filterCellsForRow(selectedCells, rowIndex)}
autofillMarkerCell={filterCellForRow(autofillMarkerCell, rowIndex)}
+ focusedColumn={display.focusedColumn}
{frameSelection}
/>
{/each}
diff --git a/packages/web/src/datagrid/DataGridRow.svelte b/packages/web/src/datagrid/DataGridRow.svelte
index b0e023d5d..91ff89c3d 100644
--- a/packages/web/src/datagrid/DataGridRow.svelte
+++ b/packages/web/src/datagrid/DataGridRow.svelte
@@ -12,6 +12,7 @@
export let selectedCells = undefined;
export let autofillSelectedCells = undefined;
export let autofillMarkerCell = undefined;
+ export let focusedColumn = undefined;
$: rowData = grider.getRowData(rowIndex);
$: rowStatus = grider.getRowStatus(rowIndex);
@@ -36,6 +37,7 @@
isSelected={frameSelection ? false : cellIsSelected(rowIndex, col.colIndex, selectedCells)}
isFrameSelected={frameSelection ? cellIsSelected(rowIndex, col.colIndex, selectedCells) : false}
isAutofillSelected={cellIsSelected(rowIndex, col.colIndex, autofillSelectedCells)}
+ isFocusedColumn={col.uniqueName == focusedColumn}
/>
{/each}
diff --git a/packages/web/src/elements/HorizontalSplitter.svelte b/packages/web/src/elements/HorizontalSplitter.svelte
index 69e65b381..ec58177e1 100644
--- a/packages/web/src/elements/HorizontalSplitter.svelte
+++ b/packages/web/src/elements/HorizontalSplitter.svelte
@@ -15,7 +15,7 @@
export let isSplitter = true;
export let initialValue = undefined;
- let size = 0;
+ export let size = 0;
let clientWidth;
$: size = computeSplitterSize(initialValue, clientWidth);
diff --git a/packages/web/src/elements/ManagerInnerContainer.svelte b/packages/web/src/elements/ManagerInnerContainer.svelte
new file mode 100644
index 000000000..33fedb63a
--- /dev/null
+++ b/packages/web/src/elements/ManagerInnerContainer.svelte
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/packages/web/src/elements/SearchBoxWrapper.svelte b/packages/web/src/elements/SearchBoxWrapper.svelte
index 693c2cb9d..d71019413 100644
--- a/packages/web/src/elements/SearchBoxWrapper.svelte
+++ b/packages/web/src/elements/SearchBoxWrapper.svelte
@@ -3,6 +3,7 @@