feat: 웹UI Phase 4 완료 — CSS 분리, pane 중첩 버그 수정, app.js 제거

Phase 4 — CSS 분리:
- style.css(2,230→670줄)에서 탭별 스타일을 css/<tab>.css 8개로 분할
  (t2s:437, pid:236, pb:106, hist:100, evt:50, opcsvr:14, llmchat:501, kbadmin:109)
- 크로스탭 공유 스타일(nm-*, hist-status, dt-picker 등)은 style.css 잔류
- index.html head에 11개 CSS link 태그 (1 style.css + 8 tab + 2 lib)

app.js 제거:
- index.html에서 <script src=/js/app.js> 참조 제거
- app.js → 10줄 placeholder (이미 Phase 0-3에서 모든 로직 이전 완료)

Pane wrapper 버그 수정:
- 16개 pane 파일에서 <section class=pane id=pane-xxx> wrapper 제거
- activateTab이 innerHTML로 주입 시 중첩 section + display:none 발생
- 내용이 전혀 안 보이는 문제 해결

문서 갱신:
- AGENTS.md: Frontend Architecture 섹션 추가
- 웹UI-개선플랜-byOPUS.md: Phase 0-4 완료 상태로 갱신, 결과 검증 추가

MCP:
- server.py: timestamp 정밀도 개선 등
This commit is contained in:
windpacer
2026-05-24 18:47:25 +09:00
parent 32a442abd6
commit 9bcba0a317
47 changed files with 8476 additions and 8329 deletions

View File

@@ -95,3 +95,52 @@ Vanilla JS SPA. `wwwroot/index.html` + `js/app.js` + `css/style.css`. No build s
## Deploy
`sudo bash deploy.sh` — publishes to `/opt/ExperionCrawler`, creates systemd service `experioncrawler`, sets up PKI dirs. Service runs as `www-data`.
---
## Frontend Architecture (refactored 2026-05-24)
### Directory layout
```
wwwroot/
├── index.html ← data-src shell (229 lines, -87%)
├── panes/ ← 16 pane HTML partials (lazy-loaded on tab click)
├── js/
│ ├── core.js ← esc/setGlobal/log/api/fmtTs/fmtVal/parseEnumPv
│ │ activateTab/paneInit + dt* date picker
│ ├── app.js ← placeholder (10 lines)
│ ├── cert.js conn.js … ← 15 tab-specific files
│ └── docs.js ← separately maintained
├── css/ ← style.css monolithic (Phase 4 pending)
└── lib/ ← unchanged
```
### Tab lifecycle
1. User clicks `.nav-item[data-tab="X"]`
2. `core.js:activateTab(X)` fires:
- If `pane-X` not loaded → `fetch(/panes/X.html)``innerHTML` inject
- Activate pane + nav highlight
- `paneInit[X]?.()` — each tab file registers its own init
### PaneInit registration
| Tab | Init function | File |
|-----|--------------|------|
| docs | `paneInit.docs = docsInit` | `docs.js` |
| opcsvr | `paneInit.opcsvr = srvLoad` | `opcsvr.js` |
| t2s | `paneInit.t2s = t2sInitMode` | `t2s.js` |
| fast | `paneInit.fast = function() { … }` | `fast.js` |
| pid | `paneInit.pid = async function() { … }` | `pid.js` |
| llmchat | `paneInit.llmchat = function() { … }` | `llmchat.js` |
| kbadmin | `paneInit.kbadmin = async function() { … }` | `kbadmin.js` |
| cert/conn/crawl/db/nm-dash/pb/hist/evt/write | init 불필요 | — |
### JS load order (index.html)
`core.js``app.js` → cert/conn/crawl/db/nm-dash/pb/hist/opcsvr/t2s/fast/pid/evt/llmchat/kbadmin/write → `docs.js`
### Phase 4 pending — CSS 분리
`style.css`(2,230줄)에서 탭별 스타일 분할 미완료. `docs.css`가 선례. `웹UI-개선플랜-byOPUS.md` §11 참조.