diff --git a/packages/datalib/src/GridConfig.ts b/packages/datalib/src/GridConfig.ts index 44f38179c..48dcf39b5 100644 --- a/packages/datalib/src/GridConfig.ts +++ b/packages/datalib/src/GridConfig.ts @@ -30,6 +30,7 @@ export interface GridConfig extends GridConfigColumns { formViewRecordNumber?: number; formFilterColumns: string[]; formColumnFilterText?: string; + multiColumnFilter?: string; } export interface GridCache { diff --git a/packages/datalib/src/GridDisplay.ts b/packages/datalib/src/GridDisplay.ts index 9a7fc7707..616309011 100644 --- a/packages/datalib/src/GridDisplay.ts +++ b/packages/datalib/src/GridDisplay.ts @@ -14,7 +14,7 @@ import type { import { parseFilter, getFilterType } from 'dbgate-filterparser'; import { filterName } from 'dbgate-tools'; import { ChangeSetFieldDefinition, ChangeSetRowDefinition } from './ChangeSet'; -import { Expression, Select, treeToSql, dumpSqlSelect, Condition } from 'dbgate-sqltree'; +import { Expression, Select, treeToSql, dumpSqlSelect, Condition, CompoudCondition } from 'dbgate-sqltree'; import { isTypeLogical } from 'dbgate-tools'; export interface DisplayColumn { @@ -213,6 +213,32 @@ export abstract class GridDisplay { } } + if (this.baseTableOrView && this.config.multiColumnFilter) { + try { + const condition = parseFilter(this.config.multiColumnFilter, 'string'); + if (condition) { + const orCondition: CompoudCondition = { + conditionType: 'or', + conditions: [], + }; + for (const column of this.baseTableOrView.columns) { + orCondition.conditions.push( + _.cloneDeepWith(condition, (expr: Expression) => { + if (expr.exprType == 'placeholder') { + return this.createColumnExpression(column, { alias: 'basetbl' }); + } + }) + ); + } + if (orCondition.conditions.length > 0) { + conditions.push(orCondition); + } + } + } catch (err) { + console.warn(err.message); + } + } + if (conditions.length > 0) { select.where = { conditionType: 'and', @@ -336,6 +362,15 @@ export abstract class GridDisplay { this.reload(); } + setMutliColumnFilter(value) { + this.setConfig(cfg => ({ + ...cfg, + multiColumnFilter: value, + formViewRecordNumber: 0, + })); + this.reload(); + } + showFilter(uniqueName) { this.setConfig(cfg => { if (!cfg.filters.uniqueName) diff --git a/packages/web/src/datagrid/DataGrid.svelte b/packages/web/src/datagrid/DataGrid.svelte index 69e7dbed4..93b8dc3a9 100644 --- a/packages/web/src/datagrid/DataGrid.svelte +++ b/packages/web/src/datagrid/DataGrid.svelte @@ -87,6 +87,7 @@ export let isDynamicStructure = false; export let macroCondition; export let onRunMacro; + export let hasMultiColumnFilter = false; export let loadedRows; @@ -181,6 +182,7 @@ {isDynamicStructure} {useEvalFilters} {isFormView} + {hasMultiColumnFilter} driver={display?.driver} /> diff --git a/packages/web/src/datagrid/TableDataGrid.svelte b/packages/web/src/datagrid/TableDataGrid.svelte index 68f3d5d48..9777ecda5 100644 --- a/packages/web/src/datagrid/TableDataGrid.svelte +++ b/packages/web/src/datagrid/TableDataGrid.svelte @@ -159,6 +159,7 @@ {display} showReferences showMacros + hasMultiColumnFilter onRunMacro={handleRunMacro} macroCondition={macro => macro.type == 'transformValue'} onReferenceSourceChanged={reference ? handleReferenceSourceChanged : null} diff --git a/packages/web/src/formview/FormViewFilters.svelte b/packages/web/src/formview/FormViewFilters.svelte index df218fbca..18aca5bca 100644 --- a/packages/web/src/formview/FormViewFilters.svelte +++ b/packages/web/src/formview/FormViewFilters.svelte @@ -1,8 +1,10 @@ {#if isFormView}