Ticketing
Ticketing
@Component({
selector: 'app-ticketing',
templateUrl: './ticketing.component.html',
styleUrls: ['./ticketing.component.css']
})
export class TicketingComponent {
userImage: any;
isAdminCancel: boolean | undefined
// filter
fromDate: string = '';
toDate: string = '';
selectedStatus: string = '';
selectedLocation: string = '';
selectedService: string = '';
gridApi!: GridApi | undefined;
submitActionWithValidation() {
if (!this.actionComment || this.actionComment.trim() === '') {
this.showValidationMessage = true;
} else {
this.showValidationMessage = false;
this.submitAction();
}
}
cancelTicketWithValidation() {
if (!this.actionComment || this.actionComment.trim() === '') {
this.showValidationMessage = true;
} else {
this.showValidationMessage = false;
this.cancelTicket();
}
}
onFromDateChange(event: Event) {
this.fromDate = (event.target as HTMLInputElement).value;
}
onToDateChange(event: Event) {
this.toDate = (event.target as HTMLInputElement).value;
}
onStatusChange(event: Event) {
this.selectedStatus = (event.target as HTMLSelectElement).value;
}
onLocationChange(event: Event) {
this.selectedLocation = (event.target as HTMLSelectElement).value;
}
onServiceChange(event: Event) {
this.selectedService = (event.target as HTMLSelectElement).value;
}
activeTab = 'RaiseTicket';
formSubmitted = false;
ticketData = {
service: '',
location: '',
priority: '',
fileUpload: '',
issueDescription: ''
};
rowData: any[] = [];
quickFilterText = '';
isOpenRaiseTicketView = false;
isOpenViewTicketView = false;
isOpenResolveTicketView = false;
isModalOpen = false;
paginationPageSize = 20;
viewTicketColumnDefs: ColDef[] = [
{
headerName: 'SI No',
field: 'column1',
sortable: true,
filter: true,
editable: true,
cellClass: 'text-xs',
headerClass: 'text-center',
minWidth: 50,
flex: 1,
cellStyle: { 'text-align': 'center', 'display': 'flex', 'align-
items': 'center', 'justify-content': 'center' }
},
{
headerName: 'Created On',
field: 'createdOn',
sortable: true,
filter: 'agDateColumnFilter',
filterParams: {
comparator: function (filterLocalDateAtMidnight: Date,
cellValue: string) {
const dateAsString = cellValue;
const dateParts = dateAsString.split('-');
const cellDate = new Date(
Number(dateParts[0]),
Number(dateParts[1]) - 1,
Number(dateParts[2])
);
if (filterLocalDateAtMidnight.getTime() ===
cellDate.getTime()) {
return 0;
}
if (cellDate < filterLocalDateAtMidnight) {
return -1;
}
if (cellDate > filterLocalDateAtMidnight) {
return 1;
}
return 0;
},
},
cellClass: 'text-xs',
headerClass: 'text-center',
minWidth: 120,
flex: 2
},
{
headerName: 'Ticket ID',
field: 'ticketid',
sortable: true,
filter: true,
cellClass: 'text-xs',
minWidth: 120,
flex: 2,
cellStyle: { 'text-align': 'center', 'display': 'flex', 'align-
items': 'center', 'justify-content': 'center' },
headerClass: 'text-center',
},
{
headerName: 'Last Modified',
field: 'lastModified',
sortable: true,
filter: true,
cellClass: 'text-xs',
minWidth: 100,
flex: 1,
cellStyle: { 'text-align': 'center', 'display': 'flex', 'align-
items': 'center', 'justify-content': 'center' },
headerClass: 'text-center',
},
{ headerName: 'Modified By', field: 'modifiedby', sortable: true,
filter: true, cellClass: 'text-xs', minWidth: 100, flex: 1 },
{
headerName: 'Service',
field: 'service',
sortable: true,
filter: true,
cellClass: 'text-xs',
headerClass: 'text-center',
minWidth: 150,
flex: 2,
},
{
headerName: 'Location',
field: 'location',
sortable: true,
filter: true,
cellClass: 'text-xs',
headerClass: 'text-center',
minWidth: 150,
flex: 2,
},
{
headerName: 'Priority',
field: 'priority',
sortable: true,
filter: true,
cellClass: 'text-xs',
headerClass: 'text-center',
minWidth: 80,
flex: 1,
},
{
headerName: 'File Uploaded',
field: 'fileUploaded',
sortable: true,
filter: true,
cellClass: 'text-xs',
headerClass: 'text-center',
minWidth: 150,
flex: 2,
cellRenderer: this.fileUploadCellRenderer.bind(this),
cellStyle: { 'text-align': 'center', 'display': 'flex', 'align-
items': 'center', 'justify-content': 'center' }
},
{
headerName: 'Status',
field: 'status',
sortable: true,
filter: true,
cellClass: 'text-xs',
headerClass: 'text-center',
minWidth: 100,
flex: 1,
},
{
headerName: 'Comments',
field: 'commentsview',
sortable: true,
filter: true,
cellClass: 'text-xs',
headerClass: 'text-center',
minWidth: 200,
flex: 3,
cellRenderer: this.commantCellRenderer.bind(this),
cellStyle: { 'white-space': 'normal', 'word-wrap': 'break-word',
'text-align': 'center', 'display': 'flex', 'align-items': 'center',
'justify-content': 'center' }
},
{
headerName: 'Actions',
field: 'actions',
cellRenderer: this.actionCellRenderer.bind(this),
minWidth: 150,
headerClass: 'text-center',
cellClass: 'text-xs sticky-column',
flex: 0.5,
pinned: 'right',
cellStyle: { 'text-align': 'center', 'display': 'flex', 'align-
items': 'center', 'justify-content': 'center', 'padding': '0' } //
Removed extra padding
}
];
svgContainer.style.width = '24px';
svgContainer.style.height = '24px';
svgContainer.innerHTML = `<i class="fa fa-eye" aria-
hidden="true"></i>`;
svgContainer.addEventListener('click', () => {
const filePath = params.value;
if (filePath && filePath !== 'N/A') {
this.openImageModal(filePath);
} else {
this.toastr.warning('No file uploaded', 'Warning');
}
});
return svgContainer;
}
closeImageModal(): void {
this.showImageModal = false;
this.imageUrl = '';
}
resolveTicketColumnDefs: ColDef[] = [
{ headerName: 'SI No', field: 'column1', sortable: true, filter:
true, editable: true, cellClass: 'text-xs', minWidth: 50, flex: 1,
cellStyle: { 'text-align': 'center', 'display': 'flex', 'align-items':
'center', 'justify-content': 'center' } },
{ headerName: 'Created On', field: 'createdOn', sortable: true,
filter: true, cellClass: 'text-xs', minWidth: 120, flex: 2 },
{ headerName: 'Ticket ID', field: 'ticketid', sortable: true,
filter: true, cellClass: 'text-xs', minWidth: 120, flex: 2 },
{ headerName: 'Last Modified', field: 'lastModified', sortable:
true, filter: true, cellClass: 'text-xs', minWidth: 100, flex: 1 },
{ headerName: 'Modified By', field: 'modifiedby', sortable: true,
filter: true, cellClass: 'text-xs', minWidth: 100, flex: 1 },
{
headerName: 'Description',
field: 'description',
sortable: true,
filter: true,
cellClass: 'text-xs',
minWidth: 200,
flex: 3,
cellRenderer: this.descriptionCellRenderer.bind(this),
{
headerName: 'File Uploaded',
field: 'fileUploaded',
sortable: true,
filter: true,
cellClass: 'text-xs',
minWidth: 150,
flex: 2,
cellRenderer: this.fileUploadCellRenderer.bind(this),
cellStyle: { 'text-align': 'center', 'display': 'flex', 'align-
items': 'center', 'justify-content': 'center' }
},
{ headerName: 'Status', field: 'status', sortable: true, filter:
true, cellClass: 'text-xs', minWidth: 100, flex: 1 },
{ headerName: 'Raised By', field: 'raisedBy', sortable: true,
filter: true, cellClass: 'text-xs', minWidth: 120, flex: 2 },
{
headerName: 'Comments',
field: 'comments',
sortable: true,
filter: true,
cellClass: 'text-xs',
minWidth: 200,
flex: 3,
cellRenderer: this.commantCellRenderer.bind(this),
{
headerName: 'Actions',
field: 'actions',
cellRenderer: this.actionCellRenderer.bind(this),
minWidth: 150,
headerClass: 'text-center',
cellClass: 'text-xs sticky-column',
flex: 0.5,
pinned: 'right',
cellStyle: { 'text-align': 'center', 'display': 'flex', 'align-
items': 'center', 'justify-content': 'center', 'padding': '0' }
}
];
Filter() {
if (this.rowData) {
let filteredData = [...this.rowData];
if (!isNaN(fromDateObj.getTime()) && !
isNaN(toDateObj.getTime())) {
fromDateObj.setHours(0, 0, 0, 0);
toDateObj.setHours(23, 59, 59, 999);
if (this.selectedStatus) {
filteredData = filteredData.filter((row: any) =>
row.status.toLocaleLowerCase() ==
this.selectedStatus.toLocaleLowerCase());
}
if (this.selectedLocation) {
console.log(filteredData);
console.log(this.selectedLocation);
this.gridApi?.setRowData(filteredData);
} else {
console.error("Row data is not available.");
}
clearDateFilter() {
this.fromDate = '';
this.toDate = '';
this.selectedStatus = '';
this.selectedLocation = '';
this.selectedService = '';
if (this.gridApi) {
this.gridApi.setFilterModel(null);
this.fetchData();
this.fetchTickets();
} else {
console.error("Grid API is not initialized.");
}
}
fetchData() {
console.log("Fetching data based on the filter model...");
// Add actual logic to fetch filtered data here
}
onGridReady(params: any) {
this.gridApi = params.api;
if (this.gridApi) {
if (this.rowData && this.rowData.length > 0) {
this.gridApi.setRowData(this.rowData);
} else {
console.warn('No row data available to set in the grid');
}
this.gridApi.sizeColumnsToFit();
} else {
console.error('Grid API is not initialized');
}
}
cancelTicket() {
this.openActionModal(this.selectedTicketId, 'CANCELLD');
} else {
const payload = {
ticketId_Ticketing_Text: this.selectedTicketId,
ticketStatus_Ticketing_Text: 'CANCELLED',
ticketComment_Ticketing_Text: this.actionComment
};
console.log('payload', payload);
const headers = new HttpHeaders().set('Authorization',
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJLSlVzeXMtQXV0aG5BdXRoe
iIsImlhdCI6MTcyOTI1MDA1NywiZXhwIjoxNzI5MjUxODU3LCJlbWFpbCI6IkEuWEBLUklT
VFVKQVlBTlRJLkNPTSIsInJvbGVzIjoiW10ifQ.m-
H9OsTpksAnUEiOANDnpihsoTBtGybhucx2lcJRPnE');
this.http.post('http://172.21.14.245:8087/kjusys-api/ticketing/user-
action', payload, { headers })
.subscribe(
(response: any) => {
if (response.statusCode === 200) {
this.closeActionModal();
this.toastr.success('Ticket Cancelled Successfully',
'Success');
if (this.gridApi) {
this.fetchTickets();
}
} else if (response.responseData.message) {
this.toastr.warning(response.responseData.message[0],
'Warning');
this.closeActionModal();
} else {
this.toastr.error('Failed to cancel the ticket',
'Error');
this.closeActionModal();
}
},
error => {
console.error('Error cancelling ticket:', error);
//alert('Error cancelling the ticket');
this.toastr.error('Error cancelling the ticket','error');
this.closeActionModal();
complete: () => {
this.closeActionModal();
this.actionComment = '';
this.selectedTicketId = '';
this.selectedAction = '';
}
}
);
}
}
container.classList.add(
'flex',
'items-center',
'justify-center'
);
svg.appendChild(path);
container.appendChild(svg);
container.addEventListener('click', () => {
const status = params.data.status;
if (status === 'CANCELLED' || status === 'HOLD' || status ===
'RESOLVED') {
this.opencommantModal(params.data.comments);
} else {
this.toastr.info('No comments available', 'Info');
}
});
return container;
}
closecommantModal(): void {
this.showcommantModal = false;
}
commantviewCellRenderer(params: any): HTMLElement {
const button = document.createElement('button');
button.innerText = 'View Comments';
button.classList.add(
'bg-blue-500',
'text-white',
'px-3',
'py-1',
'rounded',
'text-xs',
'hover:bg-blue-600',
'transition',
'duration-200',
'cursor-pointer'
);
button.addEventListener('click', () => {
const status = params.data.status;
});
return button;
}
closecommantviewModal(): void {
this.showcommantviewModal = false;
}
closeActionModal(): void {
this.showValidationMessage = false;
this.actionComment = '';
this.selectedTicketId = '';
this.selectedAction = '';
this.showActionModal = false;
this.cdr.detectChanges()
}
submitAction(): void {
if (!this.actionComment.trim()) {
this.toastr.warning('Please enter a comment', 'Warning');
return;
}
const payloadd = {
ticketId_Ticketing_Text: this.selectedTicketId,
ticketStatus_Ticketing_Text: this.selectedAction,
ticketComment_Ticketing_Text: this.actionComment
};
this.http.post('http://172.21.14.245:8087/kjusys-api/ticketing/admin-
actions', payloadd, { headers })
.subscribe(
(response: any) => {
if (response.statusCode === 200) {
this.toastr.success(response.responseData.message[0],
'Success');
this.fetchResolvedTickets();
this.closeActionModal();
} else if (response.responseData.message) {
this.closeActionModal();
this.toastr.warning(response.responseData.message[0],
'Warning');
} else {
this.closeActionModal();
this.toastr.error('Failed to update ticket status',
'Error');
}
},
error => {
console.error('Error updating ticket:', error);
this.toastr.error('Error updating ticket status', 'Error');
this.closeActionModal();
complete: () => {
this.closeActionModal();
this.actionComment = '';
this.selectedTicketId = '';
this.selectedAction = '';
}
}
);
}
button.innerHTML = `
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20"
viewBox="0 0 28 28">
<path d="M3 6a1 1 0 0 0 0 2h21.997a1 1 0 1 0 0-2zm0 15a1 1
0 1 0 0 2h14.997a1 1 0 1 0 0-2zm-1-9a1 1 0 0 1 1-1h21.997a1 1 0 1 1 0
2H3a1 1 0 0 1-1-1m1 4a1 1 0 1 0 0 2h21.997a1 1 0 1 0 0-2z"/>
</svg>
`;
button.classList.add(
'text-white',
'px-3',
'py-1',
'rounded',
'text-xs',
'hover:bg-blue-600',
'transition',
'duration-200',
'cursor-pointer'
);
button.addEventListener('click', () => {
this.openDescriptionModal(params.value);
});
return button;
}
openDescriptionModal(description: string): void {
this.selectedDescription = description;
this.showDescriptionModal = true;
}
closeDescriptionModal(): void {
this.showDescriptionModal = false;
}
setActiveTab(tab: string) {
this.activeTab = tab;
if (tab === 'ViewTicket') {
this.isAdminCancel = false;
this.fetchTickets();
}
}
fetchTickets() {
const header = new HttpHeaders().set(
'Authorization',
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJLSlVzeXMtQXV0aG5BdXRoe
iIsImlhdCI6MTcyOTI1MDA1NywiZXhwIjoxNzI5MjUxODU3LCJlbWFpbCI6IkEuWEBLUklT
VFVKQVlBTlRJLkNPTSIsInJvbGVzIjoiW10ifQ.m-
H9OsTpksAnUEiOANDnpihsoTBtGybhucx2lcJRPnE"'
);
this.http
.get('http://172.21.14.245:8087/kjusys-api/ticketing/view-
ticket', {
headers: header,
})
.subscribe(
(response: any) => {
if (response.statusCode === 200 &&
response.responseData?.data) {
this.rowData = response.responseData.data
.map((ticket: any, index: number) => {
const ticketRaisedDate = new
Date(ticket.ticketRaisedAt_Ticketing_Date);
const lastModifiedDate =
ticket.ticketLastModifiedAt_Ticketing_Date
? new
Date(ticket.ticketLastModifiedAt_Ticketing_Date)
: ticketRaisedDate;
return {
column1: index + 1,
createdOn: formatDate(ticketRaisedDate),
service:
ticket.chooseServiceForTicket_Ticketing_Text,
location: ticket.locationForTicket_Ticketing_Text,
lastModified: formatDate(lastModifiedDate),
priority: ticket.ticketPriority_Ticketing_Text,
fileUploaded: ticket.ticketFileUpload_Ticketing_File
|| 'N/A',
modifiedby: ticket.ticketModifiedBy_Ticketing_Text ||
'N/A',
status: ticket.ticketStatus_Ticketing_Text,
description:
ticket.ticketIssueDescription_Ticketing_Text,
commentsview: ticket.ticketComment_Ticketing_Text ||
'N/A',
raisedBy: ticket.ticketRaisedBy_Ticketing_Text ||
'Unknown',
ticketid: ticket.ticketId_Ticketing_Text,
comments: ticket.ticketComment_Ticketing_Text ||
'N/A',
};
})
.reverse();
if (this.gridApi) {
this.gridApi.setRowData(this.rowData);
}
} else {
console.error('Failed to fetch resolved ticket data',
response);
}
},
(error) => {
console.error('Error fetching resolved ticket data', error);
}
);
}
fetchResolvedTickets() {
// const header = new HttpHeaders().set('Authorization', 'your-
auth-token-here');
this.http.get('http://172.21.14.245:8087/kjusys-api/ticketing/admin-
view-all-tickets')
.subscribe(
(response: any) => {
if (response.statusCode === 200 &&
response.responseData?.data) {
const tickets = response.responseData.data[0]?.tickets ||
[];
this.rowData = tickets.map((ticket: any, index: number) =>
{
// Format date as dd-mm-yyyy
const formatDate = (date: Date) => {
const day = String(date.getDate()).padStart(2, '0');
const month = String(date.getMonth() + 1).padStart(2,
'0');
const year = date.getFullYear();
return `${day}-${month}-${year}`;
};
return {
column1: index + 1,
createdOn: createdOn,
service: ticket.chooseServiceForTicket_Ticketing_Text,
location: ticket.locationForTicket_Ticketing_Text,
comments: ticket.ticketComment_Ticketing_Text,
lastModified: lastModified,
priority: ticket.ticketPriority_Ticketing_Text,
fileUploaded: ticket.ticketFileUpload_Ticketing_File ||
'N/A',
modifiedby: ticket.ticketModifiedBy_Ticketing_Text ||
'N/A',
status: ticket.ticketStatus_Ticketing_Text,
raisedBy: ticket.ticketRaisedBy_Ticketing_Text,
description:
ticket.ticketIssueDescription_Ticketing_Text,
ticketid: ticket.ticketId_Ticketing_Text
};
})
.reverse();
if (this.gridApi) {
this.gridApi.setRowData(this.rowData);
}
} else {
console.error('Failed to fetch resolved ticket data',
response);
}
},
error => {
console.error('Error fetching resolved ticket data', error);
}
);
}
this.http
.post('http://172.21.14.245:8087/kjusys-api/ticketing/ticket-
download-file', payload, { responseType: 'blob' })
.subscribe({
next: (response: Blob) => {
if (response && response.size > 0) {
const reader = new FileReader();
reader.onloadend = () => {
this.userImage = reader.result;
this.cdr.detectChanges();
};
reader.readAsDataURL(response);
} else {
}
},
error: (error: any) => {
if (error instanceof Blob) {
error.text().then((text: string) => {
try {
const errorJson = JSON.parse(text);
console.log("error fetching image: ", errorJson);
} catch (e) {
console.log("error fetching image: ", e);
}
});
}
},
});
}
onQuickFilterInput(event: any) {
this.quickFilterText = event.target.value;
if (this.gridApi) {
this.gridApi.setGridOption('quickFilterText',
this.quickFilterText);
}
}
actions.forEach(action => {
const button = document.createElement('button');
const baseClasses = [
'px-1.5', 'py-0.5', 'mt-0.5', 'rounded', 'text-xs',
'transition', 'duration-200', 'cursor-pointer', 'text-white'
];
const actionClasses: { [key: string]: string[] } = {
'HOLD': ['bg-red-500', 'hover:bg-red-600'],
'RESOLVED': ['bg-green-500', 'hover:bg-green-600'],
'CANCELLED': ['bg-red-500', 'hover:bg-red-600']
};
button.classList.add(...baseClasses, ...actionClasses[action]);
container.appendChild(button);
});
} else if (this.activeTab === 'ViewTicket' && (status !== 'HOLD' &&
status !== 'RESOLVED'&& status !== 'CANCELLED')) {
cancelButton.innerHTML = `
<svg width="29" height="29" viewBox="0 0 29 29" fill="none"
xmlns="http://www.w3.org/2000/svg">
<rect width="28.7393" height="28.7393" rx="14.3696" fill=""/>
<path d="M9.73928 19.3097L13.9552 13.497V15.1498L9.92137
9.50523H12.4985L15.2858 13.441L14.2073 13.455L16.9526
9.50523H19.4177L15.4119 15.0518V13.427L19.6558 19.3097H17.0366L14.1513
15.1498H15.1878L12.3445 19.3097H9.73928Z" fill="white"/>
</svg>
`;
cancelButton.addEventListener('click', () => {
this.openActionModalWithComment(ticketId);
});
container.appendChild(cancelButton);
}
return container;
}
clearQuickFilter() {
this.quickFilterText = '';
if (this.gridApi) {
this.gridApi.setQuickFilter(this.quickFilterText);
}
}
clearSearch() {
this.quickFilterText = '';
if (this.gridApi) {
this.gridApi.setQuickFilter('');
}
}
resetColFilters() {
if (this.gridApi) {
this.gridApi.setFilterModel(null);
this.gridApi.onFilterChanged();
}
}
submitTicket() {
this.formSubmitted = true;
if (!this.isFormValid()) {
this.toastr.warning('Please fill in all required fields: Choose a
Service, Location, Priority, and Issue Description', 'Warning');
return;
}
this.http.post('http://172.21.14.245:8087/kjusys-api/ticketing/create-
Ticket', formData, { headers: header }).subscribe(
(response: any) => {
if (response.type === 'SUCCESS') {
const ticketId =
response.responseData?.data[0]?.ticketId_Ticketing_Text;
this.toastr.success(`Ticket submitted successfully, ID is: $
{ticketId}`, 'Success');
this.resetForm();
this.resetFileInput();
} else {
this.toastr.error(response.responseData?.message[0],
'Error');
}
this.cdr.detectChanges();
},
error => {
console.error('Error submitting ticket', error);
}
);
}
isFormValid(): boolean {
return !!this.ticketData.service &&
!!this.ticketData.location &&
!!this.ticketData.priority &&
!!this.ticketData.issueDescription;
}
resetForm() {
this.ticketData = {
service: '',
location: '',
priority: '',
fileUpload: '',
issueDescription: ''
};
this.formSubmitted = false;
}
resetFileInput() {
document.getElementById("fileUploadText")!.innerHTML = "Upload a
photo";
const fileInput = document.getElementById("fileUpload") as
HTMLInputElement;
if (fileInput) {
fileInput.value = '';
}
}
if (file) {
const validTypes = ['image/jpeg', 'image/jpg'];
const fileType = file.type;
if (!validTypes.includes(fileType)) {
if (fileErrorMessage) {
fileErrorMessage.classList.remove('hidden');
fileErrorMessage.textContent = 'Only JPG or JPEG files are
allowed.';
}
event.target.value = '';
if (fileUploadText) {
fileUploadText.textContent = 'Upload a photo';
}
return;
}
if (fileErrorMessage) {
fileErrorMessage.classList.add('hidden');
}
if (fileUploadText) {
fileUploadText.textContent = file.name;
}
this.ticketData.fileUpload = file;
}
}
}
src="https://s3-alpha-sig.figma.com/img/c304/88fa/a2f5f4869b22742602630
074579aac41?Expires=1730073600&Key-Pair-
Id=APKAQ4GOSFWCVNEHN3O4&Signature=Dj7G~KJtpS-
zb19sWArdMwrGkPB4QAmIUo~H3JT4O1E9ksugXnLpRh5t55U2zdgZe7ZdT2EJAneSTI68k2
gS-9VlhPFx-lpSE~dWTruVTJkV3ypdqz4fUBdpfJc9x7yLT7mBKjXU-
Yao1WSw3ujtUrcPlC08k7hBu8fpp762Dqh0TZKWdu9DaBVx8mqMgtLn~z5o5AzovTbtftGl
e~7ldVzd1UXEABWlSP-
oseL0cS909npHoXauxEgG2Aj92xYJDqiErv61DjBfGpI6H~pov6a1x6IGMk2RMffypVl1YQ
bdvE8WZSNbNmkH5uFQEvLfP8PCJF-WMU5wCP7ht-Ub6A__"
class="w-6 h-6 sm:w-10 sm:h-10 md:w-12 md:h-12 rounded-full
object-cover bg-gray-200" />
</div>
<div class="flex flex-col items-start">
<span class="font-bold text-xs text-center">Raise a
Ticket</span>
<p class="text-xs sm:text-xs md:text-xs text-center">Facing an
issue? Click here to raise a new ticket</p>
</div>
</button>
src="https://s3-alpha-sig.figma.com/img/19cd/6b4c/e6694fc6a7419b15bd92d
423fc9a79ee?Expires=1730073600&Key-Pair-
Id=APKAQ4GOSFWCVNEHN3O4&Signature=FZz6poXP5hSFNA4sVRII2zWB6CI7t2ndObFOL
jTHOTd8o1cXYJqET3Ubi~a-1xb~m-uAW9HVbAppXgtdwUDUzHcWrX5S4UQ5eDwiGw68Y-
FzcnU4uUOwiMkXWdLmImsmh21TEORzw7dD8vDGK-
s0D4LdkUXilU3~T2GNZTGacIpNJV8oaciQ9AQCOQBDn2B3y9Agi8kNpX3N0yZprS8SS8QD4
I868~zvTFrC2zstI-PzXQ-pks48s99QP6LNzLVC2ar~bnuugYCB-KqH-rbaGVZxcI9HdT-
k4X4Zuyx5dVsFZi~fbo5FVdtnKhKvKlLkR6wwV-3Q3~Y2eg8lrl-z9A__"
class="w-6 h-6 sm:w-10 sm:h-10 md:w-12 md:h-12 rounded-full
object-cover bg-gray-200" />
</div>
<div class="flex flex-col items-start">
<span class="font-bold text-xs text-center">View Ticket</span>
<p class="text-xs sm:text-xs md:text-xs text-center">Check the
status of your raised ticket</p>
</div>
</button>
<div
class="flex flex-col items-center justify-center border-2 border-
dashed border-gray-300 rounded-lg p-3 hover:border-blue-500 transition
ease-in-out duration-300">
<label for="fileUpload" class="flex flex-col items-center space-y-1
cursor-pointer">
<!-- Upload Icon -->
<svg class="w-8 h-8 text-gray-400 group-hover:text-blue-500"
fill="none" stroke="currentColor" viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" stroke-
width="2" d="M12 4v16m8-8H4"></path>
</svg>
</div>
</div>
</div>
</ag-grid-angular>
</div>
<button *ngIf="!isAdminCancel"
(click)="cancelTicketWithValidation()" class="bg-blue-900 rounded-md
text-white px-5 py-2 text-xs">
Submit
</button>
</div>
</div>
</div>