mirror of
https://github.com/stashapp/stash.git
synced 2025-12-06 16:34:02 +01:00
Persist tagger settings and change defaults (#5165)
* Persist tagger settings in UIConfig * Show males and set tags by default * Add release note
This commit is contained in:
parent
c74456c07e
commit
b1b223c90a
8 changed files with 42 additions and 26 deletions
20
ui/v2.5/src/components/Tagger/config.ts
Normal file
20
ui/v2.5/src/components/Tagger/config.ts
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
import { useCallback, useContext } from "react";
|
||||||
|
import { ConfigurationContext } from "src/hooks/Config";
|
||||||
|
import { initialConfig, ITaggerConfig } from "./constants";
|
||||||
|
import { useConfigureUISetting } from "src/core/StashService";
|
||||||
|
|
||||||
|
export function useTaggerConfig() {
|
||||||
|
const { configuration: stashConfig } = useContext(ConfigurationContext);
|
||||||
|
const [saveUISetting] = useConfigureUISetting();
|
||||||
|
|
||||||
|
const config = stashConfig?.ui.taggerConfig ?? initialConfig;
|
||||||
|
|
||||||
|
const setConfig = useCallback(
|
||||||
|
(c: ITaggerConfig) => {
|
||||||
|
saveUISetting({ variables: { key: "taggerConfig", value: c } });
|
||||||
|
},
|
||||||
|
[saveUISetting]
|
||||||
|
);
|
||||||
|
|
||||||
|
return { config, setConfig };
|
||||||
|
}
|
||||||
|
|
@ -11,7 +11,6 @@ export interface ITaggerSource {
|
||||||
supportSceneFragment?: boolean;
|
supportSceneFragment?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const LOCAL_FORAGE_KEY = "tagger";
|
|
||||||
export const DEFAULT_BLACKLIST = [
|
export const DEFAULT_BLACKLIST = [
|
||||||
"\\sXXX\\s",
|
"\\sXXX\\s",
|
||||||
"1080p",
|
"1080p",
|
||||||
|
|
@ -28,10 +27,10 @@ export const DEFAULT_EXCLUDED_STUDIO_FIELDS = ["name"];
|
||||||
|
|
||||||
export const initialConfig: ITaggerConfig = {
|
export const initialConfig: ITaggerConfig = {
|
||||||
blacklist: DEFAULT_BLACKLIST,
|
blacklist: DEFAULT_BLACKLIST,
|
||||||
showMales: false,
|
showMales: true,
|
||||||
mode: "auto",
|
mode: "auto",
|
||||||
setCoverImage: true,
|
setCoverImage: true,
|
||||||
setTags: false,
|
setTags: true,
|
||||||
tagOperation: "merge",
|
tagOperation: "merge",
|
||||||
fingerprintQueue: {},
|
fingerprintQueue: {},
|
||||||
excludedPerformerFields: DEFAULT_EXCLUDED_PERFORMER_FIELDS,
|
excludedPerformerFields: DEFAULT_EXCLUDED_PERFORMER_FIELDS,
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,5 @@
|
||||||
import React, { useState, useEffect, useRef } from "react";
|
import React, { useState, useEffect, useRef } from "react";
|
||||||
import {
|
import { initialConfig, ITaggerConfig } from "src/components/Tagger/constants";
|
||||||
initialConfig,
|
|
||||||
ITaggerConfig,
|
|
||||||
LOCAL_FORAGE_KEY,
|
|
||||||
} from "src/components/Tagger/constants";
|
|
||||||
import * as GQL from "src/core/generated-graphql";
|
import * as GQL from "src/core/generated-graphql";
|
||||||
import {
|
import {
|
||||||
queryFindPerformer,
|
queryFindPerformer,
|
||||||
|
|
@ -20,12 +16,12 @@ import {
|
||||||
useStudioUpdate,
|
useStudioUpdate,
|
||||||
useTagCreate,
|
useTagCreate,
|
||||||
} from "src/core/StashService";
|
} from "src/core/StashService";
|
||||||
import { useLocalForage } from "src/hooks/LocalForage";
|
|
||||||
import { useToast } from "src/hooks/Toast";
|
import { useToast } from "src/hooks/Toast";
|
||||||
import { ConfigurationContext } from "src/hooks/Config";
|
import { ConfigurationContext } from "src/hooks/Config";
|
||||||
import { ITaggerSource, SCRAPER_PREFIX, STASH_BOX_PREFIX } from "./constants";
|
import { ITaggerSource, SCRAPER_PREFIX, STASH_BOX_PREFIX } from "./constants";
|
||||||
import { errorToString } from "src/utils";
|
import { errorToString } from "src/utils";
|
||||||
import { mergeStudioStashIDs } from "./utils";
|
import { mergeStudioStashIDs } from "./utils";
|
||||||
|
import { useTaggerConfig } from "./config";
|
||||||
|
|
||||||
export interface ITaggerContextState {
|
export interface ITaggerContextState {
|
||||||
config: ITaggerConfig;
|
config: ITaggerConfig;
|
||||||
|
|
@ -110,11 +106,6 @@ export interface ISceneQueryResult {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const TaggerContext: React.FC = ({ children }) => {
|
export const TaggerContext: React.FC = ({ children }) => {
|
||||||
const [{ data: config }, setConfig] = useLocalForage<ITaggerConfig>(
|
|
||||||
LOCAL_FORAGE_KEY,
|
|
||||||
initialConfig
|
|
||||||
);
|
|
||||||
|
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const [loadingMulti, setLoadingMulti] = useState(false);
|
const [loadingMulti, setLoadingMulti] = useState(false);
|
||||||
const [sources, setSources] = useState<ITaggerSource[]>([]);
|
const [sources, setSources] = useState<ITaggerSource[]>([]);
|
||||||
|
|
@ -127,6 +118,8 @@ export const TaggerContext: React.FC = ({ children }) => {
|
||||||
const stopping = useRef(false);
|
const stopping = useRef(false);
|
||||||
|
|
||||||
const { configuration: stashConfig } = React.useContext(ConfigurationContext);
|
const { configuration: stashConfig } = React.useContext(ConfigurationContext);
|
||||||
|
const { config, setConfig } = useTaggerConfig();
|
||||||
|
|
||||||
const Scrapers = useListSceneScrapers();
|
const Scrapers = useListSceneScrapers();
|
||||||
|
|
||||||
const Toast = useToast();
|
const Toast = useToast();
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ import { Button, Card, Form, InputGroup, ProgressBar } from "react-bootstrap";
|
||||||
import { FormattedMessage, useIntl } from "react-intl";
|
import { FormattedMessage, useIntl } from "react-intl";
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import { HashLink } from "react-router-hash-link";
|
import { HashLink } from "react-router-hash-link";
|
||||||
import { useLocalForage } from "src/hooks/LocalForage";
|
|
||||||
|
|
||||||
import * as GQL from "src/core/generated-graphql";
|
import * as GQL from "src/core/generated-graphql";
|
||||||
import { LoadingIndicator } from "src/components/Shared/LoadingIndicator";
|
import { LoadingIndicator } from "src/components/Shared/LoadingIndicator";
|
||||||
|
|
@ -21,12 +20,13 @@ import { ConfigurationContext } from "src/hooks/Config";
|
||||||
|
|
||||||
import StashSearchResult from "./StashSearchResult";
|
import StashSearchResult from "./StashSearchResult";
|
||||||
import PerformerConfig from "./Config";
|
import PerformerConfig from "./Config";
|
||||||
import { LOCAL_FORAGE_KEY, ITaggerConfig, initialConfig } from "../constants";
|
import { ITaggerConfig } from "../constants";
|
||||||
import PerformerModal from "../PerformerModal";
|
import PerformerModal from "../PerformerModal";
|
||||||
import { useUpdatePerformer } from "../queries";
|
import { useUpdatePerformer } from "../queries";
|
||||||
import { faStar, faTags } from "@fortawesome/free-solid-svg-icons";
|
import { faStar, faTags } from "@fortawesome/free-solid-svg-icons";
|
||||||
import { mergeStashIDs } from "src/utils/stashbox";
|
import { mergeStashIDs } from "src/utils/stashbox";
|
||||||
import { ExternalLink } from "src/components/Shared/ExternalLink";
|
import { ExternalLink } from "src/components/Shared/ExternalLink";
|
||||||
|
import { useTaggerConfig } from "../config";
|
||||||
|
|
||||||
type JobFragment = Pick<
|
type JobFragment = Pick<
|
||||||
GQL.Job,
|
GQL.Job,
|
||||||
|
|
@ -621,10 +621,7 @@ export const PerformerTagger: React.FC<ITaggerProps> = ({ performers }) => {
|
||||||
const jobsSubscribe = useJobsSubscribe();
|
const jobsSubscribe = useJobsSubscribe();
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const { configuration: stashConfig } = React.useContext(ConfigurationContext);
|
const { configuration: stashConfig } = React.useContext(ConfigurationContext);
|
||||||
const [{ data: config }, setConfig] = useLocalForage<ITaggerConfig>(
|
const { config, setConfig } = useTaggerConfig();
|
||||||
LOCAL_FORAGE_KEY,
|
|
||||||
initialConfig
|
|
||||||
);
|
|
||||||
const [showConfig, setShowConfig] = useState(false);
|
const [showConfig, setShowConfig] = useState(false);
|
||||||
const [showManual, setShowManual] = useState(false);
|
const [showManual, setShowManual] = useState(false);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ import { Button, Card, Form, InputGroup, ProgressBar } from "react-bootstrap";
|
||||||
import { FormattedMessage, useIntl } from "react-intl";
|
import { FormattedMessage, useIntl } from "react-intl";
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import { HashLink } from "react-router-hash-link";
|
import { HashLink } from "react-router-hash-link";
|
||||||
import { useLocalForage } from "src/hooks/LocalForage";
|
|
||||||
|
|
||||||
import * as GQL from "src/core/generated-graphql";
|
import * as GQL from "src/core/generated-graphql";
|
||||||
import { LoadingIndicator } from "src/components/Shared/LoadingIndicator";
|
import { LoadingIndicator } from "src/components/Shared/LoadingIndicator";
|
||||||
|
|
@ -22,13 +21,14 @@ import { ConfigurationContext } from "src/hooks/Config";
|
||||||
|
|
||||||
import StashSearchResult from "./StashSearchResult";
|
import StashSearchResult from "./StashSearchResult";
|
||||||
import StudioConfig from "./Config";
|
import StudioConfig from "./Config";
|
||||||
import { LOCAL_FORAGE_KEY, ITaggerConfig, initialConfig } from "../constants";
|
import { ITaggerConfig } from "../constants";
|
||||||
import StudioModal from "../scenes/StudioModal";
|
import StudioModal from "../scenes/StudioModal";
|
||||||
import { useUpdateStudio } from "../queries";
|
import { useUpdateStudio } from "../queries";
|
||||||
import { apolloError } from "src/utils";
|
import { apolloError } from "src/utils";
|
||||||
import { faStar, faTags } from "@fortawesome/free-solid-svg-icons";
|
import { faStar, faTags } from "@fortawesome/free-solid-svg-icons";
|
||||||
import { ExternalLink } from "src/components/Shared/ExternalLink";
|
import { ExternalLink } from "src/components/Shared/ExternalLink";
|
||||||
import { mergeStudioStashIDs } from "../utils";
|
import { mergeStudioStashIDs } from "../utils";
|
||||||
|
import { useTaggerConfig } from "../config";
|
||||||
|
|
||||||
type JobFragment = Pick<
|
type JobFragment = Pick<
|
||||||
GQL.Job,
|
GQL.Job,
|
||||||
|
|
@ -670,10 +670,7 @@ export const StudioTagger: React.FC<ITaggerProps> = ({ studios }) => {
|
||||||
const jobsSubscribe = useJobsSubscribe();
|
const jobsSubscribe = useJobsSubscribe();
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const { configuration: stashConfig } = React.useContext(ConfigurationContext);
|
const { configuration: stashConfig } = React.useContext(ConfigurationContext);
|
||||||
const [{ data: config }, setConfig] = useLocalForage<ITaggerConfig>(
|
const { config, setConfig } = useTaggerConfig();
|
||||||
LOCAL_FORAGE_KEY,
|
|
||||||
initialConfig
|
|
||||||
);
|
|
||||||
const [showConfig, setShowConfig] = useState(false);
|
const [showConfig, setShowConfig] = useState(false);
|
||||||
const [showManual, setShowManual] = useState(false);
|
const [showManual, setShowManual] = useState(false);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import {
|
||||||
SortDirectionEnum,
|
SortDirectionEnum,
|
||||||
} from "./generated-graphql";
|
} from "./generated-graphql";
|
||||||
import { View } from "src/components/List/views";
|
import { View } from "src/components/List/views";
|
||||||
|
import { ITaggerConfig } from "src/components/Tagger/constants";
|
||||||
|
|
||||||
// NOTE: double capitals aren't converted correctly in the backend
|
// NOTE: double capitals aren't converted correctly in the backend
|
||||||
|
|
||||||
|
|
@ -97,6 +98,8 @@ export interface IUIConfig {
|
||||||
taskDefaults?: Record<string, {}>;
|
taskDefaults?: Record<string, {}>;
|
||||||
|
|
||||||
defaultFilters?: DefaultFilters;
|
defaultFilters?: DefaultFilters;
|
||||||
|
|
||||||
|
taggerConfig?: ITaggerConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getFrontPageContent(
|
export function getFrontPageContent(
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import v0200 from "./v0200.md";
|
||||||
import v0240 from "./v0240.md";
|
import v0240 from "./v0240.md";
|
||||||
import v0250 from "./v0250.md";
|
import v0250 from "./v0250.md";
|
||||||
import v0260 from "./v0260.md";
|
import v0260 from "./v0260.md";
|
||||||
|
import v0270 from "./v0270.md";
|
||||||
|
|
||||||
export interface IReleaseNotes {
|
export interface IReleaseNotes {
|
||||||
// handle should be in the form of YYYYMMDD
|
// handle should be in the form of YYYYMMDD
|
||||||
|
|
@ -12,6 +13,11 @@ export interface IReleaseNotes {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const releaseNotes: IReleaseNotes[] = [
|
export const releaseNotes: IReleaseNotes[] = [
|
||||||
|
{
|
||||||
|
date: 20240826,
|
||||||
|
version: "v0.27.0",
|
||||||
|
content: v0270,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
date: 20240510,
|
date: 20240510,
|
||||||
version: "v0.26.0",
|
version: "v0.26.0",
|
||||||
|
|
|
||||||
1
ui/v2.5/src/docs/en/ReleaseNotes/v0270.md
Normal file
1
ui/v2.5/src/docs/en/ReleaseNotes/v0270.md
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Tagger settings have been reset, but are now persisted between browser sessions. `Show male performers` and `Set Tags` are now defaulted to true. Please verify your settings before using the Tagger.
|
||||||
Loading…
Reference in a new issue