|
|
|
@ -1,4 +1,4 @@ |
|
|
|
|
import React, { useEffect } from 'react'; |
|
|
|
|
import React, { useEffect, useContext } from 'react'; |
|
|
|
|
|
|
|
|
|
import Switch from '@material-ui/core/Switch'; |
|
|
|
|
import Box from '@material-ui/core/Box'; |
|
|
|
@ -24,10 +24,12 @@ import { format } from 'date-fns'; |
|
|
|
|
|
|
|
|
|
import { makeStyles } from '@material-ui/core/styles'; |
|
|
|
|
|
|
|
|
|
import { polygonStore } from './polygons.js'; |
|
|
|
|
|
|
|
|
|
import { |
|
|
|
|
filter_is_const_false, ConstFilter, LogicalOperatorFilter, MatchingFilter, |
|
|
|
|
ResultTypeEnum, LogicalOperatorEnum, MatchTypeEnum, NegationFilter, TimeFilterTypeEnum, |
|
|
|
|
TimeFilter, ImageTypeFilter, ImageTypeEnum |
|
|
|
|
TimeFilter, ImageTypeFilter, ImageTypeEnum, LocationFilter |
|
|
|
|
} from './queries.js' |
|
|
|
|
import { Typography } from '@material-ui/core'; |
|
|
|
|
|
|
|
|
@ -55,6 +57,14 @@ const useStyles = makeStyles(theme => ({ |
|
|
|
|
}, |
|
|
|
|
})); |
|
|
|
|
|
|
|
|
|
export function EditLocationFilterExpression(props) { |
|
|
|
|
const { onChange, filter } = props; |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<Typography>TODO</Typography> |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function EditTimeFilterExpression(props) { |
|
|
|
|
const { onChange, filter } = props; |
|
|
|
|
|
|
|
|
@ -229,6 +239,8 @@ export function EditFilterExpressionDialog(props) { |
|
|
|
|
const { onClose, startingFilter, open } = props; |
|
|
|
|
const [filter, setFilter] = React.useState(startingFilter); |
|
|
|
|
|
|
|
|
|
const polygons_dispatch = useContext(polygonStore).dispatch; |
|
|
|
|
|
|
|
|
|
const FilterTypeEnum = { |
|
|
|
|
CONST: 0, |
|
|
|
|
NEGATION: 1, |
|
|
|
@ -236,6 +248,7 @@ export function EditFilterExpressionDialog(props) { |
|
|
|
|
LOGICAL: 3, |
|
|
|
|
TIME: 4, |
|
|
|
|
IMAGETYPE: 5, |
|
|
|
|
LOCATION: 6, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
|
@ -256,6 +269,8 @@ export function EditFilterExpressionDialog(props) { |
|
|
|
|
setFilter(new TimeFilter(filter.result_type, Date.now(), TimeFilterTypeEnum.AFTER)); |
|
|
|
|
} else if (val == FilterTypeEnum.IMAGETYPE) { |
|
|
|
|
setFilter(new ImageTypeFilter(filter.result_type, ImageTypeEnum.PHOTO)); |
|
|
|
|
} else if (val == FilterTypeEnum.LOCATION) { |
|
|
|
|
setFilter(new LocationFilter(filter.result_type, [[0.0, 0.0]], polygons_dispatch)); |
|
|
|
|
} else { |
|
|
|
|
throw new Error('Unsupported filter type: ' + val); |
|
|
|
|
} |
|
|
|
@ -268,6 +283,7 @@ export function EditFilterExpressionDialog(props) { |
|
|
|
|
else if (filter instanceof LogicalOperatorFilter) { return FilterTypeEnum.LOGICAL; } |
|
|
|
|
else if (filter instanceof TimeFilter) { return FilterTypeEnum.TIME; } |
|
|
|
|
else if (filter instanceof ImageTypeFilter) { return FilterTypeEnum.IMAGETYPE; } |
|
|
|
|
else if (filter instanceof LocationFilter) { return FilterTypeEnum.LOCATION; } |
|
|
|
|
else { |
|
|
|
|
throw new Error('Unsupported filter type: ' + filter); |
|
|
|
|
} |
|
|
|
@ -293,6 +309,8 @@ export function EditFilterExpressionDialog(props) { |
|
|
|
|
control = <EditTimeFilterExpression {...subprops} /> |
|
|
|
|
} else if (filter instanceof ImageTypeFilter) { |
|
|
|
|
control = <EditImageTypeFilterExpression {...subprops} /> |
|
|
|
|
} else if (filter instanceof LocationFilter) { |
|
|
|
|
control = <EditLocationFilterExpression {...subprops} /> |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// If this is a "leaf" filter, we will allow changing the filter type in the dialog.
|
|
|
|
@ -302,7 +320,8 @@ export function EditFilterExpressionDialog(props) { |
|
|
|
|
(filter instanceof ConstFilter) || |
|
|
|
|
(filter instanceof MatchingFilter) || |
|
|
|
|
(filter instanceof TimeFilter) || |
|
|
|
|
(filter instanceof ImageTypeFilter); |
|
|
|
|
(filter instanceof ImageTypeFilter) || |
|
|
|
|
(filter instanceof LocationFilter); |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<Dialog aria-labelledby={id} open={open}> |
|
|
|
@ -319,6 +338,7 @@ export function EditFilterExpressionDialog(props) { |
|
|
|
|
<MenuItem value={FilterTypeEnum.MATCHING}>Matching</MenuItem> |
|
|
|
|
<MenuItem value={FilterTypeEnum.TIME}>Date/Time</MenuItem> |
|
|
|
|
<MenuItem value={FilterTypeEnum.IMAGETYPE}>Media type</MenuItem> |
|
|
|
|
<MenuItem value={FilterTypeEnum.LOCATION}>Location</MenuItem> |
|
|
|
|
</Select> |
|
|
|
|
</FormControl> |
|
|
|
|
} |
|
|
|
@ -567,9 +587,9 @@ export function ImageTypeFilterExpressionControl(props) { |
|
|
|
|
const { expr, onClick, onChange } = props; |
|
|
|
|
|
|
|
|
|
var icon = false; |
|
|
|
|
if(expr.type == ImageTypeEnum.PHOTO) { |
|
|
|
|
if (expr.type == ImageTypeEnum.PHOTO) { |
|
|
|
|
icon = <PhotoIcon /> |
|
|
|
|
} else if(expr.type == ImageTypeEnum.VIDEO) { |
|
|
|
|
} else if (expr.type == ImageTypeEnum.VIDEO) { |
|
|
|
|
icon = <VideocamIcon /> |
|
|
|
|
} else { |
|
|
|
|
throw new Error("Unsupported image type"); |
|
|
|
@ -587,6 +607,22 @@ export function ImageTypeFilterExpressionControl(props) { |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function LocationFilterExpressionControl(props) { |
|
|
|
|
const classes = useStyles(); |
|
|
|
|
const { expr, onClick, onChange } = props; |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<Button |
|
|
|
|
variant="outlined" |
|
|
|
|
className={classes.filterexpcontrol} |
|
|
|
|
aria-controls="simple-menu" aria-haspopup="true" |
|
|
|
|
onClick={onClick} |
|
|
|
|
> |
|
|
|
|
LOCATION |
|
|
|
|
</Button> |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function FilterExpressionControl(props) { |
|
|
|
|
const { expr, onChange, isRoot } = props; |
|
|
|
|
const [anchorEl, setAnchorEl] = React.useState(null); |
|
|
|
@ -676,6 +712,8 @@ export function FilterExpressionControl(props) { |
|
|
|
|
filter_elem = <TimeFilterExpressionControl {...props} onClick={handleClick} onChange={onChange} /> |
|
|
|
|
} else if (expr instanceof ImageTypeFilter) { |
|
|
|
|
filter_elem = <ImageTypeFilterExpressionControl {...props} onClick={handleClick} onChange={onChange} /> |
|
|
|
|
} else if (expr instanceof LocationFilter) { |
|
|
|
|
filter_elem = <LocationFilterExpressionControl {...props} onClick={handleClick} onChange={onChange} /> |
|
|
|
|
} else { |
|
|
|
|
throw new Error('Unsupported filter expression'); |
|
|
|
|
} |
|
|
|
|