조사사업 등록의 사업차수 입력과 행정구역 배치 보완
This commit is contained in:
@@ -37,6 +37,8 @@ interface CtpvSggPrcsFcltSelectBoxProps {
|
||||
setSwtrmtFcltNm?: (name: string) => void;
|
||||
defaultSwtrmtFcltNm?: string;
|
||||
setIsLoading?: (isLoading: boolean) => void;
|
||||
/** 좁은 조회·입력 행에서 시도·시군구 선택 폭과 간격을 줄여 표시한다. */
|
||||
compact?: boolean;
|
||||
}
|
||||
|
||||
const defaultOption: ApiSelectOption = { val: '0', text: '전체' };
|
||||
@@ -59,6 +61,7 @@ export function CtpvSggPrcsFcltSelectBox({
|
||||
setSwtrmtFcltNm,
|
||||
defaultSwtrmtFcltNm,
|
||||
setIsLoading,
|
||||
compact = false,
|
||||
}: CtpvSggPrcsFcltSelectBoxProps) {
|
||||
|
||||
const [prcsFcltOptions, setPrcsFcltOptions] = useState<ApiSelectOption[]>([]);
|
||||
@@ -131,11 +134,11 @@ export function CtpvSggPrcsFcltSelectBox({
|
||||
]);
|
||||
|
||||
return (
|
||||
<div className={`flex items-center justify-center ${className} mr-8`}>
|
||||
<Label className="text-xl text-gray-600 font-medium whitespace-nowrap mr-2">시도</Label>
|
||||
<div className={`flex items-center justify-center ${className} ${compact ? "mr-0" : "mr-8"}`}>
|
||||
<Label className={`${compact ? "mr-1.5 text-base" : "mr-2 text-xl"} whitespace-nowrap font-medium text-gray-600`}>시도</Label>
|
||||
<SelectBox
|
||||
className="w-48 mr-8"
|
||||
selectClass="rounded-lg bg-white"
|
||||
className={compact ? "mr-4 w-[180px]" : "mr-8 w-48"}
|
||||
selectClass={`${compact ? "w-[180px]" : ""} rounded-lg bg-white`}
|
||||
label=""
|
||||
selectArray={[defaultOption, ...ctpv]}
|
||||
value={sido}
|
||||
@@ -146,10 +149,10 @@ export function CtpvSggPrcsFcltSelectBox({
|
||||
}}
|
||||
selectContentClass="z-[101]"
|
||||
/>
|
||||
<Label className="text-xl text-gray-600 font-medium whitespace-nowrap mr-2">시군구</Label>
|
||||
<Label className={`${compact ? "mr-1.5 text-base" : "mr-2 text-xl"} whitespace-nowrap font-medium text-gray-600`}>시군구</Label>
|
||||
<SelectBox
|
||||
className="w-48"
|
||||
selectClass="w-48 rounded-lg bg-white truncate"
|
||||
className={compact ? "w-36" : "w-48"}
|
||||
selectClass={`${compact ? "w-36" : "w-48"} truncate rounded-lg bg-white`}
|
||||
label=""
|
||||
selectArray={[defaultOption, ...sgg.filter(opt => opt.val.startsWith(sidoPrefix))]}
|
||||
value={sigungu}
|
||||
|
||||
+16
-2
@@ -65,7 +65,8 @@
|
||||
| 사업등록 | 필수값·연도·음수·처리분구 미선택 | 저장 전 항목별 오류 표시 |
|
||||
| 처리분구 | 행정구역 선택/변경 | 같은 지역 `useYn=Y` 후보 조회, 이전 선택 초기화 |
|
||||
| 양식 | 저장 전/후 `양식 받기` | 저장 전 안내, 저장 후 생성과 다운로드를 한 번에 수행 |
|
||||
| 사업등록 입력 | 사업등록 popup 확인 | 첫 줄에 사업년도·시도·시군구·정밀조사연장이 표시되고 연장 라벨은 한 줄 유지 |
|
||||
| 사업등록 입력 | 사업등록 popup 확인 | 첫 줄에 사업차수·사업년도·시도·시군구·정밀조사연장, 둘째 줄에 사업명 표시 |
|
||||
| 사업차수 | 빈 값·0·소수·양의 정수 입력 후 저장 | 1 이상의 정수만 허용하고 입력값을 `bizCycl`로 전달 |
|
||||
| 처리분구 목록 | 처리분구 후보가 많은 사업등록 popup | 3열 7행 21개까지 표시하고 22개부터 목록 내부 세로 스크롤 |
|
||||
| 정밀조사연장 | 입력칸 확인·숫자 입력 | 증감 스피너 없음, 숫자·소수점만 입력, 최대 10자 폭 |
|
||||
| 결과등록 요약 | 결과등록 popup 진입 | 사업차수·사업년도·행정구역·사업명 순서로 적정 간격을 두고 한 줄 표시 |
|
||||
@@ -133,7 +134,7 @@
|
||||
| 상세 스크롤 | 처리분구 10행을 위아래로 스크롤 | 헤더 고정, 다음 행 일부 노출 없음, 경계선 유지 |
|
||||
| 페이지 높이 | 상세 표시 전후·Footer 높이 변화·화면 이탈 확인 | 문서 전체 세로 스크롤 없음, 내부 스크롤 사용, 이탈 시 overflow 복원 |
|
||||
| 공통 회귀 | 다른 BaseLayout 화면 진입 | 공통 Header·Footer와 레이아웃 동작 변화 없음 |
|
||||
| 팝업 회귀 | 사업등록·결과등록 WindowPopup 재진입 | 확정된 팝업 크기·배치·버튼·처리분구·파일행 디자인 유지 |
|
||||
| 팝업 회귀 | 사업등록·결과등록 WindowPopup 재진입 | 사업등록 `1000×620`, 결과등록 기존 크기·버튼·처리분구·파일행 디자인 유지 |
|
||||
|
||||
- 상세보기·다운로드 실제 동작, 지도 이동, 실 API 성공 응답은 이번 화면 회귀의 완료 범위에 포함하지 않는다.
|
||||
|
||||
@@ -199,3 +200,16 @@
|
||||
|
||||
- 실제 다운로드 파일은 Excel에서 열어 헤더, 병합 범위, 소계·합계와 한글 파일명을 대조한다.
|
||||
- 실제 API 연결 후에는 샘플과 동일한 조건으로 JSONB 코드·점수·단위구간 매핑을 재검증한다.
|
||||
|
||||
## 15. 사업등록 사업차수·행정구역 배치 보완 검증 계획
|
||||
|
||||
| 검증 항목 | 방법 | 기대 결과 |
|
||||
| --- | --- | --- |
|
||||
| 입력 순서 | 사업등록 팝업 첫째·둘째 줄 확인 | 첫 줄 5개 조건과 둘째 줄 사업명이 확정 순서로 표시 |
|
||||
| 사업차수 기본값 | 일반·`sample=Y` 각각 진입 | 일반 1, 샘플 3 표시 |
|
||||
| 사업차수 검증 | 빈 값·0·소수·양의 정수 저장 | 1 이상의 정수만 저장 가능 |
|
||||
| 행정구역 명칭 | 강원특별자치도·대구광역시·긴 시군구 선택 | 선택값이 말줄임·잘림 없이 확인 가능 |
|
||||
| 간격 | 첫 줄 전체 항목 비교 | 항목 묶음 사이 20px 고정 간격, 과도한 균등 분산 없음 |
|
||||
| 공통 회귀 | `compact` 미지정 기존 화면 확인 | 기존 시도·시군구 폭과 간격 유지 |
|
||||
| 팝업 크기 | 새 창 외곽·본문 확인 | `1000×620`, 세로 구성과 처리분구 영역 유지 |
|
||||
| 정적 검사 | 프론트 저장소 `git diff --check` | 공백 오류 없음 |
|
||||
|
||||
+12
-1
@@ -158,7 +158,7 @@
|
||||
- 공통 `UiTable`의 `noOuterMargin`과 선택 행 상태는 소스에 남아 있으나 조사사업 목록·상세현황 최종 표는 병합·클릭·스크롤 제어를 위해 직접 구성한 테이블임을 확인했다.
|
||||
- `components.css`의 의미 있는 diff가 제거됐고 조사 그리드 gutter는 두 화면 컴포넌트에만 인라인으로 적용된다.
|
||||
- 완료 화면 캡처와 대조해 `tailwind.config.ts`의 `./src/**/*` 누락이 결과등록 grid와 사업등록 임의 폭 클래스 미생성 원인임을 확인했다. 스캔 경로를 복구하고 핵심 grid·폭을 인라인 스타일로 이중 고정했다.
|
||||
- 사업등록은 `920×620`, 처리분구 `21rem`, 사업명 최대 `480px`; 결과등록은 `980×340`, 사업요약 4열과 파일행 `180px / 가변 / 80px / 112px` 계약으로 복구했다.
|
||||
- 사업등록은 당시 `920×620`, 처리분구 `21rem`, 사업명 최대 `480px`; 결과등록은 `980×340`, 사업요약 4열과 파일행 `180px / 가변 / 80px / 112px` 계약으로 복구했다. 사업등록의 현재 가로 폭은 16절의 사업차수 입력 보완으로 `1000px`다.
|
||||
- 사용자의 로그인된 실제 화면 최종 확인으로 행 전체 선택, 관로·맨홀 전환, 목록·상세 배치와 상세 집계 표시를 완료 판정했다.
|
||||
- 남은 검증은 실 API/백엔드 연동과 후속 상세보기·다운로드 구현이다. 지도보기는 보류다.
|
||||
|
||||
@@ -224,3 +224,14 @@
|
||||
- 로컬 TypeScript compiler는 기존 샌드박스 `EPERM` 이력에 따라 별도 실행하지 않았다.
|
||||
- 실제 서버 JSONB 데이터 연결과 코드·점수·단위구간 매핑 검증은 백엔드 연동 단계의 후속 항목이다.
|
||||
- 지도보기는 보류 범위로 이번 검증 대상에 포함하지 않았다.
|
||||
|
||||
## 16. 2026-07-27 사업등록 사업차수·행정구역 배치 보완 검증 결과
|
||||
|
||||
- 사업차수 입력 상태가 추가되고 기존 고정 `bizCycl: 1` 대신 입력값을 저장 요청에 전달하는 소스를 확인했다.
|
||||
- 검증 함수가 사업차수를 1 이상의 정수로 제한하도록 변경된 것을 확인했다.
|
||||
- 첫 줄을 `사업차수 → 사업년도 → 시도 → 시군구 → 정밀조사연장`, 둘째 줄을 `사업명`으로 구성했다.
|
||||
- 과도한 `justify-between` 배치를 제거하고 항목 묶음 사이를 20px 고정 간격으로 조정했다.
|
||||
- 시도 180px, 시군구 144px와 사업등록 WindowPopup `1000×620` 설정을 확인했다.
|
||||
- 공통 행정구역 컴포넌트의 `compact` 기본값이 `false`여서 기존 호출 화면에는 새 폭이 자동 적용되지 않는다.
|
||||
- 변경 파일을 포함한 프론트 저장소 `git diff --check`를 통과했다.
|
||||
- 로그인되지 않은 브라우저에서는 사업등록 경로가 로그인 화면으로 이동해 최종 팝업 시각 확인을 수행하지 못했다. 사용자 화면 확인을 최종 완료 조건으로 유지한다.
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
- 사업년도는 단일 연도 선택, 시도·시군구는 I/I 공통 지역 선택으로 동작하며 양평에 고정되지 않는지 확인한다.
|
||||
- 사업명 입력 폭과 목록 열 순서·단위가 사용자 확정안과 일치하는지 확인한다.
|
||||
- 사업등록 WindowPopup의 행정구역 연동 처리분구 체크 선택·가나다순과 저장 전 검증을 확인한다.
|
||||
- 사업등록 WindowPopup은 콘텐츠 창 `920×620` 안에서 5개 입력만 순서대로 표시하고, 별도 닫기·양식 생성 버튼 없이 저장·양식 받기·조사보고서 양식을 제공하는지 확인한다.
|
||||
- 사업등록 WindowPopup은 콘텐츠 창 `1000×620` 안에서 첫 줄에 `사업차수·사업년도·시도·시군구·정밀조사연장`, 둘째 줄에 `사업명`을 표시하고, 별도 닫기·양식 생성 버튼 없이 저장·양식 받기·조사보고서 양식을 제공하는지 확인한다.
|
||||
- 결과등록 WindowPopup의 파일 5종, 행별 찾기·데이터 검토, 검토 정상 전 저장 비활성을 확인한다.
|
||||
- `/oper/exmn/register?sample=Y`에서만 샘플 사업과 팝업 샘플 상태가 보이고 일반 URL은 실제 API 계약을 유지하는지 확인한다.
|
||||
- 상단에 설계되지 않은 `PPL 집계·상세` 직접 버튼이 표시되지 않는지 확인한다.
|
||||
@@ -224,3 +224,17 @@
|
||||
- 공통 비즈니스 컴포넌트, API, DTO, DB는 변경하지 않는다.
|
||||
- 프론트 완료 게이트는 전체 상세보기 회귀, 본단위구간 전체/검색 조회, 구조·운영 결함별 간소화 화면과 현재 화면 기준 엑셀 생성이다.
|
||||
- 실제 API·JSONB 매핑과 다운로드 파일의 업무 데이터 대조는 백엔드 연동 단계에서 수행한다.
|
||||
|
||||
## 18. 2026-07-27 사업등록 입력 계약·배치 보완
|
||||
|
||||
| 구분 | 확정 내용 |
|
||||
| --- | --- |
|
||||
| 입력 순서 | 첫 줄 `사업차수 → 사업년도 → 시도 → 시군구 → 정밀조사연장`, 둘째 줄 `사업명` |
|
||||
| 사업차수 | 사용자 입력, 1 이상의 정수 검증, 일반 기본값 1·샘플 기본값 3 |
|
||||
| 행정구역 | 기존 `CtpvSggPrcsFcltSelectBox`에 기본값 `false`인 `compact` 옵션 추가 |
|
||||
| 입력 폭 | 시도 180px, 시군구 144px, 정밀조사연장 96px |
|
||||
| 입력 간격 | 첫 줄 입력 묶음 사이 20px, 묶음 내부 라벨·입력 사이 8px |
|
||||
| 팝업 크기 | `1000×620` |
|
||||
|
||||
- `compact`를 지정하지 않은 기존 시도·시군구 사용 화면은 기존 폭과 간격을 유지한다.
|
||||
- 이번 변경은 기존 `bizCycl` 요청 필드를 실제 사용자 입력값으로 전환한 프론트 보완이며 API 필드명과 DB 컬럼은 변경하지 않는다.
|
||||
|
||||
+29
-3
@@ -178,7 +178,7 @@
|
||||
- 사업등록 popup definition을 `1180×820`에서 `920×620`으로 축소하고 불필요한 하단 여백을 줄였다.
|
||||
- 상단 `닫기`, `양식 생성`을 제거했다. `양식 받기`는 사업 저장 후 양식 생성과 다운로드를 한 번에 수행한다.
|
||||
- `양식 받기`, `조사보고서 양식`은 기존 엑셀 다운로드 버튼의 전역 `green` 스타일과 흰색 글자를 사용한다.
|
||||
- 화면 입력은 5개만 노출하고 첫 줄에 `사업년도·시도·시군구·정밀조사연장`, 둘째 줄에 `사업명`을 배치한다. API 필수 계약인 사업차수와 총사업비는 신규 기본값 `1`, `0`으로 전달한다.
|
||||
- 당시 화면 입력은 5개만 노출하고 사업차수와 총사업비를 신규 기본값 `1`, `0`으로 전달했다. 사업차수 입력과 최종 배치는 14절의 2026-07-27 보완안으로 대체한다.
|
||||
- Radix Select의 서버·클라이언트 ID 불일치를 막기 위해 사업등록·결과등록 WindowPopup content를 client mount 이후 렌더링한다.
|
||||
- 개발 환경의 목록 헤더에 `샘플 데이터 보기`를 제공한다. 이 버튼은 URL에 `sample=Y`를 명시해 기존 격리 원칙을 유지하며, 사업목록과 처리분구 샘플을 함께 활성화한다.
|
||||
- 사용자 재확인에 따라 팝업의 `샘플 화면` 배지를 제거하고 처리분구 목록을 고정 높이 `21rem`으로 확장했다. 3열 7행으로 21개까지 한 번에 표시하고 초과 후보는 목록 내부 세로 스크롤로 확인한다.
|
||||
@@ -265,7 +265,7 @@
|
||||
- 목록과 상세의 `scrollbar-gutter: stable`은 각 스크롤 컨테이너의 인라인 스타일로 옮겨 조사관리 그리드에만 적용한다.
|
||||
- 회귀의 직접 원인은 `tailwind.config.ts`에서 `./src/**/*` 스캔 경로가 빠져 `src/features`의 `grid-cols-[...]`, `max-w-[480px]` 등 임의값 클래스가 생성되지 않은 것이다.
|
||||
- `./src/**/*`를 다시 추가하고, 결과등록의 사업요약·파일행 열은 인라인 `gridTemplateColumns`, 사업등록의 사업명 폭은 인라인 `maxWidth`로도 고정해 스캔 누락 시 레이아웃이 무너지지 않게 했다.
|
||||
- 사업등록 popup은 확정 크기 `920×620`, 처리분구 영역 `21rem`으로 복구했다. 결과등록은 `980×340`을 유지한다.
|
||||
- 사업등록 popup은 당시 확정 크기 `920×620`, 처리분구 영역 `21rem`으로 복구했다. 이후 사업차수 입력과 긴 행정구역명 표시를 위해 14절에서 가로 폭만 `1000px`로 보완했다. 결과등록은 `980×340`을 유지한다.
|
||||
- 따라서 조사사업 목록·상세의 폭 정렬은 유지하면서 WindowPopup의 기존 확정 디자인에는 전역 CSS 변경이 전파되지 않는다.
|
||||
|
||||
### 9.15 조사사업 목록 사업보고서 직접 다운로드
|
||||
@@ -285,7 +285,7 @@
|
||||
- `app/components/lib/utils/fileUploadUtil.tsx`: Tus 업로드 실패를 화면 Promise reject로 전달하는 `handleError` 콜백을 추가했다.
|
||||
- `src/app/styles/components.css`: 조사사업 전용 `sn-exmn-grid-scroll`을 제거해 Git 기준 전역 스타일 내용으로 복구했다. `git status`에 줄바꿈/작업트리 표시는 남을 수 있으나 의미 있는 CSS diff는 없다.
|
||||
- `src/features/exmn/index.ts`: 사업 API·검증·타입·등록/현황 화면 공개 export를 추가했다.
|
||||
- `src/features/windowPopup/model/popupDefinitions.ts`: 사업등록 `920×620`, 결과등록 `980×340` popup 정의를 추가했다.
|
||||
- `src/features/windowPopup/model/popupDefinitions.ts`: 사업등록은 현재 `1000×620`, 결과등록은 `980×340` popup 정의를 사용한다.
|
||||
- `src/features/windowPopup/model/types.ts`: 사업 생성·결과 확정 opener 메시지 타입을 추가했다.
|
||||
- `src/features/windowPopup/registry.tsx`: 조사사업 popup content 2종을 registry에 등록했다.
|
||||
- `tailwind.config.ts`: `./src/**/*`를 content에 포함해 조사사업 popup의 grid·임의 폭 클래스 생성을 복구했다.
|
||||
@@ -388,3 +388,29 @@
|
||||
- `src/features/exmn/ui/ExmnPplUnitDetailTable.tsx`
|
||||
- 백엔드 코드·API·DTO·DB와 공통 비즈니스 컴포넌트는 변경하지 않았다.
|
||||
- 후속 실제 연동에서는 기존 `PPL_UNIT_V1`, `MNHL_COUNT_V1` JSONB 값을 현재 화면 모델과 코드 기준으로 매핑한다.
|
||||
|
||||
## 14. 2026-07-27 사업등록 사업차수 입력·행정구역 배치 보완
|
||||
|
||||
### 14.1 입력과 저장 계약
|
||||
|
||||
- 기존 고정값 `bizCycl: 1`을 제거하고 사업차수 입력 상태를 추가했다.
|
||||
- 일반 등록은 1차, `sample=Y`는 대표 사업과 맞는 3차를 기본값으로 표시한다.
|
||||
- 사업차수는 숫자 최대 3자리만 입력할 수 있고 저장 시 1 이상의 정수인지 검증한다.
|
||||
- 저장 요청은 입력한 사업차수를 기존 `ExmnBusinessSaveRequest.bizCycl`에 전달한다.
|
||||
- 총사업비는 화면 입력 대상이 아니므로 기존처럼 `tpco: 0`을 전달한다.
|
||||
|
||||
### 14.2 최종 화면 배치
|
||||
|
||||
- 첫 줄은 `사업차수 → 사업년도 → 시도 → 시군구 → 정밀조사연장`, 둘째 줄은 `사업명` 순서다.
|
||||
- 첫 줄의 항목 묶음은 왼쪽부터 20px 고정 간격으로 배치해 남는 폭이 항목 사이로 과도하게 분산되지 않게 했다.
|
||||
- 시도는 180px, 시군구는 144px로 표시해 `강원특별자치도` 같은 긴 명칭을 확인할 수 있게 했다.
|
||||
- 기존 행정구역 공통 컴포넌트에는 `compact` 옵션을 추가하되 기본값을 `false`로 두어 다른 화면의 크기와 간격은 변경하지 않는다.
|
||||
- 사업등록 WindowPopup 가로 폭은 한 줄 배치를 위해 `920px`에서 `1000px`로 넓혔고 높이는 `620px`를 유지한다.
|
||||
|
||||
### 14.3 변경 파일과 영향
|
||||
|
||||
- `app/components/ui/ctpvSggPrcsFcltSelectBox.tsx`
|
||||
- `src/features/exmn/lib/exmn-business-validation.ts`
|
||||
- `src/features/exmn/ui/ExmnBusinessRegisterPopupPage.tsx`
|
||||
- `src/features/windowPopup/model/popupDefinitions.ts`
|
||||
- 백엔드 API 경로·필드명·DB 구조는 변경하지 않는다.
|
||||
|
||||
@@ -19,7 +19,7 @@ export const EXMN_FILE_RULES: Record<ExmnFileType, { label: string; extensions:
|
||||
export const validateExmnBusiness = (request: ExmnBusinessSaveRequest): string | null => {
|
||||
if (!/^\d{4}$/.test(request.bizYr)) return "사업연도는 4자리 숫자로 입력해주세요.";
|
||||
if (!request.bizNm.trim()) return "사업명을 입력해주세요.";
|
||||
if (!Number.isInteger(request.bizCycl) || request.bizCycl < 0) return "사업차수는 0 이상의 정수로 입력해주세요.";
|
||||
if (!Number.isInteger(request.bizCycl) || request.bizCycl < 1) return "사업차수는 1 이상의 정수로 입력해주세요.";
|
||||
if (!request.ctpvNm || !request.sggNm) return "시도와 시군구를 선택해주세요.";
|
||||
if (!Number.isFinite(request.prcisExmnPrlg) || request.prcisExmnPrlg < 0) return "정밀조사연장은 0 이상이어야 합니다.";
|
||||
if (!Number.isFinite(request.tpco) || request.tpco < 0) return "총사업비는 0 이상이어야 합니다.";
|
||||
|
||||
@@ -49,6 +49,8 @@ const saveBlob = (blob: Blob, fileName: string) => {
|
||||
/** 공통 WindowPopup 안에서 사업정보·대상 처리분구·조사양식을 등록하는 화면이다. */
|
||||
export function ExmnBusinessRegisterPopupPage({ sampleMode }: ExmnBusinessRegisterPopupPageProps) {
|
||||
const { ctpv, sgg, fetchCtpv, fetchSgg } = useStore();
|
||||
/** 사업 확장 시 등록자가 직접 지정할 수 있도록 저장 요청에 전달하는 사업차수다. */
|
||||
const [bizCycl, setBizCycl] = useState(sampleMode ? "3" : "1");
|
||||
const [bizYr, setBizYr] = useState(String(new Date().getFullYear()));
|
||||
const [bizNm, setBizNm] = useState(sampleMode ? "2026년 양평군 노후 하수관로 정밀조사사업" : "");
|
||||
const [ctpvCd, setCtpvCd] = useState("0");
|
||||
@@ -158,11 +160,11 @@ export function ExmnBusinessRegisterPopupPage({ sampleMode }: ExmnBusinessRegist
|
||||
const buildRequest = (): ExmnBusinessSaveRequest => ({
|
||||
bizYr: bizYr.trim(),
|
||||
bizNm: bizNm.trim(),
|
||||
// 사업차수와 총사업비는 현재 등록 화면 입력 대상이 아니므로 신규 기본값으로 전달한다.
|
||||
bizCycl: 1,
|
||||
bizCycl: Number(bizCycl),
|
||||
ctpvNm,
|
||||
sggNm,
|
||||
prcisExmnPrlg: Number(prcisExmnPrlg),
|
||||
// 총사업비는 현재 등록 화면 입력 대상이 아니므로 신규 기본값으로 전달한다.
|
||||
tpco: 0,
|
||||
trtdstIds: selectedDistrictIds,
|
||||
});
|
||||
@@ -279,18 +281,35 @@ export function ExmnBusinessRegisterPopupPage({ sampleMode }: ExmnBusinessRegist
|
||||
<section className="border border-border">
|
||||
<div className="border-b border-border bg-[#eaf3fb] px-4 py-3 font-semibold text-title">사업정보 입력</div>
|
||||
<div className="space-y-4 p-4">
|
||||
<div className="flex flex-wrap items-center gap-y-4">
|
||||
<div className="flex flex-nowrap items-center gap-5">
|
||||
<div className="flex items-center gap-2">
|
||||
<Label className="shrink-0 whitespace-nowrap text-base">
|
||||
<span className="text-red-500">* </span>사업차수
|
||||
</Label>
|
||||
<Input
|
||||
style={{ width: "3.5rem", flex: "none" }}
|
||||
type="text"
|
||||
inputMode="numeric"
|
||||
maxLength={3}
|
||||
value={bizCycl}
|
||||
disabled={Boolean(savedBusiness)}
|
||||
onChange={(event) => {
|
||||
if (/^\d{0,3}$/.test(event.target.value)) setBizCycl(event.target.value);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<SelectBox
|
||||
label="사업년도"
|
||||
labelClass="w-20 shrink-0 text-base"
|
||||
className="mr-7 flex items-center gap-3"
|
||||
selectClass="w-36 bg-white"
|
||||
labelClass="shrink-0 whitespace-nowrap text-base"
|
||||
className="flex items-center gap-2"
|
||||
selectClass="w-[6.5rem] bg-white"
|
||||
selectArray={getStartYearArray({ placeholder: "선택" })}
|
||||
value={bizYr}
|
||||
readOnly={Boolean(savedBusiness)}
|
||||
onSelectValue={(value) => setBizYr(String(value))}
|
||||
/>
|
||||
<CtpvSggPrcsFcltSelectBox
|
||||
compact
|
||||
className="!mr-0 !justify-start"
|
||||
sido={ctpvCd}
|
||||
sigungu={sggCd}
|
||||
@@ -310,10 +329,10 @@ export function ExmnBusinessRegisterPopupPage({ sampleMode }: ExmnBusinessRegist
|
||||
if (!savedBusiness) setSggNm(nextSggNm === "전체" ? "" : nextSggNm);
|
||||
}}
|
||||
/>
|
||||
<div className="ml-auto flex items-center gap-3" style={{ width: "280px" }}>
|
||||
<Label className="shrink-0 text-base" style={{ whiteSpace: "nowrap" }}><span className="text-red-500">* </span>정밀조사 연장</Label>
|
||||
<div className="flex items-center gap-2">
|
||||
<Label className="shrink-0 whitespace-nowrap text-base"><span className="text-red-500">* </span>정밀조사 연장</Label>
|
||||
<Input
|
||||
style={{ width: "9rem", flex: "none" }}
|
||||
style={{ width: "6rem", flex: "none" }}
|
||||
type="text"
|
||||
inputMode="decimal"
|
||||
maxLength={10}
|
||||
|
||||
@@ -4,7 +4,7 @@ export const windowPopupDefinitions = {
|
||||
exmnBusinessRegister: {
|
||||
key: "exmnBusinessRegister",
|
||||
title: "사업정보 등록",
|
||||
width: 920,
|
||||
width: 1000,
|
||||
height: 620,
|
||||
},
|
||||
exmnResultRegister: {
|
||||
|
||||
Reference in New Issue
Block a user