選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

chunk-detail-modal.tsx 3.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React from 'react'
  4. import { useTranslation } from 'react-i18next'
  5. import { SegmentIndexTag } from '../../documents/detail/completed/common/segment-index-tag'
  6. import Dot from '../../documents/detail/completed/common/dot'
  7. import Score from './score'
  8. import ChildChunksItem from './child-chunks-item'
  9. import Modal from '@/app/components/base/modal'
  10. import type { HitTesting } from '@/models/datasets'
  11. import FileIcon from '@/app/components/base/file-uploader/file-type-icon'
  12. import type { FileAppearanceTypeEnum } from '@/app/components/base/file-uploader/types'
  13. import cn from '@/utils/classnames'
  14. import Tag from '@/app/components/datasets/documents/detail/completed/common/tag'
  15. import { Markdown } from '@/app/components/base/markdown'
  16. const i18nPrefix = 'datasetHitTesting'
  17. type Props = {
  18. payload: HitTesting
  19. onHide: () => void
  20. }
  21. const ChunkDetailModal: FC<Props> = ({
  22. payload,
  23. onHide,
  24. }) => {
  25. const { t } = useTranslation()
  26. const { segment, score, child_chunks } = payload
  27. const { position, content, sign_content, keywords, document } = segment
  28. const isParentChildRetrieval = !!(child_chunks && child_chunks.length > 0)
  29. const extension = document.name.split('.').slice(-1)[0] as FileAppearanceTypeEnum
  30. const heighClassName = isParentChildRetrieval ? 'h-[min(627px,_80vh)] overflow-y-auto' : 'h-[min(539px,_80vh)] overflow-y-auto'
  31. return (
  32. <Modal
  33. title={t(`${i18nPrefix}.chunkDetail`)}
  34. isShow
  35. closable
  36. onClose={onHide}
  37. className={cn(isParentChildRetrieval ? '!min-w-[1200px]' : '!min-w-[800px]')}
  38. >
  39. <div className='mt-4 flex'>
  40. <div className={cn('flex-1', isParentChildRetrieval && 'pr-6')}>
  41. {/* Meta info */}
  42. <div className='flex justify-between items-center'>
  43. <div className='grow flex items-center space-x-2'>
  44. <SegmentIndexTag
  45. labelPrefix={`${isParentChildRetrieval ? 'Parent-' : ''}Chunk`}
  46. positionId={position}
  47. className={cn('w-fit group-hover:opacity-100')}
  48. />
  49. <Dot />
  50. <div className='grow flex items-center space-x-1'>
  51. <FileIcon type={extension} size='sm' />
  52. <span className='grow w-0 truncate text-text-secondary text-[13px] font-normal'>{document.name}</span>
  53. </div>
  54. </div>
  55. <Score value={score} />
  56. </div>
  57. <Markdown
  58. className={cn('!mt-2 !text-text-secondary', heighClassName)}
  59. content={sign_content || content}
  60. customDisallowedElements={['input']}
  61. />
  62. {!isParentChildRetrieval && keywords && keywords.length > 0 && (
  63. <div className='mt-6'>
  64. <div className='font-medium text-xs text-text-tertiary uppercase'>{t(`${i18nPrefix}.keyword`)}</div>
  65. <div className='mt-1 flex flex-wrap'>
  66. {keywords.map(keyword => (
  67. <Tag key={keyword} text={keyword} className='mr-2' />
  68. ))}
  69. </div>
  70. </div>
  71. )}
  72. </div>
  73. {isParentChildRetrieval && (
  74. <div className='flex-1 pl-6 pb-6'>
  75. <div className='system-xs-semibold-uppercase text-text-secondary'>{t(`${i18nPrefix}.hitChunks`, { num: child_chunks.length })}</div>
  76. <div className={cn('mt-1 space-y-2', heighClassName)}>
  77. {child_chunks.map(item => (
  78. <ChildChunksItem key={item.id} payload={item} isShowAll />
  79. ))}
  80. </div>
  81. </div>
  82. )}
  83. </div>
  84. </Modal>
  85. )
  86. }
  87. export default React.memo(ChunkDetailModal)