- {ranks.map((rank, index) => (
-
handleDragStart(e, index)}
- onDragEnd={handleDragEnd}
- onDragOver={(e) => handleDragOver(e, index)}
- className={`flex items-center gap-3 px-4 py-3 hover:bg-muted/50 transition-colors cursor-move ${
- draggedItem === index ? 'opacity-50 bg-muted' : ''
- }`}
- >
- {/* 드래그 핸들 */}
-
+ {isLoading ? (
+
+
+ 로딩 중...
+
+ ) : (
+
+ {ranks.map((rank, index) => (
+
handleDragStart(e, index)}
+ onDragEnd={handleDragEnd}
+ onDragOver={(e) => handleDragOver(e, index)}
+ className={`flex items-center gap-3 px-4 py-3 hover:bg-muted/50 transition-colors cursor-move ${
+ draggedItem === index ? 'opacity-50 bg-muted' : ''
+ }`}
+ >
+ {/* 드래그 핸들 */}
+
- {/* 순서 번호 */}
-
- {index + 1}
-
+ {/* 순서 번호 */}
+
+ {index + 1}
+
- {/* 직급명 */}
-
{rank.name}
+ {/* 직급명 */}
+
{rank.name}
- {/* 액션 버튼 */}
-
-
-
+ {/* 액션 버튼 */}
+
+
+
+
-
- ))}
+ ))}
- {ranks.length === 0 && (
-
- 등록된 직급이 없습니다.
-
- )}
-
+ {ranks.length === 0 && (
+
+ 등록된 직급이 없습니다.
+
+ )}
+
+ )}
@@ -241,6 +325,7 @@ export function RankManagement() {
mode={dialogMode}
rank={selectedRank}
onSubmit={handleDialogSubmit}
+ isLoading={isSubmitting}
/>
{/* 삭제 확인 다이얼로그 */}
@@ -249,7 +334,7 @@ export function RankManagement() {
직급 삭제
- "{rankToDelete?.name}" 직급을 삭제하시겠습니까?
+ "{rankToDelete?.name}" 직급을 삭제하시겠습니까?
이 직급을 사용 중인 사원이 있으면 해당 사원의 직급이 초기화됩니다.
@@ -257,11 +342,15 @@ export function RankManagement() {
- 취소
+ 취소
+ {isSubmitting ? (
+
+ ) : null}
삭제
@@ -269,4 +358,4 @@ export function RankManagement() {
);
-}
\ No newline at end of file
+}
diff --git a/src/components/settings/RankManagement/types.ts b/src/components/settings/RankManagement/types.ts
index d5fff92a..d59a5261 100644
--- a/src/components/settings/RankManagement/types.ts
+++ b/src/components/settings/RankManagement/types.ts
@@ -5,6 +5,7 @@ export interface Rank {
id: number;
name: string;
order: number;
+ isActive?: boolean;
createdAt?: string;
updatedAt?: string;
}
@@ -15,4 +16,5 @@ export interface RankDialogProps {
mode: 'add' | 'edit';
rank?: Rank;
onSubmit: (name: string) => void;
+ isLoading?: boolean;
}
\ No newline at end of file
diff --git a/src/components/settings/TitleManagement/TitleDialog.tsx b/src/components/settings/TitleManagement/TitleDialog.tsx
index 8aaf118c..7329156f 100644
--- a/src/components/settings/TitleManagement/TitleDialog.tsx
+++ b/src/components/settings/TitleManagement/TitleDialog.tsx
@@ -11,6 +11,7 @@ import {
import { Input } from '@/components/ui/input';
import { Button } from '@/components/ui/button';
import { Label } from '@/components/ui/label';
+import { Loader2 } from 'lucide-react';
import type { TitleDialogProps } from './types';
/**
@@ -21,7 +22,8 @@ export function TitleDialog({
onOpenChange,
mode,
title,
- onSubmit
+ onSubmit,
+ isLoading = false,
}: TitleDialogProps) {
const [name, setName] = useState('');
@@ -65,15 +67,19 @@ export function TitleDialog({
onChange={(e) => setName(e.target.value)}
placeholder="직책명을 입력하세요"
autoFocus
+ disabled={isLoading}
/>