diff --git a/ui/v2.5/src/components/List/Filters/LabeledIdFilter.tsx b/ui/v2.5/src/components/List/Filters/LabeledIdFilter.tsx index ef309ecde..200c16917 100644 --- a/ui/v2.5/src/components/List/Filters/LabeledIdFilter.tsx +++ b/ui/v2.5/src/components/List/Filters/LabeledIdFilter.tsx @@ -321,18 +321,24 @@ export function useCriterion( return { criterion, setCriterion }; } +export interface IUseQueryHookProps { + q: string; + filter?: ListFilterModel; + filterHook?: (filter: ListFilterModel) => ListFilterModel; + skip: boolean; +} + export function useQueryState( - useQuery: ( - q: string, - filter: ListFilterModel, - skip: boolean - ) => ILoadResults, + useQuery: (props: IUseQueryHookProps) => ILoadResults, filter: ListFilterModel, - skip: boolean + skip: boolean, + options?: { + filterHook?: (filter: ListFilterModel) => ListFilterModel; + } ) { const [query, setQuery] = useState(""); const { results: queryResults } = useCacheResults( - useQuery(query, filter, skip) + useQuery({ q: query, filter, filterHook: options?.filterHook, skip }) ); return { query, setQuery, queryResults }; @@ -431,11 +437,8 @@ export function useLabeledIdFilterState(props: { option: CriterionOption; filter: ListFilterModel; setFilter: (f: ListFilterModel) => void; - useQuery: ( - q: string, - filter: ListFilterModel, - skip: boolean - ) => ILoadResults; + filterHook?: (filter: ListFilterModel) => ListFilterModel; + useQuery: (props: IUseQueryHookProps) => ILoadResults; singleValue?: boolean; hierarchical?: boolean; includeSubMessageID?: string; @@ -444,6 +447,7 @@ export function useLabeledIdFilterState(props: { option, filter, setFilter, + filterHook, useQuery, singleValue = false, hierarchical = false, @@ -456,7 +460,8 @@ export function useLabeledIdFilterState(props: { const { query, setQuery, queryResults } = useQueryState( useQuery, filter, - skip + skip, + { filterHook } ); const { criterion, setCriterion } = useCriterion(option, filter, setFilter); diff --git a/ui/v2.5/src/components/List/Filters/PerformersFilter.tsx b/ui/v2.5/src/components/List/Filters/PerformersFilter.tsx index 84e3dd19b..79ad18c1b 100644 --- a/ui/v2.5/src/components/List/Filters/PerformersFilter.tsx +++ b/ui/v2.5/src/components/List/Filters/PerformersFilter.tsx @@ -12,6 +12,7 @@ import { sortByRelevance } from "src/utils/query"; import { ListFilterModel } from "src/models/list-filter/filter"; import { CriterionOption } from "src/models/list-filter/criteria/criterion"; import { + IUseQueryHookProps, makeQueryVariables, setObjectFilter, useLabeledIdFilterState, @@ -69,13 +70,12 @@ function sortResults( }); } -function usePerformerQueryFilter( - query: string, - f?: ListFilterModel, - skip?: boolean -) { +function usePerformerQueryFilter(props: IUseQueryHookProps) { + const { q: query, filter: f, skip, filterHook } = props; + const appliedFilter = filterHook && f ? filterHook(f.clone()) : f; + const { data, loading } = useFindPerformersForSelectQuery({ - variables: queryVariables(query, f), + variables: queryVariables(query, appliedFilter), skip, }); @@ -88,7 +88,7 @@ function usePerformerQueryFilter( } function usePerformerQuery(query: string, skip?: boolean) { - return usePerformerQueryFilter(query, undefined, skip); + return usePerformerQueryFilter({ q: query, skip: !!skip }); } const PerformersFilter: React.FC = ({ @@ -109,10 +109,12 @@ export const SidebarPerformersFilter: React.FC<{ option: CriterionOption; filter: ListFilterModel; setFilter: (f: ListFilterModel) => void; -}> = ({ title, option, filter, setFilter }) => { + filterHook?: (f: ListFilterModel) => ListFilterModel; +}> = ({ title, option, filter, setFilter, filterHook }) => { const state = useLabeledIdFilterState({ filter, setFilter, + filterHook, option, useQuery: usePerformerQueryFilter, }); diff --git a/ui/v2.5/src/components/List/Filters/StudiosFilter.tsx b/ui/v2.5/src/components/List/Filters/StudiosFilter.tsx index e9c05013d..9065f2452 100644 --- a/ui/v2.5/src/components/List/Filters/StudiosFilter.tsx +++ b/ui/v2.5/src/components/List/Filters/StudiosFilter.tsx @@ -10,6 +10,7 @@ import { sortByRelevance } from "src/utils/query"; import { CriterionOption } from "src/models/list-filter/criteria/criterion"; import { ListFilterModel } from "src/models/list-filter/filter"; import { + IUseQueryHookProps, makeQueryVariables, setObjectFilter, useLabeledIdFilterState, @@ -56,13 +57,12 @@ function sortResults( }); } -function useStudioQueryFilter( - query: string, - filter?: ListFilterModel, - skip?: boolean -) { +function useStudioQueryFilter(props: IUseQueryHookProps) { + const { q: query, filter: f, skip, filterHook } = props; + const appliedFilter = filterHook && f ? filterHook(f.clone()) : f; + const { data, loading } = useFindStudiosForSelectQuery({ - variables: queryVariables(query, filter), + variables: queryVariables(query, appliedFilter), skip, }); @@ -75,7 +75,7 @@ function useStudioQueryFilter( } function useStudioQuery(query: string, skip?: boolean) { - return useStudioQueryFilter(query, undefined, skip); + return useStudioQueryFilter({ q: query, skip: !!skip }); } const StudiosFilter: React.FC = ({ @@ -97,10 +97,12 @@ export const SidebarStudiosFilter: React.FC<{ option: CriterionOption; filter: ListFilterModel; setFilter: (f: ListFilterModel) => void; -}> = ({ title, option, filter, setFilter }) => { + filterHook?: (f: ListFilterModel) => ListFilterModel; +}> = ({ title, option, filter, setFilter, filterHook }) => { const state = useLabeledIdFilterState({ filter, setFilter, + filterHook, option, useQuery: useStudioQueryFilter, singleValue: true, diff --git a/ui/v2.5/src/components/List/Filters/TagsFilter.tsx b/ui/v2.5/src/components/List/Filters/TagsFilter.tsx index 0a3f8c942..e8e25db56 100644 --- a/ui/v2.5/src/components/List/Filters/TagsFilter.tsx +++ b/ui/v2.5/src/components/List/Filters/TagsFilter.tsx @@ -10,6 +10,7 @@ import { sortByRelevance } from "src/utils/query"; import { CriterionOption } from "src/models/list-filter/criteria/criterion"; import { ListFilterModel } from "src/models/list-filter/filter"; import { + IUseQueryHookProps, makeQueryVariables, setObjectFilter, useLabeledIdFilterState, @@ -65,13 +66,12 @@ function sortResults( }); } -function useTagQueryFilter( - query: string, - filter?: ListFilterModel, - skip?: boolean -) { +function useTagQueryFilter(props: IUseQueryHookProps) { + const { q: query, filter: f, skip, filterHook } = props; + const appliedFilter = filterHook && f ? filterHook(f.clone()) : f; + const { data, loading } = useFindTagsForSelectQuery({ - variables: queryVariables(query, filter), + variables: queryVariables(query, appliedFilter), skip, }); @@ -84,7 +84,7 @@ function useTagQueryFilter( } function useTagQuery(query: string, skip?: boolean) { - return useTagQueryFilter(query, undefined, skip); + return useTagQueryFilter({ q: query, skip: !!skip }); } const TagsFilter: React.FC = ({ criterion, setCriterion }) => { @@ -102,10 +102,12 @@ export const SidebarTagsFilter: React.FC<{ option: CriterionOption; filter: ListFilterModel; setFilter: (f: ListFilterModel) => void; -}> = ({ title, option, filter, setFilter }) => { + filterHook?: (f: ListFilterModel) => ListFilterModel; +}> = ({ title, option, filter, setFilter, filterHook }) => { const state = useLabeledIdFilterState({ filter, setFilter, + filterHook, option, useQuery: useTagQueryFilter, hierarchical: true, diff --git a/ui/v2.5/src/components/Scenes/SceneList.tsx b/ui/v2.5/src/components/Scenes/SceneList.tsx index a35864f97..0420de93c 100644 --- a/ui/v2.5/src/components/Scenes/SceneList.tsx +++ b/ui/v2.5/src/components/Scenes/SceneList.tsx @@ -235,6 +235,7 @@ const ScenesFilterSidebarSections = PatchContainerComponent( const SidebarContent: React.FC<{ filter: ListFilterModel; setFilter: (filter: ListFilterModel) => void; + filterHook?: (filter: ListFilterModel) => ListFilterModel; view?: View; sidebarOpen: boolean; onClose?: () => void; @@ -243,6 +244,7 @@ const SidebarContent: React.FC<{ }> = ({ filter, setFilter, + filterHook, view, showEditFilter, sidebarOpen, @@ -252,6 +254,8 @@ const SidebarContent: React.FC<{ const showResultsId = count !== undefined ? "actions.show_count_results" : "actions.show_results"; + const hideStudios = view === View.StudioScenes; + return ( <> - } - data-type={StudiosCriterionOption.type} - option={StudiosCriterionOption} - filter={filter} - setFilter={setFilter} - /> + {!hideStudios && ( + } + data-type={StudiosCriterionOption.type} + option={StudiosCriterionOption} + filter={filter} + setFilter={setFilter} + filterHook={filterHook} + /> + )} } data-type={PerformersCriterionOption.type} option={PerformersCriterionOption} filter={filter} setFilter={setFilter} + filterHook={filterHook} /> } @@ -283,6 +291,7 @@ const SidebarContent: React.FC<{ option={TagsCriterionOption} filter={filter} setFilter={setFilter} + filterHook={filterHook} /> } @@ -759,6 +768,7 @@ export const FilteredSceneList = (props: IFilteredScenes) => {