index.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React from 'react'
  4. import InfoGroup from './info-group'
  5. import NoData from './no-data'
  6. import Button from '@/app/components/base/button'
  7. import { RiEditLine } from '@remixicon/react'
  8. import { useTranslation } from 'react-i18next'
  9. import Divider from '@/app/components/base/divider'
  10. import useMetadataDocument from '../hooks/use-metadata-document'
  11. import type { FullDocumentDetail } from '@/models/datasets'
  12. import cn from '@/utils/classnames'
  13. const i18nPrefix = 'dataset.metadata.documentMetadata'
  14. type Props = {
  15. datasetId: string
  16. documentId: string
  17. className?: string
  18. docDetail: FullDocumentDetail
  19. }
  20. const MetadataDocument: FC<Props> = ({
  21. datasetId,
  22. documentId,
  23. className,
  24. docDetail,
  25. }) => {
  26. const { t } = useTranslation()
  27. const {
  28. embeddingAvailable,
  29. isEdit,
  30. setIsEdit,
  31. list,
  32. tempList,
  33. setTempList,
  34. handleSelectMetaData,
  35. handleAddMetaData,
  36. hasData,
  37. builtList,
  38. builtInEnabled,
  39. startToEdit,
  40. handleSave,
  41. handleCancel,
  42. originInfo,
  43. technicalParameters,
  44. } = useMetadataDocument({ datasetId, documentId, docDetail })
  45. return (
  46. <div className={cn('w-[388px] space-y-4', className)}>
  47. {(hasData || isEdit) ? (
  48. <div className='pl-2'>
  49. <InfoGroup
  50. title={t('dataset.metadata.metadata')}
  51. uppercaseTitle={false}
  52. titleTooltip={t(`${i18nPrefix}.metadataToolTip`)}
  53. list={isEdit ? tempList : list}
  54. dataSetId={datasetId}
  55. headerRight={embeddingAvailable && (isEdit ? (
  56. <div className='flex space-x-1'>
  57. <Button variant='ghost' size='small' onClick={handleCancel}>
  58. <div>{t('common.operation.cancel')}</div>
  59. </Button>
  60. <Button variant='primary' size='small' onClick={handleSave}>
  61. <div>{t('common.operation.save')}</div>
  62. </Button>
  63. </div>
  64. ) : (
  65. <Button variant='ghost' size='small' onClick={startToEdit}>
  66. <RiEditLine className='mr-1 size-3.5 text-text-tertiary cursor-pointer' />
  67. <div>{t('common.operation.edit')}</div>
  68. </Button>
  69. ))}
  70. isEdit={isEdit}
  71. contentClassName='mt-5'
  72. onChange={(item) => {
  73. const newList = tempList.map(i => (i.name === item.name ? item : i))
  74. setTempList(newList)
  75. }}
  76. onDelete={(item) => {
  77. const newList = tempList.filter(i => i.name !== item.name)
  78. setTempList(newList)
  79. }}
  80. onAdd={handleAddMetaData}
  81. onSelect={handleSelectMetaData}
  82. />
  83. </div>
  84. ) : (
  85. embeddingAvailable && <NoData onStart={() => setIsEdit(true)} />
  86. )}
  87. {builtInEnabled && (
  88. <div className='pl-2'>
  89. <Divider className='my-3' bgStyle='gradient' />
  90. <InfoGroup
  91. noHeader
  92. titleTooltip='Built-in metadata is system-generated metadata that is automatically added to the document. You can enable or disable built-in metadata here.'
  93. list={builtList}
  94. dataSetId={datasetId}
  95. />
  96. </div>
  97. )}
  98. {/* Old Metadata */}
  99. <InfoGroup
  100. className='pl-2'
  101. title={t(`${i18nPrefix}.documentInformation`)}
  102. list={originInfo}
  103. dataSetId={datasetId}
  104. />
  105. <InfoGroup
  106. className='pl-2'
  107. title={t(`${i18nPrefix}.technicalParameters`)}
  108. list={technicalParameters}
  109. dataSetId={datasetId}
  110. />
  111. </div>
  112. )
  113. }
  114. export default React.memo(MetadataDocument)