chore(요구): 요구 401 다시 조사 — 프로젝트마다 따로 동작
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,178 @@
|
||||
# 요구 401 — 프로젝트마다 따로 동작 · 떠날 때 묻기 · 다시 조사
|
||||
|
||||
읽기 전용 조사 · 구현 없음 · 근거 = 파일:줄 · 앞 조사 = `docs/raw/요구_1025/_분석_400_세션_비우기.md`(세션 칸 표는 거기 2장 그대로 · 여기는 더해진 것만).
|
||||
|
||||
## 0. 결론
|
||||
|
||||
- 저장소(세션 · localStorage · IndexedDB)는 열쇠마다 프로젝트 id 가 박혀 **화면에 남의 프로젝트 값이 뜨는 길은 없음** — 흠은 「남음 · 쌓임」.
|
||||
- 실제로 **묻어가는 곳은 둘** — ① 모듈 메모리 넷(E03 보강 제원 · B06 흙막이 보냄 기억 · B06 카드 확대 · 카드 패널 스크롤) ② **현재 프로젝트 id 가 탭끼리 공유(localStorage)** — 다른 탭이 프로젝트를 바꾸면 이 탭의 [업로드] · [확정] · 견적 쓰기가 **남의 프로젝트로 감**.
|
||||
- 3D 보관함(IndexedDB) — 열쇠 `{pid}|{주소}` 라 다른 프로젝트에서 못 읽음 · 다른 프로젝트 들 때 지움 · 다만 **보관함은 탭 공용**이라 한 탭의 지우기가 다른 탭 프로젝트 보관분까지 지움(속도만 손해).
|
||||
- 추천 — (1) 탭마다 프로젝트 id(탭 세션 우선) (2) 떠남 한 자리 공용 물음([취소][폐기][저장] · 이미 있는 `leaveOrStay`) (3) 떠난 뒤 그 프로젝트 칸 비움 (4) **다른 프로젝트 들 때 새로고침**(모듈 메모리 통째 초기화 · 빠짐 없음).
|
||||
|
||||
## 1. 저장소 전수
|
||||
|
||||
### 1-1 sessionStorage (탭마다)
|
||||
|
||||
- 400 2장 표 그대로 — 모든 프로젝트 칸이 pid 를 품음 · 진입 비우기에서 빠지는 칸 = D02 `d02_points_{pid}` · E 6칸(`e02~e07_*:{pid}`).
|
||||
- 더함 — `frd_preloaded_signature` 값 = `{pid}|{지문}`(`b_asset_cache.ts:358`) · `frd_preload_target` = 주소만(`:387`) · `aislo:entered-project`(`b_project_switch.ts:17`) = **이미 탭별 「지금 프로젝트」 구실**.
|
||||
- 다른 프로젝트에 보임 — 없음(옛 `b05-profile-alignment-draft:{노선}` 하나뿐 · 387-1 에서 걷음).
|
||||
|
||||
### 1-2 localStorage (탭 공용 · 브라우저 껐다 켜도 남음)
|
||||
|
||||
| 키 | 자리 | pid 열쇠 | 비움 | 다른 프로젝트에 보임 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| `frd_current_project_id` | 읽기 30파일(아래 2장) · 쓰기 `b_workflow_nav.ts:108` · `B02_ProjRegister_UI_Page.ts:270` · `group_workflow.ts:117` | 값이 곧 pid | 로그아웃 · 지워진 프로젝트(`b_workflow_nav.ts:88`) | **탭끼리 바뀜 → 2장** |
|
||||
| `aislo:pref:routeedit-view/locks/snap-step:{pid}` | `b_page_state.ts:69-74` | 있음 | 없음 · 계정 동기화(`:338-410`) · 지운 프로젝트 키는 서버가 버림(`test_b01_ui_prefs_dead_project.py`) | 없음 |
|
||||
| `aislo:pref:*`(그 밖) | `b_page_state.ts:47-112` | 없음(화면 취향) | — | 계정 공용 · 프로젝트 값 아님 |
|
||||
| `b03_las_free_{pid}` | `B03_FileInput_UI_Page.ts:82 · 597` · `B01_Dashboard_UI_PlanLink.ts:30` | 있음 | 없음 | 없음 · **설계 설정이 브라우저에만 삶**(다른 PC 에선 빠짐) |
|
||||
| `b03_project_state_{pid}` · `b03_upload_{pid}_{파일}_{크기}` | `B03_FileInput_State.ts:21` · `B03_FileInput_UI_Support.ts:208` | 있음 | 끝나면 지움 | 없음 |
|
||||
| `OPEN_WEB_CAD__RECOVERY__b07:{pid}:{도면}` | `B07_DesignDetail_UI_Save.ts:53 · 190` · `openwebcad/src/helpers/autosave.ts:40` | 있음 | [초기화] · 저장 | 없음 · **저장 안 한 CAD 고침의 구명줄** |
|
||||
| `b06:balance-balloon-offset:{pid}:{노선}` | `common_util_mass_haul_balloon.ts:7 · 36` · `design_profile.ts:489` | 있음 | 없음 | 없음 |
|
||||
| `aislo-cad-block-library` · `frd_theme` · `frd_lang` · `frd_touch_mode` · `aislo.b01.homeLayout` · `aislo:owner` · `m02.dfpanel.*` · `aislo-ss-recent-units` · M02 도면 복구 | — | 없음 | — | 계정 · 화면 공용 |
|
||||
| `OPEN_WEB_CAD__DRAWING` | `openwebcad/.../export-entities-to-local-storage.ts:7` | 없음 | — | 없음 — 호스트 모드는 `requestHostSave`(`commands.file.ts:22`) · 읽는 곳(`import-entities-from-local-storage`) 부르는 곳 0 |
|
||||
|
||||
### 1-3 IndexedDB (탭 공용)
|
||||
|
||||
- 하나뿐 — `aislo-asset-cache` v2 · 칸 `assets` · 열쇠 `{pid}|{주소}` · 색인 `projectId`(`b_asset_cache.ts:16-57 · 120`).
|
||||
- 담는 것 — 지표면 미리보기 glb(8~19 MB · `docs/raw/조사/2026-10-16_341_부록4_영구저장.md:106`) · 등고선 · 설계 지형 격자(`B05_Profile_Api_TerrainGrid.ts:45`) · 도엽 표시본 route · drainage(`b_asset_cache.ts:452-458`) · 3D 코리도 노선마다 ~17 MB(`B05_Profile_UI_Corridor.ts:99-117` · 옛 열쇠는 앞머리 지움) · D03 격자 · 도엽(`D03_PlanAnalysis_Api.ts:135` · `_UI_Layers.ts:210`). 한 프로젝트 ≈ 30~60 MB(어림).
|
||||
- 지움 — 다른 프로젝트 들 때(`b_project_switch.ts:119`) · B04 열 때(`B04_PreProcess_UI_Page.ts:98`) · B05 열 때(`design_view_profile.ts:100`) · B11(`B11_Status_UI_Loading.ts:87`) · 로그아웃 전부(`:139`). → 남는 것은 늘 「마지막 프로젝트 한 벌」 · 크기 늘어남 없음.
|
||||
- 다른 프로젝트에 보임 — 없음(열쇠). **탭 공용 흠** — 탭 A(X)가 B05 · B04 · B11 을 열면 탭 B(Y) 보관분을 지움 → B 는 다시 받음(값 섞임 아님 · 속도).
|
||||
|
||||
### 1-4 모듈 메모리 (SPA 수명 · 새로고침 전까지)
|
||||
|
||||
**묻어가는 것(pid 열쇠 없음 · 실제 길)**
|
||||
|
||||
| 자리 | 무엇 | 길 |
|
||||
| --- | --- | --- |
|
||||
| `E03_StabSection_UI_Support.ts:67` `layout` | 보강(네일 · 앵커) 제원 입력 | X 에서 친 행 수 · 간격 · 길이가 Y 의 E03 보강 칸에 그대로 · 바꿀 때만 기본값(`:195`) |
|
||||
| `B06_Section_UI_Page_Pipe_Options.ts:218 · 242` `soilSent` | 흙막이 단 「마지막으로 보낸 값」 열쇠 = `측점:역할` | Y 같은 측점에서 X 때와 같은 높이 · 형태를 치면 `want === sent` 로 **보냄 건너뜀** → Y 조정값 안 바뀜(`:253-259`) · 같은 프로젝트 새 노선 번호에서도 같은 흠 |
|
||||
| `B06_Section_UI_Cross_View_Zoom.ts:36` `cardZoomStates` | 횡단 카드 확대 · 이동 · 열쇠 = `station_id`(`B06_Section_UI_Cross_View.ts:391 · 638`) | `station_id` = `station_{mm}`(`B05_Profile_Engine_Sections_Core.py:504`) → 프로젝트끼리 같음 → X 의 0+120 확대가 Y 의 0+120 카드에 |
|
||||
| `B06_Section_UI_Cross_Structure_Panel.ts:126` `panelScrollTops` | 카드 패널 스크롤 · 열쇠 `station_id`(`B06_Section_UI_Cross_View_Panels.ts:103`) | 위와 같음(가벼움) |
|
||||
|
||||
**남기만 함(pid 열쇠 · 다른 프로젝트에 안 보임 · 메모리만 쌓임)**
|
||||
|
||||
- 설계 — `design_store.ts:166 · 179` · `design_page_data.ts:25` · `design_pipeline_page.ts:137` · `design_page_route.ts:8` · `design_leave.ts:71` · `B06_Section_Section_Store.ts:73`(상세 한 벌 ~1.5 M 자) · `B06_Section_Section_Canon.ts:30-99` · `B06_Section_Station_Keys.ts:52-55` · `B05_Profile_Api_TerrainGrid.ts:30-32`(격자 배열) · `B05_Profile_Api_PlusStations.ts:16-19` · `B05_Profile_Api_HaulPlan.ts:47` · `B05_Profile_UI_Corridor.ts:48`(한 벌만) · `B05_Profile_UI_RouteEdit_Apply.ts:78` · `_StructureMarks.ts:75`.
|
||||
- 그 밖 — `b_workflow_nav.ts:44`(pid 견줌) · `B07_DesignDetail_Prefetch.ts:38-40`(다른 프로젝트면 버림 `:66-69`) · `B08_Quantity_UI_Milestone_State.ts:65-66`(`savedFor`) · `B04_PreProcess_UI_MapLayers.ts:52`.
|
||||
- 갈아끼움형(열 때마다 다시 둠 · 가벼움) — `common_util_structure_station.ts:42-57` · `design_pipe_ids.ts:25` · `design_calc_sites.ts:49-51` · `B07_DesignDetail_UI_Page.ts:104-106`(다시 세우기 직전만).
|
||||
|
||||
**계정 · 마스터 공용(프로젝트 값 아님)** — `B05_Profile_Api_Structures.ts:203`(구조물 정의 = 마스터 한 벌 · `M02_SO_Router.py:81`) · `A06_Login_Api_Fetch.ts:51` · `B09_Estimation_UI_Tabs_Groups.ts:62`(보기 취향).
|
||||
|
||||
### 1-5 그 밖
|
||||
|
||||
- 서비스 워커 — B03 하나 · 핑만(`B03_FileInput_ServiceWorker.ts` · fetch 가로채기 없음) → Cache API 없음.
|
||||
- HTTP 캐시 — 주소에 pid(`/projects/{pid}/…`) · 위성사진 데우기(`b_asset_cache.ts:460`)도 pid 주소.
|
||||
- CAD — iframe 이 페이지마다 새로 섬 · 떠나면 사라짐(`cad_host.ts:147 · 378`) → CAD 메모리 안 묻어감.
|
||||
- 3D(three) · 지도 — 모듈 단 렌더러 · 지도 객체 없음(페이지 안에서 만들고 `dispose` · `router.ts:208`) · 코리도 워커는 상태 없음(`B05_Profile_UI_Corridor_Worker_Client.ts:21`).
|
||||
|
||||
## 2. 여러 탭 — 현재 프로젝트 id 공유
|
||||
|
||||
주소에 프로젝트가 없음 — 모든 페이지가 `localStorage.frd_current_project_id` 로 프로젝트를 앎(탭 공용). B05 · B06 만 연 id 를 고정(`design_store.ts:84-98` `pinDraftProject` · `design_page.ts:128`).
|
||||
|
||||
**누를 때 다시 읽는 곳 — 탭 B 가 Y 로 바꾼 뒤 탭 A(X)에서 누르면 Y 로 감**
|
||||
|
||||
| 자리 | 누름 | 결과 |
|
||||
| --- | --- | --- |
|
||||
| `B03_FileInput_UI_Page_Flow.ts:196` · `:131` · `:73` | [업로드] · 임시 묶음 붙이기 · 이어 올리기 찾기 | **X 화면에서 고른 파일이 Y 에 올라감** |
|
||||
| `B04_PreProcess_UI_Page.ts:320`(`getProjectId`) ← `:164 · 415 · 460 · 468 · 591 · 629` | 도엽 방식 · 필터 · [확정] · [초기화] | [초기화] = Y 자료를 X 화면에 그림 · [확정] = Y 주소로 X 모델 id |
|
||||
| `B09_Estimation_UI_Tabs_Bill_Link.ts:92` | 서고 연결(POST library · library-inputs) | **Y 견적에 씀** |
|
||||
| `B09_Estimation_UI_Tabs_Base_Quote.ts:20` | 견적서 올림 · 지움 · 받음(`:35 · 66 · 83`) | **Y 견적서에 올림 · Y 것을 지움** |
|
||||
| `B09_Estimation_UI_Haul_Modal.ts:73` | 운반 미리보기 | Y 값으로 셈(읽기) |
|
||||
|
||||
**화면을 새로 그릴 때 — 탭 A 가 말없이 Y 로 넘어감**
|
||||
|
||||
- D · E 단계 아이콘 · [<] [>] = `navigateTo` 만(`group_workflow.ts:81-83`) → 다음 페이지 render 가 localStorage 를 읽음(`E02:107` · `D02:71` 등) → **X 작업 중 다음 단계가 Y 로 뜸**(`enterProject` 안 거침).
|
||||
- 새로고침 · 뒤로 가기 — 같은 길. 세션 초안은 X 것이 남고 화면은 Y.
|
||||
- 반대 방향 — 탭 A 의 B 단계 이동(`goToWorkflowStage(X)`)이 localStorage 를 X 로 다시 씀(`b_workflow_nav.ts:108`) → 탭 B 의 다음 render 가 X 로 넘어감(서로 뺏음).
|
||||
|
||||
그 밖 render 때 한 번 읽는 곳(그 화면 동안은 안전) — `B07_UI_Page:109` · `B08_UI_Page:115` · `B09_UI_Shell:124` · `B09_Draft_Print_Page:119` · `B11_Loading:54` · `b_page_scaffold:110` · `ui_template_overlay:165` · `B03_PlanImport:103` · `D02:71` · `D03:82` · `D04:108` · `E02:107` · `E03:95` · `E04:138` · `E05:94` · `E06:83` · `E07:159`.
|
||||
|
||||
IndexedDB 도 탭 공용 — 1-3 끝 줄.
|
||||
|
||||
## 3. 서버 쪽
|
||||
|
||||
- 세션 표에 프로젝트 칸 없음(`db_management/002_auth_security.sql:21-31`) · 「마지막 프로젝트」 기억 없음.
|
||||
- 계정 취향 `user_ui_prefs`(`018_user_ui_prefs.sql`) — 프로젝트 범위 취향은 pid 열쇠 · 지운 프로젝트 키는 버림.
|
||||
- 모듈 캐시 — 모두 프로젝트 경로 · pid · 파일 지문 열쇠(`B04_Router_Inflow.py:37` · `B07_Router_Support_Overlay.py:35` · `E03_Router.py:147 · 520` · `_JOBS` 류) · 열쇠 없는 `lru_cache` 는 엔진 코드 지문뿐(`E03_Router.py:121` 등).
|
||||
- → 서버 쪽 섞임 없음.
|
||||
|
||||
## 4. 떠날 때 묻기
|
||||
|
||||
### 고침 판별이 이미 있는 곳
|
||||
|
||||
| 페이지 | 판별 | 저장 | 지금 떠남 |
|
||||
| --- | --- | --- | --- |
|
||||
| B05 · B06 | `designDirty`(`design_leave.ts`) | `saveSharedDesign` | 물음 [취소][폐기][저장](`design_leave.ts:102-128`) |
|
||||
| B04 | 유역 고침 `dirty`(`B04_PreProcess_UI_Basins.ts:166 · 310`) | 유역 저장 | **없음** |
|
||||
| B07 | `cadDirty || tabs.anyDirty()`(`B07_DesignDetail_UI_Page.ts:222-223`) | B07 저장(`_UI_Save.ts:180`) | **없음**(도면 바꿀 때만 물음 · CAD 복구본은 남음) |
|
||||
| B08 | 없음(`saveShown` 늘 저장 · `B08_Quantity_UI_Page.ts:147`) · 세션 `b08-*` 칸 있음 = 고침 | `saveShown` | 단계 이동만 저장 |
|
||||
| B09 | `readState("b09-estimation")` 있음 = 고침(`B09_Estimation_UI_Shell.ts:306-309`) | `saveChanged` | 단계 이동만 저장 |
|
||||
| D02 · D03 | `dirty()`(`D02:104` · `D03:173`) | `store` · `save` | **말없이 저장**(`D02:90` · `D03:168`) |
|
||||
| D04 | `draft()`(`D04:273`) | 확정 저장 | 없음 |
|
||||
| E02 | `dirty`(`E02:146`) | `store` | 말없이 저장 |
|
||||
| E05 · E06 | `dirty`(`E05:146` · `E06:158`) | `putBook` · `putJoints` | 없음 |
|
||||
| E03 | 세션 `e03_prob_cache` 만 | — | 없음 |
|
||||
|
||||
### 공용 물음 하나 (제안)
|
||||
|
||||
- 틀은 이미 있음 — `ui_template_leave_dialog.ts:68` `leaveOrStay(message, {save, stillDirty, discard})` · [취소=머묾][폐기=버리고 나가기][저장] · 저장 실패 · 고침 남음 = 머묾. B05 · B06 · M02 가 씀.
|
||||
- 자리도 이미 하나 — `router.ts:100` `setLeaveGuard` 한 칸 + `main.ts:89-100` hashchange 가 기다림.
|
||||
- 더할 것 = 페이지가 셋만 알리는 함수 하나 — `guardProjectLeave(root, { dirty, save, discard? })` = `guardDesignLeave`(`design_leave.ts:102-128`)를 일반화(같은 페이지 안 이동 재무장 · `beforeunload` · `root.isConnected` 풀림 포함).
|
||||
- `mountGroupStep` 의 `beforeLeave`(`group_workflow.ts:64-71 · 81-83`)를 `{dirty, save}` 로 바꿔 같은 함수를 씀 → D · E 는 페이지 손질 한 줄씩.
|
||||
- 등록 방식 = 페이지마다 한 번 부름(새 등록표 만들지 않음 · 지금 칸 하나 그대로).
|
||||
|
||||
## 5. 제안 — 프로젝트 따로 동작
|
||||
|
||||
### 규칙
|
||||
|
||||
1. **탭마다 프로젝트** — `currentProjectId()` = 탭 세션 `aislo:entered-project` 먼저 · 없으면 localStorage(새 탭 = 마지막 프로젝트) · `setCurrentProject(id)` = 둘 다 씀. 30파일 직접 읽기를 이것으로 · 누를 때 읽는 곳(2장 표)은 render 때 잡은 id 로.
|
||||
2. **떠날 때 묻기** — 4장 공용 물음 · 고침 없으면 그냥 넘어감.
|
||||
3. **떠난 뒤 비움**(직전 화면 = 프로젝트 화면 · 다음 = 아님 · `main.ts` `renderAll` 첫머리) — 세션 프로젝트 칸 전부(400 (나) 등록표 + D02 · E) · `frd_preloaded_signature` · 3D 보관함 그 프로젝트 몫(결정 2). 탭 프로젝트 id 는 남김(뒤로 가기 · 같은 탭 재진입용 · 값 아님).
|
||||
4. **다른 프로젝트 들 때 새로고침** — `enterProject` 가 표식 다름을 본 뒤 비움 → `location.reload()`(주소 = 갈 단계). 모듈 메모리 묻어감(1-4 넷 + 앞으로 생길 것)을 한 자리에서 끊음 · 로그아웃이 이미 같은 방식(`b_project_switch.ts:128-130`).
|
||||
5. **남김** — 로그인 · 계정 취향 · 화면 취향 · 입력 설정 · 1-2 의 pid 열쇠 칸(결정 6) · CAD 복구본(폐기 고르면 그 도면 복구본만 지움).
|
||||
6. **덤 고침** — `soilSent` 열쇠에 `{pid}:{노선}` 붙임(같은 프로젝트 새 노선에서도 흠 · 새로고침으로 못 고침) · B04 · B05 · B11 의 `purgeOtherProjects` 세 곳 지움(`enterProject` 가 그물 · 다른 탭 보관분 안 지움).
|
||||
|
||||
### 비용 (같은 프로젝트로 돌아올 때)
|
||||
|
||||
| 비움 | 다시 드는 것 | 어림 |
|
||||
| --- | --- | --- |
|
||||
| 세션 초안 · 결과 | B05 열기 = 새 탭과 같음 | 386-0 측정 B05 7.5~7.8 s · B06 2.1~4.1 s · /api 22~23(386-2 뒤 /api 줄음 · 시간 재측정 없음) |
|
||||
| 3D 보관함 | B11 준비 다시 받음 · B05 3D 코리도 다시 받음 | glb 8~19 MB + 등고선 + 격자 + 도엽 넷 + 코리도 ~17 MB ≈ 30~60 MB → 같은 PC · 랩 1~3 s · Tailscale 100 Mbps 3~5 s · 20 Mbps 12~25 s(어림 · 측정 없음 · 서버는 `_derived` 라 셈 없음) |
|
||||
| 새로고침(다른 프로젝트 들 때만) | 앱 묶음 한 번 | 빌드판 1 s 안팎 · vite 5173 몇 초(어림) |
|
||||
|
||||
→ 측정 한 번 권함 — 검증 프로젝트에서 「대시보드 → 같은 프로젝트 B05」 세션 비움 전후 · 보관함 비움 전후 초.
|
||||
|
||||
### 고칠 파일 · 창 나눔 (파일 겹침 없음)
|
||||
|
||||
| 창 | 파일 | 일 |
|
||||
| --- | --- | --- |
|
||||
| 창1 공용(먼저 커밋) | `A00_Common/b_project_switch.ts` | `currentProjectId` · `setCurrentProject` · `leaveProject` · `guardProjectLeave` · 들 때 새로고침 |
|
||||
| 창1 | `A00_Common/b_asset_cache.ts` | `purgeProject(pid)`(`IDBKeyRange.only` · 6줄) |
|
||||
| 창1 | `A00_Common/b_page_state.ts` | 등록표 D02 · E 7줄(400 그대로) |
|
||||
| 창1 | `A00_Common/router.ts` | `isProjectRoute` 내보냄(`:108-117` + `draft.project`) · `dropGoneProject` 길은 helper |
|
||||
| 창1 | `A00_Common/b_workflow_nav.ts` · `group_workflow.ts` · `b_page_scaffold.ts` · `ui_template/ui_template_overlay.ts` · `design/design_store.ts` · `design/design_page.ts` · `design/design_leave.ts` | helper 로 · `beforeLeave` → `{dirty, save}` · `guardDesignLeave` 는 공용 함수 위 얇은 껍질 |
|
||||
| 창1(마지막) | `A00_Common/main.ts` | `renderAll` 에서 떠남이면 `leaveProject` — 창2 · 창3 가드 합친 뒤 |
|
||||
| 창2 B | `B02_ProjRegister_UI_Page.ts` · `B03_FileInput_UI_Page.ts` · `_Page_Flow.ts` · `_PlanImport.ts` · `B04_PreProcess_UI_Page.ts`(675줄 · 늘면 쪼갬) · `B07_DesignDetail_UI_Page.ts` · `B08_Quantity_UI_Page.ts` · `B09_Estimation_UI_Shell.ts` · `_Tabs_Bill_Link.ts` · `_Tabs_Base_Quote.ts` · `_Haul_Modal.ts` · `draft/B09_Draft_Print_Page.ts` · `B11_Status_UI_Loading.ts` · `A00_Common/design/design_view_profile.ts` | helper · 누를 때 id = render 때 id · 가드(B04 · B07 · B08 · B09) · 보관함 지우기 세 곳 뺌 |
|
||||
| 창2 | `B06_Section/B06_Section_UI_Page_Pipe_Options.ts` | `soilSent` 열쇠에 pid · 노선 |
|
||||
| 창3 D · E | `D02` · `D03` · `D04` · `E02` · `E03`(629줄) · `E04` · `E05` · `E06` · `E07` `_UI_Page.ts` | helper · 세션 직접 → 등록표 · `beforeLeave` → `{dirty, save}`(D04 · E03 · E05 · E06 새로) |
|
||||
|
||||
차례 = 창1 공용 → 창2 · 창3 병행 → 창1 `main.ts` 떠남 연결. 새로고침(규칙 4)을 고르면 1-4 의 E03 · 카드 확대 · 스크롤은 손대지 않음.
|
||||
|
||||
### 더할 시험 (`resources/tester`)
|
||||
|
||||
- `test_401_project_isolation.py` + `helper_401_project_isolation.cjs`(`helper_290_1` · `helper_343_3` 꼴)
|
||||
- 두 탭 흉내(세션 둘 · localStorage 하나) — 탭 B 가 Y 로 바꿔도 탭 A `currentProjectId()` = X · 새 탭 = Y.
|
||||
- `leaveProject(X)` — B · D · E 프로젝트 칸 · 준비 표식 0 · 프로젝트 밖 칸(OTP · adminCompany · M01 · M02 초안 · tint) · pref · CAD 복구본 그대로.
|
||||
- `purgeProject(X)` — X 줄만 지움 · Y 줄 그대로.
|
||||
- 소스 대조 — `localStorage.getItem(CURRENT_PROJECT_ID_KEY)` 가 `b_project_switch.ts` 밖에 0 · `purgeOtherProjects(` 부르는 곳 = `b_project_switch.ts` 만 · `soilSent` 열쇠에 projectId.
|
||||
- `test_560_4_leave_save.py` 넓힘 — B04 · B07 · B08 · B09 · D02~D04 · E02 · E03 · E05 · E06 이 가드를 둠 · `main.ts` 가 가드 뒤 `leaveProject(`.
|
||||
- `test_290_1_project_purge.py` 시드 보강 — D02 · E 칸이 진입 비우기에 걸림.
|
||||
- 화면(ORCA · 탭 둘 = 「ORCA 탭 하나」 규칙과 어긋남 → 사용자 허락 필요 · 아니면 한 탭에서 localStorage 를 eval 로 바꿔 흉내) — 탭 A X B03 · B04 · B09 누름이 X 로 감 · B05 고침 → 집 → 셋 물음 · 다른 프로젝트 E03 보강 칸 = 기본값 · 같은 프로젝트 재진입 시간 재기.
|
||||
|
||||
## 갈래 갈리는 결정
|
||||
|
||||
1. **비우는 때** — 떠날 때 비움(400 요구 · 저장소 가벼움 · 돌아오면 B05 새 탭처럼 7.5 s 대) / 다른 프로젝트 들 때만 비움(지금 그물 넓힘 · 같은 프로젝트 돌아오면 빠름 · 따로 동작은 둘 다 지켜짐).
|
||||
2. **3D 보관함** — 떠날 때 그 프로젝트 몫 지움(돌아오면 B11 30~60 MB 다시 받음) / 남김(열쇠에 pid 라 다른 프로젝트가 못 읽음 · 다른 프로젝트 들 때 지움 · 08-01 「대시보드 다녀오면 건너뜀」 유지).
|
||||
3. **모듈 메모리** — 다른 프로젝트 들 때 새로고침(빠짐 없음 · 한 번 로드 비용) / 묻어가는 넷만 고침(E03 보강 · `soilSent` · 카드 확대 · 스크롤 · 앞으로 생길 것은 못 막음).
|
||||
4. **탭마다 프로젝트** — 탭 세션 id 먼저(손질 = 읽는 자리 바꿈) / 주소에 프로젝트 id `?p=`(북마크 · 주소 공유 가능 · 길 · 링크 손질 큼).
|
||||
5. **D02 · D03 · E02 떠남** — 「말없이 저장」을 공용 셋 물음으로 바꿈 / 그대로 둠.
|
||||
6. **pid 열쇠 localStorage 칸**(`routeedit-*` 화면 기억 · 유토곡선 풍선 자리 · `b03_las_free` · CAD 복구본) — 남김(묻어가지 않음 · 화면 기억) / 떠날 때 지움. `b03_las_free` 는 설계 설정이라 서버로 옮김 따로 검토.
|
||||
Reference in New Issue
Block a user