Apply filter hook to subpage sidebar filters (#5995)

* Apply filterHook to sidebar filters on subpages
* Hide studio filter in studio subpage
This commit is contained in:
WithoutPants
2025-07-08 10:41:12 +10:00
committed by GitHub
parent 694675470e
commit dd9a1f5ce3
5 changed files with 65 additions and 44 deletions

View File

@@ -321,18 +321,24 @@ export function useCriterion(
return { criterion, setCriterion }; return { criterion, setCriterion };
} }
export interface IUseQueryHookProps {
q: string;
filter?: ListFilterModel;
filterHook?: (filter: ListFilterModel) => ListFilterModel;
skip: boolean;
}
export function useQueryState( export function useQueryState(
useQuery: ( useQuery: (props: IUseQueryHookProps) => ILoadResults<ILabeledId[]>,
q: string,
filter: ListFilterModel,
skip: boolean
) => ILoadResults<ILabeledId[]>,
filter: ListFilterModel, filter: ListFilterModel,
skip: boolean skip: boolean,
options?: {
filterHook?: (filter: ListFilterModel) => ListFilterModel;
}
) { ) {
const [query, setQuery] = useState(""); const [query, setQuery] = useState("");
const { results: queryResults } = useCacheResults( const { results: queryResults } = useCacheResults(
useQuery(query, filter, skip) useQuery({ q: query, filter, filterHook: options?.filterHook, skip })
); );
return { query, setQuery, queryResults }; return { query, setQuery, queryResults };
@@ -431,11 +437,8 @@ export function useLabeledIdFilterState(props: {
option: CriterionOption; option: CriterionOption;
filter: ListFilterModel; filter: ListFilterModel;
setFilter: (f: ListFilterModel) => void; setFilter: (f: ListFilterModel) => void;
useQuery: ( filterHook?: (filter: ListFilterModel) => ListFilterModel;
q: string, useQuery: (props: IUseQueryHookProps) => ILoadResults<ILabeledId[]>;
filter: ListFilterModel,
skip: boolean
) => ILoadResults<ILabeledId[]>;
singleValue?: boolean; singleValue?: boolean;
hierarchical?: boolean; hierarchical?: boolean;
includeSubMessageID?: string; includeSubMessageID?: string;
@@ -444,6 +447,7 @@ export function useLabeledIdFilterState(props: {
option, option,
filter, filter,
setFilter, setFilter,
filterHook,
useQuery, useQuery,
singleValue = false, singleValue = false,
hierarchical = false, hierarchical = false,
@@ -456,7 +460,8 @@ export function useLabeledIdFilterState(props: {
const { query, setQuery, queryResults } = useQueryState( const { query, setQuery, queryResults } = useQueryState(
useQuery, useQuery,
filter, filter,
skip skip,
{ filterHook }
); );
const { criterion, setCriterion } = useCriterion(option, filter, setFilter); const { criterion, setCriterion } = useCriterion(option, filter, setFilter);

View File

@@ -12,6 +12,7 @@ import { sortByRelevance } from "src/utils/query";
import { ListFilterModel } from "src/models/list-filter/filter"; import { ListFilterModel } from "src/models/list-filter/filter";
import { CriterionOption } from "src/models/list-filter/criteria/criterion"; import { CriterionOption } from "src/models/list-filter/criteria/criterion";
import { import {
IUseQueryHookProps,
makeQueryVariables, makeQueryVariables,
setObjectFilter, setObjectFilter,
useLabeledIdFilterState, useLabeledIdFilterState,
@@ -69,13 +70,12 @@ function sortResults(
}); });
} }
function usePerformerQueryFilter( function usePerformerQueryFilter(props: IUseQueryHookProps) {
query: string, const { q: query, filter: f, skip, filterHook } = props;
f?: ListFilterModel, const appliedFilter = filterHook && f ? filterHook(f.clone()) : f;
skip?: boolean
) {
const { data, loading } = useFindPerformersForSelectQuery({ const { data, loading } = useFindPerformersForSelectQuery({
variables: queryVariables(query, f), variables: queryVariables(query, appliedFilter),
skip, skip,
}); });
@@ -88,7 +88,7 @@ function usePerformerQueryFilter(
} }
function usePerformerQuery(query: string, skip?: boolean) { function usePerformerQuery(query: string, skip?: boolean) {
return usePerformerQueryFilter(query, undefined, skip); return usePerformerQueryFilter({ q: query, skip: !!skip });
} }
const PerformersFilter: React.FC<IPerformersFilter> = ({ const PerformersFilter: React.FC<IPerformersFilter> = ({
@@ -109,10 +109,12 @@ export const SidebarPerformersFilter: React.FC<{
option: CriterionOption; option: CriterionOption;
filter: ListFilterModel; filter: ListFilterModel;
setFilter: (f: ListFilterModel) => void; setFilter: (f: ListFilterModel) => void;
}> = ({ title, option, filter, setFilter }) => { filterHook?: (f: ListFilterModel) => ListFilterModel;
}> = ({ title, option, filter, setFilter, filterHook }) => {
const state = useLabeledIdFilterState({ const state = useLabeledIdFilterState({
filter, filter,
setFilter, setFilter,
filterHook,
option, option,
useQuery: usePerformerQueryFilter, useQuery: usePerformerQueryFilter,
}); });

View File

@@ -10,6 +10,7 @@ import { sortByRelevance } from "src/utils/query";
import { CriterionOption } from "src/models/list-filter/criteria/criterion"; import { CriterionOption } from "src/models/list-filter/criteria/criterion";
import { ListFilterModel } from "src/models/list-filter/filter"; import { ListFilterModel } from "src/models/list-filter/filter";
import { import {
IUseQueryHookProps,
makeQueryVariables, makeQueryVariables,
setObjectFilter, setObjectFilter,
useLabeledIdFilterState, useLabeledIdFilterState,
@@ -56,13 +57,12 @@ function sortResults(
}); });
} }
function useStudioQueryFilter( function useStudioQueryFilter(props: IUseQueryHookProps) {
query: string, const { q: query, filter: f, skip, filterHook } = props;
filter?: ListFilterModel, const appliedFilter = filterHook && f ? filterHook(f.clone()) : f;
skip?: boolean
) {
const { data, loading } = useFindStudiosForSelectQuery({ const { data, loading } = useFindStudiosForSelectQuery({
variables: queryVariables(query, filter), variables: queryVariables(query, appliedFilter),
skip, skip,
}); });
@@ -75,7 +75,7 @@ function useStudioQueryFilter(
} }
function useStudioQuery(query: string, skip?: boolean) { function useStudioQuery(query: string, skip?: boolean) {
return useStudioQueryFilter(query, undefined, skip); return useStudioQueryFilter({ q: query, skip: !!skip });
} }
const StudiosFilter: React.FC<IStudiosFilter> = ({ const StudiosFilter: React.FC<IStudiosFilter> = ({
@@ -97,10 +97,12 @@ export const SidebarStudiosFilter: React.FC<{
option: CriterionOption; option: CriterionOption;
filter: ListFilterModel; filter: ListFilterModel;
setFilter: (f: ListFilterModel) => void; setFilter: (f: ListFilterModel) => void;
}> = ({ title, option, filter, setFilter }) => { filterHook?: (f: ListFilterModel) => ListFilterModel;
}> = ({ title, option, filter, setFilter, filterHook }) => {
const state = useLabeledIdFilterState({ const state = useLabeledIdFilterState({
filter, filter,
setFilter, setFilter,
filterHook,
option, option,
useQuery: useStudioQueryFilter, useQuery: useStudioQueryFilter,
singleValue: true, singleValue: true,

View File

@@ -10,6 +10,7 @@ import { sortByRelevance } from "src/utils/query";
import { CriterionOption } from "src/models/list-filter/criteria/criterion"; import { CriterionOption } from "src/models/list-filter/criteria/criterion";
import { ListFilterModel } from "src/models/list-filter/filter"; import { ListFilterModel } from "src/models/list-filter/filter";
import { import {
IUseQueryHookProps,
makeQueryVariables, makeQueryVariables,
setObjectFilter, setObjectFilter,
useLabeledIdFilterState, useLabeledIdFilterState,
@@ -65,13 +66,12 @@ function sortResults(
}); });
} }
function useTagQueryFilter( function useTagQueryFilter(props: IUseQueryHookProps) {
query: string, const { q: query, filter: f, skip, filterHook } = props;
filter?: ListFilterModel, const appliedFilter = filterHook && f ? filterHook(f.clone()) : f;
skip?: boolean
) {
const { data, loading } = useFindTagsForSelectQuery({ const { data, loading } = useFindTagsForSelectQuery({
variables: queryVariables(query, filter), variables: queryVariables(query, appliedFilter),
skip, skip,
}); });
@@ -84,7 +84,7 @@ function useTagQueryFilter(
} }
function useTagQuery(query: string, skip?: boolean) { function useTagQuery(query: string, skip?: boolean) {
return useTagQueryFilter(query, undefined, skip); return useTagQueryFilter({ q: query, skip: !!skip });
} }
const TagsFilter: React.FC<ITagsFilter> = ({ criterion, setCriterion }) => { const TagsFilter: React.FC<ITagsFilter> = ({ criterion, setCriterion }) => {
@@ -102,10 +102,12 @@ export const SidebarTagsFilter: React.FC<{
option: CriterionOption; option: CriterionOption;
filter: ListFilterModel; filter: ListFilterModel;
setFilter: (f: ListFilterModel) => void; setFilter: (f: ListFilterModel) => void;
}> = ({ title, option, filter, setFilter }) => { filterHook?: (f: ListFilterModel) => ListFilterModel;
}> = ({ title, option, filter, setFilter, filterHook }) => {
const state = useLabeledIdFilterState({ const state = useLabeledIdFilterState({
filter, filter,
setFilter, setFilter,
filterHook,
option, option,
useQuery: useTagQueryFilter, useQuery: useTagQueryFilter,
hierarchical: true, hierarchical: true,

View File

@@ -235,6 +235,7 @@ const ScenesFilterSidebarSections = PatchContainerComponent(
const SidebarContent: React.FC<{ const SidebarContent: React.FC<{
filter: ListFilterModel; filter: ListFilterModel;
setFilter: (filter: ListFilterModel) => void; setFilter: (filter: ListFilterModel) => void;
filterHook?: (filter: ListFilterModel) => ListFilterModel;
view?: View; view?: View;
sidebarOpen: boolean; sidebarOpen: boolean;
onClose?: () => void; onClose?: () => void;
@@ -243,6 +244,7 @@ const SidebarContent: React.FC<{
}> = ({ }> = ({
filter, filter,
setFilter, setFilter,
filterHook,
view, view,
showEditFilter, showEditFilter,
sidebarOpen, sidebarOpen,
@@ -252,6 +254,8 @@ const SidebarContent: React.FC<{
const showResultsId = const showResultsId =
count !== undefined ? "actions.show_count_results" : "actions.show_results"; count !== undefined ? "actions.show_count_results" : "actions.show_results";
const hideStudios = view === View.StudioScenes;
return ( return (
<> <>
<FilteredSidebarHeader <FilteredSidebarHeader
@@ -263,19 +267,23 @@ const SidebarContent: React.FC<{
/> />
<ScenesFilterSidebarSections> <ScenesFilterSidebarSections>
<SidebarStudiosFilter {!hideStudios && (
title={<FormattedMessage id="studios" />} <SidebarStudiosFilter
data-type={StudiosCriterionOption.type} title={<FormattedMessage id="studios" />}
option={StudiosCriterionOption} data-type={StudiosCriterionOption.type}
filter={filter} option={StudiosCriterionOption}
setFilter={setFilter} filter={filter}
/> setFilter={setFilter}
filterHook={filterHook}
/>
)}
<SidebarPerformersFilter <SidebarPerformersFilter
title={<FormattedMessage id="performers" />} title={<FormattedMessage id="performers" />}
data-type={PerformersCriterionOption.type} data-type={PerformersCriterionOption.type}
option={PerformersCriterionOption} option={PerformersCriterionOption}
filter={filter} filter={filter}
setFilter={setFilter} setFilter={setFilter}
filterHook={filterHook}
/> />
<SidebarTagsFilter <SidebarTagsFilter
title={<FormattedMessage id="tags" />} title={<FormattedMessage id="tags" />}
@@ -283,6 +291,7 @@ const SidebarContent: React.FC<{
option={TagsCriterionOption} option={TagsCriterionOption}
filter={filter} filter={filter}
setFilter={setFilter} setFilter={setFilter}
filterHook={filterHook}
/> />
<SidebarRatingFilter <SidebarRatingFilter
title={<FormattedMessage id="rating" />} title={<FormattedMessage id="rating" />}
@@ -759,6 +768,7 @@ export const FilteredSceneList = (props: IFilteredScenes) => {
<SidebarContent <SidebarContent
filter={filter} filter={filter}
setFilter={setFilter} setFilter={setFilter}
filterHook={filterHook}
showEditFilter={showEditFilter} showEditFilter={showEditFilter}
view={view} view={view}
sidebarOpen={showSidebar} sidebarOpen={showSidebar}