]> git.localhorst.tv Git - alttp.git/commitdiff
better event filter inversion
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 23 May 2025 09:33:53 +0000 (11:33 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 23 May 2025 09:33:53 +0000 (11:33 +0200)
app/Http/Controllers/EpisodeController.php
resources/js/helpers/Episode.js
resources/js/pages/Schedule.js

index 22ca6dc1309464c370325a41e92ea3f7e6906f77..bfbb8a48f02dbf1549ad40ace4eba4e3106f2878 100644 (file)
@@ -195,6 +195,7 @@ class EpisodeController extends Controller
                        'before' => 'nullable|date',
                        'event' => 'nullable|array',
                        'event.*' => 'numeric',
+                       'eventInvert' => 'boolean',
                        'limit' => 'numeric',
                        'offset' => 'numeric',
                        'reverse' => 'boolean',
@@ -218,7 +219,11 @@ class EpisodeController extends Controller
                        $episodes = $episodes->where('episodes.start', '<=', $validatedData['before']);
                }
                if (!empty($validatedData['event'])) {
-                       $episodes = $episodes->whereIn('episodes.event_id', $validatedData['event']);
+                       if (isset($validatedData['eventInvert']) && $validatedData['eventInvert']) {
+                               $episodes = $episodes->whereNotIn('episodes.event_id', $validatedData['event']);
+                       } else {
+                               $episodes = $episodes->whereIn('episodes.event_id', $validatedData['event']);
+                       }
                }
                if ($request->user() && $request->user()->isPrivileged()) {
                        $episodes = $episodes->with(['crew', 'crew.user']);
index 696d39a811385f9a7ab357af777ea84377b1da53..dd7c0d81a2e6f48a66992eda45b0c33e12f0711d 100644 (file)
@@ -59,9 +59,15 @@ export const isActive = episode => {
 };
 
 export const isEventSelected = (filter, event) => {
-       return (filter.event || []).includes(event.id);
+       const found = (filter.event || []).includes(event.id);
+       return filter.eventInvert ? !found : found;
 };
 
+export const invertEventFilter = (filter) => ({
+       ...filter,
+       eventInvert: filter.eventInvert ? 0 : 1,
+});
+
 export const toggleEventFilter = (events, filter, event) => {
        const eventFilter = filter.event || [];
        if (eventFilter.includes(event.id)) {
index 50077390d1118ae7666ed46a25d2cebf688a150c..2b6a623a05006ef7ce4ec3e845447f04de1beb3d 100644 (file)
@@ -13,7 +13,7 @@ import ApplyDialog from '../components/episodes/ApplyDialog';
 import Filter from '../components/episodes/Filter';
 import List from '../components/episodes/List';
 import RestreamDialog from '../components/episodes/RestreamDialog';
-import { toggleEventFilter } from '../helpers/Episode';
+import { invertEventFilter, toggleEventFilter } from '../helpers/Episode';
 import { useUser } from '../hooks/user';
 
 export const Component = () => {
@@ -78,10 +78,8 @@ export const Component = () => {
        }, []);
 
        const invertFilter = React.useCallback(() => {
-               updateFilter(events.reduce((newFilter, event) => {
-                       return toggleEventFilter(events, newFilter, event);
-               }, filter));
-       }, [events, filter]);
+               updateFilter(invertEventFilter(filter));
+       }, [filter, updateFilter]);
 
        const fetchEpisodes = React.useCallback((controller, ahead, behind, filter) => {
                axios.get(`/api/episodes`, {