295 lines
9.8 KiB
PHP
Executable File
295 lines
9.8 KiB
PHP
Executable File
<style>
|
|
|
|
.custom-dropdown-menu {
|
|
display: none;
|
|
position: absolute;
|
|
background-color: #ffffff !important;
|
|
border: 1px solid rgba(0, 0, 0, 0.15);
|
|
border-radius: 0.25rem;
|
|
padding: 0.5rem 0;
|
|
min-width: 10rem;
|
|
z-index: 9999;
|
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
|
}
|
|
|
|
.custom-dropdown-menu .dropdown-item {
|
|
display: block !important;
|
|
width: 100% !important;
|
|
padding: 0.5rem 1rem !important;
|
|
color: #212529 !important;
|
|
text-decoration: none !important;
|
|
background-color: transparent !important;
|
|
}
|
|
|
|
.custom-dropdown-menu .dropdown-item:hover {
|
|
background-color: #f8f9fa !important;
|
|
color: #16181b !important;
|
|
cursor: pointer !important;
|
|
} </style>
|
|
<div class="row" id="tpa_list">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<div class="row" style="margin-bottom:1rem;">
|
|
<div class="col-6" style="align-self: center;">
|
|
<h4 style="position: relative;">TPA List</h4>
|
|
</div>
|
|
<div class="col-6" style="text-align: right; position: relative;top: 56px;">
|
|
<a href="<?= base_url("master/tpa/create"); ?>" type="button" id="btnAdd" class="btn btn-primary waves-effect waves-light" data-toggle="" data-placement="top" title="Add" data-trigger="hover">ADD</a>
|
|
</div>
|
|
</div>
|
|
<table class="table table-sm table-hover m-0 table-centered dt-responsive nowrap w-100" cellspacing="0"
|
|
id="tickets-table">
|
|
<thead class="bg-light">
|
|
<tr>
|
|
<th class="font-weight-medium">Name</th>
|
|
<th class="font-weight-medium">Action</th>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tbody>
|
|
<?php if(is_array($tpaList)) {foreach($tpaList as $row){ ?>
|
|
<tr>
|
|
<td><?php echo $row['name']; ?> ( <?php echo $row['short_name']; ?> ) </td>
|
|
<td>
|
|
<div class="btn-group dropdown">
|
|
<a href="javascript: void(0);" class="dropdown-toggle arrow-none btn btn-light btn-sm" data-toggle="dropdown"aria-expanded="false"><i class="mdi mdi-dots-horizontal"></i></a>
|
|
<div class="dropdown-menu dropdown-menu-right">
|
|
<a class="dropdown-item" href="<?= base_url("master/tpa/list/"); ?><?= $row['id'];?>"><i class="mdi mdi-pencil mr-2 text-muted font-18 vertical-middle"></i>Edit</a>
|
|
<a class="dropdown-item" data-id="<?= $row['id'];?>" onclick="removeTPA(this)"><i class="mdi mdi-delete mr-2 text-muted font-18 vertical-middle"></i>Delete</a>
|
|
</div>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<?php }}?>
|
|
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div><!-- end col -->
|
|
</div>
|
|
<!-- end row -->
|
|
<script>
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
const table = document.getElementById("tickets-table");
|
|
|
|
// Create custom dropdown
|
|
function createCustomDropdown(row) {
|
|
// Get the original dropdown items
|
|
const originalDropdown = row.querySelector('.dropdown-menu');
|
|
if (!originalDropdown) return null;
|
|
|
|
// Create new dropdown with proper background and spacing
|
|
const customDropdown = document.createElement('div');
|
|
customDropdown.className = 'custom-dropdown-menu';
|
|
|
|
// Copy inner content while maintaining icon alignment
|
|
customDropdown.innerHTML = originalDropdown.innerHTML;
|
|
|
|
return customDropdown;
|
|
}
|
|
|
|
let activeDropdown = null;
|
|
|
|
// Add click event listener to rows
|
|
table.querySelectorAll("tbody tr").forEach(row => {
|
|
const customDropdown = createCustomDropdown(row);
|
|
if (!customDropdown) return;
|
|
|
|
document.body.appendChild(customDropdown);
|
|
|
|
row.addEventListener("click", function(event) {
|
|
// Ignore clicks on the action column
|
|
if (event.target.closest('td:last-child')) {
|
|
return;
|
|
}
|
|
|
|
// Hide any active dropdown
|
|
if (activeDropdown) {
|
|
activeDropdown.style.display = 'none';
|
|
}
|
|
|
|
// Get click position
|
|
const rect = event.target.getBoundingClientRect();
|
|
|
|
// Position the dropdown with some offset
|
|
customDropdown.style.display = 'block';
|
|
customDropdown.style.position = 'fixed';
|
|
customDropdown.style.left = `${rect.left}px`;
|
|
customDropdown.style.top = `${rect.bottom + 5}px`; // Add 5px gap
|
|
|
|
// Set as active dropdown
|
|
activeDropdown = customDropdown;
|
|
|
|
event.stopPropagation();
|
|
});
|
|
|
|
// Preserve click handlers and add auto-close
|
|
customDropdown.querySelectorAll('.dropdown-item').forEach(item => {
|
|
item.addEventListener('click', function(e) {
|
|
const onclickAttr = this.getAttribute('onclick');
|
|
if (onclickAttr) {
|
|
eval(onclickAttr);
|
|
}
|
|
|
|
const href = this.getAttribute('href');
|
|
if (href && href !== '#') {
|
|
window.location.href = href;
|
|
}
|
|
|
|
// Close the dropdown after handling the click
|
|
if (activeDropdown) {
|
|
activeDropdown.style.display = 'none';
|
|
activeDropdown = null;
|
|
}
|
|
|
|
e.stopPropagation();
|
|
});
|
|
});
|
|
});
|
|
|
|
// Close dropdown when clicking outside
|
|
document.addEventListener("click", function() {
|
|
if (activeDropdown) {
|
|
activeDropdown.style.display = 'none';
|
|
activeDropdown = null;
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
|
|
<script>
|
|
|
|
$(document).ready(function(){
|
|
|
|
$('#tickets-table').DataTable({
|
|
dom: "<'row'<'col-sm-0'f><'col-sm-9 text-right'B>>" +
|
|
"<'row'<'col-sm-12'tr>>" +
|
|
"<'row'<'col-sm-5'i><'col-sm-7'p>>" ,
|
|
buttons: [
|
|
{
|
|
extend: 'csv',
|
|
text: 'CSV',
|
|
title: 'TPAList',
|
|
exportOptions: {
|
|
columns: ':not(:last-child)'
|
|
}
|
|
}
|
|
],
|
|
|
|
|
|
language: {
|
|
search: "_INPUT_",
|
|
searchPlaceholder: "Search..."
|
|
},
|
|
paging: true ,
|
|
});
|
|
|
|
})
|
|
|
|
const btnExport = document.querySelector("#btnExport");
|
|
const tableElement = document.querySelector("#tickets-table");
|
|
|
|
btnExport.addEventListener("click", () => {
|
|
const obj = new csvExport(tableElement);
|
|
const csvData = obj.exportCsv();
|
|
const blob = new Blob([csvData], { type: "text/csv" });
|
|
const url = URL.createObjectURL(blob);
|
|
const a = document.createElement("a");
|
|
a.href = url;
|
|
a.download = "TPAList.csv";
|
|
a.click();
|
|
|
|
setTimeout(() => {
|
|
URL.revokeObjectURL(url);
|
|
}, 500);
|
|
});
|
|
|
|
|
|
class csvExport {
|
|
constructor(table, header = true) {
|
|
this.table = table;
|
|
this.rows = Array.from(table.querySelectorAll("tr"));
|
|
if (!header && this.rows[0].querySelectorAll("th").length) {
|
|
this.rows.shift();
|
|
}
|
|
}
|
|
|
|
exportCsv() {
|
|
const lines = [];
|
|
const ncols = this._longestRow();
|
|
for (const row of this.rows) {
|
|
let line = "";
|
|
for (let i = 0; i < ncols - 1; i++) { // Exclude the last column
|
|
if (row.children[i] !== undefined) {
|
|
line += csvExport.safeData(row.children[i]);
|
|
}
|
|
line += i !== ncols - 2 ? "," : ""; // Adjusted for the last column exclusion
|
|
}
|
|
lines.push(line);
|
|
}
|
|
return lines.join("\n");
|
|
}
|
|
|
|
_longestRow() {
|
|
return this.rows.reduce((length, row) => (row.childElementCount > length ? row.childElementCount : length), 0);
|
|
}
|
|
|
|
static safeData(td) {
|
|
let data = td.textContent;
|
|
//Replace all double quote to two double quotes
|
|
data = data.replace(/"/g, `""`);
|
|
//Replace , and \n to double quotes
|
|
data = /[",\n"]/.test(data) ? `"${data}"` : data;
|
|
return data;
|
|
}
|
|
}
|
|
|
|
|
|
function removeTPA(element) {
|
|
|
|
Swal.fire({
|
|
title: "Are you sure?",
|
|
text: "You need to remove this TPA",
|
|
icon: "info",
|
|
showCancelButton: true,
|
|
confirmButtonColor: "#3085d6",
|
|
confirmButtonText: "Yes",
|
|
}).then((result) => {
|
|
|
|
if (result.isConfirmed) {
|
|
var id = element.getAttribute('data-id');
|
|
var form_action = '<?= base_url("master/tpa/remove/") ?>' + id;
|
|
$.ajax({
|
|
url: form_action,
|
|
type: "GET",
|
|
dataType: 'json',
|
|
processData: false,
|
|
contentType: false,
|
|
success: function(res) {
|
|
// console.log(res.status == true);
|
|
if(res){
|
|
if (res.status == true) {
|
|
toastr.success('TPA removed successfully', 'Success');
|
|
location.reload();
|
|
} else {
|
|
toastr.warning('Failed to remove TPA', 'Warning');
|
|
}
|
|
}
|
|
},
|
|
error: function (xhr, status, error) {
|
|
console.error(xhr.responseText);
|
|
console.error(status, error);
|
|
$('.loader').fadeOut();
|
|
$('.loader-mask').delay(350).fadeOut('slow');
|
|
toastr.warning('Failed to remove TPA', 'Warning');
|
|
}
|
|
});
|
|
}
|
|
|
|
});
|
|
}
|
|
|
|
|
|
</script>
|