File: //home/cafsindia/hrms_allyindian_com/application/views/module_audit_log/manage.php
<?php
$this->load->view("partial/header");
$page_name = ucwords(str_replace("_"," ",$controller_name));
$prime_id = "prime_".$controller_name."_id";
$breadcrumb .= "<li><a href='$site_url#Home'>Home</a></li>
<li><a href='".site_url($controller_name)."#$controller_name'>$page_name</a></li>
<li class='active'>List</li>";
?>
<div class='row title_content'>
<div class='col-md-2 col-xs-4'>
<h1 class='page_txt'><?php echo $page_name; ?></h1>
</div>
<div class='col-md-10 col-xs-8'>
<ol class="breadcrumb">
<?php echo $breadcrumb; ?>
</ol>
</div>
</div>
<div class="form-inline">
<div class="row" style='margin-bottom:0px;'>
<div class="col-md-12">
<?php echo form_open("$controller_name/search/", ["id"=>"audit_form","class"=>"form-inline","autocomplete"=>"off"]); ?>
<!-- Module Input -->
<div class="form-group" >
<?php
echo form_label("Select Module", 'module_id', ['class' => 'required']);
echo form_dropdown(["name"=>'module_id',"id"=>'module_id',"class"=>'form-control input-sm select2'],$modules_dropdown);
?>
</div>
<!-- Process By -->
<div class="form-group">
<?php
$process_by = [""=> "---- Select Type ----","1"=> "User Wise","2"=> "Date Wise","3"=> "Employee Wise"];
echo form_label("Process By", 'process_by', ['class'=>'required']);
echo form_dropdown(["name"=>'process_by',"id"=>'process_by',"class"=>'form-control input-sm select2'],$process_by);
?>
</div>
<!-- Employee Input -->
<div class="form-group" style="display:none;">
<?php
echo form_label("Search Employee", 'process_emp_code', ['class' => 'required']);
echo form_input(['name'=>'process_emp_code_show','id'=>'process_emp_code','class'=>'form-control input-sm','placeholder'=>"Search by Employee Code"]);
echo form_input(['name'=>'process_emp_code','id'=>'process_emp_code_hidden','type'=>'hidden']);
echo form_input(['name'=>'emp_code','id'=>'process_emp_code_only','type'=>'hidden']);
?>
<div class='append_div'></div>
</div>
<!-- Date Input -->
<div class="form-group" style="display:none;">
<?php
echo form_label("From Date", 'from_date', ['class'=>'required']);
echo form_input(['name'=>'from_date','id'=>'from_date','class'=>'form-control input-sm datepicker','placeholder'=>'Select From Date']);
?>
</div>
<div class="form-group" style="display:none;">
<?php
echo form_label("To Date", 'to_date', ['class'=>'required']);
echo form_input(['name'=>'to_date','id'=>'to_date','class'=>'form-control input-sm datepicker','placeholder'=>'Select To Date']);
?>
</div>
<div class="form-group">
<button type="button" class='buttons-collection btn btn-xs btn-edit' id="process_by_btn">
<span class='fa fa-paper-plane'> </span> Submit
</button>
</div>
<?php echo form_close(); ?>
</div>
<div class='col-md-12'>
<div style="overflow-x: auto;">
<table id="table" class="display nowrap table" style="width:100%;"></table>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){
$(".datepicker").datetimepicker({
format: 'DD-MM-YYYY'
});
$('.select2').select2({
placeholder: '---- Select ----'
});
// FROM DATE FUNCTIONALITY RESTRICTION
$("#from_date").on("dp.hide", function (){
var fromVal = $("#from_date").val();
if(!fromVal) return;
var parts = fromVal.split("-");
var fromDate = new Date(parts[2], parts[1] - 1, parts[0]);
var maxDate = new Date(fromDate);
maxDate.setMonth(maxDate.getMonth() + 6);
$("#to_date").data("DateTimePicker").minDate(fromDate);
$("#to_date").data("DateTimePicker").maxDate(maxDate);
$("#to_date").val('');
});
// TO DATE FUNCTIONALITY RESTRICTION
$("#to_date").on("dp.hide", function (){
var fromVal = $("#from_date").val();
var toVal = $("#to_date").val();
if(!fromVal){
toastr.error("Please select From Date first");
$("#to_date").val('');
return;
}
var f = fromVal.split("-");
var t = toVal.split("-");
var fromDate = new Date(f[2], f[1] - 1, f[0]);
var toDate = new Date(t[2], t[1] - 1, t[0]);
if(toDate < fromDate){
toastr.error("To Date cannot be before From Date");
$("#to_date").val('');
}
});
// Show/hide inputs
$("#process_by").on("change", function(){
var val = $(this).val();
$("#process_emp_code,#from_date,#to_date").parent().hide();
if(val === "1" || val === "3" ){
$('#process_emp_code').parent().show();
}else
if(val === "2"){
$('#from_date,#to_date').parent().show();
}
});
// AUTOCOMPLETE
$('#process_emp_code').autocomplete({
source: function(request, response){
var key = '<?php echo $encKey; ?>';
var encData = encrypt(key,{term: request.term});
$.ajax({
url: '<?php echo site_url("$controller_name/emp_suggest"); ?>',
type: 'POST',
data: encData,
success: function(data){
var rslt = JSON.parse(data);
response($.map(rslt, function(el){
return{
value: el.value, // employee ID
label: el.label, // Employee Code - Name
display_name: el.display_name,
employee_code: el.employee_code
};
}));
}
});
},
minLength: 3,
autoFocus: true,
delay: 10,
appendTo: '.append_div',
select: function(e, ui){
$('#process_emp_code').val(ui.item.display_name); // show Code - Name in input
$('#process_emp_code_hidden').val(ui.item.value); // save Employee ID in hidden input
$('#process_emp_code_only').val(ui.item.employee_code);
return false;
}
});
// FORM SUBMIT
$("#process_by_btn").on('click', function(e){
e.preventDefault();
var process_by = $("#process_by").val();
var module_id = $("#module_id").val();
var emp_id = $("#process_emp_code_hidden").val(); // FIXED: use emp_id not emp_code
var from_date = $("#from_date").val();
var to_date = $("#to_date").val();
var emp_code = $("#process_emp_code_only").val();
if(!module_id){
toastr.error("Please select Module .");
return;
}
if(!process_by){
toastr.error("Please select Process By type.");
return;
}
if((!module_id) ||((process_by === "1" || process_by === "3") && !emp_id) ||(process_by === "2" && (!from_date || !to_date))){
toastr.error("Please fill all required fields.");
return;
}
var $btn = $(this);
$btn.html("<i class='fa fa-spinner fa-spin'></i> Processing...").attr('disabled', true);
var encKey = '<?php echo $encKey; ?>';
if($.fn.DataTable.isDataTable('#table')){
$('#table').DataTable().destroy();
$('#table').empty();
}
$("#table").DataTable({
processing: true,
serverSide: true,
fixedHeader: true,
paging: true,
scrollX: true,
// scrollY: "400px",
scrollCollapse: true,
ajax:{
url: "<?php echo site_url($controller_name .'/search'); ?>",
type: "POST",
data: function(d){
var data = $.extend({}, d,{ process_by, module_id, emp_id, from_date,to_date, emp_code });
return{ Payload: encrypt(encKey,{ data }) };
},
error: function(){
toastr.error("Failed to load data.");
$btn.attr('disabled', false).html("Submit");
}
},
columns: [
{ data: "module_name", title: "Module" },
{
data: "filter_keys",
title: "Filter Keys",
render: function(data){
return formatJsonToTable(data);
}
},
{
data: "old_value",
title: "Old Value",
render: function(data){
return formatJsonToTable(data);
}
},
{
data: "new_value",
title: "New Value",
render: function(data){
return formatJsonToTable(data);
}
},
{ data: "action_type", title: "Action Type" },
{ data: "created_by", title: "Changed By" },
{ data: "trans_created_date", title: "Date" ,render: function (data, type, row){
if(!data) return "";
const [datePart, timePart] = data.split(" ");
const [year, month, day] = datePart.split("-");
return `${day}-${month}-${year} ${timePart}`;
}
}
],
dom: 'lfrtip',
order: [[6, "desc"]],
language:{
lengthMenu: "<span style='margin-top:8px;margin-left:10px;'>Display</span> _MENU_ <span style='margin-top:10px'>Records</span>",
search : " ",
searchPlaceholder: "Search records",
emptyTable: "<div style='text-align:center; padding:20px;'>No data found</div>"
},
lengthMenu: [[10, 25, 50], [10, 25, 50]],
destroy: true,
initComplete: function(settings, json){
var export_html = `<div style="margin-top:5px;">
<button id="export_excel_btn" class="btn btn-xs btn-edit">Export</button>
</div>`;
$("#table_filter").append(export_html);
$("#export_excel_btn").off("click").on("click", function(){
var params = { process_by, module_id, emp_id, from_date,to_date, emp_code };
var encParam = encrypt(encKey, params);
var $exportBtn = $(this);
var originalHtml = $exportBtn.html();
$exportBtn.html("<i class='fa fa-spinner fa-spin'></i> Exporting...").attr('disabled', true);
$.ajax({
url: '<?php echo site_url($controller_name . "/export_all_to_excel"); ?>',
type: 'POST',
data: encParam,
processData: false,
contentType: 'text/plain',
xhrFields: { responseType: 'blob' },
success: function(blob, status, xhr){
// READ filename from backend header
var filename = 'download.xlsx'; // fallback only
var disposition = xhr.getResponseHeader('Content-Disposition');
if(disposition && disposition.indexOf('filename=') !== -1){
filename = disposition.split('filename=')[1].replace(/"/g, '') .trim();
}
// Download
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
// RESET BUTTON
$exportBtn.html(originalHtml).attr('disabled', false);
toastr.success("Excel Exported Successfully...");
},
error: function(){
toastr.error("Failed to Export Excel.");
}
});
});
$('input[type=search]').addClass('form-control input-sm');
$("select[name='table_length']").addClass('form-control input-sm');
},
drawCallback: function(){
$btn.attr('disabled', false).html("Submit");
}
});
});
});
// FORMAT OF VALUES SHOW TABLE STRUCTURE _ARN
function formatJsonToTable(jsonString){
if(!jsonString) return "";
let obj;
try{
obj = JSON.parse(jsonString);
}catch(e){
return jsonString; // fallback if not valid JSON
}
let html = "<div style='max-height:200px; overflow:auto;'>";
html += "<table class='table table-bordered table-condensed' style='margin:0;'>";
for(let key in obj){
if(!obj.hasOwnProperty(key)) continue;
let value = obj[key];
if(typeof value === "object" && value !== null){
html += "<tr style='background:#f5f5f5;'><td colspan='2'><b>" + key + "</b></td></tr>";
for(let innerKey in value){
if(value.hasOwnProperty(innerKey)){
let innerVal = value[innerKey] === null ? "" : value[innerKey];
innerVal = formatValue(innerVal);
html += "<tr><td style='width:40%;'><b>" + innerKey + "</b></td><td>" + innerVal + "</td></tr>";
}
}
}else{
let displayVal = value === null ? "" : value;
displayVal = formatValue(displayVal);
html += "<tr><td style='width:40%;'><b>" + key + "</b></td><td>" + displayVal + "</td></tr>";
}
}
html += "</table></div>";
return html;
}
// formats long comma-separated values line-by-line
function formatValue(val){
if(typeof val !== "string") return val;
// If looks like comma-separated list of codes or long items
if(val.includes(",") && val.length > 20){
let items = val.split(",").map(v => v.trim()).filter(v => v);
let formatted = "<div style='display:flex; flex-wrap:wrap; gap:4px;'>";
items.forEach(v =>{
formatted += "<span style='display:inline-block; background:#f0f0f0; padding:2px 6px; border-radius:4px; margin:2px;'>" + v + "</span>";
});
formatted += "</div>";
return formatted;
}
return val;
}
</script>
<?php $this->load->view("partial/footer"); ?>