Release 3X-UI for Docker / build (push) Canceled after 0s
Release 3X-UI / build (386) (push) Canceled after 0s
Release 3X-UI / build (amd64) (push) Canceled after 0s
Release 3X-UI / build (arm64) (push) Canceled after 0s
Release 3X-UI / build (armv5) (push) Canceled after 0s
Release 3X-UI / build (armv6) (push) Canceled after 0s
Release 3X-UI / build (armv7) (push) Canceled after 0s
Release 3X-UI / build (s390x) (push) Canceled after 0s
Release 3X-UI / Build for Windows (amd64) (push) Canceled after 0s
Release 3X-UI / Publish rolling dev release (push) Canceled after 0s
90 lines
2.5 KiB
TypeScript
90 lines
2.5 KiB
TypeScript
import { useEffect, useState } from 'react';
|
|
import { useTranslation } from 'react-i18next';
|
|
import { AutoComplete, Form, Modal, message } from 'antd';
|
|
import { FormProvider, useForm, useWatch } from 'react-hook-form';
|
|
|
|
import { FormField } from '@/components/form/rhf';
|
|
|
|
type GroupFormValues = { group: string };
|
|
|
|
const EMPTY: GroupFormValues = { group: '' };
|
|
|
|
interface BulkAddToGroupModalProps {
|
|
open: boolean;
|
|
count: number;
|
|
groups: string[];
|
|
onOpenChange: (open: boolean) => void;
|
|
onSubmit: (group: string) => Promise<{ affected?: number } | null>;
|
|
}
|
|
|
|
export default function BulkAddToGroupModal({
|
|
open,
|
|
count,
|
|
groups,
|
|
onOpenChange,
|
|
onSubmit,
|
|
}: BulkAddToGroupModalProps) {
|
|
const { t } = useTranslation();
|
|
const [messageApi, messageContextHolder] = message.useMessage();
|
|
const [submitting, setSubmitting] = useState(false);
|
|
const methods = useForm<GroupFormValues>({ defaultValues: EMPTY });
|
|
const group = useWatch({ control: methods.control, name: 'group' });
|
|
|
|
useEffect(() => {
|
|
if (open) methods.reset(EMPTY);
|
|
}, [open, methods]);
|
|
|
|
async function submit() {
|
|
const next = (methods.getValues().group ?? '').trim();
|
|
if (!next) return;
|
|
setSubmitting(true);
|
|
try {
|
|
const result = await onSubmit(next);
|
|
if (result) {
|
|
const affected = result.affected ?? 0;
|
|
messageApi.success(
|
|
t('pages.clients.addToGroupSuccessToast', { count: affected, group: next }),
|
|
);
|
|
onOpenChange(false);
|
|
}
|
|
} finally {
|
|
setSubmitting(false);
|
|
}
|
|
}
|
|
|
|
return (
|
|
<>
|
|
{messageContextHolder}
|
|
<Modal
|
|
open={open}
|
|
title={t('pages.clients.addToGroupTitle', { count })}
|
|
okText={t('add')}
|
|
cancelText={t('cancel')}
|
|
confirmLoading={submitting}
|
|
okButtonProps={{ disabled: !(group ?? '').trim() }}
|
|
onCancel={() => onOpenChange(false)}
|
|
onOk={submit}
|
|
destroyOnHidden
|
|
>
|
|
<FormProvider {...methods}>
|
|
<Form layout="vertical">
|
|
<FormField
|
|
name="group"
|
|
label={t('pages.clients.group')}
|
|
tooltip={t('pages.clients.addToGroupTooltip')}
|
|
transform={{ output: (v) => v ?? '' }}
|
|
>
|
|
<AutoComplete
|
|
placeholder={t('pages.clients.groupName')}
|
|
options={groups.map((g) => ({ value: g }))}
|
|
allowClear
|
|
autoFocus
|
|
/>
|
|
</FormField>
|
|
</Form>
|
|
</FormProvider>
|
|
</Modal>
|
|
</>
|
|
);
|
|
}
|