diff --git a/src/userquerywidget.js b/src/userquerywidget.js index 76c82e2..e525c67 100644 --- a/src/userquerywidget.js +++ b/src/userquerywidget.js @@ -245,11 +245,21 @@ export function LogicalOperatorFilterExpressionControl(props) { var _ = require('lodash'); const handleAChanged = (new_a) => { + if (new_a == null) { + onChange(expr.sub_filter_b); + return; + } + var new_me = _.cloneDeep(expr); new_me.sub_filter_a = new_a; onChange(new_me); } const handleBChanged = (new_b) => { + if (new_b == null) { + onChange(expr.sub_filter_a); + return; + } + var new_me = _.cloneDeep(expr); new_me.sub_filter_b = new_b; onChange(new_me); @@ -261,12 +271,12 @@ export function LogicalOperatorFilterExpressionControl(props) { - + - + @@ -300,9 +310,16 @@ export function ConstFilterExpressionControl(props) { } export function FilterExpressionControl(props) { - const { expr, onChange } = props; + const { expr, onChange, isRoot } = props; const [anchorEl, setAnchorEl] = React.useState(null); const [editDialogOpen, setEditDialogOpen] = React.useState(false); + const [combineDialogOpen, setCombineDialogOpen] = React.useState(false); + const [combineExpr, setCombineExpr] = React.useState(new LogicalOperatorFilter( + expr.result_type, + expr, + new ConstFilter(expr.result_type, true), + LogicalOperatorEnum.AND) + ); var _ = require('lodash'); const menu_id = _.uniqueId("filter_menu_"); @@ -322,9 +339,40 @@ export function FilterExpressionControl(props) { const handleCloseEditFilterDialog = (filter) => { setEditDialogOpen(false); - onChange(filter); + onChange(filter.simplify()); }; + const handleRemove = () => { + onChange(null); + } + + const handleCloseCombineDialog = (filter) => { + setCombineDialogOpen(false); + var new_filter = _.cloneDeep(combineExpr); + new_filter.sub_filter_b = filter; + onChange(new_filter.simplify()); + } + + const handleAnd = () => { + handleCloseMenu(); + setCombineExpr(new LogicalOperatorFilter( + expr.result_type, + expr, + new ConstFilter(expr.result_type, true), LogicalOperatorEnum.AND + )); + setCombineDialogOpen(true); + } + + const handleOr = () => { + handleCloseMenu(); + setCombineExpr(new LogicalOperatorFilter( + expr.result_type, + expr, + new ConstFilter(expr.result_type, true), LogicalOperatorEnum.OR + )); + setCombineDialogOpen(true); + } + var filter_elem = false; if (expr instanceof ConstFilter) { filter_elem = @@ -346,13 +394,21 @@ export function FilterExpressionControl(props) { open={Boolean(anchorEl)} onClose={handleCloseMenu} > - Edit + Edit... + And... + Or... + {!isRoot && Remove} + ); } @@ -385,7 +441,7 @@ export function FilterControl(props) { } label={resultTypeString + ':'} /> - + );