diff --git a/packages/datalib/src/GridDisplay.ts b/packages/datalib/src/GridDisplay.ts index 91c35b27a..1bd4f1685 100644 --- a/packages/datalib/src/GridDisplay.ts +++ b/packages/datalib/src/GridDisplay.ts @@ -287,6 +287,17 @@ export abstract class GridDisplay { this.reload(); } + setFilters(dct) { + this.setConfig((cfg) => ({ + ...cfg, + filters: { + ...cfg.filters, + ...dct, + }, + })); + this.reload(); + } + setSort(uniqueName, order) { this.setConfig((cfg) => ({ ...cfg, diff --git a/packages/web/src/datagrid/DataGridContextMenu.js b/packages/web/src/datagrid/DataGridContextMenu.js index 90a33f7b5..5664bf647 100644 --- a/packages/web/src/datagrid/DataGridContextMenu.js +++ b/packages/web/src/datagrid/DataGridContextMenu.js @@ -9,6 +9,7 @@ export default function DataGridContextMenu({ setNull, reload, exportGrid, + filterSelectedValue, }) { return ( <> @@ -35,6 +36,9 @@ export default function DataGridContextMenu({ Export + + Filter selected value + ); } diff --git a/packages/web/src/datagrid/DataGridCore.js b/packages/web/src/datagrid/DataGridCore.js index 7c2394057..647de34e8 100644 --- a/packages/web/src/datagrid/DataGridCore.js +++ b/packages/web/src/datagrid/DataGridCore.js @@ -7,7 +7,7 @@ import useDimensions from '../utility/useDimensions'; import axios from '../utility/axios'; import DataFilterControl from './DataFilterControl'; import stableStringify from 'json-stable-stringify'; -import { getFilterType } from '@dbgate/filterparser'; +import { getFilterType, getFilterValueExpression } from '@dbgate/filterparser'; import { cellFromEvent, getCellRange, topLeftCell, isRegularCell, nullCell, emptyCellArray } from './selection'; import keycodes from '../utility/keycodes'; import DataGridRow from './DataGridRow'; @@ -560,6 +560,7 @@ export default function DataGridCore(props) { reload={() => display.reload()} setNull={setNull} exportGrid={exportGrid} + filterSelectedValue={filterSelectedValue} /> ); }; @@ -824,6 +825,21 @@ export default function DataGridCore(props) { setChangeSet(updatedChangeSet); } + function filterSelectedValue() { + const flts = {}; + for (const cell of selectedCells) { + if (!isRegularCell(cell)) continue; + const modelIndex = columnSizes.realToModel(cell[1]); + const columnName = columns[modelIndex].uniqueName; + let value = loadedRows[cell[0]][columnName]; + let svalue = getFilterValueExpression(value, columns[modelIndex].dataType); + if (_.has(flts, columnName)) flts[columnName] += ',' + svalue; + else flts[columnName] = svalue; + } + + display.setFilters(flts); + } + function revertAllChanges() { setChangeSet(createChangeSet()); } @@ -936,6 +952,11 @@ export default function DataGridCore(props) { revertRowChanges(); } + if (event.keyCode == keycodes.f && event.ctrlKey) { + event.preventDefault(); + filterSelectedValue(); + } + if (event.keyCode == keycodes.z && event.ctrlKey) { event.preventDefault(); undo();