Files
frontend/apps/sn/app/(with-base-layout)/selectionValidation.tsx
T
swcho 5b62171b01 feat:
- 파일 확장자 검증 컴포넌트 구현 및 적용
- 환경청, 시도, 시군구, 하수처리장 입력 검증 컴포넌트 구현 및 적용
- RDII 분석 페이지 하수처리장 선택 로직 에러 수정
2025-07-04 17:26:10 +09:00

161 lines
4.1 KiB
TypeScript

/**
* 선택 항목 검증 유틸리티
*/
export interface ApiSelectOption {
text: string;
val: string;
}
// 선택 항목 검증 설정 타입
export interface SelectionValidationConfig {
value: string | number | ApiSelectOption;
description: string;
required: boolean;
}
// 선택 항목 검증 결과 타입
export interface SelectionValidationResult {
isValid: boolean;
errorMessage?: string;
}
/**
* 단일 선택 항목이 유효한지 검증하는 함수
* @param value 검증할 값
* @param isRequired 필수 선택 여부
* @returns 유효한지 여부
*/
export const isValidSelection = (
value: string | number | ApiSelectOption,
isRequired: boolean = true
): boolean => {
if (!isRequired) return true;
if (typeof value === 'object' && value !== null) {
// ApiSelectOption 객체인 경우
return value.val !== '0' && value.val !== '' && value.val !== null && value.val !== undefined;
}
// 문자열 또는 숫자인 경우
return value !== '0' && value !== 0 && value !== '' && value !== null && value !== undefined;
};
/**
* 여러 선택 항목을 한 번에 검증하는 함수
* @param validationConfigs 검증할 선택 항목들의 설정 배열
* @returns 검증 결과. 실패 시 첫 번째 에러 메시지 반환
*/
export const validateMultipleSelections = (
validationConfigs: SelectionValidationConfig[]
): SelectionValidationResult => {
for (const config of validationConfigs) {
if (!isValidSelection(config.value, config.required)) {
return {
isValid: false,
errorMessage: `${config.description}을(를) 선택해주세요.`
};
}
}
return { isValid: true };
};
/**
* 여러 선택 항목을 한 번에 검증하고 alert 표시하는 함수
* @param validationConfigs 검증할 선택 항목들의 설정 배열
* @returns 검증 결과
*/
export const validateMultipleSelectionsWithAlert = (
validationConfigs: SelectionValidationConfig[]
): boolean => {
const result = validateMultipleSelections(validationConfigs);
if (!result.isValid && result.errorMessage) {
alert(result.errorMessage);
return false;
}
return true;
};
/**
* 기본 선택 항목들 검증 (환경청, 시도, 시군구, 하수처리장)
* @param select1 환경청코드
* @param select2 시도코드
* @param select3 시군구 객체
* @param select4 하수처리장코드
* @param options 각 항목의 필수 여부 설정
* @returns 검증 결과
*/
export const validateBasicSelections = (
select1: string,
select2: string,
select3: ApiSelectOption,
select4: string | number,
options: {
requireEnv?: boolean;
requireSido?: boolean;
requireSigungu?: boolean;
requireTreatmentPlant?: boolean;
} = {}
): SelectionValidationResult => {
const {
requireEnv = true,
requireSido = true,
requireSigungu = true,
requireTreatmentPlant = true
} = options;
const validationConfigs: SelectionValidationConfig[] = [
{
value: select1,
description: '환경청',
required: requireEnv
},
{
value: select2,
description: '시도',
required: requireSido
},
{
value: select3,
description: '시군구',
required: requireSigungu
},
{
value: select4,
description: '하수처리장',
required: requireTreatmentPlant
}
];
return validateMultipleSelections(validationConfigs);
};
/**
* 기본 선택 항목들 검증 및 alert 표시
* @param select1 환경청코드
* @param select2 시도코드
* @param select3 시군구 객체
* @param select4 하수처리장코드
* @param options 각 항목의 필수 여부 설정
* @returns 검증 결과
*/
export const validateBasicSelectionsWithAlert = (
select1: string,
select2: string,
select3: ApiSelectOption,
select4: string | number,
options: {
requireEnv?: boolean;
requireSido?: boolean;
requireSigungu?: boolean;
requireTreatmentPlant?: boolean;
} = {}
): boolean => {
const result = validateBasicSelections(select1, select2, select3, select4, options);
if (!result.isValid && result.errorMessage) {
alert(result.errorMessage);
return false;
}
return true;
};