'before' => 'nullable|date',
'event' => 'nullable|array',
'event.*' => 'numeric',
+ 'eventInvert' => 'boolean',
'limit' => 'numeric',
'offset' => 'numeric',
'reverse' => 'boolean',
$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']);
};
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)) {
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 = () => {
}, []);
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`, {