### What problem does this PR solve? Feat: Allow users to parse documents directly after uploading files #3221 ### Type of change - [x] New Feature (non-breaking change which adds functionality)
126 lines
3.7 KiB
TypeScript
126 lines
3.7 KiB
TypeScript
import { ButtonLoading } from '@/components/ui/button';
|
|
import {
|
|
Dialog,
|
|
DialogContent,
|
|
DialogFooter,
|
|
DialogHeader,
|
|
DialogTitle,
|
|
} from '@/components/ui/dialog';
|
|
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
|
|
import { IModalProps } from '@/interfaces/common';
|
|
import { zodResolver } from '@hookform/resolvers/zod';
|
|
import { TFunction } from 'i18next';
|
|
import { useForm } from 'react-hook-form';
|
|
import { useTranslation } from 'react-i18next';
|
|
import { z } from 'zod';
|
|
import { FileUploader } from '../file-uploader';
|
|
import { RAGFlowFormItem } from '../ragflow-form';
|
|
import { Form } from '../ui/form';
|
|
import { Switch } from '../ui/switch';
|
|
|
|
function buildUploadFormSchema(t: TFunction) {
|
|
const FormSchema = z.object({
|
|
parseOnCreation: z.boolean().optional(),
|
|
fileList: z
|
|
.array(z.instanceof(File))
|
|
.min(1, { message: t('fileManager.pleaseUploadAtLeastOneFile') }),
|
|
});
|
|
|
|
return FormSchema;
|
|
}
|
|
|
|
export type UploadFormSchemaType = z.infer<
|
|
ReturnType<typeof buildUploadFormSchema>
|
|
>;
|
|
|
|
const UploadFormId = 'UploadFormId';
|
|
|
|
type UploadFormProps = {
|
|
submit: (values?: UploadFormSchemaType) => void;
|
|
showParseOnCreation?: boolean;
|
|
};
|
|
function UploadForm({ submit, showParseOnCreation }: UploadFormProps) {
|
|
const { t } = useTranslation();
|
|
const FormSchema = buildUploadFormSchema(t);
|
|
|
|
type UploadFormSchemaType = z.infer<typeof FormSchema>;
|
|
const form = useForm<UploadFormSchemaType>({
|
|
resolver: zodResolver(FormSchema),
|
|
defaultValues: {
|
|
parseOnCreation: false,
|
|
fileList: [],
|
|
},
|
|
});
|
|
|
|
return (
|
|
<Form {...form}>
|
|
<form
|
|
onSubmit={form.handleSubmit(submit)}
|
|
id={UploadFormId}
|
|
className="space-y-4"
|
|
>
|
|
{showParseOnCreation && (
|
|
<RAGFlowFormItem
|
|
name="parseOnCreation"
|
|
label={t('fileManager.parseOnCreation')}
|
|
>
|
|
{(field) => (
|
|
<Switch
|
|
onCheckedChange={field.onChange}
|
|
checked={field.value}
|
|
></Switch>
|
|
)}
|
|
</RAGFlowFormItem>
|
|
)}
|
|
<RAGFlowFormItem name="fileList" label={t('fileManager.file')}>
|
|
{(field) => (
|
|
<FileUploader
|
|
value={field.value}
|
|
onValueChange={field.onChange}
|
|
accept={{ '*': [] }}
|
|
/>
|
|
)}
|
|
</RAGFlowFormItem>
|
|
</form>
|
|
</Form>
|
|
);
|
|
}
|
|
|
|
type FileUploadDialogProps = IModalProps<UploadFormSchemaType> &
|
|
Pick<UploadFormProps, 'showParseOnCreation'>;
|
|
export function FileUploadDialog({
|
|
hideModal,
|
|
onOk,
|
|
loading,
|
|
showParseOnCreation = false,
|
|
}: FileUploadDialogProps) {
|
|
const { t } = useTranslation();
|
|
|
|
return (
|
|
<Dialog open onOpenChange={hideModal}>
|
|
<DialogContent className="sm:max-w-[425px]">
|
|
<DialogHeader>
|
|
<DialogTitle>{t('fileManager.uploadFile')}</DialogTitle>
|
|
</DialogHeader>
|
|
<Tabs defaultValue="account">
|
|
<TabsList className="grid w-full grid-cols-2 mb-4">
|
|
<TabsTrigger value="account">{t('fileManager.local')}</TabsTrigger>
|
|
<TabsTrigger value="password">{t('fileManager.s3')}</TabsTrigger>
|
|
</TabsList>
|
|
<TabsContent value="account">
|
|
<UploadForm
|
|
submit={onOk!}
|
|
showParseOnCreation={showParseOnCreation}
|
|
></UploadForm>
|
|
</TabsContent>
|
|
<TabsContent value="password">{t('common.comingSoon')}</TabsContent>
|
|
</Tabs>
|
|
<DialogFooter>
|
|
<ButtonLoading type="submit" loading={loading} form={UploadFormId}>
|
|
{t('common.save')}
|
|
</ButtonLoading>
|
|
</DialogFooter>
|
|
</DialogContent>
|
|
</Dialog>
|
|
);
|
|
}
|