diff --git a/graphql/documents/data/gallery-slim.graphql b/graphql/documents/data/gallery-slim.graphql new file mode 100644 index 000000000..1f99cc201 --- /dev/null +++ b/graphql/documents/data/gallery-slim.graphql @@ -0,0 +1,28 @@ +fragment GallerySlimData on Gallery { + id + checksum + path + title + date + url + details + rating + image_count + cover { + ...SlimImageData + } + studio { + ...StudioData + } + tags { + ...TagData + } + performers { + ...PerformerData + } + scene { + id + title + path + } +} diff --git a/graphql/documents/queries/gallery.graphql b/graphql/documents/queries/gallery.graphql index 205f661bc..c289d9758 100644 --- a/graphql/documents/queries/gallery.graphql +++ b/graphql/documents/queries/gallery.graphql @@ -2,7 +2,7 @@ query FindGalleries($filter: FindFilterType, $gallery_filter: GalleryFilterType) findGalleries(gallery_filter: $gallery_filter, filter: $filter) { count galleries { - ...GalleryData + ...GallerySlimData } } } @@ -11,4 +11,4 @@ query FindGallery($id: ID!) { findGallery(id: $id) { ...GalleryData } -} \ No newline at end of file +} diff --git a/graphql/schema/types/gallery.graphql b/graphql/schema/types/gallery.graphql index 1e35b0d21..c39654a7e 100644 --- a/graphql/schema/types/gallery.graphql +++ b/graphql/schema/types/gallery.graphql @@ -10,6 +10,7 @@ type Gallery { rating: Int scene: Scene studio: Studio + image_count: Int! tags: [Tag!]! performers: [Performer!]! diff --git a/pkg/api/resolver_model_gallery.go b/pkg/api/resolver_model_gallery.go index 3061d2d01..0d73f8219 100644 --- a/pkg/api/resolver_model_gallery.go +++ b/pkg/api/resolver_model_gallery.go @@ -108,3 +108,8 @@ func (r *galleryResolver) Performers(ctx context.Context, obj *models.Gallery) ( qb := models.NewPerformerQueryBuilder() return qb.FindByGalleryID(obj.ID, nil) } + +func (r *galleryResolver) ImageCount(ctx context.Context, obj *models.Gallery) (int, error) { + qb := models.NewImageQueryBuilder() + return qb.CountByGalleryID(obj.ID) +} diff --git a/ui/v2.5/src/components/Galleries/EditGalleriesDialog.tsx b/ui/v2.5/src/components/Galleries/EditGalleriesDialog.tsx index 6a7907f50..af3ea3365 100644 --- a/ui/v2.5/src/components/Galleries/EditGalleriesDialog.tsx +++ b/ui/v2.5/src/components/Galleries/EditGalleriesDialog.tsx @@ -10,7 +10,7 @@ import MultiSet from "../Shared/MultiSet"; import { RatingStars } from "../Scenes/SceneDetails/RatingStars"; interface IListOperationProps { - selected: GQL.GalleryDataFragment[]; + selected: GQL.GallerySlimDataFragment[]; onClose: (applied: boolean) => void; } @@ -134,11 +134,11 @@ export const EditGalleriesDialog: React.FC = ( setIsUpdating(false); } - function getRating(state: GQL.GalleryDataFragment[]) { + function getRating(state: GQL.GallerySlimDataFragment[]) { let ret: number | undefined; let first = true; - state.forEach((gallery: GQL.GalleryDataFragment) => { + state.forEach((gallery) => { if (first) { ret = gallery.rating ?? undefined; first = false; @@ -150,11 +150,11 @@ export const EditGalleriesDialog: React.FC = ( return ret; } - function getStudioId(state: GQL.GalleryDataFragment[]) { + function getStudioId(state: GQL.GallerySlimDataFragment[]) { let ret: string | undefined; let first = true; - state.forEach((gallery: GQL.GalleryDataFragment) => { + state.forEach((gallery) => { if (first) { ret = gallery?.studio?.id; first = false; @@ -169,11 +169,11 @@ export const EditGalleriesDialog: React.FC = ( return ret; } - function getPerformerIds(state: GQL.GalleryDataFragment[]) { + function getPerformerIds(state: GQL.GallerySlimDataFragment[]) { let ret: string[] = []; let first = true; - state.forEach((gallery: GQL.GalleryDataFragment) => { + state.forEach((gallery) => { if (first) { ret = gallery.performers ? gallery.performers.map((p) => p.id).sort() @@ -193,11 +193,11 @@ export const EditGalleriesDialog: React.FC = ( return ret; } - function getTagIds(state: GQL.GalleryDataFragment[]) { + function getTagIds(state: GQL.GallerySlimDataFragment[]) { let ret: string[] = []; let first = true; - state.forEach((gallery: GQL.GalleryDataFragment) => { + state.forEach((gallery) => { if (first) { ret = gallery.tags ? gallery.tags.map((t) => t.id).sort() : []; first = false; @@ -221,7 +221,7 @@ export const EditGalleriesDialog: React.FC = ( let updateTagIds: string[] = []; let first = true; - state.forEach((gallery: GQL.GalleryDataFragment) => { + state.forEach((gallery: GQL.GallerySlimDataFragment) => { const galleryRating = gallery.rating; const GalleriestudioID = gallery?.studio?.id; const galleryPerformerIDs = (gallery.performers ?? []) diff --git a/ui/v2.5/src/components/Galleries/GalleryCard.tsx b/ui/v2.5/src/components/Galleries/GalleryCard.tsx index e5352a8e9..c73f5f9fb 100644 --- a/ui/v2.5/src/components/Galleries/GalleryCard.tsx +++ b/ui/v2.5/src/components/Galleries/GalleryCard.tsx @@ -8,7 +8,7 @@ import { HoverPopover, Icon, TagLink } from "../Shared"; import { BasicCard } from "../Shared/BasicCard"; interface IProps { - gallery: GQL.GalleryDataFragment; + gallery: GQL.GallerySlimDataFragment; selecting?: boolean; selected: boolean | undefined; zoomIndex: number; @@ -164,9 +164,9 @@ export const GalleryCard: React.FC = (props) => { - {props.gallery.images.length}  + {props.gallery.image_count}  diff --git a/ui/v2.5/src/components/Galleries/GalleryList.tsx b/ui/v2.5/src/components/Galleries/GalleryList.tsx index b7870bbae..59a545e03 100644 --- a/ui/v2.5/src/components/Galleries/GalleryList.tsx +++ b/ui/v2.5/src/components/Galleries/GalleryList.tsx @@ -4,7 +4,7 @@ import { Table } from "react-bootstrap"; import { Link, useHistory } from "react-router-dom"; import { FindGalleriesQueryResult, - GalleryDataFragment, + GallerySlimDataFragment, } from "src/core/generated-graphql"; import { useGalleriesList } from "src/hooks"; import { showWhenSelected } from "src/hooks/ListHook"; @@ -127,7 +127,7 @@ export const GalleryList: React.FC = ({ } function renderEditGalleriesDialog( - selectedImages: GalleryDataFragment[], + selectedImages: GallerySlimDataFragment[], onClose: (applied: boolean) => void ) { return ( @@ -138,7 +138,7 @@ export const GalleryList: React.FC = ({ } function renderDeleteGalleriesDialog( - selectedImages: GalleryDataFragment[], + selectedImages: GallerySlimDataFragment[], onClose: (confirmed: boolean) => void ) { return ( @@ -200,8 +200,8 @@ export const GalleryList: React.FC = ({ - {gallery.title ?? gallery.path} ({gallery.images.length}{" "} - {gallery.images.length === 1 ? "image" : "images"}) + {gallery.title ?? gallery.path} ({gallery.image_count}{" "} + {gallery.image_count === 1 ? "image" : "images"}) diff --git a/ui/v2.5/src/hooks/ListHook.tsx b/ui/v2.5/src/hooks/ListHook.tsx index b5e04eabe..7b9351964 100644 --- a/ui/v2.5/src/hooks/ListHook.tsx +++ b/ui/v2.5/src/hooks/ListHook.tsx @@ -6,7 +6,7 @@ import { useHistory, useLocation } from "react-router-dom"; import { SlimSceneDataFragment, SceneMarkerDataFragment, - GalleryDataFragment, + GallerySlimDataFragment, StudioDataFragment, PerformerDataFragment, FindScenesQueryResult, @@ -567,9 +567,9 @@ export const useImagesList = ( }); export const useGalleriesList = ( - props: IListHookOptions + props: IListHookOptions ) => - useList({ + useList({ ...props, filterMode: FilterMode.Galleries, useData: useFindGalleries,