mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-05-03 10:33:58 +00:00
checking filter on change
This commit is contained in:
@@ -277,16 +277,21 @@ export abstract class GridDisplay {
|
|||||||
if (!filter) continue;
|
if (!filter) continue;
|
||||||
const column = displayedColumnInfo[uniqueName];
|
const column = displayedColumnInfo[uniqueName];
|
||||||
if (!column) continue;
|
if (!column) continue;
|
||||||
const condition = parseFilter(filter, getFilterType(column.commonType?.typeCode));
|
try {
|
||||||
if (condition) {
|
const condition = parseFilter(filter, getFilterType(column.commonType?.typeCode));
|
||||||
select.where = _.cloneDeepWith(condition, (expr: Expression) => {
|
if (condition) {
|
||||||
if (expr.exprType == 'placeholder')
|
select.where = _.cloneDeepWith(condition, (expr: Expression) => {
|
||||||
return {
|
if (expr.exprType == 'placeholder')
|
||||||
exprType: 'column',
|
return {
|
||||||
columnName: column.columnName,
|
exprType: 'column',
|
||||||
source: { alias: column.sourceAlias },
|
columnName: column.columnName,
|
||||||
};
|
source: { alias: column.sourceAlias },
|
||||||
});
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.warn(err.message);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user