checkbox fixes enquiry for bulk mail

This commit is contained in:
2025-09-03 16:11:11 +05:45
parent 22a7876a10
commit c61caabe93
3 changed files with 99 additions and 17 deletions

View File

@@ -18,13 +18,13 @@ class EnquiryController extends Controller
public function index() public function index()
{ {
$is_enrolled = request()->get('is_enrolled', null); // $is_enrolled = request()->get('is_enrolled', null);
if (request()->ajax()) { if (request()->ajax()) {
$model = Enquiry::query()->latest(); $model = Enquiry::query()->latest();
return DataTables::eloquent($model) return DataTables::eloquent($model)
->addIndexColumn() ->addIndexColumn()
->addColumn('checkbox', function (Enquiry $enquiry) { ->addColumn('checkbox', function (Enquiry $enquiry) {
return '<input type="checkbox" class="enquiry-select" value="' . $enquiry->id . '" data-name="' . $enquiry->name . '">'; return '<input type="checkbox" class="enquiry-select" value="' . $enquiry->id . '">';
}) })
->setRowClass(function (Enquiry $enquiry) { ->setRowClass(function (Enquiry $enquiry) {
return $enquiry->is_read ? 'text-muted' : 'text-dark'; return $enquiry->is_read ? 'text-muted' : 'text-dark';
@@ -145,4 +145,34 @@ class EnquiryController extends Controller
return redirect()->back()->with('error', $th->getMessage()); return redirect()->back()->with('error', $th->getMessage());
} }
} }
public function bulkAction(Request $request)
{
$ids = $request->ids;
$action = $request->action;
if (!$ids || !$action) {
return response()->json(['message' => 'No action performed.'], 400);
}
$enquiries = Enquiry::whereIn('id', $ids)->get();
if ($action == 2) {
// Example: send newsletter
foreach ($enquiries as $enquiry) {
// Your newsletter logic here
}
return response()->json(['message' => 'Newsletter sent to selected enquiries!']);
}
if ($action == 3) {
// Example: send normal mail
foreach ($enquiries as $enquiry) {
// Your mail logic here
}
return response()->json(['message' => 'Mails sent to selected enquiries!']);
}
return response()->json(['message' => 'Invalid action.'], 400);
}
} }

View File

@@ -8,10 +8,12 @@
</div> </div>
<div class="card-body"> <div class="card-body">
@php @php
// IMPORTANT: 'data' must match the key returned by DataTables JSON.
// Your controller uses ->addColumn('checkbox', ...), so use 'checkbox' here.
$columns = [ $columns = [
[ [
'title' => '<input type="checkbox" id="select-all">', 'title' => '<input type="checkbox" id="select-all">',
'data' => 'checkbox', 'data' => 'checkbox', // <-- was 'select'
'name' => 'checkbox', 'name' => 'checkbox',
'orderable' => false, 'orderable' => false,
'searchable' => false, 'searchable' => false,
@@ -35,20 +37,69 @@
<x-data-table-script :route="route('enquiry.index')" :reorder="null" :columns="$columns" /> <x-data-table-script :route="route('enquiry.index')" :reorder="null" :columns="$columns" />
</div> </div>
<div class="card" id="customerList">
<div class="card-body p-2">
{{-- <div class="table-responsive">
{{ $dataTable->table(['class' => 'table table-sm w-100', 'data-is_enrolled' => $is_enrolled], true) }}
</div> --}}
<div class="row mt-3">
<div class="col-md-3">
{{ html()->select('action', [2 => 'Send News Letter', 3 => 'Send Mail'])->placeholder('Bulk Actions')->class('form-select bulk-select') }}
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
@endsection @endsection
@push('js')
<script>
$(function () {
// Initialize DataTable ONCE on the correct selector
const enquiryTable = $('.ajax-datatable').DataTable({
columnDefs: [
{ targets: 0, orderable: false, searchable: false } // disable checkbox col
]
});
// Keep master checkbox cleared on redraws (pagination/filtering)
enquiryTable.on('draw', function () {
$('#select-all').prop('checked', false);
});
// Select/Deselect all (current page rows)
$(document).on('change', '#select-all', function () {
const checked = this.checked;
const rows = enquiryTable.rows({ page: 'current' }).nodes();
$('.enquiry-select', rows).prop('checked', checked);
});
// When any row checkbox changes, sync master checkbox state for current page
$(document).on('change', '.enquiry-select', function () {
const rows = enquiryTable.rows({ page: 'current' }).nodes();
const total = $('.enquiry-select', rows).length;
const checked = $('.enquiry-select:checked', rows).length;
$('#select-all').prop('checked', total > 0 && checked === total);
});
// Bulk action (optional)
$('.bulk-select').on('change', function () {
const action = $(this).val();
const ids = $('.enquiry-select:checked').map(function () { return this.value; }).get();
if (!ids.length) {
alert('Please select at least one enquiry.');
$(this).val('');
return;
}
if (action == 2 || action == 3) {
$.ajax({
url: "{{ route('enquiry.bulkAction') }}",
method: "POST",
data: {
_token: "{{ csrf_token() }}",
action: action,
ids: ids
},
success: function (res) {
alert(res.message);
enquiryTable.ajax.reload(null, false); // keep page
$('.bulk-select').val('');
$('#select-all').prop('checked', false);
}
});
}
});
});
</script>
@endpush

View File

@@ -134,6 +134,7 @@ Route::group(['middleware' => ['web', 'auth', 'permission'], 'prefix' => 'admin/
Route::get('institution/toggle/{id}', [InstitutionController::class, 'toggle'])->name('institution.toggle'); Route::get('institution/toggle/{id}', [InstitutionController::class, 'toggle'])->name('institution.toggle');
Route::resource('institution', InstitutionController::class)->names('institution')->only(['store', 'edit', 'destroy']); Route::resource('institution', InstitutionController::class)->names('institution')->only(['store', 'edit', 'destroy']);
Route::post('/enquiry/bulk-action', [EnquiryController::class, 'bulkAction'])->name('enquiry.bulkAction');
Route::get('enquiry/mark-as-read/{id}', [EnquiryController::class, 'markAsRead'])->name('enquiry.markAsRead'); Route::get('enquiry/mark-as-read/{id}', [EnquiryController::class, 'markAsRead'])->name('enquiry.markAsRead');
Route::resource('enquiry', EnquiryController::class)->names('enquiry')->only(['index', 'store', 'destroy']); Route::resource('enquiry', EnquiryController::class)->names('enquiry')->only(['index', 'store', 'destroy']);