filter behaviour WIP

This commit is contained in:
Jan Prochazka
2024-08-19 12:49:26 +02:00
parent 2a48e0c4a0
commit c3609e8c7b
24 changed files with 105 additions and 76 deletions

View File

@@ -19,7 +19,6 @@
import ValueLookupModal from '../modals/ValueLookupModal.svelte';
export let isReadOnly = false;
export let filterType;
export let filterBehaviour;
export let filter;
export let setFilter;
@@ -51,7 +50,7 @@
$: if (onGetReference && domInput) onGetReference(domInput);
function openFilterWindow(condition1) {
showModal(SetFilterModal, { condition1, filterType, onFilter: setFilter });
showModal(SetFilterModal, { condition1, filterBehaviour, onFilter: setFilter });
}
const filterMultipleValues = () => {
@@ -246,7 +245,7 @@
isOk = false;
isError = false;
if (value) {
parseFilter(value, filterType);
parseFilter(value, filterBehaviour);
isOk = true;
}
} catch (err) {

View File

@@ -78,7 +78,6 @@
export let display;
export let changeSetState;
export let dispatchChangeSet;
export let useEvalFilters = false;
export let isDetailView = false;
export let showReferences = false;
@@ -184,7 +183,6 @@
{...$$props}
{managerSize}
{isDynamicStructure}
{useEvalFilters}
{isFormView}
{hasMultiColumnFilter}
driver={display?.driver}

View File

@@ -343,13 +343,13 @@
<script lang="ts">
import { GridDisplay } from 'dbgate-datalib';
import { driverBase, parseCellValue } from 'dbgate-tools';
import { driverBase, parseCellValue, detectSqlFilterBehaviour } from 'dbgate-tools';
import { getContext, onDestroy } from 'svelte';
import _, { map } from 'lodash';
import registerCommand from '../commands/registerCommand';
import ColumnHeaderControl from './ColumnHeaderControl.svelte';
import DataGridRow from './DataGridRow.svelte';
import { getFilterType, getFilterValueExpression } from 'dbgate-filterparser';
import { getFilterValueExpression } from 'dbgate-filterparser';
import stableStringify from 'json-stable-stringify';
import contextMenu, { getContextMenu, registerMenu } from '../utility/contextMenu';
import { tick } from 'svelte';
@@ -435,7 +435,6 @@
export let tabControlHiddenTab = false;
export let onCustomGridRefresh = null;
export let onOpenQuery = null;
export let useEvalFilters = false;
export let jslid;
// export let generalAllowSave = false;
@@ -1901,7 +1900,9 @@
{jslid}
{formatterFunction}
driver={display?.driver}
filterType={useEvalFilters ? 'eval' : col.filterType || getFilterType(col.dataType)}
filterBehaviour={display?.filterBehaviourOverride ??
col.filterBehaviour ??
detectSqlFilterBehaviour(col.dataType)}
filter={display.getFilter(col.uniqueName)}
setFilter={value => display.setFilter(col.uniqueName, value)}
showResizeSplitter

View File

@@ -87,7 +87,6 @@
formViewComponent={JslFormView}
setLoadedRows={handleSetLoadedRows}
isDynamicStructure={!!infoUsed?.__isDynamicStructure}
useEvalFilters
showMacros={!!dispatchChangeSet}
expandMacros={!!dispatchChangeSet}
onRunMacro={handleRunMacro}

View File

@@ -10,7 +10,7 @@ import {
referenceIsConnecting,
mergeSelectsFromDesigner,
findQuerySource,
findDesignerFilterType,
findDesignerFilterBehaviour,
} from './designerTools';
import { parseFilter } from 'dbgate-filterparser';
@@ -83,7 +83,7 @@ export class DesignerQueryDumper {
}
try {
const condition = parseFilter(column[filterField], findDesignerFilterType(column, this.designer));
const condition = parseFilter(column[filterField], findDesignerFilterBehaviour(column, this.designer));
if (condition) {
conditions.push(
_.cloneDeepWith(condition, expr => {

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import { presetDarkPalettes, presetPalettes } from '@ant-design/colors';
import { filterName } from 'dbgate-tools';
import { filterName, stringFilterBehaviour } from 'dbgate-tools';
import { tick } from 'svelte';
import { createDatabaseObjectMenu } from '../appobj/DatabaseObjectAppObject.svelte';
@@ -303,7 +303,7 @@
</div>
{#if settings?.getMutliColumnFilter && settings?.setMutliColumnFilter}
<DataFilterControl
filterType="string"
filterBehaviour={stringFilterBehaviour}
filter={settings?.getMutliColumnFilter(designerId)}
setFilter={value => settings?.setMutliColumnFilter(designerId, value)}
placeholder="Data filter"

View File

@@ -5,7 +5,7 @@ import type { EngineDriver } from 'dbgate-types';
import type { DesignerInfo, DesignerTableInfo, DesignerReferenceInfo, DesignerJoinType } from './types';
import { DesignerComponentCreator } from './DesignerComponentCreator';
import { DesignerQueryDumper } from './DesignerQueryDumper';
import { getFilterType } from 'dbgate-filterparser';
import { detectSqlFilterBehaviour } from 'dbgate-tools';
export function referenceIsConnecting(
reference: DesignerReferenceInfo,
@@ -133,13 +133,13 @@ export function isConnectedByReference(
return array1 == array2;
}
export function findDesignerFilterType({ designerId, columnName }, designer) {
export function findDesignerFilterBehaviour({ designerId, columnName }, designer) {
const table = (designer.tables || []).find(x => x.designerId == designerId);
if (table) {
const column = (table.columns || []).find(x => x.columnName == columnName);
if (column) {
const { dataType } = column;
return getFilterType(dataType);
return detectSqlFilterBehaviour(dataType);
}
}
return 'string';

View File

@@ -8,7 +8,7 @@
<script>
import DataFilterControl from '../datagrid/DataFilterControl.svelte';
import { findDesignerFilterType } from '../designer/designerTools';
import { findDesignerFilterBehaviour } from '../designer/designerTools';
import CheckboxField from '../forms/CheckboxField.svelte';
import SelectField from '../forms/SelectField.svelte';
import TextField from '../forms/TextField.svelte';
@@ -238,7 +238,7 @@
</svelte:fragment>
<svelte:fragment slot="5" let:row let:filterField>
<DataFilterControl
filterType={findDesignerFilterType(row, value)}
filterBehaviour={findDesignerFilterBehaviour(row, value)}
filter={row[filterField]}
setFilter={filter => {
changeColumn({ ...row, [filterField]: filter });

View File

@@ -1,5 +1,5 @@
<script lang="ts">
import { getFilterType } from 'dbgate-filterparser';
import { detectSqlFilterBehaviour, standardFilterBehaviours, mongoFilterBehaviour } from 'dbgate-tools';
import DataFilterControl from '../datagrid/DataFilterControl.svelte';
@@ -17,22 +17,20 @@
export let schemaName;
export let pureName;
export let useEvalFilters;
export let isDynamicStructure;
export let isFormView;
$: column = isFormView
? display.formColumns?.find(x => x.uniqueName == uniqueName)
: display?.findColumn(uniqueName);
$: column = isFormView ? display.formColumns?.find(x => x.uniqueName == uniqueName) : display?.findColumn(uniqueName);
function computeFilterType(column, isDynamicStructure, useEvalFilters) {
if (useEvalFilters) return 'eval';
if (isDynamicStructure) return 'mongo';
if (column) {
return column.filterType || getFilterType(column.dataType);
function computeFilterBehavoir(column, display, isDynamicStructure) {
if (display?.filterBehaviourOverride) {
return display?.filterBehaviourOverride;
}
return 'string';
const fromDriver = display?.driver?.getFilterBehaviour(column.dataType, standardFilterBehaviours);
if (fromDriver) return fromDriver;
if (isDynamicStructure) return mongoFilterBehaviour;
return detectSqlFilterBehaviour(column.dataType);
}
</script>
@@ -51,7 +49,7 @@
</InlineButton>
</div>
<DataFilterControl
filterType={computeFilterType(column, isDynamicStructure, useEvalFilters)}
filterBehaviour={computeFilterBehavoir(column, display, isDynamicStructure)}
filter={filters[uniqueName]}
setFilter={value => display.setFilter(uniqueName, value)}
{driver}

View File

@@ -20,7 +20,6 @@
export let pureName;
export let isDynamicStructure;
export let useEvalFilters;
export let isFormView;
export let hasMultiColumnFilter;
@@ -93,7 +92,6 @@
{#each allFilterNames as uniqueName}
<FormViewFilterColumn
{isDynamicStructure}
{useEvalFilters}
{isFormView}
{uniqueName}
{display}

View File

@@ -13,7 +13,7 @@
export let condition1;
export let onFilter;
export let filterType;
export let filterBehaviour;
const hasOperand = condition => {
return condition != 'NULL' && condition != 'NOT NULL' && condition != 'EXISTS' && condition != 'NOT EXISTS';
@@ -24,7 +24,9 @@
if (!value) return null;
if (condition == 'sql') return `{${value}}`;
if (condition == 'sqlRight') return `{$$ ${value}}`;
if (filterType == 'string') return `${condition}"${value}"`;
if (filterBehaviour.allowStringToken) {
return `${condition}"${value}"`;
}
return `${condition}${value}`;
};
@@ -48,7 +50,7 @@
<div class="row">Show rows where</div>
<div class="row">
<div class="col-6 mr-1">
<SetFilterModal_Select {filterType} name="condition1" />
<SetFilterModal_Select {filterBehaviour} name="condition1" />
</div>
<div class="col-6 mr-1">
<FormValues let:values>
@@ -66,7 +68,7 @@
<div class="row">
<div class="col-6 mr-1">
<SetFilterModal_Select {filterType} name="condition2" />
<SetFilterModal_Select {filterBehaviour} name="condition2" />
</div>
<div class="col-6 mr-1">
<FormValues let:values>

View File

@@ -2,7 +2,6 @@
import FormSelectFieldRaw from '../forms/FormSelectFieldRaw.svelte';
export let name;
export let filterType;
export let filterBehaviour;
function getOptions() {