feat(ticket): scope issue preview to selected assignment lot

This commit is contained in:
2026-07-29 18:43:22 +05:30
parent 5e66b70611
commit e8f2955acf
9 changed files with 121 additions and 68 deletions

View File

@@ -2,25 +2,24 @@
import { PERMISSIONS } from '@/constants/permissions';
import { PermissionGuard } from '@/guards';
import type { TicketDetail } from '@/types';
import type { TicketAssignmentSummary, TicketDetail } from '@/types';
import { AssignedContractorAction } from './actions/AssignedContractorAction';
import { ClosedTicketAction } from './actions/ClosedTicketAction';
import { NoTicketAction } from './actions/NoTicketAction';
import { OpenRepairReviewAction } from './actions/OpenRepairReviewAction';
import { RequestExtensionAction } from './actions/RequestExtensionAction';
import { ReviewExtensionRequestAction } from './actions/ReviewExtensionRequestAction';
interface TicketStatusActionsProps {
ticket: TicketDetail;
assignment?: TicketAssignmentSummary;
}
function getTicketAction(ticket: TicketDetail) {
if (ticket.assignment_status === 'unassigned') {
return null;
}
if (ticket.assignment_status === 'assigned') {
function getTicketAction(
ticket: TicketDetail,
assignment?: TicketAssignmentSummary,
) {
if (assignment && !assignment.is_complete) {
return (
<PermissionGuard
permissions={PERMISSIONS.TICKET.ASSIGN}
@@ -29,29 +28,46 @@ function getTicketAction(ticket: TicketDetail) {
permissions={PERMISSIONS.TICKET.WORK}
fallback={<NoTicketAction />}
>
<RequestExtensionAction ticket={ticket} />
<RequestExtensionAction
ticket={ticket}
assignmentId={assignment.id}
dueAt={assignment.due_at}
/>
</PermissionGuard>
}
>
<>
<AssignedContractorAction ticket={ticket} />
<ReviewExtensionRequestAction ticket={ticket} />
{ticket.assignment_status === 'assigned' ? (
<AssignedContractorAction ticket={ticket} />
) : null}
<ReviewExtensionRequestAction
ticket={ticket}
assignmentId={assignment.id}
/>
</>
</PermissionGuard>
);
}
if (ticket.assignment_status === 'under_review') {
if (ticket.assignment_status === 'unassigned') {
return null;
}
if (ticket.assignment_status === 'assigned') {
return (
<PermissionGuard
permissions={PERMISSIONS.TICKET.REVIEW}
permissions={PERMISSIONS.TICKET.ASSIGN}
fallback={<NoTicketAction />}
>
<OpenRepairReviewAction ticket={ticket} />
<AssignedContractorAction ticket={ticket} />
</PermissionGuard>
);
}
if (ticket.assignment_status === 'under_review') {
return null;
}
if (
ticket.assignment_status === 'approved' ||
ticket.assignment_status === 'rejected'
@@ -62,8 +78,11 @@ function getTicketAction(ticket: TicketDetail) {
return <NoTicketAction />;
}
export function TicketStatusActions({ ticket }: TicketStatusActionsProps) {
const action = getTicketAction(ticket);
export function TicketStatusActions({
ticket,
assignment,
}: TicketStatusActionsProps) {
const action = getTicketAction(ticket, assignment);
return action ? <div className="space-y-3">{action}</div> : null;
}