From 8538256edfc310956bc24281c19db656eb19bec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Mon, 23 Feb 2026 17:01:24 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20[card]=20CardForm=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=EA=B0=92=EC=97=90=20=EB=88=84=EB=9D=BD=EB=90=9C=20CardFormData?= =?UTF-8?q?=20=ED=95=84=EC=88=98=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/hr/CardManagement/CardForm.tsx | 254 ++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100755 src/components/hr/CardManagement/CardForm.tsx diff --git a/src/components/hr/CardManagement/CardForm.tsx b/src/components/hr/CardManagement/CardForm.tsx new file mode 100755 index 00000000..c65f8860 --- /dev/null +++ b/src/components/hr/CardManagement/CardForm.tsx @@ -0,0 +1,254 @@ +'use client'; + +import { useState, useEffect } from 'react'; +import { useRouter } from 'next/navigation'; +import { PageLayout } from '@/components/organisms/PageLayout'; +import { PageHeader } from '@/components/organisms/PageHeader'; +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select'; +import { CreditCard, ArrowLeft, Save } from 'lucide-react'; +import type { Card as CardType, CardFormData, CardCompany, CardStatus } from './types'; +import { CARD_COMPANIES, CARD_STATUS_LABELS } from './types'; +import { getActiveEmployees } from './actions'; + +interface CardFormProps { + mode: 'create' | 'edit'; + card?: CardType; + onSubmit: (data: CardFormData) => void; +} + +export function CardForm({ mode, card, onSubmit }: CardFormProps) { + const router = useRouter(); + const [formData, setFormData] = useState({ + cardCompany: '', + cardType: '', + cardNumber: '', + cardName: '', + alias: '', + expiryDate: '', + csv: '', + paymentDay: '', + pinPrefix: '', + totalLimit: 0, + usedAmount: 0, + remainingLimit: 0, + status: 'active', + userId: '', + memo: '', + }); + + // 직원 목록 상태 + const [employees, setEmployees] = useState>([]); + const [isLoadingEmployees, setIsLoadingEmployees] = useState(true); + + // 직원 목록 로드 + useEffect(() => { + const loadEmployees = async () => { + setIsLoadingEmployees(true); + const result = await getActiveEmployees(); + if (result.success && result.data) { + setEmployees(result.data); + } + setIsLoadingEmployees(false); + }; + loadEmployees(); + }, []); + + // 수정 모드일 때 기존 데이터 로드 + useEffect(() => { + if (mode === 'edit' && card) { + setFormData({ + cardCompany: card.cardCompany, + cardNumber: card.cardNumber, + cardName: card.cardName, + expiryDate: card.expiryDate, + pinPrefix: card.pinPrefix, + status: card.status, + userId: card.user?.id || '', + }); + } + }, [mode, card]); + + const handleBack = () => { + if (mode === 'edit' && card) { + router.push(`/ko/hr/card-management/${card.id}`); + } else { + router.push('/ko/hr/card-management'); + } + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + onSubmit(formData); + }; + + // 카드번호 포맷팅 (1234-1234-1234-1234) + const handleCardNumberChange = (value: string) => { + const digits = value.replace(/\D/g, '').slice(0, 16); + const parts = digits.match(/.{1,4}/g) || []; + const formatted = parts.join('-'); + setFormData(prev => ({ ...prev, cardNumber: formatted })); + }; + + // 유효기간 포맷팅 (MMYY) + const handleExpiryDateChange = (value: string) => { + const digits = value.replace(/\D/g, '').slice(0, 4); + setFormData(prev => ({ ...prev, expiryDate: digits })); + }; + + // 비밀번호 앞 2자리 + const handlePinPrefixChange = (value: string) => { + const digits = value.replace(/\D/g, '').slice(0, 2); + setFormData(prev => ({ ...prev, pinPrefix: digits })); + }; + + return ( + + + +
+ {/* 기본 정보 */} + + + 기본 정보 + + +
+
+ + +
+ +
+ + handleCardNumberChange(e.target.value)} + placeholder="1234-1234-1234-1234" + maxLength={19} + /> +
+ +
+ + handleExpiryDateChange(e.target.value)} + placeholder="MMYY" + maxLength={4} + /> +
+ +
+ + handlePinPrefixChange(e.target.value)} + placeholder="**" + maxLength={2} + /> +
+ +
+ + setFormData(prev => ({ ...prev, cardName: e.target.value }))} + placeholder="카드명을 입력해주세요" + /> +
+ +
+ + +
+
+
+
+ + {/* 사용자 정보 */} + + + 사용자 정보 + + +
+ + +
+
+
+ + {/* 버튼 영역 */} +
+ + +
+
+
+ ); +} \ No newline at end of file