From b01c4468d8605fc048805b5947933ec5eb045417 Mon Sep 17 00:00:00 2001
From: 7dJx1qP <38586902+7dJx1qP@users.noreply.github.com>
Date: Thu, 28 Oct 2021 02:22:26 -0400
Subject: [PATCH] Improve scrape url button UX (#1903)
* change button label to icon
* add URLField component
---
.../GalleryDetails/GalleryEditPanel.tsx | 25 ++---------
.../Movies/MovieDetails/MovieEditPanel.tsx | 39 +++-------------
.../PerformerDetails/PerformerEditPanel.tsx | 37 +++-------------
.../Scenes/SceneDetails/SceneEditPanel.tsx | 25 ++---------
ui/v2.5/src/components/Scenes/styles.scss | 9 ----
ui/v2.5/src/components/Shared/URLField.tsx | 44 +++++++++++++++++++
ui/v2.5/src/components/Shared/index.ts | 1 +
ui/v2.5/src/locales/en-GB.json | 1 +
8 files changed, 68 insertions(+), 113 deletions(-)
create mode 100644 ui/v2.5/src/components/Shared/URLField.tsx
diff --git a/ui/v2.5/src/components/Galleries/GalleryDetails/GalleryEditPanel.tsx b/ui/v2.5/src/components/Galleries/GalleryDetails/GalleryEditPanel.tsx
index 8f1957322..18d824e2c 100644
--- a/ui/v2.5/src/components/Galleries/GalleryDetails/GalleryEditPanel.tsx
+++ b/ui/v2.5/src/components/Galleries/GalleryDetails/GalleryEditPanel.tsx
@@ -27,6 +27,7 @@ import {
StudioSelect,
Icon,
LoadingIndicator,
+ URLField,
} from "src/components/Shared";
import { useToast } from "src/hooks";
import { useFormik } from "formik";
@@ -384,21 +385,6 @@ export const GalleryEditPanel: React.FC<
}
}
- function maybeRenderScrapeButton() {
- if (!formik.values.url || !urlScrapable(formik.values.url)) {
- return undefined;
- }
- return (
-
- );
- }
-
function renderTextField(field: string, title: string, placeholder?: string) {
return (
@@ -461,15 +447,12 @@ export const GalleryEditPanel: React.FC<
-
- {maybeRenderScrapeButton()}
-
-
diff --git a/ui/v2.5/src/components/Movies/MovieDetails/MovieEditPanel.tsx b/ui/v2.5/src/components/Movies/MovieDetails/MovieEditPanel.tsx
index 97ddcc267..e07e8bf3c 100644
--- a/ui/v2.5/src/components/Movies/MovieDetails/MovieEditPanel.tsx
+++ b/ui/v2.5/src/components/Movies/MovieDetails/MovieEditPanel.tsx
@@ -10,19 +10,12 @@ import {
import {
LoadingIndicator,
StudioSelect,
- Icon,
DetailsEditNavbar,
DurationInput,
+ URLField,
} from "src/components/Shared";
import { useToast } from "src/hooks";
-import {
- Modal as BSModal,
- Form,
- Button,
- Col,
- Row,
- InputGroup,
-} from "react-bootstrap";
+import { Modal as BSModal, Form, Button, Col, Row } from "react-bootstrap";
import { DurationUtils, FormUtils, ImageUtils } from "src/utils";
import { RatingStars } from "src/components/Scenes/SceneDetails/RatingStars";
import { useFormik } from "formik";
@@ -257,21 +250,6 @@ export const MovieEditPanel: React.FC = ({
);
}
- function maybeRenderScrapeButton() {
- const { url } = formik.values;
- if (!url || !urlScrapable(url)) {
- return undefined;
- }
- return (
-
- );
- }
-
function maybeRenderScrapeDialog() {
if (!scrapedMovie) {
return;
@@ -468,14 +446,11 @@ export const MovieEditPanel: React.FC = ({
title: intl.formatMessage({ id: "url" }),
})}
-
-
- {maybeRenderScrapeButton()}
-
+
diff --git a/ui/v2.5/src/components/Performers/PerformerDetails/PerformerEditPanel.tsx b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerEditPanel.tsx
index 3ca0b01c0..9a803b942 100644
--- a/ui/v2.5/src/components/Performers/PerformerDetails/PerformerEditPanel.tsx
+++ b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerEditPanel.tsx
@@ -1,13 +1,5 @@
import React, { useEffect, useState } from "react";
-import {
- Button,
- Form,
- Col,
- InputGroup,
- Row,
- Badge,
- Dropdown,
-} from "react-bootstrap";
+import { Button, Form, Col, Row, Badge, Dropdown } from "react-bootstrap";
import { FormattedMessage, useIntl } from "react-intl";
import Mousetrap from "mousetrap";
import * as GQL from "src/core/generated-graphql";
@@ -28,6 +20,7 @@ import {
CollapseButton,
Modal,
TagSelect,
+ URLField,
} from "src/components/Shared";
import { ImageUtils, getStashIDs } from "src/utils";
import { getCountryByISO } from "src/utils/country";
@@ -662,19 +655,6 @@ export const PerformerEditPanel: React.FC = ({
setScraper(undefined);
}
- function maybeRenderScrapeButton() {
- return (
-
- );
- }
-
function renderButtons() {
return (
@@ -963,14 +943,11 @@ export const PerformerEditPanel: React.FC = ({
-
-
- {maybeRenderScrapeButton()}
-
+
diff --git a/ui/v2.5/src/components/Scenes/SceneDetails/SceneEditPanel.tsx b/ui/v2.5/src/components/Scenes/SceneDetails/SceneEditPanel.tsx
index 9eb3ee488..37ac8cbf1 100644
--- a/ui/v2.5/src/components/Scenes/SceneDetails/SceneEditPanel.tsx
+++ b/ui/v2.5/src/components/Scenes/SceneDetails/SceneEditPanel.tsx
@@ -28,6 +28,7 @@ import {
Icon,
LoadingIndicator,
ImageInput,
+ URLField,
} from "src/components/Shared";
import { useToast } from "src/hooks";
import { ImageUtils, FormUtils, TextUtils, getStashIDs } from "src/utils";
@@ -574,21 +575,6 @@ export const SceneEditPanel: React.FC = ({
}
}
- function maybeRenderScrapeButton() {
- if (!formik.values.url || !urlScrapable(formik.values.url)) {
- return undefined;
- }
- return (
-
- );
- }
-
function renderTextField(field: string, title: string, placeholder?: string) {
return (
@@ -652,15 +638,12 @@ export const SceneEditPanel: React.FC = ({
-
- {maybeRenderScrapeButton()}
-
-
diff --git a/ui/v2.5/src/components/Scenes/styles.scss b/ui/v2.5/src/components/Scenes/styles.scss
index c8bcc4979..d6549d252 100644
--- a/ui/v2.5/src/components/Scenes/styles.scss
+++ b/ui/v2.5/src/components/Scenes/styles.scss
@@ -500,15 +500,6 @@ input[type="range"].blue-slider {
font-size: 1.3em;
height: calc(1.5em + 0.75rem + 2px);
}
-
- .scrape-button-container {
- margin-right: -15px;
- }
-
- .scrape-url-button {
- color: $text-color;
- margin-right: 0;
- }
}
.scene-markers-panel {
diff --git a/ui/v2.5/src/components/Shared/URLField.tsx b/ui/v2.5/src/components/Shared/URLField.tsx
new file mode 100644
index 000000000..cc233f9d9
--- /dev/null
+++ b/ui/v2.5/src/components/Shared/URLField.tsx
@@ -0,0 +1,44 @@
+import React from "react";
+import { useIntl } from "react-intl";
+import { Button, InputGroup, Form } from "react-bootstrap";
+import { Icon } from "src/components/Shared";
+import { FormikHandlers } from "formik";
+
+interface IProps {
+ value: string;
+ name: string;
+ onChange: FormikHandlers["handleChange"];
+ onBlur: FormikHandlers["handleBlur"];
+ onScrapeClick(): void;
+ urlScrapable(url: string): boolean;
+ isInvalid?: boolean;
+}
+
+export const URLField: React.FC = (props: IProps) => {
+ const intl = useIntl();
+
+ return (
+
+
+
+
+
+
+ );
+};
diff --git a/ui/v2.5/src/components/Shared/index.ts b/ui/v2.5/src/components/Shared/index.ts
index 84a943751..d388a45ca 100644
--- a/ui/v2.5/src/components/Shared/index.ts
+++ b/ui/v2.5/src/components/Shared/index.ts
@@ -19,4 +19,5 @@ export { ExportDialog } from "./ExportDialog";
export { default as DeleteEntityDialog } from "./DeleteEntityDialog";
export { IndeterminateCheckbox } from "./IndeterminateCheckbox";
export { OperationButton } from "./OperationButton";
+export { URLField } from "./URLField";
export const TITLE_SUFFIX = " | Stash";
diff --git a/ui/v2.5/src/locales/en-GB.json b/ui/v2.5/src/locales/en-GB.json
index 3d1447c79..46fd33457 100644
--- a/ui/v2.5/src/locales/en-GB.json
+++ b/ui/v2.5/src/locales/en-GB.json
@@ -64,6 +64,7 @@
"save_delete_settings": "Use these options by default when deleting",
"save_filter": "Save filter",
"scan": "Scan",
+ "scrape": "Scrape",
"scrape_with": "Scrape with…",
"scrape_query": "Scrape query",
"scrape_scene_fragment": "Scrape by fragment",