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:
WithoutPants
2024-08-30 11:43:44 +10:00
committed by GitHub
parent 96fdd94a01
commit bcf0fda7ac
99 changed files with 5388 additions and 935 deletions

View File

@@ -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
) {

View File

@@ -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"
);

View File

@@ -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;

View File

@@ -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"),

View File

@@ -148,6 +148,10 @@ export type CriterionType =
| "studios"
| "scenes"
| "groups"
| "containing_groups"
| "containing_group_count"
| "sub_groups"
| "sub_group_count"
| "galleries"
| "birth_year"
| "age"