diff --git a/packages/web/src/datagrid/ColumnManager.svelte b/packages/web/src/datagrid/ColumnManager.svelte new file mode 100644 index 000000000..199ab3e5f --- /dev/null +++ b/packages/web/src/datagrid/ColumnManager.svelte @@ -0,0 +1,28 @@ + + + + + display.hideAllColumns()}>Hide + display.showAllColumns()}>Show + + + {#each display + .getColumns(columnFilter) + .filter(column => filterName(columnFilter, column.columnName)) as column (column.uniqueName)} + + {/each} + diff --git a/packages/web/src/datagrid/ColumnManagerRow.svelte b/packages/web/src/datagrid/ColumnManagerRow.svelte new file mode 100644 index 000000000..af6735493 --- /dev/null +++ b/packages/web/src/datagrid/ColumnManagerRow.svelte @@ -0,0 +1,44 @@ + + +
{ + // @ts-ignore + if (e.target.closest('.expandColumnIcon')) return; + display.focusColumn(column.uniqueName); + }} +> + + display.toggleExpandedColumn(column.uniqueName)} + /> + + display.setColumnVisibility(column.uniquePath, !column.isChecked)} + /> + +
+ + diff --git a/packages/web/src/datagrid/DataGrid.svelte b/packages/web/src/datagrid/DataGrid.svelte index 315cd2cbc..1a80af337 100644 --- a/packages/web/src/datagrid/DataGrid.svelte +++ b/packages/web/src/datagrid/DataGrid.svelte @@ -2,16 +2,20 @@ import HorizontalSplitter from '../elements/HorizontalSplitter.svelte'; import WidgetColumnBar from '../widgets/WidgetColumnBar.svelte'; import WidgetColumnBarItem from '../widgets/WidgetColumnBarItem.svelte'; + import ColumnManager from './ColumnManager.svelte'; export let config; export let gridCoreComponent; export let showReferences = true; + + let managerSize; - +
+
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 @@