mirror of
https://github.com/idanoo/autobrr
synced 2025-07-23 08:49:13 +00:00
fix: indexer add default values (#167)
This commit is contained in:
parent
2dc02a4c02
commit
72b74f9d19
2 changed files with 86 additions and 10 deletions
|
@ -61,6 +61,7 @@ interface PasswordFieldWideProps {
|
||||||
defaultValue?: string;
|
defaultValue?: string;
|
||||||
help?: string;
|
help?: string;
|
||||||
required?: boolean;
|
required?: boolean;
|
||||||
|
defaultVisible?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const PasswordFieldWide = ({
|
export const PasswordFieldWide = ({
|
||||||
|
@ -69,9 +70,10 @@ export const PasswordFieldWide = ({
|
||||||
placeholder,
|
placeholder,
|
||||||
defaultValue,
|
defaultValue,
|
||||||
help,
|
help,
|
||||||
required
|
required,
|
||||||
|
defaultVisible
|
||||||
}: PasswordFieldWideProps) => {
|
}: PasswordFieldWideProps) => {
|
||||||
const [isVisible, toggleVisibility] = useToggle(false)
|
const [isVisible, toggleVisibility] = useToggle(defaultVisible)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="space-y-1 px-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:py-5">
|
<div className="space-y-1 px-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:py-5">
|
||||||
|
@ -93,7 +95,7 @@ export const PasswordFieldWide = ({
|
||||||
value={field.value ? field.value : defaultValue ?? ""}
|
value={field.value ? field.value : defaultValue ?? ""}
|
||||||
onChange={field.onChange}
|
onChange={field.onChange}
|
||||||
type={isVisible ? "text" : "password"}
|
type={isVisible ? "text" : "password"}
|
||||||
className={classNames(meta.touched && meta.error ? "focus:ring-red-500 focus:border-red-500 border-red-500" : "focus:ring-indigo-500 dark:focus:ring-blue-500 focus:border-indigo-500 dark:focus:border-blue-500 border-gray-300 dark:border-gray-700", "block w-full dark:bg-gray-800 shadow-sm dark:text-gray-100 sm:text-sm rounded-md")}
|
className={classNames(meta.touched && meta.error ? "focus:ring-red-500 focus:border-red-500 border-red-500" : "focus:ring-indigo-500 dark:focus:ring-blue-500 focus:border-indigo-500 dark:focus:border-blue-500 border-gray-300 dark:border-gray-700", "block w-full pr-10 dark:bg-gray-800 shadow-sm dark:text-gray-100 sm:text-sm rounded-md")}
|
||||||
placeholder={placeholder}
|
placeholder={placeholder}
|
||||||
/>
|
/>
|
||||||
<div className="absolute inset-y-0 right-0 px-3 flex items-center" onClick={toggleVisibility}>
|
<div className="absolute inset-y-0 right-0 px-3 flex items-center" onClick={toggleVisibility}>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Fragment } from "react";
|
import {Fragment, useState} from "react";
|
||||||
import { toast } from "react-hot-toast";
|
import { toast } from "react-hot-toast";
|
||||||
import { useMutation, useQuery } from "react-query";
|
import { useMutation, useQuery } from "react-query";
|
||||||
import Select, { components } from "react-select";
|
import Select, { components } from "react-select";
|
||||||
|
@ -16,7 +16,7 @@ import {
|
||||||
TextFieldWide,
|
TextFieldWide,
|
||||||
PasswordFieldWide,
|
PasswordFieldWide,
|
||||||
SwitchGroupWide
|
SwitchGroupWide
|
||||||
} from "../../components/inputs/input_wide";
|
} from "../../components/inputs";
|
||||||
import { SlideOver } from "../../components/panels";
|
import { SlideOver } from "../../components/panels";
|
||||||
import Toast from '../../components/notifications/Toast';
|
import Toast from '../../components/notifications/Toast';
|
||||||
|
|
||||||
|
@ -57,12 +57,76 @@ const Option = (props: any) => {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const IrcSettingFields = (ind: IndexerDefinition, indexer: string) => {
|
||||||
|
if (indexer !== "") {
|
||||||
|
return (
|
||||||
|
<Fragment>
|
||||||
|
{ind && ind.irc && ind.irc.settings && (
|
||||||
|
<div className="border-t border-gray-200 dark:border-gray-700 py-5">
|
||||||
|
<div className="px-6 space-y-1">
|
||||||
|
<Dialog.Title className="text-lg font-medium text-gray-900 dark:text-white">IRC</Dialog.Title>
|
||||||
|
<p className="text-sm text-gray-500 dark:text-gray-200">
|
||||||
|
Networks, channels and invite commands are configured automatically.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{ind.irc.settings.map((f: IndexerSetting, idx: number) => {
|
||||||
|
switch (f.type) {
|
||||||
|
case "text":
|
||||||
|
return <TextFieldWide name={`irc.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} />
|
||||||
|
case "secret":
|
||||||
|
if (f.name === "invite_command") {
|
||||||
|
return <PasswordFieldWide name={`irc.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} defaultVisible={true} defaultValue={f.default} />
|
||||||
|
}
|
||||||
|
return <PasswordFieldWide name={`irc.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} defaultValue={f.default} />
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
})}
|
||||||
|
|
||||||
|
{/* <div hidden={false}>
|
||||||
|
<TextFieldWide name="irc.server" label="Server" defaultValue={ind.irc.server} />
|
||||||
|
<NumberFieldWide name="irc.port" label="Port" defaultValue={ind.irc.port} />
|
||||||
|
<SwitchGroupWide name="irc.tls" label="TLS" defaultValue={ind.irc.tls} />
|
||||||
|
</div> */}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</Fragment>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const SettingFields = (ind: IndexerDefinition, indexer: string) => {
|
||||||
|
if (indexer !== "") {
|
||||||
|
return (
|
||||||
|
<div key="opt">
|
||||||
|
{ind && ind.settings && ind.settings.map((f: any, idx: number) => {
|
||||||
|
switch (f.type) {
|
||||||
|
case "text":
|
||||||
|
return (
|
||||||
|
<TextFieldWide name={`settings.${f.name}`} label={f.label} key={idx} help={f.help} defaultValue="" />
|
||||||
|
)
|
||||||
|
case "secret":
|
||||||
|
return (
|
||||||
|
<PasswordFieldWide name={`settings.${f.name}`} label={f.label} key={idx} help={f.help} defaultValue="" />
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
})}
|
||||||
|
<div hidden={true}>
|
||||||
|
<TextFieldWide name="name" label="Name" defaultValue={ind?.name} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
interface AddProps {
|
interface AddProps {
|
||||||
isOpen: boolean;
|
isOpen: boolean;
|
||||||
toggle: any;
|
toggle: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function IndexerAddForm({ isOpen, toggle }: AddProps) {
|
export function IndexerAddForm({ isOpen, toggle }: AddProps) {
|
||||||
|
const [indexer, setIndexer] = useState<IndexerDefinition>({} as IndexerDefinition)
|
||||||
|
|
||||||
const { data } = useQuery('indexerDefinition', APIClient.indexers.getSchema,
|
const { data } = useQuery('indexerDefinition', APIClient.indexers.getSchema,
|
||||||
{
|
{
|
||||||
enabled: isOpen,
|
enabled: isOpen,
|
||||||
|
@ -210,7 +274,9 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
identifier: "",
|
identifier: "",
|
||||||
name: "",
|
name: "",
|
||||||
irc: {},
|
irc: {
|
||||||
|
invite_command: "",
|
||||||
|
},
|
||||||
settings: {},
|
settings: {},
|
||||||
}}
|
}}
|
||||||
onSubmit={onSubmit}
|
onSubmit={onSubmit}
|
||||||
|
@ -253,7 +319,7 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) {
|
||||||
</div>
|
</div>
|
||||||
<div className="sm:col-span-2">
|
<div className="sm:col-span-2">
|
||||||
<Field name="identifier" type="select">
|
<Field name="identifier" type="select">
|
||||||
{({ field, form: { setFieldValue } }: FieldProps) => (
|
{({ field, form: { setFieldValue, resetForm } }: FieldProps) => (
|
||||||
<Select {...field}
|
<Select {...field}
|
||||||
isClearable={true}
|
isClearable={true}
|
||||||
isSearchable={true}
|
isSearchable={true}
|
||||||
|
@ -275,8 +341,17 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) {
|
||||||
})}
|
})}
|
||||||
value={field?.value && field.value.value}
|
value={field?.value && field.value.value}
|
||||||
onChange={(option: any) => {
|
onChange={(option: any) => {
|
||||||
|
resetForm()
|
||||||
setFieldValue("name", option?.label ?? "")
|
setFieldValue("name", option?.label ?? "")
|
||||||
setFieldValue(field.name, option?.value ?? "")
|
setFieldValue(field.name, option?.value ?? "")
|
||||||
|
|
||||||
|
const ind = data!.find(i => i.identifier === option.value);
|
||||||
|
setIndexer(ind!)
|
||||||
|
if (ind!.irc.settings) {
|
||||||
|
ind!.irc.settings.forEach((s) => {
|
||||||
|
setFieldValue(`irc.${s.name}`, s.default ?? "")
|
||||||
|
})
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
options={data && data.sort((a, b): any => a.name.localeCompare(b.name)).map(v => ({
|
options={data && data.sort((a, b): any => a.name.localeCompare(b.name)).map(v => ({
|
||||||
label: v.name,
|
label: v.name,
|
||||||
|
@ -293,12 +368,11 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) {
|
||||||
<SwitchGroupWide name="enabled" label="Enabled" />
|
<SwitchGroupWide name="enabled" label="Enabled" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{SettingFields(indexer, values.identifier)}
|
||||||
{renderSettingFields(values.identifier)}
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{renderIrcSettingFields(values.identifier)}
|
{IrcSettingFields(indexer, values.identifier)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue