From f59ad0ca2b672d475f09d5f93f9456fc71dcfb23 Mon Sep 17 00:00:00 2001 From: friendlycrab <52448715+friendlycrab@users.noreply.github.com> Date: Wed, 5 Aug 2020 07:38:11 +0200 Subject: [PATCH] Allow adding performer & studio from scenes page (#663) * Allow adding performer & studio from scenes page Adds "create" options for performer and studio select in SceneEditPanel. Adds new FilterSelectComponent to reduce duplicate logic in selects. Make invalidateQueries case insensitive so we can pass upper-case query names that also work with refetchQueries --- .../components/Changelog/versions/v030.tsx | 1 + ui/v2.5/src/components/Shared/Select.tsx | 223 ++++++++---------- ui/v2.5/src/core/StashService.ts | 22 +- 3 files changed, 118 insertions(+), 128 deletions(-) diff --git a/ui/v2.5/src/components/Changelog/versions/v030.tsx b/ui/v2.5/src/components/Changelog/versions/v030.tsx index d6a34f92e..81327b9bf 100644 --- a/ui/v2.5/src/components/Changelog/versions/v030.tsx +++ b/ui/v2.5/src/components/Changelog/versions/v030.tsx @@ -13,6 +13,7 @@ const markup = ` * Add support for parent/child studios. ### 🎨 Improvements +* Allow adding performers and studios from selectors. * Add support for chrome dp in xpath scrapers. * Allow customisation of preview video generation. * Add support for live transcoding in Safari. diff --git a/ui/v2.5/src/components/Shared/Select.tsx b/ui/v2.5/src/components/Shared/Select.tsx index 9b75d2ea7..0c7e63c36 100644 --- a/ui/v2.5/src/components/Shared/Select.tsx +++ b/ui/v2.5/src/components/Shared/Select.tsx @@ -13,6 +13,8 @@ import { useScrapePerformerList, useValidGalleriesForScene, useTagCreate, + useStudioCreate, + usePerformerCreate, } from "src/core/StashService"; import { useToast } from "src/hooks"; @@ -59,6 +61,16 @@ interface ISelectProps { groupHeader?: string; closeMenuOnSelect?: boolean; } +interface IFilterItem { + id: string; + name?: string | null; +} +interface IFilterComponentProps extends IFilterProps { + items: Array; + onCreate?: (name: string) => Promise<{ item: IFilterItem; message: string }>; +} +interface IFilterSelectProps + extends Omit {} interface ISceneGallerySelect { initialId?: string; @@ -191,180 +203,151 @@ export const FilterSelect: React.FC = (props) => export const PerformerSelect: React.FC = (props) => { const { data, loading } = useAllPerformersForFilter(); + const [createPerformer] = usePerformerCreate(); - const normalizedData = data?.allPerformersSlim ?? []; - const items: Option[] = normalizedData.map((item) => ({ - value: item.id, - label: item.name ?? "", - })); - const placeholder = props.noSelectionString ?? "Select performer..."; - const selectedOptions: Option[] = props.ids - ? items.filter((item) => props.ids?.indexOf(item.value) !== -1) - : []; + const performers = data?.allPerformersSlim ?? []; - const onChange = (selectedItems: ValueType