diff --git a/web/app/components/base/checkbox/assets/indeterminate-icon.tsx b/web/app/components/base/checkbox/assets/indeterminate-icon.tsx
new file mode 100644
index 0000000000..7c8c609e08
--- /dev/null
+++ b/web/app/components/base/checkbox/assets/indeterminate-icon.tsx
@@ -0,0 +1,9 @@
+const IndeterminateIcon = () => {
+ return (
+
+ )
+}
+
+export default IndeterminateIcon
diff --git a/web/app/components/base/checkbox/assets/mixed.svg b/web/app/components/base/checkbox/assets/mixed.svg
deleted file mode 100644
index e16b8fc975..0000000000
--- a/web/app/components/base/checkbox/assets/mixed.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
diff --git a/web/app/components/base/checkbox/index.module.css b/web/app/components/base/checkbox/index.module.css
deleted file mode 100644
index d675607b46..0000000000
--- a/web/app/components/base/checkbox/index.module.css
+++ /dev/null
@@ -1,10 +0,0 @@
-.mixed {
- background: var(--color-components-checkbox-bg) url(./assets/mixed.svg) center center no-repeat;
- background-size: 12px 12px;
- border: none;
-}
-
-.checked.disabled {
- background-color: #d0d5dd;
- border-color: #d0d5dd;
-}
\ No newline at end of file
diff --git a/web/app/components/base/checkbox/index.tsx b/web/app/components/base/checkbox/index.tsx
index b0b0ebca7c..7abe54ee38 100644
--- a/web/app/components/base/checkbox/index.tsx
+++ b/web/app/components/base/checkbox/index.tsx
@@ -1,23 +1,25 @@
import { RiCheckLine } from '@remixicon/react'
-import s from './index.module.css'
import cn from '@/utils/classnames'
+import IndeterminateIcon from './assets/indeterminate-icon'
type CheckboxProps = {
+ id?: string
checked?: boolean
onCheck?: () => void
className?: string
disabled?: boolean
- mixed?: boolean
+ indeterminate?: boolean
}
-const Checkbox = ({ checked, onCheck, className, disabled, mixed }: CheckboxProps) => {
+const Checkbox = ({ id, checked, onCheck, className, disabled, indeterminate }: CheckboxProps) => {
if (!checked) {
return (
{
@@ -25,11 +27,16 @@ const Checkbox = ({ checked, onCheck, className, disabled, mixed }: CheckboxProp
return
onCheck?.()
}}
- >
+ >
+ {indeterminate && (
+
+ )}
+
)
}
return (
-
+
)
}
diff --git a/web/app/components/datasets/documents/detail/completed/index.tsx b/web/app/components/datasets/documents/detail/completed/index.tsx
index 197a6514da..4fe0df2acd 100644
--- a/web/app/components/datasets/documents/detail/completed/index.tsx
+++ b/web/app/components/datasets/documents/detail/completed/index.tsx
@@ -220,13 +220,11 @@ const Completed: FC = ({
const resetList = useCallback(() => {
setSelectedSegmentIds([])
invalidSegmentList()
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [])
+ }, [invalidSegmentList])
const resetChildList = useCallback(() => {
invalidChildSegmentList()
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [])
+ }, [invalidChildSegmentList])
const onClickCard = (detail: SegmentDetailModel, isEditMode = false) => {
setCurrSegment({ segInfo: detail, showModal: true, isEditMode })
@@ -253,7 +251,7 @@ const Completed: FC = ({
const invalidChunkListEnabled = useInvalid(useChunkListEnabledKey)
const invalidChunkListDisabled = useInvalid(useChunkListDisabledKey)
- const refreshChunkListWithStatusChanged = () => {
+ const refreshChunkListWithStatusChanged = useCallback(() => {
switch (selectedStatus) {
case 'all':
invalidChunkListDisabled()
@@ -262,7 +260,7 @@ const Completed: FC = ({
default:
invalidSegmentList()
}
- }
+ }, [selectedStatus, invalidChunkListDisabled, invalidChunkListEnabled, invalidSegmentList])
const onChangeSwitch = useCallback(async (enable: boolean, segId?: string) => {
const operationApi = enable ? enableSegment : disableSegment
@@ -280,8 +278,7 @@ const Completed: FC = ({
notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
},
})
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [datasetId, documentId, selectedSegmentIds, segments])
+ }, [datasetId, documentId, selectedSegmentIds, segments, disableSegment, enableSegment, t, notify, refreshChunkListWithStatusChanged])
const { mutateAsync: deleteSegment } = useDeleteSegment()
@@ -296,12 +293,11 @@ const Completed: FC = ({
notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
},
})
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [datasetId, documentId, selectedSegmentIds])
+ }, [datasetId, documentId, selectedSegmentIds, deleteSegment, resetList, t, notify])
const { mutateAsync: updateSegment } = useUpdateSegment()
- const refreshChunkListDataWithDetailChanged = () => {
+ const refreshChunkListDataWithDetailChanged = useCallback(() => {
switch (selectedStatus) {
case 'all':
invalidChunkListDisabled()
@@ -316,7 +312,7 @@ const Completed: FC = ({
invalidChunkListEnabled()
break
}
- }
+ }, [selectedStatus, invalidChunkListDisabled, invalidChunkListEnabled, invalidChunkListAll])
const handleUpdateSegment = useCallback(async (
segmentId: string,
@@ -375,17 +371,18 @@ const Completed: FC = ({
eventEmitter?.emit('update-segment-done')
},
})
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [segments, datasetId, documentId])
+ }, [segments, datasetId, documentId, updateSegment, docForm, notify, eventEmitter, onCloseSegmentDetail, refreshChunkListDataWithDetailChanged, t])
useEffect(() => {
resetList()
+ // eslint-disable-next-line react-hooks/exhaustive-deps
}, [pathname])
useEffect(() => {
if (importStatus === ProcessStatus.COMPLETED)
resetList()
- }, [importStatus, resetList])
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [importStatus])
const onCancelBatchOperation = useCallback(() => {
setSelectedSegmentIds([])
@@ -430,8 +427,7 @@ const Completed: FC = ({
const count = segmentListData?.total || 0
return `${total} ${t('datasetDocuments.segment.searchResults', { count })}`
}
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [segmentListData?.total, mode, parentMode, searchValue, selectedStatus])
+ }, [segmentListData, mode, parentMode, searchValue, selectedStatus, t])
const toggleFullScreen = useCallback(() => {
setFullScreen(!fullScreen)
@@ -449,8 +445,7 @@ const Completed: FC = ({
resetList()
currentPage !== totalPages && setCurrentPage(totalPages)
}
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [segmentListData, limit, currentPage])
+ }, [segmentListData, limit, currentPage, resetList])
const { mutateAsync: deleteChildSegment } = useDeleteChildSegment()
@@ -470,8 +465,7 @@ const Completed: FC = ({
},
},
)
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [datasetId, documentId, parentMode])
+ }, [datasetId, documentId, parentMode, deleteChildSegment, resetList, resetChildList, t, notify])
const handleAddNewChildChunk = useCallback((parentChunkId: string) => {
setShowNewChildSegmentModal(true)
@@ -490,8 +484,7 @@ const Completed: FC = ({
else {
resetChildList()
}
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [parentMode, currChunkId, segments])
+ }, [parentMode, currChunkId, segments, refreshChunkListDataWithDetailChanged, resetChildList])
const viewNewlyAddedChildChunk = useCallback(() => {
const totalPages = childChunkListData?.total_pages || 0
@@ -505,8 +498,7 @@ const Completed: FC = ({
resetChildList()
currentPage !== totalPages && setCurrentPage(totalPages)
}
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [childChunkListData, limit, currentPage])
+ }, [childChunkListData, limit, currentPage, resetChildList])
const onClickSlice = useCallback((detail: ChildChunkDetail) => {
setCurrChildChunk({ childChunkInfo: detail, showModal: true })
@@ -560,8 +552,7 @@ const Completed: FC = ({
eventEmitter?.emit('update-child-segment-done')
},
})
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [segments, childSegments, datasetId, documentId, parentMode])
+ }, [segments, datasetId, documentId, parentMode, updateChildSegment, notify, eventEmitter, onCloseChildSegmentDetail, refreshChunkListDataWithDetailChanged, resetChildList, t])
const onClearFilter = useCallback(() => {
setInputValue('')
@@ -570,6 +561,12 @@ const Completed: FC = ({
setCurrentPage(1)
}, [])
+ const selectDefaultValue = useMemo(() => {
+ if (selectedStatus === 'all')
+ return 'all'
+ return selectedStatus ? 1 : 0
+ }, [selectedStatus])
+
return (
= ({
@@ -591,7 +588,7 @@ const Completed: FC = ({
= ({
const wordCountText = useMemo(() => {
const total = formatNumber(word_count)
return `${total} ${t('datasetDocuments.segment.characters', { count: word_count })}`
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [word_count])
+ }, [word_count, t])
const labelPrefix = useMemo(() => {
return isParentChildMode ? t('datasetDocuments.segment.parentChunk') : t('datasetDocuments.segment.chunk')
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [isParentChildMode])
+ }, [isParentChildMode, t])
if (loading)
return
diff --git a/web/app/components/datasets/documents/detail/completed/segment-detail.tsx b/web/app/components/datasets/documents/detail/completed/segment-detail.tsx
index cea3402499..d3575c18ed 100644
--- a/web/app/components/datasets/documents/detail/completed/segment-detail.tsx
+++ b/web/app/components/datasets/documents/detail/completed/segment-detail.tsx
@@ -86,8 +86,7 @@ const SegmentDetail: FC = ({
const titleText = useMemo(() => {
return isEditMode ? t('datasetDocuments.segment.editChunk') : t('datasetDocuments.segment.chunkDetail')
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [isEditMode])
+ }, [isEditMode, t])
const isQAModel = useMemo(() => {
return docForm === ChunkingMode.qa
@@ -98,13 +97,11 @@ const SegmentDetail: FC = ({
const total = formatNumber(isEditMode ? contentLength : segInfo!.word_count as number)
const count = isEditMode ? contentLength : segInfo!.word_count as number
return `${total} ${t('datasetDocuments.segment.characters', { count })}`
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [isEditMode, question.length, answer.length, segInfo?.word_count, isQAModel])
+ }, [isEditMode, question.length, answer.length, isQAModel, segInfo, t])
const labelPrefix = useMemo(() => {
return isParentChildMode ? t('datasetDocuments.segment.parentChunk') : t('datasetDocuments.segment.chunk')
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [isParentChildMode])
+ }, [isParentChildMode, t])
return (
diff --git a/web/app/components/datasets/documents/detail/completed/segment-list.tsx b/web/app/components/datasets/documents/detail/completed/segment-list.tsx
index b2351c1b97..f6076e5813 100644
--- a/web/app/components/datasets/documents/detail/completed/segment-list.tsx
+++ b/web/app/components/datasets/documents/detail/completed/segment-list.tsx
@@ -42,7 +42,7 @@ const SegmentList = (
embeddingAvailable,
onClearFilter,
}: ISegmentListProps & {
- ref: React.RefObject;
+ ref: React.LegacyRef
},
) => {
const mode = useDocumentContext(s => s.mode)
diff --git a/web/app/components/datasets/documents/list.tsx b/web/app/components/datasets/documents/list.tsx
index 8ed878fe56..cb349ee01c 100644
--- a/web/app/components/datasets/documents/list.tsx
+++ b/web/app/components/datasets/documents/list.tsx
@@ -202,7 +202,7 @@ export const OperationAction: FC<{
const isListScene = scene === 'list'
const onOperate = async (operationName: OperationName) => {
- let opApi = deleteDocument
+ let opApi
switch (operationName) {
case 'archive':
opApi = archiveDocument
@@ -490,7 +490,7 @@ const DocumentList: FC = ({
const handleAction = (actionName: DocumentActionType) => {
return async () => {
- let opApi = deleteDocument
+ let opApi
switch (actionName) {
case DocumentActionType.archive:
opApi = archiveDocument
@@ -527,7 +527,7 @@ const DocumentList: FC = ({
)}