feat(lists): add anilist support (#1949)

* fix(lists): clear selected list

* chore(web): improve onChange set values for select_wide

* feat(web): add anilist lists

* feat(web): Filter is required on ListForm

* fix(web): ListForm reset url when change type

* feat(lists): add anilist support

* feat(lists): filter duplicates for anilist

* feat(anilist): handle special characters

* fix(lists): better title matching
fix(lists): add alternatives to apostrophe replacement

* test(title): add some anime cases

* feat(anilist): replace unicodes with regex

* feat(lists): move additional anilist processing to autobrr instead of brr api

* feat(lists): clean Unicode Block “Latin Extended-A” chars

---------

Co-authored-by: martylukyy <35452459+martylukyy@users.noreply.github.com>
This commit is contained in:
Fabricio Silva 2025-01-31 18:17:23 +00:00 committed by GitHub
parent 5e2769639f
commit b724429b97
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 257 additions and 55 deletions

View file

@ -78,12 +78,8 @@ export function SelectFieldCreatable<T>({ name, label, help, placeholder, toolti
// value={field?.value ? field.value : options.find(o => o.value == field?.value)}
value={field?.value ? { value: field.value, label: field.value } : field.value}
onChange={(newValue: unknown) => {
if (newValue) {
setFieldValue(field.name, (newValue as { value: string }).value);
}
else {
setFieldValue(field.name, "")
}
const option = newValue as { value: string };
setFieldValue(field.name, option?.value ?? "");
}}
options={[...[...options, { value: field.value, label: field.value }].reduce((map, obj) => map.set(obj.value, obj), new Map()).values()]}
/>
@ -143,12 +139,8 @@ export function SelectField<T>({ name, label, help, placeholder, options }: Sele
// value={field?.value ? field.value : options.find(o => o.value == field?.value)}
value={field?.value ? { value: field.value, label: field.value } : field.value}
onChange={(newValue: unknown) => {
if (newValue) {
setFieldValue(field.name, (newValue as { value: string }).value);
}
else {
setFieldValue(field.name, "")
}
const option = newValue as { value: string };
setFieldValue(field.name, option?.value ?? "");
}}
options={[...[...options, { value: field.value, label: field.value }].reduce((map, obj) => map.set(obj.value, obj), new Map()).values()]}
/>
@ -213,12 +205,8 @@ export function SelectFieldBasic<T>({ name, label, help, placeholder, required,
defaultValue={defaultValue}
value={field?.value && options.find(o => o.value == field?.value)}
onChange={(newValue: unknown) => {
if (newValue) {
setFieldValue(field.name, (newValue as { value: string }).value);
}
else {
setFieldValue(field.name, "")
}
const option = newValue as { value: string };
setFieldValue(field.name, option?.value ?? "");
}}
options={options}
/>
@ -247,7 +235,7 @@ interface ListFilterMultiSelectOption {
name: string;
}
export function ListFilterMultiSelectField({ name, label, help, tooltip, options }: MultiSelectFieldProps) {
export function ListFilterMultiSelectField({ name, label, help, tooltip, options, required }: MultiSelectFieldProps) {
return (
<div className="flex items-center space-y-1 p-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4">
<div>
@ -259,11 +247,12 @@ export function ListFilterMultiSelectField({ name, label, help, tooltip, options
{tooltip ? (
<DocsTooltip label={label}>{tooltip}</DocsTooltip>
) : label}
<common.RequiredField required={required} />
</div>
</label>
</div>
<div className="sm:col-span-2">
<Field name={name} type="select">
<Field name={name} type="select" required={required}>
{({
field,
form: { setFieldValue }