Files
Aislo/A00_Common/b_missing_data_guard.ts
T
eomsangdonandClaude Opus 5 431791c257 feat(B03,B05,B06): 초기 계산 끝까지 업로드 잠금 + 자료 없으면 대시보드로 (결함 3·6 화면측)
업로드 잠금(결함 3)
- 종전에는 전처리(B04)만 끝나면 버튼이 풀려, 노선·횡단이 도는 동안 자료를 또 올릴 수
  있었다. isInitialPipelineRunning()/pollInitialPipeline()을 두어 **횡단 단계가 열릴
  때까지**(3단계가 NOT_STARTED를 벗어날 때까지) 잠근다.
- relockWhileInitialPipelineRuns(): 새로고침·재진입해도 계산이 도는 중이면 다시 잠그고
  스피너를 붙인다. 잠금이 화면 상태로만 있으면 새로고침 한 번에 풀렸다.
- 보관함 연결 경로도 같은 대기 흐름을 탄다.

자료 없으면 대시보드(결함 6)
- b_missing_data_guard 신설 — 근거 자료가 없으면 한 줄 안내 후 B01로 보낸다. 새 자료가
  올라오면 서버가 옛 산출물을 지우므로, 열어 둔 뒷단계 화면은 빈 화면이 아니라
  대시보드로 나가야 한다(2026-08-08 사용자 지시).
- B05: 확정 지표면이 없으면 이동. B06: 노선 또는 종단면이 없으면 이동.

검증: 자료가 없는 신규 프로젝트로 B05 진입 → 안내 후 #/b01-account 로 이동함을
헤드리스 크롬으로 확인. typecheck·prettier 통과, 정적 번들 재빌드.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 19:50:27 +09:00

49 lines
2.1 KiB
TypeScript

/* =============================================================================
* b_missing_data_guard.ts
* "불러올 자료가 없으면 대시보드로" — B04 이후 화면 공용 규칙.
*
* 새 입력 자료를 올리면 서버가 옛 계산 결과를 통째로 지우고 B06까지 다시 계산한다.
* 그래서 사용자가 열어 둔 뒷단계 화면은 근거 자료가 사라진 상태가 된다. 그 화면에서
* 빈 그래프를 보여주거나 오류만 띄우면 사용자는 무엇이 잘못됐는지 알 수 없다.
*
* 이 화면들은 자료를 못 찾으면 **한 줄 안내 후 대시보드로 돌려보낸다**(2026-08-08 사용자
* 지시). 사용자는 대시보드에서 그 프로젝트가 다시 계산 중임을 보고 기다리면 된다.
* ========================================================================== */
import { ROUTES } from "@config/config_frontend";
import { showToast } from "@ui/ui_template_elements";
import { navigateTo } from "./router";
const DEFAULT_MESSAGE = "입력 자료가 새로 올라와 이 화면의 자료가 없습니다. 대시보드로 돌아갑니다.";
let redirecting = false;
/**
* 자료가 없어 화면을 세울 수 없을 때 호출한다. 안내를 띄우고 대시보드로 보낸다.
* 여러 곳에서 동시에 불려도 이동은 한 번만 한다.
*/
export function leaveForDashboard(message: string = DEFAULT_MESSAGE): void {
if (redirecting) return;
redirecting = true;
showToast(message, "warning");
// 토스트를 읽을 시간을 조금 준다.
window.setTimeout(() => {
redirecting = false;
navigateTo(ROUTES.B01_ACCOUNT);
}, 1200);
}
/**
* 필수 자료가 비었으면 대시보드로 보내고 `true`를 돌려준다.
* 호출부는 `if (missingDataLeaves(x)) return;` 형태로 바로 빠져나가면 된다.
*/
export function missingDataLeaves(value: unknown, message?: string): boolean {
const empty =
value === null ||
value === undefined ||
(Array.isArray(value) && value.length === 0) ||
value === false;
if (empty) leaveForDashboard(message);
return empty;
}