Files
sam-react-prod/src/components/hr/AttendanceManagement/ReasonInfoDialog.tsx
유병철 5344bfc426 fix(WEB): 폼 컴포넌트 DatePicker 적용 및 코드 정리
- ExpectedExpenseManagement DatePicker 적용 및 간소화
- BoardForm 날짜 필드 개선
- AttendanceInfoDialog, ReasonInfoDialog 코드 정리
- ReceivingDetail 기능 보강
- ShipmentCreate/Edit DatePicker 적용
- VehicleDispatchEdit 수정
- WorkOrderCreate 개선

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 16:46:41 +09:00

140 lines
4.0 KiB
TypeScript

'use client';
import { useState, useEffect } from 'react';
import {
Dialog,
DialogContent,
DialogFooter,
DialogHeader,
DialogTitle,
} from '@/components/ui/dialog';
import { Button } from '@/components/ui/button';
import { Label } from '@/components/ui/label';
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/components/ui/select';
import { DatePicker } from '@/components/ui/date-picker';
import { format } from 'date-fns';
import type {
ReasonInfoDialogProps,
ReasonFormData,
ReasonType,
} from './types';
import { REASON_TYPE_LABELS } from './types';
const initialFormData: ReasonFormData = {
employeeId: '',
baseDate: format(new Date(), 'yyyy-MM-dd'),
reasonType: '',
};
export function ReasonInfoDialog({
open,
onOpenChange,
employees,
onSubmit,
}: ReasonInfoDialogProps) {
const [formData, setFormData] = useState<ReasonFormData>(initialFormData);
// 데이터 초기화
useEffect(() => {
if (open) {
setFormData(initialFormData);
}
}, [open]);
// 입력 변경 핸들러
const handleChange = (field: keyof ReasonFormData, value: string) => {
setFormData(prev => ({ ...prev, [field]: value }));
};
// 등록 (문서 작성 화면으로 이동)
const handleSubmit = () => {
onSubmit(formData);
onOpenChange(false);
};
return (
<Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent className="max-w-md">
<DialogHeader>
<DialogTitle> </DialogTitle>
</DialogHeader>
<div className="space-y-4 py-4">
{/* 대상 선택 */}
<div className="flex items-center justify-between">
<Label className="text-sm font-medium min-w-[80px]"></Label>
<Select
value={formData.employeeId}
onValueChange={(value) => handleChange('employeeId', value)}
>
<SelectTrigger className="w-[200px]">
<SelectValue placeholder="선택" />
</SelectTrigger>
<SelectContent>
{employees.map((employee) => (
<SelectItem key={employee.id} value={employee.id}>
{[employee.department, employee.position, employee.rank, employee.name].filter(Boolean).join(' / ')}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
{/* 기준일 */}
<div className="flex items-center justify-between">
<Label className="text-sm font-medium min-w-[80px]"></Label>
<DatePicker
value={formData.baseDate}
onChange={(date) => handleChange('baseDate', date)}
className="w-[200px]"
align="end"
/>
</div>
{/* 유형 선택 */}
<div className="flex items-center justify-between">
<Label className="text-sm font-medium min-w-[80px]"></Label>
<Select
value={formData.reasonType}
onValueChange={(value) => handleChange('reasonType', value)}
>
<SelectTrigger className="w-[200px]">
<SelectValue placeholder="선택" />
</SelectTrigger>
<SelectContent>
{Object.entries(REASON_TYPE_LABELS).map(([value, label]) => (
<SelectItem key={value} value={value}>
{label}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
</div>
<DialogFooter className="gap-2">
<Button
variant="outline"
onClick={() => onOpenChange(false)}
className="bg-gray-900 text-white hover:bg-gray-800"
>
</Button>
<Button
onClick={handleSubmit}
className="bg-gray-900 text-white hover:bg-gray-800"
>
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
);
}