mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 20:34:37 +03:00
Containing Group/Sub-Group relationships (#5105)
* Add UI support for setting containing groups * Show containing groups in group details panel * Move tag hierarchical filter code into separate type * Add depth to scene_count and add sub_group_count * Add sub-groups tab to groups page * Add containing groups to edit groups dialog * Show containing group description in sub-group view * Show group scene number in group scenes view * Add ability to drag move grid cards * Add sub group order option * Add reorder sub-groups interface * Separate page size selector component * Add interfaces to add and remove sub-groups to a group * Separate MultiSet components * Allow setting description while setting containing groups
This commit is contained in:
@@ -319,6 +319,7 @@ export class IHierarchicalLabeledIdCriterion extends Criterion<IHierarchicalLabe
|
||||
// excluded only makes sense for includes and includes all
|
||||
// so reset it for other modifiers
|
||||
if (
|
||||
this.value &&
|
||||
value !== CriterionModifier.Includes &&
|
||||
value !== CriterionModifier.IncludesAll
|
||||
) {
|
||||
|
||||
@@ -1,17 +1,44 @@
|
||||
import { ILabeledIdCriterion, ILabeledIdCriterionOption } from "./criterion";
|
||||
import { CriterionModifier } from "src/core/generated-graphql";
|
||||
import { CriterionOption, IHierarchicalLabeledIdCriterion } from "./criterion";
|
||||
import { CriterionType } from "../types";
|
||||
|
||||
const inputType = "groups";
|
||||
|
||||
export const GroupsCriterionOption = new ILabeledIdCriterionOption(
|
||||
"groups",
|
||||
"groups",
|
||||
false,
|
||||
inputType,
|
||||
() => new GroupsCriterion()
|
||||
);
|
||||
const modifierOptions = [
|
||||
CriterionModifier.Includes,
|
||||
CriterionModifier.Excludes,
|
||||
CriterionModifier.IsNull,
|
||||
CriterionModifier.NotNull,
|
||||
];
|
||||
|
||||
export class GroupsCriterion extends ILabeledIdCriterion {
|
||||
constructor() {
|
||||
super(GroupsCriterionOption);
|
||||
const defaultModifier = CriterionModifier.Includes;
|
||||
|
||||
class BaseGroupsCriterionOption extends CriterionOption {
|
||||
constructor(messageID: string, type: CriterionType) {
|
||||
super({
|
||||
messageID,
|
||||
type,
|
||||
modifierOptions,
|
||||
defaultModifier,
|
||||
inputType,
|
||||
makeCriterion: () => new GroupsCriterion(this),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export const GroupsCriterionOption = new BaseGroupsCriterionOption(
|
||||
"groups",
|
||||
"groups"
|
||||
);
|
||||
|
||||
export class GroupsCriterion extends IHierarchicalLabeledIdCriterion {}
|
||||
|
||||
export const ContainingGroupsCriterionOption = new BaseGroupsCriterionOption(
|
||||
"containing_groups",
|
||||
"containing_groups"
|
||||
);
|
||||
|
||||
export const SubGroupsCriterionOption = new BaseGroupsCriterionOption(
|
||||
"sub_groups",
|
||||
"sub_groups"
|
||||
);
|
||||
|
||||
@@ -488,6 +488,12 @@ export class ListFilterModel {
|
||||
return ret;
|
||||
}
|
||||
|
||||
public setPageSize(pageSize: number) {
|
||||
const ret = this.clone();
|
||||
ret.itemsPerPage = pageSize;
|
||||
return ret;
|
||||
}
|
||||
|
||||
public changePage(page: number) {
|
||||
const ret = this.clone();
|
||||
ret.currentPage = page;
|
||||
|
||||
@@ -13,6 +13,10 @@ import { DisplayMode } from "./types";
|
||||
import { RatingCriterionOption } from "./criteria/rating";
|
||||
// import { StudioTagsCriterionOption } from "./criteria/tags";
|
||||
import { TagsCriterionOption } from "./criteria/tags";
|
||||
import {
|
||||
ContainingGroupsCriterionOption,
|
||||
SubGroupsCriterionOption,
|
||||
} from "./criteria/groups";
|
||||
|
||||
const defaultSortBy = "name";
|
||||
|
||||
@@ -23,6 +27,7 @@ const sortByOptions = [
|
||||
"duration",
|
||||
"rating",
|
||||
"tag_count",
|
||||
"sub_group_order",
|
||||
]
|
||||
.map(ListFilterOptions.createSortBy)
|
||||
.concat([
|
||||
@@ -44,6 +49,10 @@ const criterionOptions = [
|
||||
RatingCriterionOption,
|
||||
PerformersCriterionOption,
|
||||
createDateCriterionOption("date"),
|
||||
ContainingGroupsCriterionOption,
|
||||
SubGroupsCriterionOption,
|
||||
createMandatoryNumberCriterionOption("containing_group_count"),
|
||||
createMandatoryNumberCriterionOption("sub_group_count"),
|
||||
TagsCriterionOption,
|
||||
createMandatoryNumberCriterionOption("tag_count"),
|
||||
createMandatoryTimestampCriterionOption("created_at"),
|
||||
|
||||
@@ -148,6 +148,10 @@ export type CriterionType =
|
||||
| "studios"
|
||||
| "scenes"
|
||||
| "groups"
|
||||
| "containing_groups"
|
||||
| "containing_group_count"
|
||||
| "sub_groups"
|
||||
| "sub_group_count"
|
||||
| "galleries"
|
||||
| "birth_year"
|
||||
| "age"
|
||||
|
||||
Reference in New Issue
Block a user