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:
@@ -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}
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user