From 96ce260a407ccae24fe36fc5fe64d6256ea233cd Mon Sep 17 00:00:00 2001 From: DingDongSoLong4 <99329275+DingDongSoLong4@users.noreply.github.com> Date: Fri, 17 Feb 2023 04:51:03 +0200 Subject: [PATCH 1/5] Fix allTags cache reset (#3444) --- graphql/documents/queries/misc.graphql | 6 ------ ui/v2.5/src/core/StashService.ts | 12 +----------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/graphql/documents/queries/misc.graphql b/graphql/documents/queries/misc.graphql index decb1c652..19d0d2b8b 100644 --- a/graphql/documents/queries/misc.graphql +++ b/graphql/documents/queries/misc.graphql @@ -6,12 +6,6 @@ query MarkerStrings($q: String, $sort: String) { } } -query AllTags { - allTags { - ...TagData - } -} - query AllPerformersForFilter { allPerformers { ...SlimPerformerData diff --git a/ui/v2.5/src/core/StashService.ts b/ui/v2.5/src/core/StashService.ts index 7aa6040a5..cab120612 100644 --- a/ui/v2.5/src/core/StashService.ts +++ b/ui/v2.5/src/core/StashService.ts @@ -313,7 +313,6 @@ export const usePlugins = () => GQL.usePluginsQuery(); export const usePluginTasks = () => GQL.usePluginTasksQuery(); export const useMarkerStrings = () => GQL.useMarkerStringsQuery(); -export const useAllTags = () => GQL.useAllTagsQuery(); export const useAllTagsForFilter = () => GQL.useAllTagsForFilterQuery(); export const useAllPerformersForFilter = () => GQL.useAllPerformersForFilterQuery(); @@ -408,7 +407,6 @@ const sceneMutationImpactedQueries = [ GQL.FindMoviesDocument, GQL.FindTagDocument, GQL.FindTagsDocument, - GQL.AllTagsDocument, ]; export const useSceneUpdate = () => @@ -572,7 +570,6 @@ const imageMutationImpactedQueries = [ GQL.FindStudiosDocument, GQL.FindTagDocument, GQL.FindTagsDocument, - GQL.AllTagsDocument, GQL.FindGalleryDocument, GQL.FindGalleriesDocument, ]; @@ -706,7 +703,6 @@ const galleryMutationImpactedQueries = [ GQL.FindStudiosDocument, GQL.FindTagDocument, GQL.FindTagsDocument, - GQL.AllTagsDocument, GQL.FindGalleryDocument, GQL.FindGalleriesDocument, ]; @@ -853,7 +849,6 @@ export const tagMutationImpactedQueries = [ GQL.FindSceneDocument, GQL.FindScenesDocument, GQL.FindSceneMarkersDocument, - GQL.AllTagsDocument, GQL.AllTagsForFilterDocument, GQL.FindTagsDocument, ]; @@ -861,15 +856,10 @@ export const tagMutationImpactedQueries = [ export const useTagCreate = () => GQL.useTagCreateMutation({ refetchQueries: getQueryNames([ - GQL.AllTagsDocument, GQL.AllTagsForFilterDocument, GQL.FindTagsDocument, ]), - update: deleteCache([ - GQL.FindTagsDocument, - GQL.AllTagsDocument, - GQL.AllTagsForFilterDocument, - ]), + update: deleteCache([GQL.AllTagsForFilterDocument, GQL.FindTagsDocument]), }); export const useTagUpdate = () => GQL.useTagUpdateMutation({ From ccbe3c4e92c2f24f57fda5fbcc131af97a12e578 Mon Sep 17 00:00:00 2001 From: DingDongSoLong4 <99329275+DingDongSoLong4@users.noreply.github.com> Date: Mon, 20 Feb 2023 00:12:22 +0200 Subject: [PATCH 2/5] Fix batch performer panic (#3456) --- internal/manager/task_stash_box_tag.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/internal/manager/task_stash_box_tag.go b/internal/manager/task_stash_box_tag.go index b9d80eaa4..246729733 100644 --- a/internal/manager/task_stash_box_tag.go +++ b/internal/manager/task_stash_box_tag.go @@ -191,8 +191,14 @@ func (t *StashBoxPerformerTagTask) stashBoxPerformerTag(ctx context.Context) { } } else if t.name != nil && performer.Name != nil { currentTime := time.Now() + var aliases []string + if performer.Aliases != nil { + aliases = stringslice.FromString(*performer.Aliases, ",") + } else { + aliases = []string{} + } newPerformer := models.Performer{ - Aliases: models.NewRelatedStrings(stringslice.FromString(*performer.Aliases, ",")), + Aliases: models.NewRelatedStrings(aliases), Birthdate: getDate(performer.Birthdate), CareerLength: getString(performer.CareerLength), Country: getString(performer.Country), From c7c4d5b126f7722a630db01e5cad8f05f2b7f51f Mon Sep 17 00:00:00 2001 From: DingDongSoLong4 <99329275+DingDongSoLong4@users.noreply.github.com> Date: Mon, 20 Feb 2023 00:24:47 +0200 Subject: [PATCH 3/5] Optimize allData queries (#3452) * Add specific fields to allData queries * Add additional allData endpoints --- graphql/documents/queries/misc.graphql | 13 +++-- graphql/schema/schema.graphql | 4 ++ internal/api/resolver_query_find_gallery.go | 11 ++++ internal/api/resolver_query_find_image.go | 11 ++++ internal/api/resolver_query_find_scene.go | 11 ++++ .../api/resolver_query_find_scene_marker.go | 11 ++++ pkg/models/mocks/SceneMarkerReaderWriter.go | 44 ++++++++++++++++ pkg/models/mocks/SceneReaderWriter.go | 50 +++++++++---------- pkg/models/scene_marker.go | 2 + pkg/sqlite/scene_marker.go | 8 +++ pkg/sqlite/scene_marker_test.go | 2 + .../Filters/HierarchicalLabelValueFilter.tsx | 10 ++-- .../List/Filters/LabeledIdFilter.tsx | 10 ++-- ui/v2.5/src/components/Shared/MultiSet.tsx | 10 +--- ui/v2.5/src/components/Shared/Select.tsx | 20 ++++---- .../Tagger/scenes/PerformerResult.tsx | 4 +- .../components/Tagger/scenes/StudioResult.tsx | 4 +- 17 files changed, 165 insertions(+), 60 deletions(-) diff --git a/graphql/documents/queries/misc.graphql b/graphql/documents/queries/misc.graphql index 19d0d2b8b..e653635dc 100644 --- a/graphql/documents/queries/misc.graphql +++ b/graphql/documents/queries/misc.graphql @@ -8,18 +8,25 @@ query MarkerStrings($q: String, $sort: String) { query AllPerformersForFilter { allPerformers { - ...SlimPerformerData + id + name + disambiguation + alias_list } } query AllStudiosForFilter { allStudios { - ...SlimStudioData + id + name + aliases } } + query AllMoviesForFilter { allMovies { - ...SlimMovieData + id + name } } diff --git a/graphql/schema/schema.graphql b/graphql/schema/schema.graphql index 3bdcba5aa..9964b7d5d 100644 --- a/graphql/schema/schema.graphql +++ b/graphql/schema/schema.graphql @@ -144,6 +144,10 @@ type Query { # Get everything + allScenes: [Scene!]! + allSceneMarkers: [SceneMarker!]! + allImages: [Image!]! + allGalleries: [Gallery!]! allPerformers: [Performer!]! allStudios: [Studio!]! allMovies: [Movie!]! diff --git a/internal/api/resolver_query_find_gallery.go b/internal/api/resolver_query_find_gallery.go index e8d47d70b..6474cc03e 100644 --- a/internal/api/resolver_query_find_gallery.go +++ b/internal/api/resolver_query_find_gallery.go @@ -41,3 +41,14 @@ func (r *queryResolver) FindGalleries(ctx context.Context, galleryFilter *models return ret, nil } + +func (r *queryResolver) AllGalleries(ctx context.Context) (ret []*models.Gallery, err error) { + if err := r.withReadTxn(ctx, func(ctx context.Context) error { + ret, err = r.repository.Gallery.All(ctx) + return err + }); err != nil { + return nil, err + } + + return ret, nil +} diff --git a/internal/api/resolver_query_find_image.go b/internal/api/resolver_query_find_image.go index 6468ba9f3..6d33e8820 100644 --- a/internal/api/resolver_query_find_image.go +++ b/internal/api/resolver_query_find_image.go @@ -84,3 +84,14 @@ func (r *queryResolver) FindImages(ctx context.Context, imageFilter *models.Imag return ret, nil } + +func (r *queryResolver) AllImages(ctx context.Context) (ret []*models.Image, err error) { + if err := r.withReadTxn(ctx, func(ctx context.Context) error { + ret, err = r.repository.Image.All(ctx) + return err + }); err != nil { + return nil, err + } + + return ret, nil +} diff --git a/internal/api/resolver_query_find_scene.go b/internal/api/resolver_query_find_scene.go index 95519cd49..db72232d3 100644 --- a/internal/api/resolver_query_find_scene.go +++ b/internal/api/resolver_query_find_scene.go @@ -232,3 +232,14 @@ func (r *queryResolver) FindDuplicateScenes(ctx context.Context, distance *int) return ret, nil } + +func (r *queryResolver) AllScenes(ctx context.Context) (ret []*models.Scene, err error) { + if err := r.withReadTxn(ctx, func(ctx context.Context) error { + ret, err = r.repository.Scene.All(ctx) + return err + }); err != nil { + return nil, err + } + + return ret, nil +} diff --git a/internal/api/resolver_query_find_scene_marker.go b/internal/api/resolver_query_find_scene_marker.go index 4bd70e658..895ebc057 100644 --- a/internal/api/resolver_query_find_scene_marker.go +++ b/internal/api/resolver_query_find_scene_marker.go @@ -24,3 +24,14 @@ func (r *queryResolver) FindSceneMarkers(ctx context.Context, sceneMarkerFilter return ret, nil } + +func (r *queryResolver) AllSceneMarkers(ctx context.Context) (ret []*models.SceneMarker, err error) { + if err := r.withReadTxn(ctx, func(ctx context.Context) error { + ret, err = r.repository.SceneMarker.All(ctx) + return err + }); err != nil { + return nil, err + } + + return ret, nil +} diff --git a/pkg/models/mocks/SceneMarkerReaderWriter.go b/pkg/models/mocks/SceneMarkerReaderWriter.go index 695a54391..ef6e9cc78 100644 --- a/pkg/models/mocks/SceneMarkerReaderWriter.go +++ b/pkg/models/mocks/SceneMarkerReaderWriter.go @@ -14,6 +14,50 @@ type SceneMarkerReaderWriter struct { mock.Mock } +// All provides a mock function with given fields: ctx +func (_m *SceneMarkerReaderWriter) All(ctx context.Context) ([]*models.SceneMarker, error) { + ret := _m.Called(ctx) + + var r0 []*models.SceneMarker + if rf, ok := ret.Get(0).(func(context.Context) []*models.SceneMarker); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*models.SceneMarker) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Count provides a mock function with given fields: ctx +func (_m *SceneMarkerReaderWriter) Count(ctx context.Context) (int, error) { + ret := _m.Called(ctx) + + var r0 int + if rf, ok := ret.Get(0).(func(context.Context) int); ok { + r0 = rf(ctx) + } else { + r0 = ret.Get(0).(int) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // CountByTagID provides a mock function with given fields: ctx, tagID func (_m *SceneMarkerReaderWriter) CountByTagID(ctx context.Context, tagID int) (int, error) { ret := _m.Called(ctx, tagID) diff --git a/pkg/models/mocks/SceneReaderWriter.go b/pkg/models/mocks/SceneReaderWriter.go index 74ad7dc4b..bb6e6d4a5 100644 --- a/pkg/models/mocks/SceneReaderWriter.go +++ b/pkg/models/mocks/SceneReaderWriter.go @@ -638,29 +638,8 @@ func (_m *SceneReaderWriter) GetTagIDs(ctx context.Context, relatedID int) ([]in return r0, r1 } -// SaveActivity provides a mock function with given fields: ctx, id, resumeTime, playDuration -func (_m *SceneReaderWriter) SaveActivity(ctx context.Context, id int, resumeTime *float64, playDuration *float64) (bool, error) { - ret := _m.Called(ctx, id, resumeTime, playDuration) - - var r0 bool - if rf, ok := ret.Get(0).(func(context.Context, int, *float64, *float64) bool); ok { - r0 = rf(ctx, id, resumeTime, playDuration) - } else { - r0 = ret.Get(0).(bool) - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, int, *float64, *float64) error); ok { - r1 = rf(ctx, id, resumeTime, playDuration) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// IncrementWatchCount provides a mock function with given fields: ctx, id -func (_m *SceneReaderWriter) IncrementWatchCount(ctx context.Context, id int) (int, error) { +// IncrementOCounter provides a mock function with given fields: ctx, id +func (_m *SceneReaderWriter) IncrementOCounter(ctx context.Context, id int) (int, error) { ret := _m.Called(ctx, id) var r0 int @@ -680,8 +659,8 @@ func (_m *SceneReaderWriter) IncrementWatchCount(ctx context.Context, id int) (i return r0, r1 } -// IncrementOCounter provides a mock function with given fields: ctx, id -func (_m *SceneReaderWriter) IncrementOCounter(ctx context.Context, id int) (int, error) { +// IncrementWatchCount provides a mock function with given fields: ctx, id +func (_m *SceneReaderWriter) IncrementWatchCount(ctx context.Context, id int) (int, error) { ret := _m.Called(ctx, id) var r0 int @@ -745,6 +724,27 @@ func (_m *SceneReaderWriter) ResetOCounter(ctx context.Context, id int) (int, er return r0, r1 } +// SaveActivity provides a mock function with given fields: ctx, id, resumeTime, playDuration +func (_m *SceneReaderWriter) SaveActivity(ctx context.Context, id int, resumeTime *float64, playDuration *float64) (bool, error) { + ret := _m.Called(ctx, id, resumeTime, playDuration) + + var r0 bool + if rf, ok := ret.Get(0).(func(context.Context, int, *float64, *float64) bool); ok { + r0 = rf(ctx, id, resumeTime, playDuration) + } else { + r0 = ret.Get(0).(bool) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, int, *float64, *float64) error); ok { + r1 = rf(ctx, id, resumeTime, playDuration) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // Size provides a mock function with given fields: ctx func (_m *SceneReaderWriter) Size(ctx context.Context) (float64, error) { ret := _m.Called(ctx) diff --git a/pkg/models/scene_marker.go b/pkg/models/scene_marker.go index 3251f6a00..2ae8c3343 100644 --- a/pkg/models/scene_marker.go +++ b/pkg/models/scene_marker.go @@ -36,6 +36,8 @@ type SceneMarkerReader interface { CountByTagID(ctx context.Context, tagID int) (int, error) GetMarkerStrings(ctx context.Context, q *string, sort *string) ([]*MarkerStringsResultType, error) Wall(ctx context.Context, q *string) ([]*SceneMarker, error) + Count(ctx context.Context) (int, error) + All(ctx context.Context) ([]*SceneMarker, error) Query(ctx context.Context, sceneMarkerFilter *SceneMarkerFilterType, findFilter *FindFilterType) ([]*SceneMarker, int, error) GetTagIDs(ctx context.Context, imageID int) ([]int, error) } diff --git a/pkg/sqlite/scene_marker.go b/pkg/sqlite/scene_marker.go index d3f520be8..df3c73030 100644 --- a/pkg/sqlite/scene_marker.go +++ b/pkg/sqlite/scene_marker.go @@ -346,3 +346,11 @@ func (qb *sceneMarkerQueryBuilder) UpdateTags(ctx context.Context, id int, tagID // Delete the existing joins and then create new ones return qb.tagsRepository().replace(ctx, id, tagIDs) } + +func (qb *sceneMarkerQueryBuilder) Count(ctx context.Context) (int, error) { + return qb.runCountQuery(ctx, qb.buildCountQuery("SELECT scene_markers.id FROM scene_markers"), nil) +} + +func (qb *sceneMarkerQueryBuilder) All(ctx context.Context) ([]*models.SceneMarker, error) { + return qb.querySceneMarkers(ctx, selectAll("scene_markers")+qb.getSceneMarkerSort(nil, nil), nil) +} diff --git a/pkg/sqlite/scene_marker_test.go b/pkg/sqlite/scene_marker_test.go index 76a4dd845..9c5ae866f 100644 --- a/pkg/sqlite/scene_marker_test.go +++ b/pkg/sqlite/scene_marker_test.go @@ -222,4 +222,6 @@ func queryMarkers(ctx context.Context, t *testing.T, sqb models.SceneMarkerReade // TODO Find // TODO GetMarkerStrings // TODO Wall +// TODO Count +// TODO All // TODO Query diff --git a/ui/v2.5/src/components/List/Filters/HierarchicalLabelValueFilter.tsx b/ui/v2.5/src/components/List/Filters/HierarchicalLabelValueFilter.tsx index 52a3bae7e..330a756b9 100644 --- a/ui/v2.5/src/components/List/Filters/HierarchicalLabelValueFilter.tsx +++ b/ui/v2.5/src/components/List/Filters/HierarchicalLabelValueFilter.tsx @@ -1,9 +1,9 @@ import React from "react"; import { Form } from "react-bootstrap"; import { defineMessages, MessageDescriptor, useIntl } from "react-intl"; -import { FilterSelect, ValidTypes } from "../../Shared"; -import { Criterion } from "../../../models/list-filter/criteria/criterion"; -import { IHierarchicalLabelValue } from "../../../models/list-filter/types"; +import { FilterSelect, SelectObject } from "src/components/Shared/Select"; +import { Criterion } from "src/models/list-filter/criteria/criterion"; +import { IHierarchicalLabelValue } from "src/models/list-filter/types"; interface IHierarchicalLabelValueFilterProps { criterion: Criterion; @@ -36,11 +36,11 @@ export const HierarchicalLabelValueFilter: React.FC ({ id: i.id, - label: i.name!, + label: i.name ?? i.title ?? "", })); onValueChanged(value); } diff --git a/ui/v2.5/src/components/List/Filters/LabeledIdFilter.tsx b/ui/v2.5/src/components/List/Filters/LabeledIdFilter.tsx index 09245adb9..b859f8345 100644 --- a/ui/v2.5/src/components/List/Filters/LabeledIdFilter.tsx +++ b/ui/v2.5/src/components/List/Filters/LabeledIdFilter.tsx @@ -1,8 +1,8 @@ import React from "react"; import { Form } from "react-bootstrap"; -import { FilterSelect, ValidTypes } from "../../Shared"; -import { Criterion } from "../../../models/list-filter/criteria/criterion"; -import { ILabeledId } from "../../../models/list-filter/types"; +import { FilterSelect, SelectObject } from "src/components/Shared/Select"; +import { Criterion } from "src/models/list-filter/criteria/criterion"; +import { ILabeledId } from "src/models/list-filter/types"; interface ILabeledIdFilterProps { criterion: Criterion; @@ -26,11 +26,11 @@ export const LabeledIdFilter: React.FC = ({ ) return null; - function onSelectionChanged(items: ValidTypes[]) { + function onSelectionChanged(items: SelectObject[]) { onValueChanged( items.map((i) => ({ id: i.id, - label: i.name!, + label: i.name ?? i.title ?? "", })) ); } diff --git a/ui/v2.5/src/components/Shared/MultiSet.tsx b/ui/v2.5/src/components/Shared/MultiSet.tsx index 6f7aa08e4..6230dfbb7 100644 --- a/ui/v2.5/src/components/Shared/MultiSet.tsx +++ b/ui/v2.5/src/components/Shared/MultiSet.tsx @@ -3,13 +3,7 @@ import { useIntl } from "react-intl"; import * as GQL from "src/core/generated-graphql"; import { Button, ButtonGroup } from "react-bootstrap"; -import { FilterSelect } from "./Select"; - -type ValidTypes = - | GQL.SlimPerformerDataFragment - | GQL.SlimTagDataFragment - | GQL.SlimStudioDataFragment - | GQL.SlimMovieDataFragment; +import { FilterSelect, SelectObject } from "./Select"; interface IMultiSetProps { type: "performers" | "studios" | "tags" | "movies"; @@ -31,7 +25,7 @@ const MultiSet: React.FunctionComponent = ( GQL.BulkUpdateIdMode.Remove, ]; - function onUpdate(items: ValidTypes[]) { + function onUpdate(items: SelectObject[]) { props.onUpdate(items.map((i) => i.id)); } diff --git a/ui/v2.5/src/components/Shared/Select.tsx b/ui/v2.5/src/components/Shared/Select.tsx index 3ff947974..e3734f80b 100644 --- a/ui/v2.5/src/components/Shared/Select.tsx +++ b/ui/v2.5/src/components/Shared/Select.tsx @@ -31,11 +31,11 @@ import { objectTitle } from "src/core/files"; import { galleryTitle } from "src/core/galleries"; import { TagPopover } from "../Tags/TagPopover"; -export type ValidTypes = - | GQL.SlimPerformerDataFragment - | GQL.SlimTagDataFragment - | GQL.SlimStudioDataFragment - | GQL.SlimMovieDataFragment; +export type SelectObject = { + id: string; + name?: string | null; + title?: string | null; +}; type Option = { value: string; label: string }; interface ITypeProps { @@ -53,7 +53,7 @@ interface ITypeProps { interface IFilterProps { ids?: string[]; initialIds?: string[]; - onSelect?: (item: ValidTypes[]) => void; + onSelect?: (item: SelectObject[]) => void; noSelectionString?: string; className?: string; isMulti?: boolean; @@ -90,9 +90,9 @@ interface ISelectProps { noOptionsMessage?: string | null; } interface IFilterComponentProps extends IFilterProps { - items: Array; - toOption?: (item: ValidTypes) => Option; - onCreate?: (name: string) => Promise<{ item: ValidTypes; message: string }>; + items: SelectObject[]; + toOption?: (item: SelectObject) => Option; + onCreate?: (name: string) => Promise<{ item: SelectObject; message: string }>; } interface IFilterSelectProps extends Omit, "onChange" | "items" | "onCreateOption"> {} @@ -272,7 +272,7 @@ const FilterSelectComponent = ( } return { value: i.id, - label: i.name ?? "", + label: i.name ?? i.title ?? "", }; }); diff --git a/ui/v2.5/src/components/Tagger/scenes/PerformerResult.tsx b/ui/v2.5/src/components/Tagger/scenes/PerformerResult.tsx index 12bbef5d9..79e562ad3 100755 --- a/ui/v2.5/src/components/Tagger/scenes/PerformerResult.tsx +++ b/ui/v2.5/src/components/Tagger/scenes/PerformerResult.tsx @@ -8,7 +8,7 @@ import { Icon, OperationButton, PerformerSelect, - ValidTypes, + SelectObject, } from "src/components/Shared"; import { OptionalField } from "../IncludeButton"; import { faSave } from "@fortawesome/free-solid-svg-icons"; @@ -43,7 +43,7 @@ const PerformerResult: React.FC = ({ (stashID) => stashID.endpoint === endpoint && stashID.stash_id ); - const handlePerformerSelect = (performers: ValidTypes[]) => { + const handlePerformerSelect = (performers: SelectObject[]) => { if (performers.length) { setSelectedID(performers[0].id); } else { diff --git a/ui/v2.5/src/components/Tagger/scenes/StudioResult.tsx b/ui/v2.5/src/components/Tagger/scenes/StudioResult.tsx index 25a97c112..d7b26d94c 100755 --- a/ui/v2.5/src/components/Tagger/scenes/StudioResult.tsx +++ b/ui/v2.5/src/components/Tagger/scenes/StudioResult.tsx @@ -7,7 +7,7 @@ import { Icon, OperationButton, StudioSelect, - ValidTypes, + SelectObject, } from "src/components/Shared"; import * as GQL from "src/core/generated-graphql"; @@ -41,7 +41,7 @@ const StudioResult: React.FC = ({ (stashID) => stashID.endpoint === endpoint && stashID.stash_id ); - const handleSelect = (studios: ValidTypes[]) => { + const handleSelect = (studios: SelectObject[]) => { if (studios.length) { setSelectedID(studios[0].id); } else { From dd5cff2aec5710ec825c8bdb0345b5aa603c077b Mon Sep 17 00:00:00 2001 From: DingDongSoLong4 <99329275+DingDongSoLong4@users.noreply.github.com> Date: Mon, 20 Feb 2023 00:25:48 +0200 Subject: [PATCH 4/5] Minor gallery-related fixes (#3448) * Fix gallery titles * Fix SceneListTable --- graphql/documents/data/scene-slim.graphql | 3 ++ .../Dialogs/IdentifyDialog/styles.scss | 4 -- .../Scenes/SceneDetails/SceneEditPanel.tsx | 3 +- .../src/components/Scenes/SceneListTable.tsx | 47 +++++++++---------- ui/v2.5/src/styles/_theme.scss | 8 ---- 5 files changed, 28 insertions(+), 37 deletions(-) diff --git a/graphql/documents/data/scene-slim.graphql b/graphql/documents/data/scene-slim.graphql index 3e0749dd8..b6ed326e0 100644 --- a/graphql/documents/data/scene-slim.graphql +++ b/graphql/documents/data/scene-slim.graphql @@ -46,6 +46,9 @@ fragment SlimSceneData on Scene { files { path } + folder { + path + } title } diff --git a/ui/v2.5/src/components/Dialogs/IdentifyDialog/styles.scss b/ui/v2.5/src/components/Dialogs/IdentifyDialog/styles.scss index 450b31e86..dcaeb054c 100644 --- a/ui/v2.5/src/components/Dialogs/IdentifyDialog/styles.scss +++ b/ui/v2.5/src/components/Dialogs/IdentifyDialog/styles.scss @@ -32,7 +32,3 @@ margin-right: 0.25em; } } - -.field-options-table td:first-child { - padding-left: 0.75rem; -} diff --git a/ui/v2.5/src/components/Scenes/SceneDetails/SceneEditPanel.tsx b/ui/v2.5/src/components/Scenes/SceneDetails/SceneEditPanel.tsx index 5fba98e27..f002bc300 100644 --- a/ui/v2.5/src/components/Scenes/SceneDetails/SceneEditPanel.tsx +++ b/ui/v2.5/src/components/Scenes/SceneDetails/SceneEditPanel.tsx @@ -47,6 +47,7 @@ import { faTrashAlt, } from "@fortawesome/free-solid-svg-icons"; import { objectTitle } from "src/core/files"; +import { galleryTitle } from "src/core/galleries"; import { useRatingKeybinds } from "src/hooks/keybinds"; const SceneScrapeDialog = lazy(() => import("./SceneScrapeDialog")); @@ -105,7 +106,7 @@ export const SceneEditPanel: React.FC = ({ setGalleries( scene.galleries?.map((g) => ({ id: g.id, - title: objectTitle(g), + title: galleryTitle(g), })) ?? [] ); }, [scene.galleries]); diff --git a/ui/v2.5/src/components/Scenes/SceneListTable.tsx b/ui/v2.5/src/components/Scenes/SceneListTable.tsx index 7bf546257..c73c5cffe 100644 --- a/ui/v2.5/src/components/Scenes/SceneListTable.tsx +++ b/ui/v2.5/src/components/Scenes/SceneListTable.tsx @@ -1,13 +1,12 @@ -// @ts-nocheck -/* eslint-disable jsx-a11y/control-has-associated-label */ import React from "react"; -import { Table, Button, Form } from "react-bootstrap"; +import { Table, Form } from "react-bootstrap"; import { Link } from "react-router-dom"; import * as GQL from "src/core/generated-graphql"; import { NavUtils, TextUtils } from "src/utils"; -import { Icon } from "src/components/Shared"; import { FormattedMessage } from "react-intl"; import { objectTitle } from "src/core/files"; +import { galleryTitle } from "src/core/galleries"; +import SceneQueue from "src/models/sceneQueue"; interface ISceneListTableProps { scenes: GQL.SlimSceneDataFragment[]; @@ -19,14 +18,14 @@ interface ISceneListTableProps { export const SceneListTable: React.FC = ( props: ISceneListTableProps ) => { - const renderTags = (tags: GQL.SlimTagDataFragment[]) => + const renderTags = (tags: Partial[]) => tags.map((tag) => (
{tag.name}
)); - const renderPerformers = (performers: Partial[]) => + const renderPerformers = (performers: Partial[]) => performers.map((performer) => (
{performer.name}
@@ -34,13 +33,21 @@ export const SceneListTable: React.FC = ( )); const renderMovies = (scene: GQL.SlimSceneDataFragment) => - scene.movies.map((sceneMovie) => - !sceneMovie.movie ? undefined : ( - -
{sceneMovie.movie.name}
- - ) - ); + scene.movies.map((sceneMovie) => ( + +
{sceneMovie.movie.name}
+ + )); + + const renderGalleries = (scene: GQL.SlimSceneDataFragment) => + scene.galleries.map((gallery) => ( + +
{galleryTitle(gallery)}
+ + )); const renderSceneRow = (scene: GQL.SlimSceneDataFragment, index: number) => { const sceneLink = props.queue @@ -60,7 +67,7 @@ export const SceneListTable: React.FC = ( type="checkbox" checked={props.selectedIds.has(scene.id)} onChange={() => - props.onSelectChange!( + props.onSelectChange( scene.id, !props.selectedIds.has(scene.id), shiftKey @@ -102,15 +109,7 @@ export const SceneListTable: React.FC = ( )} {renderMovies(scene)} - - {scene.gallery && ( - - )} - + {renderGalleries(scene)} ); }; @@ -144,7 +143,7 @@ export const SceneListTable: React.FC = ( - + diff --git a/ui/v2.5/src/styles/_theme.scss b/ui/v2.5/src/styles/_theme.scss index 03f7e8b8c..e680335e2 100644 --- a/ui/v2.5/src/styles/_theme.scss +++ b/ui/v2.5/src/styles/_theme.scss @@ -126,14 +126,6 @@ hr { border: none; border-color: #414c53; padding: 0.25rem 0.75rem; - - &:first-child { - padding-left: 0; - } - - &:last-child { - padding-right: 0; - } } } From e9fa7d071e3587d393cedca735874214e06ff9d9 Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Tue, 21 Feb 2023 12:06:17 +1100 Subject: [PATCH 5/5] Add changelog entries --- ui/v2.5/src/docs/en/Changelog/v0190.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/v2.5/src/docs/en/Changelog/v0190.md b/ui/v2.5/src/docs/en/Changelog/v0190.md index 6e6169c90..9de63607b 100644 --- a/ui/v2.5/src/docs/en/Changelog/v0190.md +++ b/ui/v2.5/src/docs/en/Changelog/v0190.md @@ -14,6 +14,8 @@ * Changed performer aliases to be a list, rather than a string field. ([#3113](https://github.com/stashapp/stash/pull/3113)) ### 🐛 Bug fixes +* **[0.19.1]** Fixed performance issues with Scene Tagger view. ([#3444](https://github.com/stashapp/stash/pull/3444), [#3452](https://github.com/stashapp/stash/pull/3452)) +* **[0.19.1]** Fixed panic when batch adding performers from the Tagger view. ([#3456](https://github.com/stashapp/stash/pull/3456)) * Fixed folder symlinks not being handled correctly during clean. ([#3415](https://github.com/stashapp/stash/pull/3415)) * Fixed error when clicking Scrape All when a file-less scene is in the scene list. ([#3414](https://github.com/stashapp/stash/pull/3414)) * Fixed clicking popover pills not clearing search term. ([#3408](https://github.com/stashapp/stash/pull/3408))