mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-05-03 10:33:58 +00:00
multi column filter #491
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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}
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user