From b4da6417698127bd5642e2176172c27264eef8c6 Mon Sep 17 00:00:00 2001 From: "tomosa.sarkar" Date: Thu, 6 Feb 2025 13:09:40 +0530 Subject: [PATCH] Feat : Create a group of backend team and assign ticket to the respective backend member --- README.md | 5 +- src/app/_components/user-context.tsx | 1 - src/app/_data/entities/Ticket.ts | 6 + src/app/_data/source/app-data-source.ts | 2 +- src/app/api/addColumn/route.ts | 1 - src/app/api/auth/login/account_no/route.ts | 5 +- src/app/api/auth/logout/route.ts | 1 - src/app/api/dev/populate/route.ts | 1 - .../api/mobile_no/by/[account_no]/route.ts | 3 - src/app/api/otp/route.ts | 6 - src/app/api/ticket/[ticket_id]/route.ts | 83 +++++++++ src/app/api/ticket/assign_memeber.ts | 28 +++ src/app/api/ticket/route.ts | 74 +++++--- src/app/api/user/route.ts | 3 - src/app/home/layout.tsx | 1 - src/app/home/page.tsx | 9 +- src/app/home/user/raised-ticket/page.tsx | 17 +- src/app/home/user/view-ticket/page.tsx | 25 +-- .../home/user/view-ticket/page.tsx.backupp | 159 ------------------ src/app/login/otp/page.tsx | 13 +- src/app/login/page.tsx | 15 +- 21 files changed, 209 insertions(+), 249 deletions(-) create mode 100644 src/app/api/ticket/[ticket_id]/route.ts create mode 100644 src/app/api/ticket/assign_memeber.ts delete mode 100644 src/app/home/user/view-ticket/page.tsx.backupp diff --git a/README.md b/README.md index 7cce976..0c0dfb5 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,8 @@ DB_PORT=5432 DB_NAME=crm DB_USER_NAME= DB_USER_PASS - +#Mantis +MantisBT_Token= #CBS ONLINE_CBS_IP= ONLINE_CBS_PORT= @@ -119,6 +120,6 @@ Here we are using "mantisBT" (open source application) for ticket management sys - Go to "My account". - Then create a API token. - Copy the API token. - - And paste the token to those `route.ts` file of `CRM Customer Module` where the mantisBT API is calling. + - And paste the token in `.env.local` file in place of `MantisBT_Token` - create development team's user as protected. - create a project, and keep the name as "KCCB". \ No newline at end of file diff --git a/src/app/_components/user-context.tsx b/src/app/_components/user-context.tsx index 8680b4d..46e4363 100644 --- a/src/app/_components/user-context.tsx +++ b/src/app/_components/user-context.tsx @@ -14,7 +14,6 @@ async function queryUser() { const response = await axios.get('/api/user'); user = response.data; } catch (error: AxiosError | any) { - console.log(error); notifications.show({ color: 'red', title: error.code, diff --git a/src/app/_data/entities/Ticket.ts b/src/app/_data/entities/Ticket.ts index 10afa48..98a8ebd 100644 --- a/src/app/_data/entities/Ticket.ts +++ b/src/app/_data/entities/Ticket.ts @@ -7,6 +7,9 @@ export class Ticket { // @PrimaryColumn("int") id!: number + @PrimaryColumn() + ticket_id! : number + @Column("varchar") category_of_request! : string @@ -24,6 +27,9 @@ export class Ticket { @Column('varchar') created_by! : string + @Column('bigint') + customer_account_no! : number + @Column('varchar') created_date! : string diff --git a/src/app/_data/source/app-data-source.ts b/src/app/_data/source/app-data-source.ts index a6e4031..8affc6c 100644 --- a/src/app/_data/source/app-data-source.ts +++ b/src/app/_data/source/app-data-source.ts @@ -11,7 +11,7 @@ class AppDataSource { username: process.env.DB_USER_NAME, password: process.env.DB_USER_PASS, database: process.env.DB_NAME, - //dropSchema: process.env.NODE_ENV === 'development', + // dropSchema: process.env.NODE_ENV === 'development', synchronize: process.env.NODE_ENV === 'development', logging: false, entities: [User,Ticket], diff --git a/src/app/api/addColumn/route.ts b/src/app/api/addColumn/route.ts index 9938f63..b73b9dc 100644 --- a/src/app/api/addColumn/route.ts +++ b/src/app/api/addColumn/route.ts @@ -21,7 +21,6 @@ export async function GET(request: Request) { } catch (error) { - console.error(error); return Response.json(null, { status: 500 }) } } diff --git a/src/app/api/auth/login/account_no/route.ts b/src/app/api/auth/login/account_no/route.ts index 071313a..19042d5 100644 --- a/src/app/api/auth/login/account_no/route.ts +++ b/src/app/api/auth/login/account_no/route.ts @@ -12,7 +12,6 @@ export async function POST(req: Request) { const session = await getIronSession(cookies(), getSessionOptions()) const body = await req.json(); const { AccNo } = body; - console.log(AccNo) if (!AccNo || AccNo === '') { return Response.json({ message: "Account No can't be empty" }) } @@ -25,18 +24,16 @@ export async function POST(req: Request) { .getRawOne(); if (!user) - return Response.json({ message: 'Please Enter Valid Account No Or contact to administrator.' }) + return Response.json({ message: 'Please Enter Valid Account No Or contact to administrator.' },{status:404}) session.accountNo = user.bank_account_no; session.TwoStepAuthentication = false; session.otp = NaN; session.expiryTime = NaN; await session.save(); - //console.log(session); return Response.json({ ok: true }) } catch (error) { - console.error(error); return Response.json(null, { status: 500 }) } } \ No newline at end of file diff --git a/src/app/api/auth/logout/route.ts b/src/app/api/auth/logout/route.ts index 3029f23..f50fe41 100644 --- a/src/app/api/auth/logout/route.ts +++ b/src/app/api/auth/logout/route.ts @@ -15,7 +15,6 @@ export async function POST(request: Request) { return Response.json({message: 'logout successfully'}); } catch (error) { - console.error(error); return Response.json(null, { status: 500 }) } } \ No newline at end of file diff --git a/src/app/api/dev/populate/route.ts b/src/app/api/dev/populate/route.ts index 557b4c1..7fb3032 100644 --- a/src/app/api/dev/populate/route.ts +++ b/src/app/api/dev/populate/route.ts @@ -31,7 +31,6 @@ export async function GET(request: Request) { return Response.json({ done: true }); } catch (error) { - console.error(error); return Response.json("Failed", { status: 500 }); } diff --git a/src/app/api/mobile_no/by/[account_no]/route.ts b/src/app/api/mobile_no/by/[account_no]/route.ts index c10b104..3f9c133 100644 --- a/src/app/api/mobile_no/by/[account_no]/route.ts +++ b/src/app/api/mobile_no/by/[account_no]/route.ts @@ -21,16 +21,13 @@ export async function GET(request: Request , { params }: { params: { account_no: if (user_mob_no.mobile_number == null) return Response.json({ message: "Mobile number is not updated.Please contact with administrator" }) - console.log(user_mob_no.mobile_number) //session.otp = NaN; //session.mobileNo = user_mob_no.mobile_number; await session.save(); - console.log(session); return Response.json(user_mob_no) } catch (error) { - console.error(error); return Response.json(null, { status: 500 }) } } diff --git a/src/app/api/otp/route.ts b/src/app/api/otp/route.ts index df7074e..9151669 100644 --- a/src/app/api/otp/route.ts +++ b/src/app/api/otp/route.ts @@ -32,7 +32,6 @@ export async function GET(req: Request) { session.expiryTime=Date.now() + 90 * 1000; await session.save(); - //console.log(session); const maskedPartMobNo= 'x'.repeat(mobileNumber.toString().length -3); const lastThreeDigit= mobileNumber.toString().slice(-3); console.log( "OTP :" , otp); @@ -40,7 +39,6 @@ export async function GET(req: Request) { } catch (error) { - console.error(error); return Response.json(null, { status: 500 }) } } @@ -61,14 +59,12 @@ export async function POST(req: Request) { if (!OTP || OTP === '' || Number.isNaN(OTP)) return Response.json({ message: "OTP field can not be blank" }) - console.log(session) // Check for OTP expiry time if(Date.now()> session.expiryTime){ session.otp =NaN; session.expiryTime=NaN; await session.save(); } - //console.log(session); if(Number.isNaN(session.otp)) return Response.json({ error: "The OTP Session has timed out "},{status:401}) @@ -77,12 +73,10 @@ export async function POST(req: Request) { session.TwoStepAuthentication = true; await session.save(); - //console.log(session); return Response.json({ ok: true }) } catch (error) { - console.error(error); return Response.json(null, { status: 500 }) } } \ No newline at end of file diff --git a/src/app/api/ticket/[ticket_id]/route.ts b/src/app/api/ticket/[ticket_id]/route.ts new file mode 100644 index 0000000..294276c --- /dev/null +++ b/src/app/api/ticket/[ticket_id]/route.ts @@ -0,0 +1,83 @@ +import { getIronSession } from "iron-session"; +import { cookies } from "next/headers"; +import AppDataSource from "@/app/_data/source/app-data-source"; +import { User } from "@/app/_data/entities/User"; +import SessionPayload from "../../auth/session/payload"; +import getSessionOptions from "../../auth/session/options"; + +export async function GET(req: Request, { params }: { params: { ticket_id: number }}) +{ + try { + const session = await getIronSession(cookies(), getSessionOptions()); + console.log("Session :",session); + if (!session.TwoStepAuthentication) { + return Response.json(null); + } + + if (!session.accountNo) { + return Response.json({ message: `Please sign in before raise a ticket` }) + } + + const connection_crm = await AppDataSource.getConnection(); + //const connection_mantis = await AppDataSource.getMantisConnection(); + const userRepo = connection_crm.getRepository(User); + const user_table = await userRepo.createQueryBuilder('user') + .select(['first_name', 'middle_name', 'last_name']) + .where("user.bank_account_no = :AccountNo", { AccountNo: session.accountNo }) + .getRawOne(); + + const user_name = (user_table.first_name ? user_table.first_name + ' ' : '') + + (user_table.middle_name ? user_table.middle_name + ' ' : '') + + (user_table.last_name ? user_table.last_name + ' ' : ''); + + const ticketRepo = connection_crm.getRepository(Ticket); + const ticket_list = await ticketRepo.createQueryBuilder('ticket') + .select(['id', 'category_of_request', 'nature_of_request', 'created_date','additional_info']) + .where("ticket.created_by = :created_by", { created_by: user_name }).getRawMany(); + + if(!ticket_list){return Response.json('No Details Found')} + const ticket_ids = ticket_list.map(ticket => ticket.id); + // Mantis-database fetching for "status" & "message" + const queryRunner = connection_mantis.createQueryRunner(); + await queryRunner.connect(); + let ticketResolution: { [key: number]: string } = {}; + let ticketMessage: { [key: number]: string[] } = {}; + + for (const id of ticket_ids) { + // For status of ticket + const ticket_resolution = await queryRunner.query('SELECT resolution,handler_id FROM "kccb_bug" WHERE id = $1', [id]); + const ticket_status =ticket_resolution[0]?.resolution + const ticket_handler =ticket_resolution[0]?.handler_id + let status :string =''; + if(ticket_status === 10 && ticket_handler === 0){status = 'Open'} + if(ticket_handler > 0){status = 'In Progress'} + if(ticket_status === 20){status='Resolved'} + if(ticket_status === 30){status='Reopen'} + ticketResolution[id] = status + + // For Message of ticket + const ticket_note = await queryRunner.query('SELECT id FROM "kccb_bugnote" WHERE bug_id = $1', [id]); + const ticket_note_ids =ticket_note.map((item:{id:number}) =>item.id) + + for(const note_id of ticket_note_ids ){ + const ticket_note_text = await queryRunner.query('SELECT note FROM "kccb_bugnote_text" WHERE id = $1', [note_id]); + if (!ticketMessage[id]) { + ticketMessage[id] = []; + } + ticketMessage[id].push(...ticket_note_text); + } + } + const result = ticket_list.map(item => + ( + { + ...item,status:ticketResolution[item.id]||null,message: ticketMessage[item.id]||null + } + ) + ) + queryRunner.release(); + return Response.json(result) + } + catch (error) { + return Response.json(null, { status: 500 }); + } +} \ No newline at end of file diff --git a/src/app/api/ticket/assign_memeber.ts b/src/app/api/ticket/assign_memeber.ts new file mode 100644 index 0000000..9d0ad43 --- /dev/null +++ b/src/app/api/ticket/assign_memeber.ts @@ -0,0 +1,28 @@ +import AppDataSource from "@/app/_data/source/app-data-source"; + +export async function assignUser(category_of_complaint :string) { + const connection_mantis = await AppDataSource.getMantisConnection(); + let assign_team_id,random_assignee; + if(category_of_complaint === 'ATM Related'){ + assign_team_id = 12 ; + } + if(category_of_complaint === 'Internet Banking'){ + assign_team_id = 13 ; + } + if(category_of_complaint === 'Mobile Banking'){ + assign_team_id = 14 ; + } + if(category_of_complaint === 'Others'){ + assign_team_id = 15 ; + } + const queryRunner = connection_mantis.createQueryRunner(); + await queryRunner.connect(); + const query = await queryRunner.query('SELECT id,username FROM "kccb_user" WHERE access_level = $1', [assign_team_id]); + if(query.length == 0) + random_assignee = 1 ; + else{ + const team_list =query.map((row: { id: any; }) =>row.id) + random_assignee = team_list[Math.floor(Math.random()* team_list.length)] + } + return random_assignee; +} \ No newline at end of file diff --git a/src/app/api/ticket/route.ts b/src/app/api/ticket/route.ts index 7dffc6f..0df35db 100644 --- a/src/app/api/ticket/route.ts +++ b/src/app/api/ticket/route.ts @@ -5,6 +5,7 @@ import SessionPayload from "../auth/session/payload"; import AppDataSource from "@/app/_data/source/app-data-source"; import { Ticket } from "@/app/_data/entities/Ticket"; import { User } from "@/app/_data/entities/User"; +import { assignUser } from "./assign_memeber"; export async function POST(request: Request) { @@ -16,36 +17,53 @@ export async function POST(request: Request) { if (!session.accountNo) { return Response.json({ message: `Please sign in before raise a ticket` }) } - if (!session.TwoStepAuthentication) { return Response.json(null); } - //console.log(new Date().toLocaleString("en-IN")); - const URL = "http://localhost/crm_internal/api/rest/issues/"; + + + const mantisBT_Token =process.env.MantisBT_Token || ""; //MantisBT Token + console.log(mantisBT_Token); const body = await request.json(); //request_category, nature_of_request, issue, message const { summary, description, additional_information, steps_to_reproduce } = body; const project = { id: 1 }; const requestBody = { ...body, project }; - const result = await (await fetch(URL, { + const response_for_issue_ticket = await (await fetch(`http://localhost/crm_internal/api/rest/issues/`, { method: "POST", headers: - { "Content-Type": "application/json", "Authorization": "M7xHFMiZcg_oPrGZoRY-kPoivoniK3BO" }, + { "Content-Type": "application/json", "Authorization": mantisBT_Token }, body: JSON.stringify(requestBody) })) - if (result.status === 403) { + if (response_for_issue_ticket.status === 403) { return Response.json({ message: 'Invalid Token' }, { status: 403 }) } - if (result.status === 400) { + if (response_for_issue_ticket.status === 400) { return Response.json({ message: 'Project not specified' }, { status: 400 }) } - if (result.status === 404) { + if (response_for_issue_ticket.status === 404) { return Response.json({ message: 'Project not found' }, { status: 404 }) } - if (result.status === 429) { + if (response_for_issue_ticket.status === 429) { return Response.json({ message: 'Please raised ticket after sometime.' }, { status: 429 }) } + // Assign backend team to the ticket + const issue_id = parseInt(response_for_issue_ticket.statusText); + const assign_person = await assignUser(summary); + const response_for_assignee_issue_ticket = await (await fetch(`http://localhost/CRM_Internal/api/rest/issues/${issue_id}`, { + method: "PATCH", + headers: + { "Content-Type": "application/json", "Authorization": mantisBT_Token }, + body: JSON.stringify({handler :{ id : assign_person }}) + })) + if (response_for_assignee_issue_ticket.status === 403) { + return Response.json({ message: 'Invalid Token' }, { status: 403 }) + } + if(response_for_assignee_issue_ticket.status ==200) + { + console.log("Assignee is assign against the ticket"); + } ///CRM database management const connection_crm = await AppDataSource.getConnection(); const userRepo = connection_crm.getRepository(User); @@ -60,19 +78,19 @@ export async function POST(request: Request) { const ticketRepo = connection_crm.getRepository(Ticket); const ticket = new Ticket(); + ticket.ticket_id = parseInt(response_for_issue_ticket.statusText); ticket.category_of_request = summary; ticket.nature_of_request = description; ticket.additional_info = additional_information ticket.message = steps_to_reproduce; ticket.created_by = user_name; - //ticket.created_date = new Date().toString(); + ticket.customer_account_no = Number(session.accountNo); ticket.created_date=new Date().toLocaleString("en-IN"); - + await ticketRepo.save(ticket); - return Response.json({ message: `Ticket No:${result.statusText} created successfully` }) + return Response.json({ message: `Ticket No:${response_for_issue_ticket.statusText} created successfully` }) } catch (error) { - console.error(error); return Response.json(null, { status: 500 }); } } @@ -84,30 +102,32 @@ export async function GET(request: Request) { if (!session.TwoStepAuthentication) { return Response.json(null); } - if (!session.accountNo) { return Response.json({ message: `Please sign in before raise a ticket` }) } - const connection_crm = await AppDataSource.getConnection(); const connection_mantis = await AppDataSource.getMantisConnection(); const userRepo = connection_crm.getRepository(User); + // Get full name of user const user_table = await userRepo.createQueryBuilder('user') .select(['first_name', 'middle_name', 'last_name']) .where("user.bank_account_no = :AccountNo", { AccountNo: session.accountNo }) .getRawOne(); - const user_name = (user_table.first_name ? user_table.first_name + ' ' : '') + (user_table.middle_name ? user_table.middle_name + ' ' : '') + (user_table.last_name ? user_table.last_name + ' ' : ''); const ticketRepo = connection_crm.getRepository(Ticket); + // Get list of ticket raised by the user const ticket_list = await ticketRepo.createQueryBuilder('ticket') - .select(['id', 'category_of_request', 'nature_of_request', 'created_date','additional_info']) - .where("ticket.created_by = :created_by", { created_by: user_name }).getRawMany(); - + .select(['id','ticket_id', 'category_of_request', 'nature_of_request', 'created_date','additional_info']) + .where("ticket.created_by = :created_by" , { created_by: user_name }) + .andWhere("ticket.customer_account_no = :customer_account_no" ,{customer_account_no:session.accountNo }) + .getRawMany(); + if(!ticket_list){return Response.json('No Details Found')} - const ticket_ids = ticket_list.map(ticket => ticket.id); + const ticket_ids = ticket_list.map(ticket => ticket.ticket_id); // collect the ticket_id (ticket_id store the mantisBT's bug id) + // Mantis-database fetching for "status" & "message" const queryRunner = connection_mantis.createQueryRunner(); await queryRunner.connect(); @@ -125,31 +145,31 @@ export async function GET(request: Request) { if(ticket_status === 20){status='Resolved'} if(ticket_status === 30){status='Reopen'} ticketResolution[id] = status - // For Message of ticket - const ticket_note = await queryRunner.query('SELECT id FROM "kccb_bugnote" WHERE bug_id = $1', [id]); - const ticket_note_ids =ticket_note.map((item:{id:number}) =>item.id) + const ticket_note = await queryRunner.query('SELECT bugnote_text_id FROM "kccb_bugnote" WHERE bug_id = $1', [id]); + const ticket_note_ids =ticket_note.map((item:{bugnote_text_id:number}) =>item.bugnote_text_id) // collect all ids from kccb_bugnote table for a issue for(const note_id of ticket_note_ids ){ const ticket_note_text = await queryRunner.query('SELECT note FROM "kccb_bugnote_text" WHERE id = $1', [note_id]); + if (!ticketMessage[id]) { ticketMessage[id] = []; } ticketMessage[id].push(...ticket_note_text); } } - const result = ticket_list.map(item => + // merge message & status in the response + const response_for_issue_ticket = ticket_list.map(item => ( { - ...item,status:ticketResolution[item.id]||null,message: ticketMessage[item.id]||null + ...item,status:ticketResolution[item.ticket_id]||null,message: ticketMessage[item.ticket_id]||null } ) ) queryRunner.release(); - return Response.json(result) + return Response.json(response_for_issue_ticket) } catch (error) { - console.error(error); return Response.json(null, { status: 500 }); } } diff --git a/src/app/api/user/route.ts b/src/app/api/user/route.ts index 41d4a8e..1bffd5d 100644 --- a/src/app/api/user/route.ts +++ b/src/app/api/user/route.ts @@ -24,15 +24,12 @@ export async function GET(request: Request) { .select(["id","bank_account_no"]) .where("user.bank_account_no = :userAccountNo", { userAccountNo: session.accountNo }) .getRawOne(); - - //console.log(session) // if (!user_details || session.TwoStepAuthentication === false) if (!user_details) return Response.json({ message: "User_details not found" }, { status: 404 }); return Response.json(user_details); } catch (error) { - console.error(error); return Response.json(null, { status: 500 }); } } diff --git a/src/app/home/layout.tsx b/src/app/home/layout.tsx index 73b189b..b2695bf 100644 --- a/src/app/home/layout.tsx +++ b/src/app/home/layout.tsx @@ -20,7 +20,6 @@ async function logout() { try { await axios.post('/api/auth/logout'); } catch (error: AxiosError | any) { - console.log(error); notifications.show({ color: 'red', title: error.code, diff --git a/src/app/home/page.tsx b/src/app/home/page.tsx index c3fcaa2..5eb63cd 100644 --- a/src/app/home/page.tsx +++ b/src/app/home/page.tsx @@ -5,11 +5,14 @@ import { UserContextConsumer } from "../_components/user-context"; export default function Home() { return ( <> -

