diff --git a/web/src/components/chunk-method-dialog/index.tsx b/web/src/components/chunk-method-dialog/index.tsx index d45b9416c..05c019539 100644 --- a/web/src/components/chunk-method-dialog/index.tsx +++ b/web/src/components/chunk-method-dialog/index.tsx @@ -43,8 +43,8 @@ import { import RaptorFormFields, { showRaptorParseConfiguration, } from '../parse-configuration/raptor-form-fields'; +import { ButtonLoading } from '../ui/button'; import { Input } from '../ui/input'; -import { LoadingButton } from '../ui/loading-button'; import { RAGFlowSelect } from '../ui/select'; import { DynamicPageRange } from './dynamic-page-range'; import { useFetchParserListOnMount, useShowAutoKeywords } from './hooks'; @@ -324,9 +324,9 @@ export function ChunkMethodDialog({ - + {t('common.save')} - + diff --git a/web/src/components/file-upload-dialog/index.tsx b/web/src/components/file-upload-dialog/index.tsx index 81c854c6b..a62a9e41b 100644 --- a/web/src/components/file-upload-dialog/index.tsx +++ b/web/src/components/file-upload-dialog/index.tsx @@ -1,4 +1,4 @@ -import { Button } from '@/components/ui/button'; +import { ButtonLoading } from '@/components/ui/button'; import { Dialog, DialogContent, @@ -38,7 +38,11 @@ export function UploaderTabs({ setFiles }: UploaderTabsProps) { ); } -export function FileUploadDialog({ hideModal, onOk }: IModalProps) { +export function FileUploadDialog({ + hideModal, + onOk, + loading, +}: IModalProps) { const { t } = useTranslation(); const [files, setFiles] = useState([]); @@ -54,14 +58,9 @@ export function FileUploadDialog({ hideModal, onOk }: IModalProps) { - + diff --git a/web/src/components/rename-dialog/index.tsx b/web/src/components/rename-dialog/index.tsx index 5c2a60516..999760d00 100644 --- a/web/src/components/rename-dialog/index.tsx +++ b/web/src/components/rename-dialog/index.tsx @@ -5,11 +5,11 @@ import { DialogHeader, DialogTitle, } from '@/components/ui/dialog'; -import { LoadingButton } from '@/components/ui/loading-button'; import { IModalProps } from '@/interfaces/common'; import { TagRenameId } from '@/pages/add-knowledge/constant'; import { ReactNode } from 'react'; import { useTranslation } from 'react-i18next'; +import { ButtonLoading } from '../ui/button'; import { RenameForm } from './rename-form'; export function RenameDialog({ @@ -33,9 +33,9 @@ export function RenameDialog({ onOk={onOk} > - + {t('common.save')} - + diff --git a/web/src/components/ui/button.tsx b/web/src/components/ui/button.tsx index 860da6170..b98e83f08 100644 --- a/web/src/components/ui/button.tsx +++ b/web/src/components/ui/button.tsx @@ -3,6 +3,7 @@ import { cva, type VariantProps } from 'class-variance-authority'; import * as React from 'react'; import { cn } from '@/lib/utils'; +import { Loader2 } from 'lucide-react'; const buttonVariants = cva( 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0', @@ -57,4 +58,38 @@ const Button = React.forwardRef( ); Button.displayName = 'Button'; +export const ButtonLoading = React.forwardRef< + HTMLButtonElement, + ButtonProps & { loading?: boolean } +>( + ( + { + className, + variant, + size, + asChild = false, + children, + loading = false, + disabled, + ...props + }, + ref, + ) => { + const Comp = asChild ? Slot : 'button'; + return ( + + {loading && } + {children} + + ); + }, +); + +ButtonLoading.displayName = 'ButtonLoading'; + export { Button, buttonVariants }; diff --git a/web/src/pages/dataset/dataset/set-meta-dialog.tsx b/web/src/pages/dataset/dataset/set-meta-dialog.tsx index 58bf69744..8636ddda6 100644 --- a/web/src/pages/dataset/dataset/set-meta-dialog.tsx +++ b/web/src/pages/dataset/dataset/set-meta-dialog.tsx @@ -5,7 +5,6 @@ import { DialogHeader, DialogTitle, } from '@/components/ui/dialog'; -import { LoadingButton } from '@/components/ui/loading-button'; import { IModalProps } from '@/interfaces/common'; import { TagRenameId } from '@/pages/add-knowledge/constant'; import { useTranslation } from 'react-i18next'; @@ -14,6 +13,7 @@ import { zodResolver } from '@hookform/resolvers/zod'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; +import { ButtonLoading } from '@/components/ui/button'; import { Form, FormControl, @@ -118,9 +118,9 @@ export function SetMetaDialog({ - + {t('common.save')} - + diff --git a/web/src/pages/files/link-to-dataset-dialog.tsx b/web/src/pages/files/link-to-dataset-dialog.tsx index 9394bc8b0..02f805215 100644 --- a/web/src/pages/files/link-to-dataset-dialog.tsx +++ b/web/src/pages/files/link-to-dataset-dialog.tsx @@ -1,3 +1,4 @@ +import { ButtonLoading } from '@/components/ui/button'; import { Dialog, DialogContent, @@ -13,7 +14,6 @@ import { FormLabel, FormMessage, } from '@/components/ui/form'; -import { LoadingButton } from '@/components/ui/loading-button'; import { MultiSelect } from '@/components/ui/multi-select'; import { useSelectKnowledgeOptions } from '@/hooks/knowledge-hooks'; import { IModalProps } from '@/interfaces/common'; @@ -113,16 +113,11 @@ export function LinkToDatasetDialog({ onConnectToKnowledgeOk={onConnectToKnowledgeOk} > - +
Save
-
+
diff --git a/web/src/pages/files/move-dialog.tsx b/web/src/pages/files/move-dialog.tsx index b3c39c426..e62cc9cd2 100644 --- a/web/src/pages/files/move-dialog.tsx +++ b/web/src/pages/files/move-dialog.tsx @@ -2,7 +2,7 @@ import { AsyncTreeSelect, TreeNodeType, } from '@/components/ui/async-tree-select'; -import { Button } from '@/components/ui/button'; +import { ButtonLoading } from '@/components/ui/button'; import { Dialog, DialogContent, @@ -17,7 +17,7 @@ import { isEmpty } from 'lodash'; import { useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; -export function MoveDialog({ hideModal, onOk }: IModalProps) { +export function MoveDialog({ hideModal, onOk, loading }: IModalProps) { const { t } = useTranslation(); const { fetchList } = useFetchPureFileList(); @@ -69,13 +69,14 @@ export function MoveDialog({ hideModal, onOk }: IModalProps) { > - +