|
|
|
@ -16,16 +16,18 @@ import Dialog from '@material-ui/core/Dialog'; |
|
|
|
|
import Select from '@material-ui/core/Select'; |
|
|
|
|
import TextField from '@material-ui/core/TextField'; |
|
|
|
|
import ScheduleIcon from '@material-ui/icons/Schedule'; |
|
|
|
|
import VideocamIcon from '@material-ui/icons/Videocam'; |
|
|
|
|
import { MuiPickersUtilsProvider, DateTimePicker } from "@material-ui/pickers"; |
|
|
|
|
|
|
|
|
|
import DateFnsUtils from '@date-io/date-fns'; |
|
|
|
|
import { format } from 'date-fns'; |
|
|
|
|
import { MuiPickersUtilsProvider, DateTimePicker } from "@material-ui/pickers"; |
|
|
|
|
|
|
|
|
|
import { makeStyles } from '@material-ui/core/styles'; |
|
|
|
|
|
|
|
|
|
import { |
|
|
|
|
filter_is_const_false, ConstFilter, LogicalOperatorFilter, MatchingFilter, |
|
|
|
|
ResultTypeEnum, LogicalOperatorEnum, MatchTypeEnum, NegationFilter, TimeFilterTypeEnum, |
|
|
|
|
TimeFilter |
|
|
|
|
TimeFilter, ImageTypeFilter, ImageTypeEnum |
|
|
|
|
} from './queries.js' |
|
|
|
|
import { Typography } from '@material-ui/core'; |
|
|
|
|
|
|
|
|
@ -95,6 +97,34 @@ export function EditTimeFilterExpression(props) { |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function EditImageTypeFilterExpression(props) { |
|
|
|
|
const { onChange, filter } = props; |
|
|
|
|
|
|
|
|
|
var _ = require('lodash'); |
|
|
|
|
const id = _.uniqueId("type_filter_"); |
|
|
|
|
const labelid = _.uniqueId("type_filter_label_"); |
|
|
|
|
|
|
|
|
|
function handleChangeType(e) { |
|
|
|
|
var newfilter = _.cloneDeep(filter); |
|
|
|
|
newfilter.type = e.target.value; |
|
|
|
|
onChange(newfilter); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<FormControl> |
|
|
|
|
<Select |
|
|
|
|
labelId={labelid} |
|
|
|
|
id={id} |
|
|
|
|
value={filter.type} |
|
|
|
|
onChange={handleChangeType} |
|
|
|
|
> |
|
|
|
|
<MenuItem value={ImageTypeEnum.PHOTO}>Photo</MenuItem> |
|
|
|
|
<MenuItem value={ImageTypeEnum.VIDEO}>Video</MenuItem> |
|
|
|
|
</Select> |
|
|
|
|
</FormControl> |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function EditConstFilterExpression(props) { |
|
|
|
|
const { onChange, filter } = props; |
|
|
|
|
|
|
|
|
@ -205,6 +235,7 @@ export function EditFilterExpressionDialog(props) { |
|
|
|
|
MATCHING: 2, |
|
|
|
|
LOGICAL: 3, |
|
|
|
|
TIME: 4, |
|
|
|
|
IMAGETYPE: 5, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
|
@ -223,6 +254,8 @@ export function EditFilterExpressionDialog(props) { |
|
|
|
|
setFilter(new MatchingFilter(filter.result_type, "", MatchTypeEnum.MATCH_IMAGE_NAME_NATURAL)); |
|
|
|
|
} else if (val == FilterTypeEnum.TIME) { |
|
|
|
|
setFilter(new TimeFilter(filter.result_type, Date.now(), TimeFilterTypeEnum.AFTER)); |
|
|
|
|
} else if (val == FilterTypeEnum.IMAGETYPE) { |
|
|
|
|
setFilter(new ImageTypeFilter(filter.result_type, ImageTypeEnum.PHOTO)); |
|
|
|
|
} else { |
|
|
|
|
throw new Error('Unsupported filter type: ' + val); |
|
|
|
|
} |
|
|
|
@ -234,6 +267,7 @@ export function EditFilterExpressionDialog(props) { |
|
|
|
|
else if (filter instanceof MatchingFilter) { return FilterTypeEnum.MATCHING; } |
|
|
|
|
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 { |
|
|
|
|
throw new Error('Unsupported filter type: ' + filter); |
|
|
|
|
} |
|
|
|
@ -257,6 +291,8 @@ export function EditFilterExpressionDialog(props) { |
|
|
|
|
control = <EditMatchingFilterExpression {...subprops} /> |
|
|
|
|
} else if (filter instanceof TimeFilter) { |
|
|
|
|
control = <EditTimeFilterExpression {...subprops} /> |
|
|
|
|
} else if (filter instanceof ImageTypeFilter) { |
|
|
|
|
control = <EditImageTypeFilterExpression {...subprops} /> |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// If this is a "leaf" filter, we will allow changing the filter type in the dialog.
|
|
|
|
@ -264,7 +300,9 @@ export function EditFilterExpressionDialog(props) { |
|
|
|
|
// That throws away all its children.
|
|
|
|
|
const allowTypeChange = |
|
|
|
|
(filter instanceof ConstFilter) || |
|
|
|
|
(filter instanceof MatchingFilter); |
|
|
|
|
(filter instanceof MatchingFilter) || |
|
|
|
|
(filter instanceof TimeFilter) || |
|
|
|
|
(filter instanceof ImageTypeFilter); |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<Dialog aria-labelledby={id} open={open}> |
|
|
|
@ -279,7 +317,8 @@ export function EditFilterExpressionDialog(props) { |
|
|
|
|
> |
|
|
|
|
<MenuItem value={FilterTypeEnum.CONST}>Constant</MenuItem> |
|
|
|
|
<MenuItem value={FilterTypeEnum.MATCHING}>Matching</MenuItem> |
|
|
|
|
<MenuItem value={FilterTypeEnum.TIME}>Date / Time</MenuItem> |
|
|
|
|
<MenuItem value={FilterTypeEnum.TIME}>Date/Time</MenuItem> |
|
|
|
|
<MenuItem value={FilterTypeEnum.IMAGETYPE}>Media type</MenuItem> |
|
|
|
|
</Select> |
|
|
|
|
</FormControl> |
|
|
|
|
} |
|
|
|
@ -509,7 +548,7 @@ export function TimeFilterExpressionControl(props) { |
|
|
|
|
throw new Error("Unsupported time filter type."); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const datestr = format( expr.time, "yyyy-MM-dd, HH:mm:ss"); |
|
|
|
|
const datestr = format(expr.time, "yyyy-MM-dd, HH:mm:ss"); |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<Button |
|
|
|
@ -523,6 +562,31 @@ export function TimeFilterExpressionControl(props) { |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function ImageTypeFilterExpressionControl(props) { |
|
|
|
|
const classes = useStyles(); |
|
|
|
|
const { expr, onClick, onChange } = props; |
|
|
|
|
|
|
|
|
|
var icon = false; |
|
|
|
|
if(expr.type == ImageTypeEnum.PHOTO) { |
|
|
|
|
icon = <PhotoIcon /> |
|
|
|
|
} else if(expr.type == ImageTypeEnum.VIDEO) { |
|
|
|
|
icon = <VideocamIcon /> |
|
|
|
|
} else { |
|
|
|
|
throw new Error("Unsupported image type"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<Button |
|
|
|
|
variant="outlined" |
|
|
|
|
className={classes.filterexpcontrol} |
|
|
|
|
aria-controls="simple-menu" aria-haspopup="true" |
|
|
|
|
onClick={onClick} |
|
|
|
|
endIcon={icon}> |
|
|
|
|
Type: |
|
|
|
|
</Button> |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function FilterExpressionControl(props) { |
|
|
|
|
const { expr, onChange, isRoot } = props; |
|
|
|
|
const [anchorEl, setAnchorEl] = React.useState(null); |
|
|
|
@ -610,6 +674,8 @@ export function FilterExpressionControl(props) { |
|
|
|
|
filter_elem = <NegationExpressionControl {...props} onClick={handleClick} onChange={onChange} /> |
|
|
|
|
} else if (expr instanceof TimeFilter) { |
|
|
|
|
filter_elem = <TimeFilterExpressionControl {...props} onClick={handleClick} onChange={onChange} /> |
|
|
|
|
} else if (expr instanceof ImageTypeFilter) { |
|
|
|
|
filter_elem = <ImageTypeFilterExpressionControl {...props} onClick={handleClick} onChange={onChange} /> |
|
|
|
|
} else { |
|
|
|
|
throw new Error('Unsupported filter expression'); |
|
|
|
|
} |
|
|
|
|