- | {r.shipName} |
- {r.mmsi || '—'} |
- {r.imo || '—'} |
- {r.insType} |
- {r.insurer} |
- {r.policyNo} |
- {r.start} ~ {r.expiry} |
- {r.limit} |
-
-
+ | {r.shipName} |
+ {r.mmsi || '—'} |
+ {r.imo || '—'} |
+ {r.insType} |
+ {r.insurer} |
+ {r.policyNo} |
+ {r.start} ~ {r.expiry} |
+ {r.limit} |
+
+
@@ -298,12 +296,12 @@ function ShipInsurance() {
{/* 경고 */}
{(expiredList.length > 0 || soonList.length > 0) && (
-
+
{expiredList.length > 0 && (
- <>⛔ 만료 {expiredList.length}건: {expiredList.map(r => r.shipName).join(', ')} >
+ <>⛔ 만료 {expiredList.length}건: {expiredList.map(r => r.shipName).join(', ')} >
)}
{soonList.length > 0 && (
- <>⚠ 만료임박(30일) {soonList.length}건: {soonList.map(r => r.shipName).join(', ')}>
+ <>⚠ 만료임박(30일) {soonList.length}건: {soonList.map(r => r.shipName).join(', ')}>
)}
)}
@@ -311,15 +309,15 @@ function ShipInsurance() {
)}
{/* ── API 연동 정보 푸터 ── */}
-
-
- 데이터 출처: 한국해운조합(KSA) · haewoon.or.kr
- 연동 방식: REST API (JSON) · 실시간 조회 · 캐시 TTL 1시간
+
+
+ 데이터 출처: 한국해운조합(KSA) · haewoon.or.kr
+ 연동 방식: REST API (JSON) · 실시간 조회 · 캐시 TTL 1시간
-
- 마지막 동기화:
- {lastSync}
-
+
+ 마지막 동기화:
+ {lastSync}
+
diff --git a/frontend/src/tabs/board/components/BoardView.tsx b/frontend/src/tabs/board/components/BoardView.tsx
index c566da4..6e8368d 100755
--- a/frontend/src/tabs/board/components/BoardView.tsx
+++ b/frontend/src/tabs/board/components/BoardView.tsx
@@ -375,30 +375,29 @@ export function BoardView() {
{/* 업로드 모달 */}
{showUploadModal && (
- { setShowUploadModal(false); setEditingManualId(null) }}>
- e.stopPropagation()}>
-
-
- {editingManualId ? '✏️' : '📤'}
- {editingManualId ? '매뉴얼 수정' : '매뉴얼 업로드'}
+
+
+ {editingManualId ? '✏️' : '📤'}
+ {editingManualId ? '매뉴얼 수정' : '매뉴얼 업로드'}
{ setShowUploadModal(false); setEditingManualId(null) }}
- style={{ cursor: 'pointer', color: 'var(--t3)', fontSize: 16, lineHeight: 1 }}>✕
+ className="cursor-pointer text-text-3 text-base leading-none">✕
-
+
-
-
+
+
{['방제매뉴얼', '대응매뉴얼', '교육자료', '법령·규정'].map(cat => {
const cc = catColor(cat)
const isActive = uploadForm.category === cat
return (
-
+
setUploadForm(prev => ({ ...prev, title: e.target.value }))}
- style={{ width: '100%', padding: '10px 12px', borderRadius: 6, fontSize: 12, background: 'var(--bg2)', border: '1px solid var(--bd)', outline: 'none', boxSizing: 'border-box' }} />
+ className="w-full px-3 py-2.5 rounded-md text-xs bg-bg-2 border border-border outline-none" style={{ boxSizing: 'border-box' }} />
-
+
setUploadForm(prev => ({ ...prev, version: e.target.value }))}
- style={{ width: '100%', padding: '10px 12px', borderRadius: 6, fontSize: 12, background: 'var(--bg2)', border: '1px solid var(--bd)', outline: 'none', boxSizing: 'border-box' }} />
+ className="w-full px-3 py-2.5 rounded-md text-xs bg-bg-2 border border-border outline-none" style={{ boxSizing: 'border-box' }} />
-
- 파일 첨부
+ {
const input = document.createElement('input')
input.type = 'file'
@@ -441,28 +437,28 @@ export function BoardView() {
input.click()
}}>
{uploadForm.fileName ? (
-
- 📄
-
- {uploadForm.fileName}
- {uploadForm.fileSize}
+
+ 📄
+
+ {uploadForm.fileName}
+ {uploadForm.fileSize}
{ e.stopPropagation(); setUploadForm(prev => ({ ...prev, fileName: '', fileSize: '' })) }}
- style={{ fontSize: 12, color: 'var(--t3)', cursor: 'pointer', marginLeft: 8 }}>✕
+ className="text-xs text-text-3 cursor-pointer ml-2">✕
) : (
<>
- 📁
- 클릭하여 파일을 선택하세요
- PDF, DOC, HWP, XLSX (최대 100MB)
+ 📁
+ 클릭하여 파일을 선택하세요
+ PDF, DOC, HWP, XLSX (최대 100MB)
>
)}
-
+
diff --git a/frontend/src/tabs/hns/components/HNSAnalysisListTable.tsx b/frontend/src/tabs/hns/components/HNSAnalysisListTable.tsx
index b9acd52..e796a05 100755
--- a/frontend/src/tabs/hns/components/HNSAnalysisListTable.tsx
+++ b/frontend/src/tabs/hns/components/HNSAnalysisListTable.tsx
@@ -55,122 +55,78 @@ export function HNSAnalysisListTable({ onTabChange }: HNSAnalysisListTableProps)
}, [loadData])
return (
-
+
{/* Header */}
-
-
-
- 📋
+
+
+
+ 📋
HNS 대기확산 분석 목록
-
+
총 {analyses.length}건
-
+
{/* Table */}
-
+
{loading ? (
- 로딩 중...
+ 로딩 중...
) : (
-
-
-
- | 번호 |
- 분석명 |
- 물질 |
- 사고일시 |
- 분석날짜 |
- 사고지점 |
- 유출량 |
- 알고리즘 |
- 예측시간 |
-
-
+
+
+
+ | 번호 |
+ 분석명 |
+ 물질 |
+ 사고일시 |
+ 분석날짜 |
+ 사고지점 |
+ 유출량 |
+ 알고리즘 |
+ 예측시간 |
+
+
AEGL-3
- 생명위협
+ 생명위협
|
-
-
+
+
AEGL-2
- 건강피해
+ 건강피해
|
-
-
+
+
AEGL-1
- 불쾌감
+ 불쾌감
|
- 위험등급 |
- 피해반경 |
- 분석자 |
+ 위험등급 |
+ 피해반경 |
+ 분석자 |
| |
@@ -187,90 +143,74 @@ export function HNSAnalysisListTable({ onTabChange }: HNSAnalysisListTableProps)
return (
e.currentTarget.style.background = 'var(--bg2)'}
onMouseLeave={(e) => e.currentTarget.style.background = index % 2 === 0 ? 'transparent' : 'rgba(255,255,255,0.01)'}
>
- | {item.hnsAnlysSn} |
- {item.anlysNm} |
-
-
+ | {item.hnsAnlysSn} |
+ {item.anlysNm} |
+
+
{substanceTag(item.sbstNm)}
|
- {formatDate(item.acdntDtm, 'full')} |
- {formatDate(item.regDtm, 'date')} |
- {item.locNm || '—'} |
- {amount} |
-
-
+ | {formatDate(item.acdntDtm, 'full')} |
+ {formatDate(item.regDtm, 'date')} |
+ {item.locNm || '—'} |
+ {amount} |
+
+
{item.algoCd || '—'}
|
- {item.fcstHr ? `${item.fcstHr}H` : '—'} |
-
-
+ | {item.fcstHr ? `${item.fcstHr}H` : '—'} |
+
+
|
-
-
+ |
+
|
-
-
+ |
+
|
-
-
+ |
+
{riskLabel}
|
- {damageRadius} |
- {item.analystNm || '—'} |
+ {damageRadius} |
+ {item.analystNm || '—'} |
)
})}
@@ -279,7 +219,7 @@ export function HNSAnalysisListTable({ onTabChange }: HNSAnalysisListTableProps)
)}
{!loading && analyses.length === 0 && (
- 분석 데이터가 없습니다.
+ 분석 데이터가 없습니다.
)}
diff --git a/frontend/src/tabs/hns/components/HNSLeftPanel.tsx b/frontend/src/tabs/hns/components/HNSLeftPanel.tsx
index d20d2bc..a18e74d 100755
--- a/frontend/src/tabs/hns/components/HNSLeftPanel.tsx
+++ b/frontend/src/tabs/hns/components/HNSLeftPanel.tsx
@@ -51,28 +51,24 @@ export function HNSLeftPanel({
return (
{/* Scrollable Content */}
-
+
{activeSubTab === 'analysis' && (
-
+
{/* Header */}
-
-
- 🧪
+
+
+ 🧪
-
+
HNS 대기확산 예측
-
+
ALOHA/CAMEO 기반 대기확산 시뮬레이션
@@ -80,20 +76,20 @@ export function HNSLeftPanel({
{/* Single Column Layout */}
-
+
{/* 사고 기본정보 */}
-
-
+
+
📋 사고 기본정보
-
+
{/* 사고명 */}
-
+
setAccidentName(e.target.value)}
/>
@@ -102,16 +98,16 @@ export function HNSLeftPanel({
{/* 사고일시 + 예측시간 */}
-
+
-
+
{/* 사고지점 */}
-
-
-
+
+
+
-
+
setLocationName(e.target.value)}
/>
@@ -180,40 +176,43 @@ export function HNSLeftPanel({
{/* 기상 정보 */}
-
-
-
-
- 🌬 기상정보 (자동조회)
+
+
+
- KMA API · 울산 AWS
+ KMA API · 울산 AWS
-
- 5.2
- 풍속(m/s)
+
-
- SW 225°
- 풍향
+
-
- 8.5°C
- 기온
+
-
-
- 대기안정도
- D (중립)
+
+ 대기안정도
+ D (중립)
-
- 지표 조도
- 해안
+
+ 지표 조도
+ 해안
@@ -221,7 +220,7 @@ export function HNSLeftPanel({
{/* 알고리즘 선택 */}
-
+
-
+
{/* 물질 정보 */}
-
-
+
+
🧪 물질 정보
-
+
{/* 물질 분류 */}
-
+
-
+
-
+
@@ -316,18 +315,18 @@ export function HNSLeftPanel({
{/* 유출량 + 단위 */}
-
+
setAmount(e.target.value)}
step="0.1"
/>
-
+
-
+
{/* 물질 위험 특성 */}
-
-
+
+
⚠ 물질 위험 특성
-
-
- 인화점
- 4°C
+
+
+ 인화점
+ 4°C
-
- 비중
- 0.867
+
+ 비중
+ 0.867
-
- 증기압
- 22 mmHg
+
+ 증기압
+ 22 mmHg
-
- IDLH
- 500 ppm
+
+ IDLH
+ 500 ppm
- | |