diff --git a/packages/filterparser/src/filterTypes.ts b/packages/filterparser/src/filterTypes.ts index 17340e568..6375ef587 100644 --- a/packages/filterparser/src/filterTypes.ts +++ b/packages/filterparser/src/filterTypes.ts @@ -40,6 +40,7 @@ export const MongoFilterType: StructuredFilterType = { supportNumberLikeComparison: true, supportStringInclusion: true, supportBooleanValues: true, + supportExistsTesting: true, }; export const EvalFilterType: StructuredFilterType = { diff --git a/packages/types/filter-type.d.ts b/packages/types/filter-type.d.ts index 9cfe72966..de2e79978 100644 --- a/packages/types/filter-type.d.ts +++ b/packages/types/filter-type.d.ts @@ -13,6 +13,7 @@ export interface StructuredFilterType { supportExistsTesting?: boolean; supportBooleanValues?: boolean; supportSqlCondition?: boolean; + supportArrayTesting?: boolean; // allowedOperators: Array<{ value: string; label: string }>; } diff --git a/packages/web/src/modals/SetFilterModal_Select.svelte b/packages/web/src/modals/SetFilterModal_Select.svelte index dba3365ea..8a929ef42 100644 --- a/packages/web/src/modals/SetFilterModal_Select.svelte +++ b/packages/web/src/modals/SetFilterModal_Select.svelte @@ -3,89 +3,59 @@ export let name; export let filterType; + export let structuredFilterType; function getOptions() { - switch (filterType) { - case 'number': - return [ - { value: '=', label: 'equals' }, - { value: '<>', label: 'does not equal' }, - { value: '<', label: 'is smaller' }, - { value: '>', label: 'is greater' }, - { value: '<=', label: 'is smaller or equal' }, - { value: '>=', label: 'is greater or equal' }, - { value: 'NULL', label: 'is NULL' }, - { value: 'NOT NULL', label: 'is not NULL' }, - { value: 'sql', label: 'SQL condition' }, - { value: 'sqlRight', label: 'SQL condition - right side only' }, - ]; - case 'string': - return [ - { value: '+', label: 'contains' }, - { value: '~', label: 'does not contain' }, - { value: '^', label: 'begins with' }, - { value: '!^', label: 'does not begin with' }, - { value: '$', label: 'ends with' }, - { value: '!$', label: 'does not end with' }, - { value: '=', label: 'equals' }, - { value: '<>', label: 'does not equal' }, - { value: '<', label: 'is smaller' }, - { value: '>', label: 'is greater' }, - { value: '<=', label: 'is smaller or equal' }, - { value: '>=', label: 'is greater or equal' }, - { value: 'NULL', label: 'is NULL' }, - { value: 'NOT NULL', label: 'is not NULL' }, - { value: 'sql', label: 'SQL condition' }, - { value: 'sqlRight', label: 'SQL condition - right side only' }, - ]; - case 'datetime': - return [ - { value: '=', label: 'equals' }, - { value: '<>', label: 'does not equal' }, - { value: '<', label: 'is before' }, - { value: '>', label: 'is after' }, - { value: '<=', label: 'is before or equal' }, - { value: '>=', label: 'is after or equal' }, - { value: 'NULL', label: 'is NULL' }, - { value: 'NOT NULL', label: 'is not NULL' }, - { value: 'sql', label: 'SQL condition' }, - { value: 'sqlRight', label: 'SQL condition - right side only' }, - ]; - case 'mongo': - return [ - { value: '=', label: 'equals' }, - { value: '<>', label: 'does not equal' }, - { value: '<', label: 'is smaller' }, - { value: '>', label: 'is greater' }, - { value: '<=', label: 'is smaller or equal' }, - { value: '>=', label: 'is greater or equal' }, - { value: '+', label: 'contains' }, - { value: '~', label: 'does not contain' }, - { value: '^', label: 'begins with' }, - { value: '!^', label: 'does not begin with' }, - { value: '$', label: 'ends with' }, - { value: '!$', label: 'does not end with' }, - { value: 'EXISTS', label: 'field exists' }, - { value: 'NOT EXISTS', label: 'field does not exist' }, - ]; - case 'eval': - return [ - { value: '=', label: 'equals' }, - { value: '<>', label: 'does not equal' }, - { value: '<', label: 'is smaller' }, - { value: '>', label: 'is greater' }, - { value: '<=', label: 'is smaller or equal' }, - { value: '>=', label: 'is greater or equal' }, - { value: '+', label: 'contains' }, - { value: '~', label: 'does not contain' }, - { value: '^', label: 'begins with' }, - { value: '!^', label: 'does not begin with' }, - { value: '$', label: 'ends with' }, - { value: '!$', label: 'does not end with' }, - { value: 'NULL', label: 'is NULL' }, - { value: 'NOT NULL', label: 'is not NULL' }, - ]; + const res = []; + if (structuredFilterType.supportEquals) { + res.push({ value: '=', label: 'equals' }, { value: '<>', label: 'does not equal' }); } + + if (structuredFilterType.supportStringInclusion) { + res.push( + { value: '+', label: 'contains' }, + { value: '~', label: 'does not contain' }, + { value: '^', label: 'begins with' }, + { value: '!^', label: 'does not begin with' }, + { value: '$', label: 'ends with' }, + { value: '!$', label: 'does not end with' } + ); + } + + if (structuredFilterType.supportNumberLikeComparison) { + res.push( + { value: '<', label: 'is smaller' }, + { value: '>', label: 'is greater' }, + { value: '<=', label: 'is smaller or equal' }, + { value: '>=', label: 'is greater or equal' } + ); + } + + if (structuredFilterType.supportDatetimeComparison) { + res.push( + { value: '<', label: 'is before' }, + { value: '>', label: 'is after' }, + { value: '<=', label: 'is before or equal' }, + { value: '>=', label: 'is after or equal' } + ); + } + + if (structuredFilterType.supportNullTesting) { + res.push({ value: 'NULL', label: 'is NULL' }, { value: 'NOT NULL', label: 'is not NULL' }); + } + + if (structuredFilterType.supportExistsTesting) { + res.push({ value: 'EXISTS', label: 'field exists' }, { value: 'NOT EXISTS', label: 'field does not exist' }); + } + + if (structuredFilterType.supportSqlCondition) { + res.push( + { value: 'sql', label: 'SQL condition' }, + { value: 'sqlRight', label: 'SQL condition - right side only' } + ); + } + + return res; }