fix: Improve review media filtering (#2322)

This commit is contained in:
Dermot Duffy
2026-01-24 16:22:12 -08:00
committed by GitHub
parent fc32727860
commit f4e905a7fb
37 changed files with 884 additions and 253 deletions
@@ -1,5 +1,7 @@
import { SetReviewActionConfig } from '../../../config/schema/actions/custom/set-review';
import { toggleReviewed } from '../../../utils/media-actions';
import { ViewItemClassifier } from '../../../view/item-classifier';
import { getReviewedQueryFilterFromQuery } from '../../../view/utils/query-filter';
import { CardActionsAPI } from '../../types';
import { AdvancedCameraCardAction } from './base';
@@ -7,7 +9,8 @@ export class SetReviewAction extends AdvancedCameraCardAction<SetReviewActionCon
public async execute(api: CardActionsAPI): Promise<void> {
await super.execute(api);
const view = api.getViewManager().getView();
const viewManager = api.getViewManager();
const view = viewManager.getView();
const queryResults = view?.queryResults;
const item = queryResults?.getSelectedResult();
@@ -15,20 +18,26 @@ export class SetReviewAction extends AdvancedCameraCardAction<SetReviewActionCon
return;
}
const targetReviewedState = this._action.reviewed ?? !item.isReviewed();
const targetReviewedState = this._action.reviewed;
if (targetReviewedState !== undefined && targetReviewedState === item.isReviewed()) {
return;
}
await api.getViewItemManager().reviewMedia(item, targetReviewedState);
const results = await Promise.all([
toggleReviewed(
item,
api.getViewItemManager(),
viewManager.getEpoch(),
getReviewedQueryFilterFromQuery(view?.query, item),
),
api
.getEffectsControllerAPI()
?.startEffect('check', { duration: 0.4, fadeIn: false }),
]);
// Clone the item to ensure Lit detects the change.
// Test-case: Setting a media item reviewed via the menu, should update the
// reviewed state in a thumbnail.
const clonedItem = item.clone();
clonedItem.setReviewed(targetReviewedState);
api.getViewManager().setViewByParameters({
params: {
queryResults: queryResults.clone().replaceItem(item, clonedItem),
},
});
// Trigger UI update to refresh menu icon state
if (results[0]) {
api.getCardElementManager().update();
}
}
}
@@ -3,7 +3,7 @@ import { MEDIA_CHUNK_SIZE_DEFAULT } from '../../const';
import { findBestMediaTimeIndex } from '../../utils/find-best-media-time-index';
import { QueryResults } from '../../view/query-results';
import { UnifiedQuery } from '../../view/unified-query';
import { MediaTypeSpec, UnifiedQueryBuilder } from '../../view/unified-query-builder';
import { UnifiedQueryBuilder } from '../../view/unified-query-builder';
import { UnifiedQueryRunner } from '../../view/unified-query-runner';
import { View } from '../../view/view';
import { CardViewAPI } from '../types';
@@ -126,8 +126,9 @@ export class ViewQueryExecutor {
case 'clips':
viewModifiers.push(
...(await executeQuery(
builder.buildCameraMediaQuery(MediaTypeSpec.clips(), {
builder.buildCameraMediaQuery('events', {
cameraID: cameraForQuery,
eventsSubtype: 'clips',
limit: this._getLimit(),
}),
)),
@@ -139,8 +140,9 @@ export class ViewQueryExecutor {
case 'snapshots':
viewModifiers.push(
...(await executeQuery(
builder.buildCameraMediaQuery(MediaTypeSpec.snapshots(), {
builder.buildCameraMediaQuery('events', {
cameraID: cameraForQuery,
eventsSubtype: 'snapshots',
limit: this._getLimit(),
}),
)),
@@ -151,7 +153,7 @@ export class ViewQueryExecutor {
case 'recordings':
viewModifiers.push(
...(await executeQuery(
builder.buildCameraMediaQuery(MediaTypeSpec.recordings(), {
builder.buildCameraMediaQuery('recordings', {
cameraID: cameraForQuery,
limit: this._getLimit(),
}),
@@ -163,7 +165,7 @@ export class ViewQueryExecutor {
case 'reviews':
viewModifiers.push(
...(await executeQuery(
builder.buildCameraMediaQuery(MediaTypeSpec.reviews(), {
builder.buildCameraMediaQuery('reviews', {
cameraID: cameraForQuery,
limit: this._getLimit(),
}),