Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d76bdea702 | ||
|
|
45c8d021cc | ||
|
|
0336226562 | ||
|
|
e9fb1e3a88 | ||
|
|
a4412001b3 | ||
|
|
2c901bd32d |
@@ -1,3 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* 📄 Proxy Route
|
||||||
|
* API 프록시 라우트
|
||||||
|
*
|
||||||
|
* - 서버 API로의 요청 프록시 처리
|
||||||
|
* - 쿠키 기반 인증 토큰 및 리프레시 토큰 관리
|
||||||
|
* - POST 및 PUT 요청 핸들링
|
||||||
|
* - 사용자 인증 정보 검증 및 응답 처리
|
||||||
|
* - 에러 핸들링 및 상태 코드 반환
|
||||||
|
* - 사이트 ID 및 헤더 설정
|
||||||
|
*/
|
||||||
import {
|
import {
|
||||||
ACCESS_TOKEN,
|
ACCESS_TOKEN,
|
||||||
AUTH_USER_ID,
|
AUTH_USER_ID,
|
||||||
@@ -113,12 +124,8 @@ export async function PUT(
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getCookieDomain(): string | undefined {
|
function getCookieDomain(): string | undefined {
|
||||||
if (typeof window === "undefined") return undefined;
|
// 개발에서는 현재 사이트 전용, 운영에서는 환경변수의 공용 도메인을 사용한다.
|
||||||
|
return process.env.NODE_ENV === "production"
|
||||||
if (COOKIE_DOMAIN) return COOKIE_DOMAIN;
|
? COOKIE_DOMAIN || undefined
|
||||||
|
: undefined;
|
||||||
const { hostname } = window.location;
|
|
||||||
if (hostname === "localhost" || hostname === "127.0.0.1") return undefined;
|
|
||||||
|
|
||||||
return hostname;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import type { ExmnMapFilters, ExmnMapJobType } from "./exmn-map-types";
|
import type { ExmnMapFilters, ExmnMapJobType } from "./exmn-map-types";
|
||||||
|
import { EXMN_RESULT_PPL_LEGEND_COLOR } from "./exmn-map-types";
|
||||||
import LayerSettingCard from "../layer-setting/layer-setting-card";
|
import LayerSettingCard from "../layer-setting/layer-setting-card";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
@@ -52,7 +53,8 @@ export default function ExmnLayerSettingPanel({
|
|||||||
<label className="flex min-h-[24px] flex-col items-stretch gap-1">
|
<label className="flex min-h-[24px] flex-col items-stretch gap-1">
|
||||||
<span className={`flex items-center gap-1 ${labelClass}`}>
|
<span className={`flex items-center gap-1 ${labelClass}`}>
|
||||||
<span
|
<span
|
||||||
className={`h-2 w-2 rounded-full ${jobType === "PPL" ? "bg-[#facc15]" : "bg-[#8b5cf6]"}`}
|
className="h-2 w-2 rounded-full"
|
||||||
|
style={{ backgroundColor: jobType === "PPL" ? EXMN_RESULT_PPL_LEGEND_COLOR : "#8b5cf6" }}
|
||||||
/>
|
/>
|
||||||
사업차수
|
사업차수
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ export const EXMN_RESULT_ROOT_LAYER_TYPE = "sn_exmn_result_group";
|
|||||||
export const EXMN_RESULT_PPL_LAYER_TYPE = "sn_exmn_result_ppl";
|
export const EXMN_RESULT_PPL_LAYER_TYPE = "sn_exmn_result_ppl";
|
||||||
export const EXMN_RESULT_MNHL_LAYER_TYPE = "sn_exmn_result_mnhl";
|
export const EXMN_RESULT_MNHL_LAYER_TYPE = "sn_exmn_result_mnhl";
|
||||||
// 레이어 트리에서 조사 관로와 기존 맨홀 분류 심볼을 즉시 구분하기 위한 전용 범례 스타일이다.
|
// 레이어 트리에서 조사 관로와 기존 맨홀 분류 심볼을 즉시 구분하기 위한 전용 범례 스타일이다.
|
||||||
export const EXMN_RESULT_PPL_LEGEND_COLOR = "#facc15";
|
export const EXMN_RESULT_PPL_LEGEND_COLOR = "#000080";
|
||||||
export const EXMN_RESULT_MNHL_LEGEND_ICON = "SN_EXMN_MANHOLE_PURPLE.png?v=3";
|
export const EXMN_RESULT_MNHL_LEGEND_ICON = "SN_EXMN_MANHOLE_PURPLE.png?v=3";
|
||||||
|
|
||||||
export type ExmnMapJobType = "PPL" | "MNHL";
|
export type ExmnMapJobType = "PPL" | "MNHL";
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import Icon from "ol/style/Icon.js";
|
|||||||
import Stroke from "ol/style/Stroke.js";
|
import Stroke from "ol/style/Stroke.js";
|
||||||
import Style from "ol/style/Style.js";
|
import Style from "ol/style/Style.js";
|
||||||
import Text from "ol/style/Text.js";
|
import Text from "ol/style/Text.js";
|
||||||
|
import { EXMN_RESULT_PPL_LEGEND_COLOR } from "../components/exmn/exmn-map-types";
|
||||||
import {
|
import {
|
||||||
EXMN_GRADE_COLORS,
|
EXMN_GRADE_COLORS,
|
||||||
EXMN_RESULT_MANHOLE_ICON_SRC,
|
EXMN_RESULT_MANHOLE_ICON_SRC,
|
||||||
@@ -14,10 +15,11 @@ export const getExmnGradeColor = (feature: any) => {
|
|||||||
return EXMN_GRADE_COLORS[grade] ?? "#2563eb";
|
return EXMN_GRADE_COLORS[grade] ?? "#2563eb";
|
||||||
};
|
};
|
||||||
|
|
||||||
export const createExmnPipeStyle = (feature: any) =>
|
// 조사 관로는 상태등급과 관계없이 범례와 같은 짙은 남색으로 표시한다.
|
||||||
|
export const createExmnPipeStyle = () =>
|
||||||
new Style({
|
new Style({
|
||||||
stroke: new Stroke({
|
stroke: new Stroke({
|
||||||
color: getExmnGradeColor(feature),
|
color: EXMN_RESULT_PPL_LEGEND_COLOR,
|
||||||
width: 4,
|
width: 4,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -122,12 +122,8 @@ export async function PUT(
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getCookieDomain(): string | undefined {
|
function getCookieDomain(): string | undefined {
|
||||||
if (typeof window === "undefined") return undefined;
|
// 개발에서는 현재 사이트 전용, 운영에서는 환경변수의 공용 도메인을 사용한다.
|
||||||
|
return process.env.NODE_ENV === "production"
|
||||||
if (COOKIE_DOMAIN) return COOKIE_DOMAIN;
|
? COOKIE_DOMAIN || undefined
|
||||||
|
: undefined;
|
||||||
const { hostname } = window.location;
|
|
||||||
if (hostname === "localhost" || hostname === "127.0.0.1") return undefined;
|
|
||||||
|
|
||||||
return hostname;
|
|
||||||
}
|
}
|
||||||
+2
-34
@@ -4,47 +4,15 @@
|
|||||||
* 📄 Home Page
|
* 📄 Home Page
|
||||||
* 홈 페이지 컴포넌트
|
* 홈 페이지 컴포넌트
|
||||||
*
|
*
|
||||||
* - 쿠키 기반 인증 토큰 검증 및 자동 로그인 처리
|
* - 루트 진입 시 지도 페이지(/map)로 리다이렉트
|
||||||
* - 로그인 성공 시 지도 페이지로 리다이렉트
|
* - 인증 토큰 검증 및 로그인 화면 이동은 /map 및 공통 인증 흐름에서 처리
|
||||||
* - 개발 환경에서는 루트 진입 시 자동 로그인 후 지도 페이지 이동
|
|
||||||
* - 로그인 실패 시 에러 로깅 및 처리
|
|
||||||
* - 사용자 세션 관리 및 초기 라우팅 제어
|
* - 사용자 세션 관리 및 초기 라우팅 제어
|
||||||
* - Next.js useRouter를 통한 클라이언트 사이드 라우팅
|
|
||||||
*
|
|
||||||
* 🔗 사용 API
|
|
||||||
* - 로그인: POST /api/v1/auth/login (user-service)
|
|
||||||
*/
|
*/
|
||||||
"use client";
|
"use client";
|
||||||
import { authService } from "@/entities/auth";
|
|
||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
|
|
||||||
const DEV_HOSTNAMES = new Set(["localhost", "127.0.0.1", "con.mind-one.co.kr"]);
|
|
||||||
|
|
||||||
const DEV_LOGIN_PAYLOAD = {
|
|
||||||
userId: process.env.NEXT_PUBLIC_DEV_LOGIN_USER_ID || "CLEANWATER",
|
|
||||||
password: process.env.NEXT_PUBLIC_DEV_LOGIN_PASSWORD || "gktneh12!@",
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const hostname = window.location.hostname;
|
|
||||||
const isDevHost = DEV_HOSTNAMES.has(hostname);
|
|
||||||
|
|
||||||
if (!isDevHost) {
|
|
||||||
window.location.replace("/map");
|
window.location.replace("/map");
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function doLogin() {
|
|
||||||
try {
|
|
||||||
// 개발 환경에서는 남아 있는 만료/부분 쿠키로 인한 /map <-> / 루프를 막기 위해 항상 토큰을 재발급한다.
|
|
||||||
await authService.login(DEV_LOGIN_PAYLOAD);
|
|
||||||
window.location.replace("/map");
|
|
||||||
} catch (err) {
|
|
||||||
console.error("로그인 실패", err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void doLogin();
|
|
||||||
}, []);
|
}, []);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -719,3 +719,19 @@
|
|||||||
- 실브라우저: 테스트 사업→초이처리분구→지도3개 표시→실제188001 클릭→사업명 테스트/GIS 맨홀번호188001 확인→조사보고서 보기→1쪽 PDF와188001 표시 성공. 사용자도 최종 정상동작 확인했다.
|
- 실브라우저: 테스트 사업→초이처리분구→지도3개 표시→실제188001 클릭→사업명 테스트/GIS 맨홀번호188001 확인→조사보고서 보기→1쪽 PDF와188001 표시 성공. 사용자도 최종 정상동작 확인했다.
|
||||||
- 실행 서버: 기존 재시작 승인 범위에서 코드 반영 후8883 PID27788로 유지한다(이전PID24204 종료). classpath/실행로그는 기존 .codex-tmp/manhole-backend-* 경로 유지. 종료명령 Stop-Process -Id 27788.
|
- 실행 서버: 기존 재시작 승인 범위에서 코드 반영 후8883 PID27788로 유지한다(이전PID24204 종료). classpath/실행로그는 기존 .codex-tmp/manhole-backend-* 경로 유지. 종료명령 Stop-Process -Id 27788.
|
||||||
- 롤백: 위 FE3개 소스와 ExmnManholeReportService의 이번 변경을 함께 복원한다. DB 롤백 없음. 잔여 리스크는 GIS 미연결 자료 열람 불가 및 대형 사업의 지도 매칭·PDF 판독 비용이며, 임의 위치/다른 사업 fallback을 하지 않는다.
|
- 롤백: 위 FE3개 소스와 ExmnManholeReportService의 이번 변경을 함께 복원한다. DB 롤백 없음. 잔여 리스크는 GIS 미연결 자료 열람 불가 및 대형 사업의 지도 매칭·PDF 판독 비용이며, 임의 위치/다른 사업 fallback을 하지 않는다.
|
||||||
|
|
||||||
|
|
||||||
|
## 2026-10-28 관로조사 남색 표시
|
||||||
|
- 정적 확인: 관로 선·범례·설정 표식은 `EXMN_RESULT_PPL_LEGEND_COLOR(#000080)`을 공유하고 관로 선 두께는 4를 유지한다. 맨홀·선택 이벤트·API·DB 변경 없음.
|
||||||
|
- `git -C frontend diff --check`: 통과.
|
||||||
|
- 3002 리스너 부재로 HMR·실브라우저 검증은 미수행. 실제 지도에서 관로조사 켜기, 등급 필터 변경 후 남색 유지, 선택 강조·맨홀 동시 표시 구분을 후속 확인한다.
|
||||||
|
|
||||||
|
### 2026-10-28 개발 서버 기동 후 확인
|
||||||
|
- 사용자 요청으로 `pnpm --filter sn dev` 실행, Next.js Ready 및 localhost:3002 접속 확인. 서버는 유지한다.
|
||||||
|
- Chrome에서 /map 진입 시 /auth/login으로 이동하고 로그인 화면이 표시됨. 로컬 로그인 세션이 없어 실제 지도 선·범례 가시성 검증은 로그인 후 계속해야 한다. 인증 우회·환경설정 변경 없음.
|
||||||
|
|
||||||
|
### 2026-10-28 백엔드 복구 및 실지도 검증 완료
|
||||||
|
- 원인: 프론트만 실행되어 localhost:8883 지도 API가 ECONNREFUSED로 실패했다. 기존 local 설정으로 Config Server와 sewerage-service를 기동했다. 코드·환경 파일·DB 변경 없음.
|
||||||
|
- 지도 레이어 API HTTP 200. 실제 레이어 목록·조사사업 조회 정상.
|
||||||
|
- 테스트 사업 → 관로조사 → 초이처리분구 → 지도보기: 3개 표시, 줌18.0에서 짙은 남색 관로가 일반지도 배경과 주황색 기존 관로에서 선명하게 구분됨. 이전 실지도 미검증 상태 해소. 위성지도·모든 등급·선택 강조 조합은 미검증.
|
||||||
|
- 사용자 계속 실행 지시에 따라 FE3002 PID28176, BE8883 PID31232, Config8888 PID27092 유지. 종료 시 해당 PID가 같은 프로세스인지 재확인 후 Stop-Process -Id 명령으로 종료한다.
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
| 파일 | 역할 | 선언/주석 보조 근거 | 행 | 직접 참조 | 상태 |
|
| 파일 | 역할 | 선언/주석 보조 근거 | 행 | 직접 참조 | 상태 |
|
||||||
|---|---|---|---:|---:|---|
|
|---|---|---|---:|---:|---|
|
||||||
| [layout.tsx](<D:/workspace/IIPBS-FRONTEND/frontend/apps/sn/app/layout.tsx>) | Next 루트 HTML·테마·메타데이터·Provider 진입점 | metadata, RootLayout / ➡️ 경로 : 모든 페이지 | 44 | 0 | 등록/도구 진입 규칙 대상 |
|
| [layout.tsx](<D:/workspace/IIPBS-FRONTEND/frontend/apps/sn/app/layout.tsx>) | Next 루트 HTML·테마·메타데이터·Provider 진입점 | metadata, RootLayout / ➡️ 경로 : 모든 페이지 | 44 | 0 | 등록/도구 진입 규칙 대상 |
|
||||||
| [page.tsx](<D:/workspace/IIPBS-FRONTEND/frontend/apps/sn/app/page.tsx>) | 루트 진입/개발 자동로그인·지도 이동 | DEV_HOSTNAMES, DEV_LOGIN_PAYLOAD, Home / 홈 페이지 컴포넌트 | 51 | 0 | 등록/도구 진입 규칙 대상 |
|
| [page.tsx](<D:/workspace/IIPBS-FRONTEND/frontend/apps/sn/app/page.tsx>) | 루트 진입/지도 이동 | Home / 홈 페이지 컴포넌트 | 18 | 0 | 등록/도구 진입 규칙 대상 |
|
||||||
| [providers.tsx](<D:/workspace/IIPBS-FRONTEND/frontend/apps/sn/app/providers.tsx>) | 실제 src/app/providers의 AppProvider 재수출. 현재 layout에서 사용 | | 2 | 1 | 정적 참조 있음 |
|
| [providers.tsx](<D:/workspace/IIPBS-FRONTEND/frontend/apps/sn/app/providers.tsx>) | 실제 src/app/providers의 AppProvider 재수출. 현재 layout에서 사용 | | 2 | 1 | 정적 참조 있음 |
|
||||||
|
|
||||||
## app/(auth)/auth
|
## app/(auth)/auth
|
||||||
|
|||||||
@@ -1045,3 +1045,12 @@
|
|||||||
- 실브라우저: 테스트 사업→초이처리분구→지도3개 표시→실제188001 클릭→사업명 테스트/GIS 맨홀번호188001 확인→조사보고서 보기→1쪽 PDF와188001 표시 성공. 사용자도 최종 정상동작 확인했다.
|
- 실브라우저: 테스트 사업→초이처리분구→지도3개 표시→실제188001 클릭→사업명 테스트/GIS 맨홀번호188001 확인→조사보고서 보기→1쪽 PDF와188001 표시 성공. 사용자도 최종 정상동작 확인했다.
|
||||||
- 실행 서버: 기존 재시작 승인 범위에서 코드 반영 후8883 PID27788로 유지한다(이전PID24204 종료). classpath/실행로그는 기존 .codex-tmp/manhole-backend-* 경로 유지. 종료명령 Stop-Process -Id 27788.
|
- 실행 서버: 기존 재시작 승인 범위에서 코드 반영 후8883 PID27788로 유지한다(이전PID24204 종료). classpath/실행로그는 기존 .codex-tmp/manhole-backend-* 경로 유지. 종료명령 Stop-Process -Id 27788.
|
||||||
- 롤백: 위 FE3개 소스와 ExmnManholeReportService의 이번 변경을 함께 복원한다. DB 롤백 없음. 잔여 리스크는 GIS 미연결 자료 열람 불가 및 대형 사업의 지도 매칭·PDF 판독 비용이며, 임의 위치/다른 사업 fallback을 하지 않는다.
|
- 롤백: 위 FE3개 소스와 ExmnManholeReportService의 이번 변경을 함께 복원한다. DB 롤백 없음. 잔여 리스크는 GIS 미연결 자료 열람 불가 및 대형 사업의 지도 매칭·PDF 판독 비용이며, 임의 위치/다른 사업 fallback을 하지 않는다.
|
||||||
|
|
||||||
|
|
||||||
|
## 2026-10-28 관로조사 지도 색상 가시성 개선
|
||||||
|
- 사용자 요청에 따라 조사결과 > 관로조사의 지도 선을 상태등급별 색상에서 짙은 남색 `#000080`으로 통일했다. 선 두께 4와 등급 조회·필터는 유지한다.
|
||||||
|
- `app/(map-layout)/map/lib/analysis-layer-styles.ts`, `components/exmn/exmn-map-types.ts`, `components/exmn/exmn-layer-setting-panel.tsx`에서 지도 선·레이어 범례·설정 표식이 같은 색상 상수를 사용하도록 했다(뒤 두 경로도 같은 map 하위).
|
||||||
|
- 원본 근거: 요구사항정의서 `3. (기능)요구사항정의 및 추적표`의 SFR-010-004, 화면설계서 45쪽 SN_MN040103 및 48쪽 SN_MN040107의 조사관로 지도 표출. 색상 변경은 이번 사용자 요청을 적용했다.
|
||||||
|
- 영향: SN 지도 표시 전용. 맨홀 심볼·선택 처리·상세 탭·API·DB 변경 없음.
|
||||||
|
- 검증: git diff --check 통과, 지도 스타일과 범례·설정 표식의 공통 상수 참조 확인. 3002 개발 서버 리스너가 없어 HMR·실제 배경지도 가시성은 미검증. 빌드·서버 기동/재시작은 수행하지 않았다.
|
||||||
|
- 롤백: 위 3개 파일의 이번 색상 변경만 되돌린다. DB 조치 없음.
|
||||||
|
|||||||
@@ -20,3 +20,30 @@
|
|||||||
|
|
||||||
## 수동 확인 필요
|
## 수동 확인 필요
|
||||||
- 실제 로그인 화면에서 팝업 크기·가로 스크롤·강조 색상 및 지도 이동 회귀 확인
|
- 실제 로그인 화면에서 팝업 크기·가로 스크롤·강조 색상 및 지도 이동 회귀 확인
|
||||||
|
|
||||||
|
## 추가 작업: 확률강우량 팝업 엑셀다운로드 (2026-10-30)
|
||||||
|
|
||||||
|
### 변경 내용
|
||||||
|
- 팝업 헤더 우측(닫기 X 왼쪽)에 `엑셀다운로드` 버튼을 추가했다. 닫기 버튼과 겹치지 않도록 헤더에 `pr-14` 여백을 둔다.
|
||||||
|
- 공통 유틸 `src/shared/util/download-excel-workbook.ts`의 `downloadExcelWorkbook`을 재사용한다.
|
||||||
|
- 파일명은 `{시군구명}_확률강우량.xlsx`이며 시트는 두 개다.
|
||||||
|
- `확률강우량`: 재현기간(년) 행 × `N시간` 열. 셀은 소수 4자리로 자르지 않은 원본 숫자 값이다.
|
||||||
|
- `확률관측소 면적비율`: 확률관측소코드·관측소명·면적비율(%)과 합계(API `areaRtTotal`).
|
||||||
|
- 로딩 중·오류·표 데이터 없음 상태에서는 버튼을 비활성화한다.
|
||||||
|
- API 호출, 응답 구조, 화면 문구와 기존 표 렌더링은 변경하지 않았다.
|
||||||
|
|
||||||
|
### 이슈: 팝업 본체가 투명하게 렌더링됨
|
||||||
|
- 증상: 엑셀다운로드 버튼 추가 후 팝업 본체 배경이 투명해져 뒤쪽 목록 화면이 비쳐 보였다. 새로고침과 애니메이션 완료 후에도 재현됐다.
|
||||||
|
- 추정 원인: `DialogContent`의 배경이 `bg-[var(--dialog-bg)]`(`--dialog-bg: var(--background)`, `packages/common/assets/src/styles/base.css`)인데, 이 모달에서 해당 변수가 값을 가져오지 못한 것으로 추정한다. 정확한 근본 원인은 확인하지 못했다. 공통 패키지(`@common/components`, `@common/assets`)는 수정 범위 밖이라 변경하지 않았다.
|
||||||
|
- 조치: `PrbbtRnflDialog.tsx`의 `DialogContent` className에 `bg-background`를 추가해 배경을 직접 지정했다. 사용자가 해결을 확인했다(2026-10-30).
|
||||||
|
- 참고: 같은 증상이 다른 `DialogContent` 사용 팝업에서 보이면 공통 변수 문제일 수 있으므로 별도 보고 대상이다.
|
||||||
|
|
||||||
|
### 수정 파일
|
||||||
|
- `apps/sn/src/features/fldng-predc-prst/ui/PrbbtRnflDialog.tsx`
|
||||||
|
|
||||||
|
### 검증
|
||||||
|
- 사용자가 실제 화면에서 팝업 배경 정상 표시를 확인했다.
|
||||||
|
- 타입 체크·빌드·엑셀 파일 내용 열람은 수행하지 않았다.
|
||||||
|
|
||||||
|
### 롤백
|
||||||
|
- 위 파일의 변경(헤더 버튼, `handleExcelDownload`, 두 import, `bg-background`)을 되돌린다.
|
||||||
|
|||||||
@@ -3,6 +3,10 @@ import { downloadExcelWithKoreanHeaders } from "@/shared/lib/download-excel";
|
|||||||
export type FloodPredictionExcelRow = {
|
export type FloodPredictionExcelRow = {
|
||||||
ctpvNm: string;
|
ctpvNm: string;
|
||||||
sggNm: string;
|
sggNm: string;
|
||||||
|
/** `/prst` 조회 때 시군구-관측소 매핑에서 붙인 관측소명이다. 기존 로직 행이나 매핑에 없는 조합은 null이다. */
|
||||||
|
obsrvnBrnchNm: string | null;
|
||||||
|
/** 시군구 면적 중 관측소 영역의 비율(%)이다. 기존 로직 행이나 매핑에 없는 조합은 null이다. */
|
||||||
|
areaRt: number | null;
|
||||||
analysisDateTime: string;
|
analysisDateTime: string;
|
||||||
rainBeginningDateTime: string;
|
rainBeginningDateTime: string;
|
||||||
observedAccumulatedRainfall: number | null;
|
observedAccumulatedRainfall: number | null;
|
||||||
@@ -12,10 +16,13 @@ export type FloodPredictionExcelRow = {
|
|||||||
floodRiskGrade: string;
|
floodRiskGrade: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Excel 행 객체 키를 한글 헤더로 바꾸는 매핑이다. 실제 열 순서는 행 객체의 키 순서를 따르므로 같은 순서로 둔다. */
|
||||||
const HEADERS: Record<string, string> = {
|
const HEADERS: Record<string, string> = {
|
||||||
rowNo: "순번",
|
rowNo: "순번",
|
||||||
ctpvNm: "시도",
|
ctpvNm: "시도",
|
||||||
sggNm: "시군구",
|
sggNm: "시군구",
|
||||||
|
obsrvnBrnchNm: "관측소",
|
||||||
|
areaRt: "면적비율(%)",
|
||||||
analysisDateTime: "분석시각",
|
analysisDateTime: "분석시각",
|
||||||
rainBeginningDateTime: "강우시작시각",
|
rainBeginningDateTime: "강우시작시각",
|
||||||
observedAccumulatedRainfall: "관측 누적강수량(mm)",
|
observedAccumulatedRainfall: "관측 누적강수량(mm)",
|
||||||
@@ -39,12 +46,20 @@ export const downloadFloodPredictionStatusExcel = async (
|
|||||||
rowNo: index + 1,
|
rowNo: index + 1,
|
||||||
ctpvNm: row.ctpvNm || "-",
|
ctpvNm: row.ctpvNm || "-",
|
||||||
sggNm: row.sggNm || "-",
|
sggNm: row.sggNm || "-",
|
||||||
|
// 관측소·면적비율은 시군구 뒤에 두고, 기존 로직 행이나 매핑에 없는 조합은 `-`로 내보낸다.
|
||||||
|
obsrvnBrnchNm: row.obsrvnBrnchNm || "-",
|
||||||
|
// 면적비율은 목록과 같이 소수 둘째 자리까지 반올림한 숫자로 내보낸다.
|
||||||
|
areaRt:
|
||||||
|
row.areaRt == null || !Number.isFinite(Number(row.areaRt))
|
||||||
|
? "-"
|
||||||
|
: Number(Number(row.areaRt).toFixed(2)),
|
||||||
analysisDateTime: formatDateTime(row.analysisDateTime),
|
analysisDateTime: formatDateTime(row.analysisDateTime),
|
||||||
rainBeginningDateTime: formatDateTime(row.rainBeginningDateTime),
|
rainBeginningDateTime: formatDateTime(row.rainBeginningDateTime),
|
||||||
observedAccumulatedRainfall:
|
observedAccumulatedRainfall:
|
||||||
row.observedAccumulatedRainfall == null
|
row.observedAccumulatedRainfall == null
|
||||||
? "-"
|
? "-"
|
||||||
: Number(row.observedAccumulatedRainfall.toFixed(1)),
|
: Number(row.observedAccumulatedRainfall.toFixed(1)),
|
||||||
|
// 관측소 기준 행의 예측시간 0(대표값이 분석시각)도 목록과 같이 `0시간 후`로 내보낸다.
|
||||||
predictionHour:
|
predictionHour:
|
||||||
row.predictionHour == null ? "-" : `${row.predictionHour}시간 후`,
|
row.predictionHour == null ? "-" : `${row.predictionHour}시간 후`,
|
||||||
predictedAccumulatedRainfall:
|
predictedAccumulatedRainfall:
|
||||||
@@ -60,7 +75,8 @@ export const downloadFloodPredictionStatusExcel = async (
|
|||||||
data: excelRows as unknown as JSON[],
|
data: excelRows as unknown as JSON[],
|
||||||
fileName: "침수예측현황.xlsx",
|
fileName: "침수예측현황.xlsx",
|
||||||
sheetNameArray: ["침수예측현황"],
|
sheetNameArray: ["침수예측현황"],
|
||||||
headerRange: "A1:J1",
|
// 순번~침수위험도 12개 열(관측소·면적비율 포함)의 헤더 행 범위다.
|
||||||
|
headerRange: "A1:L1",
|
||||||
headerMapping: HEADERS,
|
headerMapping: HEADERS,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,9 +2,14 @@
|
|||||||
|
|
||||||
import { useLayoutEffect, useMemo, useRef } from "react";
|
import { useLayoutEffect, useMemo, useRef } from "react";
|
||||||
|
|
||||||
import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@common/components";
|
import { Button, Dialog, DialogContent, DialogHeader, DialogTitle } from "@common/components";
|
||||||
|
|
||||||
/** 시군구별 면적가중 확률강우량 한 셀의 API 응답이다. */
|
import { downloadExcelWorkbook } from "@/shared/util/download-excel-workbook";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 시군구별 면적가중 확률강우량 한 셀의 API 응답이다.
|
||||||
|
* 관측소 기준표 응답에서는 최근접 확률관측소 1곳의 값을 면적가중 없이 그대로 담는다.
|
||||||
|
*/
|
||||||
export type PrbbtRnflCell = {
|
export type PrbbtRnflCell = {
|
||||||
frequencyYear: number;
|
frequencyYear: number;
|
||||||
durationHour: number;
|
durationHour: number;
|
||||||
@@ -18,18 +23,37 @@ export type PrbbtRnflStation = {
|
|||||||
areaRt: number;
|
areaRt: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** 확률강우량 표와 그 계산에 사용한 관측소 비율을 함께 받는다. */
|
/**
|
||||||
|
* 확률강우량 표와 그 계산에 사용한 관측소 비율을 함께 받는다.
|
||||||
|
* 시군구 기준표(`/prst/prbbt-rnfl?sggCd=`)는 `sggCd`를, 관측소 기준표(`/prst/prbbt-rnfl/obsvtr?obsrvnBrnchCd=`)는
|
||||||
|
* `sggCd` 대신 `obsrvnBrnchCd`·`obsrvnBrnchNm`을 담으므로 두 응답을 모두 받도록 식별 필드는 선택값으로 둔다.
|
||||||
|
*/
|
||||||
export type PrbbtRnflResponse = {
|
export type PrbbtRnflResponse = {
|
||||||
sggCd: string;
|
/** 시군구 기준표 응답의 시군구코드다. 관측소 기준표 응답에는 없다. */
|
||||||
|
sggCd?: string;
|
||||||
|
/** 관측소 기준표 응답의 관측지점코드다. 시군구 기준표 응답에는 없다. */
|
||||||
|
obsrvnBrnchCd?: string;
|
||||||
|
/** 관측소 기준표 응답의 관측소명이다. 시군구 기준표 응답에는 없다. */
|
||||||
|
obsrvnBrnchNm?: string;
|
||||||
rainfall: PrbbtRnflCell[];
|
rainfall: PrbbtRnflCell[];
|
||||||
|
/** 시군구 기준은 면적가중에 쓴 확률관측소 전부, 관측소 기준은 최근접 확률관측소 1곳(비율 100)이다. */
|
||||||
stations: PrbbtRnflStation[];
|
stations: PrbbtRnflStation[];
|
||||||
areaRtTotal: number;
|
areaRtTotal: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 기준표를 연 목록 행의 분석 기준이다.
|
||||||
|
* `sgg`는 기존 시군구 면적가중 행, `obsvtr`는 관측지점코드가 있는 관측소 기준(새 로직) 행이다.
|
||||||
|
*/
|
||||||
|
export type PrbbtRnflTargetKind = "sgg" | "obsvtr";
|
||||||
|
|
||||||
type PrbbtRnflDialogProps = {
|
type PrbbtRnflDialogProps = {
|
||||||
open: boolean;
|
open: boolean;
|
||||||
onOpenChange: (open: boolean) => void;
|
onOpenChange: (open: boolean) => void;
|
||||||
sggName: string;
|
/** 상단 제목·표 제목·Excel 파일명에 쓰는 대상 이름이다. 시군구 기준은 시군구명, 관측소 기준은 관측소명이다. */
|
||||||
|
targetName: string;
|
||||||
|
/** 대상 이름이 시군구인지 관측소인지 구분해 아래 표 제목과 안내 문구를 고른다. */
|
||||||
|
targetKind: PrbbtRnflTargetKind;
|
||||||
selectedDurationHour: number | null;
|
selectedDurationHour: number | null;
|
||||||
selectedFrequencyYear: number | null;
|
selectedFrequencyYear: number | null;
|
||||||
data: PrbbtRnflResponse | null;
|
data: PrbbtRnflResponse | null;
|
||||||
@@ -43,11 +67,27 @@ const formatRainfall = (value: number) =>
|
|||||||
const formatAreaRatio = (value: number) =>
|
const formatAreaRatio = (value: number) =>
|
||||||
Number.isFinite(Number(value)) ? Number(value).toFixed(3) : "-";
|
Number.isFinite(Number(value)) ? Number(value).toFixed(3) : "-";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 아래 확률관측소 표의 제목(Excel 두 번째 시트명 겸용)이다.
|
||||||
|
* 관측소 기준은 면적가중 없이 최근접 확률관측소 1곳을 쓰므로 `적용 확률관측소`로 보인다.
|
||||||
|
*/
|
||||||
|
const STATION_TABLE_TITLE: Record<PrbbtRnflTargetKind, string> = {
|
||||||
|
sgg: "확률관측소 면적비율",
|
||||||
|
obsvtr: "적용 확률관측소",
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 기준자료가 없을 때 보이는 안내 문구다. 관측소 기준은 시군구 대신 관측소로 안내한다. */
|
||||||
|
const EMPTY_MESSAGE: Record<PrbbtRnflTargetKind, string> = {
|
||||||
|
sgg: "해당 시군구의 확률강우량 기준자료가 없습니다.",
|
||||||
|
obsvtr: "해당 관측소의 확률강우량 기준자료가 없습니다.",
|
||||||
|
};
|
||||||
|
|
||||||
/** 재현기간을 행, 강우지속시간을 열로 구성하고 선택한 두 기준이 교차하는 값만 색으로 강조한다. */
|
/** 재현기간을 행, 강우지속시간을 열로 구성하고 선택한 두 기준이 교차하는 값만 색으로 강조한다. */
|
||||||
export default function PrbbtRnflDialog({
|
export default function PrbbtRnflDialog({
|
||||||
open,
|
open,
|
||||||
onOpenChange,
|
onOpenChange,
|
||||||
sggName,
|
targetName,
|
||||||
|
targetKind,
|
||||||
selectedDurationHour,
|
selectedDurationHour,
|
||||||
selectedFrequencyYear,
|
selectedFrequencyYear,
|
||||||
data,
|
data,
|
||||||
@@ -58,6 +98,8 @@ export default function PrbbtRnflDialog({
|
|||||||
const tableScrollRef = useRef<HTMLDivElement>(null);
|
const tableScrollRef = useRef<HTMLDivElement>(null);
|
||||||
/** 목록에서 클릭한 지속시간에 대응하는 표 헤더이다. */
|
/** 목록에서 클릭한 지속시간에 대응하는 표 헤더이다. */
|
||||||
const selectedDurationHeaderRef = useRef<HTMLTableCellElement>(null);
|
const selectedDurationHeaderRef = useRef<HTMLTableCellElement>(null);
|
||||||
|
/** 행 종류에 따른 아래 표 제목이다. 시군구 기준 행은 기존 제목을 그대로 쓴다. */
|
||||||
|
const stationTableTitle = STATION_TABLE_TITLE[targetKind];
|
||||||
|
|
||||||
const { frequencies, durations, rainfallByKey } = useMemo(() => {
|
const { frequencies, durations, rainfallByKey } = useMemo(() => {
|
||||||
const rainfall = data?.rainfall ?? [];
|
const rainfall = data?.rainfall ?? [];
|
||||||
@@ -77,6 +119,46 @@ export default function PrbbtRnflDialog({
|
|||||||
};
|
};
|
||||||
}, [data]);
|
}, [data]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 화면에 표시 중인 확률강우량 표와 관측소 면적비율 표를 두 시트로 내려받는다.
|
||||||
|
* 파일명은 대상 이름(시군구명 또는 관측소명)을, 두 번째 시트명은 아래 표 제목을 따른다.
|
||||||
|
*/
|
||||||
|
const handleExcelDownload = async () => {
|
||||||
|
const stations = data?.stations ?? [];
|
||||||
|
await downloadExcelWorkbook({
|
||||||
|
fileName: `${targetName}_확률강우량`,
|
||||||
|
sheets: [
|
||||||
|
{
|
||||||
|
name: "확률강우량",
|
||||||
|
rows: [
|
||||||
|
["재현기간(년)", ...durations.map((hour) => `${hour}시간`)],
|
||||||
|
...frequencies.map((frequencyYear) => [
|
||||||
|
frequencyYear,
|
||||||
|
...durations.map(
|
||||||
|
(durationHour) =>
|
||||||
|
rainfallByKey.get(`${frequencyYear}:${durationHour}`) ?? null,
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
],
|
||||||
|
columnWidths: [14, ...durations.map(() => 12)],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: stationTableTitle,
|
||||||
|
rows: [
|
||||||
|
["확률관측소코드", "관측소명", "면적비율(%)"],
|
||||||
|
...stations.map((station) => [
|
||||||
|
station.prbbtObsvtrCd,
|
||||||
|
station.prbbtObsvtrNm || "-",
|
||||||
|
station.areaRt,
|
||||||
|
]),
|
||||||
|
["합계", "", data?.areaRtTotal ?? null],
|
||||||
|
],
|
||||||
|
columnWidths: [18, 18, 14],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
/** 표가 표시되면 선택 지속시간 열을 가로 스크롤 영역의 가운데로 맞춘다. */
|
/** 표가 표시되면 선택 지속시간 열을 가로 스크롤 영역의 가운데로 맞춘다. */
|
||||||
useLayoutEffect(() => {
|
useLayoutEffect(() => {
|
||||||
if (!open || loading || error || selectedDurationHour == null) return;
|
if (!open || loading || error || selectedDurationHour == null) return;
|
||||||
@@ -99,8 +181,16 @@ export default function PrbbtRnflDialog({
|
|||||||
className="flex max-h-[90vh] w-[94vw] !max-w-[150rem] flex-col gap-4 overflow-hidden"
|
className="flex max-h-[90vh] w-[94vw] !max-w-[150rem] flex-col gap-4 overflow-hidden"
|
||||||
aria-describedby={undefined}
|
aria-describedby={undefined}
|
||||||
>
|
>
|
||||||
<DialogHeader>
|
{/* 우측 상단 닫기(X) 버튼과 겹치지 않도록 pr-14 여백을 둔다. */}
|
||||||
<DialogTitle>{sggName} 확률강우량</DialogTitle>
|
<DialogHeader className="flex-row items-center justify-between pr-14">
|
||||||
|
<DialogTitle>{targetName} 확률강우량</DialogTitle>
|
||||||
|
<Button
|
||||||
|
type="button"
|
||||||
|
disabled={loading || !!error || !frequencies.length || !durations.length}
|
||||||
|
onClick={() => void handleExcelDownload()}
|
||||||
|
>
|
||||||
|
엑셀다운로드
|
||||||
|
</Button>
|
||||||
</DialogHeader>
|
</DialogHeader>
|
||||||
|
|
||||||
{loading ? (
|
{loading ? (
|
||||||
@@ -113,14 +203,14 @@ export default function PrbbtRnflDialog({
|
|||||||
</p>
|
</p>
|
||||||
) : !frequencies.length || !durations.length ? (
|
) : !frequencies.length || !durations.length ? (
|
||||||
<p className="py-8 text-center text-xl" role="status">
|
<p className="py-8 text-center text-xl" role="status">
|
||||||
해당 시군구의 확률강우량 기준자료가 없습니다.
|
{EMPTY_MESSAGE[targetKind]}
|
||||||
</p>
|
</p>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<div ref={tableScrollRef} className="min-h-0 overflow-auto rounded-md border border-border">
|
<div ref={tableScrollRef} className="min-h-0 overflow-auto rounded-md border border-border">
|
||||||
<table className="w-max min-w-full border-collapse text-right text-lg">
|
<table className="w-max min-w-full border-collapse text-right text-lg">
|
||||||
<caption className="sr-only">
|
<caption className="sr-only">
|
||||||
{sggName} 재현기간 및 강우지속시간별 확률강우량(mm)
|
{targetName} 재현기간 및 강우지속시간별 확률강우량(mm)
|
||||||
</caption>
|
</caption>
|
||||||
<thead className="sticky top-0 z-10 bg-muted text-foreground">
|
<thead className="sticky top-0 z-10 bg-muted text-foreground">
|
||||||
<tr>
|
<tr>
|
||||||
@@ -182,7 +272,7 @@ export default function PrbbtRnflDialog({
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="shrink-0 space-y-2">
|
<div className="shrink-0 space-y-2">
|
||||||
<h3 className="text-xl font-semibold">확률관측소 면적비율</h3>
|
<h3 className="text-xl font-semibold">{stationTableTitle}</h3>
|
||||||
<div className="max-h-[16rem] overflow-auto rounded-md border border-border">
|
<div className="max-h-[16rem] overflow-auto rounded-md border border-border">
|
||||||
<table className="w-full border-collapse text-lg">
|
<table className="w-full border-collapse text-lg">
|
||||||
<thead className="bg-muted text-foreground">
|
<thead className="bg-muted text-foreground">
|
||||||
|
|||||||
@@ -31,9 +31,16 @@ type ApiRow = {
|
|||||||
ctpvCd: string;
|
ctpvCd: string;
|
||||||
ctpvNm: string;
|
ctpvNm: string;
|
||||||
sggNm: string;
|
sggNm: string;
|
||||||
|
/** 관측소 기준(새 로직) 분석 행의 관측지점코드다. 기존 시군구 면적가중 행은 null이다. */
|
||||||
|
obsrvnBrnchCd: string | null;
|
||||||
|
/** `/prst` 조회 때 시군구-관측소 매핑에서 붙인 관측소명이다. 기존 로직 행이나 매핑에 없는 조합은 null이다. */
|
||||||
|
obsrvnBrnchNm: string | null;
|
||||||
|
/** 시군구 면적 중 관측소 영역의 비율(%)이다. 기존 로직 행이나 매핑에 없는 조합은 null이다. */
|
||||||
|
areaRt: number | null;
|
||||||
rainBeginningDateTime: string;
|
rainBeginningDateTime: string;
|
||||||
analysisDateTime: string;
|
analysisDateTime: string;
|
||||||
observedAccumulatedRainfall: number | null;
|
observedAccumulatedRainfall: number | null;
|
||||||
|
/** 분석시각 기준 대표 예측시간이다. 관측소 기준 행의 0은 대표값이 분석시각(관측 누적)이라는 뜻이다. */
|
||||||
predictionHour: number | null;
|
predictionHour: number | null;
|
||||||
predcRainHr: number | null;
|
predcRainHr: number | null;
|
||||||
predictedAccumulatedRainfall: number | null;
|
predictedAccumulatedRainfall: number | null;
|
||||||
@@ -46,6 +53,10 @@ type TableRow = ApiRow &
|
|||||||
rowNo: number;
|
rowNo: number;
|
||||||
analysisDateTimeDisplay: string;
|
analysisDateTimeDisplay: string;
|
||||||
rainBeginningDateTimeDisplay: string;
|
rainBeginningDateTimeDisplay: string;
|
||||||
|
/** 관측소 열 표시값이다. 관측소명이 없으면 `-`이다. */
|
||||||
|
obsrvnBrnchNmDisplay: string;
|
||||||
|
/** 면적비율(%) 열 표시값이다. 소수 둘째 자리까지, 값이 없으면 `-`이다. */
|
||||||
|
areaRtDisplay: string;
|
||||||
observedAccumulatedRainfallDisplay: string;
|
observedAccumulatedRainfallDisplay: string;
|
||||||
predictionHourDisplay: string;
|
predictionHourDisplay: string;
|
||||||
predictedAccumulatedRainfallDisplay: string;
|
predictedAccumulatedRainfallDisplay: string;
|
||||||
@@ -76,47 +87,61 @@ const toFloodMapFrequencyCode = (value: number) => {
|
|||||||
return String(normalized).padStart(3, "0");
|
return String(normalized).padStart(3, "0");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 침수예측현황 목록 열 정의다.
|
||||||
|
* 시군구 뒤에 관측소 기준 분석의 관측소·면적비율 열을 두고, 13개 열의 widthPercent 합은 100으로 맞춘다.
|
||||||
|
*/
|
||||||
const HEADS: UiHeadProps[] = [
|
const HEADS: UiHeadProps[] = [
|
||||||
{ id: "rowNo", title: "순번", widthPercent: 5 },
|
{ id: "rowNo", title: "순번", widthPercent: 4 },
|
||||||
{ id: "ctpvNm", title: "시도", widthPercent: 7 },
|
{ id: "ctpvNm", title: "시도", widthPercent: 7 },
|
||||||
{ id: "sggNm", title: "시군구", widthPercent: 8 },
|
{ id: "sggNm", title: "시군구", widthPercent: 8 },
|
||||||
|
{ id: "obsrvnBrnchNmDisplay", title: "관측소", widthPercent: 7 },
|
||||||
|
{
|
||||||
|
id: "areaRtDisplay",
|
||||||
|
title: "면적비율(%)",
|
||||||
|
widthPercent: 6,
|
||||||
|
align: "right",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: "analysisDateTimeDisplay",
|
id: "analysisDateTimeDisplay",
|
||||||
title: "분석시각",
|
title: "분석시각",
|
||||||
widthPercent: 13,
|
widthPercent: 11,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "rainBeginningDateTimeDisplay",
|
id: "rainBeginningDateTimeDisplay",
|
||||||
title: "강우시작시각",
|
title: "강우시작시각",
|
||||||
widthPercent: 13,
|
widthPercent: 11,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "observedAccumulatedRainfallDisplay",
|
id: "observedAccumulatedRainfallDisplay",
|
||||||
title: "관측 누적강수량(mm)",
|
title: "관측 누적강수량(mm)",
|
||||||
widthPercent: 11,
|
widthPercent: 9,
|
||||||
align: "right",
|
align: "right",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "predictionHourDisplay",
|
id: "predictionHourDisplay",
|
||||||
title: "예측시간",
|
title: "예측시간",
|
||||||
widthPercent: 7,
|
widthPercent: 6,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "predictedAccumulatedRainfallDisplay",
|
id: "predictedAccumulatedRainfallDisplay",
|
||||||
title: "예측 누적강수량(mm)",
|
title: "예측 누적강수량(mm)",
|
||||||
widthPercent: 12,
|
widthPercent: 9,
|
||||||
align: "right",
|
align: "right",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "exceededFrequencyYearDisplay",
|
id: "exceededFrequencyYearDisplay",
|
||||||
title: "초과 빈도(년)",
|
title: "초과 빈도(년)",
|
||||||
widthPercent: 8,
|
widthPercent: 7,
|
||||||
align: "right",
|
align: "right",
|
||||||
},
|
},
|
||||||
{ id: "floodRiskGrade", title: "침수위험도", widthPercent: 8 },
|
{ id: "floodRiskGrade", title: "침수위험도", widthPercent: 7 },
|
||||||
{ id: "probabilityRainfallDisplay", title: "확률강우량", widthPercent: 8 },
|
{ id: "probabilityRainfallDisplay", title: "확률강우량", widthPercent: 8 },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/** 관측소·면적비율 열이 더해진 목록의 최소 표 너비다. 기본 팝업 너비(1280px)에서는 가로 스크롤 없이 보이도록 잡는다. */
|
||||||
|
const LIST_MIN_TABLE_WIDTH = "118rem";
|
||||||
|
|
||||||
/** 날짜·시각의 뒷부분이 잘리지 않도록 전체 표시할 목록 열이다. */
|
/** 날짜·시각의 뒷부분이 잘리지 않도록 전체 표시할 목록 열이다. */
|
||||||
const FULL_TEXT_TIME_HEAD_IDS = [
|
const FULL_TEXT_TIME_HEAD_IDS = [
|
||||||
"analysisDateTimeDisplay",
|
"analysisDateTimeDisplay",
|
||||||
@@ -157,6 +182,34 @@ const predictionHourText = (value: number | null) => {
|
|||||||
return hour > 0 ? `${hour}시간 후` : "-";
|
return hour > 0 ? `${hour}시간 후` : "-";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** 관측지점코드가 있으면 관측소 기준(새 로직) 분석 행이다. 기준표 API·표시 문구를 고를 때 쓴다. */
|
||||||
|
const isObsvtrRow = (row: Pick<ApiRow, "obsrvnBrnchCd">) =>
|
||||||
|
Boolean(row.obsrvnBrnchCd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 목록 예측시간 열의 표시문구를 정한다.
|
||||||
|
* 관측소 기준 행의 예측시간 0은 대표값이 분석시각(관측 누적)이라는 뜻이므로 `0시간 후`로 보인다.
|
||||||
|
* 그 밖의 행은 기존 `predictionHourText` 규칙(0 이하 `-`)을 그대로 따른다.
|
||||||
|
*/
|
||||||
|
const predictionHourDisplayText = (
|
||||||
|
row: Pick<ApiRow, "predictionHour" | "obsrvnBrnchCd">,
|
||||||
|
) =>
|
||||||
|
isObsvtrRow(row) && row.predictionHour === 0
|
||||||
|
? "0시간 후"
|
||||||
|
: predictionHourText(row.predictionHour);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 확률강우량 기준표 버튼 aria-label과 모달 제목에 쓸 대상 이름이다.
|
||||||
|
* 관측소 기준 행은 관측소명(목록 → 기준표 응답 → 관측지점코드 순으로 대체), 기존 행은 시군구명을 쓴다.
|
||||||
|
*/
|
||||||
|
const probabilityTargetName = (
|
||||||
|
row: Pick<ApiRow, "obsrvnBrnchCd" | "obsrvnBrnchNm" | "sggNm">,
|
||||||
|
responseStationName?: string,
|
||||||
|
) =>
|
||||||
|
isObsvtrRow(row)
|
||||||
|
? row.obsrvnBrnchNm || responseStationName || row.obsrvnBrnchCd || ""
|
||||||
|
: row.sggNm;
|
||||||
|
|
||||||
/** 분석 결과의 대표 누적강우시간을 확률강우량 기준표 링크 문구로 표시한다. */
|
/** 분석 결과의 대표 누적강우시간을 확률강우량 기준표 링크 문구로 표시한다. */
|
||||||
const probabilityDurationText = (value: number | null) => {
|
const probabilityDurationText = (value: number | null) => {
|
||||||
const hour = Number(value);
|
const hour = Number(value);
|
||||||
@@ -291,11 +344,14 @@ export default function FldngPredcPrstPopupContent() {
|
|||||||
rainBeginningDateTimeDisplay: displayDate(
|
rainBeginningDateTimeDisplay: displayDate(
|
||||||
item.rainBeginningDateTime,
|
item.rainBeginningDateTime,
|
||||||
),
|
),
|
||||||
|
// 기존 로직 행(관측지점코드 null)이나 매핑에 없는 조합은 관측소·면적비율을 `-`로 보인다.
|
||||||
|
obsrvnBrnchNmDisplay: item.obsrvnBrnchNm || "-",
|
||||||
|
areaRtDisplay: formatNumber(item.areaRt, 2),
|
||||||
observedAccumulatedRainfallDisplay: formatNumber(
|
observedAccumulatedRainfallDisplay: formatNumber(
|
||||||
item.observedAccumulatedRainfall,
|
item.observedAccumulatedRainfall,
|
||||||
1,
|
1,
|
||||||
),
|
),
|
||||||
predictionHourDisplay: predictionHourText(item.predictionHour),
|
predictionHourDisplay: predictionHourDisplayText(item),
|
||||||
predictedAccumulatedRainfallDisplay: formatNumber(
|
predictedAccumulatedRainfallDisplay: formatNumber(
|
||||||
item.predictedAccumulatedRainfall,
|
item.predictedAccumulatedRainfall,
|
||||||
1,
|
1,
|
||||||
@@ -417,9 +473,19 @@ export default function FldngPredcPrstPopupContent() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/** 선택 시군구의 확률강우량과 관측소 비율을 조회한다. 지도 행 클릭은 버튼에서 차단한다. */
|
/**
|
||||||
|
* 선택 행의 확률강우량과 관측소 비율을 조회한다. 지도 행 클릭은 버튼에서 차단한다.
|
||||||
|
* 관측지점코드가 있는 관측소 기준 행은 판정에 쓴 최근접 확률관측소 기준표(`/prst/prbbt-rnfl/obsvtr`)를,
|
||||||
|
* 기존 시군구 기준 행은 지금처럼 시군구 면적가중 기준표(`/prst/prbbt-rnfl`)를 부른다.
|
||||||
|
*/
|
||||||
const handleProbabilityClick = async (row: TableRow) => {
|
const handleProbabilityClick = async (row: TableRow) => {
|
||||||
if (!row.sggCd || !Number.isInteger(Number(row.predcRainHr)) || Number(row.predcRainHr) <= 0) {
|
// 관측소 기준 행이면 조회에 쓸 관측지점코드, 기존 행이면 null이다.
|
||||||
|
const obsrvnBrnchCd = row.obsrvnBrnchCd || null;
|
||||||
|
if (
|
||||||
|
(!obsrvnBrnchCd && !row.sggCd) ||
|
||||||
|
!Number.isInteger(Number(row.predcRainHr)) ||
|
||||||
|
Number(row.predcRainHr) <= 0
|
||||||
|
) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const requestId = ++probabilityRequestIdRef.current;
|
const requestId = ++probabilityRequestIdRef.current;
|
||||||
@@ -428,16 +494,22 @@ export default function FldngPredcPrstPopupContent() {
|
|||||||
setProbabilityError(null);
|
setProbabilityError(null);
|
||||||
setProbabilityLoading(true);
|
setProbabilityLoading(true);
|
||||||
try {
|
try {
|
||||||
const params = new URLSearchParams({ sggCd: row.sggCd });
|
// 행 종류에 맞는 기준표 API 주소다. 기존 시군구 기준 행은 이전과 같은 sggCd 쿼리를 쓴다.
|
||||||
const response = await getRawJson(
|
const requestUrl = obsrvnBrnchCd
|
||||||
`/sewerage-service/api/v1/fldng/predc/prst/prbbt-rnfl?${params.toString()}`,
|
? `/sewerage-service/api/v1/fldng/predc/prst/prbbt-rnfl/obsvtr?${new URLSearchParams({ obsrvnBrnchCd }).toString()}`
|
||||||
);
|
: `/sewerage-service/api/v1/fldng/predc/prst/prbbt-rnfl?${new URLSearchParams({ sggCd: row.sggCd }).toString()}`;
|
||||||
|
const response = await getRawJson(requestUrl);
|
||||||
if (requestId !== probabilityRequestIdRef.current) return;
|
if (requestId !== probabilityRequestIdRef.current) return;
|
||||||
const payload: PrbbtRnflResponse = response?.data ?? response;
|
const payload: PrbbtRnflResponse = response?.data ?? response;
|
||||||
setProbabilityData(payload);
|
setProbabilityData(payload);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (requestId !== probabilityRequestIdRef.current) return;
|
if (requestId !== probabilityRequestIdRef.current) return;
|
||||||
console.error("시군구 확률강우량 조회 중 오류:", error);
|
console.error(
|
||||||
|
obsrvnBrnchCd
|
||||||
|
? "관측소 확률강우량 조회 중 오류:"
|
||||||
|
: "시군구 확률강우량 조회 중 오류:",
|
||||||
|
error,
|
||||||
|
);
|
||||||
setProbabilityError("확률강우량 기준표를 조회하지 못했습니다.");
|
setProbabilityError("확률강우량 기준표를 조회하지 못했습니다.");
|
||||||
} finally {
|
} finally {
|
||||||
if (requestId === probabilityRequestIdRef.current) {
|
if (requestId === probabilityRequestIdRef.current) {
|
||||||
@@ -479,6 +551,7 @@ export default function FldngPredcPrstPopupContent() {
|
|||||||
getItems: (response) => response.content,
|
getItems: (response) => response.content,
|
||||||
getTotal: (response) => response.totalElements,
|
getTotal: (response) => response.totalElements,
|
||||||
});
|
});
|
||||||
|
// API 원본 행을 그대로 넘겨 관측지점코드·관측소명·면적비율도 Excel 헬퍼에서 함께 쓴다.
|
||||||
await downloadFloodPredictionStatusExcel(result.items);
|
await downloadFloodPredictionStatusExcel(result.items);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("침수예측현황 Excel 다운로드 중 오류:", error);
|
console.error("침수예측현황 Excel 다운로드 중 오류:", error);
|
||||||
@@ -659,7 +732,7 @@ export default function FldngPredcPrstPopupContent() {
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="font-medium text-primary underline underline-offset-2 hover:opacity-75 focus-visible:rounded-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary"
|
className="font-medium text-primary underline underline-offset-2 hover:opacity-75 focus-visible:rounded-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary"
|
||||||
aria-label={`${row.sggNm} ${row.probabilityRainfallDisplay} 확률강우량 기준표 보기`}
|
aria-label={`${probabilityTargetName(row)} ${row.probabilityRainfallDisplay} 확률강우량 기준표 보기`}
|
||||||
onClick={(event) => {
|
onClick={(event) => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
void handleProbabilityClick(row);
|
void handleProbabilityClick(row);
|
||||||
@@ -671,7 +744,7 @@ export default function FldngPredcPrstPopupContent() {
|
|||||||
) : undefined
|
) : undefined
|
||||||
}
|
}
|
||||||
scrollMode="horizontal"
|
scrollMode="horizontal"
|
||||||
minTableWidth="112rem"
|
minTableWidth={LIST_MIN_TABLE_WIDTH}
|
||||||
fullTextHeadIds={FULL_TEXT_TIME_HEAD_IDS}
|
fullTextHeadIds={FULL_TEXT_TIME_HEAD_IDS}
|
||||||
fillAvailableHeight={rows.length === 0}
|
fillAvailableHeight={rows.length === 0}
|
||||||
emptyMessage="조회 조건에 해당하는 침수예측현황이 없습니다."
|
emptyMessage="조회 조건에 해당하는 침수예측현황이 없습니다."
|
||||||
@@ -706,7 +779,17 @@ export default function FldngPredcPrstPopupContent() {
|
|||||||
<PrbbtRnflDialog
|
<PrbbtRnflDialog
|
||||||
open={probabilityRow !== null}
|
open={probabilityRow !== null}
|
||||||
onOpenChange={handleProbabilityOpenChange}
|
onOpenChange={handleProbabilityOpenChange}
|
||||||
sggName={probabilityRow?.sggNm ?? ""}
|
targetName={
|
||||||
|
probabilityRow
|
||||||
|
? probabilityTargetName(
|
||||||
|
probabilityRow,
|
||||||
|
probabilityData?.obsrvnBrnchNm,
|
||||||
|
)
|
||||||
|
: ""
|
||||||
|
}
|
||||||
|
targetKind={
|
||||||
|
probabilityRow && isObsvtrRow(probabilityRow) ? "obsvtr" : "sgg"
|
||||||
|
}
|
||||||
selectedDurationHour={probabilityRow?.predcRainHr ?? null}
|
selectedDurationHour={probabilityRow?.predcRainHr ?? null}
|
||||||
selectedFrequencyYear={probabilityRow?.exceededFrequencyYear ?? null}
|
selectedFrequencyYear={probabilityRow?.exceededFrequencyYear ?? null}
|
||||||
data={probabilityData}
|
data={probabilityData}
|
||||||
|
|||||||
@@ -289,28 +289,14 @@ type GridViewWithSetColumnProperty = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
type GridViewWithEditOptions = {
|
type GridViewWithEditOptions = {
|
||||||
setEditOptions?: (options: {
|
setEditOptions?: (options: { commitWhenLeave?: boolean }) => void;
|
||||||
commitWhenLeave?: boolean;
|
|
||||||
appendable?: boolean;
|
|
||||||
insertable?: boolean;
|
|
||||||
}) => void;
|
|
||||||
setPasteOptions?: (options: { enableAppend?: boolean }) => void;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/** 포커스가 그리드 밖으로 나갈 때 편집 중인 값을 자동 commit */
|
/** 포커스가 그리드 밖으로 나갈 때 편집 중인 값을 자동 commit */
|
||||||
function applyDefaultGridEditOptions(
|
function applyDefaultGridEditOptions(
|
||||||
gridView: GridViewWithEditOptions | null | undefined,
|
gridView: GridViewWithEditOptions | null | undefined,
|
||||||
options?: { preventRowAppend?: boolean },
|
|
||||||
) {
|
) {
|
||||||
gridView?.setEditOptions?.({
|
gridView?.setEditOptions?.({ commitWhenLeave: true });
|
||||||
commitWhenLeave: true,
|
|
||||||
...(options?.preventRowAppend
|
|
||||||
? { appendable: false, insertable: false }
|
|
||||||
: {}),
|
|
||||||
});
|
|
||||||
if (options?.preventRowAppend) {
|
|
||||||
gridView?.setPasteOptions?.({ enableAppend: false });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function isDateEditorColumn(column: {
|
function isDateEditorColumn(column: {
|
||||||
@@ -867,7 +853,6 @@ const DataGrid = ({
|
|||||||
gridHeight = 55, // vh 단위
|
gridHeight = 55, // vh 단위
|
||||||
headerHeight = 60,
|
headerHeight = 60,
|
||||||
fitStyle = GridFitStyle.EVEN,
|
fitStyle = GridFitStyle.EVEN,
|
||||||
preventRowAppend = true,
|
|
||||||
}: DataGridProps) => {
|
}: DataGridProps) => {
|
||||||
const { columns, columnLayout } = columnInfo;
|
const { columns, columnLayout } = columnInfo;
|
||||||
const fixedColumnNameSet = useMemo(
|
const fixedColumnNameSet = useMemo(
|
||||||
@@ -1482,9 +1467,7 @@ useEffect(() => {
|
|||||||
const scheduleFooterTask = (task: () => void, delayMs: number) => {
|
const scheduleFooterTask = (task: () => void, delayMs: number) => {
|
||||||
footerTimerIds.push(setTimeout(task, delayMs));
|
footerTimerIds.push(setTimeout(task, delayMs));
|
||||||
};
|
};
|
||||||
applyDefaultGridEditOptions(gridView as GridViewWithEditOptions, {
|
applyDefaultGridEditOptions(gridView as GridViewWithEditOptions);
|
||||||
preventRowAppend,
|
|
||||||
});
|
|
||||||
|
|
||||||
const columnsFieldsSig = columns.map((c) => c.fieldName).join("\u0001");
|
const columnsFieldsSig = columns.map((c) => c.fieldName).join("\u0001");
|
||||||
if (columnsFieldsSig !== columnsFieldsSigRef.current) {
|
if (columnsFieldsSig !== columnsFieldsSigRef.current) {
|
||||||
@@ -2007,7 +1990,6 @@ useEffect(() => {
|
|||||||
fitStyle,
|
fitStyle,
|
||||||
enableSort,
|
enableSort,
|
||||||
footerVerificationResult,
|
footerVerificationResult,
|
||||||
preventRowAppend,
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// 행·셀 클릭 이벤트 (검증 오류 툴팁은 hover만 — onShowTooltip / 빈 셀 오버레이)
|
// 행·셀 클릭 이벤트 (검증 오류 툴팁은 hover만 — onShowTooltip / 빈 셀 오버레이)
|
||||||
@@ -2545,7 +2527,6 @@ useEffect(() => {
|
|||||||
const gridView = gridRef.current?.gridView ?? grid;
|
const gridView = gridRef.current?.gridView ?? grid;
|
||||||
applyDefaultGridEditOptions(
|
applyDefaultGridEditOptions(
|
||||||
gridView as GridViewWithEditOptions,
|
gridView as GridViewWithEditOptions,
|
||||||
{ preventRowAppend },
|
|
||||||
);
|
);
|
||||||
if (!gridView?.columnByName) return;
|
if (!gridView?.columnByName) return;
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
|||||||
import { statisticsInputExcretaTreatmentFacilityApi } from "@/entities/statistics/api/input/statistics-input-excreta-treatment-facility-service";
|
import { statisticsInputExcretaTreatmentFacilityApi } from "@/entities/statistics/api/input/statistics-input-excreta-treatment-facility-service";
|
||||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||||
import { callImrServiceWithRollbackOnFailure } from "@/components/util/input/call-imr-with-rollback";
|
|
||||||
import {
|
import {
|
||||||
EXCRETA_TREATMENT_FACILITY_STATS_CD,
|
EXCRETA_TREATMENT_FACILITY_STATS_CD,
|
||||||
type ExcretaTreatmentFacilityItem,
|
type ExcretaTreatmentFacilityItem,
|
||||||
@@ -76,11 +75,7 @@ import { toGridRows } from "@/components/util/grid/gridFunction";
|
|||||||
import { formatCompactYmdForGrid, toCompactYmdOrNull } from "@/components/util/grid/ymdFormat";
|
import { formatCompactYmdForGrid, toCompactYmdOrNull } from "@/components/util/grid/ymdFormat";
|
||||||
import { toExcelExportSearchContextFromSearchForm } from "@/components/util/gridExcelExport";
|
import { toExcelExportSearchContextFromSearchForm } from "@/components/util/gridExcelExport";
|
||||||
import { isVerificationFailedFromCommonInfo } from "@/components/util/input/verification-failed-flag";
|
import { isVerificationFailedFromCommonInfo } from "@/components/util/input/verification-failed-flag";
|
||||||
import {
|
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
|
||||||
formatVerificationTooltip,
|
|
||||||
normalizeVerificationResultMap,
|
|
||||||
type VerificationResultLikeMap,
|
|
||||||
} from "@/components/util/input/verification-result-display";
|
|
||||||
import { useAdminStore } from "@/store/admin-store";
|
import { useAdminStore } from "@/store/admin-store";
|
||||||
import { useTabStore } from "@/store/tab-store";
|
import { useTabStore } from "@/store/tab-store";
|
||||||
|
|
||||||
@@ -212,7 +207,7 @@ function mapExcretaTreatmentFacilityListToGridRows(
|
|||||||
},
|
},
|
||||||
])[0] as GridRowWithVerification;
|
])[0] as GridRowWithVerification;
|
||||||
if (item.verificationResult) {
|
if (item.verificationResult) {
|
||||||
row.verificationResult = normalizeVerificationResultMap(item.verificationResult);
|
row.verificationResult = item.verificationResult;
|
||||||
}
|
}
|
||||||
return row;
|
return row;
|
||||||
});
|
});
|
||||||
@@ -507,9 +502,7 @@ const ExcretaTreatmentFacilityInp = () => {
|
|||||||
setStatusInfo(nextStatusInfo);
|
setStatusInfo(nextStatusInfo);
|
||||||
setStatsCd(commonInfo.statsCd);
|
setStatsCd(commonInfo.statsCd);
|
||||||
setIsVerificationFailed(isVerificationFailedFromCommonInfo(commonInfo));
|
setIsVerificationFailed(isVerificationFailedFromCommonInfo(commonInfo));
|
||||||
setFooterVerificationResult(
|
setFooterVerificationResult(commonInfo.verificationResult ?? null);
|
||||||
normalizeVerificationResultMap(commonInfo.verificationResult) ?? null,
|
|
||||||
);
|
|
||||||
if (overrides?.mode !== "PRE") {
|
if (overrides?.mode !== "PRE") {
|
||||||
setIsNotApplicable(gridRows.length === 0);
|
setIsNotApplicable(gridRows.length === 0);
|
||||||
} else if (gridRows.length > 0) {
|
} else if (gridRows.length > 0) {
|
||||||
@@ -820,13 +813,7 @@ const ExcretaTreatmentFacilityInp = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const imrResponse = await callImrServiceWithRollbackOnFailure(imrParam, {
|
const imrResponse = await statisticsApi.callImrService(imrParam);
|
||||||
statsYr: lastSearchedValues.year ?? "",
|
|
||||||
statsCd: statsCdForSubmit,
|
|
||||||
sewerBzmnCd: lastSearchedValues?.bsnmCd ?? "",
|
|
||||||
rollbackStatusCode: statusInfo?.lclgvSbmsnSttsCd ?? "",
|
|
||||||
mdfrUuid: userInfo.userUnqId,
|
|
||||||
});
|
|
||||||
if (imrResponse.job_id) {
|
if (imrResponse.job_id) {
|
||||||
await waitForImrJobCompleted(
|
await waitForImrJobCompleted(
|
||||||
imrResponse.job_id,
|
imrResponse.job_id,
|
||||||
@@ -965,7 +952,19 @@ const ExcretaTreatmentFacilityInp = () => {
|
|||||||
if (!verification) return;
|
if (!verification) return;
|
||||||
const errors = verification[fieldName];
|
const errors = verification[fieldName];
|
||||||
if (Array.isArray(errors) && errors.length > 0) {
|
if (Array.isArray(errors) && errors.length > 0) {
|
||||||
return formatVerificationTooltip(errors);
|
return errors
|
||||||
|
.map((e) => {
|
||||||
|
const prefix =
|
||||||
|
e.vrfcCd === "IMR"
|
||||||
|
? "시계열 검증 - "
|
||||||
|
: e.vrfcCd === "NV"
|
||||||
|
? "일반검증 - "
|
||||||
|
: "모집단 검증 -";
|
||||||
|
return `${prefix}${e.rsnExpln}
|
||||||
|
(검증 기준값: ${e.cmprCn} / 현재 입력값: ${e.nowCn})`;
|
||||||
|
})
|
||||||
|
.filter(Boolean)
|
||||||
|
.join("\n");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
|
|||||||
import { statisticsInputPrivateSewageFacilityApi } from "@/entities/statistics/api/input/statistics-input-private-sewage-facility-service";
|
import { statisticsInputPrivateSewageFacilityApi } from "@/entities/statistics/api/input/statistics-input-private-sewage-facility-service";
|
||||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||||
import { callImrServiceWithRollbackOnFailure } from "@/components/util/input/call-imr-with-rollback";
|
|
||||||
import type {
|
import type {
|
||||||
PrivateSewageDesigStatusItem,
|
PrivateSewageDesigStatusItem,
|
||||||
PrivateSewageDesigStatusSaveItem,
|
PrivateSewageDesigStatusSaveItem,
|
||||||
@@ -69,11 +68,7 @@ import {
|
|||||||
patchFooterVerificationByTab,
|
patchFooterVerificationByTab,
|
||||||
patchVerificationFailedByTab,
|
patchVerificationFailedByTab,
|
||||||
} from "@/components/util/input/verification-failed-flag";
|
} from "@/components/util/input/verification-failed-flag";
|
||||||
import {
|
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
|
||||||
formatVerificationTooltip,
|
|
||||||
normalizeVerificationResultMap,
|
|
||||||
type VerificationResultLikeMap,
|
|
||||||
} from "@/components/util/input/verification-result-display";
|
|
||||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||||
import { useAdminStore } from "@/store/admin-store";
|
import { useAdminStore } from "@/store/admin-store";
|
||||||
import { useTabStore } from "@/store/tab-store";
|
import { useTabStore } from "@/store/tab-store";
|
||||||
@@ -180,9 +175,7 @@ function mapRegionalListToGridRows<
|
|||||||
return filterBySelectedAdmdstCd(list, sidoListRef.current, values).map((item) => {
|
return filterBySelectedAdmdstCd(list, sidoListRef.current, values).map((item) => {
|
||||||
const { verificationResult, ...rest } = item;
|
const { verificationResult, ...rest } = item;
|
||||||
const row = toGridRows([{ ctpvNm, ...rest }])[0] as GridRowWithVerification;
|
const row = toGridRows([{ ctpvNm, ...rest }])[0] as GridRowWithVerification;
|
||||||
if (verificationResult) {
|
if (verificationResult) row.verificationResult = verificationResult;
|
||||||
row.verificationResult = normalizeVerificationResultMap(verificationResult);
|
|
||||||
}
|
|
||||||
return row;
|
return row;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -895,13 +888,7 @@ const PrivateSewageFacilityInp = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const imrResponse = await callImrServiceWithRollbackOnFailure(imrParam, {
|
const imrResponse = await statisticsApi.callImrService(imrParam);
|
||||||
statsYr: lastSearchedValues.year ?? "",
|
|
||||||
statsCd: statsCdForTab,
|
|
||||||
sewerBzmnCd: lastSearchedValues?.bsnmCd ?? "",
|
|
||||||
rollbackStatusCode: activeTabStatus?.lclgvSbmsnSttsCd ?? "",
|
|
||||||
mdfrUuid: userInfo.userUnqId,
|
|
||||||
});
|
|
||||||
if (imrResponse.job_id) {
|
if (imrResponse.job_id) {
|
||||||
await waitForImrJobCompleted(
|
await waitForImrJobCompleted(
|
||||||
imrResponse.job_id,
|
imrResponse.job_id,
|
||||||
@@ -1157,7 +1144,18 @@ const PrivateSewageFacilityInp = () => {
|
|||||||
if (!verification) return;
|
if (!verification) return;
|
||||||
const errors = verification[fieldName];
|
const errors = verification[fieldName];
|
||||||
if (Array.isArray(errors) && errors.length > 0) {
|
if (Array.isArray(errors) && errors.length > 0) {
|
||||||
return formatVerificationTooltip(errors);
|
return errors
|
||||||
|
.map((e) => {
|
||||||
|
const prefix =
|
||||||
|
e.vrfcCd === "IMR"
|
||||||
|
? "시계열 검증 - "
|
||||||
|
: e.vrfcCd === "NV"
|
||||||
|
? "일반검증 - "
|
||||||
|
: "모집단 검증 - ";
|
||||||
|
return `${prefix}${e.rsnExpln}(검증 기준값: ${e.cmprCn} / 현재 입력값: ${e.nowCn})`;
|
||||||
|
})
|
||||||
|
.filter(Boolean)
|
||||||
|
.join("\n");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import { useStatisticsInputPendingNavigation } from '@/shared/lib/use-statistics
|
|||||||
import { statisticsInputSewSupplyRateApi } from '@/entities/statistics/api/input/statistics-input-sew-supply-rate-service';
|
import { statisticsInputSewSupplyRateApi } from '@/entities/statistics/api/input/statistics-input-sew-supply-rate-service';
|
||||||
import { statisticsInputPublicSewageFacilityApiService } from '@/entities/statistics/api/input/statistics-public-sewage-facility-input-service';
|
import { statisticsInputPublicSewageFacilityApiService } from '@/entities/statistics/api/input/statistics-public-sewage-facility-input-service';
|
||||||
import { statisticsApi } from '@/entities/statistics/api/statistics-service';
|
import { statisticsApi } from '@/entities/statistics/api/statistics-service';
|
||||||
import { callImrServiceWithRollbackOnFailure } from '@/components/util/input/call-imr-with-rollback';
|
|
||||||
import type {
|
import type {
|
||||||
PublicSewageFacilityRequestParams,
|
PublicSewageFacilityRequestParams,
|
||||||
PublicSewageFacilitySaveItem,
|
PublicSewageFacilitySaveItem,
|
||||||
@@ -53,11 +52,7 @@ import { fetchColumnGuidesRecord } from '@/components/util/grid/columnGuides';
|
|||||||
import { toGridRows } from '@/components/util/grid/gridFunction';
|
import { toGridRows } from '@/components/util/grid/gridFunction';
|
||||||
import { toExcelExportSearchContextFromSearchForm } from "@/components/util/gridExcelExport";
|
import { toExcelExportSearchContextFromSearchForm } from "@/components/util/gridExcelExport";
|
||||||
import { patchFooterVerificationByTab,patchVerificationFailedByTab } from '@/components/util/input/verification-failed-flag';
|
import { patchFooterVerificationByTab,patchVerificationFailedByTab } from '@/components/util/input/verification-failed-flag';
|
||||||
import {
|
import type { VerificationResultLikeMap } from '@/components/util/input/verification-result-display';
|
||||||
formatVerificationTooltip,
|
|
||||||
withNormalizedVerificationResult,
|
|
||||||
type VerificationResultLikeMap,
|
|
||||||
} from '@/components/util/input/verification-result-display';
|
|
||||||
import { nullableTrimmedString } from '@/components/util/input/nullableString';
|
import { nullableTrimmedString } from '@/components/util/input/nullableString';
|
||||||
import { useAdminStore } from '@/store/admin-store';
|
import { useAdminStore } from '@/store/admin-store';
|
||||||
import { useTabStore } from '@/store/tab-store';
|
import { useTabStore } from '@/store/tab-store';
|
||||||
@@ -443,13 +438,7 @@ const PublicSewageFacilityInp = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const imrResponse = await callImrServiceWithRollbackOnFailure(imrParam, {
|
const imrResponse = await statisticsApi.callImrService(imrParam);
|
||||||
statsYr: lastSearchedValues.year ?? '',
|
|
||||||
statsCd: statsCdForTab,
|
|
||||||
sewerBzmnCd: lastSearchedValues?.bsnmCd ?? '',
|
|
||||||
rollbackStatusCode: activeTabStatus?.lclgvSbmsnSttsCd ?? '',
|
|
||||||
mdfrUuid: userInfo.userUnqId,
|
|
||||||
});
|
|
||||||
if (imrResponse.job_id) {
|
if (imrResponse.job_id) {
|
||||||
await waitForImrJobCompleted(
|
await waitForImrJobCompleted(
|
||||||
imrResponse.job_id,
|
imrResponse.job_id,
|
||||||
@@ -800,13 +789,11 @@ const PublicSewageFacilityInp = () => {
|
|||||||
sidoListRef.current,
|
sidoListRef.current,
|
||||||
searchContext,
|
searchContext,
|
||||||
);
|
);
|
||||||
const convertedData = list.map((item) =>
|
const convertedData = list.map((item) => ({
|
||||||
withNormalizedVerificationResult({
|
|
||||||
ctpvNm: commonInfo.ctpvNm,
|
ctpvNm: commonInfo.ctpvNm,
|
||||||
...item,
|
...item,
|
||||||
rmrk: item.rmrk ?? null,
|
rmrk: item.rmrk ?? null,
|
||||||
}),
|
}));
|
||||||
);
|
|
||||||
|
|
||||||
if (list.length === 0) {
|
if (list.length === 0) {
|
||||||
setShowIsNotApplicable(true);
|
setShowIsNotApplicable(true);
|
||||||
@@ -1588,7 +1575,17 @@ const PublicSewageFacilityInp = () => {
|
|||||||
if (!verification) return;
|
if (!verification) return;
|
||||||
const errors = verification[fieldName];
|
const errors = verification[fieldName];
|
||||||
if (Array.isArray(errors) && errors.length > 0) {
|
if (Array.isArray(errors) && errors.length > 0) {
|
||||||
return formatVerificationTooltip(errors);
|
return errors
|
||||||
|
.map((e) => {
|
||||||
|
const prefix =
|
||||||
|
e.vrfcCd === "IMR" ? "시계열 검증 - " : (e.vrfcCd === "NV" ? "일반검증 - " : "모집단 검증 - ");
|
||||||
|
const comp = e.cmprCn ?? "";
|
||||||
|
const now = e.nowCn ?? "";
|
||||||
|
return `${prefix}${e.rsnExpln}
|
||||||
|
(검증 기준값: ${comp} / 현재 입력값: ${now})`;
|
||||||
|
})
|
||||||
|
.filter(Boolean)
|
||||||
|
.join("\n");
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
|||||||
import { statisticsInputPumpingStationApi } from "@/entities/statistics/api/input/statistics-input-pumping-station-service";
|
import { statisticsInputPumpingStationApi } from "@/entities/statistics/api/input/statistics-input-pumping-station-service";
|
||||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||||
import { callImrServiceWithRollbackOnFailure } from "@/components/util/input/call-imr-with-rollback";
|
|
||||||
import {
|
import {
|
||||||
PUMPING_STATION_STATS_CD,
|
PUMPING_STATION_STATS_CD,
|
||||||
type PumpingStationItem,
|
type PumpingStationItem,
|
||||||
@@ -76,11 +75,7 @@ import { toGridRows } from "@/components/util/grid/gridFunction";
|
|||||||
import { formatCompactYmdForGrid, toCompactYmdOrNull } from "@/components/util/grid/ymdFormat";
|
import { formatCompactYmdForGrid, toCompactYmdOrNull } from "@/components/util/grid/ymdFormat";
|
||||||
import { toExcelExportSearchContextFromSearchForm } from "@/components/util/gridExcelExport";
|
import { toExcelExportSearchContextFromSearchForm } from "@/components/util/gridExcelExport";
|
||||||
import { isVerificationFailedFromCommonInfo } from "@/components/util/input/verification-failed-flag";
|
import { isVerificationFailedFromCommonInfo } from "@/components/util/input/verification-failed-flag";
|
||||||
import {
|
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
|
||||||
formatVerificationTooltip,
|
|
||||||
normalizeVerificationResultMap,
|
|
||||||
type VerificationResultLikeMap,
|
|
||||||
} from "@/components/util/input/verification-result-display";
|
|
||||||
import { useAdminStore } from "@/store/admin-store";
|
import { useAdminStore } from "@/store/admin-store";
|
||||||
import { useTabStore } from "@/store/tab-store";
|
import { useTabStore } from "@/store/tab-store";
|
||||||
|
|
||||||
@@ -211,7 +206,7 @@ function mapPumpingStationListToGridRows(
|
|||||||
},
|
},
|
||||||
])[0] as GridRowWithVerification;
|
])[0] as GridRowWithVerification;
|
||||||
if (item.verificationResult) {
|
if (item.verificationResult) {
|
||||||
row.verificationResult = normalizeVerificationResultMap(item.verificationResult);
|
row.verificationResult = item.verificationResult;
|
||||||
}
|
}
|
||||||
return row;
|
return row;
|
||||||
});
|
});
|
||||||
@@ -498,9 +493,7 @@ const PumpingStationInp = () => {
|
|||||||
setStatusInfo(nextStatusInfo);
|
setStatusInfo(nextStatusInfo);
|
||||||
setStatsCd(commonInfo.statsCd);
|
setStatsCd(commonInfo.statsCd);
|
||||||
setIsVerificationFailed(isVerificationFailedFromCommonInfo(commonInfo));
|
setIsVerificationFailed(isVerificationFailedFromCommonInfo(commonInfo));
|
||||||
setFooterVerificationResult(
|
setFooterVerificationResult(commonInfo.verificationResult ?? null);
|
||||||
normalizeVerificationResultMap(commonInfo.verificationResult) ?? null,
|
|
||||||
);
|
|
||||||
if (overrides?.mode !== "PRE") {
|
if (overrides?.mode !== "PRE") {
|
||||||
setIsNotApplicable(gridRows.length === 0);
|
setIsNotApplicable(gridRows.length === 0);
|
||||||
} else if (gridRows.length > 0) {
|
} else if (gridRows.length > 0) {
|
||||||
@@ -803,13 +796,7 @@ const PumpingStationInp = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const imrResponse = await callImrServiceWithRollbackOnFailure(imrParam, {
|
const imrResponse = await statisticsApi.callImrService(imrParam);
|
||||||
statsYr: lastSearchedValues.year ?? "",
|
|
||||||
statsCd: statsCdForSubmit,
|
|
||||||
sewerBzmnCd: lastSearchedValues?.bsnmCd ?? "",
|
|
||||||
rollbackStatusCode: statusInfo?.lclgvSbmsnSttsCd ?? "",
|
|
||||||
mdfrUuid: userInfo.userUnqId,
|
|
||||||
});
|
|
||||||
if (imrResponse.job_id) {
|
if (imrResponse.job_id) {
|
||||||
await waitForImrJobCompleted(
|
await waitForImrJobCompleted(
|
||||||
imrResponse.job_id,
|
imrResponse.job_id,
|
||||||
@@ -948,7 +935,19 @@ const PumpingStationInp = () => {
|
|||||||
if (!verification) return;
|
if (!verification) return;
|
||||||
const errors = verification[fieldName];
|
const errors = verification[fieldName];
|
||||||
if (Array.isArray(errors) && errors.length > 0) {
|
if (Array.isArray(errors) && errors.length > 0) {
|
||||||
return formatVerificationTooltip(errors);
|
return errors
|
||||||
|
.map((e) => {
|
||||||
|
const prefix =
|
||||||
|
e.vrfcCd === "IMR"
|
||||||
|
? "시계열 검증 - "
|
||||||
|
: e.vrfcCd === "NV"
|
||||||
|
? "일반검증 - "
|
||||||
|
: "모집단 검증 -";
|
||||||
|
return `${prefix}${e.rsnExpln}
|
||||||
|
(검증 기준값: ${e.cmprCn} / 현재 입력값: ${e.nowCn})`;
|
||||||
|
})
|
||||||
|
.filter(Boolean)
|
||||||
|
.join("\n");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
|||||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||||
import { statisticsInputSewageExcretaRelatedApi } from "@/entities/statistics/api/input/statistics-input-sewage-excreta-related-service";
|
import { statisticsInputSewageExcretaRelatedApi } from "@/entities/statistics/api/input/statistics-input-sewage-excreta-related-service";
|
||||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||||
import { callImrServiceWithRollbackOnFailure } from "@/components/util/input/call-imr-with-rollback";
|
|
||||||
import type {
|
import type {
|
||||||
ExcretaRelatedIndustrySaveItem,
|
ExcretaRelatedIndustrySaveItem,
|
||||||
PrivateSewageTreatRelatedIndustrySaveItem,
|
PrivateSewageTreatRelatedIndustrySaveItem,
|
||||||
@@ -85,11 +84,7 @@ import {
|
|||||||
patchFooterVerificationByTab,
|
patchFooterVerificationByTab,
|
||||||
patchVerificationFailedByTab,
|
patchVerificationFailedByTab,
|
||||||
} from "@/components/util/input/verification-failed-flag";
|
} from "@/components/util/input/verification-failed-flag";
|
||||||
import {
|
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
|
||||||
formatVerificationTooltip,
|
|
||||||
normalizeVerificationResultMap,
|
|
||||||
type VerificationResultLikeMap,
|
|
||||||
} from "@/components/util/input/verification-result-display";
|
|
||||||
import { useAdminStore } from "@/store/admin-store";
|
import { useAdminStore } from "@/store/admin-store";
|
||||||
import { useTabStore } from "@/store/tab-store";
|
import { useTabStore } from "@/store/tab-store";
|
||||||
|
|
||||||
@@ -557,7 +552,19 @@ function verificationCellTooltip({
|
|||||||
if (!verification) return;
|
if (!verification) return;
|
||||||
const errors = verification[fieldName];
|
const errors = verification[fieldName];
|
||||||
if (Array.isArray(errors) && errors.length > 0) {
|
if (Array.isArray(errors) && errors.length > 0) {
|
||||||
return formatVerificationTooltip(errors);
|
return errors
|
||||||
|
.map((e) => {
|
||||||
|
const prefix =
|
||||||
|
e.vrfcCd === "IMR"
|
||||||
|
? "시계열 검증 - "
|
||||||
|
: e.vrfcCd === "NV"
|
||||||
|
? "일반검증 - "
|
||||||
|
: "모집단 검증 - ";
|
||||||
|
return `${prefix}${e.rsnExpln}
|
||||||
|
(검증 기준값: ${e.cmprCn} / 현재 입력값: ${e.nowCn})`;
|
||||||
|
})
|
||||||
|
.filter(Boolean)
|
||||||
|
.join("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -581,7 +588,7 @@ function mapListToGridRows<T extends { verificationResult?: SewageExcretaRelated
|
|||||||
return filterBySelectedAdmdstCd(list, sidoListRef.current, values).map((item) => {
|
return filterBySelectedAdmdstCd(list, sidoListRef.current, values).map((item) => {
|
||||||
const row = toGridRows([{ ctpvNm, ...item }])[0] as GridRowWithVerification;
|
const row = toGridRows([{ ctpvNm, ...item }])[0] as GridRowWithVerification;
|
||||||
if (item.verificationResult) {
|
if (item.verificationResult) {
|
||||||
row.verificationResult = normalizeVerificationResultMap(item.verificationResult);
|
row.verificationResult = item.verificationResult;
|
||||||
}
|
}
|
||||||
return row;
|
return row;
|
||||||
});
|
});
|
||||||
@@ -1496,13 +1503,7 @@ const SewageExcretaRelatedInp = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const imrResponse = await callImrServiceWithRollbackOnFailure(imrParam, {
|
const imrResponse = await statisticsApi.callImrService(imrParam);
|
||||||
statsYr: lastSearchedValues.year ?? "",
|
|
||||||
statsCd: statsCdForTab,
|
|
||||||
sewerBzmnCd: lastSearchedValues?.bsnmCd ?? "",
|
|
||||||
rollbackStatusCode: activeTabStatus?.lclgvSbmsnSttsCd ?? "",
|
|
||||||
mdfrUuid: userInfo.userUnqId,
|
|
||||||
});
|
|
||||||
if (imrResponse.job_id) {
|
if (imrResponse.job_id) {
|
||||||
await waitForImrJobCompleted(
|
await waitForImrJobCompleted(
|
||||||
imrResponse.job_id,
|
imrResponse.job_id,
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
|||||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||||
import { statisticsInputSewageExcretaSlurgeApi } from "@/entities/statistics/api/input/statistics-input-sewage-excreta-slurge-service";
|
import { statisticsInputSewageExcretaSlurgeApi } from "@/entities/statistics/api/input/statistics-input-sewage-excreta-slurge-service";
|
||||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||||
import { callImrServiceWithRollbackOnFailure } from "@/components/util/input/call-imr-with-rollback";
|
|
||||||
import type {
|
import type {
|
||||||
DigestorOperatingStatusSaveItem,
|
DigestorOperatingStatusSaveItem,
|
||||||
ExcretaSlurgeProcessingStatusSaveItem,
|
ExcretaSlurgeProcessingStatusSaveItem,
|
||||||
@@ -91,11 +90,7 @@ import {
|
|||||||
patchFooterVerificationByTab,
|
patchFooterVerificationByTab,
|
||||||
patchVerificationFailedByTab,
|
patchVerificationFailedByTab,
|
||||||
} from "@/components/util/input/verification-failed-flag";
|
} from "@/components/util/input/verification-failed-flag";
|
||||||
import {
|
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
|
||||||
formatVerificationTooltip,
|
|
||||||
normalizeVerificationResultMap,
|
|
||||||
type VerificationResultLikeMap,
|
|
||||||
} from "@/components/util/input/verification-result-display";
|
|
||||||
import { useAdminStore } from "@/store/admin-store";
|
import { useAdminStore } from "@/store/admin-store";
|
||||||
import { useTabStore } from "@/store/tab-store";
|
import { useTabStore } from "@/store/tab-store";
|
||||||
|
|
||||||
@@ -153,7 +148,19 @@ function verificationCellTooltip({
|
|||||||
if (!verification) return;
|
if (!verification) return;
|
||||||
const errors = verification[fieldName];
|
const errors = verification[fieldName];
|
||||||
if (Array.isArray(errors) && errors.length > 0) {
|
if (Array.isArray(errors) && errors.length > 0) {
|
||||||
return formatVerificationTooltip(errors);
|
return errors
|
||||||
|
.map((e) => {
|
||||||
|
const prefix =
|
||||||
|
e.vrfcCd === "IMR"
|
||||||
|
? "시계열 검증 - "
|
||||||
|
: e.vrfcCd === "NV"
|
||||||
|
? "일반검증 - "
|
||||||
|
: "모집단 검증 - ";
|
||||||
|
return `${prefix}${e.rsnExpln}
|
||||||
|
(검증 기준값: ${e.cmprCn} / 현재 입력값: ${e.nowCn})`;
|
||||||
|
})
|
||||||
|
.filter(Boolean)
|
||||||
|
.join("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -178,7 +185,7 @@ function mapListToGridRows<T extends { verificationResult?: SewageExcretaSlurgeV
|
|||||||
return filterBySelectedAdmdstCd(list, sidoListRef.current, values).map((item) => {
|
return filterBySelectedAdmdstCd(list, sidoListRef.current, values).map((item) => {
|
||||||
const row = toGridRows([{ ctpvNm, ...item }])[0] as GridRowWithVerification;
|
const row = toGridRows([{ ctpvNm, ...item }])[0] as GridRowWithVerification;
|
||||||
if (item.verificationResult) {
|
if (item.verificationResult) {
|
||||||
row.verificationResult = normalizeVerificationResultMap(item.verificationResult);
|
row.verificationResult = item.verificationResult;
|
||||||
}
|
}
|
||||||
return row;
|
return row;
|
||||||
});
|
});
|
||||||
@@ -1479,13 +1486,7 @@ const SewageExcretaSlurgeInp = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const imrResponse = await callImrServiceWithRollbackOnFailure(imrParam, {
|
const imrResponse = await statisticsApi.callImrService(imrParam);
|
||||||
statsYr: lastSearchedValues.year ?? "",
|
|
||||||
statsCd: statsCdForSubmit,
|
|
||||||
sewerBzmnCd: lastSearchedValues?.bsnmCd ?? "",
|
|
||||||
rollbackStatusCode: activeTabStatus?.lclgvSbmsnSttsCd ?? "",
|
|
||||||
mdfrUuid: userInfo.userUnqId,
|
|
||||||
});
|
|
||||||
if (imrResponse.job_id) {
|
if (imrResponse.job_id) {
|
||||||
await waitForImrJobCompleted(
|
await waitForImrJobCompleted(
|
||||||
imrResponse.job_id,
|
imrResponse.job_id,
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import {
|
|||||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||||
import { statisticsInputSewPipeApiService } from "@/entities/statistics/api/input/statistics-sewage-pipe-input-service";
|
import { statisticsInputSewPipeApiService } from "@/entities/statistics/api/input/statistics-sewage-pipe-input-service";
|
||||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||||
import { callImrServiceWithRollbackOnFailure } from "@/components/util/input/call-imr-with-rollback";
|
|
||||||
import type {
|
import type {
|
||||||
SeweragePipeInputFactInstallStatusSaveRequest,
|
SeweragePipeInputFactInstallStatusSaveRequest,
|
||||||
SeweragePipeInputFactInstallStatusSubmitRequest,
|
SeweragePipeInputFactInstallStatusSubmitRequest,
|
||||||
@@ -83,10 +82,7 @@ import {
|
|||||||
} from "@/components/util/input/verification-failed-flag";
|
} from "@/components/util/input/verification-failed-flag";
|
||||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||||
import {
|
import {
|
||||||
formatVerificationTooltip,
|
|
||||||
getVerificationErrorsForField,
|
getVerificationErrorsForField,
|
||||||
normalizeVerificationResultMap,
|
|
||||||
withNormalizedVerificationResult,
|
|
||||||
type VerificationResultLikeMap,
|
type VerificationResultLikeMap,
|
||||||
} from "@/components/util/input/verification-result-display";
|
} from "@/components/util/input/verification-result-display";
|
||||||
import { useAdminStore } from "@/store/admin-store";
|
import { useAdminStore } from "@/store/admin-store";
|
||||||
@@ -293,10 +289,7 @@ function normalizePipeTypeStatusRow(
|
|||||||
lyngPrlg: Number(lyngPrlgWhol ?? 0),
|
lyngPrlg: Number(lyngPrlgWhol ?? 0),
|
||||||
dmltnPrlg: Number(dmltnPrlgWhol ?? 0),
|
dmltnPrlg: Number(dmltnPrlgWhol ?? 0),
|
||||||
...yearFields,
|
...yearFields,
|
||||||
verificationResult:
|
verificationResult: remapPipeTypePrlgWholVerification(verificationResult) ?? undefined,
|
||||||
normalizeVerificationResultMap(
|
|
||||||
remapPipeTypePrlgWholVerification(verificationResult),
|
|
||||||
) ?? undefined,
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -726,12 +719,10 @@ const SewagePipeInp = () => {
|
|||||||
const response = await statisticsInputSewPipeApiService.getRegionalFactStatus(searchParam);
|
const response = await statisticsInputSewPipeApiService.getRegionalFactStatus(searchParam);
|
||||||
if (response.status === 'success') {
|
if (response.status === 'success') {
|
||||||
const commonInfo = response.data.commonInfo;
|
const commonInfo = response.data.commonInfo;
|
||||||
const convertedData = filterFetched(response.data.regionalFactStatusList).map((d) =>
|
const convertedData = filterFetched(response.data.regionalFactStatusList).map((d) => ({
|
||||||
withNormalizedVerificationResult({
|
|
||||||
ctpvNm: commonInfo.ctpvNm,
|
ctpvNm: commonInfo.ctpvNm,
|
||||||
...d,
|
...d,
|
||||||
}),
|
}));
|
||||||
);
|
|
||||||
applyRowMap((m) => m.set('ST00020001', toGridRows(convertedData)));
|
applyRowMap((m) => m.set('ST00020001', toGridRows(convertedData)));
|
||||||
setTabStatusInfoMap((prev) => new Map(prev).set(tabKey, response.data.statusInfo));
|
setTabStatusInfoMap((prev) => new Map(prev).set(tabKey, response.data.statusInfo));
|
||||||
setTabStatsCdMap((prev) => new Map(prev).set(tabKey, commonInfo.statsCd));
|
setTabStatsCdMap((prev) => new Map(prev).set(tabKey, commonInfo.statsCd));
|
||||||
@@ -758,12 +749,10 @@ const SewagePipeInp = () => {
|
|||||||
const response = await statisticsInputSewPipeApiService.getFactInstallStatus(searchParam);
|
const response = await statisticsInputSewPipeApiService.getFactInstallStatus(searchParam);
|
||||||
if (response.status === 'success') {
|
if (response.status === 'success') {
|
||||||
const commonInfo = response.data.commonInfo;
|
const commonInfo = response.data.commonInfo;
|
||||||
const convertedData = filterFetched(response.data.factInstallStatusList).map((d) =>
|
const convertedData = filterFetched(response.data.factInstallStatusList).map((d) => ({
|
||||||
withNormalizedVerificationResult({
|
|
||||||
ctpvNm: commonInfo.ctpvNm,
|
ctpvNm: commonInfo.ctpvNm,
|
||||||
...d,
|
...d,
|
||||||
}),
|
}));
|
||||||
);
|
|
||||||
if (convertedData.length === 0) {
|
if (convertedData.length === 0) {
|
||||||
const alreadyHandledForSameSearch =
|
const alreadyHandledForSameSearch =
|
||||||
factInstallNoDataHandledKeyRef.current === searchConditionKey;
|
factInstallNoDataHandledKeyRef.current === searchConditionKey;
|
||||||
@@ -840,12 +829,10 @@ const SewagePipeInp = () => {
|
|||||||
const response = await statisticsInputSewPipeApiService.getPipeDiameterStatus(searchParam);
|
const response = await statisticsInputSewPipeApiService.getPipeDiameterStatus(searchParam);
|
||||||
if (response.status === 'success') {
|
if (response.status === 'success') {
|
||||||
const commonInfo = response.data.commonInfo;
|
const commonInfo = response.data.commonInfo;
|
||||||
const convertedData = filterFetched(response.data.pipeDiameterStatusList).map((d) =>
|
const convertedData = filterFetched(response.data.pipeDiameterStatusList).map((d) => ({
|
||||||
withNormalizedVerificationResult({
|
|
||||||
ctpvNm: commonInfo.ctpvNm,
|
ctpvNm: commonInfo.ctpvNm,
|
||||||
...d,
|
...d,
|
||||||
}),
|
}));
|
||||||
);
|
|
||||||
applyRowMap((m) => m.set('ST00020004', toGridRows(convertedData)));
|
applyRowMap((m) => m.set('ST00020004', toGridRows(convertedData)));
|
||||||
setTabStatusInfoMap((prev) => new Map(prev).set(tabKey, response.data.statusInfo));
|
setTabStatusInfoMap((prev) => new Map(prev).set(tabKey, response.data.statusInfo));
|
||||||
setTabStatsCdMap((prev) => new Map(prev).set(tabKey, commonInfo.statsCd));
|
setTabStatsCdMap((prev) => new Map(prev).set(tabKey, commonInfo.statsCd));
|
||||||
@@ -872,12 +859,10 @@ const SewagePipeInp = () => {
|
|||||||
const response = await statisticsInputSewPipeApiService.getManholeStatus(searchParam);
|
const response = await statisticsInputSewPipeApiService.getManholeStatus(searchParam);
|
||||||
if (response.status === 'success') {
|
if (response.status === 'success') {
|
||||||
const commonInfo = response.data.commonInfo;
|
const commonInfo = response.data.commonInfo;
|
||||||
const convertedData = filterFetched(response.data.manholeStatusList).map((d) =>
|
const convertedData = filterFetched(response.data.manholeStatusList).map((d) => ({
|
||||||
withNormalizedVerificationResult({
|
|
||||||
ctpvNm: commonInfo.ctpvNm,
|
ctpvNm: commonInfo.ctpvNm,
|
||||||
...d,
|
...d,
|
||||||
}),
|
}));
|
||||||
);
|
|
||||||
applyRowMap((m) => m.set('ST00020005', toGridRows(convertedData)));
|
applyRowMap((m) => m.set('ST00020005', toGridRows(convertedData)));
|
||||||
setTabStatusInfoMap((prev) => new Map(prev).set(tabKey, response.data.statusInfo));
|
setTabStatusInfoMap((prev) => new Map(prev).set(tabKey, response.data.statusInfo));
|
||||||
setTabStatsCdMap((prev) => new Map(prev).set(tabKey, commonInfo.statsCd));
|
setTabStatsCdMap((prev) => new Map(prev).set(tabKey, commonInfo.statsCd));
|
||||||
@@ -904,15 +889,13 @@ const SewagePipeInp = () => {
|
|||||||
const response = await statisticsInputSewPipeApiService.getConnectionStatus(searchParam);
|
const response = await statisticsInputSewPipeApiService.getConnectionStatus(searchParam);
|
||||||
if (response.status === 'success') {
|
if (response.status === 'success') {
|
||||||
const commonInfo = response.data.commonInfo;
|
const commonInfo = response.data.commonInfo;
|
||||||
const facilityConvertedData = filterFetched(response.data.facilityConnectionList).map((d) =>
|
const facilityConvertedData = filterFetched(response.data.facilityConnectionList).map((d) => ({
|
||||||
withNormalizedVerificationResult({ ...d }),
|
...d,
|
||||||
);
|
}));
|
||||||
const adminConvertedData = filterFetched(response.data.adminAreaConnectionList).map((d) =>
|
const adminConvertedData = filterFetched(response.data.adminAreaConnectionList).map((d) => ({
|
||||||
withNormalizedVerificationResult({
|
|
||||||
...d,
|
...d,
|
||||||
ctpvNm: d.ctpvNm || commonInfo.ctpvNm,
|
ctpvNm: d.ctpvNm || commonInfo.ctpvNm,
|
||||||
}),
|
}));
|
||||||
);
|
|
||||||
applyRowMap((m) => {
|
applyRowMap((m) => {
|
||||||
m.set('treatmentPlantConnectionInp', toGridRows(facilityConvertedData));
|
m.set('treatmentPlantConnectionInp', toGridRows(facilityConvertedData));
|
||||||
m.set('adminAreaConnectionInp', toGridRows(adminConvertedData));
|
m.set('adminAreaConnectionInp', toGridRows(adminConvertedData));
|
||||||
@@ -1355,6 +1338,7 @@ const SewagePipeInp = () => {
|
|||||||
rmrk: nullableTrimmedString(d.rmrk),
|
rmrk: nullableTrimmedString(d.rmrk),
|
||||||
lyngPrlgWhol: formatNumber(d.lyngPrlg, "lyngPrlg"),
|
lyngPrlgWhol: formatNumber(d.lyngPrlg, "lyngPrlg"),
|
||||||
dmltnPrlgWhol: formatNumber(d.dmltnPrlg, "dmltnPrlg"),
|
dmltnPrlgWhol: formatNumber(d.dmltnPrlg, "dmltnPrlg"),
|
||||||
|
pipeByPrstWhol: formatNumber(d.pipeByPrstWhol, "pipeByPrstWhol"),
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
const requestData: SeweragePipeInputPipeTypeStatusSubmitRequest = {
|
const requestData: SeweragePipeInputPipeTypeStatusSubmitRequest = {
|
||||||
@@ -1471,13 +1455,7 @@ const SewagePipeInp = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const imrResponse = await callImrServiceWithRollbackOnFailure(imrParam, {
|
const imrResponse = await statisticsApi.callImrService(imrParam);
|
||||||
statsYr: values.year ?? "",
|
|
||||||
statsCd: statsCdForTab,
|
|
||||||
sewerBzmnCd: values?.bsnmCd ?? "",
|
|
||||||
rollbackStatusCode: statusForTab?.lclgvSbmsnSttsCd ?? "",
|
|
||||||
mdfrUuid: userInfo.userUnqId,
|
|
||||||
});
|
|
||||||
if (imrResponse.job_id) {
|
if (imrResponse.job_id) {
|
||||||
await waitForImrJobCompleted(
|
await waitForImrJobCompleted(
|
||||||
imrResponse.job_id,
|
imrResponse.job_id,
|
||||||
@@ -1852,6 +1830,7 @@ const SewagePipeInp = () => {
|
|||||||
rmrk: nullableTrimmedString(d.rmrk),
|
rmrk: nullableTrimmedString(d.rmrk),
|
||||||
lyngPrlgWhol: formatNumber(d.lyngPrlg, "lyngPrlg"),
|
lyngPrlgWhol: formatNumber(d.lyngPrlg, "lyngPrlg"),
|
||||||
dmltnPrlgWhol: formatNumber(d.dmltnPrlg, "dmltnPrlg"),
|
dmltnPrlgWhol: formatNumber(d.dmltnPrlg, "dmltnPrlg"),
|
||||||
|
pipeByPrstWhol: formatNumber(d.pipeByPrstWhol, "pipeByPrstWhol"),
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -2258,7 +2237,17 @@ const SewagePipeInp = () => {
|
|||||||
tabKey,
|
tabKey,
|
||||||
);
|
);
|
||||||
if (Array.isArray(errors) && errors.length > 0) {
|
if (Array.isArray(errors) && errors.length > 0) {
|
||||||
return formatVerificationTooltip(errors);
|
return errors
|
||||||
|
.map((e) => {
|
||||||
|
const prefix =
|
||||||
|
e.vrfcCd === "IMR" ? "시계열 검증 - " : (e.vrfcCd === "NV" ? "일반검증 - " : "모집단 검증 - ");
|
||||||
|
const comp = e.cmprCn ?? "";
|
||||||
|
const now = e.nowCn ?? "";
|
||||||
|
return `${prefix}${e.rsnExpln}
|
||||||
|
(검증 기준값: ${comp} / 현재 입력값: ${now})`;
|
||||||
|
})
|
||||||
|
.filter(Boolean)
|
||||||
|
.join("\n");
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
|
|||||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||||
import { sewagePipeMaintainApiService } from "@/entities/statistics/api/input/statistics-input-sewage-pipe-maintain-service";
|
import { sewagePipeMaintainApiService } from "@/entities/statistics/api/input/statistics-input-sewage-pipe-maintain-service";
|
||||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||||
import { callImrServiceWithRollbackOnFailure } from "@/components/util/input/call-imr-with-rollback";
|
|
||||||
import type {
|
import type {
|
||||||
SewagePipeMaintainDredgingSaveItem,
|
SewagePipeMaintainDredgingSaveItem,
|
||||||
SewagePipeMaintainDredgingSaveRequest,
|
SewagePipeMaintainDredgingSaveRequest,
|
||||||
@@ -70,11 +69,7 @@ import {
|
|||||||
patchFooterVerificationByTab,
|
patchFooterVerificationByTab,
|
||||||
patchVerificationFailedByTab,
|
patchVerificationFailedByTab,
|
||||||
} from "@/components/util/input/verification-failed-flag";
|
} from "@/components/util/input/verification-failed-flag";
|
||||||
import {
|
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
|
||||||
formatVerificationTooltip,
|
|
||||||
withNormalizedVerificationResult,
|
|
||||||
type VerificationResultLikeMap,
|
|
||||||
} from "@/components/util/input/verification-result-display";
|
|
||||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||||
import { useAdminStore } from "@/store/admin-store";
|
import { useAdminStore } from "@/store/admin-store";
|
||||||
import { useStatisticsInputFocusStore } from "@/store/statistics-input-focus-store";
|
import { useStatisticsInputFocusStore } from "@/store/statistics-input-focus-store";
|
||||||
@@ -449,12 +444,10 @@ const SewagePipeMaintainInp = () => {
|
|||||||
repairStatusList ?? [],
|
repairStatusList ?? [],
|
||||||
sidoListRef.current,
|
sidoListRef.current,
|
||||||
searchContext,
|
searchContext,
|
||||||
).map((d) =>
|
).map((d) => ({
|
||||||
withNormalizedVerificationResult({
|
|
||||||
ctpvNm: commonInfo.ctpvNm,
|
ctpvNm: commonInfo.ctpvNm,
|
||||||
...d,
|
...d,
|
||||||
}),
|
}));
|
||||||
);
|
|
||||||
const gridRows = toGridRows(convertedData);
|
const gridRows = toGridRows(convertedData);
|
||||||
|
|
||||||
applyRowMap(mergeIntoExistingMap, (m) => {
|
applyRowMap(mergeIntoExistingMap, (m) => {
|
||||||
@@ -494,12 +487,10 @@ const SewagePipeMaintainInp = () => {
|
|||||||
pipeDredgingStatusList ?? [],
|
pipeDredgingStatusList ?? [],
|
||||||
sidoListRef.current,
|
sidoListRef.current,
|
||||||
searchContext,
|
searchContext,
|
||||||
).map((d) =>
|
).map((d) => ({
|
||||||
withNormalizedVerificationResult({
|
|
||||||
ctpvNm: commonInfo.ctpvNm,
|
ctpvNm: commonInfo.ctpvNm,
|
||||||
...d,
|
...d,
|
||||||
}),
|
}));
|
||||||
);
|
|
||||||
const gridRows = toGridRows(convertedData);
|
const gridRows = toGridRows(convertedData);
|
||||||
|
|
||||||
applyRowMap(mergeIntoExistingMap, (m) => {
|
applyRowMap(mergeIntoExistingMap, (m) => {
|
||||||
@@ -687,13 +678,7 @@ const SewagePipeMaintainInp = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const imrResponse = await callImrServiceWithRollbackOnFailure(imrParam, {
|
const imrResponse = await statisticsApi.callImrService(imrParam);
|
||||||
statsYr: lastSearchedValues.year ?? "",
|
|
||||||
statsCd: statsCdForTab,
|
|
||||||
sewerBzmnCd: lastSearchedValues?.bsnmCd ?? "",
|
|
||||||
rollbackStatusCode: activeTabStatus?.lclgvSbmsnSttsCd ?? "",
|
|
||||||
mdfrUuid: userInfo.userUnqId,
|
|
||||||
});
|
|
||||||
if (imrResponse.job_id) {
|
if (imrResponse.job_id) {
|
||||||
await waitForImrJobCompleted(
|
await waitForImrJobCompleted(
|
||||||
imrResponse.job_id,
|
imrResponse.job_id,
|
||||||
@@ -1118,7 +1103,14 @@ const SewagePipeMaintainInp = () => {
|
|||||||
if (!verification) return;
|
if (!verification) return;
|
||||||
const errors = verification[fieldName];
|
const errors = verification[fieldName];
|
||||||
if (Array.isArray(errors) && errors.length > 0) {
|
if (Array.isArray(errors) && errors.length > 0) {
|
||||||
return formatVerificationTooltip(errors);
|
return errors
|
||||||
|
.map((e) => {
|
||||||
|
const prefix =
|
||||||
|
e.vrfcCd === "IMR" ? "시계열 검증 - " : e.vrfcCd === "NV" ? "일반검증 - " : "모집단 검증 - ";
|
||||||
|
return `${prefix}${e.rsnExpln}(검증 기준값: ${e.cmprCn} / 현재 입력값: ${e.nowCn})`;
|
||||||
|
})
|
||||||
|
.filter(Boolean)
|
||||||
|
.join("\n");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
|||||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||||
import { statisticsInputSewageReservoirPumpApi } from "@/entities/statistics/api/input/statistics-input-sewage-reservoir-pump-service";
|
import { statisticsInputSewageReservoirPumpApi } from "@/entities/statistics/api/input/statistics-input-sewage-reservoir-pump-service";
|
||||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||||
import { callImrServiceWithRollbackOnFailure } from "@/components/util/input/call-imr-with-rollback";
|
|
||||||
import {
|
import {
|
||||||
type RainfallPumpStationItem,
|
type RainfallPumpStationItem,
|
||||||
type RainfallPumpStationSaveItem,
|
type RainfallPumpStationSaveItem,
|
||||||
@@ -90,11 +89,7 @@ import {
|
|||||||
patchFooterVerificationByTab,
|
patchFooterVerificationByTab,
|
||||||
patchVerificationFailedByTab,
|
patchVerificationFailedByTab,
|
||||||
} from "@/components/util/input/verification-failed-flag";
|
} from "@/components/util/input/verification-failed-flag";
|
||||||
import {
|
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
|
||||||
formatVerificationTooltip,
|
|
||||||
normalizeVerificationResultMap,
|
|
||||||
type VerificationResultLikeMap,
|
|
||||||
} from "@/components/util/input/verification-result-display";
|
|
||||||
import { useAdminStore } from "@/store/admin-store";
|
import { useAdminStore } from "@/store/admin-store";
|
||||||
import { useTabStore } from "@/store/tab-store";
|
import { useTabStore } from "@/store/tab-store";
|
||||||
|
|
||||||
@@ -284,7 +279,7 @@ function mapSewageReservoirListToGridRows(
|
|||||||
},
|
},
|
||||||
])[0] as GridRowWithVerification;
|
])[0] as GridRowWithVerification;
|
||||||
if (item.verificationResult) {
|
if (item.verificationResult) {
|
||||||
row.verificationResult = normalizeVerificationResultMap(item.verificationResult);
|
row.verificationResult = item.verificationResult;
|
||||||
}
|
}
|
||||||
return row;
|
return row;
|
||||||
});
|
});
|
||||||
@@ -440,7 +435,7 @@ function mapRainfallPumpStationListToGridRows(
|
|||||||
])[0] as GridRowWithVerification;
|
])[0] as GridRowWithVerification;
|
||||||
|
|
||||||
if (item.verificationResult) {
|
if (item.verificationResult) {
|
||||||
row.verificationResult = normalizeVerificationResultMap(item.verificationResult);
|
row.verificationResult = item.verificationResult;
|
||||||
}
|
}
|
||||||
return row;
|
return row;
|
||||||
});
|
});
|
||||||
@@ -869,13 +864,7 @@ const SewageReservoirPumpInp = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const imrResponse = await callImrServiceWithRollbackOnFailure(imrParam, {
|
const imrResponse = await statisticsApi.callImrService(imrParam);
|
||||||
statsYr: lastSearchedValues.year ?? "",
|
|
||||||
statsCd: statsCdForTab,
|
|
||||||
sewerBzmnCd: lastSearchedValues?.bsnmCd ?? "",
|
|
||||||
rollbackStatusCode: activeTabStatus?.lclgvSbmsnSttsCd ?? "",
|
|
||||||
mdfrUuid: userInfo.userUnqId,
|
|
||||||
});
|
|
||||||
if (imrResponse.job_id) {
|
if (imrResponse.job_id) {
|
||||||
await waitForImrJobCompleted(
|
await waitForImrJobCompleted(
|
||||||
imrResponse.job_id,
|
imrResponse.job_id,
|
||||||
@@ -1527,7 +1516,19 @@ const SewageReservoirPumpInp = () => {
|
|||||||
if (!verification) return;
|
if (!verification) return;
|
||||||
const errors = verification[fieldName];
|
const errors = verification[fieldName];
|
||||||
if (Array.isArray(errors) && errors.length > 0) {
|
if (Array.isArray(errors) && errors.length > 0) {
|
||||||
return formatVerificationTooltip(errors);
|
return errors
|
||||||
|
.map((e) => {
|
||||||
|
const prefix =
|
||||||
|
e.vrfcCd === "IMR"
|
||||||
|
? "시계열 검증 - "
|
||||||
|
: e.vrfcCd === "NV"
|
||||||
|
? "일반검증 - "
|
||||||
|
: "모집단 검증 -";
|
||||||
|
return `${prefix}${e.rsnExpln}
|
||||||
|
(검증 기준값: ${e.cmprCn} / 현재 입력값: ${e.nowCn})`;
|
||||||
|
})
|
||||||
|
.filter(Boolean)
|
||||||
|
.join("\n");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import { useStatisticsInputPendingNavigation } from "@/shared/lib/use-statistics
|
|||||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||||
import { statisticsInputSewerageFinanceApi } from "@/entities/statistics/api/input/statistics-input-sewerage-finance-service";
|
import { statisticsInputSewerageFinanceApi } from "@/entities/statistics/api/input/statistics-input-sewerage-finance-service";
|
||||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||||
import { callImrServiceWithRollbackOnFailure } from "@/components/util/input/call-imr-with-rollback";
|
|
||||||
import type {
|
import type {
|
||||||
CauserBurdenItem,
|
CauserBurdenItem,
|
||||||
CauserBurdenSaveItem,
|
CauserBurdenSaveItem,
|
||||||
@@ -74,11 +73,7 @@ import {
|
|||||||
patchFooterVerificationByTab,
|
patchFooterVerificationByTab,
|
||||||
patchVerificationFailedByTab,
|
patchVerificationFailedByTab,
|
||||||
} from "@/components/util/input/verification-failed-flag";
|
} from "@/components/util/input/verification-failed-flag";
|
||||||
import {
|
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
|
||||||
formatVerificationTooltip,
|
|
||||||
normalizeVerificationResultMap,
|
|
||||||
type VerificationResultLikeMap,
|
|
||||||
} from "@/components/util/input/verification-result-display";
|
|
||||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||||
import { useAdminStore } from "@/store/admin-store";
|
import { useAdminStore } from "@/store/admin-store";
|
||||||
import { useTabStore } from "@/store/tab-store";
|
import { useTabStore } from "@/store/tab-store";
|
||||||
@@ -179,9 +174,7 @@ function mapRegionalListToGridRows<
|
|||||||
return filterBySelectedAdmdstCd(list, sidoListRef.current, values).map((item) => {
|
return filterBySelectedAdmdstCd(list, sidoListRef.current, values).map((item) => {
|
||||||
const { verificationResult, ...rest } = item;
|
const { verificationResult, ...rest } = item;
|
||||||
const row = toGridRows([{ ctpvNm, ...rest }])[0] as GridRowWithVerification;
|
const row = toGridRows([{ ctpvNm, ...rest }])[0] as GridRowWithVerification;
|
||||||
if (verificationResult) {
|
if (verificationResult) row.verificationResult = verificationResult;
|
||||||
row.verificationResult = normalizeVerificationResultMap(verificationResult);
|
|
||||||
}
|
|
||||||
return row;
|
return row;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -947,13 +940,7 @@ const SewerageFinanceInp = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const imrResponse = await callImrServiceWithRollbackOnFailure(imrParam, {
|
const imrResponse = await statisticsApi.callImrService(imrParam);
|
||||||
statsYr: lastSearchedValues.year ?? "",
|
|
||||||
statsCd: statsCdForTab,
|
|
||||||
sewerBzmnCd: lastSearchedValues?.bsnmCd ?? "",
|
|
||||||
rollbackStatusCode: activeTabStatus?.lclgvSbmsnSttsCd ?? "",
|
|
||||||
mdfrUuid: userInfo.userUnqId,
|
|
||||||
});
|
|
||||||
if (imrResponse.job_id) {
|
if (imrResponse.job_id) {
|
||||||
await waitForImrJobCompleted(
|
await waitForImrJobCompleted(
|
||||||
imrResponse.job_id,
|
imrResponse.job_id,
|
||||||
@@ -1228,7 +1215,18 @@ const SewerageFinanceInp = () => {
|
|||||||
if (!verification) return;
|
if (!verification) return;
|
||||||
const errors = verification[fieldName];
|
const errors = verification[fieldName];
|
||||||
if (Array.isArray(errors) && errors.length > 0) {
|
if (Array.isArray(errors) && errors.length > 0) {
|
||||||
return formatVerificationTooltip(errors);
|
return errors
|
||||||
|
.map((e) => {
|
||||||
|
const prefix =
|
||||||
|
e.vrfcCd === "IMR"
|
||||||
|
? "시계열 검증 - "
|
||||||
|
: e.vrfcCd === "NV"
|
||||||
|
? "일반검증 - "
|
||||||
|
: "모집단 검증 - ";
|
||||||
|
return `${prefix}${e.rsnExpln}(검증 기준값: ${e.cmprCn} / 현재 입력값: ${e.nowCn})`;
|
||||||
|
})
|
||||||
|
.filter(Boolean)
|
||||||
|
.join("\n");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import {
|
|||||||
import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
|
import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
|
||||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||||
import { callImrServiceWithRollbackOnFailure } from "@/components/util/input/call-imr-with-rollback";
|
|
||||||
import {
|
import {
|
||||||
type CheckInputPeriodItem,
|
type CheckInputPeriodItem,
|
||||||
getVerificationPeriodActionBlockedMessage,
|
getVerificationPeriodActionBlockedMessage,
|
||||||
@@ -59,11 +58,7 @@ import { toGridRows } from "@/components/util/grid/gridFunction";
|
|||||||
import { toExcelExportSearchContextFromSearchForm } from "@/components/util/gridExcelExport";
|
import { toExcelExportSearchContextFromSearchForm } from "@/components/util/gridExcelExport";
|
||||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||||
import { isVerificationFailedFromCommonInfo } from "@/components/util/input/verification-failed-flag";
|
import { isVerificationFailedFromCommonInfo } from "@/components/util/input/verification-failed-flag";
|
||||||
import {
|
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
|
||||||
formatVerificationTooltip,
|
|
||||||
normalizeVerificationResultMap,
|
|
||||||
type VerificationResultLikeMap,
|
|
||||||
} from "@/components/util/input/verification-result-display";
|
|
||||||
import { useAdminStore } from "@/store/admin-store";
|
import { useAdminStore } from "@/store/admin-store";
|
||||||
import { useStatisticsInputFocusStore } from "@/store/statistics-input-focus-store";
|
import { useStatisticsInputFocusStore } from "@/store/statistics-input-focus-store";
|
||||||
import { useTabStore } from "@/store/tab-store";
|
import { useTabStore } from "@/store/tab-store";
|
||||||
@@ -92,7 +87,7 @@ const remapCommonInfoVerificationToGridFields = (
|
|||||||
// API 키로도 조회 가능하도록 유지
|
// API 키로도 조회 가능하도록 유지
|
||||||
if (gridField !== key) remapped[key] = errors;
|
if (gridField !== key) remapped[key] = errors;
|
||||||
}
|
}
|
||||||
return normalizeVerificationResultMap(remapped) ?? remapped;
|
return remapped;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** 컬럼 가이드 API 조회용 통계코드 (하수도 보급률) */
|
/** 컬럼 가이드 API 조회용 통계코드 (하수도 보급률) */
|
||||||
@@ -307,11 +302,7 @@ const SeweragePenetrationRateInp = () => {
|
|||||||
setRowData(
|
setRowData(
|
||||||
convertedData.map((d) => {
|
convertedData.map((d) => {
|
||||||
const row = toGridRows([d])[0] as GridRowWithVerification;
|
const row = toGridRows([d])[0] as GridRowWithVerification;
|
||||||
if (d.verificationResult) {
|
if (d.verificationResult) row.verificationResult = d.verificationResult;
|
||||||
row.verificationResult = normalizeVerificationResultMap(
|
|
||||||
d.verificationResult,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return row;
|
return row;
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
@@ -567,13 +558,7 @@ const SeweragePenetrationRateInp = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const imrResponse = await callImrServiceWithRollbackOnFailure(imrParam, {
|
const imrResponse = await statisticsApi.callImrService(imrParam);
|
||||||
statsYr: searchValues?.year ?? "",
|
|
||||||
statsCd,
|
|
||||||
sewerBzmnCd: searchValues?.bsnmCd ?? "",
|
|
||||||
rollbackStatusCode: statusInfo?.lclgvSbmsnSttsCd ?? "",
|
|
||||||
mdfrUuid: userInfo.userUnqId,
|
|
||||||
});
|
|
||||||
if (imrResponse.job_id) {
|
if (imrResponse.job_id) {
|
||||||
await waitForImrJobCompleted(imrResponse.job_id, (id) =>
|
await waitForImrJobCompleted(imrResponse.job_id, (id) =>
|
||||||
statisticsApi.getImrStatus(id),
|
statisticsApi.getImrStatus(id),
|
||||||
@@ -882,7 +867,14 @@ const SeweragePenetrationRateInp = () => {
|
|||||||
if (!verification) return;
|
if (!verification) return;
|
||||||
const errors = verification[fieldName];
|
const errors = verification[fieldName];
|
||||||
if (Array.isArray(errors) && errors.length > 0) {
|
if (Array.isArray(errors) && errors.length > 0) {
|
||||||
return formatVerificationTooltip(errors);
|
return errors
|
||||||
|
.map((e) => {
|
||||||
|
const prefix = e.vrfcCd === 'IMR' ? '시계열 검증 - ' : (e.vrfcCd === 'NV' ? '일반검증 - ' : '모집단 검증 -');
|
||||||
|
return `${prefix}${e.rsnExpln}
|
||||||
|
(검증 기준값: ${e.cmprCn} / 현재 입력값: ${e.nowCn})`;
|
||||||
|
})
|
||||||
|
.filter(Boolean)
|
||||||
|
.join('\n');
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
|
|||||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||||
import { statisticsInputSewerageServiceLevelApi } from "@/entities/statistics/api/input/statistics-input-sewerage-service-level-service";
|
import { statisticsInputSewerageServiceLevelApi } from "@/entities/statistics/api/input/statistics-input-sewerage-service-level-service";
|
||||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||||
import { callImrServiceWithRollbackOnFailure } from "@/components/util/input/call-imr-with-rollback";
|
|
||||||
import {
|
import {
|
||||||
SEWERAGE_SERVICE_LEVEL_COMPLAINT_STATS_CD,
|
SEWERAGE_SERVICE_LEVEL_COMPLAINT_STATS_CD,
|
||||||
SEWERAGE_SERVICE_LEVEL_RESIDENT_FRIENDLY_FACT_STATS_CD,
|
SEWERAGE_SERVICE_LEVEL_RESIDENT_FRIENDLY_FACT_STATS_CD,
|
||||||
@@ -64,11 +63,7 @@ import {
|
|||||||
patchFooterVerificationByTab,
|
patchFooterVerificationByTab,
|
||||||
patchVerificationFailedByTab,
|
patchVerificationFailedByTab,
|
||||||
} from "@/components/util/input/verification-failed-flag";
|
} from "@/components/util/input/verification-failed-flag";
|
||||||
import {
|
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
|
||||||
formatVerificationTooltip,
|
|
||||||
normalizeVerificationResultMap,
|
|
||||||
type VerificationResultLikeMap,
|
|
||||||
} from "@/components/util/input/verification-result-display";
|
|
||||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||||
import { useAdminStore } from "@/store/admin-store";
|
import { useAdminStore } from "@/store/admin-store";
|
||||||
import { useTabStore } from "@/store/tab-store";
|
import { useTabStore } from "@/store/tab-store";
|
||||||
@@ -192,9 +187,7 @@ function mapServiceLevelListToGridRows<
|
|||||||
return filterBySelectedAdmdstCd(list, sidoListRef.current, values).map((item) => {
|
return filterBySelectedAdmdstCd(list, sidoListRef.current, values).map((item) => {
|
||||||
const { verificationResult, ...rest } = item;
|
const { verificationResult, ...rest } = item;
|
||||||
const row = toGridRows([{ ctpvNm, ...rest }])[0] as GridRowWithVerification;
|
const row = toGridRows([{ ctpvNm, ...rest }])[0] as GridRowWithVerification;
|
||||||
if (verificationResult) {
|
if (verificationResult) row.verificationResult = verificationResult;
|
||||||
row.verificationResult = normalizeVerificationResultMap(verificationResult);
|
|
||||||
}
|
|
||||||
return row;
|
return row;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -846,13 +839,7 @@ const SewerageServiceLevelInp = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const imrResponse = await callImrServiceWithRollbackOnFailure(imrParam, {
|
const imrResponse = await statisticsApi.callImrService(imrParam);
|
||||||
statsYr: lastSearchedValues.year ?? "",
|
|
||||||
statsCd: statsCdForTab,
|
|
||||||
sewerBzmnCd: lastSearchedValues?.bsnmCd ?? "",
|
|
||||||
rollbackStatusCode: activeTabStatus?.lclgvSbmsnSttsCd ?? "",
|
|
||||||
mdfrUuid: userInfo.userUnqId,
|
|
||||||
});
|
|
||||||
if (imrResponse.job_id) {
|
if (imrResponse.job_id) {
|
||||||
await waitForImrJobCompleted(
|
await waitForImrJobCompleted(
|
||||||
imrResponse.job_id,
|
imrResponse.job_id,
|
||||||
@@ -1159,7 +1146,18 @@ const SewerageServiceLevelInp = () => {
|
|||||||
if (!verification) return;
|
if (!verification) return;
|
||||||
const errors = verification[fieldName];
|
const errors = verification[fieldName];
|
||||||
if (Array.isArray(errors) && errors.length > 0) {
|
if (Array.isArray(errors) && errors.length > 0) {
|
||||||
return formatVerificationTooltip(errors);
|
return errors
|
||||||
|
.map((e) => {
|
||||||
|
const prefix =
|
||||||
|
e.vrfcCd === "IMR"
|
||||||
|
? "시계열 검증 - "
|
||||||
|
: e.vrfcCd === "NV"
|
||||||
|
? "일반검증 - "
|
||||||
|
: "모집단 검증 - ";
|
||||||
|
return `${prefix}${e.rsnExpln}(검증 기준값: ${e.cmprCn} / 현재 입력값: ${e.nowCn})`;
|
||||||
|
})
|
||||||
|
.filter(Boolean)
|
||||||
|
.join("\n");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
|||||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||||
import { statisticsInputWaterReuseApi } from "@/entities/statistics/api/input/statistics-input-water-reuse-service";
|
import { statisticsInputWaterReuseApi } from "@/entities/statistics/api/input/statistics-input-water-reuse-service";
|
||||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||||
import { callImrServiceWithRollbackOnFailure } from "@/components/util/input/call-imr-with-rollback";
|
|
||||||
import {
|
import {
|
||||||
type PublicSewageTreatWaterReuseItem,
|
type PublicSewageTreatWaterReuseItem,
|
||||||
type PublicSewageTreatWaterReuseSaveItem,
|
type PublicSewageTreatWaterReuseSaveItem,
|
||||||
@@ -94,11 +93,7 @@ import {
|
|||||||
patchFooterVerificationByTab,
|
patchFooterVerificationByTab,
|
||||||
patchVerificationFailedByTab,
|
patchVerificationFailedByTab,
|
||||||
} from "@/components/util/input/verification-failed-flag";
|
} from "@/components/util/input/verification-failed-flag";
|
||||||
import {
|
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
|
||||||
formatVerificationTooltip,
|
|
||||||
normalizeVerificationResultMap,
|
|
||||||
type VerificationResultLikeMap,
|
|
||||||
} from "@/components/util/input/verification-result-display";
|
|
||||||
import { useAdminStore } from "@/store/admin-store";
|
import { useAdminStore } from "@/store/admin-store";
|
||||||
import { useTabStore } from "@/store/tab-store";
|
import { useTabStore } from "@/store/tab-store";
|
||||||
|
|
||||||
@@ -448,9 +443,7 @@ function mapPublicSewageTreatWaterReuseListToGridRows(
|
|||||||
instlAprvYmd: formatCompactYmdForGrid(item.instlAprvYmd),
|
instlAprvYmd: formatCompactYmdForGrid(item.instlAprvYmd),
|
||||||
},
|
},
|
||||||
])[0] as GridRowWithVerification;
|
])[0] as GridRowWithVerification;
|
||||||
if (verificationResult) {
|
if (verificationResult) row.verificationResult = verificationResult;
|
||||||
row.verificationResult = normalizeVerificationResultMap(verificationResult);
|
|
||||||
}
|
|
||||||
return row;
|
return row;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -469,9 +462,7 @@ function mapRecycledWaterStatusListToGridRows(
|
|||||||
oprtngStrtYmd: formatCompactYmdForGrid(item.oprtngStrtYmd),
|
oprtngStrtYmd: formatCompactYmdForGrid(item.oprtngStrtYmd),
|
||||||
},
|
},
|
||||||
])[0] as GridRowWithVerification;
|
])[0] as GridRowWithVerification;
|
||||||
if (verificationResult) {
|
if (verificationResult) row.verificationResult = verificationResult;
|
||||||
row.verificationResult = normalizeVerificationResultMap(verificationResult);
|
|
||||||
}
|
|
||||||
return row;
|
return row;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -489,9 +480,7 @@ function mapRainFallUtilFactStatusListToGridRows(
|
|||||||
cmptnYmd: formatCompactYmdForGrid(item.cmptnYmd),
|
cmptnYmd: formatCompactYmdForGrid(item.cmptnYmd),
|
||||||
},
|
},
|
||||||
])[0] as GridRowWithVerification;
|
])[0] as GridRowWithVerification;
|
||||||
if (verificationResult) {
|
if (verificationResult) row.verificationResult = verificationResult;
|
||||||
row.verificationResult = normalizeVerificationResultMap(verificationResult);
|
|
||||||
}
|
|
||||||
return row;
|
return row;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -508,9 +497,7 @@ function mapTreatWaterReuseStatusListToGridRows<
|
|||||||
coRegYmd: formatCompactYmdForGrid(item.coRegYmd),
|
coRegYmd: formatCompactYmdForGrid(item.coRegYmd),
|
||||||
},
|
},
|
||||||
])[0] as GridRowWithVerification;
|
])[0] as GridRowWithVerification;
|
||||||
if (verificationResult) {
|
if (verificationResult) row.verificationResult = verificationResult;
|
||||||
row.verificationResult = normalizeVerificationResultMap(verificationResult);
|
|
||||||
}
|
|
||||||
return row;
|
return row;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -1368,13 +1355,7 @@ const WaterReuseInp = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const imrResponse = await callImrServiceWithRollbackOnFailure(imrParam, {
|
const imrResponse = await statisticsApi.callImrService(imrParam);
|
||||||
statsYr: lastSearchedValues.year ?? "",
|
|
||||||
statsCd: statsCdForTab,
|
|
||||||
sewerBzmnCd: lastSearchedValues?.bsnmCd ?? "",
|
|
||||||
rollbackStatusCode: activeTabStatus?.lclgvSbmsnSttsCd ?? "",
|
|
||||||
mdfrUuid: userInfo.userUnqId,
|
|
||||||
});
|
|
||||||
if (imrResponse.job_id) {
|
if (imrResponse.job_id) {
|
||||||
await waitForImrJobCompleted(
|
await waitForImrJobCompleted(
|
||||||
imrResponse.job_id,
|
imrResponse.job_id,
|
||||||
@@ -2082,7 +2063,18 @@ const WaterReuseInp = () => {
|
|||||||
if (!verification) return;
|
if (!verification) return;
|
||||||
const errors = verification[fieldName];
|
const errors = verification[fieldName];
|
||||||
if (Array.isArray(errors) && errors.length > 0) {
|
if (Array.isArray(errors) && errors.length > 0) {
|
||||||
return formatVerificationTooltip(errors);
|
return errors
|
||||||
|
.map((e) => {
|
||||||
|
const prefix =
|
||||||
|
e.vrfcCd === "IMR"
|
||||||
|
? "시계열 검증 - "
|
||||||
|
: e.vrfcCd === "NV"
|
||||||
|
? "일반검증 - "
|
||||||
|
: "모집단 검증 - ";
|
||||||
|
return `${prefix}${e.rsnExpln}(검증 기준값: ${e.cmprCn} / 현재 입력값: ${e.nowCn})`;
|
||||||
|
})
|
||||||
|
.filter(Boolean)
|
||||||
|
.join("\n");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+4
-7
@@ -554,20 +554,17 @@ const DetailComponent = ({
|
|||||||
const userInfo = await getUserInfo();
|
const userInfo = await getUserInfo();
|
||||||
let response;
|
let response;
|
||||||
|
|
||||||
const vrfcSn = detailInfo?.commonInfo.vrfcSn;
|
|
||||||
if (vrfcSn == null) {
|
|
||||||
alert("검증 일련번호가 없습니다.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!hasPersistedDetails) {
|
if (!hasPersistedDetails) {
|
||||||
response =
|
response =
|
||||||
await generalverificationApiService.RegistVrfcDetail(vrfcSn, {
|
await generalverificationApiService.RegistVrfcDetail({
|
||||||
|
vrfcSn: detailInfo?.commonInfo.vrfcSn ?? null,
|
||||||
detailList: rows,
|
detailList: rows,
|
||||||
rgtrUuid: userInfo.userUnqId,
|
rgtrUuid: userInfo.userUnqId,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
response =
|
response =
|
||||||
await generalverificationApiService.UpdateVrfcDetail(vrfcSn, {
|
await generalverificationApiService.UpdateVrfcDetail({
|
||||||
|
vrfcSn: detailInfo?.commonInfo.vrfcSn ?? null,
|
||||||
detailList: rows,
|
detailList: rows,
|
||||||
mdfrUuid: userInfo.userUnqId,
|
mdfrUuid: userInfo.userUnqId,
|
||||||
});
|
});
|
||||||
|
|||||||
+7
-14
@@ -146,15 +146,9 @@ const RegistDialog = memo(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleUpdateVrfcMaster = async (
|
const handleUpdateVrfcMaster = async (data: GeneralVerificationMasterSubmitFormData) => {
|
||||||
updateVrfcSn: number,
|
|
||||||
body: UpdateVrfcMasterRequest,
|
|
||||||
) => {
|
|
||||||
try {
|
try {
|
||||||
const response = await generalverificationApiService.UpdateVrfcMaster(
|
const response = await generalverificationApiService.UpdateVrfcMaster(data as UpdateVrfcMasterRequest);
|
||||||
updateVrfcSn,
|
|
||||||
body,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (response.status === 'success') {
|
if (response.status === 'success') {
|
||||||
alert('수정되었습니다.');
|
alert('수정되었습니다.');
|
||||||
@@ -264,11 +258,8 @@ const RegistDialog = memo(
|
|||||||
if (await confirm(confirmMessage)) {
|
if (await confirm(confirmMessage)) {
|
||||||
const userInfo = await getUserInfo();
|
const userInfo = await getUserInfo();
|
||||||
if (isVrfcSn) {
|
if (isVrfcSn) {
|
||||||
if (data.vrfcSn == null) {
|
const updateData = {
|
||||||
alert('수정 대상이 없습니다.');
|
vrfcSn: data.vrfcSn,
|
||||||
return;
|
|
||||||
}
|
|
||||||
await handleUpdateVrfcMaster(data.vrfcSn, {
|
|
||||||
vrfcNm: data.vrfcNm,
|
vrfcNm: data.vrfcNm,
|
||||||
vrfcClsfCd: data.vrfcClsfCd,
|
vrfcClsfCd: data.vrfcClsfCd,
|
||||||
dcptDgt: data.dcptDgt,
|
dcptDgt: data.dcptDgt,
|
||||||
@@ -276,8 +267,10 @@ const RegistDialog = memo(
|
|||||||
...(data.dcptDgt === 0
|
...(data.dcptDgt === 0
|
||||||
? {}
|
? {}
|
||||||
: { dcptPrcsMthCd: data.dcptPrcsMthCd }),
|
: { dcptPrcsMthCd: data.dcptPrcsMthCd }),
|
||||||
|
trgtStatsCd: data.trgtStatsCd,
|
||||||
mdfrUuid: userInfo.userUnqId,
|
mdfrUuid: userInfo.userUnqId,
|
||||||
});
|
};
|
||||||
|
await handleUpdateVrfcMaster(updateData);
|
||||||
} else {
|
} else {
|
||||||
const registData = {
|
const registData = {
|
||||||
vrfcNm: data.vrfcNm,
|
vrfcNm: data.vrfcNm,
|
||||||
|
|||||||
@@ -481,11 +481,6 @@ export type DataGridProps = {
|
|||||||
headerHeight?: number;
|
headerHeight?: number;
|
||||||
/** RealGrid `displayOptions.fitStyle` (기본 EVEN). 컬럼별 width 유지 시 NONE */
|
/** RealGrid `displayOptions.fitStyle` (기본 EVEN). 컬럼별 width 유지 시 NONE */
|
||||||
fitStyle?: GridFitStyle;
|
fitStyle?: GridFitStyle;
|
||||||
/**
|
|
||||||
* true면 붙여넣기·편집으로 행을 추가하지 않음.
|
|
||||||
* 검증 결과처럼 조회 행 수가 고정된 그리드에서 사용.
|
|
||||||
*/
|
|
||||||
preventRowAppend?: boolean;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export type TabDataGridProps = {
|
export type TabDataGridProps = {
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ export const doList = [
|
|||||||
"4600000000",
|
"4600000000",
|
||||||
"4700000000",
|
"4700000000",
|
||||||
"4800000000",
|
"4800000000",
|
||||||
"5000000000",
|
|
||||||
];
|
];
|
||||||
|
|
||||||
export const needBsnmFrgnrPoplSmSidoList = [
|
export const needBsnmFrgnrPoplSmSidoList = [
|
||||||
|
|||||||
@@ -49,43 +49,6 @@ export const ManholeStatusInpColumn = {
|
|||||||
styleName: "rg-cell-readonly",
|
styleName: "rg-cell-readonly",
|
||||||
footer: { text: "합계" },
|
footer: { text: "합계" },
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: "wholMnhlCntSum",
|
|
||||||
fieldName: "wholMnhlCntSum",
|
|
||||||
header: { text: "맨홀총계" },
|
|
||||||
footer: footerInt,
|
|
||||||
editable: false,
|
|
||||||
valueType: ValueType.NUMBER,
|
|
||||||
dataFormat: "#,##0",
|
|
||||||
styleName: "rg-cell-readonly",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "frlvlMnhlCntSum",
|
|
||||||
fieldName: "frlvlMnhlCntSum",
|
|
||||||
header: { text: "주철계" },
|
|
||||||
footer: footerInt,
|
|
||||||
editable: false,
|
|
||||||
valueType: ValueType.NUMBER,
|
|
||||||
dataFormat: "#,##0",
|
|
||||||
styleName: "rg-cell-readonly",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "thlvlMnhlCntSum",
|
|
||||||
fieldName: "thlvlMnhlCntSum",
|
|
||||||
header: { text: "콘크리트계" },
|
|
||||||
footer: footerInt,
|
|
||||||
editable: false,
|
|
||||||
valueType: ValueType.NUMBER,
|
|
||||||
dataFormat: "#,##0",
|
|
||||||
styleName: "rg-cell-readonly",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "picNm",
|
|
||||||
fieldName: "picNm",
|
|
||||||
header: { text: "담당자명" },
|
|
||||||
editable: false,
|
|
||||||
styleName: "rg-cell-readonly",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
...intCol("wholMnhlCnt", "계", false),
|
...intCol("wholMnhlCnt", "계", false),
|
||||||
computed: {
|
computed: {
|
||||||
@@ -125,12 +88,6 @@ export const ManholeStatusInpColumn = {
|
|||||||
},
|
},
|
||||||
"admdstNm",
|
"admdstNm",
|
||||||
"emphsMngSeNm",
|
"emphsMngSeNm",
|
||||||
{
|
|
||||||
name: "adminRefGroup",
|
|
||||||
hideChildHeaders: false,
|
|
||||||
header: { text: "행정참고자료" },
|
|
||||||
items: ["wholMnhlCntSum", "frlvlMnhlCntSum", "thlvlMnhlCntSum", "picNm"],
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: "mtrlGroup",
|
name: "mtrlGroup",
|
||||||
hideChildHeaders: false,
|
hideChildHeaders: false,
|
||||||
|
|||||||
@@ -491,10 +491,6 @@ const rawList = [
|
|||||||
{ name: 'sggNm', fieldName: 'sggNm', header: { text: '시군구' }, mergeCells: true, sortdisable: true },
|
{ name: 'sggNm', fieldName: 'sggNm', header: { text: '시군구' }, mergeCells: true, sortdisable: true },
|
||||||
{ name: 'admdstNm', fieldName: 'admdstNm', header: { text: '행정구역명' }, mergeCells: true, sortdisable: true },
|
{ name: 'admdstNm', fieldName: 'admdstNm', header: { text: '행정구역명' }, mergeCells: true, sortdisable: true },
|
||||||
{ name: 'emphsMngSeNm', fieldName: 'emphsMngSeNm', header: { text: '집중강우\n중점관리\n구역구분' }, mergeCells: true },
|
{ name: 'emphsMngSeNm', fieldName: 'emphsMngSeNm', header: { text: '집중강우\n중점관리\n구역구분' }, mergeCells: true },
|
||||||
{ name: 'wholMnhlCntSum', fieldName: 'wholMnhlCntSum', header: { text: '맨홀총계' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
|
|
||||||
{ name: 'frlvlMnhlCntSum', fieldName: 'frlvlMnhlCntSum', header: { text: '주철계' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
|
|
||||||
{ name: 'thlvlMnhlCntSum', fieldName: 'thlvlMnhlCntSum', header: { text: '콘크리트계' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
|
|
||||||
{ name: 'picNm', fieldName: 'picNm', header: { text: '담당자명' } },
|
|
||||||
{
|
{
|
||||||
name: 'displayYear',
|
name: 'displayYear',
|
||||||
fieldName: 'displayYear',
|
fieldName: 'displayYear',
|
||||||
@@ -548,12 +544,6 @@ const rawList = [
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
'emphsMngSeNm',
|
'emphsMngSeNm',
|
||||||
{
|
|
||||||
name: 'adminRefGroup',
|
|
||||||
hideChildHeaders: false,
|
|
||||||
header: { text: '행정참고자료' },
|
|
||||||
items: ['wholMnhlCntSum', 'frlvlMnhlCntSum', 'thlvlMnhlCntSum', 'picNm'],
|
|
||||||
},
|
|
||||||
'displayYear',
|
'displayYear',
|
||||||
{
|
{
|
||||||
name: 'mtrlGroup',
|
name: 'mtrlGroup',
|
||||||
|
|||||||
@@ -710,10 +710,6 @@ const rawSewagePipeTotList = [
|
|||||||
{ name: "sggNm", fieldName: "sggNm", header: { text: "시군구" }, editable: false },
|
{ name: "sggNm", fieldName: "sggNm", header: { text: "시군구" }, editable: false },
|
||||||
{ name: "admdstNm", fieldName: "admdstNm", header: { text: "행정구역명" }, editable: false },
|
{ name: "admdstNm", fieldName: "admdstNm", header: { text: "행정구역명" }, editable: false },
|
||||||
{ name: "emphsMngSeNm", fieldName: "emphsMngSeNm", header: { text: "집중강우\n중점관리\n구역구분" }, editable: false },
|
{ name: "emphsMngSeNm", fieldName: "emphsMngSeNm", header: { text: "집중강우\n중점관리\n구역구분" }, editable: false },
|
||||||
{ name: "wholMnhlCntSum", fieldName: "wholMnhlCntSum", header: { text: "맨홀총계" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false },
|
|
||||||
{ name: "frlvlMnhlCntSum", fieldName: "frlvlMnhlCntSum", header: { text: "주철계" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false },
|
|
||||||
{ name: "thlvlMnhlCntSum", fieldName: "thlvlMnhlCntSum", header: { text: "콘크리트계" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false },
|
|
||||||
{ name: "picNm", fieldName: "picNm", header: { text: "담당자명" }, editable: false },
|
|
||||||
{ name: "wholMnhlCnt", fieldName: "wholMnhlCnt", header: { text: "계" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false },
|
{ name: "wholMnhlCnt", fieldName: "wholMnhlCnt", header: { text: "계" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false },
|
||||||
{ name: "frlvlMnhlCnt", fieldName: "frlvlMnhlCnt", header: { text: "주철" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false },
|
{ name: "frlvlMnhlCnt", fieldName: "frlvlMnhlCnt", header: { text: "주철" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false },
|
||||||
{ name: "sclvlMnhlCnt", fieldName: "sclvlMnhlCnt", header: { text: "주철(조화)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false },
|
{ name: "sclvlMnhlCnt", fieldName: "sclvlMnhlCnt", header: { text: "주철(조화)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false },
|
||||||
@@ -724,11 +720,6 @@ const rawSewagePipeTotList = [
|
|||||||
columnLayout: [
|
columnLayout: [
|
||||||
{ name: "addrGroup", header: { text: "행정구역" }, items: ["ctpvNm", "sggNm", "admdstNm"] },
|
{ name: "addrGroup", header: { text: "행정구역" }, items: ["ctpvNm", "sggNm", "admdstNm"] },
|
||||||
"emphsMngSeNm",
|
"emphsMngSeNm",
|
||||||
{
|
|
||||||
name: "adminRefGroup",
|
|
||||||
header: { text: "행정참고자료" },
|
|
||||||
items: ["wholMnhlCntSum", "frlvlMnhlCntSum", "thlvlMnhlCntSum", "picNm"],
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: "mtrlGroup",
|
name: "mtrlGroup",
|
||||||
header: { text: "맨홀뚜껑 재질(개)" },
|
header: { text: "맨홀뚜껑 재질(개)" },
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
|
||||||
import type {
|
|
||||||
ImrRequest,
|
|
||||||
ImrResponse,
|
|
||||||
rollbackStatusRequest,
|
|
||||||
} from "@/entities/statistics/model/statistics-interface";
|
|
||||||
|
|
||||||
/** 제출 직후 IMR 요청이 실패하면 검증 이전 상태로 롤백 */
|
|
||||||
export async function callImrServiceWithRollbackOnFailure(
|
|
||||||
imrParam: ImrRequest,
|
|
||||||
rollbackParam: rollbackStatusRequest,
|
|
||||||
): Promise<ImrResponse> {
|
|
||||||
try {
|
|
||||||
return await statisticsApi.callImrService(imrParam);
|
|
||||||
} catch (error) {
|
|
||||||
try {
|
|
||||||
await statisticsApi.rollbackStatus(rollbackParam);
|
|
||||||
} catch {
|
|
||||||
// 롤백 실패는 IMR 실패를 가리지 않음
|
|
||||||
}
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,6 @@
|
|||||||
import type { StatisticsInputCommonInfoBase } from "@/entities/statistics/model/statistics-interface";
|
import type { StatisticsInputCommonInfoBase } from "@/entities/statistics/model/statistics-interface";
|
||||||
|
|
||||||
import {
|
import type { VerificationResultLikeMap } from "./verification-result-display";
|
||||||
normalizeVerificationResultMap,
|
|
||||||
type VerificationResultLikeMap,
|
|
||||||
} from "./verification-result-display";
|
|
||||||
|
|
||||||
export function isVerificationFailedFromCommonInfo(
|
export function isVerificationFailedFromCommonInfo(
|
||||||
commonInfo: Pick<StatisticsInputCommonInfoBase, "isVerificationFailed"> | null | undefined,
|
commonInfo: Pick<StatisticsInputCommonInfoBase, "isVerificationFailed"> | null | undefined,
|
||||||
@@ -31,9 +28,6 @@ export function patchFooterVerificationByTab(
|
|||||||
| undefined,
|
| undefined,
|
||||||
): Map<string, VerificationResultLikeMap | null> {
|
): Map<string, VerificationResultLikeMap | null> {
|
||||||
const next = new Map(prev);
|
const next = new Map(prev);
|
||||||
next.set(
|
next.set(tabKey, commonInfo?.verificationResult ?? null);
|
||||||
tabKey,
|
|
||||||
normalizeVerificationResultMap(commonInfo?.verificationResult) ?? null,
|
|
||||||
);
|
|
||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,49 +13,6 @@ export type VerificationResultLikeMap = Record<
|
|||||||
VerificationResultLikeItem[]
|
VerificationResultLikeItem[]
|
||||||
>;
|
>;
|
||||||
|
|
||||||
/** 입력 조회 verificationResult의 기준값/입력값이 null이면 "-" */
|
|
||||||
export function displayVerificationCn(
|
|
||||||
value: string | null | undefined,
|
|
||||||
): string {
|
|
||||||
if (value == null || String(value).trim() === "") return "-";
|
|
||||||
return String(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function normalizeVerificationResultItem<T extends VerificationResultLikeItem>(
|
|
||||||
item: T,
|
|
||||||
): T {
|
|
||||||
return {
|
|
||||||
...item,
|
|
||||||
nowCn: displayVerificationCn(item.nowCn ?? item.nowVlCn),
|
|
||||||
cmprCn: displayVerificationCn(item.cmprCn ?? item.compVlCn),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export function normalizeVerificationResultMap<T extends VerificationResultLikeMap>(
|
|
||||||
result: T | null | undefined,
|
|
||||||
): T | undefined {
|
|
||||||
if (!result || typeof result !== "object") return undefined;
|
|
||||||
const next = {} as T;
|
|
||||||
for (const [key, items] of Object.entries(result)) {
|
|
||||||
(next as VerificationResultLikeMap)[key] = Array.isArray(items)
|
|
||||||
? items.map((item) => normalizeVerificationResultItem(item))
|
|
||||||
: [];
|
|
||||||
}
|
|
||||||
return next;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 조회 행/객체에 붙은 verificationResult의 cmprCn·nowCn null을 "-"로 바꿈 */
|
|
||||||
export function withNormalizedVerificationResult<T extends object>(item: T): T {
|
|
||||||
if (!("verificationResult" in item) || item.verificationResult == null) {
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
const verificationResult = normalizeVerificationResultMap(
|
|
||||||
item.verificationResult as VerificationResultLikeMap,
|
|
||||||
);
|
|
||||||
if (!verificationResult) return item;
|
|
||||||
return { ...item, verificationResult };
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 검증 오류 배열 → RealGrid styleName */
|
/** 검증 오류 배열 → RealGrid styleName */
|
||||||
export function getVerificationStyleName(
|
export function getVerificationStyleName(
|
||||||
errors: VerificationResultLikeItem[] | null | undefined,
|
errors: VerificationResultLikeItem[] | null | undefined,
|
||||||
@@ -80,8 +37,8 @@ export function formatVerificationTooltip(
|
|||||||
: e.vrfcCd === "NV"
|
: e.vrfcCd === "NV"
|
||||||
? "일반검증 - "
|
? "일반검증 - "
|
||||||
: "모집단 검증 - ";
|
: "모집단 검증 - ";
|
||||||
const comp = displayVerificationCn(e.cmprCn ?? e.compVlCn);
|
const comp = e.cmprCn ?? e.compVlCn ?? "";
|
||||||
const now = displayVerificationCn(e.nowCn ?? e.nowVlCn);
|
const now = e.nowCn ?? e.nowVlCn ?? "";
|
||||||
return `${prefix}${e.rsnExpln}\n(검증 기준값: ${comp} / 현재 입력값: ${now})`;
|
return `${prefix}${e.rsnExpln}\n(검증 기준값: ${comp} / 현재 입력값: ${now})`;
|
||||||
})
|
})
|
||||||
.filter(Boolean)
|
.filter(Boolean)
|
||||||
|
|||||||
@@ -56,11 +56,10 @@ export class GeneralverificationApiService implements GeneralverificationService
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async UpdateVrfcMaster(
|
public async UpdateVrfcMaster(
|
||||||
vrfcSn: number,
|
|
||||||
param: UpdateVrfcMasterRequest,
|
param: UpdateVrfcMasterRequest,
|
||||||
): Promise<UpdateVrfcMasterResponse> {
|
): Promise<UpdateVrfcMasterResponse> {
|
||||||
const response = await stClient.put<UpdateVrfcMasterResponse>(
|
const response = await stClient.put<UpdateVrfcMasterResponse>(
|
||||||
`${ENDPOINT.ST_SERVICE.INPUTVERIFY}/masters/${vrfcSn}`,
|
`${ENDPOINT.ST_SERVICE.INPUTVERIFY}/masters/${param.vrfcSn}`,
|
||||||
param,
|
param,
|
||||||
);
|
);
|
||||||
return response.data;
|
return response.data;
|
||||||
@@ -128,22 +127,20 @@ export class GeneralverificationApiService implements GeneralverificationService
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async RegistVrfcDetail(
|
public async RegistVrfcDetail(
|
||||||
vrfcSn: number,
|
|
||||||
param: VerifyDetailRegistRequest,
|
param: VerifyDetailRegistRequest,
|
||||||
): Promise<RegistVrfcMasterResponse> {
|
): Promise<RegistVrfcMasterResponse> {
|
||||||
const response = await stClient.post<RegistVrfcMasterResponse>(
|
const response = await stClient.post<RegistVrfcMasterResponse>(
|
||||||
`${ENDPOINT.ST_SERVICE.INPUTVERIFY}/${vrfcSn}/details`,
|
`${ENDPOINT.ST_SERVICE.INPUTVERIFY}/${param.vrfcSn}/details`,
|
||||||
param,
|
param,
|
||||||
);
|
);
|
||||||
return response.data;
|
return response.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async UpdateVrfcDetail(
|
public async UpdateVrfcDetail(
|
||||||
vrfcSn: number,
|
|
||||||
param: VerifyDetailUpdateRequest,
|
param: VerifyDetailUpdateRequest,
|
||||||
): Promise<RegistVrfcMasterResponse> {
|
): Promise<RegistVrfcMasterResponse> {
|
||||||
const response = await stClient.put<RegistVrfcMasterResponse>(
|
const response = await stClient.put<RegistVrfcMasterResponse>(
|
||||||
`${ENDPOINT.ST_SERVICE.INPUTVERIFY}/${vrfcSn}/details`,
|
`${ENDPOINT.ST_SERVICE.INPUTVERIFY}/${param.vrfcSn}/details`,
|
||||||
param,
|
param,
|
||||||
);
|
);
|
||||||
return response.data;
|
return response.data;
|
||||||
|
|||||||
@@ -16,8 +16,6 @@ import {
|
|||||||
type ImrStatusResponse,
|
type ImrStatusResponse,
|
||||||
type ReviewerInfoRequest,
|
type ReviewerInfoRequest,
|
||||||
type ReviewerInfoResponse,
|
type ReviewerInfoResponse,
|
||||||
type rollbackStatusRequest,
|
|
||||||
type rollbackStatusResponse,
|
|
||||||
type ReviewInputSaveRequest,
|
type ReviewInputSaveRequest,
|
||||||
type ReviewOpinionSaveRequest,
|
type ReviewOpinionSaveRequest,
|
||||||
type ReviewOpinionSaveResponse,
|
type ReviewOpinionSaveResponse,
|
||||||
@@ -158,17 +156,6 @@ export class StatisticsApiService implements StatisticsService {
|
|||||||
return response.data;
|
return response.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 입력 - 검증 이전 상태로 롤백
|
|
||||||
public async rollbackStatus(
|
|
||||||
param: rollbackStatusRequest,
|
|
||||||
): Promise<rollbackStatusResponse> {
|
|
||||||
const response = await stClient.put<rollbackStatusResponse>(
|
|
||||||
`${ENDPOINT.ST_SERVICE.INPUTCOMMON}/rollback-status`,
|
|
||||||
param,
|
|
||||||
);
|
|
||||||
return response.data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async callImrService(param: ImrRequest): Promise<ImrResponse> {
|
public async callImrService(param: ImrRequest): Promise<ImrResponse> {
|
||||||
const response = await client.post<ImrResponse>(
|
const response = await client.post<ImrResponse>(
|
||||||
`${ENDPOINT.STATVERIFY_SERVICE.IMR}`,
|
`${ENDPOINT.STATVERIFY_SERVICE.IMR}`,
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ export interface CheckVerificationNameResponse {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface UpdateVrfcMasterRequest {
|
export interface UpdateVrfcMasterRequest {
|
||||||
|
vrfcSn?: number | null;
|
||||||
vrfcNm?: string | null;
|
vrfcNm?: string | null;
|
||||||
vrfcClsfCd?: string | null;
|
vrfcClsfCd?: string | null;
|
||||||
dcptDgt?: number | null;
|
dcptDgt?: number | null;
|
||||||
@@ -183,11 +184,13 @@ export interface VerifyDetailRegistData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface VerifyDetailRegistRequest {
|
export interface VerifyDetailRegistRequest {
|
||||||
|
vrfcSn: number | null;
|
||||||
detailList: VerifyDetailRegistData[];
|
detailList: VerifyDetailRegistData[];
|
||||||
rgtrUuid: string;
|
rgtrUuid: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface VerifyDetailUpdateRequest {
|
export interface VerifyDetailUpdateRequest {
|
||||||
|
vrfcSn: number | null;
|
||||||
detailList: VerifyDetailRegistData[];
|
detailList: VerifyDetailRegistData[];
|
||||||
mdfrUuid: string;
|
mdfrUuid: string;
|
||||||
}
|
}
|
||||||
@@ -294,7 +297,6 @@ export interface GeneralverificationService {
|
|||||||
param: CheckVerificationNameRequest,
|
param: CheckVerificationNameRequest,
|
||||||
): Promise<CheckVerificationNameResponse>;
|
): Promise<CheckVerificationNameResponse>;
|
||||||
UpdateVrfcMaster(
|
UpdateVrfcMaster(
|
||||||
vrfcSn: number,
|
|
||||||
param: UpdateVrfcMasterRequest,
|
param: UpdateVrfcMasterRequest,
|
||||||
): Promise<UpdateVrfcMasterResponse>;
|
): Promise<UpdateVrfcMasterResponse>;
|
||||||
RegistVrfcMaster(
|
RegistVrfcMaster(
|
||||||
@@ -313,11 +315,9 @@ export interface GeneralverificationService {
|
|||||||
param: string,
|
param: string,
|
||||||
): Promise<VerifyColumnListResponse>;
|
): Promise<VerifyColumnListResponse>;
|
||||||
RegistVrfcDetail(
|
RegistVrfcDetail(
|
||||||
vrfcSn: number,
|
|
||||||
param: VerifyDetailRegistRequest,
|
param: VerifyDetailRegistRequest,
|
||||||
): Promise<RegistVrfcMasterResponse>;
|
): Promise<RegistVrfcMasterResponse>;
|
||||||
UpdateVrfcDetail(
|
UpdateVrfcDetail(
|
||||||
vrfcSn: number,
|
|
||||||
param: VerifyDetailUpdateRequest,
|
param: VerifyDetailUpdateRequest,
|
||||||
): Promise<RegistVrfcMasterResponse>;
|
): Promise<RegistVrfcMasterResponse>;
|
||||||
CopyVrfcData(
|
CopyVrfcData(
|
||||||
|
|||||||
+1
-4
@@ -308,6 +308,7 @@ export interface SeweragePipeInputPipeTypeStatusSaveItem {
|
|||||||
rmrk: string | null;
|
rmrk: string | null;
|
||||||
lyngPrlgWhol: number;
|
lyngPrlgWhol: number;
|
||||||
dmltnPrlgWhol: number;
|
dmltnPrlgWhol: number;
|
||||||
|
pipeByPrstWhol: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 관종별 현황 저장 API 요청 */
|
/** 관종별 현황 저장 API 요청 */
|
||||||
@@ -419,10 +420,6 @@ export interface SeweragePipeInputManholeStatusItem {
|
|||||||
folvlMnhlCnt: number;
|
folvlMnhlCnt: number;
|
||||||
filvlMnhlCnt: number;
|
filvlMnhlCnt: number;
|
||||||
rmrk: string;
|
rmrk: string;
|
||||||
wholMnhlCntSum: number;
|
|
||||||
frlvlMnhlCntSum: number;
|
|
||||||
thlvlMnhlCntSum: number;
|
|
||||||
picNm: string | null;
|
|
||||||
verificationResult?: SeweragePipeInputVerificationResult;
|
verificationResult?: SeweragePipeInputVerificationResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,21 +31,6 @@ export interface cancelSubmitResponse {
|
|||||||
message?: string;
|
message?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 검증 이전 상태로 롤백 요청 */
|
|
||||||
export interface rollbackStatusRequest {
|
|
||||||
statsYr: string;
|
|
||||||
statsCd: string;
|
|
||||||
sewerBzmnCd: string;
|
|
||||||
rollbackStatusCode: string;
|
|
||||||
mdfrUuid: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 검증 이전 상태로 롤백 응답 */
|
|
||||||
export interface rollbackStatusResponse {
|
|
||||||
status: string;
|
|
||||||
message?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ApiResponse<T> {
|
export interface ApiResponse<T> {
|
||||||
status: string;
|
status: string;
|
||||||
data?: T;
|
data?: T;
|
||||||
@@ -572,7 +557,6 @@ export interface StatisticsService {
|
|||||||
saveStatsInputPeriod(param: StatsInputPeriodSaveRequest): Promise<StatsInputPeriodSaveApiResponse>;
|
saveStatsInputPeriod(param: StatsInputPeriodSaveRequest): Promise<StatsInputPeriodSaveApiResponse>;
|
||||||
deleteStatsInputPeriod(param: StatsInputPeriodDeleteRequest): Promise<StatsInputPeriodDeleteApiResponse>;
|
deleteStatsInputPeriod(param: StatsInputPeriodDeleteRequest): Promise<StatsInputPeriodDeleteApiResponse>;
|
||||||
cancelSubmit(param: cancelSubmitRequest): Promise<cancelSubmitResponse>;
|
cancelSubmit(param: cancelSubmitRequest): Promise<cancelSubmitResponse>;
|
||||||
rollbackStatus(param: rollbackStatusRequest): Promise<rollbackStatusResponse>;
|
|
||||||
callImrService(param: ImrRequest): Promise<ImrResponse>;
|
callImrService(param: ImrRequest): Promise<ImrResponse>;
|
||||||
submitException(param: SubmitExceptionRequest): Promise<SubmitExceptionResponse>;
|
submitException(param: SubmitExceptionRequest): Promise<SubmitExceptionResponse>;
|
||||||
getLogList(param: StatisticsLogRequest): Promise<StatisticsLogResponse>;
|
getLogList(param: StatisticsLogRequest): Promise<StatisticsLogResponse>;
|
||||||
|
|||||||
@@ -247,10 +247,6 @@ export interface SewagePipeReviewManholeItem {
|
|||||||
folvlMnhlCnt: number;
|
folvlMnhlCnt: number;
|
||||||
filvlMnhlCnt: number;
|
filvlMnhlCnt: number;
|
||||||
rmrk: string | null;
|
rmrk: string | null;
|
||||||
wholMnhlCntSum: number;
|
|
||||||
frlvlMnhlCntSum: number;
|
|
||||||
thlvlMnhlCntSum: number;
|
|
||||||
picNm: string | null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SewagePipeManholeResponseData {
|
export interface SewagePipeManholeResponseData {
|
||||||
|
|||||||
-4
@@ -168,10 +168,6 @@ export interface FcltyManholeSummaryItem {
|
|||||||
thlvlMnhlCnt: number;
|
thlvlMnhlCnt: number;
|
||||||
folvlMnhlCnt: number;
|
folvlMnhlCnt: number;
|
||||||
filvlMnhlCnt: number;
|
filvlMnhlCnt: number;
|
||||||
wholMnhlCntSum: number;
|
|
||||||
frlvlMnhlCntSum: number;
|
|
||||||
thlvlMnhlCntSum: number;
|
|
||||||
picNm: string | null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
export const STATISTICS_ROUTE = "/statistics";
|
export const STATISTICS_ROUTE = "/statistics";
|
||||||
export const STATISTICS_TAB_QUERY_KEY = "tab";
|
export const STATISTICS_TAB_QUERY_KEY = "tab";
|
||||||
/** 기본 화면(대시보드) 도움말 매칭용. URL에는 넣지 않음 */
|
|
||||||
export const STATISTICS_DASHBOARD_TAB_ID = "Dashboard";
|
|
||||||
|
|
||||||
export function buildStatisticsTabUrl(tabId: string): string {
|
export function buildStatisticsTabUrl(tabId: string): string {
|
||||||
return `${STATISTICS_ROUTE}?${STATISTICS_TAB_QUERY_KEY}=${encodeURIComponent(tabId)}`;
|
return `${STATISTICS_ROUTE}?${STATISTICS_TAB_QUERY_KEY}=${encodeURIComponent(tabId)}`;
|
||||||
|
|||||||
@@ -1,20 +1,13 @@
|
|||||||
import { PageTitle } from "@common/components";
|
import { PageTitle } from "@common/components";
|
||||||
|
|
||||||
import { findMenuItemByUrlPath } from "@/shared/lib/stats-cd-input-navigation";
|
|
||||||
import { STATISTICS_DASHBOARD_TAB_ID } from "@/shared/lib/statistics-tab-url";
|
|
||||||
|
|
||||||
import { TabBar } from "./tab-bar";
|
import { TabBar } from "./tab-bar";
|
||||||
|
|
||||||
import { useTabStore } from "@/store/tab-store";
|
import { useTabStore } from "@/store/tab-store";
|
||||||
|
|
||||||
function StatisticsPageLayout({ children }: { children: React.ReactNode }) {
|
function StatisticsPageLayout({ children }: { children: React.ReactNode }) {
|
||||||
const { activeTabId, tabs, menuList } = useTabStore();
|
const { activeTabId, tabs } = useTabStore();
|
||||||
|
|
||||||
const pageTitle = tabs.find((t) => t.id === activeTabId);
|
const pageTitle = tabs.find((t) => t.id === activeTabId);
|
||||||
const dashboardMenu =
|
|
||||||
!pageTitle && menuList
|
|
||||||
? findMenuItemByUrlPath(menuList, STATISTICS_DASHBOARD_TAB_ID)
|
|
||||||
: null;
|
|
||||||
|
|
||||||
const menuPaths = pageTitle?.path?.split(">").map((path) => path.trim());
|
const menuPaths = pageTitle?.path?.split(">").map((path) => path.trim());
|
||||||
|
|
||||||
@@ -23,7 +16,7 @@ function StatisticsPageLayout({ children }: { children: React.ReactNode }) {
|
|||||||
<TabBar />
|
<TabBar />
|
||||||
<PageTitle
|
<PageTitle
|
||||||
title={pageTitle?.label ?? ""}
|
title={pageTitle?.label ?? ""}
|
||||||
menuCd={pageTitle?.menuItem?.menuCd ?? dashboardMenu?.menuCd}
|
menuCd={pageTitle?.menuItem?.menuCd}
|
||||||
menuPaths={menuPaths ?? []}
|
menuPaths={menuPaths ?? []}
|
||||||
/>
|
/>
|
||||||
{children}
|
{children}
|
||||||
|
|||||||
@@ -113,12 +113,8 @@ export async function PUT(
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getCookieDomain(): string | undefined {
|
function getCookieDomain(): string | undefined {
|
||||||
if (typeof window === "undefined") return undefined;
|
// 개발에서는 현재 사이트 전용, 운영에서는 환경변수의 공용 도메인을 사용한다.
|
||||||
|
return process.env.NODE_ENV === "production"
|
||||||
if (COOKIE_DOMAIN) return COOKIE_DOMAIN;
|
? COOKIE_DOMAIN || undefined
|
||||||
|
: undefined;
|
||||||
const { hostname } = window.location;
|
|
||||||
if (hostname === "localhost" || hostname === "127.0.0.1") return undefined;
|
|
||||||
|
|
||||||
return hostname;
|
|
||||||
}
|
}
|
||||||
+1
-1
@@ -50,7 +50,7 @@
|
|||||||
"eslint-plugin-simple-import-sort": "^12.1.1",
|
"eslint-plugin-simple-import-sort": "^12.1.1",
|
||||||
"husky": "^9.1.7",
|
"husky": "^9.1.7",
|
||||||
"lint-staged": "^16.2.7",
|
"lint-staged": "^16.2.7",
|
||||||
"turbo": "2.11.10"
|
"turbo": "2.4.2"
|
||||||
},
|
},
|
||||||
"pnpm": {
|
"pnpm": {
|
||||||
"overrides": {
|
"overrides": {
|
||||||
|
|||||||
Generated
+207
-221
@@ -60,8 +60,8 @@ importers:
|
|||||||
specifier: ^16.2.7
|
specifier: ^16.2.7
|
||||||
version: 16.4.0
|
version: 16.4.0
|
||||||
turbo:
|
turbo:
|
||||||
specifier: 2.11.10
|
specifier: 2.4.2
|
||||||
version: 2.11.10
|
version: 2.4.2
|
||||||
|
|
||||||
apps/_template:
|
apps/_template:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -104,10 +104,10 @@ importers:
|
|||||||
devDependencies:
|
devDependencies:
|
||||||
eslint:
|
eslint:
|
||||||
specifier: ^9.0.0
|
specifier: ^9.0.0
|
||||||
version: 9.39.4(jiti@2.6.1)
|
version: 9.39.4(jiti@1.21.7)
|
||||||
eslint-config-next:
|
eslint-config-next:
|
||||||
specifier: 15.3.8
|
specifier: 15.3.8
|
||||||
version: 15.3.8(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)
|
version: 15.3.8(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)
|
||||||
postcss:
|
postcss:
|
||||||
specifier: ^8.4.49
|
specifier: ^8.4.49
|
||||||
version: 8.5.8
|
version: 8.5.8
|
||||||
@@ -1839,7 +1839,7 @@ importers:
|
|||||||
version: 8.6.18(@storybook/test@8.6.15(storybook@8.6.18(prettier@3.8.1)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@8.6.18(prettier@3.8.1))(typescript@5.6.3)
|
version: 8.6.18(@storybook/test@8.6.15(storybook@8.6.18(prettier@3.8.1)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@8.6.18(prettier@3.8.1))(typescript@5.6.3)
|
||||||
'@storybook/react-vite':
|
'@storybook/react-vite':
|
||||||
specifier: ^8.5.3
|
specifier: ^8.5.3
|
||||||
version: 8.6.18(@storybook/test@8.6.15(storybook@8.6.18(prettier@3.8.1)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.60.0)(storybook@8.6.18(prettier@3.8.1))(typescript@5.6.3)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))
|
version: 8.6.18(@storybook/test@8.6.15(storybook@8.6.18(prettier@3.8.1)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.60.0)(storybook@8.6.18(prettier@3.8.1))(typescript@5.6.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))
|
||||||
'@storybook/test':
|
'@storybook/test':
|
||||||
specifier: ^8.5.3
|
specifier: ^8.5.3
|
||||||
version: 8.6.15(storybook@8.6.18(prettier@3.8.1))
|
version: 8.6.15(storybook@8.6.18(prettier@3.8.1))
|
||||||
@@ -1851,22 +1851,22 @@ importers:
|
|||||||
version: 22.19.15
|
version: 22.19.15
|
||||||
'@vitejs/plugin-react':
|
'@vitejs/plugin-react':
|
||||||
specifier: ^4.3.4
|
specifier: ^4.3.4
|
||||||
version: 4.7.0(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))
|
version: 4.7.0(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))
|
||||||
autoprefixer:
|
autoprefixer:
|
||||||
specifier: ^10.4.20
|
specifier: ^10.4.20
|
||||||
version: 10.4.27(postcss@8.5.8)
|
version: 10.4.27(postcss@8.5.8)
|
||||||
eslint:
|
eslint:
|
||||||
specifier: ^9.17.0
|
specifier: ^9.17.0
|
||||||
version: 9.39.4(jiti@1.21.7)
|
version: 9.39.4(jiti@2.6.1)
|
||||||
eslint-plugin-react-hooks:
|
eslint-plugin-react-hooks:
|
||||||
specifier: ^5.0.0
|
specifier: ^5.0.0
|
||||||
version: 5.2.0(eslint@9.39.4(jiti@1.21.7))
|
version: 5.2.0(eslint@9.39.4(jiti@2.6.1))
|
||||||
eslint-plugin-react-refresh:
|
eslint-plugin-react-refresh:
|
||||||
specifier: ^0.4.16
|
specifier: ^0.4.16
|
||||||
version: 0.4.26(eslint@9.39.4(jiti@1.21.7))
|
version: 0.4.26(eslint@9.39.4(jiti@2.6.1))
|
||||||
eslint-plugin-storybook:
|
eslint-plugin-storybook:
|
||||||
specifier: ^0.11.2
|
specifier: ^0.11.2
|
||||||
version: 0.11.6(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3)
|
version: 0.11.6(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3)
|
||||||
globals:
|
globals:
|
||||||
specifier: ^15.14.0
|
specifier: ^15.14.0
|
||||||
version: 15.15.0
|
version: 15.15.0
|
||||||
@@ -1887,19 +1887,19 @@ importers:
|
|||||||
version: 3.4.19(yaml@2.8.3)
|
version: 3.4.19(yaml@2.8.3)
|
||||||
tsup:
|
tsup:
|
||||||
specifier: 8.3.6
|
specifier: 8.3.6
|
||||||
version: 8.3.6(jiti@1.21.7)(postcss@8.5.8)(typescript@5.6.3)(yaml@2.8.3)
|
version: 8.3.6(jiti@2.6.1)(postcss@8.5.8)(typescript@5.6.3)(yaml@2.8.3)
|
||||||
typescript:
|
typescript:
|
||||||
specifier: ~5.6.2
|
specifier: ~5.6.2
|
||||||
version: 5.6.3
|
version: 5.6.3
|
||||||
typescript-eslint:
|
typescript-eslint:
|
||||||
specifier: ^8.18.2
|
specifier: ^8.18.2
|
||||||
version: 8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3)
|
version: 8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3)
|
||||||
vite:
|
vite:
|
||||||
specifier: ^6.0.5
|
specifier: ^6.0.5
|
||||||
version: 6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)
|
version: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)
|
||||||
vite-tsconfig-paths:
|
vite-tsconfig-paths:
|
||||||
specifier: 5.1.4
|
specifier: 5.1.4
|
||||||
version: 5.1.4(typescript@5.6.3)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))
|
version: 5.1.4(typescript@5.6.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))
|
||||||
|
|
||||||
packages/common/config:
|
packages/common/config:
|
||||||
devDependencies:
|
devDependencies:
|
||||||
@@ -4100,36 +4100,6 @@ packages:
|
|||||||
react: ^19.2.1
|
react: ^19.2.1
|
||||||
react-dom: ^19.2.1
|
react-dom: ^19.2.1
|
||||||
|
|
||||||
'@turbo/darwin-64@2.11.10':
|
|
||||||
resolution: {integrity: sha512-By4idRap5+nLnMuRzLB4qkOPRlvNdyY1ne4VJYDyUoUB11H94k7uif9mbe3JT8JSNXs1D68uMcBj6hJ/jMQRvA==}
|
|
||||||
cpu: [x64]
|
|
||||||
os: [darwin]
|
|
||||||
|
|
||||||
'@turbo/darwin-arm64@2.11.10':
|
|
||||||
resolution: {integrity: sha512-pyEYlVcuexOPa92p0Wlwl9YT1Is5D60lxN3ItWm3g30YLvFaUq86TF4BBWg5ZAc0uMTnrOzCvuCsOBTdzUWnRQ==}
|
|
||||||
cpu: [arm64]
|
|
||||||
os: [darwin]
|
|
||||||
|
|
||||||
'@turbo/linux-64@2.11.10':
|
|
||||||
resolution: {integrity: sha512-1tYeR/IDZ5HEdsb0jNq2L2xam5nMQ+g80tlV2BZmv4OFw+pMcUM0mMmUcfc5wXPPNHVNPuDMjh9Y8G8HgXPLZA==}
|
|
||||||
cpu: [x64]
|
|
||||||
os: [android, linux]
|
|
||||||
|
|
||||||
'@turbo/linux-arm64@2.11.10':
|
|
||||||
resolution: {integrity: sha512-HuekQxvVGhUd46g1Im/DKdOtglHr4/gguZAvzEpPUgtxNkztSa8lWhQEGQ+EmPQ0n7w19qjThFU+OfEEd0uvlw==}
|
|
||||||
cpu: [arm64]
|
|
||||||
os: [android, linux]
|
|
||||||
|
|
||||||
'@turbo/windows-64@2.11.10':
|
|
||||||
resolution: {integrity: sha512-UJOP3BkbreY3/JlMgJR6ZiimxYIBn+c+B4tnBIxD0E9c3Estmk+XoVNVBNBottZLNRXe3/ScgOU4+/k8tIWysg==}
|
|
||||||
cpu: [x64]
|
|
||||||
os: [win32]
|
|
||||||
|
|
||||||
'@turbo/windows-arm64@2.11.10':
|
|
||||||
resolution: {integrity: sha512-xOkEjF3ws/b/YNlc+bvJHMYBn+vL+QbEISZFVi0qS+ImmhA1X3/gmNmBrjjIG3dg6aeN+n6gQitzSkXQ286qJQ==}
|
|
||||||
cpu: [arm64]
|
|
||||||
os: [win32]
|
|
||||||
|
|
||||||
'@tybys/wasm-util@0.10.1':
|
'@tybys/wasm-util@0.10.1':
|
||||||
resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
|
resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
|
||||||
|
|
||||||
@@ -7417,8 +7387,38 @@ packages:
|
|||||||
typescript:
|
typescript:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
turbo@2.11.10:
|
turbo-darwin-64@2.4.2:
|
||||||
resolution: {integrity: sha512-3GJYwig8ygEI89oaOZdduJX8/aw6O9eRPYHoIt6T3FZl9hkKjiyIspufJoVgqXihPoJu8M5CSV0DlZvzfohBCw==}
|
resolution: {integrity: sha512-HFfemyWB60CJtEvVQj9yby5rkkWw9fLAdLtAPGtPQoU3tKh8t/uzCAZKso2aPVbib9vGUuGbPGoGpaRXdVhj5g==}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [darwin]
|
||||||
|
|
||||||
|
turbo-darwin-arm64@2.4.2:
|
||||||
|
resolution: {integrity: sha512-uwSx1dsBSSFeEC0nxyx2O219FEsS/haiESaWwE9JI8mHkQK61s6w6fN2G586krKxyNam4AIxRltleL+O2Em94g==}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [darwin]
|
||||||
|
|
||||||
|
turbo-linux-64@2.4.2:
|
||||||
|
resolution: {integrity: sha512-Fy/uL8z/LAYcPbm7a1LwFnTY9pIi5FAi12iuHsgB7zHjdh4eeIKS2NIg4nroAmTcUTUZ0/cVTo4bDOCUcS3aKw==}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
turbo-linux-arm64@2.4.2:
|
||||||
|
resolution: {integrity: sha512-AEA0d8h5W/K6iiXfEgiNwWt0yqRL1NpBs8zQCLdc4/L7WeYeJW3sORWX8zt7xhutF/KW9gTm8ehKpiK6cCIsAA==}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
turbo-windows-64@2.4.2:
|
||||||
|
resolution: {integrity: sha512-CybtIZ9wRgnnNFVN9En9G+rxsO+mwU81fvW4RpE8BWyNEkhQ8J28qYf4PaimueMxGHHp/28i/G7Kcdn2GAWG0g==}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [win32]
|
||||||
|
|
||||||
|
turbo-windows-arm64@2.4.2:
|
||||||
|
resolution: {integrity: sha512-7V0yneVPL8Y3TgrkUIjw7Odmwu1tHnyIiPHFM7eFcA7U+H6hPXyCxge7nC3wOKfjhKCQqUm+Vf/k6kjmLz5G4g==}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [win32]
|
||||||
|
|
||||||
|
turbo@2.4.2:
|
||||||
|
resolution: {integrity: sha512-Qxi0ioQCxMRUCcHKHZkTnYH8e7XCpNfg9QiJcyfWIc+ZXeaCjzV5rCGlbQlTXMAtI8qgfP8fZADv3CFtPwqdPQ==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
tus-js-client@4.3.1:
|
tus-js-client@4.3.1:
|
||||||
@@ -8590,15 +8590,6 @@ snapshots:
|
|||||||
wrap-ansi: 8.1.0
|
wrap-ansi: 8.1.0
|
||||||
wrap-ansi-cjs: wrap-ansi@7.0.0
|
wrap-ansi-cjs: wrap-ansi@7.0.0
|
||||||
|
|
||||||
'@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.6.3)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))':
|
|
||||||
dependencies:
|
|
||||||
glob: 10.5.0
|
|
||||||
magic-string: 0.27.0
|
|
||||||
react-docgen-typescript: 2.4.0(typescript@5.6.3)
|
|
||||||
vite: 6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)
|
|
||||||
optionalDependencies:
|
|
||||||
typescript: 5.6.3
|
|
||||||
|
|
||||||
'@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.6.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))':
|
'@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.6.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
glob: 10.5.0
|
glob: 10.5.0
|
||||||
@@ -9501,14 +9492,6 @@ snapshots:
|
|||||||
react: 19.2.4
|
react: 19.2.4
|
||||||
react-dom: 19.2.4(react@19.2.4)
|
react-dom: 19.2.4(react@19.2.4)
|
||||||
|
|
||||||
'@storybook/builder-vite@8.6.18(storybook@8.6.18(prettier@3.8.1))(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))':
|
|
||||||
dependencies:
|
|
||||||
'@storybook/csf-plugin': 8.6.18(storybook@8.6.18(prettier@3.8.1))
|
|
||||||
browser-assert: 1.2.1
|
|
||||||
storybook: 8.6.18(prettier@3.8.1)
|
|
||||||
ts-dedent: 2.2.0
|
|
||||||
vite: 6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)
|
|
||||||
|
|
||||||
'@storybook/builder-vite@8.6.18(storybook@8.6.18(prettier@3.8.1))(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))':
|
'@storybook/builder-vite@8.6.18(storybook@8.6.18(prettier@3.8.1))(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@storybook/csf-plugin': 8.6.18(storybook@8.6.18(prettier@3.8.1))
|
'@storybook/csf-plugin': 8.6.18(storybook@8.6.18(prettier@3.8.1))
|
||||||
@@ -9599,28 +9582,6 @@ snapshots:
|
|||||||
react-dom: 19.2.4(react@19.2.4)
|
react-dom: 19.2.4(react@19.2.4)
|
||||||
storybook: 8.6.18(prettier@3.8.1)
|
storybook: 8.6.18(prettier@3.8.1)
|
||||||
|
|
||||||
'@storybook/react-vite@8.6.18(@storybook/test@8.6.15(storybook@8.6.18(prettier@3.8.1)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.60.0)(storybook@8.6.18(prettier@3.8.1))(typescript@5.6.3)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))':
|
|
||||||
dependencies:
|
|
||||||
'@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.6.3)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))
|
|
||||||
'@rollup/pluginutils': 5.3.0(rollup@4.60.0)
|
|
||||||
'@storybook/builder-vite': 8.6.18(storybook@8.6.18(prettier@3.8.1))(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))
|
|
||||||
'@storybook/react': 8.6.18(@storybook/test@8.6.15(storybook@8.6.18(prettier@3.8.1)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@8.6.18(prettier@3.8.1))(typescript@5.6.3)
|
|
||||||
find-up: 5.0.0
|
|
||||||
magic-string: 0.30.21
|
|
||||||
react: 19.2.4
|
|
||||||
react-docgen: 7.1.1
|
|
||||||
react-dom: 19.2.4(react@19.2.4)
|
|
||||||
resolve: 1.22.11
|
|
||||||
storybook: 8.6.18(prettier@3.8.1)
|
|
||||||
tsconfig-paths: 4.2.0
|
|
||||||
vite: 6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)
|
|
||||||
optionalDependencies:
|
|
||||||
'@storybook/test': 8.6.15(storybook@8.6.18(prettier@3.8.1))
|
|
||||||
transitivePeerDependencies:
|
|
||||||
- rollup
|
|
||||||
- supports-color
|
|
||||||
- typescript
|
|
||||||
|
|
||||||
'@storybook/react-vite@8.6.18(@storybook/test@8.6.15(storybook@8.6.18(prettier@3.8.1)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.60.0)(storybook@8.6.18(prettier@3.8.1))(typescript@5.6.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))':
|
'@storybook/react-vite@8.6.18(@storybook/test@8.6.15(storybook@8.6.18(prettier@3.8.1)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.60.0)(storybook@8.6.18(prettier@3.8.1))(typescript@5.6.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.6.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))
|
'@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.6.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))
|
||||||
@@ -9817,24 +9778,6 @@ snapshots:
|
|||||||
react-dom: 19.2.4(react@19.2.4)
|
react-dom: 19.2.4(react@19.2.4)
|
||||||
tinymce: 7.9.2
|
tinymce: 7.9.2
|
||||||
|
|
||||||
'@turbo/darwin-64@2.11.10':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@turbo/darwin-arm64@2.11.10':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@turbo/linux-64@2.11.10':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@turbo/linux-arm64@2.11.10':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@turbo/windows-64@2.11.10':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@turbo/windows-arm64@2.11.10':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@tybys/wasm-util@0.10.1':
|
'@tybys/wasm-util@0.10.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
@@ -9950,26 +9893,26 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
xlsx: 0.18.5
|
xlsx: 0.18.5
|
||||||
|
|
||||||
'@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3)':
|
'@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/regexpp': 4.12.2
|
'@eslint-community/regexpp': 4.12.2
|
||||||
'@typescript-eslint/parser': 8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3)
|
'@typescript-eslint/parser': 8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)
|
||||||
'@typescript-eslint/scope-manager': 8.57.2
|
'@typescript-eslint/scope-manager': 8.57.2
|
||||||
'@typescript-eslint/type-utils': 8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3)
|
'@typescript-eslint/type-utils': 8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)
|
||||||
'@typescript-eslint/utils': 8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3)
|
'@typescript-eslint/utils': 8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)
|
||||||
'@typescript-eslint/visitor-keys': 8.57.2
|
'@typescript-eslint/visitor-keys': 8.57.2
|
||||||
eslint: 9.39.4(jiti@1.21.7)
|
eslint: 9.39.4(jiti@1.21.7)
|
||||||
ignore: 7.0.5
|
ignore: 7.0.5
|
||||||
natural-compare: 1.4.0
|
natural-compare: 1.4.0
|
||||||
ts-api-utils: 2.5.0(typescript@5.6.3)
|
ts-api-utils: 2.5.0(typescript@5.9.3)
|
||||||
typescript: 5.6.3
|
typescript: 5.9.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3)':
|
'@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/regexpp': 4.12.2
|
'@eslint-community/regexpp': 4.12.2
|
||||||
'@typescript-eslint/parser': 8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)
|
'@typescript-eslint/parser': 8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3)
|
||||||
'@typescript-eslint/scope-manager': 8.57.2
|
'@typescript-eslint/scope-manager': 8.57.2
|
||||||
'@typescript-eslint/type-utils': 8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3)
|
'@typescript-eslint/type-utils': 8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3)
|
||||||
'@typescript-eslint/utils': 8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3)
|
'@typescript-eslint/utils': 8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3)
|
||||||
@@ -9998,15 +9941,15 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3)':
|
'@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/scope-manager': 8.57.2
|
'@typescript-eslint/scope-manager': 8.57.2
|
||||||
'@typescript-eslint/types': 8.57.2
|
'@typescript-eslint/types': 8.57.2
|
||||||
'@typescript-eslint/typescript-estree': 8.57.2(typescript@5.6.3)
|
'@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3)
|
||||||
'@typescript-eslint/visitor-keys': 8.57.2
|
'@typescript-eslint/visitor-keys': 8.57.2
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
eslint: 9.39.4(jiti@1.21.7)
|
eslint: 9.39.4(jiti@1.21.7)
|
||||||
typescript: 5.6.3
|
typescript: 5.9.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
@@ -10065,15 +10008,15 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
typescript: 5.9.3
|
typescript: 5.9.3
|
||||||
|
|
||||||
'@typescript-eslint/type-utils@8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3)':
|
'@typescript-eslint/type-utils@8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/types': 8.57.2
|
'@typescript-eslint/types': 8.57.2
|
||||||
'@typescript-eslint/typescript-estree': 8.57.2(typescript@5.6.3)
|
'@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3)
|
||||||
'@typescript-eslint/utils': 8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3)
|
'@typescript-eslint/utils': 8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
eslint: 9.39.4(jiti@1.21.7)
|
eslint: 9.39.4(jiti@1.21.7)
|
||||||
ts-api-utils: 2.5.0(typescript@5.6.3)
|
ts-api-utils: 2.5.0(typescript@5.9.3)
|
||||||
typescript: 5.6.3
|
typescript: 5.9.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
@@ -10133,14 +10076,14 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@typescript-eslint/utils@8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3)':
|
'@typescript-eslint/utils@8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.7))
|
'@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.7))
|
||||||
'@typescript-eslint/scope-manager': 8.57.2
|
'@typescript-eslint/scope-manager': 8.57.2
|
||||||
'@typescript-eslint/types': 8.57.2
|
'@typescript-eslint/types': 8.57.2
|
||||||
'@typescript-eslint/typescript-estree': 8.57.2(typescript@5.6.3)
|
'@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3)
|
||||||
eslint: 9.39.4(jiti@1.21.7)
|
eslint: 9.39.4(jiti@1.21.7)
|
||||||
typescript: 5.6.3
|
typescript: 5.9.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
@@ -10230,18 +10173,6 @@ snapshots:
|
|||||||
'@unrs/resolver-binding-win32-x64-msvc@1.11.1':
|
'@unrs/resolver-binding-win32-x64-msvc@1.11.1':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))':
|
|
||||||
dependencies:
|
|
||||||
'@babel/core': 7.29.0
|
|
||||||
'@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0)
|
|
||||||
'@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0)
|
|
||||||
'@rolldown/pluginutils': 1.0.0-beta.27
|
|
||||||
'@types/babel__core': 7.20.5
|
|
||||||
react-refresh: 0.17.0
|
|
||||||
vite: 6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)
|
|
||||||
transitivePeerDependencies:
|
|
||||||
- supports-color
|
|
||||||
|
|
||||||
'@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))':
|
'@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.29.0
|
'@babel/core': 7.29.0
|
||||||
@@ -11288,6 +11219,26 @@ snapshots:
|
|||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
source-map: 0.7.6
|
source-map: 0.7.6
|
||||||
|
|
||||||
|
eslint-config-next@15.3.8(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3):
|
||||||
|
dependencies:
|
||||||
|
'@next/eslint-plugin-next': 15.3.8
|
||||||
|
'@rushstack/eslint-patch': 1.16.1
|
||||||
|
'@typescript-eslint/eslint-plugin': 8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)
|
||||||
|
'@typescript-eslint/parser': 8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)
|
||||||
|
eslint: 9.39.4(jiti@1.21.7)
|
||||||
|
eslint-import-resolver-node: 0.3.9
|
||||||
|
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@1.21.7))
|
||||||
|
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))
|
||||||
|
eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.4(jiti@1.21.7))
|
||||||
|
eslint-plugin-react: 7.37.5(eslint@9.39.4(jiti@1.21.7))
|
||||||
|
eslint-plugin-react-hooks: 5.2.0(eslint@9.39.4(jiti@1.21.7))
|
||||||
|
optionalDependencies:
|
||||||
|
typescript: 5.9.3
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- eslint-import-resolver-webpack
|
||||||
|
- eslint-plugin-import-x
|
||||||
|
- supports-color
|
||||||
|
|
||||||
eslint-config-next@15.3.8(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3):
|
eslint-config-next@15.3.8(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@next/eslint-plugin-next': 15.3.8
|
'@next/eslint-plugin-next': 15.3.8
|
||||||
@@ -11316,6 +11267,21 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@1.21.7)):
|
||||||
|
dependencies:
|
||||||
|
'@nolyfill/is-core-module': 1.0.39
|
||||||
|
debug: 4.4.3
|
||||||
|
eslint: 9.39.4(jiti@1.21.7)
|
||||||
|
get-tsconfig: 4.13.7
|
||||||
|
is-bun-module: 2.0.0
|
||||||
|
stable-hash: 0.0.5
|
||||||
|
tinyglobby: 0.2.15
|
||||||
|
unrs-resolver: 1.11.1
|
||||||
|
optionalDependencies:
|
||||||
|
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
|
||||||
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.6.1)):
|
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.6.1)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nolyfill/is-core-module': 1.0.39
|
'@nolyfill/is-core-module': 1.0.39
|
||||||
@@ -11331,6 +11297,17 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
eslint-module-utils@2.12.1(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7)):
|
||||||
|
dependencies:
|
||||||
|
debug: 3.2.7
|
||||||
|
optionalDependencies:
|
||||||
|
'@typescript-eslint/parser': 8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)
|
||||||
|
eslint: 9.39.4(jiti@1.21.7)
|
||||||
|
eslint-import-resolver-node: 0.3.9
|
||||||
|
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@1.21.7))
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
|
||||||
eslint-module-utils@2.12.1(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)):
|
eslint-module-utils@2.12.1(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)):
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 3.2.7
|
debug: 3.2.7
|
||||||
@@ -11342,6 +11319,35 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7)):
|
||||||
|
dependencies:
|
||||||
|
'@rtsao/scc': 1.1.0
|
||||||
|
array-includes: 3.1.9
|
||||||
|
array.prototype.findlastindex: 1.2.6
|
||||||
|
array.prototype.flat: 1.3.3
|
||||||
|
array.prototype.flatmap: 1.3.3
|
||||||
|
debug: 3.2.7
|
||||||
|
doctrine: 2.1.0
|
||||||
|
eslint: 9.39.4(jiti@1.21.7)
|
||||||
|
eslint-import-resolver-node: 0.3.9
|
||||||
|
eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7))
|
||||||
|
hasown: 2.0.2
|
||||||
|
is-core-module: 2.16.1
|
||||||
|
is-glob: 4.0.3
|
||||||
|
minimatch: 3.1.5
|
||||||
|
object.fromentries: 2.0.8
|
||||||
|
object.groupby: 1.0.3
|
||||||
|
object.values: 1.2.1
|
||||||
|
semver: 6.3.1
|
||||||
|
string.prototype.trimend: 1.0.9
|
||||||
|
tsconfig-paths: 3.15.0
|
||||||
|
optionalDependencies:
|
||||||
|
'@typescript-eslint/parser': 8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- eslint-import-resolver-typescript
|
||||||
|
- eslint-import-resolver-webpack
|
||||||
|
- supports-color
|
||||||
|
|
||||||
eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)):
|
eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@rtsao/scc': 1.1.0
|
'@rtsao/scc': 1.1.0
|
||||||
@@ -11371,6 +11377,25 @@ snapshots:
|
|||||||
- eslint-import-resolver-webpack
|
- eslint-import-resolver-webpack
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4(jiti@1.21.7)):
|
||||||
|
dependencies:
|
||||||
|
aria-query: 5.3.2
|
||||||
|
array-includes: 3.1.9
|
||||||
|
array.prototype.flatmap: 1.3.3
|
||||||
|
ast-types-flow: 0.0.8
|
||||||
|
axe-core: 4.11.1
|
||||||
|
axobject-query: 4.1.0
|
||||||
|
damerau-levenshtein: 1.0.8
|
||||||
|
emoji-regex: 9.2.2
|
||||||
|
eslint: 9.39.4(jiti@1.21.7)
|
||||||
|
hasown: 2.0.2
|
||||||
|
jsx-ast-utils: 3.3.5
|
||||||
|
language-tags: 1.0.9
|
||||||
|
minimatch: 3.1.5
|
||||||
|
object.fromentries: 2.0.8
|
||||||
|
safe-regex-test: 1.1.0
|
||||||
|
string.prototype.includes: 2.0.1
|
||||||
|
|
||||||
eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4(jiti@2.6.1)):
|
eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4(jiti@2.6.1)):
|
||||||
dependencies:
|
dependencies:
|
||||||
aria-query: 5.3.2
|
aria-query: 5.3.2
|
||||||
@@ -11398,14 +11423,32 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
eslint: 9.39.4(jiti@2.6.1)
|
eslint: 9.39.4(jiti@2.6.1)
|
||||||
|
|
||||||
eslint-plugin-react-refresh@0.4.26(eslint@9.39.4(jiti@1.21.7)):
|
|
||||||
dependencies:
|
|
||||||
eslint: 9.39.4(jiti@1.21.7)
|
|
||||||
|
|
||||||
eslint-plugin-react-refresh@0.4.26(eslint@9.39.4(jiti@2.6.1)):
|
eslint-plugin-react-refresh@0.4.26(eslint@9.39.4(jiti@2.6.1)):
|
||||||
dependencies:
|
dependencies:
|
||||||
eslint: 9.39.4(jiti@2.6.1)
|
eslint: 9.39.4(jiti@2.6.1)
|
||||||
|
|
||||||
|
eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@1.21.7)):
|
||||||
|
dependencies:
|
||||||
|
array-includes: 3.1.9
|
||||||
|
array.prototype.findlast: 1.2.5
|
||||||
|
array.prototype.flatmap: 1.3.3
|
||||||
|
array.prototype.tosorted: 1.1.4
|
||||||
|
doctrine: 2.1.0
|
||||||
|
es-iterator-helpers: 1.3.1
|
||||||
|
eslint: 9.39.4(jiti@1.21.7)
|
||||||
|
estraverse: 5.3.0
|
||||||
|
hasown: 2.0.2
|
||||||
|
jsx-ast-utils: 3.3.5
|
||||||
|
minimatch: 3.1.5
|
||||||
|
object.entries: 1.1.9
|
||||||
|
object.fromentries: 2.0.8
|
||||||
|
object.values: 1.2.1
|
||||||
|
prop-types: 15.8.1
|
||||||
|
resolve: 2.0.0-next.6
|
||||||
|
semver: 6.3.1
|
||||||
|
string.prototype.matchall: 4.0.12
|
||||||
|
string.prototype.repeat: 1.0.0
|
||||||
|
|
||||||
eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@2.6.1)):
|
eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@2.6.1)):
|
||||||
dependencies:
|
dependencies:
|
||||||
array-includes: 3.1.9
|
array-includes: 3.1.9
|
||||||
@@ -11432,16 +11475,6 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
eslint: 9.39.4(jiti@2.6.1)
|
eslint: 9.39.4(jiti@2.6.1)
|
||||||
|
|
||||||
eslint-plugin-storybook@0.11.6(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3):
|
|
||||||
dependencies:
|
|
||||||
'@storybook/csf': 0.1.13
|
|
||||||
'@typescript-eslint/utils': 8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3)
|
|
||||||
eslint: 9.39.4(jiti@1.21.7)
|
|
||||||
ts-dedent: 2.2.0
|
|
||||||
transitivePeerDependencies:
|
|
||||||
- supports-color
|
|
||||||
- typescript
|
|
||||||
|
|
||||||
eslint-plugin-storybook@0.11.6(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3):
|
eslint-plugin-storybook@0.11.6(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@storybook/csf': 0.1.13
|
'@storybook/csf': 0.1.13
|
||||||
@@ -13551,33 +13584,6 @@ snapshots:
|
|||||||
|
|
||||||
tslib@2.8.1: {}
|
tslib@2.8.1: {}
|
||||||
|
|
||||||
tsup@8.3.6(jiti@1.21.7)(postcss@8.5.8)(typescript@5.6.3)(yaml@2.8.3):
|
|
||||||
dependencies:
|
|
||||||
bundle-require: 5.1.0(esbuild@0.24.2)
|
|
||||||
cac: 6.7.14
|
|
||||||
chokidar: 4.0.3
|
|
||||||
consola: 3.4.2
|
|
||||||
debug: 4.4.3
|
|
||||||
esbuild: 0.24.2
|
|
||||||
joycon: 3.1.1
|
|
||||||
picocolors: 1.1.1
|
|
||||||
postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.8)(yaml@2.8.3)
|
|
||||||
resolve-from: 5.0.0
|
|
||||||
rollup: 4.60.0
|
|
||||||
source-map: 0.7.6
|
|
||||||
sucrase: 3.35.1
|
|
||||||
tinyexec: 0.3.2
|
|
||||||
tinyglobby: 0.2.15
|
|
||||||
tree-kill: 1.2.2
|
|
||||||
optionalDependencies:
|
|
||||||
postcss: 8.5.8
|
|
||||||
typescript: 5.6.3
|
|
||||||
transitivePeerDependencies:
|
|
||||||
- jiti
|
|
||||||
- supports-color
|
|
||||||
- tsx
|
|
||||||
- yaml
|
|
||||||
|
|
||||||
tsup@8.3.6(jiti@2.6.1)(postcss@8.5.8)(typescript@5.6.3)(yaml@2.8.3):
|
tsup@8.3.6(jiti@2.6.1)(postcss@8.5.8)(typescript@5.6.3)(yaml@2.8.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
bundle-require: 5.1.0(esbuild@0.24.2)
|
bundle-require: 5.1.0(esbuild@0.24.2)
|
||||||
@@ -13632,14 +13638,32 @@ snapshots:
|
|||||||
- tsx
|
- tsx
|
||||||
- yaml
|
- yaml
|
||||||
|
|
||||||
turbo@2.11.10:
|
turbo-darwin-64@2.4.2:
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
turbo-darwin-arm64@2.4.2:
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
turbo-linux-64@2.4.2:
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
turbo-linux-arm64@2.4.2:
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
turbo-windows-64@2.4.2:
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
turbo-windows-arm64@2.4.2:
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
turbo@2.4.2:
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@turbo/darwin-64': 2.11.10
|
turbo-darwin-64: 2.4.2
|
||||||
'@turbo/darwin-arm64': 2.11.10
|
turbo-darwin-arm64: 2.4.2
|
||||||
'@turbo/linux-64': 2.11.10
|
turbo-linux-64: 2.4.2
|
||||||
'@turbo/linux-arm64': 2.11.10
|
turbo-linux-arm64: 2.4.2
|
||||||
'@turbo/windows-64': 2.11.10
|
turbo-windows-64: 2.4.2
|
||||||
'@turbo/windows-arm64': 2.11.10
|
turbo-windows-arm64: 2.4.2
|
||||||
|
|
||||||
tus-js-client@4.3.1:
|
tus-js-client@4.3.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -13690,20 +13714,9 @@ snapshots:
|
|||||||
possible-typed-array-names: 1.1.0
|
possible-typed-array-names: 1.1.0
|
||||||
reflect.getprototypeof: 1.0.10
|
reflect.getprototypeof: 1.0.10
|
||||||
|
|
||||||
typescript-eslint@8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3):
|
|
||||||
dependencies:
|
|
||||||
'@typescript-eslint/eslint-plugin': 8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3)
|
|
||||||
'@typescript-eslint/parser': 8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3)
|
|
||||||
'@typescript-eslint/typescript-estree': 8.57.2(typescript@5.6.3)
|
|
||||||
'@typescript-eslint/utils': 8.57.2(eslint@9.39.4(jiti@1.21.7))(typescript@5.6.3)
|
|
||||||
eslint: 9.39.4(jiti@1.21.7)
|
|
||||||
typescript: 5.6.3
|
|
||||||
transitivePeerDependencies:
|
|
||||||
- supports-color
|
|
||||||
|
|
||||||
typescript-eslint@8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3):
|
typescript-eslint@8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/eslint-plugin': 8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3)
|
'@typescript-eslint/eslint-plugin': 8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3)
|
||||||
'@typescript-eslint/parser': 8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3)
|
'@typescript-eslint/parser': 8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3)
|
||||||
'@typescript-eslint/typescript-estree': 8.57.2(typescript@5.6.3)
|
'@typescript-eslint/typescript-estree': 8.57.2(typescript@5.6.3)
|
||||||
'@typescript-eslint/utils': 8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3)
|
'@typescript-eslint/utils': 8.57.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.6.3)
|
||||||
@@ -13837,17 +13850,6 @@ snapshots:
|
|||||||
d3-time: 3.1.0
|
d3-time: 3.1.0
|
||||||
d3-timer: 3.0.1
|
d3-timer: 3.0.1
|
||||||
|
|
||||||
vite-tsconfig-paths@5.1.4(typescript@5.6.3)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)):
|
|
||||||
dependencies:
|
|
||||||
debug: 4.4.3
|
|
||||||
globrex: 0.1.2
|
|
||||||
tsconfck: 3.1.6(typescript@5.6.3)
|
|
||||||
optionalDependencies:
|
|
||||||
vite: 6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)
|
|
||||||
transitivePeerDependencies:
|
|
||||||
- supports-color
|
|
||||||
- typescript
|
|
||||||
|
|
||||||
vite-tsconfig-paths@5.1.4(typescript@5.6.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)):
|
vite-tsconfig-paths@5.1.4(typescript@5.6.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)):
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
@@ -13870,22 +13872,6 @@ snapshots:
|
|||||||
lightningcss: 1.32.0
|
lightningcss: 1.32.0
|
||||||
terser: 5.46.1
|
terser: 5.46.1
|
||||||
|
|
||||||
vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3):
|
|
||||||
dependencies:
|
|
||||||
esbuild: 0.25.12
|
|
||||||
fdir: 6.5.0(picomatch@4.0.4)
|
|
||||||
picomatch: 4.0.4
|
|
||||||
postcss: 8.5.8
|
|
||||||
rollup: 4.60.0
|
|
||||||
tinyglobby: 0.2.15
|
|
||||||
optionalDependencies:
|
|
||||||
'@types/node': 22.19.15
|
|
||||||
fsevents: 2.3.3
|
|
||||||
jiti: 1.21.7
|
|
||||||
lightningcss: 1.32.0
|
|
||||||
terser: 5.46.1
|
|
||||||
yaml: 2.8.3
|
|
||||||
|
|
||||||
vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3):
|
vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
esbuild: 0.25.12
|
esbuild: 0.25.12
|
||||||
|
|||||||
Reference in New Issue
Block a user