Compare commits
3
Commits
3fd8dfe294
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
acc1f58a29 | ||
|
|
955c49a29d | ||
|
|
a4253a80f5 |
@@ -52,8 +52,14 @@ export default async function CapaOwnerPage() {
|
||||
.orderBy(asc(capaActions.dueDate))
|
||||
)
|
||||
|
||||
const openCount = rows.filter(c => ['open', 'in_progress', 'reopened'].includes(c.status)).length
|
||||
const overdueCount = rows.filter(c => c.status === 'overdue').length
|
||||
const today = new Date().toISOString().slice(0, 10)
|
||||
function isCapaOverdue(c: { status: string; dueDate: string | null }): boolean {
|
||||
if (c.status === 'overdue') return true
|
||||
return (c.status === 'open' || c.status === 'in_progress') && !!c.dueDate && c.dueDate < today
|
||||
}
|
||||
|
||||
const openCount = rows.filter(c => ['open', 'in_progress', 'reopened'].includes(c.status) && !isCapaOverdue(c)).length
|
||||
const overdueCount = rows.filter(c => isCapaOverdue(c)).length
|
||||
const doneCount = rows.filter(c => ['verified', 'closed'].includes(c.status)).length
|
||||
|
||||
const PRIORITY_COLORS: Record<string, string> = {
|
||||
@@ -82,7 +88,7 @@ export default async function CapaOwnerPage() {
|
||||
) : (
|
||||
<div className="bg-white rounded-xl shadow-sm divide-y divide-gray-50">
|
||||
{activeRows.map(capa => {
|
||||
const isOverdue = capa.status === 'overdue'
|
||||
const isOverdue = isCapaOverdue(capa)
|
||||
return (
|
||||
<div key={capa.id} className={`p-4 ${isOverdue ? 'bg-red-50' : ''}`}>
|
||||
<div className="flex items-start justify-between gap-4">
|
||||
|
||||
@@ -9,6 +9,7 @@ import { eq } from 'drizzle-orm'
|
||||
import { aliasedTable } from 'drizzle-orm'
|
||||
import { VerifyForm } from '@/components/capa/verify-form'
|
||||
import { CloseCapaButton } from '@/components/capa/close-capa-button'
|
||||
import { CapaOwnerActions } from '@/components/capa/capa-owner-actions'
|
||||
|
||||
interface Props {
|
||||
params: Promise<{ id: string }>
|
||||
@@ -39,6 +40,7 @@ export default async function CapaDetailPage({ params }: Props) {
|
||||
status: capaActions.status,
|
||||
completedAt: capaActions.completedAt,
|
||||
ownerNotes: capaActions.ownerNotes,
|
||||
ownerUserId: capaActions.ownerUserId,
|
||||
incidentRefNo: incidents.referenceNo,
|
||||
ownerName: ownerAlias.name,
|
||||
})
|
||||
@@ -112,6 +114,11 @@ export default async function CapaDetailPage({ params }: Props) {
|
||||
)}
|
||||
</div>
|
||||
|
||||
{['open', 'in_progress', 'overdue', 'reopened'].includes(status) &&
|
||||
(isHse || session?.sub === capa.ownerUserId) && (
|
||||
<CapaOwnerActions capaId={id} currentStatus={status} />
|
||||
)}
|
||||
|
||||
{isHse && status === 'pending_verification' && (
|
||||
<VerifyForm capaId={id} />
|
||||
)}
|
||||
|
||||
@@ -31,7 +31,7 @@ export function CapaOwnerActions({ capaId, currentStatus }: Props) {
|
||||
}
|
||||
}
|
||||
|
||||
if (currentStatus === 'open' || currentStatus === 'reopened') {
|
||||
if (currentStatus === 'open' || currentStatus === 'reopened' || currentStatus === 'overdue') {
|
||||
return (
|
||||
<button
|
||||
onClick={() => updateStatus('in_progress')}
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
import { describe, it, expect, vi } from 'vitest'
|
||||
import { render, screen } from '@testing-library/react'
|
||||
import { CapaOwnerActions } from '@/components/capa/capa-owner-actions'
|
||||
|
||||
// Mock Next.js router
|
||||
vi.mock('next/navigation', () => ({
|
||||
useRouter: () => ({ refresh: vi.fn() }),
|
||||
}))
|
||||
|
||||
describe('CapaOwnerActions', () => {
|
||||
it('shows Mark In Progress for open status', () => {
|
||||
render(<CapaOwnerActions capaId="abc" currentStatus="open" />)
|
||||
expect(screen.getByText('Mark In Progress')).toBeTruthy()
|
||||
})
|
||||
|
||||
it('shows Mark In Progress for reopened status', () => {
|
||||
render(<CapaOwnerActions capaId="abc" currentStatus="reopened" />)
|
||||
expect(screen.getByText('Mark In Progress')).toBeTruthy()
|
||||
})
|
||||
|
||||
it('shows Mark In Progress for overdue status', () => {
|
||||
render(<CapaOwnerActions capaId="abc" currentStatus="overdue" />)
|
||||
expect(screen.getByText('Mark In Progress')).toBeTruthy()
|
||||
})
|
||||
|
||||
it('shows Submit for Verification for in_progress status', () => {
|
||||
render(<CapaOwnerActions capaId="abc" currentStatus="in_progress" />)
|
||||
expect(screen.getByText('Submit for Verification')).toBeTruthy()
|
||||
})
|
||||
|
||||
it('renders nothing for pending_verification status', () => {
|
||||
const { container } = render(<CapaOwnerActions capaId="abc" currentStatus="pending_verification" />)
|
||||
expect(container.firstChild).toBeNull()
|
||||
})
|
||||
|
||||
it('renders nothing for verified status', () => {
|
||||
const { container } = render(<CapaOwnerActions capaId="abc" currentStatus="verified" />)
|
||||
expect(container.firstChild).toBeNull()
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user