feat(web): route owner review outcomes
This commit is contained in:
@@ -227,6 +227,14 @@ type OwnerResponseFormalRecordOwnerReviewChecklistItem = {
|
||||
tone: 'steady' | 'warn' | 'locked'
|
||||
}
|
||||
|
||||
type OwnerResponseFormalRecordOwnerReviewOutcomeLane = {
|
||||
key: string
|
||||
lane: string
|
||||
value: string
|
||||
icon: typeof ShieldCheck
|
||||
tone: 'steady' | 'warn' | 'locked'
|
||||
}
|
||||
|
||||
type CoverageGroup = {
|
||||
key: string
|
||||
count: string
|
||||
@@ -1026,6 +1034,41 @@ const ownerResponseFormalRecordOwnerReviewChecklistBoundaries = [
|
||||
'gitea_disablement_authorized=false',
|
||||
]
|
||||
|
||||
const ownerResponseFormalRecordOwnerReviewOutcomeLanes: OwnerResponseFormalRecordOwnerReviewOutcomeLane[] = [
|
||||
{ key: 'remainOwnerReviewWaiting', lane: 'R1', value: '0', icon: Clock3, tone: 'warn' },
|
||||
{ key: 'requestTraceCompletion', lane: 'R2', value: '0', icon: FileText, tone: 'warn' },
|
||||
{ key: 'requestOwnerScopeClarification', lane: 'R3', value: '0', icon: ClipboardCheck, tone: 'warn' },
|
||||
{ key: 'requestAuthorityBoundaryFix', lane: 'R4', value: '0', icon: ShieldCheck, tone: 'warn' },
|
||||
{ key: 'readyForManualOwnerAssignmentReview', lane: 'R5', value: '0', icon: CheckCircle2, tone: 'steady' },
|
||||
{ key: 'quarantineSensitivePayload', lane: 'R6', value: '0', icon: Lock, tone: 'locked' },
|
||||
{ key: 'rejectMutationRequest', lane: 'R7', value: '0', icon: AlertTriangle, tone: 'locked' },
|
||||
{ key: 'runtimeOrPrimaryGateRequired', lane: 'R8', value: '0', icon: GitBranch, tone: 'locked' },
|
||||
]
|
||||
|
||||
const ownerResponseFormalRecordOwnerReviewOutcomeBoundaries = [
|
||||
'owner_response_formal_record_owner_review_outcome_lane_count=8',
|
||||
'owner_response_formal_record_owner_review_outcome_ready_count=0',
|
||||
'owner_response_formal_record_owner_review_outcome_returned_count=0',
|
||||
'owner_response_formal_record_owner_review_outcome_quarantine_count=0',
|
||||
'owner_response_formal_record_owner_review_outcome_rejected_count=0',
|
||||
'owner_response_formal_record_owner_review_outcome_promoted_count=0',
|
||||
'owner_response_formal_record_owner_review_outcome_only=true',
|
||||
'owner_response_formal_record_owner_assignment_authorized=false',
|
||||
'owner_response_formal_record_write_authorized=false',
|
||||
'owner_response_formal_record_approval_authorized=false',
|
||||
'owner_response_formal_record_execution_authorized=false',
|
||||
'runtime_execution_authorized=false',
|
||||
'active_runtime_gate_count=0',
|
||||
'action_buttons_allowed=false',
|
||||
'not_authorization=true',
|
||||
'secret_value_collection_allowed=false',
|
||||
'repo_creation_authorized=false',
|
||||
'refs_sync_authorized=false',
|
||||
'workflow_modification_authorized=false',
|
||||
'github_primary_switch_authorized=false',
|
||||
'gitea_disablement_authorized=false',
|
||||
]
|
||||
|
||||
const coverageGroups: CoverageGroup[] = [
|
||||
{
|
||||
key: 'signals',
|
||||
@@ -3599,6 +3642,130 @@ function OwnerResponseFormalRecordOwnerReviewChecklistBoard() {
|
||||
)
|
||||
}
|
||||
|
||||
function OwnerResponseFormalRecordOwnerReviewOutcomeCard({
|
||||
item,
|
||||
}: {
|
||||
item: OwnerResponseFormalRecordOwnerReviewOutcomeLane
|
||||
}) {
|
||||
const t = useTranslations('iwooos.ownerResponseFormalRecordOwnerReviewOutcomeBoard')
|
||||
const Icon = item.icon
|
||||
const textWrap = { overflowWrap: 'anywhere' as const, wordBreak: 'break-word' as const }
|
||||
return (
|
||||
<div style={{ ...band, minHeight: 184, padding: 16, ...textWrap }}>
|
||||
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 12 }}>
|
||||
<div style={{ display: 'flex', alignItems: 'center', gap: 9, minWidth: 0 }}>
|
||||
<Icon size={18} color={toneColors[item.tone]} style={{ flex: '0 0 auto' }} />
|
||||
<span style={{ fontSize: 11, color: '#87867f' }}>{t('laneLabel')}</span>
|
||||
</div>
|
||||
<span style={{ fontSize: 11, color: toneColors[item.tone] }}>{item.lane}</span>
|
||||
</div>
|
||||
<div style={{ fontSize: 28, fontWeight: 700, color: toneColors[item.tone], marginTop: 12, lineHeight: 1 }}>
|
||||
{item.value}
|
||||
</div>
|
||||
<h2 style={{ fontSize: 14, margin: '10px 0 6px', color: '#141413' }}>
|
||||
{t(`items.${item.key}.title` as never)}
|
||||
</h2>
|
||||
<p style={{ fontSize: 12, lineHeight: 1.55, color: '#6f6d66', margin: 0, ...textWrap }}>
|
||||
{t(`items.${item.key}.body` as never)}
|
||||
</p>
|
||||
<div style={{ marginTop: 10, display: 'grid', gap: 5 }}>
|
||||
<span style={{ fontSize: 11, color: '#87867f' }}>{t('resultLabel')}</span>
|
||||
<span style={{ fontSize: 11, color: toneColors[item.tone], lineHeight: 1.45, ...textWrap }}>
|
||||
{t(`items.${item.key}.result` as never)}
|
||||
</span>
|
||||
<span style={{ fontSize: 11, color: '#87867f', marginTop: 4 }}>{t('guardLabel')}</span>
|
||||
<span style={{ fontSize: 11, color: '#6f6d66', lineHeight: 1.45, ...textWrap }}>
|
||||
{t(`items.${item.key}.guard` as never)}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function OwnerResponseFormalRecordOwnerReviewOutcomeBoard() {
|
||||
const t = useTranslations('iwooos.ownerResponseFormalRecordOwnerReviewOutcomeBoard')
|
||||
const summaryItems = [
|
||||
{ key: 'lanes', value: '8', tone: 'warn' as const },
|
||||
{ key: 'ready', value: '0', tone: 'steady' as const },
|
||||
{ key: 'assigned', value: '0', tone: 'locked' as const },
|
||||
{ key: 'runtime', value: '0', tone: 'locked' as const },
|
||||
]
|
||||
return (
|
||||
<section style={{ marginBottom: 14 }} data-testid="iwooos-owner-response-formal-record-owner-review-outcome-board">
|
||||
<div style={{ marginBottom: 14 }}>
|
||||
<h2 style={{ fontSize: 16, margin: 0 }}>{t('title')}</h2>
|
||||
<p style={{ fontSize: 12, color: '#6f6d66', margin: '6px 0 0', lineHeight: 1.55 }}>
|
||||
{t('subtitle')}
|
||||
</p>
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
display: 'grid',
|
||||
gridTemplateColumns: 'repeat(auto-fit, minmax(150px, 1fr))',
|
||||
gap: 10,
|
||||
marginBottom: 12,
|
||||
}}
|
||||
>
|
||||
{summaryItems.map(item => (
|
||||
<div key={item.key} style={{ ...band, padding: 14, minHeight: 96 }}>
|
||||
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>
|
||||
<span style={{ fontSize: 11, color: '#87867f' }}>{t(`summary.${item.key}.label` as never)}</span>
|
||||
<ToneDot tone={item.tone} />
|
||||
</div>
|
||||
<div style={{ fontSize: 24, fontWeight: 700, lineHeight: 1, marginTop: 9, color: '#141413' }}>
|
||||
{item.value}
|
||||
</div>
|
||||
<p style={{ fontSize: 11, color: '#6f6d66', lineHeight: 1.45, margin: '8px 0 0' }}>
|
||||
{t(`summary.${item.key}.detail` as never)}
|
||||
</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
display: 'grid',
|
||||
gridTemplateColumns: 'repeat(auto-fit, minmax(230px, 1fr))',
|
||||
gap: 12,
|
||||
}}
|
||||
>
|
||||
{ownerResponseFormalRecordOwnerReviewOutcomeLanes.map(item => (
|
||||
<OwnerResponseFormalRecordOwnerReviewOutcomeCard key={item.key} item={item} />
|
||||
))}
|
||||
</div>
|
||||
<div style={{ ...band, marginTop: 12, padding: 16 }}>
|
||||
<div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 10 }}>
|
||||
<ShieldCheck size={16} color={toneColors.locked} />
|
||||
<h3 style={{ fontSize: 14, margin: 0 }}>{t('boundaryTitle')}</h3>
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
display: 'grid',
|
||||
gridTemplateColumns: 'repeat(auto-fit, minmax(230px, 1fr))',
|
||||
gap: 7,
|
||||
}}
|
||||
>
|
||||
{ownerResponseFormalRecordOwnerReviewOutcomeBoundaries.map(item => (
|
||||
<span
|
||||
key={item}
|
||||
style={{
|
||||
border: '0.5px solid #eee9dd',
|
||||
borderRadius: 8,
|
||||
padding: '7px 9px',
|
||||
color: '#4f4c45',
|
||||
fontSize: 11,
|
||||
lineHeight: 1.4,
|
||||
overflowWrap: 'anywhere',
|
||||
}}
|
||||
>
|
||||
{item}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
|
||||
function CoverageCard({ item }: { item: CoverageGroup }) {
|
||||
const t = useTranslations('iwooos.coverage')
|
||||
const Icon = item.icon
|
||||
@@ -4756,6 +4923,8 @@ export default function IwoooSPage({ params }: { params: { locale: string } }) {
|
||||
|
||||
<OwnerResponseFormalRecordOwnerReviewChecklistBoard />
|
||||
|
||||
<OwnerResponseFormalRecordOwnerReviewOutcomeBoard />
|
||||
|
||||
<section style={{ marginBottom: 14 }}>
|
||||
<div style={{ marginBottom: 14 }}>
|
||||
<h2 style={{ fontSize: 16, margin: 0 }}>{t('awooopReadOnlyLandingReadiness.title')}</h2>
|
||||
|
||||
Reference in New Issue
Block a user