diff --git a/src/queries.js b/src/queries.js
index f81a570..04b49e3 100644
--- a/src/queries.js
+++ b/src/queries.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);
diff --git a/src/userquerywidget.js b/src/userquerywidget.js
index 92b2a0c..29cf0c9 100644
--- a/src/userquerywidget.js
+++ b/src/userquerywidget.js
@@ -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 (
+
+
+
+ );
+}
+
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 =
} else if (filter instanceof TimeFilter) {
control =
+ } else if (filter instanceof ImageTypeFilter) {
+ control =
}
// 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 (