diff --git a/packages/filterparser/src/mongoParser.ts b/packages/filterparser/src/mongoParser.ts index 55ae31bc9..79c67f43c 100644 --- a/packages/filterparser/src/mongoParser.ts +++ b/packages/filterparser/src/mongoParser.ts @@ -44,6 +44,10 @@ const testCondition = (operator, value) => () => ({ }, }); +const multiTestCondition = condition => () => ({ + __placeholder__: condition, +}); + const compoudCondition = conditionType => conditions => { if (conditions.length == 1) return conditions[0]; return { @@ -85,7 +89,15 @@ const createParser = () => { comma: () => word(','), not: () => word('NOT'), + empty: () => word('EMPTY'), + array: () => word('ARRAY'), notExists: r => r.not.then(r.exists).map(testCondition('$exists', false)), + notEmptyArray: r => + r.not + .then(r.empty) + .then(r.array) + .map(multiTestCondition({ $exists: true, $type: 'array', $ne: [] })), + emptyArray: r => r.empty.then(r.array).map(multiTestCondition({ $exists: true, $eq: [] })), exists: () => word('EXISTS').map(testCondition('$exists', true)), true: () => word('TRUE').map(testCondition('$eq', true)), false: () => word('FALSE').map(testCondition('$eq', false)), @@ -117,6 +129,8 @@ const createParser = () => { r.gt, r.le, r.ge, + r.notEmptyArray, + r.emptyArray, r.startsWith, r.endsWith, r.contains, diff --git a/packages/web/src/datagrid/CollectionDataGridCore.svelte b/packages/web/src/datagrid/CollectionDataGridCore.svelte index 6f2bae2a0..2d25a7827 100644 --- a/packages/web/src/datagrid/CollectionDataGridCore.svelte +++ b/packages/web/src/datagrid/CollectionDataGridCore.svelte @@ -235,5 +235,6 @@ bind:loadedRows bind:selectedCellsPublished frameSelection={!!macroPreview} + onOpenQuery={openQuery} {grider} /> diff --git a/packages/web/src/datagrid/DataFilterControl.svelte b/packages/web/src/datagrid/DataFilterControl.svelte index ebb7ef8ed..38e769859 100644 --- a/packages/web/src/datagrid/DataFilterControl.svelte +++ b/packages/web/src/datagrid/DataFilterControl.svelte @@ -168,6 +168,8 @@ { onClick: () => openFilterWindow('<>'), text: 'Does Not Equal...' }, { onClick: () => setFilter('EXISTS'), text: 'Field exists' }, { onClick: () => setFilter('NOT EXISTS'), text: 'Field does not exist' }, + { onClick: () => setFilter('NOT EMPTY ARRAY'), text: 'Array is not empty' }, + { onClick: () => setFilter('EMPTY ARRAY'), text: 'Array is empty' }, { onClick: () => openFilterWindow('>'), text: 'Greater Than...' }, { onClick: () => openFilterWindow('>='), text: 'Greater Than Or Equal To...' }, { onClick: () => openFilterWindow('<'), text: 'Less Than...' }, diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte index 15e4f998b..29adf299f 100644 --- a/packages/web/src/datagrid/DataGridCore.svelte +++ b/packages/web/src/datagrid/DataGridCore.svelte @@ -1634,6 +1634,9 @@ {#if grider.editable} {/if} + {#if onOpenQuery} + + {/if} {:else if grider.errors && grider.errors.length > 0}