From c8032f04fa7be16556a5266edb3826d5c26e7d3a Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Tue, 18 Feb 2025 16:32:33 +1100 Subject: [PATCH] Don't set image.title to file basename in graphql (#5658) * Don't set image title to filename in graphql * Remove deprecated files field from image fragments --- gqlgen.yml | 6 ----- internal/api/resolver_model_image.go | 5 ---- ui/v2.5/graphql/data/image-slim.graphql | 4 --- ui/v2.5/graphql/data/image.graphql | 4 --- ui/v2.5/src/components/Images/ImageCard.tsx | 4 +-- .../components/Images/ImageDetails/Image.tsx | 8 +++--- ui/v2.5/src/core/files.ts | 25 +++++++++++++++++++ 7 files changed, 31 insertions(+), 25 deletions(-) diff --git a/gqlgen.yml b/gqlgen.yml index dc101f03c..f043d5697 100644 --- a/gqlgen.yml +++ b/gqlgen.yml @@ -35,12 +35,6 @@ models: model: github.com/stashapp/stash/internal/api.BoolMap PluginConfigMap: model: github.com/stashapp/stash/internal/api.PluginConfigMap - # define to force resolvers - Image: - model: github.com/stashapp/stash/pkg/models.Image - fields: - title: - resolver: true VideoFile: fields: # override float fields - #1572 diff --git a/internal/api/resolver_model_image.go b/internal/api/resolver_model_image.go index 49f94b8b7..0886bea40 100644 --- a/internal/api/resolver_model_image.go +++ b/internal/api/resolver_model_image.go @@ -18,11 +18,6 @@ func (r *imageResolver) getFiles(ctx context.Context, obj *models.Image) ([]mode return files, firstError(errs) } -func (r *imageResolver) Title(ctx context.Context, obj *models.Image) (*string, error) { - ret := obj.GetTitle() - return &ret, nil -} - func (r *imageResolver) VisualFiles(ctx context.Context, obj *models.Image) ([]VisualFile, error) { files, err := r.getFiles(ctx, obj) if err != nil { diff --git a/ui/v2.5/graphql/data/image-slim.graphql b/ui/v2.5/graphql/data/image-slim.graphql index e45f19938..3cff45716 100644 --- a/ui/v2.5/graphql/data/image-slim.graphql +++ b/ui/v2.5/graphql/data/image-slim.graphql @@ -10,10 +10,6 @@ fragment SlimImageData on Image { organized o_counter - files { - ...ImageFileData - } - paths { thumbnail preview diff --git a/ui/v2.5/graphql/data/image.graphql b/ui/v2.5/graphql/data/image.graphql index 648d03d28..52163b007 100644 --- a/ui/v2.5/graphql/data/image.graphql +++ b/ui/v2.5/graphql/data/image.graphql @@ -12,10 +12,6 @@ fragment ImageData on Image { created_at updated_at - files { - ...ImageFileData - } - paths { thumbnail preview diff --git a/ui/v2.5/src/components/Images/ImageCard.tsx b/ui/v2.5/src/components/Images/ImageCard.tsx index e4c050a51..4e5d0dbfd 100644 --- a/ui/v2.5/src/components/Images/ImageCard.tsx +++ b/ui/v2.5/src/components/Images/ImageCard.tsx @@ -18,7 +18,7 @@ import { faSearch, faTag, } from "@fortawesome/free-solid-svg-icons"; -import { objectTitle } from "src/core/files"; +import { imageTitle } from "src/core/files"; import { TruncatedText } from "../Shared/TruncatedText"; import ScreenUtils from "src/utils/screen"; import { StudioOverlay } from "../Shared/GridCard/StudioOverlay"; @@ -197,7 +197,7 @@ export const ImageCard: React.FC = ( className={`image-card zoom-${props.zoomIndex}`} url={`/images/${props.image.id}`} width={cardWidth} - title={objectTitle(props.image)} + title={imageTitle(props.image)} linkClassName="image-card-link" image={ <> diff --git a/ui/v2.5/src/components/Images/ImageDetails/Image.tsx b/ui/v2.5/src/components/Images/ImageDetails/Image.tsx index e18571cd0..1adfd81a6 100644 --- a/ui/v2.5/src/components/Images/ImageDetails/Image.tsx +++ b/ui/v2.5/src/components/Images/ImageDetails/Image.tsx @@ -25,7 +25,7 @@ import { ImageEditPanel } from "./ImageEditPanel"; import { ImageDetailPanel } from "./ImageDetailPanel"; import { DeleteImagesDialog } from "../DeleteImagesDialog"; import { faEllipsisV } from "@fortawesome/free-solid-svg-icons"; -import { objectPath, objectTitle } from "src/core/files"; +import { imagePath, imageTitle } from "src/core/files"; import { isVideo } from "src/utils/visualFile"; import { useScrollToTopOnMount } from "src/hooks/scrollToTop"; import { useRatingKeybinds } from "src/hooks/keybinds"; @@ -79,7 +79,7 @@ const ImagePage: React.FC = ({ image }) => { } await mutateMetadataScan({ - paths: [objectPath(image)], + paths: [imagePath(image)], rescan: true, }); @@ -274,11 +274,11 @@ const ImagePage: React.FC = ({ image }) => { }); const file = useMemo( - () => (image.files.length > 0 ? image.files[0] : undefined), + () => (image.visual_files.length > 0 ? image.visual_files[0] : undefined), [image] ); - const title = objectTitle(image); + const title = imageTitle(image); const ImageView = image.visual_files.length > 0 && isVideo(image.visual_files[0]) ? "video" diff --git a/ui/v2.5/src/core/files.ts b/ui/v2.5/src/core/files.ts index 52bac6ec0..d17d34d16 100644 --- a/ui/v2.5/src/core/files.ts +++ b/ui/v2.5/src/core/files.ts @@ -29,3 +29,28 @@ export function objectPath(s: IObjectWithFiles) { } return ""; } + +interface IObjectWithVisualFiles { + visual_files?: IFile[]; +} + +export interface IObjectWithTitleVisualFiles extends IObjectWithVisualFiles { + title?: GQL.Maybe; +} + +export function imageTitle(s: Partial) { + if (s.title) { + return s.title; + } + if (s.visual_files && s.visual_files.length > 0) { + return TextUtils.fileNameFromPath(s.visual_files[0].path); + } + return ""; +} + +export function imagePath(s: IObjectWithVisualFiles) { + if (s.visual_files && s.visual_files.length > 0) { + return s.visual_files[0].path; + } + return ""; +}