:: **Zploit** v1.0 | Current Path: **/home/kreativepixelz/tdrbazaar.com/crm/**
:: Editing File: blogs_list.php
<?php include "header.php"; ?> <!-- Include Date Range Picker Stylesheets --> <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.css" /> <link rel="stylesheet" href="https://cdn.datatables.net/buttons/2.4.2/css/buttons.dataTables.min.css"> <style> .previous, .next { display:none; } .pagination { justify-content: center !important; } /* Enhanced modern focus states for Bootstrap styled filter elements */ .filter-card .form-control:focus, .filter-card .form-select:focus { border-color: #86b7fe; box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); } .filter-card .input-group-text { background-color: #f8f9fa; color: #6c757d; } </style> <div class="page-wrapper"> <div class="content pb-0"> <?php $count_q = mysqli_query($conn, "SELECT COUNT(*) AS total FROM blogs"); $count_r = mysqli_fetch_assoc($count_q); $total_blogs = $count_r['total']; ?> <div class="d-flex align-items-center justify-content-between gap-2 mb-4 flex-wrap"> <div> <h4 class="mb-1">Manage Blogs<span class="badge badge-soft-primary ms-2"><?php echo $total_blogs; ?></span></h4> <nav aria-label="breadcrumb"> <ol class="breadcrumb mb-0 p-0"> <li class="breadcrumb-item"><a href="dashboard.php">Home</a></li> <li class="breadcrumb-item active" aria-current="page">Manage Blogs</li> </ol> </nav> </div> <div class="gap-2 d-flex align-items-center flex-wrap"> <div class="dropdown"> <a href="javascript:void(0);" class="dropdown-toggle btn btn-outline-light px-2 shadow" data-bs-toggle="dropdown"> <i class="ti ti-package-export me-2"></i>Export </a> <div class="dropdown-menu dropdown-menu-end"> <ul> <li><a href="#" id="exportPdf" class="dropdown-item"><i class="ti ti-file-type-pdf me-1"></i>Export as PDF</a></li> <li><a href="#" id="exportExcel" class="dropdown-item"><i class="ti ti-file-type-xls me-1"></i>Export as Excel</a></li> <li><a href="#" id="exportCsv" class="dropdown-item"><i class="ti ti-file-type-csv me-1"></i>Export as CSV</a></li> <li><a href="#" id="exportPrint" class="dropdown-item"><i class="ti ti-printer me-1"></i>Print Table</a></li> </ul> </div> </div> <a href="javascript:void(0);" class="btn btn-icon btn-outline-light shadow" data-bs-toggle="tooltip" title="Refresh" onclick="window.location.reload();"><i class="ti ti-refresh"></i></a> </div> </div> <!-- Proper Bootstrap 5 Filter Row --> <div class="card border-0 rounded-0 shadow-sm mb-4 filter-card"> <div class="card-body py-3"> <div class="row g-3 align-items-center"> <!-- Left Column: Date Range with Input Group Integration --> <div class="col-12 col-md-5 col-lg-4"> <div class="input-group input-group-sm"> <span class="input-group-text border-end-0"> <i class="ti ti-calendar-event"></i> </span> <input type="text" id="dateRangeFilter" class="form-control form-control-sm bg-white border-start-0 ps-0 text-secondary" placeholder="Filter by date range..." readonly style="cursor: pointer;"> <button id="clearDateFilter" class="btn btn-outline-secondary border-start-0 text-danger d-none" type="button" title="Clear Date"> <i class="ti ti-x"></i> </button> </div> </div> <!-- Spacer column to naturally isolate layouts --> <div class="col-md d-none d-md-block"></div> <!-- Right Column: Status Filter Dropdown Layout --> <div class="col-12 col-md-4 col-lg-3"> <div class="input-group input-group-sm"> <label class="input-group-text" for="statusFilter"><i class="ti ti-filter"></i></label> <select id="statusFilter" class="form-select form-select-sm fw-medium text-secondary"> <option value="">All Status</option> <option value="Active">Active</option> <option value="Inactive">Inactive</option> </select> </div> </div> </div> </div> </div> <div class="card border-0 rounded-0 shadow-sm"> <div class="card-header d-flex align-items-center justify-content-between gap-2 flex-wrap"> <div class="input-icon input-icon-start position-relative"> <span class="input-icon-addon text-dark"><i class="ti ti-search"></i></span> <input type="text" id="customSearchInput" class="form-control" placeholder="Search Blogs..."> </div> <a href="blog_add.php" class="btn btn-primary"> <i class="ti ti-square-rounded-plus-filled me-1"></i>Add Blog </a> </div> <div class="card-body"> <div class="table-responsive"> <table id="manage-blogs-list" class="table table-hover align-middle nowrap" style="width:100%"> <thead class="table-light"> <tr> <th style="width: 50px;">Image</th> <th>Name</th> <th>URL</th> <th>Author</th> <th>Blog Date</th> <th>Created</th> <th>Status</th> <th class="text-center" style="width: 100px;">Action</th> </tr> </thead> <tbody> <?php $query = mysqli_query($conn, "SELECT * FROM blogs ORDER BY id DESC"); if(mysqli_num_rows($query) > 0) { while($row = mysqli_fetch_assoc($query)) { $img = !empty($row['image']) ? "../logo/blog/".$row['image'] : "../logo/blog/default.png"; $formatted_blog_date = !empty($row['blog_date']) ? date("d M Y", strtotime($row['blog_date'])) : 'N/A'; $formatted_date = date("d M Y", strtotime($row['created_at'])); $status_class = (strtolower($row['status']) == 'active') ? 'badge bg-success' : 'badge bg-danger'; ?> <tr> <td> <span class="avatar avatar-md rounded-circle"> <img src="<?php echo htmlspecialchars($img); ?>" class="rounded" alt="img" width="100" height="100" style="object-fit:cover;" style="width:100%"> </span> </td> <td><strong><?php echo htmlspecialchars($row['name']); ?></strong></td> <td><?php echo htmlspecialchars($row['url']); ?></td> <td><?php echo htmlspecialchars($row['author_name'] ?? 'N/A'); ?></td> <td><?php echo $formatted_blog_date; ?></td> <td data-sort="<?php echo date('Y-m-d', strtotime($row['created_at'])); ?>"> <?php echo $formatted_date; ?> </td> <td><span class="<?php echo $status_class; ?>"><?php echo ucfirst($row['status']); ?></span></td> <td class="text-center"> <div class="d-flex justify-content-center gap-2"> <a href="blog_edit.php?id=<?php echo htmlspecialchars($row['id']); ?>" class="btn btn-sm btn-icon btn-outline-primary"> <i class="ti ti-edit"></i> </a> <?php if ($_SESSION['role'] != 'sales') { ?> <a href="javascript:void(0);" class="btn btn-sm btn-icon btn-outline-danger btn-delete-trigger" data-id="<?php echo $row['id']; ?>" data-name="<?php echo htmlspecialchars($row['name']); ?>" data-bs-toggle="modal" data-bs-target="#delete_blog"> <i class="ti ti-trash"></i> </a> <?php } ?> </div> </td> </tr> <?php } } ?> </tbody> </table> </div> </div> </div> </div> <?php include "footer-heading.php" ?> </div> <!-- Delete Modal --> <div class="modal fade" id="delete_blog" tabindex="-1" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered modal-sm"> <div class="modal-content border-0 shadow"> <div class="modal-body text-center pt-4"> <div class="text-danger mb-2"> <i class="ti ti-alert-triangle" style="font-size: 3rem;"></i> </div> <h5 class="fw-bold text-dark mb-1">Delete Blog?</h5> <p class="text-secondary small mb-4">Are you sure you want to permanently delete <strong id="deleteTargetName">this blog</strong>? This action cannot be undone.</p> <!-- Form targeting blog_delete.php --> <form action="blog_delete.php" method="POST"> <input type="hidden" name="blog_id" id="deleteTargetId"> <div class="d-flex gap-2 justify-content-center"> <button type="button" class="btn btn-sm btn-light border px-3" data-bs-dismiss="modal">Cancel</button> <button type="submit" class="btn btn-sm btn-danger px-3">Confirm Delete</button> </div> </form> </div> </div> </div> </div> <!-- Core Scripts and Plugins --> <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script> <script src="https://cdn.datatables.net/1.13.8/js/jquery.dataTables.min.js"></script> <script src="https://cdn.datatables.net/1.13.8/js/dataTables.bootstrap5.min.js"></script> <script src="https://cdn.datatables.net/buttons/2.4.2/js/dataTables.buttons.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script> <script src="https://cdn.datatables.net/buttons/2.4.2/js/buttons.html5.min.js"></script> <script src="https://cdn.datatables.net/buttons/2.4.2/js/buttons.print.min.js"></script> <!-- MomentJS and Date Range Picker Plugins --> <script type="text/javascript" src="https://cdn.jsdelivr.net/momentjs/latest/moment.min.js"></script> <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js"></script> <script> $(document).ready(function() { var minDate = null, maxDate = null; var table = $('#manage-blogs-list').DataTable({ responsive: true, processing: true, pageLength: 10, order: [[5, 'desc']], dom: 'rtip', columnDefs: [ { targets: [0, 7], orderable: false } ], buttons: [ { extend: 'csv', className: 'btn-export-csv d-none', exportOptions: { columns: [1, 2, 3, 4, 5, 6] } }, { extend: 'excel', className: 'btn-export-excel d-none', exportOptions: { columns: [1, 2, 3, 4, 5, 6] } }, { extend: 'pdf', className: 'btn-export-pdf d-none', orientation: 'portrait', pageSize: 'A4', exportOptions: { columns: [1, 2, 3, 4, 5, 6] } }, { extend: 'print', className: 'btn-export-print d-none', exportOptions: { columns: [1, 2, 3, 4, 5, 6] } } ] }); // Custom DataTables Range Filtering Engine $.fn.dataTable.ext.search.push( function(settings, data, dataIndex) { if (!minDate || !maxDate) return true; var rowDateStr = table.cell(dataIndex, 5).node().getAttribute('data-sort'); var rowDate = moment(rowDateStr, "YYYY-MM-DD"); return rowDate.isBetween(minDate, maxDate, 'day', '[]'); } ); // Bootstrap Styled Date Range Picker Initialization $('#dateRangeFilter').daterangepicker({ autoUpdateInput: false, locale: { cancelLabel: 'Clear', format: 'DD MMM YYYY' } }); $('#dateRangeFilter').on('apply.daterangepicker', function(ev, picker) { minDate = picker.startDate.startOf('day'); maxDate = picker.endDate.endOf('day'); $(this).val(picker.startDate.format('DD MMM YYYY') + ' - ' + picker.endDate.format('DD MMM YYYY')); $('#clearDateFilter').removeClass('d-none'); table.draw(); }); $('#dateRangeFilter').on('cancel.daterangepicker', function(ev, picker) { clearDateRangeFilter(); }); $('#clearDateFilter').on('click', function() { clearDateRangeFilter(); }); function clearDateRangeFilter() { minDate = null; maxDate = null; $('#dateRangeFilter').val(''); $('#clearDateFilter').addClass('d-none'); table.draw(); } // Status Filter Routing [Col 6] $('#statusFilter').on('change', function() { var filterVal = this.value; table.column(6).search(filterVal ? '^' + filterVal + '$' : '', true, false).draw(); }); // Global Search Sync $('#customSearchInput').on('keyup', function() { table.search(this.value).draw(); }); // Hidden Action Trigger Event Mapping $('#exportCsv').on('click', function(e) { e.preventDefault(); table.button('.btn-export-csv').trigger(); }); $('#exportExcel').on('click', function(e) { e.preventDefault(); table.button('.btn-export-excel').trigger(); }); $('#exportPdf').on('click', function(e) { e.preventDefault(); table.button('.btn-export-pdf').trigger(); }); $('#exportPrint').on('click', function(e) { e.preventDefault(); table.button('.btn-export-print').trigger(); }); }); </script> <script> // Catch click event to populate dynamic values into the confirmation modal $('.btn-delete-trigger').on('click', function() { var blogId = $(this).data('id'); var blogName = $(this).data('name'); $('#deleteTargetId').val(blogId); $('#deleteTargetName').text(blogName); }); </script> <?php include "footer.php"; ?>