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();