diff --git a/packages/types/filter-type.d.ts b/packages/types/filter-type.d.ts new file mode 100644 index 000000000..9cfe72966 --- /dev/null +++ b/packages/types/filter-type.d.ts @@ -0,0 +1,18 @@ +export type FilterParserCompilerType = 'sqlTree' | 'mongoCondition'; + +export interface StructuredFilterType { + compilerType: FilterParserCompilerType; + + supportEquals?: boolean; + supportStringInclusion?: boolean; + supportEmpty?: boolean; + supportNumberLikeComparison?: boolean; + supportDatetimeComparison?: boolean; + supportDatetimeSymbols?: boolean; + supportNullTesting?: boolean; + supportExistsTesting?: boolean; + supportBooleanValues?: boolean; + supportSqlCondition?: boolean; + + // allowedOperators: Array<{ value: string; label: string }>; +} diff --git a/packages/types/index.d.ts b/packages/types/index.d.ts index 9de4b755f..916af27a2 100644 --- a/packages/types/index.d.ts +++ b/packages/types/index.d.ts @@ -47,3 +47,4 @@ export * from './dbtypes'; export * from './extensions'; export * from './alter-processor'; export * from './appdefs'; +export * from './filter-type'; diff --git a/packages/web/src/datagrid/DataFilterControl.svelte b/packages/web/src/datagrid/DataFilterControl.svelte index 540d4dd91..4728336ea 100644 --- a/packages/web/src/datagrid/DataFilterControl.svelte +++ b/packages/web/src/datagrid/DataFilterControl.svelte @@ -20,6 +20,7 @@ export let isReadOnly = false; export let filterType; + export let structuredFilterType; export let filter; export let setFilter; export let showResizeSplitter = false; @@ -60,6 +61,55 @@ }; function createMenu() { + const res = [ + { onClick: () => setFilter(''), text: 'Clear Filter' }, + { onClick: () => filterMultipleValues(), text: 'Filter multiple values' }, + ]; + + if (structuredFilterType.supportEquals) { + res.push( + { onClick: () => openFilterWindow('='), text: 'Equals...' }, + { onClick: () => openFilterWindow('<>'), text: 'Does Not Equal...' } + ); + } + + if (structuredFilterType.supportNullTesting) { + res.push( + { onClick: () => setFilter('NULL'), text: 'Is Null' }, + { onClick: () => setFilter('NOT NULL'), text: 'Is Not Null' } + ); + } + + if (structuredFilterType.supportNumberLikeComparison) { + res.push( + { onClick: () => openFilterWindow('>'), text: 'Greater Than...' }, + { onClick: () => openFilterWindow('>='), text: 'Greater Than Or Equal To...' }, + { onClick: () => openFilterWindow('<'), text: 'Less Than...' }, + { onClick: () => openFilterWindow('<='), text: 'Less Than Or Equal To...' } + ); + } + + if (structuredFilterType.supportBooleanValues) { + res.push( + { onClick: () => setFilter('TRUE'), text: 'Is True' }, + { onClick: () => setFilter('FALSE'), text: 'Is False' } + ); + } + + if (structuredFilterType.supportBooleanValues && structuredFilterType.supportNullTesting) { + res.push( + { onClick: () => setFilter('TRUE, NULL'), text: 'Is True or NULL' }, + { onClick: () => setFilter('FALSE, NULL'), text: 'Is False or NULL' } + ); + } + + if (structuredFilterType.supportSqlCondition) { + res.push( + { onClick: () => openFilterWindow('sql'), text: 'SQL condition ...' }, + { onClick: () => openFilterWindow('sqlRight'), text: 'SQL condition - right side ...' } + ); + } + switch (filterType) { case 'number': return [