fix: 프로젝트 전체 TypeScript 타입에러 408개 수정 (tsc --noEmit 0 errors)

- 공통 템플릿 타입 수정 (IntegratedDetailTemplate, UniversalListPage)
- 페이지(app/[locale]) 타입 호환성 수정 (80개)
- 재고/자재 모듈 타입 수정 (StockStatus, ReceivingManagement)
- 생산 모듈 타입 수정 (WorkOrders, WorkerScreen, WorkResults)
- 주문/출고 모듈 타입 수정 (ShipmentManagement, Orders)
- 견적/단가 모듈 타입 수정 (Quotes, Pricing)
- 건설 모듈 타입 수정 (49개, 17개 하위 모듈)
- HR 모듈 타입 수정 (CardManagement, VacationManagement 등)
- 설정 모듈 타입 수정 (PermissionManagement, AccountManagement 등)
- 게시판 모듈 타입 수정 (BoardManagement, BoardList 등)
- 회계 모듈 타입 수정 (VendorManagement, BadDebtCollection 등)
- 기타 모듈 타입 수정 (CEODashboard, clients, vehicle 등)
- 유틸/훅/API 타입 수정 (hooks, contexts, lib)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
유병철
2026-01-30 10:07:58 +09:00
parent 8a5cbde5ef
commit a1f4c82cec
154 changed files with 832 additions and 536 deletions

View File

@@ -16,6 +16,7 @@ export type FieldType =
| 'number'
| 'select'
| 'date'
| 'datetime-local'
| 'textarea'
| 'password'
| 'email'
@@ -91,6 +92,8 @@ export interface FieldDefinition {
helpText?: string;
/** 부가 정보 (Badge 등) */
suffix?: ReactNode | ((value: unknown) => ReactNode);
/** 기본값 (create 모드에서 사용) */
defaultValue?: unknown;
}
// ===== 섹션 정의 =====
@@ -113,6 +116,10 @@ export interface SectionDefinition {
export interface ActionConfig {
/** 저장 버튼 텍스트 */
submitLabel?: string;
/** 저장 버튼 텍스트 (submitLabel의 별칭) */
saveLabel?: string;
/** 등록 버튼 텍스트 */
createLabel?: string;
/** 취소 버튼 텍스트 */
cancelLabel?: string;
/** 저장 버튼 표시 */
@@ -162,7 +169,7 @@ export interface DetailConfig<T = Record<string, unknown>> {
/** 섹션 정의 (필드 그룹핑) */
sections?: SectionDefinition[];
/** 그리드 컬럼 수 (기본값: 2) */
gridColumns?: 1 | 2 | 3;
gridColumns?: 1 | 2 | 3 | 4;
/** 액션 설정 */
actions?: ActionConfig;
/** 권한 설정 */
@@ -171,6 +178,8 @@ export interface DetailConfig<T = Record<string, unknown>> {
transformInitialData?: (data: any) => Record<string, unknown>;
/** 제출 데이터 변환 (formData → API 요청) */
transformSubmitData?: (formData: Record<string, unknown>) => any;
/** View 모드 값 포맷터 (key별로 커스텀 표시) */
formatViewValue?: (key: string, value: unknown, data: Record<string, unknown>) => string | ReactNode | undefined;
}
// ===== 컴포넌트 Props =====
@@ -186,9 +195,9 @@ export interface IntegratedDetailTemplateProps<T = Record<string, unknown>> {
/** 로딩 상태 */
isLoading?: boolean;
/** 저장 핸들러 */
onSubmit?: (data: Record<string, unknown>) => Promise<{ success: boolean; error?: string }>;
onSubmit?: (data: Record<string, unknown>) => Promise<{ success: boolean; error?: string } | void>;
/** 삭제 핸들러 */
onDelete?: (id: string | number) => Promise<{ success: boolean; error?: string }>;
onDelete?: (id: string | number) => Promise<{ success: boolean; error?: string } | void>;
/** 취소 핸들러 (기본: 목록으로 이동) */
onCancel?: () => void;
/** 모드 변경 핸들러 (view → edit) */
@@ -225,6 +234,12 @@ export interface IntegratedDetailTemplateProps<T = Record<string, unknown>> {
buttonPosition?: 'top' | 'bottom';
/** 버튼 하단 고정 (sticky) - buttonPosition이 'bottom'일 때만 적용 */
stickyButtons?: boolean;
/** 뒤로가기 핸들러 */
onBack?: () => void;
/** 저장 핸들러 (onSubmit 대안) */
onSave?: (data: Record<string, unknown>) => Promise<{ success: boolean; error?: string } | void>;
/** 외부 제출 중 상태 */
isSubmitting?: boolean;
}
// ===== API 응답 타입 =====

View File

@@ -122,10 +122,12 @@ export interface SelectionHandlers {
}
// ===== 행 클릭 핸들러 =====
// Note: In renderTableRow/renderMobileCard, these handlers are pre-bound closures
// (item already captured by UniversalListPage), so the item parameter is optional.
export interface RowClickHandlers<T> {
onRowClick?: (item: T) => void;
onEdit?: (item: T) => void;
onDelete?: (item: T) => void;
onRowClick?: (item?: T) => void;
onEdit?: (item?: T) => void;
onDelete?: (item?: T) => void;
}
// ===== 엑셀 다운로드 설정 =====
@@ -470,6 +472,23 @@ export interface UniversalListPageProps<T> {
* - IntegratedListTemplateV2로 전달되어 스켈레톤 표시에 사용
*/
externalIsLoading?: boolean;
/**
* 외부 검색 상태 관리
* - 설정 시 내부 검색 상태 대신 외부에서 관리
*/
externalSearch?: {
searchValue: string;
setSearchValue: (value: string) => void;
};
/**
* 외부 필터 상태 관리
* - 설정 시 내부 필터 상태 대신 외부에서 관리
*/
externalFilter?: {
filterValues: Record<string, string | string[]>;
onFilterChange: (key: string, value: string | string[]) => void;
onFilterReset: () => void;
};
}
// ===== 내부 상태 타입 =====