multi column filter #491

This commit is contained in:
Jan Prochazka
2023-02-26 15:26:39 +01:00
parent a251e92598
commit b26be02203
6 changed files with 76 additions and 14 deletions

View File

@@ -30,6 +30,7 @@ export interface GridConfig extends GridConfigColumns {
formViewRecordNumber?: number; formViewRecordNumber?: number;
formFilterColumns: string[]; formFilterColumns: string[];
formColumnFilterText?: string; formColumnFilterText?: string;
multiColumnFilter?: string;
} }
export interface GridCache { export interface GridCache {

View File

@@ -14,7 +14,7 @@ import type {
import { parseFilter, getFilterType } from 'dbgate-filterparser'; import { parseFilter, getFilterType } from 'dbgate-filterparser';
import { filterName } from 'dbgate-tools'; import { filterName } from 'dbgate-tools';
import { ChangeSetFieldDefinition, ChangeSetRowDefinition } from './ChangeSet'; 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'; import { isTypeLogical } from 'dbgate-tools';
export interface DisplayColumn { 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) { if (conditions.length > 0) {
select.where = { select.where = {
conditionType: 'and', conditionType: 'and',
@@ -336,6 +362,15 @@ export abstract class GridDisplay {
this.reload(); this.reload();
} }
setMutliColumnFilter(value) {
this.setConfig(cfg => ({
...cfg,
multiColumnFilter: value,
formViewRecordNumber: 0,
}));
this.reload();
}
showFilter(uniqueName) { showFilter(uniqueName) {
this.setConfig(cfg => { this.setConfig(cfg => {
if (!cfg.filters.uniqueName) if (!cfg.filters.uniqueName)

View File

@@ -87,6 +87,7 @@
export let isDynamicStructure = false; export let isDynamicStructure = false;
export let macroCondition; export let macroCondition;
export let onRunMacro; export let onRunMacro;
export let hasMultiColumnFilter = false;
export let loadedRows; export let loadedRows;
@@ -181,6 +182,7 @@
{isDynamicStructure} {isDynamicStructure}
{useEvalFilters} {useEvalFilters}
{isFormView} {isFormView}
{hasMultiColumnFilter}
driver={display?.driver} driver={display?.driver}
/> />
</WidgetColumnBarItem> </WidgetColumnBarItem>

View File

@@ -159,6 +159,7 @@
{display} {display}
showReferences showReferences
showMacros showMacros
hasMultiColumnFilter
onRunMacro={handleRunMacro} onRunMacro={handleRunMacro}
macroCondition={macro => macro.type == 'transformValue'} macroCondition={macro => macro.type == 'transformValue'}
onReferenceSourceChanged={reference ? handleReferenceSourceChanged : null} onReferenceSourceChanged={reference ? handleReferenceSourceChanged : null}

View File

@@ -1,8 +1,10 @@
<script lang="ts"> <script lang="ts">
import _ from 'lodash'; import _ from 'lodash';
import InlineButton from '../buttons/InlineButton.svelte';
import DataFilterControl from '../datagrid/DataFilterControl.svelte'; import DataFilterControl from '../datagrid/DataFilterControl.svelte';
import ManagerInnerContainer from '../elements/ManagerInnerContainer.svelte'; import ManagerInnerContainer from '../elements/ManagerInnerContainer.svelte';
import FontIcon from '../icons/FontIcon.svelte';
import keycodes from '../utility/keycodes'; import keycodes from '../utility/keycodes';
import FormViewFilterColumn from './FormViewFilterColumn.svelte'; import FormViewFilterColumn from './FormViewFilterColumn.svelte';
// import PrimaryKeyFilterEditor from './PrimaryKeyFilterEditor.svelte'; // import PrimaryKeyFilterEditor from './PrimaryKeyFilterEditor.svelte';
@@ -21,16 +23,19 @@
export let useEvalFilters; export let useEvalFilters;
export let isFormView; export let isFormView;
export let hasMultiColumnFilter;
$: baseTable = display?.baseTable; $: baseTable = display?.baseTable;
$: formFilterColumns = display?.config?.formFilterColumns; $: formFilterColumns = display?.config?.formFilterColumns;
$: filters = display?.config?.filters; $: filters = display?.config?.filters;
$: multiColumnFilter = display?.config?.multiColumnFilter;
$: allFilterNames = isFormView ? _.union(_.keys(filters || {}), formFilterColumns || []) : _.keys(filters); $: allFilterNames = isFormView ? _.union(_.keys(filters || {}), formFilterColumns || []) : _.keys(filters);
</script> </script>
{#if isFormView} {#if isFormView}
<div class="m-1"> <div class="m-1">
<div>Column filter</div> <div>Column name filter</div>
<div class="flex"> <div class="flex">
<input <input
type="text" type="text"
@@ -54,18 +59,35 @@
</div> </div>
{/if} {/if}
<!-- <DataFilterControl {#if hasMultiColumnFilter}
filterType='string' <div class="m-1">
filter={filters[uniqueName]} <div class="space-between">
setFilter={value => display.setFilter(uniqueName, value)} <span>Multi column filter</span>
{driver} {#if multiColumnFilter}
{conid} <InlineButton
{database} square
{schemaName} narrow
{pureName} on:click={() => {
columnName={column.uniquePath.length == 1 ? column.uniquePath[0] : null} display.setMutliColumnFilter(null);
foreignKey={column.foreignKey} }}
/> --> >
<FontIcon icon="icon close" />
</InlineButton>
{/if}
</div>
<DataFilterControl
filterType="string"
filter={multiColumnFilter}
setFilter={value => display.setMutliColumnFilter(value)}
{driver}
{conid}
{database}
{schemaName}
{pureName}
/>
</div>
{/if}
<ManagerInnerContainer width={managerSize}> <ManagerInnerContainer width={managerSize}>
{#each allFilterNames as uniqueName} {#each allFilterNames as uniqueName}

View File

@@ -66,6 +66,7 @@ import ToolStripExportButton, { createQuickExportHandlerRef } from '../buttons/T
cache={$cache} cache={$cache}
setCache={cache.update} setCache={cache.update}
focusOnVisible focusOnVisible
hasMultiColumnFilter
gridCoreComponent={SqlDataGridCore} gridCoreComponent={SqlDataGridCore}
formViewComponent={SqlFormView} formViewComponent={SqlFormView}
/> />