Merge pull request #1230 from dbgate/feature/disable-filter

Feature/disable filter
This commit is contained in:
Jan Prochazka
2025-10-22 14:42:51 +02:00
committed by GitHub
6 changed files with 77 additions and 10 deletions

View File

@@ -31,6 +31,8 @@ export interface GridConfig extends GridConfigColumns {
formFilterColumns: string[]; formFilterColumns: string[];
multiColumnFilter?: string; multiColumnFilter?: string;
searchInColumns?: string; searchInColumns?: string;
disabledFilterColumns: string[];
disabledMultiColumnFilter?: boolean;
} }
export interface GridCache { export interface GridCache {
@@ -48,6 +50,7 @@ export function createGridConfig(): GridConfig {
focusedColumns: null, focusedColumns: null,
grouping: {}, grouping: {},
formFilterColumns: [], formFilterColumns: [],
disabledFilterColumns: [],
}; };
} }

View File

@@ -233,6 +233,7 @@ export abstract class GridDisplay {
if (!filter) continue; if (!filter) continue;
const column = displayedColumnInfo[uniqueName]; const column = displayedColumnInfo[uniqueName];
if (!column) continue; if (!column) continue;
if (this.isFilterDisabled(uniqueName)) continue;
try { try {
const condition = parseFilter( const condition = parseFilter(
filter, filter,
@@ -259,7 +260,7 @@ export abstract class GridDisplay {
} }
} }
if (this.baseTableOrView && this.config.multiColumnFilter) { if (this.baseTableOrView && this.config.multiColumnFilter && !this.isMultiColumnFilterDisabled()) {
const orCondition: CompoudCondition = { const orCondition: CompoudCondition = {
conditionType: 'or', conditionType: 'or',
conditions: [], conditions: [],
@@ -416,6 +417,7 @@ export abstract class GridDisplay {
[uniqueName]: value, [uniqueName]: value,
}, },
formViewRecordNumber: 0, formViewRecordNumber: 0,
disabledFilterColumns: cfg.disabledFilterColumns.filter(x => x != uniqueName),
})); }));
this.reload(); this.reload();
} }
@@ -425,6 +427,7 @@ export abstract class GridDisplay {
...cfg, ...cfg,
multiColumnFilter: value, multiColumnFilter: value,
formViewRecordNumber: 0, formViewRecordNumber: 0,
disabledMultiColumnFilter: false,
})); }));
this.reload(); this.reload();
} }
@@ -448,6 +451,7 @@ export abstract class GridDisplay {
...cfg, ...cfg,
filters: _.omit(cfg.filters, [uniqueName]), filters: _.omit(cfg.filters, [uniqueName]),
formFilterColumns: (cfg.formFilterColumns || []).filter(x => x != uniqueName), formFilterColumns: (cfg.formFilterColumns || []).filter(x => x != uniqueName),
disabledFilterColumns: (cfg.disabledFilterColumns).filter(x => x != uniqueName),
})); }));
this.reload(); this.reload();
} }
@@ -463,6 +467,37 @@ export abstract class GridDisplay {
this.reload(); this.reload();
} }
toggleFilterEnabled(uniqueName) {
if (this.isFilterDisabled(uniqueName)) {
this.setConfig(cfg => ({
...cfg,
disabledFilterColumns: cfg.disabledFilterColumns.filter(x => x != uniqueName),
}));
} else {
this.setConfig(cfg => ({
...cfg,
disabledFilterColumns: [...cfg.disabledFilterColumns, uniqueName],
}));
}
this.reload();
}
isFilterDisabled(uniqueName: string) {
return this.config.disabledFilterColumns.includes(uniqueName);
}
toggleMultiColumnFilterEnabled() {
this.setConfig(cfg => ({
...cfg,
disabledMultiColumnFilter: !cfg.disabledMultiColumnFilter,
}));
this.reload();
}
isMultiColumnFilterDisabled() {
return this.config.disabledMultiColumnFilter;
}
setSort(uniqueName, order) { setSort(uniqueName, order) {
this.setConfig(cfg => ({ this.setConfig(cfg => ({
...cfg, ...cfg,

View File

@@ -34,6 +34,7 @@
export let onCustomCommand = null; export let onCustomCommand = null;
export let customCommandTooltip = null; export let customCommandTooltip = null;
export let formatterFunction = null; export let formatterFunction = null;
export let filterDisabled = false;
export let pureName = null; export let pureName = null;
export let schemaName = null; export let schemaName = null;
@@ -47,6 +48,7 @@
let isError; let isError;
let isOk; let isOk;
let domInput; let domInput;
let isDisabled;
$: if (onGetReference && domInput) onGetReference(domInput); $: if (onGetReference && domInput) onGetReference(domInput);
@@ -257,6 +259,7 @@
try { try {
isOk = false; isOk = false;
isError = false; isError = false;
isDisabled = filterDisabled;
if (value) { if (value) {
parseFilter(value, filterBehaviour); parseFilter(value, filterBehaviour);
isOk = true; isOk = true;
@@ -287,6 +290,7 @@
on:paste={handlePaste} on:paste={handlePaste}
class:isError class:isError
class:isOk class:isOk
class:isDisabled
{placeholder} {placeholder}
data-testid={`DataFilterControl_input_${uniqueName}`} data-testid={`DataFilterControl_input_${uniqueName}`}
/> />
@@ -345,4 +349,8 @@
input.isOk { input.isOk {
background-color: var(--theme-bg-green); background-color: var(--theme-bg-green);
} }
input.isDisabled {
text-decoration: line-through;
}
</style> </style>

View File

@@ -2059,6 +2059,7 @@
selectTopmostCell(col.uniqueName); selectTopmostCell(col.uniqueName);
}} }}
dataType={col.dataType} dataType={col.dataType}
filterDisabled={display.isFilterDisabled(col.uniqueName)}
/> />
</td> </td>
{/each} {/each}

View File

@@ -6,6 +6,7 @@
import ColumnLabel from '../elements/ColumnLabel.svelte'; import ColumnLabel from '../elements/ColumnLabel.svelte';
import InlineButton from '../buttons/InlineButton.svelte'; import InlineButton from '../buttons/InlineButton.svelte';
import FontIcon from '../icons/FontIcon.svelte'; import FontIcon from '../icons/FontIcon.svelte';
import CheckboxField from '../forms/CheckboxField.svelte';
export let uniqueName; export let uniqueName;
export let display; export let display;
@@ -42,6 +43,13 @@
{:else} {:else}
{uniqueName} {uniqueName}
{/if} {/if}
<div class="flex items-center gap-2">
<CheckboxField
checked={!display.isFilterDisabled(uniqueName)}
on:change={() => {
display.toggleFilterEnabled(uniqueName);
}}
/>
<InlineButton <InlineButton
square square
narrow narrow
@@ -52,6 +60,7 @@
<FontIcon icon="icon close" /> <FontIcon icon="icon close" />
</InlineButton> </InlineButton>
</div> </div>
</div>
<DataFilterControl <DataFilterControl
filterBehaviour={computeFilterBehavoir(column, display, isDynamicStructure)} filterBehaviour={computeFilterBehavoir(column, display, isDynamicStructure)}
filter={filters[uniqueName]} filter={filters[uniqueName]}
@@ -64,6 +73,7 @@
columnName={column ? (column.uniquePath.length == 1 ? column.uniquePath[0] : null) : uniqueName} columnName={column ? (column.uniquePath.length == 1 ? column.uniquePath[0] : null) : uniqueName}
foreignKey={column?.foreignKey} foreignKey={column?.foreignKey}
dataType={column?.dataType} dataType={column?.dataType}
filterDisabled={display.isFilterDisabled(uniqueName)}
/> />
</div> </div>
{/if} {/if}

View File

@@ -8,6 +8,7 @@
import keycodes from '../utility/keycodes'; import keycodes from '../utility/keycodes';
import FormViewFilterColumn from './FormViewFilterColumn.svelte'; import FormViewFilterColumn from './FormViewFilterColumn.svelte';
import { stringFilterBehaviour } from 'dbgate-tools'; import { stringFilterBehaviour } from 'dbgate-tools';
import CheckboxField from '../forms/CheckboxField.svelte';
// import PrimaryKeyFilterEditor from './PrimaryKeyFilterEditor.svelte'; // import PrimaryKeyFilterEditor from './PrimaryKeyFilterEditor.svelte';
export let managerSize; export let managerSize;
@@ -64,6 +65,13 @@
<div class="space-between"> <div class="space-between">
<span>Multi column filter</span> <span>Multi column filter</span>
{#if multiColumnFilter} {#if multiColumnFilter}
<div class="flex items-center gap-2">
<CheckboxField
checked={!display.isMultiColumnFilterDisabled()}
on:change={() => {
display.toggleMultiColumnFilterEnabled();
}}
/>
<InlineButton <InlineButton
square square
narrow narrow
@@ -73,6 +81,7 @@
> >
<FontIcon icon="icon close" /> <FontIcon icon="icon close" />
</InlineButton> </InlineButton>
</div>
{/if} {/if}
</div> </div>
@@ -85,6 +94,7 @@
{database} {database}
{schemaName} {schemaName}
{pureName} {pureName}
filterDisabled={display.isMultiColumnFilterDisabled()}
/> />
</div> </div>
{/if} {/if}