mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 20:34:37 +03:00
Performer/Studio/Tag/Gallery Create compnent has default name as search query (#2701)
* feat: Closes #2618 fix: New button is now available even if pathname ends with '/'
This commit is contained in:
@@ -1,10 +1,19 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import { FormattedMessage, useIntl } from "react-intl";
|
import { FormattedMessage, useIntl } from "react-intl";
|
||||||
|
import { useLocation } from "react-router-dom";
|
||||||
import { GalleryEditPanel } from "./GalleryEditPanel";
|
import { GalleryEditPanel } from "./GalleryEditPanel";
|
||||||
|
|
||||||
const GalleryCreate: React.FC = () => {
|
const GalleryCreate: React.FC = () => {
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
|
|
||||||
|
function useQuery() {
|
||||||
|
const { search } = useLocation();
|
||||||
|
return React.useMemo(() => new URLSearchParams(search), [search]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const query = useQuery();
|
||||||
|
const nameQuery = query.get("name");
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="row new-view">
|
<div className="row new-view">
|
||||||
<div className="col-md-6">
|
<div className="col-md-6">
|
||||||
@@ -16,7 +25,7 @@ const GalleryCreate: React.FC = () => {
|
|||||||
</h2>
|
</h2>
|
||||||
<GalleryEditPanel
|
<GalleryEditPanel
|
||||||
isNew
|
isNew
|
||||||
gallery={undefined}
|
gallery={{ title: nameQuery ?? "" }}
|
||||||
isVisible
|
isVisible
|
||||||
onDelete={() => {}}
|
onDelete={() => {}}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ interface IProps {
|
|||||||
|
|
||||||
interface INewProps {
|
interface INewProps {
|
||||||
isNew: true;
|
isNew: true;
|
||||||
gallery: undefined;
|
gallery?: Partial<GQL.GalleryDataFragment>;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IExistingProps {
|
interface IExistingProps {
|
||||||
@@ -240,7 +240,7 @@ export const GalleryEditPanel: React.FC<
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function onScrapeClicked(scraper: GQL.Scraper) {
|
async function onScrapeClicked(scraper: GQL.Scraper) {
|
||||||
if (!gallery) return;
|
if (!gallery || !gallery.id) return;
|
||||||
|
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -217,8 +217,14 @@ export const MainNavbar: React.FC = () => {
|
|||||||
[history]
|
[history]
|
||||||
);
|
);
|
||||||
|
|
||||||
const { pathname } = location;
|
const pathname = location.pathname.replace(/\/$/, "");
|
||||||
const newPath = newPathsList.includes(pathname) ? `${pathname}/new` : null;
|
let newPath = newPathsList.includes(pathname) ? `${pathname}/new` : null;
|
||||||
|
if (newPath != null) {
|
||||||
|
let queryParam = new URLSearchParams(location.search).get("q");
|
||||||
|
if (queryParam != null) {
|
||||||
|
newPath += "?name=" + encodeURIComponent(queryParam);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// set up hotkeys
|
// set up hotkeys
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -230,7 +236,7 @@ export const MainNavbar: React.FC = () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (newPath) {
|
if (newPath) {
|
||||||
Mousetrap.bind("n", () => history.push(newPath));
|
Mousetrap.bind("n", () => history.push(String(newPath)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
|
|||||||
@@ -2,11 +2,20 @@ import React, { useState } from "react";
|
|||||||
import { FormattedMessage, useIntl } from "react-intl";
|
import { FormattedMessage, useIntl } from "react-intl";
|
||||||
import { LoadingIndicator } from "src/components/Shared";
|
import { LoadingIndicator } from "src/components/Shared";
|
||||||
import { PerformerEditPanel } from "./PerformerEditPanel";
|
import { PerformerEditPanel } from "./PerformerEditPanel";
|
||||||
|
import { useLocation } from "react-router-dom";
|
||||||
|
|
||||||
const PerformerCreate: React.FC = () => {
|
const PerformerCreate: React.FC = () => {
|
||||||
const [imagePreview, setImagePreview] = useState<string | null>();
|
const [imagePreview, setImagePreview] = useState<string | null>();
|
||||||
const [imageEncoding, setImageEncoding] = useState<boolean>(false);
|
const [imageEncoding, setImageEncoding] = useState<boolean>(false);
|
||||||
|
|
||||||
|
function useQuery() {
|
||||||
|
const { search } = useLocation();
|
||||||
|
return React.useMemo(() => new URLSearchParams(search), [search]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const query = useQuery();
|
||||||
|
const nameQuery = query.get("name");
|
||||||
|
|
||||||
const activeImage = imagePreview ?? "";
|
const activeImage = imagePreview ?? "";
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
|
|
||||||
@@ -41,7 +50,7 @@ const PerformerCreate: React.FC = () => {
|
|||||||
/>
|
/>
|
||||||
</h2>
|
</h2>
|
||||||
<PerformerEditPanel
|
<PerformerEditPanel
|
||||||
performer={{}}
|
performer={{ name: nameQuery ?? "" }}
|
||||||
isVisible
|
isVisible
|
||||||
isNew
|
isNew
|
||||||
onImageChange={onImageChange}
|
onImageChange={onImageChange}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { useHistory } from "react-router-dom";
|
import { useHistory, useLocation } from "react-router-dom";
|
||||||
import { useIntl } from "react-intl";
|
import { useIntl } from "react-intl";
|
||||||
|
|
||||||
import * as GQL from "src/core/generated-graphql";
|
import * as GQL from "src/core/generated-graphql";
|
||||||
@@ -12,6 +12,15 @@ import { StudioEditPanel } from "./StudioEditPanel";
|
|||||||
const StudioCreate: React.FC = () => {
|
const StudioCreate: React.FC = () => {
|
||||||
const history = useHistory();
|
const history = useHistory();
|
||||||
const Toast = useToast();
|
const Toast = useToast();
|
||||||
|
|
||||||
|
function useQuery() {
|
||||||
|
const { search } = useLocation();
|
||||||
|
return React.useMemo(() => new URLSearchParams(search), [search]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const query = useQuery();
|
||||||
|
const nameQuery = query.get("name");
|
||||||
|
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
|
|
||||||
// Studio state
|
// Studio state
|
||||||
@@ -65,7 +74,7 @@ const StudioCreate: React.FC = () => {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<StudioEditPanel
|
<StudioEditPanel
|
||||||
studio={{}}
|
studio={{ name: nameQuery ?? "" }}
|
||||||
onSubmit={onSave}
|
onSubmit={onSave}
|
||||||
onImageChange={setImage}
|
onImageChange={setImage}
|
||||||
onCancel={() => history.push("/studios")}
|
onCancel={() => history.push("/studios")}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { useHistory } from "react-router-dom";
|
import { useHistory, useLocation } from "react-router-dom";
|
||||||
|
|
||||||
import * as GQL from "src/core/generated-graphql";
|
import * as GQL from "src/core/generated-graphql";
|
||||||
import { useTagCreate } from "src/core/StashService";
|
import { useTagCreate } from "src/core/StashService";
|
||||||
@@ -13,6 +13,14 @@ const TagCreate: React.FC = () => {
|
|||||||
const history = useHistory();
|
const history = useHistory();
|
||||||
const Toast = useToast();
|
const Toast = useToast();
|
||||||
|
|
||||||
|
function useQuery() {
|
||||||
|
const { search } = useLocation();
|
||||||
|
return React.useMemo(() => new URLSearchParams(search), [search]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const query = useQuery();
|
||||||
|
const nameQuery = query.get("name");
|
||||||
|
|
||||||
// Editing tag state
|
// Editing tag state
|
||||||
const [image, setImage] = useState<string | null>();
|
const [image, setImage] = useState<string | null>();
|
||||||
|
|
||||||
@@ -78,6 +86,7 @@ const TagCreate: React.FC = () => {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<TagEditPanel
|
<TagEditPanel
|
||||||
|
tag={{ name: nameQuery ?? "" }}
|
||||||
onSubmit={onSave}
|
onSubmit={onSave}
|
||||||
onCancel={() => history.push("/tags")}
|
onCancel={() => history.push("/tags")}
|
||||||
onDelete={() => {}}
|
onDelete={() => {}}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { DetailsEditNavbar, TagSelect } from "src/components/Shared";
|
|||||||
import { Form, Col, Row } from "react-bootstrap";
|
import { Form, Col, Row } from "react-bootstrap";
|
||||||
import { FormUtils, ImageUtils } from "src/utils";
|
import { FormUtils, ImageUtils } from "src/utils";
|
||||||
import { useFormik } from "formik";
|
import { useFormik } from "formik";
|
||||||
import { Prompt, useHistory } from "react-router-dom";
|
import { Prompt, useHistory, useParams } from "react-router-dom";
|
||||||
import Mousetrap from "mousetrap";
|
import Mousetrap from "mousetrap";
|
||||||
import { StringListInput } from "src/components/Shared/StringListInput";
|
import { StringListInput } from "src/components/Shared/StringListInput";
|
||||||
|
|
||||||
@@ -21,6 +21,10 @@ interface ITagEditPanel {
|
|||||||
setImage: (image?: string | null) => void;
|
setImage: (image?: string | null) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface ITagEditPanelParams {
|
||||||
|
id?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export const TagEditPanel: React.FC<ITagEditPanel> = ({
|
export const TagEditPanel: React.FC<ITagEditPanel> = ({
|
||||||
tag,
|
tag,
|
||||||
onSubmit,
|
onSubmit,
|
||||||
@@ -31,7 +35,10 @@ export const TagEditPanel: React.FC<ITagEditPanel> = ({
|
|||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const history = useHistory();
|
const history = useHistory();
|
||||||
|
|
||||||
const isNew = tag === undefined;
|
const params = useParams<ITagEditPanelParams>();
|
||||||
|
const idParam = params.id;
|
||||||
|
|
||||||
|
const isNew = idParam === undefined;
|
||||||
|
|
||||||
const labelXS = 3;
|
const labelXS = 3;
|
||||||
const labelXL = 3;
|
const labelXL = 3;
|
||||||
|
|||||||
@@ -4,15 +4,8 @@ After migrating, please run a scan on your entire library to populate missing da
|
|||||||
* Missing covers are not currently regenerated.
|
* Missing covers are not currently regenerated.
|
||||||
* Import/export schema has changed and is incompatible with the previous version.
|
* Import/export schema has changed and is incompatible with the previous version.
|
||||||
|
|
||||||
### 🐛 Bug fixes
|
|
||||||
* Fix continue queue checkbox value not persisting. ([#2895](https://github.com/stashapp/stash/pull/2895))
|
|
||||||
* Fix `autostartVideoOnPlaySelected` option not applying when navigating from scene queue. ([#2896](https://github.com/stashapp/stash/pull/2896))
|
|
||||||
* Fix incorrect gallery value in Scene edit tab after navigating from scene queue. ([#2897](https://github.com/stashapp/stash/pull/2897))
|
|
||||||
* Fix https schema not being used over some https connections. ([#2900](https://github.com/stashapp/stash/pull/2900))
|
|
||||||
* Fix scene files not deleting correctly when streaming over https. ([#2900](https://github.com/stashapp/stash/pull/2900))
|
|
||||||
* Fix panic when custom performer image location is invalid. ([#2894](https://github.com/stashapp/stash/pull/2894))
|
|
||||||
|
|
||||||
### ✨ New Features
|
### ✨ New Features
|
||||||
|
* Populate name from query field when creating new performer/studio/tag/gallery. ([#2701](https://github.com/stashapp/stash/pull/2701))
|
||||||
* Added support for identical files. Identical files are assigned to the same scene/gallery/image and can be viewed in File Info. ([#2676](https://github.com/stashapp/stash/pull/2676))
|
* Added support for identical files. Identical files are assigned to the same scene/gallery/image and can be viewed in File Info. ([#2676](https://github.com/stashapp/stash/pull/2676))
|
||||||
* Added support for filtering and sorting by file count. ([#2744](https://github.com/stashapp/stash/pull/2744))
|
* Added support for filtering and sorting by file count. ([#2744](https://github.com/stashapp/stash/pull/2744))
|
||||||
* Added release notes dialog. ([#2726](https://github.com/stashapp/stash/pull/2726))
|
* Added release notes dialog. ([#2726](https://github.com/stashapp/stash/pull/2726))
|
||||||
@@ -21,3 +14,11 @@ After migrating, please run a scan on your entire library to populate missing da
|
|||||||
* Object titles are now displayed as the file basename if the title is not explicitly set. The `Don't include file extension as part of the title` scan flag is no longer supported.
|
* Object titles are now displayed as the file basename if the title is not explicitly set. The `Don't include file extension as part of the title` scan flag is no longer supported.
|
||||||
* `Set name, date, details from embedded file metadata` scan flag is no longer supported. This functionality may be implemented as a built-in scraper in the future.
|
* `Set name, date, details from embedded file metadata` scan flag is no longer supported. This functionality may be implemented as a built-in scraper in the future.
|
||||||
* Moved Changelogs to Settings page. ([#2726](https://github.com/stashapp/stash/pull/2726))
|
* Moved Changelogs to Settings page. ([#2726](https://github.com/stashapp/stash/pull/2726))
|
||||||
|
|
||||||
|
### 🐛 Bug fixes
|
||||||
|
* Fix continue queue checkbox value not persisting. ([#2895](https://github.com/stashapp/stash/pull/2895))
|
||||||
|
* Fix `autostartVideoOnPlaySelected` option not applying when navigating from scene queue. ([#2896](https://github.com/stashapp/stash/pull/2896))
|
||||||
|
* Fix incorrect gallery value in Scene edit tab after navigating from scene queue. ([#2897](https://github.com/stashapp/stash/pull/2897))
|
||||||
|
* Fix https schema not being used over some https connections. ([#2900](https://github.com/stashapp/stash/pull/2900))
|
||||||
|
* Fix scene files not deleting correctly when streaming over https. ([#2900](https://github.com/stashapp/stash/pull/2900))
|
||||||
|
* Fix panic when custom performer image location is invalid. ([#2894](https://github.com/stashapp/stash/pull/2894))
|
||||||
Reference in New Issue
Block a user