From e8733c65878348837b22b9db451600d4dccb23b1 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Thu, 12 Mar 2020 18:14:40 +0100 Subject: [PATCH] checking filter on change --- packages/datalib/src/GridDisplay.ts | 25 +++++++++------- packages/sqltree/src/dumpSqlCommand.ts | 2 +- .../web/src/datagrid/DataFilterControl.js | 30 ++++++++++++++++++- 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/packages/datalib/src/GridDisplay.ts b/packages/datalib/src/GridDisplay.ts index 842241907..5f30ce98f 100644 --- a/packages/datalib/src/GridDisplay.ts +++ b/packages/datalib/src/GridDisplay.ts @@ -277,16 +277,21 @@ export abstract class GridDisplay { if (!filter) continue; const column = displayedColumnInfo[uniqueName]; if (!column) continue; - const condition = parseFilter(filter, getFilterType(column.commonType?.typeCode)); - if (condition) { - select.where = _.cloneDeepWith(condition, (expr: Expression) => { - if (expr.exprType == 'placeholder') - return { - exprType: 'column', - columnName: column.columnName, - source: { alias: column.sourceAlias }, - }; - }); + try { + const condition = parseFilter(filter, getFilterType(column.commonType?.typeCode)); + if (condition) { + select.where = _.cloneDeepWith(condition, (expr: Expression) => { + if (expr.exprType == 'placeholder') + return { + exprType: 'column', + columnName: column.columnName, + source: { alias: column.sourceAlias }, + }; + }); + } + } catch (err) { + console.warn(err.message); + continue; } } } diff --git a/packages/sqltree/src/dumpSqlCommand.ts b/packages/sqltree/src/dumpSqlCommand.ts index 0c12eabb2..a3ca19c19 100644 --- a/packages/sqltree/src/dumpSqlCommand.ts +++ b/packages/sqltree/src/dumpSqlCommand.ts @@ -27,7 +27,7 @@ export function dumpSqlSelect(dmp: SqlDumper, select: Select) { dmp.put('^from '); dumpSqlFromDefinition(dmp, select.from); if (select.where) { - dmp.put('&n^where'); + dmp.put('&n^where '); dumpSqlCondition(dmp, select.where); dmp.put('&n'); } diff --git a/packages/web/src/datagrid/DataFilterControl.js b/packages/web/src/datagrid/DataFilterControl.js index b5c9abf34..2d2a24d91 100644 --- a/packages/web/src/datagrid/DataFilterControl.js +++ b/packages/web/src/datagrid/DataFilterControl.js @@ -1,7 +1,9 @@ +// @ts-nocheck import React from 'react'; import { DropDownMenuItem, DropDownMenuDivider, showMenu } from '../modals/DropDownMenu'; import styled from 'styled-components'; import keycodes from '../utility/keycodes'; +import { parseFilter } from '@dbgate/filterparser'; // import { $ } from '../../Utility/jquery'; // import autobind from 'autobind-decorator'; // import * as React from 'react'; @@ -33,6 +35,7 @@ const FilterDiv = styled.div` const FilterInput = styled.input` flex: 1; width: 10px; + background-color: ${props => (props.state == 'ok' ? '#CCFFCC' : props.state == 'error' ? '#FFCCCC' : 'white')}; `; const FilterButton = styled.button` color: gray; @@ -160,11 +163,14 @@ function DropDownContent({ filterType, setFilter, filterMultipleValues, openFilt } export default function DataFilterControl({ isReadOnly = false, filterType, filter, setFilter }) { + const [filterState, setFilterState] = React.useState('empty'); const setFilterText = filter => { setFilter(filter); editorRef.current.value = filter || ''; + updateFilterState(); }; const applyFilter = () => { + if ((filter || '') == (editorRef.current.value || '')) return; setFilter(editorRef.current.value); }; const filterMultipleValues = () => {}; @@ -185,6 +191,20 @@ export default function DataFilterControl({ isReadOnly = false, filterType, filt // } }; + const updateFilterState = () => { + const value = editorRef.current.value; + try { + if (value) { + parseFilter(value, filterType); + setFilterState('ok'); + } else { + setFilterState('empty'); + } + } catch (err) { + setFilterState('error'); + } + }; + React.useEffect(() => { editorRef.current.value = filter || ''; }, []); @@ -205,7 +225,15 @@ export default function DataFilterControl({ isReadOnly = false, filterType, filt return ( - +