Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

panel.tsx 3.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import type { FC } from 'react'
  2. import React from 'react'
  3. import useSWR from 'swr'
  4. import { useTranslation } from 'react-i18next'
  5. import { useContext } from 'use-context-selector'
  6. import VarReferencePicker from '../_base/components/variable/var-reference-picker'
  7. import OutputVars, { VarItem } from '../_base/components/output-vars'
  8. import Split from '../_base/components/split'
  9. import { useNodeHelpLink } from '../_base/hooks/use-node-help-link'
  10. import useConfig from './use-config'
  11. import type { DocExtractorNodeType } from './types'
  12. import { fetchSupportFileTypes } from '@/service/datasets'
  13. import Field from '@/app/components/workflow/nodes/_base/components/field'
  14. import { BlockEnum, type NodePanelProps } from '@/app/components/workflow/types'
  15. import I18n from '@/context/i18n'
  16. import { LanguagesSupported } from '@/i18n/language'
  17. const i18nPrefix = 'workflow.nodes.docExtractor'
  18. const Panel: FC<NodePanelProps<DocExtractorNodeType>> = ({
  19. id,
  20. data,
  21. }) => {
  22. const { t } = useTranslation()
  23. const { locale } = useContext(I18n)
  24. const link = useNodeHelpLink(BlockEnum.DocExtractor)
  25. const { data: supportFileTypesResponse } = useSWR({ url: '/files/support-type' }, fetchSupportFileTypes)
  26. const supportTypes = supportFileTypesResponse?.allowed_extensions || []
  27. const supportTypesShowNames = (() => {
  28. const extensionMap: { [key: string]: string } = {
  29. md: 'markdown',
  30. pptx: 'pptx',
  31. htm: 'html',
  32. xlsx: 'xlsx',
  33. docx: 'docx',
  34. }
  35. return [...supportTypes]
  36. .map(item => extensionMap[item] || item) // map to standardized extension
  37. .map(item => item.toLowerCase()) // convert to lower case
  38. .filter((item, index, self) => self.indexOf(item) === index) // remove duplicates
  39. .join(locale !== LanguagesSupported[1] ? ', ' : '、 ')
  40. })()
  41. const {
  42. readOnly,
  43. inputs,
  44. handleVarChanges,
  45. filterVar,
  46. } = useConfig(id, data)
  47. return (
  48. <div className='mt-2'>
  49. <div className='space-y-4 px-4 pb-4'>
  50. <Field
  51. title={t(`${i18nPrefix}.inputVar`)}
  52. required
  53. >
  54. <>
  55. <VarReferencePicker
  56. readonly={readOnly}
  57. nodeId={id}
  58. isShowNodeName
  59. value={inputs.variable_selector || []}
  60. onChange={handleVarChanges}
  61. filterVar={filterVar}
  62. typePlaceHolder='File | Array[File]'
  63. />
  64. <div className='body-xs-regular mt-1 py-0.5 text-text-tertiary'>
  65. {t(`${i18nPrefix}.supportFileTypes`, { types: supportTypesShowNames })}
  66. <a className='text-text-accent' href={link} target='_blank'>{t(`${i18nPrefix}.learnMore`)}</a>
  67. </div>
  68. </>
  69. </Field>
  70. </div>
  71. <Split />
  72. <div>
  73. <OutputVars>
  74. <VarItem
  75. name='text'
  76. type={inputs.is_array_file ? 'array[string]' : 'string'}
  77. description={t(`${i18nPrefix}.outputVars.text`)}
  78. />
  79. </OutputVars>
  80. </div>
  81. </div>
  82. )
  83. }
  84. export default React.memo(Panel)