| import { IModalProps } from '@/interfaces/common'; | |
| import { IDocumentInfo } from '@/interfaces/database/document'; | |
| import Editor, { loader } from '@monaco-editor/react'; | |
| import { Form, Modal } from 'antd'; | |
| import DOMPurify from 'dompurify'; | |
| import { useCallback, useEffect } from 'react'; | |
| import { useTranslation } from 'react-i18next'; | |
| loader.config({ paths: { vs: '/vs' } }); | |
| type FieldType = { | |
| meta?: string; | |
| }; | |
| export function SetMetaModal({ | |
| visible, | |
| hideModal, | |
| onOk, | |
| initialMetaData, | |
| }: IModalProps<any> & { initialMetaData?: IDocumentInfo['meta_fields'] }) { | |
| const { t } = useTranslation(); | |
| const [form] = Form.useForm(); | |
| const handleOk = useCallback(async () => { | |
| const values = await form.validateFields(); | |
| onOk?.(values.meta); | |
| }, [form, onOk]); | |
| useEffect(() => { | |
| form.setFieldValue('meta', JSON.stringify(initialMetaData, null, 4)); | |
| }, [form, initialMetaData]); | |
| return ( | |
| <Modal | |
| title={t('knowledgeDetails.setMetaData')} | |
| open={visible} | |
| onOk={handleOk} | |
| onCancel={hideModal} | |
| > | |
| <Form | |
| name="basic" | |
| initialValues={{ remember: true }} | |
| autoComplete="off" | |
| layout={'vertical'} | |
| form={form} | |
| > | |
| <Form.Item<FieldType> | |
| label={t('knowledgeDetails.metaData')} | |
| name="meta" | |
| rules={[ | |
| { | |
| required: true, | |
| validator(rule, value) { | |
| try { | |
| JSON.parse(value); | |
| return Promise.resolve(); | |
| } catch (error) { | |
| return Promise.reject( | |
| new Error(t('knowledgeDetails.pleaseInputJson')), | |
| ); | |
| } | |
| }, | |
| }, | |
| ]} | |
| tooltip={ | |
| <div | |
| dangerouslySetInnerHTML={{ | |
| __html: DOMPurify.sanitize( | |
| t('knowledgeDetails.documentMetaTips'), | |
| ), | |
| }} | |
| ></div> | |
| } | |
| > | |
| <Editor height={200} defaultLanguage="json" theme="vs-dark" /> | |
| </Form.Item> | |
| </Form> | |
| </Modal> | |
| ); | |
| } | |