fix(WEB): 폼 컴포넌트 DatePicker 적용 및 코드 정리

- ExpectedExpenseManagement DatePicker 적용 및 간소화
- BoardForm 날짜 필드 개선
- AttendanceInfoDialog, ReasonInfoDialog 코드 정리
- ReceivingDetail 기능 보강
- ShipmentCreate/Edit DatePicker 적용
- VehicleDispatchEdit 수정
- WorkOrderCreate 개선

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
유병철
2026-02-06 16:46:41 +09:00
parent 666eb6bcc6
commit 5344bfc426
9 changed files with 104 additions and 207 deletions

View File

@@ -17,16 +17,8 @@ import {
SelectTrigger,
SelectValue,
} from '@/components/ui/select';
import { Calendar } from '@/components/ui/calendar';
import {
Popover,
PopoverContent,
PopoverTrigger,
} from '@/components/ui/popover';
import { CalendarIcon } from 'lucide-react';
import { DatePicker } from '@/components/ui/date-picker';
import { format } from 'date-fns';
import { ko } from 'date-fns/locale';
import { cn } from '@/lib/utils';
import type {
AttendanceInfoDialogProps,
AttendanceFormData,
@@ -59,7 +51,6 @@ export function AttendanceInfoDialog({
onSave,
}: AttendanceInfoDialogProps) {
const [formData, setFormData] = useState<AttendanceFormData>(initialFormData);
const [selectedDate, setSelectedDate] = useState<Date | undefined>(new Date());
// 모드별 타이틀
const title = mode === 'create' ? '근태 정보' : '근태 정보';
@@ -82,10 +73,8 @@ export function AttendanceInfoDialog({
weekendOvertimeHours: '0',
weekendOvertimeMinutes: '0',
});
setSelectedDate(new Date(attendance.baseDate));
} else if (open && mode === 'create') {
setFormData(initialFormData);
setSelectedDate(new Date());
}
}, [open, attendance, mode]);
@@ -94,14 +83,6 @@ export function AttendanceInfoDialog({
setFormData(prev => ({ ...prev, [field]: value }));
};
// 날짜 변경 핸들러
const handleDateChange = (date: Date | undefined) => {
setSelectedDate(date);
if (date) {
setFormData(prev => ({ ...prev, baseDate: format(date, 'yyyy-MM-dd') }));
}
};
// 저장
const handleSubmit = () => {
onSave(formData);
@@ -142,29 +123,12 @@ export function AttendanceInfoDialog({
{/* 기준일 */}
<div className="flex items-center justify-between">
<Label className="text-sm font-medium min-w-[80px]"></Label>
<Popover>
<PopoverTrigger asChild>
<Button
variant="outline"
className={cn(
'w-[200px] justify-start text-left font-normal',
!selectedDate && 'text-muted-foreground'
)}
>
<CalendarIcon className="mr-2 h-4 w-4" />
{selectedDate ? format(selectedDate, 'yyyy-MM-dd') : '날짜 선택'}
</Button>
</PopoverTrigger>
<PopoverContent className="w-auto p-0" align="end">
<Calendar
mode="single"
selected={selectedDate}
onSelect={handleDateChange}
locale={ko}
initialFocus
/>
</PopoverContent>
</Popover>
<DatePicker
value={formData.baseDate}
onChange={(date) => handleChange('baseDate', date)}
className="w-[200px]"
align="end"
/>
</div>
{/* 출근 시간 */}

View File

@@ -17,16 +17,8 @@ import {
SelectTrigger,
SelectValue,
} from '@/components/ui/select';
import { Calendar } from '@/components/ui/calendar';
import {
Popover,
PopoverContent,
PopoverTrigger,
} from '@/components/ui/popover';
import { CalendarIcon } from 'lucide-react';
import { DatePicker } from '@/components/ui/date-picker';
import { format } from 'date-fns';
import { ko } from 'date-fns/locale';
import { cn } from '@/lib/utils';
import type {
ReasonInfoDialogProps,
ReasonFormData,
@@ -47,13 +39,11 @@ export function ReasonInfoDialog({
onSubmit,
}: ReasonInfoDialogProps) {
const [formData, setFormData] = useState<ReasonFormData>(initialFormData);
const [selectedDate, setSelectedDate] = useState<Date | undefined>(new Date());
// 데이터 초기화
useEffect(() => {
if (open) {
setFormData(initialFormData);
setSelectedDate(new Date());
}
}, [open]);
@@ -62,14 +52,6 @@ export function ReasonInfoDialog({
setFormData(prev => ({ ...prev, [field]: value }));
};
// 날짜 변경 핸들러
const handleDateChange = (date: Date | undefined) => {
setSelectedDate(date);
if (date) {
setFormData(prev => ({ ...prev, baseDate: format(date, 'yyyy-MM-dd') }));
}
};
// 등록 (문서 작성 화면으로 이동)
const handleSubmit = () => {
onSubmit(formData);
@@ -107,29 +89,12 @@ export function ReasonInfoDialog({
{/* 기준일 */}
<div className="flex items-center justify-between">
<Label className="text-sm font-medium min-w-[80px]"></Label>
<Popover>
<PopoverTrigger asChild>
<Button
variant="outline"
className={cn(
'w-[200px] justify-start text-left font-normal',
!selectedDate && 'text-muted-foreground'
)}
>
<CalendarIcon className="mr-2 h-4 w-4" />
{selectedDate ? format(selectedDate, 'yyyy-MM-dd') : '날짜 선택'}
</Button>
</PopoverTrigger>
<PopoverContent className="w-auto p-0" align="end">
<Calendar
mode="single"
selected={selectedDate}
onSelect={handleDateChange}
locale={ko}
initialFocus
/>
</PopoverContent>
</Popover>
<DatePicker
value={formData.baseDate}
onChange={(date) => handleChange('baseDate', date)}
className="w-[200px]"
align="end"
/>
</div>
{/* 유형 선택 */}