mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 12:24:38 +03:00
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:
@@ -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,
|
filter: ListFilterModel,
|
||||||
skip: boolean
|
skip: boolean,
|
||||||
) => ILoadResults<ILabeledId[]>,
|
options?: {
|
||||||
filter: ListFilterModel,
|
filterHook?: (filter: ListFilterModel) => ListFilterModel;
|
||||||
skip: boolean
|
}
|
||||||
) {
|
) {
|
||||||
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);
|
||||||
|
|||||||
@@ -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,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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>
|
||||||
|
{!hideStudios && (
|
||||||
<SidebarStudiosFilter
|
<SidebarStudiosFilter
|
||||||
title={<FormattedMessage id="studios" />}
|
title={<FormattedMessage id="studios" />}
|
||||||
data-type={StudiosCriterionOption.type}
|
data-type={StudiosCriterionOption.type}
|
||||||
option={StudiosCriterionOption}
|
option={StudiosCriterionOption}
|
||||||
filter={filter}
|
filter={filter}
|
||||||
setFilter={setFilter}
|
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}
|
||||||
|
|||||||
Reference in New Issue
Block a user