checking filter on change

This commit is contained in:
Jan Prochazka
2020-03-12 18:14:40 +01:00
parent f86ad6ba1e
commit e8733c6587
3 changed files with 45 additions and 12 deletions

View File

@@ -277,6 +277,7 @@ export abstract class GridDisplay {
if (!filter) continue; if (!filter) continue;
const column = displayedColumnInfo[uniqueName]; const column = displayedColumnInfo[uniqueName];
if (!column) continue; if (!column) continue;
try {
const condition = parseFilter(filter, getFilterType(column.commonType?.typeCode)); const condition = parseFilter(filter, getFilterType(column.commonType?.typeCode));
if (condition) { if (condition) {
select.where = _.cloneDeepWith(condition, (expr: Expression) => { select.where = _.cloneDeepWith(condition, (expr: Expression) => {
@@ -288,6 +289,10 @@ export abstract class GridDisplay {
}; };
}); });
} }
} catch (err) {
console.warn(err.message);
continue;
}
} }
} }

View File

@@ -27,7 +27,7 @@ export function dumpSqlSelect(dmp: SqlDumper, select: Select) {
dmp.put('^from '); dmp.put('^from ');
dumpSqlFromDefinition(dmp, select.from); dumpSqlFromDefinition(dmp, select.from);
if (select.where) { if (select.where) {
dmp.put('&n^where'); dmp.put('&n^where ');
dumpSqlCondition(dmp, select.where); dumpSqlCondition(dmp, select.where);
dmp.put('&n'); dmp.put('&n');
} }

View File

@@ -1,7 +1,9 @@
// @ts-nocheck
import React from 'react'; import React from 'react';
import { DropDownMenuItem, DropDownMenuDivider, showMenu } from '../modals/DropDownMenu'; import { DropDownMenuItem, DropDownMenuDivider, showMenu } from '../modals/DropDownMenu';
import styled from 'styled-components'; import styled from 'styled-components';
import keycodes from '../utility/keycodes'; import keycodes from '../utility/keycodes';
import { parseFilter } from '@dbgate/filterparser';
// import { $ } from '../../Utility/jquery'; // import { $ } from '../../Utility/jquery';
// import autobind from 'autobind-decorator'; // import autobind from 'autobind-decorator';
// import * as React from 'react'; // import * as React from 'react';
@@ -33,6 +35,7 @@ const FilterDiv = styled.div`
const FilterInput = styled.input` const FilterInput = styled.input`
flex: 1; flex: 1;
width: 10px; width: 10px;
background-color: ${props => (props.state == 'ok' ? '#CCFFCC' : props.state == 'error' ? '#FFCCCC' : 'white')};
`; `;
const FilterButton = styled.button` const FilterButton = styled.button`
color: gray; color: gray;
@@ -160,11 +163,14 @@ function DropDownContent({ filterType, setFilter, filterMultipleValues, openFilt
} }
export default function DataFilterControl({ isReadOnly = false, filterType, filter, setFilter }) { export default function DataFilterControl({ isReadOnly = false, filterType, filter, setFilter }) {
const [filterState, setFilterState] = React.useState('empty');
const setFilterText = filter => { const setFilterText = filter => {
setFilter(filter); setFilter(filter);
editorRef.current.value = filter || ''; editorRef.current.value = filter || '';
updateFilterState();
}; };
const applyFilter = () => { const applyFilter = () => {
if ((filter || '') == (editorRef.current.value || '')) return;
setFilter(editorRef.current.value); setFilter(editorRef.current.value);
}; };
const filterMultipleValues = () => {}; 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(() => { React.useEffect(() => {
editorRef.current.value = filter || ''; editorRef.current.value = filter || '';
}, []); }, []);
@@ -205,7 +225,15 @@ export default function DataFilterControl({ isReadOnly = false, filterType, filt
return ( return (
<FilterDiv> <FilterDiv>
<FilterInput ref={editorRef} onKeyDown={handleKeyDown} type="text" readOnly={isReadOnly} /> <FilterInput
ref={editorRef}
onKeyDown={handleKeyDown}
type="text"
readOnly={isReadOnly}
onChange={updateFilterState}
state={filterState}
onBlur={applyFilter}
/>
<FilterButton ref={buttonRef} onClick={handleShowMenu}> <FilterButton ref={buttonRef} onClick={handleShowMenu}>
<i className="fas fa-filter" /> <i className="fas fa-filter" />
</FilterButton> </FilterButton>