@@ -11,7 +11,7 @@ import {
1111 sub ,
1212} from 'date-fns' ;
1313import { LitElement } from 'lit' ;
14- import { isEqual , orderBy , uniqWith } from 'lodash-es' ;
14+ import { isEqual , orderBy } from 'lodash-es' ;
1515import { CameraManager , CameraQueryClassifier } from '../camera-manager/manager' ;
1616import { DateRange , PartialDateRange } from '../camera-manager/range' ;
1717import {
@@ -25,6 +25,7 @@ import { ViewManagerInterface } from '../card-controller/view/types';
2525import { SelectOption , SelectValues } from '../components/select' ;
2626import { CardWideConfig } from '../config/schema/types' ;
2727import { localize } from '../localize/localize' ;
28+ import { SEVERITIES , Severity } from '../severity' ;
2829import { ViewMediaType } from '../types' ;
2930import { errorToConsole , formatDate , prettifyTitle } from '../utils/basic' ;
3031import { UnifiedQueryBuilder } from '../view/unified-query-builder' ;
@@ -38,6 +39,7 @@ export interface MediaFilterCoreDefaults {
3839 when ?: string ;
3940 where ?: string [ ] ;
4041 tags ?: string [ ] ;
42+ severity ?: Severity [ ] ;
4143}
4244
4345export enum MediaFilterCoreFavoriteSelection {
@@ -80,6 +82,7 @@ export class MediaFilterController {
8082 protected _tagsOptions : SelectOption [ ] = [ ] ;
8183 protected _favoriteOptions : SelectOption [ ] ;
8284 protected _reviewedOptions : SelectOption [ ] ;
85+ protected _severityOptions : SelectOption [ ] ;
8386
8487 protected _defaults : MediaFilterCoreDefaults | null = null ;
8588 protected _viewManager : ViewManagerInterface | null = null ;
@@ -125,6 +128,10 @@ export class MediaFilterController {
125128 label : localize ( 'media_filter.not_reviewed' ) ,
126129 } ,
127130 ] ;
131+ this . _severityOptions = SEVERITIES . map ( ( severity ) => ( {
132+ value : severity ,
133+ label : localize ( `common.severities.${ severity } ` ) ,
134+ } ) ) ;
128135 this . _staticWhenOptions = [
129136 {
130137 value : MediaFilterCoreWhen . Today ,
@@ -174,6 +181,9 @@ export class MediaFilterController {
174181 public getReviewedOptions ( ) : SelectOption [ ] {
175182 return this . _reviewedOptions ;
176183 }
184+ public getSeverityOptions ( ) : SelectOption [ ] {
185+ return this . _severityOptions ;
186+ }
177187 public getDefaults ( ) : MediaFilterCoreDefaults | null {
178188 return this . _defaults ;
179189 }
@@ -198,6 +208,7 @@ export class MediaFilterController {
198208 where ?: SelectValues ;
199209 what ?: SelectValues ;
200210 tags ?: SelectValues ;
211+ severity ?: SelectValues ;
201212 } ,
202213 // eslint-disable-next-line @typescript-eslint/no-unused-vars
203214 _ev ?: unknown ,
@@ -221,6 +232,7 @@ export class MediaFilterController {
221232 const where = getArrayValueAsSet ( values . where ) ;
222233 const what = getArrayValueAsSet ( values . what ) ;
223234 const tags = getArrayValueAsSet ( values . tags ) ;
235+ const severity = getArrayValueAsSet < Severity > ( values . severity ) ;
224236 const limit = cardWideConfig . performance ?. features . media_chunk_size ;
225237
226238 const builder = new UnifiedQueryBuilder ( cameraManager , foldersManager ) ;
@@ -236,6 +248,7 @@ export class MediaFilterController {
236248 ...( tags && { tags } ) ,
237249 ...( what && { what } ) ,
238250 ...( where && { where } ) ,
251+ ...( severity && { severity } ) ,
239252 } ,
240253 ) ;
241254
@@ -280,6 +293,7 @@ export class MediaFilterController {
280293 let favorite : MediaFilterCoreFavoriteSelection | undefined ;
281294 let reviewed : MediaFilterCoreReviewedSelection | undefined ;
282295 let tags : string [ ] | undefined ;
296+ let severity : Severity [ ] | undefined ;
283297
284298 const cameraIDsFromQuery = query . getAllCameraIDs ( ) ;
285299
@@ -326,44 +340,38 @@ export class MediaFilterController {
326340 mediaTypes . push ( MediaFilterMediaType . Reviews ) ;
327341 }
328342
329- if ( eventQueries . length > 0 ) {
330- const whatSets = uniqWith (
331- eventQueries . map ( ( q ) => q . what ) ,
332- isEqual ,
333- ) ;
334- if ( whatSets . length === 1 && eventQueries [ 0 ] . what ?. size ) {
335- what = [ ...eventQueries [ 0 ] . what ] ;
336- }
337- const whereSets = uniqWith (
338- eventQueries . map ( ( q ) => q . where ) ,
339- isEqual ,
340- ) ;
341- if ( whereSets . length === 1 && eventQueries [ 0 ] . where ?. size ) {
342- where = [ ...eventQueries [ 0 ] . where ] ;
343- }
344- const tagsSets = uniqWith (
345- eventQueries . map ( ( q ) => q . tags ) ,
346- isEqual ,
347- ) ;
348- if ( tagsSets . length === 1 && eventQueries [ 0 ] . tags ?. size ) {
349- tags = [ ...eventQueries [ 0 ] . tags ] ;
350- }
343+ const whatSets = eventQueries . map ( ( q ) => q . what ) ;
344+ if ( this . _hasSingleUniqueValue ( whatSets ) && whatSets [ 0 ] ?. size ) {
345+ what = [ ...whatSets [ 0 ] ] ;
346+ }
347+
348+ const whereSets = eventQueries . map ( ( q ) => q . where ) ;
349+ if ( this . _hasSingleUniqueValue ( whereSets ) && whereSets [ 0 ] ?. size ) {
350+ where = [ ...whereSets [ 0 ] ] ;
351+ }
352+
353+ const tagsSets = eventQueries . map ( ( q ) => q . tags ) ;
354+ if ( this . _hasSingleUniqueValue ( tagsSets ) && tagsSets [ 0 ] ?. size ) {
355+ tags = [ ...tagsSets [ 0 ] ] ;
351356 }
352357
353358 // Extract reviewed from review queries (only if explicitly set to true/false)
354359 const reviewQueries = query . getMediaQueries < ReviewQuery > ( { type : QueryType . Review } ) ;
355- if ( reviewQueries . length > 0 ) {
356- const reviewedValues = new Set ( reviewQueries . map ( ( q ) => q . reviewed ) ) ;
357- if ( reviewedValues . size === 1 ) {
358- const rev = [ ...reviewedValues ] [ 0 ] ;
359- if ( rev !== undefined ) {
360- reviewed = rev
361- ? MediaFilterCoreReviewedSelection . Reviewed
362- : MediaFilterCoreReviewedSelection . NotReviewed ;
363- }
360+ const reviewedValues = new Set ( reviewQueries . map ( ( q ) => q . reviewed ) ) ;
361+ if ( reviewedValues . size === 1 ) {
362+ const rev = [ ...reviewedValues ] [ 0 ] ;
363+ if ( rev !== undefined ) {
364+ reviewed = rev
365+ ? MediaFilterCoreReviewedSelection . Reviewed
366+ : MediaFilterCoreReviewedSelection . NotReviewed ;
364367 }
365368 }
366369
370+ const severitySets = reviewQueries . map ( ( q ) => q . severity ) ;
371+ if ( this . _hasSingleUniqueValue ( severitySets ) && severitySets [ 0 ] ?. size ) {
372+ severity = [ ...severitySets [ 0 ] ] ;
373+ }
374+
367375 this . _defaults = {
368376 ...( mediaTypes . length && { mediaTypes } ) ,
369377 ...( cameraIDs && { cameraIDs } ) ,
@@ -372,6 +380,7 @@ export class MediaFilterController {
372380 ...( favorite !== undefined && { favorite } ) ,
373381 ...( reviewed !== undefined && { reviewed } ) ,
374382 ...( tags && { tags } ) ,
383+ ...( severity && { severity } ) ,
375384 } ;
376385 }
377386
@@ -489,4 +498,11 @@ export class MediaFilterController {
489498 return this . _stringToDateRange ( values . selected ) ;
490499 }
491500 }
501+
502+ protected _hasSingleUniqueValue ( sets : ( Set < unknown > | undefined ) [ ] ) : boolean {
503+ if ( sets . length === 0 ) {
504+ return false ;
505+ }
506+ return sets . every ( ( s ) => isEqual ( s , sets [ 0 ] ) ) ;
507+ }
492508}
0 commit comments