MOON
Server: Apache
System: Linux nserver.cafsindia.com 4.18.0-553.104.1.lve.el8.x86_64 #1 SMP Tue Feb 10 20:07:30 UTC 2026 x86_64
User: cafsindia (1002)
PHP: 8.2.30
Disabled: NONE
Upload Files
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'>&nbsp</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"); ?>