Add MIME type.

master
Sander Vocke 6 years ago
parent 580dedb17f
commit 21040bca36
  1. 21
      src/queries.js
  2. 76
      src/userquerywidget.js

@ -181,6 +181,27 @@ export class TimeFilter extends ResultFilter {
simplify() { return this; }
}
export const ImageTypeEnum = {
PHOTO: 1,
VIDEO: 2,
}
export class ImageTypeFilter extends ResultFilter {
constructor(rtype, type) {
super(rtype);
this.type = type;
}
type = ImageTypeEnum.PHOTO;
to_sql_where() {
return "(Images.category=" + this.type + ")";
}
simplify() {
return this;
}
}
export class MatchingFilter extends ResultFilter {
constructor(rtype, from, mtype) {
super(rtype);

@ -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');
}

Loading…
Cancel
Save