From 20f611f35a5b80cd3de13380ae1cdb8dacbe177e Mon Sep 17 00:00:00 2001 From: "santasri.pachhal" Date: Mon, 27 Jul 2026 18:31:12 +0530 Subject: [PATCH] feat(ticket): add global ticket assignment page --- .../assign/components/AssignTicketForm.tsx | 139 ++++++++++++++++++ .../assign/components/ChooseIssuesSection.tsx | 102 +++++++++++++ .../assign/components/IssueColumns.tsx | 52 +++++++ .../assign/components/IssueTable.tsx | 56 +++++++ .../ticket/[ticketId]/assign/page.tsx | 139 ++++++++++++++++++ .../components/TicketDetailHeader.tsx | 16 +- .../components/TicketStatusActions.tsx | 14 +- .../components/actions/AssignTicketAction.tsx | 114 ++------------ src/app/(modules)/ticket/[ticketId]/page.tsx | 5 +- .../ticket/hooks/useTicketQueries.ts | 24 ++- src/services/api/video.service.ts | 3 + src/types/ticket/actions.ts | 1 - src/utils/routes.ts | 1 + 13 files changed, 540 insertions(+), 126 deletions(-) create mode 100644 src/app/(modules)/ticket/[ticketId]/assign/components/AssignTicketForm.tsx create mode 100644 src/app/(modules)/ticket/[ticketId]/assign/components/ChooseIssuesSection.tsx create mode 100644 src/app/(modules)/ticket/[ticketId]/assign/components/IssueColumns.tsx create mode 100644 src/app/(modules)/ticket/[ticketId]/assign/components/IssueTable.tsx create mode 100644 src/app/(modules)/ticket/[ticketId]/assign/page.tsx diff --git a/src/app/(modules)/ticket/[ticketId]/assign/components/AssignTicketForm.tsx b/src/app/(modules)/ticket/[ticketId]/assign/components/AssignTicketForm.tsx new file mode 100644 index 0000000..d762852 --- /dev/null +++ b/src/app/(modules)/ticket/[ticketId]/assign/components/AssignTicketForm.tsx @@ -0,0 +1,139 @@ +'use client'; + +import { useMemo, useState } from 'react'; +import { Mail, Phone, Send, ShieldCheck, Users } from 'lucide-react'; + +import { DatePickerSimple } from '@/components/form/DatePickerSimple'; +import { AssignableWorkerSelect } from '@/components/lookups/AssignableWorkerSelect'; +import { Button } from '@/components/ui/button'; +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { Label } from '@/components/ui/label'; +import { Textarea } from '@/components/ui/textarea'; +import type { AssignableTicketUser } from '@/types'; + +import { useAssignTicketMutation } from '../../../hooks/useTicketQueries'; + +interface AssignTicketFormProps { + ticketId: string; + onAssigned: () => void; +} + +export function AssignTicketForm({ + ticketId, + onAssigned, +}: AssignTicketFormProps) { + const [selectedUserId, setSelectedUserId] = useState(''); + const [selectedContractor, setSelectedContractor] = + useState(null); + const [dueDate, setDueDate] = useState(); + const [assignNote, setAssignNote] = useState(''); + + const assignMutation = useAssignTicketMutation(ticketId); + const today = useMemo(() => { + const date = new Date(); + date.setHours(0, 0, 0, 0); + return date; + }, []); + const maxDueMonth = useMemo( + () => new Date(today.getFullYear() + 20, 11), + [today], + ); + + return ( + + + + + Contractor and schedule + + + +
+
+ + { + setSelectedUserId(userId); + setSelectedContractor(user); + }} + disabled={assignMutation.isPending} + /> +
+ + {selectedContractor ? ( +
+

Contractor details

+ {selectedContractor.phone_number ? ( +

+ + {selectedContractor.phone_number} +

+ ) : null} +

+ + {selectedContractor.email} +

+

+ + {selectedContractor.role.name} +

+
+ ) : null} + +
+ + +
+ +
+ +