| import type { FC } from 'react' |
| import React from 'react' |
| import useSWR from 'swr' |
| import { useTranslation } from 'react-i18next' |
| import { useContext } from 'use-context-selector' |
| import VarReferencePicker from '../_base/components/variable/var-reference-picker' |
| import OutputVars, { VarItem } from '../_base/components/output-vars' |
| import Split from '../_base/components/split' |
| import { useNodeHelpLink } from '../_base/hooks/use-node-help-link' |
| import useConfig from './use-config' |
| import type { DocExtractorNodeType } from './types' |
| import { fetchSupportFileTypes } from '@/service/datasets' |
| import Field from '@/app/components/workflow/nodes/_base/components/field' |
| import { BlockEnum, type NodePanelProps } from '@/app/components/workflow/types' |
| import I18n from '@/context/i18n' |
| import { LanguagesSupported } from '@/i18n/language' |
|
|
| const i18nPrefix = 'workflow.nodes.docExtractor' |
|
|
| const Panel: FC<NodePanelProps<DocExtractorNodeType>> = ({ |
| id, |
| data, |
| }) => { |
| const { t } = useTranslation() |
| const { locale } = useContext(I18n) |
| const link = useNodeHelpLink(BlockEnum.DocExtractor) |
| const { data: supportFileTypesResponse } = useSWR({ url: '/files/support-type' }, fetchSupportFileTypes) |
| const supportTypes = supportFileTypesResponse?.allowed_extensions || [] |
| const supportTypesShowNames = (() => { |
| const extensionMap: { [key: string]: string } = { |
| md: 'markdown', |
| pptx: 'pptx', |
| htm: 'html', |
| xlsx: 'xlsx', |
| docx: 'docx', |
| } |
|
|
| return [...supportTypes] |
| .map(item => extensionMap[item] || item) |
| .map(item => item.toLowerCase()) |
| .filter((item, index, self) => self.indexOf(item) === index) |
| .join(locale !== LanguagesSupported[1] ? ', ' : '、 ') |
| })() |
| const { |
| readOnly, |
| inputs, |
| handleVarChanges, |
| filterVar, |
| } = useConfig(id, data) |
|
|
| return ( |
| <div className='mt-2'> |
| <div className='px-4 pb-4 space-y-4'> |
| <Field |
| title={t(`${i18nPrefix}.inputVar`)} |
| > |
| <> |
| <VarReferencePicker |
| readonly={readOnly} |
| nodeId={id} |
| isShowNodeName |
| value={inputs.variable_selector || []} |
| onChange={handleVarChanges} |
| filterVar={filterVar} |
| typePlaceHolder='File | Array[File]' |
| /> |
| <div className='mt-1 py-0.5 text-text-tertiary body-xs-regular'> |
| {t(`${i18nPrefix}.supportFileTypes`, { types: supportTypesShowNames })} |
| <a className='text-text-accent' href={link} target='_blank'>{t(`${i18nPrefix}.learnMore`)}</a> |
| </div> |
| </> |
| </Field> |
| </div> |
| <Split /> |
| <div className='px-4 pt-4 pb-2'> |
| <OutputVars> |
| <VarItem |
| name='text' |
| type={inputs.is_array_file ? 'array[string]' : 'string'} |
| description={t(`${i18nPrefix}.outputVars.text`)} |
| /> |
| </OutputVars> |
| </div> |
| </div> |
| ) |
| } |
|
|
| export default React.memo(Panel) |
|
|