mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 12:24:38 +03:00
Fix update loop in Group Sub Groups panel (#6212)
* Fix location equality testing causing update loop * Move defaultFilter out of component * Fix add sub groups dialog dropdown render issue
This commit is contained in:
@@ -114,6 +114,7 @@ export const AddSubGroupsDialog: React.FC<IListOperationProps> = (
|
|||||||
onUpdate={(input) => setEntries(input)}
|
onUpdate={(input) => setEntries(input)}
|
||||||
excludeIDs={excludeIDs}
|
excludeIDs={excludeIDs}
|
||||||
filterHook={filterHook}
|
filterHook={filterHook}
|
||||||
|
menuPortalTarget={document.body}
|
||||||
/>
|
/>
|
||||||
</Form>
|
</Form>
|
||||||
</ModalComponent>
|
</ModalComponent>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useMemo } from "react";
|
import React from "react";
|
||||||
import * as GQL from "src/core/generated-graphql";
|
import * as GQL from "src/core/generated-graphql";
|
||||||
import { GroupList } from "../GroupList";
|
import { GroupList } from "../GroupList";
|
||||||
import { ListFilterModel } from "src/models/list-filter/filter";
|
import { ListFilterModel } from "src/models/list-filter/filter";
|
||||||
@@ -101,6 +101,18 @@ interface IGroupSubGroupsPanel {
|
|||||||
group: GQL.GroupDataFragment;
|
group: GQL.GroupDataFragment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const defaultFilter = (() => {
|
||||||
|
const sortBy = "sub_group_order";
|
||||||
|
const ret = new ListFilterModel(GQL.FilterMode.Groups, undefined, {
|
||||||
|
defaultSortBy: sortBy,
|
||||||
|
});
|
||||||
|
|
||||||
|
// unset the sort by so that its not included in the URL
|
||||||
|
ret.sortBy = undefined;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
})();
|
||||||
|
|
||||||
export const GroupSubGroupsPanel: React.FC<IGroupSubGroupsPanel> = ({
|
export const GroupSubGroupsPanel: React.FC<IGroupSubGroupsPanel> = ({
|
||||||
active,
|
active,
|
||||||
group,
|
group,
|
||||||
@@ -114,18 +126,6 @@ export const GroupSubGroupsPanel: React.FC<IGroupSubGroupsPanel> = ({
|
|||||||
|
|
||||||
const filterHook = useContainingGroupFilterHook(group);
|
const filterHook = useContainingGroupFilterHook(group);
|
||||||
|
|
||||||
const defaultFilter = useMemo(() => {
|
|
||||||
const sortBy = "sub_group_order";
|
|
||||||
const ret = new ListFilterModel(GQL.FilterMode.Groups, undefined, {
|
|
||||||
defaultSortBy: sortBy,
|
|
||||||
});
|
|
||||||
|
|
||||||
// unset the sort by so that its not included in the URL
|
|
||||||
ret.sortBy = undefined;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
async function removeSubGroups(
|
async function removeSubGroups(
|
||||||
result: GQL.FindGroupsQueryResult,
|
result: GQL.FindGroupsQueryResult,
|
||||||
filter: ListFilterModel,
|
filter: ListFilterModel,
|
||||||
|
|||||||
@@ -12,6 +12,13 @@ import * as GQL from "src/core/generated-graphql";
|
|||||||
import { DisplayMode } from "src/models/list-filter/types";
|
import { DisplayMode } from "src/models/list-filter/types";
|
||||||
import { Criterion } from "src/models/list-filter/criteria/criterion";
|
import { Criterion } from "src/models/list-filter/criteria/criterion";
|
||||||
|
|
||||||
|
function locationEquals(
|
||||||
|
loc1: ReturnType<typeof useLocation> | undefined,
|
||||||
|
loc2: ReturnType<typeof useLocation>
|
||||||
|
) {
|
||||||
|
return loc1 && loc1.pathname === loc2.pathname && loc1.search === loc2.search;
|
||||||
|
}
|
||||||
|
|
||||||
export function useFilterURL(
|
export function useFilterURL(
|
||||||
filter: ListFilterModel,
|
filter: ListFilterModel,
|
||||||
setFilter: React.Dispatch<React.SetStateAction<ListFilterModel>>,
|
setFilter: React.Dispatch<React.SetStateAction<ListFilterModel>>,
|
||||||
@@ -49,7 +56,7 @@ export function useFilterURL(
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// don't apply if active is false
|
// don't apply if active is false
|
||||||
// also don't apply if location is unchanged
|
// also don't apply if location is unchanged
|
||||||
if (!active || prevLocation === location) return;
|
if (!active || locationEquals(prevLocation, location)) return;
|
||||||
|
|
||||||
// re-init to load default filter on empty new query params
|
// re-init to load default filter on empty new query params
|
||||||
if (!location.search) {
|
if (!location.search) {
|
||||||
|
|||||||
Reference in New Issue
Block a user