From 21040bca36e57b44562c9e9624b7a4c8b18414c8 Mon Sep 17 00:00:00 2001 From: Sander Vocke Date: Fri, 31 Jan 2020 00:18:09 +0059 Subject: [PATCH] Add MIME type. --- src/queries.js | 21 ++++++++++++ src/userquerywidget.js | 76 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 92 insertions(+), 5 deletions(-) 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 ( @@ -279,7 +317,8 @@ export function EditFilterExpressionDialog(props) { > Constant Matching - Date / Time + Date/Time + Media type } @@ -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 ( + ); +} + 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 = } else if (expr instanceof TimeFilter) { filter_elem = + } else if (expr instanceof ImageTypeFilter) { + filter_elem = } else { throw new Error('Unsupported filter expression'); }