mirror of
https://github.com/langgenius/dify.git
synced 2025-11-29 04:14:51 +00:00
Signed-off-by: -LAN- <laipz8200@outlook.com> Co-authored-by: twwu <twwu@dify.ai> Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com> Co-authored-by: jyong <718720800@qq.com> Co-authored-by: Wu Tianwei <30284043+WTW0313@users.noreply.github.com> Co-authored-by: QuantumGhost <obelisk.reg+git@gmail.com> Co-authored-by: lyzno1 <yuanyouhuilyz@gmail.com> Co-authored-by: quicksand <quicksandzn@gmail.com> Co-authored-by: Jyong <76649700+JohnJyong@users.noreply.github.com> Co-authored-by: lyzno1 <92089059+lyzno1@users.noreply.github.com> Co-authored-by: zxhlyh <jasonapring2015@outlook.com> Co-authored-by: Yongtao Huang <yongtaoh2022@gmail.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: nite-knite <nkCoding@gmail.com> Co-authored-by: Hanqing Zhao <sherry9277@gmail.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Harry <xh001x@hotmail.com>
133 lines
4.4 KiB
TypeScript
133 lines
4.4 KiB
TypeScript
import React, { useMemo } from 'react'
|
|
import type { ColorMap, IndicatorProps } from '@/app/components/header/indicator'
|
|
import Indicator from '@/app/components/header/indicator'
|
|
import type { DocumentDisplayStatus } from '@/models/datasets'
|
|
import { useContext } from 'use-context-selector'
|
|
import { useIndexStatus } from './hooks'
|
|
import { ToastContext } from '@/app/components/base/toast'
|
|
import { useTranslation } from 'react-i18next'
|
|
import { useDocumentDelete, useDocumentDisable, useDocumentEnable } from '@/service/knowledge/use-document'
|
|
import type { CommonResponse } from '@/models/common'
|
|
import { asyncRunSafe } from '@/utils'
|
|
import { useDebounceFn } from 'ahooks'
|
|
import s from '../style.module.css'
|
|
import cn from '@/utils/classnames'
|
|
import Tooltip from '@/app/components/base/tooltip'
|
|
import Switch from '@/app/components/base/switch'
|
|
import type { OperationName } from '../types'
|
|
|
|
const STATUS_TEXT_COLOR_MAP: ColorMap = {
|
|
green: 'text-util-colors-green-green-600',
|
|
orange: 'text-util-colors-warning-warning-600',
|
|
red: 'text-util-colors-red-red-600',
|
|
blue: 'text-util-colors-blue-light-blue-light-600',
|
|
yellow: 'text-util-colors-warning-warning-600',
|
|
gray: 'text-text-tertiary',
|
|
}
|
|
|
|
type StatusItemProps = {
|
|
status: DocumentDisplayStatus
|
|
reverse?: boolean
|
|
scene?: 'list' | 'detail'
|
|
textCls?: string
|
|
errorMessage?: string
|
|
detail?: {
|
|
enabled: boolean
|
|
archived: boolean
|
|
id: string
|
|
}
|
|
datasetId?: string
|
|
onUpdate?: (operationName?: string) => void
|
|
}
|
|
|
|
const StatusItem = ({
|
|
status,
|
|
reverse = false,
|
|
scene = 'list',
|
|
textCls = '',
|
|
errorMessage,
|
|
datasetId = '',
|
|
detail,
|
|
onUpdate,
|
|
}: StatusItemProps) => {
|
|
const { t } = useTranslation()
|
|
const { notify } = useContext(ToastContext)
|
|
const DOC_INDEX_STATUS_MAP = useIndexStatus()
|
|
const localStatus = status.toLowerCase() as keyof typeof DOC_INDEX_STATUS_MAP
|
|
const { enabled = false, archived = false, id = '' } = detail || {}
|
|
const { mutateAsync: enableDocument } = useDocumentEnable()
|
|
const { mutateAsync: disableDocument } = useDocumentDisable()
|
|
const { mutateAsync: deleteDocument } = useDocumentDelete()
|
|
|
|
const onOperate = async (operationName: OperationName) => {
|
|
let opApi = deleteDocument
|
|
switch (operationName) {
|
|
case 'enable':
|
|
opApi = enableDocument
|
|
break
|
|
case 'disable':
|
|
opApi = disableDocument
|
|
break
|
|
}
|
|
const [e] = await asyncRunSafe<CommonResponse>(opApi({ datasetId, documentId: id }) as Promise<CommonResponse>)
|
|
if (!e) {
|
|
notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
|
|
onUpdate?.()
|
|
}
|
|
else { notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') }) }
|
|
}
|
|
|
|
const { run: handleSwitch } = useDebounceFn((operationName: OperationName) => {
|
|
if (operationName === 'enable' && enabled)
|
|
return
|
|
if (operationName === 'disable' && !enabled)
|
|
return
|
|
onOperate(operationName)
|
|
}, { wait: 500 })
|
|
|
|
const embedding = useMemo(() => {
|
|
return ['queuing', 'indexing', 'paused'].includes(localStatus)
|
|
}, [localStatus])
|
|
|
|
return <div className={
|
|
cn('flex items-center',
|
|
reverse ? 'flex-row-reverse' : '',
|
|
scene === 'detail' ? s.statusItemDetail : '')
|
|
}>
|
|
<Indicator color={DOC_INDEX_STATUS_MAP[localStatus]?.color as IndicatorProps['color']} className={reverse ? 'ml-2' : 'mr-2'} />
|
|
<span className={cn(`${STATUS_TEXT_COLOR_MAP[DOC_INDEX_STATUS_MAP[localStatus].color as keyof typeof STATUS_TEXT_COLOR_MAP]} text-sm`, textCls)}>
|
|
{DOC_INDEX_STATUS_MAP[localStatus]?.text}
|
|
</span>
|
|
{
|
|
errorMessage && (
|
|
<Tooltip
|
|
popupContent={
|
|
<div className='max-w-[260px] break-all'>{errorMessage}</div>
|
|
}
|
|
triggerClassName='ml-1 w-4 h-4'
|
|
/>
|
|
)
|
|
}
|
|
{
|
|
scene === 'detail' && (
|
|
<div className='ml-1.5 flex items-center justify-between'>
|
|
<Tooltip
|
|
popupContent={t('datasetDocuments.list.action.enableWarning')}
|
|
popupClassName='text-text-secondary system-xs-medium'
|
|
disabled={!archived}
|
|
>
|
|
<Switch
|
|
defaultValue={archived ? false : enabled}
|
|
onChange={v => !archived && handleSwitch(v ? 'enable' : 'disable')}
|
|
disabled={embedding || archived}
|
|
size='md'
|
|
/>
|
|
</Tooltip>
|
|
</div>
|
|
)
|
|
}
|
|
</div>
|
|
}
|
|
|
|
export default React.memo(StatusItem)
|