diff --git a/web/app/components/base/skeleton/index.tsx b/web/app/components/base/skeleton/index.tsx index 5f29c22f7c..e72184138e 100644 --- a/web/app/components/base/skeleton/index.tsx +++ b/web/app/components/base/skeleton/index.tsx @@ -30,9 +30,12 @@ export const SkeletonRectangle: FC = (props) => { ) } -export const SkeletonPoint: FC = () => -
·
- +export const SkeletonPoint: FC = (props) => { + const { className, ...rest } = props + return ( +
·
+ ) +} /** Usage * * diff --git a/web/app/components/datasets/documents/detail/completed/child-segment-list.tsx b/web/app/components/datasets/documents/detail/completed/child-segment-list.tsx index ce4ad7cccc..293ab2bc4f 100644 --- a/web/app/components/datasets/documents/detail/completed/child-segment-list.tsx +++ b/web/app/components/datasets/documents/detail/completed/child-segment-list.tsx @@ -4,12 +4,12 @@ import { useTranslation } from 'react-i18next' import { EditSlice } from '../../../formatted-text/flavours/edit-slice' import { useDocumentContext } from '../index' import Empty from './common/empty' +import FullDocListSkeleton from './skeleton/full-doc-list-skeleton' import type { ChildChunkDetail } from '@/models/datasets' import Input from '@/app/components/base/input' import classNames from '@/utils/classnames' import Divider from '@/app/components/base/divider' import { formatNumber } from '@/utils/format' -import Loading from '@/app/components/base/loading' type IChildSegmentCardProps = { childChunks: ChildChunkDetail[] @@ -72,7 +72,7 @@ const ChildSegmentList: FC = ({ ? 0 : total : childChunks.length - return `${isFullDocMode ? count : childChunks.length} ${t('datasetDocuments.segment.childChunks', { count })}` + return `${text} ${t('datasetDocuments.segment.childChunks', { count })}` } else { const text = !total ? '--' : formatNumber(total) @@ -83,10 +83,15 @@ const ChildSegmentList: FC = ({ }, [isFullDocMode, total, childChunks.length, inputValue]) return ( -
+
{isFullDocMode ? : null}
-
{ +
{ event.stopPropagation() toggleCollapse() }}> @@ -102,11 +107,16 @@ const ChildSegmentList: FC = ({ {totalText} · @@ -122,10 +132,10 @@ const ChildSegmentList: FC = ({ /> : null}
- {(isFullDocMode || !collapsed) - ?
+ {isLoading ? : null} + {((isFullDocMode && !isLoading) || !collapsed) + ?
{isParagraphMode && } - {isLoading ? : null} {childChunks.length > 0 ?
{childChunks.map((childChunk) => { diff --git a/web/app/components/datasets/documents/detail/completed/common/empty.tsx b/web/app/components/datasets/documents/detail/completed/common/empty.tsx index 4b78143fca..3551fd1b8b 100644 --- a/web/app/components/datasets/documents/detail/completed/common/empty.tsx +++ b/web/app/components/datasets/documents/detail/completed/common/empty.tsx @@ -69,7 +69,7 @@ const Empty: FC = ({ )) }
-
+
) } diff --git a/web/app/components/datasets/documents/detail/completed/index.tsx b/web/app/components/datasets/documents/detail/completed/index.tsx index 3a78cf0cf3..ee92bc7247 100644 --- a/web/app/components/datasets/documents/detail/completed/index.tsx +++ b/web/app/components/datasets/documents/detail/completed/index.tsx @@ -507,6 +507,7 @@ const Completed: FC = ({ checked={isAllSelected} mixed={!isAllSelected && isSomeSelected} onCheck={onSelectedAll} + disabled={isLoadingSegmentList} />
{totalText}
= ({ {/* Segment list */} { isFullDocMode - ?
+ ?
onClickCard(segments[0])} - loading={false} + loading={isLoadingSegmentList} /> = ({ total={childChunkListData?.total || 0} inputValue={inputValue} onClearFilter={onClearFilter} - isLoading={isLoadingChildSegmentList} + isLoading={isLoadingSegmentList || isLoadingChildSegmentList} />
: = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [isParentChildMode]) + if (loading) + return + return (
= ({ : null}
- {loading - ? ( -
-
-
- ) - : ( - <> -
- {renderContent()} -
- {isGeneralMode &&
- {keywords?.map(keyword => )} -
} - { - isFullDocMode - ? - : null - } - { - child_chunks.length > 0 +
+ {renderContent()} +
+ {isGeneralMode &&
+ {keywords?.map(keyword => )} +
} + { + isFullDocMode + ? + : null + } + { + child_chunks.length > 0 && = ({ handleAddNewChildChunk={handleAddNewChildChunk} onClickSlice={onClickSlice} /> - } - - ) } {showModal && , ) => { + const [mode, parentMode] = useDocumentContext(s => [s.mode, s.parentMode]) + + const Skeleton = useMemo(() => { + return (mode === 'hierarchical' && parentMode === 'paragraph') ? ParagraphListSkeleton : GeneralListSkeleton + }, [mode, parentMode]) + + // Loading skeleton if (isLoading) - return + return + // Search result is empty if (items.length === 0) { return (
@@ -50,7 +59,7 @@ ref: ForwardedRef, ) } return ( -
+
{ items.map((segItem) => { const isLast = items[items.length - 1].id === segItem.id diff --git a/web/app/components/datasets/documents/detail/completed/skeleton/full-doc-list-skeleton.tsx b/web/app/components/datasets/documents/detail/completed/skeleton/full-doc-list-skeleton.tsx new file mode 100644 index 0000000000..7ae5e8c4f2 --- /dev/null +++ b/web/app/components/datasets/documents/detail/completed/skeleton/full-doc-list-skeleton.tsx @@ -0,0 +1,25 @@ +import React from 'react' + +const Slice = React.memo(() => { + return ( +
+
+ +
+
+
+ ) +}) + +Slice.displayName = 'Slice' + +const FullDocListSkeleton = () => { + return ( +
+
+ {[...Array(15)].map((_, index) => )} +
+ ) +} + +export default React.memo(FullDocListSkeleton) diff --git a/web/app/components/datasets/documents/detail/completed/skeleton/general-list-skeleton.tsx b/web/app/components/datasets/documents/detail/completed/skeleton/general-list-skeleton.tsx new file mode 100644 index 0000000000..a76943ed5e --- /dev/null +++ b/web/app/components/datasets/documents/detail/completed/skeleton/general-list-skeleton.tsx @@ -0,0 +1,74 @@ +import React from 'react' +import { + SkeletonContanier, + SkeletonPoint, + SkeletonRectangle, + SkeletonRow, +} from '@/app/components/base/skeleton' +import Checkbox from '@/app/components/base/checkbox' +import Divider from '@/app/components/base/divider' + +const CardSkelton = React.memo(() => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +}) + +CardSkelton.displayName = 'CardSkelton' + +const GeneralListSkeleton = () => { + return ( +
+
+ {[...Array(10)].map((_, index) => { + return ( +
+ +
+ + {index !== 9 &&
+ +
} +
+
+ ) + })} +
+ ) +} + +export default React.memo(GeneralListSkeleton) diff --git a/web/app/components/datasets/documents/detail/completed/skeleton/paragraph-list-skeleton.tsx b/web/app/components/datasets/documents/detail/completed/skeleton/paragraph-list-skeleton.tsx new file mode 100644 index 0000000000..a1b1e86cc5 --- /dev/null +++ b/web/app/components/datasets/documents/detail/completed/skeleton/paragraph-list-skeleton.tsx @@ -0,0 +1,76 @@ +import React from 'react' +import { RiArrowRightSLine } from '@remixicon/react' +import { + SkeletonContanier, + SkeletonPoint, + SkeletonRectangle, + SkeletonRow, +} from '@/app/components/base/skeleton' +import Checkbox from '@/app/components/base/checkbox' +import Divider from '@/app/components/base/divider' + +const CardSkelton = React.memo(() => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +}) + +CardSkelton.displayName = 'CardSkelton' + +const ParagraphListSkeleton = () => { + return ( +
+
+ {[...Array(10)].map((_, index) => { + return ( +
+ +
+ + {index !== 9 &&
+ +
} +
+
+ ) + })} +
+ ) +} + +export default React.memo(ParagraphListSkeleton) diff --git a/web/app/components/datasets/documents/detail/completed/skeleton/parent-chunk-card-skeleton.tsx b/web/app/components/datasets/documents/detail/completed/skeleton/parent-chunk-card-skeleton.tsx new file mode 100644 index 0000000000..7440b59664 --- /dev/null +++ b/web/app/components/datasets/documents/detail/completed/skeleton/parent-chunk-card-skeleton.tsx @@ -0,0 +1,45 @@ +import React from 'react' +import { useTranslation } from 'react-i18next' +import { + SkeletonContanier, + SkeletonPoint, + SkeletonRectangle, + SkeletonRow, +} from '@/app/components/base/skeleton' + +const ParentChunkCardSkelton = () => { + const { t } = useTranslation() + return ( +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+
+ ) +} + +ParentChunkCardSkelton.displayName = 'ParentChunkCardSkelton' + +export default React.memo(ParentChunkCardSkelton) diff --git a/web/app/components/datasets/documents/detail/index.tsx b/web/app/components/datasets/documents/detail/index.tsx index f4e03de4ca..aa15f4a487 100644 --- a/web/app/components/datasets/documents/detail/index.tsx +++ b/web/app/components/datasets/documents/detail/index.tsx @@ -243,7 +243,10 @@ const DocumentDetail: FC = ({ datasetId, documentId }) => {
{isDetailLoading ? - :
+ :
{embedding ? :