feat: Approval Queue page (T03 transaction template) — third KBX v60 page

Implement ApprovalQueue.vue using KBX Foundation v60 transaction pattern:
- T03 Transaction template for maker-checker approval workflow
- KbxScreenFrame wrapper with breadcrumb/title
- Summary stats (Pending, Approved, Rejected counts)
- Status and action type filters
- Header with model name, action type, status badge
- Request details grid (Request ID, Requester, Requested At, Status)
- Validation metrics display (PBO, DSR, OOS, Target Phase)
- Review & approval section with textarea for comments
- Approve/Reject buttons with submit state
- Review history display (reviewer, date, decision, comment)
- Side panel with request list (fixed position on desktop, stacked on mobile)
- Dark mode and responsive layout

New files:
- features/approval/pages/ApprovalQueue.vue (T03 transaction page)
- features/approval/composables/useApprovalRequests.ts (approval data)
- features/approval/types/index.ts (type definitions)
- features/approval/registry.ts (screen definition)

Demo data: 3 approval requests (pending, approved, rejected) with full workflow.
Mock approval/rejection methods with comment capture.
Ready for API integration and real backend workflow.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-08-15 10:48:02 +09:00
parent 81bcd58dcd
commit f7b290d6c0
4 changed files with 871 additions and 0 deletions
@@ -0,0 +1,48 @@
/**
* Approval Feature Screen Registry
*/
import type { ScreenDefinition } from '@kbx/contracts'
export const approvalQueueScreen: ScreenDefinition = {
screenId: 'governance.approval.queue',
title: 'Approval Queue',
module: 'ERP',
path: '/governance/approvals',
component: () => import('./pages/ApprovalQueue.vue'),
permissions: ['approval.review'],
template: 'T03',
help: {
title: 'Approval Workflow',
sections: [
{
title: 'What is Maker-Checker?',
content:
'Maker-Checker enforces that critical model decisions require two parties: the requester and an independent reviewer.',
},
{
title: 'How to Approve',
content: 'Select a pending request, review the metrics and comments, then approve or reject with your decision.',
},
{
title: 'Decision Criteria',
content: 'Activation requires: PBO ≤ 20%, DSR ≥ 95%, OOS ≤ 2.5%, plus 252+ trading-day shadow run.',
},
],
relatedScreens: ['model-ops.models.list', 'model-ops.shadow-run.queue'],
},
grid: {
columnDefs: [
{ field: 'requestId', headerName: 'Request ID', width: 120 },
{ field: 'modelName', headerName: 'Model', width: 150 },
{ field: 'action', headerName: 'Action', width: 100 },
{ field: 'status', headerName: 'Status', width: 100 },
{ field: 'requesterName', headerName: 'Requester', width: 120 },
{ field: 'requestedAt', headerName: 'Date', width: 150 },
],
},
}
export default [approvalQueueScreen]