Feat: Reusable download Proof Button

This commit is contained in:
Sallu9007
2025-05-13 19:11:13 +05:30
parent 124e629f4a
commit 17ebb87bb7
5 changed files with 56 additions and 23 deletions

View File

@@ -114,25 +114,6 @@ class ActivitiesAttendedController extends Controller
return response()->json(['success' => 'Record deleted successfully']); return response()->json(['success' => 'Record deleted successfully']);
} }
public function downloadProofs(Request $request, ProofDownloadService $proofDownloadService)
{
// Validate the request
$request->validate([
'ids' => 'required|string',
]);
$ids = json_decode($request->input('ids'));
$result = $proofDownloadService->downloadProofs(ActivitiesAttended::class, $ids);
if (isset($result['error'])) {
return back()->with('error', $result['error']);
}
// Return the zip file as a download
return response()->download($result['filePath'], $result['fileName'])->deleteFileAfterSend(true);
}
public function getActivitiesAttendedResponses(Request $request) public function getActivitiesAttendedResponses(Request $request)
{ {
$user = auth()->user(); $user = auth()->user();

View File

@@ -11,6 +11,7 @@ use App\Models\IvOrganised;
use App\Models\OnlineCourse; use App\Models\OnlineCourse;
use App\Models\Patent; use App\Models\Patent;
use App\Models\Publication; use App\Models\Publication;
use App\Services\ProofDownloadService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class AdminController extends Controller class AdminController extends Controller
@@ -69,6 +70,43 @@ class AdminController extends Controller
{ {
return view('pages.patents.index'); return view('pages.patents.index');
} }
public function downloadProofs(Request $request, ProofDownloadService $proofDownloadService)
{
// Validate the request
$request->validate([
'ids' => 'required|string',
'model' => 'sometimes|string',
]);
$ids = json_decode($request->input('ids'));
$modelName = $request->input('model', 'ActivitiesAttended');
// Model mapping
$modelMap = [
'ActivitiesAttended' => ActivitiesAttended::class,
'ActivitiesOrganised' => ActivitiesOrganised::class,
'IvOrganised' => IvOrganised::class,
'Publication' => Publication::class,
'BooksPublished' => BooksPublished::class,
'ExternalEngagement' => ExternalEngagement::class,
'OnlineCourse' => OnlineCourse::class,
'Patent' => Patent::class,
];
// Get the model class from the map or default to ActivitiesAttended
$modelClass = $modelMap[$modelName] ?? ActivitiesAttended::class;
$result = $proofDownloadService->downloadProofs($modelClass, $ids);
if (isset($result['error'])) {
return back()->with('error', $result['error']);
}
// Return the zip file as a download
return response()->download($result['filePath'], $result['fileName'])->deleteFileAfterSend(true);
}
public function analyticsActivitiesAttended() public function analyticsActivitiesAttended()
{ {
$data = ActivitiesAttended::selectRaw('departments.name as department, COUNT(*) as count') $data = ActivitiesAttended::selectRaw('departments.name as department, COUNT(*) as count')

View File

@@ -33,6 +33,12 @@
idsInput.value = JSON.stringify(selectedIds); idsInput.value = JSON.stringify(selectedIds);
form.appendChild(idsInput); form.appendChild(idsInput);
const modelInput = document.createElement('input');
modelInput.type = 'hidden';
modelInput.name = 'model';
modelInput.value = "{{ $model ?? 'ActivitiesAttended' }}";
form.appendChild(modelInput);
document.body.appendChild(form); document.body.appendChild(form);
form.submit(); form.submit();
} else { } else {
@@ -49,4 +55,4 @@
}); });
}); });
</script> </script>
</div> </div>

View File

@@ -52,7 +52,7 @@
<!-- Column Selector --> <!-- Column Selector -->
<div class="flex justify-between col-md-12 mt-3 mb-4"> <div class="flex justify-between col-md-12 mt-3 mb-4">
<!-- Include the reusable download-proofs component --> <!-- Include the reusable download-proofs component -->
<x-download-proofs :route="route('activitiesAttended.downloadProofs')" /> <x-download-proofs :route="route('admin.downloadProofs')" :model="'ActivitiesAttended'" />
<div class="dropdown"> <div class="dropdown">
<button class="btn btn-danger dropdown-toggle" type="button" id="columnSelectorDropdown" data-bs-toggle="dropdown" aria-expanded="false"> <button class="btn btn-danger dropdown-toggle" type="button" id="columnSelectorDropdown" data-bs-toggle="dropdown" aria-expanded="false">
<i class="fas fa-columns me-1"></i> Customize Columns <i class="fas fa-columns me-1"></i> Customize Columns
@@ -268,7 +268,8 @@
@section('scripts') @section('scripts')
<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/js/all.min.js" integrity="sha512-Tn2m0TIpgVyTzzvmxLNuqbSJH3JP8jm+Cy3hvHrW7ndTDcJ1w5mBiksqDBb8GpE2ksktFvDB/ykZ0mDpsZj20w==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/js/all.min.js" integrity="sha512-Tn2m0TIpgVyTzzvmxLNuqbSJH3JP8jm+Cy3hvHrW7ndTDcJ1w5mBiksqDBb8GpE2ksktFvDB/ykZ0mDpsZj20w==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script> <script>
const downloadProofsRoute = "{{ route('activitiesAttended.downloadProofs') }}"; const downloadProofsRoute = "{{ route('admin.downloadProofs') }}";
const currentModel = "{{ isset($model) ? $model : 'ActivitiesAttended' }}";
const csrf_token = "{{ csrf_token() }}"; const csrf_token = "{{ csrf_token() }}";
$(document).ready(function() { $(document).ready(function() {
// Handle "Select All" checkbox // Handle "Select All" checkbox
@@ -582,6 +583,13 @@
.attr('name', 'ids') .attr('name', 'ids')
.attr('value', JSON.stringify(selectedIds)) .attr('value', JSON.stringify(selectedIds))
.appendTo(form); .appendTo(form);
// Add model name
$('<input>')
.attr('type', 'hidden')
.attr('name', 'model')
.attr('value', currentModel)
.appendTo(form);
$('body').append(form); $('body').append(form);
form.submit(); form.submit();

View File

@@ -288,7 +288,7 @@ Route::prefix('admin')->name('admin.')->group(function () {
Route::get('analytics/contribution', [AdminController::class, 'analyticsContribution'])->name('analytics.contribution'); Route::get('analytics/contribution', [AdminController::class, 'analyticsContribution'])->name('analytics.contribution');
}); });
Route::post('/activities-attended/download-proofs', [ActivitiesAttendedController::class, 'downloadProofs'])->name('activitiesAttended.downloadProofs'); Route::post('/admin/download-proofs', [AdminController::class, 'downloadProofs'])->name('admin.downloadProofs');
// Google Login Route // Google Login Route
Route::get('/auth/google', [App\Http\Controllers\Auth\GoogleController::class, 'redirectToGoogle'])->name('google.login'); Route::get('/auth/google', [App\Http\Controllers\Auth\GoogleController::class, 'redirectToGoogle'])->name('google.login');