mirror of
https://github.com/NginxProxyManager/nginx-proxy-manager.git
synced 2025-10-04 03:40:10 +00:00
83 lines
2.4 KiB
TypeScript
83 lines
2.4 KiB
TypeScript
import { Field, useFormikContext } from "formik";
|
|
import type { ReactNode } from "react";
|
|
import type { ActionMeta, MultiValue } from "react-select";
|
|
import CreatableSelect from "react-select/creatable";
|
|
import { intl, T } from "src/locale";
|
|
import { validateDomain, validateDomains } from "src/modules/Validations";
|
|
|
|
type SelectOption = {
|
|
label: string;
|
|
value: string;
|
|
color?: string;
|
|
};
|
|
|
|
interface Props {
|
|
id?: string;
|
|
maxDomains?: number;
|
|
isWildcardPermitted?: boolean;
|
|
dnsProviderWildcardSupported?: boolean;
|
|
name?: string;
|
|
label?: string;
|
|
}
|
|
export function DomainNamesField({
|
|
name = "domainNames",
|
|
label = "domain-names",
|
|
id = "domainNames",
|
|
maxDomains,
|
|
isWildcardPermitted = true,
|
|
dnsProviderWildcardSupported = true,
|
|
}: Props) {
|
|
const { setFieldValue } = useFormikContext();
|
|
|
|
const handleChange = (v: MultiValue<SelectOption>, _actionMeta: ActionMeta<SelectOption>) => {
|
|
const doms = v?.map((i: SelectOption) => {
|
|
return i.value;
|
|
});
|
|
setFieldValue(name, doms);
|
|
};
|
|
|
|
const helperTexts: ReactNode[] = [];
|
|
if (maxDomains) {
|
|
helperTexts.push(<T id="domain-names.max" data={{ count: maxDomains }} />);
|
|
}
|
|
if (!isWildcardPermitted) {
|
|
helperTexts.push(<T id="domain-names.wildcards-not-permitted" />);
|
|
} else if (!dnsProviderWildcardSupported) {
|
|
helperTexts.push(<T id="domain-names.wildcards-not-supported" />);
|
|
}
|
|
|
|
return (
|
|
<Field name={name} validate={validateDomains(isWildcardPermitted && dnsProviderWildcardSupported, maxDomains)}>
|
|
{({ field, form }: any) => (
|
|
<div className="mb-3">
|
|
<label className="form-label" htmlFor={id}>
|
|
<T id={label} />
|
|
</label>
|
|
<CreatableSelect
|
|
className="react-select-container"
|
|
classNamePrefix="react-select"
|
|
name={field.name}
|
|
id={id}
|
|
closeMenuOnSelect={true}
|
|
isClearable={false}
|
|
isValidNewOption={validateDomain(isWildcardPermitted && dnsProviderWildcardSupported)}
|
|
isMulti
|
|
placeholder={intl.formatMessage({ id: "domain-names.placeholder" })}
|
|
onChange={handleChange}
|
|
value={field.value?.map((d: string) => ({ label: d, value: d }))}
|
|
/>
|
|
{form.errors[field.name] && form.touched[field.name] ? (
|
|
<small className="text-danger">{form.errors[field.name]}</small>
|
|
) : helperTexts.length ? (
|
|
helperTexts.map((i, idx) => (
|
|
<small key={idx} className="text-info">
|
|
{i}
|
|
</small>
|
|
))
|
|
) : null}
|
|
</div>
|
|
)}
|
|
</Field>
|
|
);
|
|
}
|