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) {
>
-
+