From d84edebc090f50cba12173053d54e20a46b4d504 Mon Sep 17 00:00:00 2001 From: npeter83 Date: Wed, 8 Jul 2026 23:19:23 +0200 Subject: [PATCH] fix(plex): explain an empty search when filters are also active MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A Plex search that returns nothing while a collection/rating filter is active showed a bare "No matches", hiding that the filters — not the query — were the cause. Show how many filters are narrowing the results and offer a one-click Clear filters inline. Translated in all three languages. --- frontend/src/components/PlexBrowse.tsx | 25 +++++++++++++++++++++++-- frontend/src/i18n/locales/de/plex.json | 2 ++ frontend/src/i18n/locales/en/plex.json | 2 ++ frontend/src/i18n/locales/hu/plex.json | 2 ++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/PlexBrowse.tsx b/frontend/src/components/PlexBrowse.tsx index ab80ddb..02a32a7 100644 --- a/frontend/src/components/PlexBrowse.tsx +++ b/frontend/src/components/PlexBrowse.tsx @@ -2,7 +2,14 @@ import { lazy, Suspense, useEffect, useLayoutEffect, useRef, useState, type CSSP import { useTranslation } from "react-i18next"; import { useInfiniteQuery, useQuery, useQueryClient } from "@tanstack/react-query"; import { ArrowLeft, CheckCircle2, Info, ListPlus, Play } from "lucide-react"; -import { api, type PlexCard, type PlexFilters, type PlexPerson } from "../lib/api"; +import { + api, + EMPTY_PLEX_FILTERS, + plexFilterCount, + type PlexCard, + type PlexFilters, + type PlexPerson, +} from "../lib/api"; import { useDebounced } from "../lib/useDebounced"; import { useHistorySubview } from "../lib/history"; import PlexPlaylistAdd, { type PlexAddTarget } from "./PlexPlaylistAdd"; @@ -267,7 +274,21 @@ export default function PlexBrowse({ {browseQ.isLoading ? (

{t("plex.loading")}

) : items.length === 0 ? ( -

{dq ? t("plex.noMatches") : t("plex.empty")}

+ dq && plexFilterCount(filters) > 0 ? ( + // A search that comes up empty WHILE filters are active is usually the filters, not the + // query — say so and offer a one-click escape, instead of a bare "No matches". +
+ {t("plex.noMatchesFiltered", { count: plexFilterCount(filters) })} + +
+ ) : ( +

{dq ? t("plex.noMatches") : t("plex.empty")}

+ ) ) : (
{items.map((c) => ( diff --git a/frontend/src/i18n/locales/de/plex.json b/frontend/src/i18n/locales/de/plex.json index 91489ca..c2beb8e 100644 --- a/frontend/src/i18n/locales/de/plex.json +++ b/frontend/src/i18n/locales/de/plex.json @@ -57,6 +57,8 @@ "count": "{{count}} Titel", "searchCount": "{{count}} Treffer", "noMatches": "Keine Treffer.", + "noMatchesFiltered_one": "Keine Treffer — ein Filter schränkt die Ergebnisse zusätzlich ein.", + "noMatchesFiltered_other": "Keine Treffer — {{count}} Filter schränken die Ergebnisse zusätzlich ein.", "loading": "Wird geladen…", "empty": "Noch nichts hier. Starte eine Plex-Synchronisierung auf der Admin-Konfigurationsseite.", "loadMore": "Mehr laden", diff --git a/frontend/src/i18n/locales/en/plex.json b/frontend/src/i18n/locales/en/plex.json index 8601de1..6909939 100644 --- a/frontend/src/i18n/locales/en/plex.json +++ b/frontend/src/i18n/locales/en/plex.json @@ -57,6 +57,8 @@ "count": "{{count}} titles", "searchCount": "{{count}} matches", "noMatches": "No matches.", + "noMatchesFiltered_one": "No matches — a filter is also narrowing the results.", + "noMatchesFiltered_other": "No matches — {{count}} filters are also narrowing the results.", "loading": "Loading…", "empty": "Nothing here yet. Run a Plex sync from the admin Config page.", "loadMore": "Load more", diff --git a/frontend/src/i18n/locales/hu/plex.json b/frontend/src/i18n/locales/hu/plex.json index a753fbe..53d8a79 100644 --- a/frontend/src/i18n/locales/hu/plex.json +++ b/frontend/src/i18n/locales/hu/plex.json @@ -57,6 +57,8 @@ "count": "{{count}} cím", "searchCount": "{{count}} találat", "noMatches": "Nincs találat.", + "noMatchesFiltered_one": "Nincs találat — egy szűrő is szűkíti az eredményt.", + "noMatchesFiltered_other": "Nincs találat — {{count}} szűrő is szűkíti az eredményt.", "loading": "Betöltés…", "empty": "Még nincs itt semmi. Futtass egy Plex-szinkront az admin Konfiguráció oldalról.", "loadMore": "Több betöltése",