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

@@ -227,31 +227,41 @@ export function ReceivingDetail({ id, mode = 'view' }: Props) {
}));
};
// 저장 핸들러
const handleSave = async () => {
// 저장 핸들러 - IntegratedDetailTemplate의 onSubmit에서 호출
// 반환값으로 성공/실패를 전달하여 템플릿이 toast/navigation 처리
const handleSave = async (): Promise<{ success: boolean; error?: string }> => {
// 클라이언트 사이드 필수 필드 검증
const errors: string[] = [];
if (!formData.itemCode) errors.push('품목코드');
if (!formData.supplier) errors.push('발주처');
if (!formData.receivingQty) errors.push('입고수량');
if (!formData.receivingDate) errors.push('입고일');
if (errors.length > 0) {
return { success: false, error: `필수 항목을 입력해주세요: ${errors.join(', ')}` };
}
setIsSaving(true);
try {
if (isNewMode) {
const result = await createReceiving(formData);
if (result.success) {
toast.success('입고가 등록되었습니다.');
router.push('/ko/material/receiving-management');
} else {
toast.error(result.error || '등록에 실패했습니다.');
if (!result.success) {
return { success: false, error: result.error || '등록에 실패했습니다.' };
}
return { success: true };
} else if (isEditMode) {
const result = await updateReceiving(id, formData);
if (result.success) {
toast.success('입고 정보가 수정되었습니다.');
router.push(`/ko/material/receiving-management/${id}?mode=view`);
} else {
toast.error(result.error || '수정에 실패했습니다.');
if (!result.success) {
return { success: false, error: result.error || '수정에 실패했습니다.' };
}
return { success: true };
}
return { success: false, error: '알 수 없는 모드입니다.' };
} catch (err) {
if (isNextRedirectError(err)) throw err;
console.error('[ReceivingDetail] handleSave error:', err);
toast.error('저장 중 오류가 발생했습니다.');
const errorMessage = err instanceof Error ? err.message : '저장 중 오류가 발생했습니다.';
return { success: false, error: errorMessage };
} finally {
setIsSaving(false);
}
@@ -754,8 +764,7 @@ export function ReceivingDetail({ id, mode = 'view' }: Props) {
renderView={() => renderViewContent()}
renderForm={() => renderFormContent()}
onSubmit={async () => {
await handleSave();
return { success: true };
return await handleSave();
}}
onCancel={handleCancel}
/>