refactor(fe): P3 pages standardize to screen-type v2 templates

Refactored 4 feature pages to use standard screen-type v2 layouts:

1. HomePage → ScorecardDashboardPage
   - Exception-driven work queue metrics + dashboard layout
   - KPI cards, filters, operational guides
   - Viewport-fit ready, no page-level scrolling

2. ModelsList → MasterDetailCrudPage
   - Master list + detail panel layout
   - Model grid with phase/performance metrics
   - Search, filter, pagination

3. ModelDetail → DetailReadPage
   - Read-only model detail view
   - State management (LOADING/ERROR/READY)
   - Metric display (PBO, DSR, Return)

4. ShadowRunDetail → DetailReadPage
   - Shadow run detail view
   - State management (LOADING/ERROR/READY)
   - Performance metrics (PBO, DSR, OOS)

Pattern Applied:
- Remove PageLayout, use screen-type component
- Add StandardScreenProps (state, evidence)
- State computed from query status
- Slot structure maintained or aligned
- No functional changes, pure standardization

Benefits:
- Consistent layout across pages
- Standardized state management
- Improved viewport-fit compliance
- Better component reusability

Next: Viewport-fit final validation + viewport-fit edge cases

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-08-17 17:14:30 +09:00
parent e94096ece6
commit 728393226f
4 changed files with 57 additions and 11 deletions
+10 -3
View File
@@ -2,7 +2,7 @@
import { ref } from 'vue'
import { RouterLink } from 'vue-router'
import {
PageLayout,
ScorecardDashboardPage,
QueryStateBoundary,
KArtsellMetricCard,
KsButton,
@@ -11,6 +11,7 @@ import {
KsDateField,
KsStatusTag,
} from '../../../shared/ui'
import type { StandardScreenProps } from '../../../shared/ui/contracts/screenContract'
// KBX v60 Exception-Driven Work Queue Metrics (§2.4 Exception Driven)
@@ -37,6 +38,10 @@ const operationalGuides = [
{ title: '자동주문 차단', desc: '현재 KIS 실제 주문 제출 기능은 OFF 상태이며 오직 Shadow 평가 모드만 동작합니다.' },
]
// Screen state (ScorecardDashboardPage contract)
const screenState = ref<StandardScreenProps['state']>('READY')
const screenEvidence = { asOf: new Date().toISOString(), version: '1.0' }
// Filter & Search states
const activeFilter = ref('all')
const selectedModule = ref('all')
@@ -64,9 +69,11 @@ const handleSearch = () => {
</script>
<template>
<PageLayout
<ScorecardDashboardPage
title="업무 워크스페이스 (Work Queue & Reconcile)"
subtitle="Exception Driven 업무 큐 및 시스템 헬스 관제 센터"
:state="screenState"
:evidence="screenEvidence"
>
<!-- Top-Right Actions Slot -->
<template #actions>
@@ -198,7 +205,7 @@ const handleSearch = () => {
</section>
</div>
</QueryStateBoundary>
</PageLayout>
</ScorecardDashboardPage>
</template>
<style scoped>