Welcome to CRM Portal

-

For Issue a ticket ,click on create ticket

+

Welcome to CRM Portal

- {user => user &&

Account No: {user.bank_account_no}

} + { + user => user &&

Your Present Login Account No: {user.bank_account_no}

+ }
+

  • For raise a complain or assistance ,please click on Create Ticket
  • +

  • For track a ticket ,please click on View Ticket
  • ); } diff --git a/src/app/home/user/raised-ticket/page.tsx b/src/app/home/user/raised-ticket/page.tsx index 7334edd..549b946 100644 --- a/src/app/home/user/raised-ticket/page.tsx +++ b/src/app/home/user/raised-ticket/page.tsx @@ -107,7 +107,7 @@ const ComplaintForm: React.FC = () => { } const requestBody = { - summary: description, + summary: category, description: description, additional_information: additionalInformation.join(", "), steps_to_reproduce: message, @@ -116,7 +116,6 @@ const ComplaintForm: React.FC = () => { try { const response = await axios.post("/api/ticket", requestBody); const data = await response.data; - console.log('API response:', data); alert(data.message); window.location.reload(); } @@ -146,9 +145,9 @@ const ComplaintForm: React.FC = () => { - - - + + + @@ -165,16 +164,16 @@ const ComplaintForm: React.FC = () => { - {category === "ATM" && } - {category === "UPI" && } - {category === "IB" && ( + {category === "ATM Related" && } + {/* {category === "UPI" && } */} + {category === "Internet Banking" && ( <> {/* */} )} - {category === "MB" && ( + {category === "Mobile Banking" && ( <> {/* */} diff --git a/src/app/home/user/view-ticket/page.tsx b/src/app/home/user/view-ticket/page.tsx index c48e04e..e811f2d 100644 --- a/src/app/home/user/view-ticket/page.tsx +++ b/src/app/home/user/view-ticket/page.tsx @@ -23,7 +23,7 @@ interface Message { } interface Ticket { - id: string; + ticket_id: string; category_of_request: string; nature_of_request: string; created_date: string; @@ -42,7 +42,7 @@ export default function Page() { useEffect(() => { const sortedTickets = [...tickets].sort( // (a, b) => new Date(b.created_date).getTime() - new Date(a.created_date).getTime() - (a, b) => parseInt(b.id) - parseInt(a.id) + (a, b) => parseInt(b.ticket_id) - parseInt(a.ticket_id) ); const results = sortedTickets.filter((ticket) => ticket.category_of_request.toLowerCase().includes(searchQuery.toLowerCase()) @@ -69,18 +69,19 @@ export default function Page() { }; //Add conditional row styles - const getRowStyle = (status: string) => { - switch (status.toLowerCase()) { - case "resolved": - return { backgroundColor: "#e0e3df", color: "#000"}; // Grey for closed - default: - return {}; - } - }; + // const getRowStyle = (status: string) => { + // switch (status.toLowerCase()) { + // case "resolved": + // return { backgroundColor: "#e0e3df", color: "#000"}; // Grey for closed + // default: + // return {}; + // } + // }; const rows = filteredTickets.map((ticket) => ( - - {ticket.id} + // + + {ticket.ticket_id} {ticket.category_of_request} {ticket.nature_of_request} {ticket.created_date} diff --git a/src/app/home/user/view-ticket/page.tsx.backupp b/src/app/home/user/view-ticket/page.tsx.backupp deleted file mode 100644 index 13cfc43..0000000 --- a/src/app/home/user/view-ticket/page.tsx.backupp +++ /dev/null @@ -1,159 +0,0 @@ -"use client"; - -import { - ActionIcon, - Button, - Container, - Flex, - Group, - Modal, - Space, - Table, - TextInput, - Title, - Tooltip, -} from "@mantine/core"; -import { useDisclosure } from "@mantine/hooks"; -import { IconMessage, IconSearch } from "@tabler/icons-react"; -import { useEffect, useState } from "react"; - -interface Message { - note: string; -} - -interface Ticket { - id: string; - category_of_request: string; - nature_of_request: string; - created_date: string; - status: string; - message: Message[]; - } - -export default function Page() { - const [opened, { open, close }] = useDisclosure(false); - const [tickets, setTickets] = useState([]); - const [searchQuery, setSearchQuery] = useState(""); - const [filteredTickets, setFilteredTickets] = useState([]); - const [filteredUsers, setFilteredUsers] = useState([]); - const [activeMessages, setActiveMessages] = useState(null); - - // Fetch tickets from the API - const fetchTickets = async () => { - try { - const response = await fetch("/api/ticket"); - if (!response.ok) { - throw new Error("Failed to fetch tickets"); - } - const data: Ticket[] = await response.json(); - setTickets(data); - setFilteredTickets(data); // Set initial filtered tickets - } catch (error) { - console.error("Error fetching tickets:", error); - } - }; - - useEffect(() => { - fetchTickets(); // Call API when component mounts - }, []); - - // Filter tickets based on the search query - useEffect(() => { - const results = tickets.filter((ticket) => - ticket.category_of_request.toLowerCase().includes(searchQuery.toLowerCase()) - ); - setFilteredTickets(results); - }, [searchQuery, tickets]); - - const handleOpenMessage = (messages: Message[]) => { - setActiveMessages(messages); - open(); - }; - - const rows = filteredUsers.map((ticket) => ( - - {ticket.id} - {ticket.category_of_request} - {ticket.nature_of_request} - {ticket.created_date} - {ticket.status} - - - handleOpenMessage(ticket.message)} - > - - - - - - - - )); - - return ( - - View Ticket - - - - Tickets - - setSearchQuery(event.currentTarget.value)} - radius="md" - w={250} - leftSection={} - /> - - - - - - - - - - - - - - - - {rows} -
    Ticket IDCategoryDescriptionTimestampStatusMessage
    - - - - {activeMessages?.map((msg, index) => ( -
    - {msg.note} -
    - ))} - -
    -
    -
    - ); -} - diff --git a/src/app/login/otp/page.tsx b/src/app/login/otp/page.tsx index 51905ab..ae278e9 100644 --- a/src/app/login/otp/page.tsx +++ b/src/app/login/otp/page.tsx @@ -29,7 +29,6 @@ async function handleResendOTP() { // Object.assign(response.data); alert(response.data.message); } catch (error: AxiosError | any) { - console.log(error); notifications.show({ color: 'red', title: error.code, @@ -49,13 +48,13 @@ async function handleValidateOTP(OtpInput: OtpInput) { } Object.assign(Result, response.data); } catch (error: AxiosError | any) { - console.log(error); - notifications.show({ - color: 'red', - title: error.response.status, - message: error.response.data.error + alert(error.response.data.error); + // notifications.show({ + // color: 'red', + // title: error.response.status, + // message: error.response.data.error - }) + // }) } return Result; } diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index f076142..f3b1774 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -20,25 +20,24 @@ type Result = { message?: string } async function handleRequestOTP(SendAccNoInput: SendAccNoInput) { - + let Result: Result = { ok: false } try { const response = await axios.post("/api/auth/login/account_no", SendAccNoInput); if (response.data.ok) { const otp_response = await axios.get("/api/otp"); if (otp_response.status === 200) { - // redirect('/otp'); window.location.href = 'login/otp' } } Object.assign(Result, response.data); } catch (error: AxiosError | any) { - console.log(error); - notifications.show({ - color: 'red', - title: error.response.status, - message: error.response.data.message - }) + alert(error.response.data.message) + // notifications.show({ + // color: 'red', + // title: error.response.status, + // message: error.response.data.message + // }) } return Result; }