info-group.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React from 'react'
  4. import { useRouter } from 'next/navigation'
  5. import { DataType, type MetadataItemWithValue, isShowManageMetadataLocalStorageKey } from '../types'
  6. import Field from './field'
  7. import InputCombined from '../edit-metadata-batch/input-combined'
  8. import { RiDeleteBinLine, RiQuestionLine } from '@remixicon/react'
  9. import Tooltip from '@/app/components/base/tooltip'
  10. import cn from '@/utils/classnames'
  11. import Divider from '@/app/components/base/divider'
  12. import SelectMetadataModal from '../metadata-dataset/select-metadata-modal'
  13. import AddMetadataButton from '../add-metadata-button'
  14. import useTimestamp from '@/hooks/use-timestamp'
  15. import { useTranslation } from 'react-i18next'
  16. type Props = {
  17. dataSetId: string
  18. className?: string
  19. noHeader?: boolean
  20. title?: string
  21. uppercaseTitle?: boolean
  22. titleTooltip?: string
  23. headerRight?: React.ReactNode
  24. contentClassName?: string
  25. list: MetadataItemWithValue[]
  26. isEdit?: boolean
  27. onChange?: (item: MetadataItemWithValue) => void
  28. onDelete?: (item: MetadataItemWithValue) => void
  29. onSelect?: (item: MetadataItemWithValue) => void
  30. onAdd?: (item: MetadataItemWithValue) => void
  31. }
  32. const InfoGroup: FC<Props> = ({
  33. dataSetId,
  34. className,
  35. noHeader,
  36. title,
  37. uppercaseTitle = true,
  38. titleTooltip,
  39. headerRight,
  40. contentClassName,
  41. list,
  42. isEdit,
  43. onChange,
  44. onDelete,
  45. onSelect,
  46. onAdd,
  47. }) => {
  48. const router = useRouter()
  49. const { t } = useTranslation()
  50. const { formatTime: formatTimestamp } = useTimestamp()
  51. const handleMangeMetadata = () => {
  52. localStorage.setItem(isShowManageMetadataLocalStorageKey, 'true')
  53. router.push(`/datasets/${dataSetId}/documents`)
  54. }
  55. return (
  56. <div className={cn('bg-white', className)}>
  57. {!noHeader && (
  58. <div className='flex items-center justify-between'>
  59. <div className='flex items-center space-x-1'>
  60. <div className={cn('text-text-secondary', uppercaseTitle ? 'system-xs-semibold-uppercase' : 'system-md-semibold')}>{title}</div>
  61. {titleTooltip && (
  62. <Tooltip popupContent={<div className='max-w-[240px]'>{titleTooltip}</div>}>
  63. <div><RiQuestionLine className='size-3.5 text-text-tertiary' /></div>
  64. </Tooltip>
  65. )}
  66. </div>
  67. {headerRight}
  68. </div>
  69. )}
  70. <div className={cn('mt-3 space-y-1', contentClassName)}>
  71. {isEdit && (
  72. <div>
  73. <SelectMetadataModal
  74. datasetId={dataSetId}
  75. trigger={
  76. <AddMetadataButton />
  77. }
  78. onSelect={data => onSelect?.(data as MetadataItemWithValue)}
  79. onSave={data => onAdd?.(data)}
  80. onManage={handleMangeMetadata}
  81. />
  82. {list.length > 0 && <Divider className='my-3 ' bgStyle='gradient' />}
  83. </div>
  84. )}
  85. {list.map((item, i) => (
  86. <Field key={(item.id && item.id !== 'built-in') ? item.id : `${i}`} label={item.name}>
  87. {isEdit ? (
  88. <div className='flex items-center space-x-0.5'>
  89. <InputCombined
  90. className='h-6'
  91. type={item.type}
  92. value={item.value}
  93. onChange={value => onChange?.({ ...item, value })}
  94. />
  95. <div className='shrink-0 p-1 rounded-md text-text-tertiary hover:text-text-destructive hover:bg-state-destructive-hover cursor-pointer'>
  96. <RiDeleteBinLine className='size-4' onClick={() => onDelete?.(item)} />
  97. </div>
  98. </div>
  99. ) : (<div className='py-1 system-xs-regular text-text-secondary'>{(item.value && item.type === DataType.time) ? formatTimestamp((item.value as number), t('datasetDocuments.metadata.dateTimeFormat')) : item.value}</div>)}
  100. </Field>
  101. ))}
  102. </div>
  103. </div>
  104. )
  105. }
  106. export default React.memo(InfoGroup)