diff --git a/pkg/api/resolver_mutation_gallery.go b/pkg/api/resolver_mutation_gallery.go index 16cbec30d..77b48d09d 100644 --- a/pkg/api/resolver_mutation_gallery.go +++ b/pkg/api/resolver_mutation_gallery.go @@ -411,10 +411,13 @@ func adjustGalleryTagIDs(tx *sqlx.Tx, galleryID int, ids models.BulkUpdateIds) ( func (r *mutationResolver) GalleryDestroy(ctx context.Context, input models.GalleryDestroyInput) (bool, error) { qb := models.NewGalleryQueryBuilder() + iqb := models.NewImageQueryBuilder() tx := database.DB.MustBeginTx(ctx, nil) var galleries []*models.Gallery var imgsToPostProcess []*models.Image + var imgsToDelete []*models.Image + for _, id := range input.Ids { galleryID, _ := strconv.Atoi(id) @@ -430,8 +433,7 @@ func (r *mutationResolver) GalleryDestroy(ctx context.Context, input models.Gall } // if this is a zip-based gallery, delete the images as well - if gallery.Path.Valid { - iqb := models.NewImageQueryBuilder() + if gallery.Zip { imgs, err := iqb.FindByGalleryID(galleryID) if err != nil { tx.Rollback() @@ -439,7 +441,7 @@ func (r *mutationResolver) GalleryDestroy(ctx context.Context, input models.Gall } for _, img := range imgs { - err = qb.Destroy(img.ID, tx) + err = iqb.Destroy(img.ID, tx) if err != nil { tx.Rollback() return false, err @@ -447,6 +449,32 @@ func (r *mutationResolver) GalleryDestroy(ctx context.Context, input models.Gall imgsToPostProcess = append(imgsToPostProcess, img) } + } else if input.DeleteFile != nil && *input.DeleteFile { + // Delete image if it is only attached to this gallery + imgs, err := iqb.FindByGalleryID(galleryID) + if err != nil { + tx.Rollback() + return false, err + } + + for _, img := range imgs { + imgGalleries, err := qb.FindByImageID(img.ID, tx) + if err != nil { + tx.Rollback() + return false, err + } + + if len(imgGalleries) == 0 { + err = iqb.Destroy(img.ID, tx) + if err != nil { + tx.Rollback() + return false, err + } + + imgsToDelete = append(imgsToDelete, img) + imgsToPostProcess = append(imgsToPostProcess, img) + } + } } } @@ -460,6 +488,10 @@ func (r *mutationResolver) GalleryDestroy(ctx context.Context, input models.Gall for _, gallery := range galleries { manager.DeleteGalleryFile(gallery) } + + for _, img := range imgsToDelete { + manager.DeleteImageFile(img) + } } // if delete generated is true, then delete the generated files diff --git a/pkg/models/querybuilder_gallery.go b/pkg/models/querybuilder_gallery.go index ffe3e54a6..8cc247126 100644 --- a/pkg/models/querybuilder_gallery.go +++ b/pkg/models/querybuilder_gallery.go @@ -181,6 +181,8 @@ func (qb *GalleryQueryBuilder) Query(galleryFilter *GalleryFilterType, findFilte left join performers_galleries as performers_join on performers_join.gallery_id = galleries.id left join studios as studio on studio.id = galleries.studio_id left join galleries_tags as tags_join on tags_join.gallery_id = galleries.id + left join galleries_images as images_join on images_join.gallery_id = galleries.id + left join images on images_join.image_id = images.id ` if q := findFilter.Q; q != nil && *q != "" { diff --git a/ui/v2.5/src/components/Galleries/DeleteGalleriesDialog.tsx b/ui/v2.5/src/components/Galleries/DeleteGalleriesDialog.tsx index 5496ac48a..3f84649cc 100644 --- a/ui/v2.5/src/components/Galleries/DeleteGalleriesDialog.tsx +++ b/ui/v2.5/src/components/Galleries/DeleteGalleriesDialog.tsx @@ -76,11 +76,13 @@ export const DeleteGalleriesDialog: React.FC = (

setDeleteFile(!deleteFile)} /> setDeleteGenerated(!deleteGenerated)} diff --git a/ui/v2.5/src/components/Shared/Modal.tsx b/ui/v2.5/src/components/Shared/Modal.tsx index a9afee153..9b0710159 100644 --- a/ui/v2.5/src/components/Shared/Modal.tsx +++ b/ui/v2.5/src/components/Shared/Modal.tsx @@ -56,6 +56,7 @@ const ModalComponent: React.FC = ({ disabled={isRunning || disabled} variant={accept?.variant ?? "primary"} onClick={accept?.onClick} + className="ml-2" > {isRunning ? ( diff --git a/ui/v2.5/src/models/list-filter/filter.ts b/ui/v2.5/src/models/list-filter/filter.ts index e4c61dd65..f1c786bff 100644 --- a/ui/v2.5/src/models/list-filter/filter.ts +++ b/ui/v2.5/src/models/list-filter/filter.ts @@ -222,7 +222,7 @@ export class ListFilterModel { break; case FilterMode.Galleries: this.sortBy = "path"; - this.sortByOptions = ["path"]; + this.sortByOptions = ["path", "images_count"]; this.displayModeOptions = [DisplayMode.Grid, DisplayMode.List]; this.criterionOptions = [ new NoneCriterionOption(),