From 2b6856a8f2057f26a078c77d60626e06c45d5c02 Mon Sep 17 00:00:00 2001 From: armiejean Date: Fri, 16 May 2025 01:44:38 +0800 Subject: [PATCH] photo-slider edit,view,delete,add,filter,search,pagination weoks --- .../Controllers/PhotoSliderController.php | 329 +++++++++++ .../photo-slider-component.blade.php | 512 ++++++++++++++++++ .../components/table-component.blade.php | 488 +++++++++++++++++ .../pages/home page/photo-slider.blade.php | 56 +- .../views/pages/photo-slider-create.blade.php | 52 ++ .../views/pages/photo-slider-edit.blade.php | 53 ++ .../views/pages/photo-slider-view.blade.php | 40 ++ routes/web.php | 18 +- 8 files changed, 1523 insertions(+), 25 deletions(-) create mode 100644 app/Http/Controllers/PhotoSliderController.php create mode 100644 resources/views/components/photo-slider-component.blade.php create mode 100644 resources/views/components/table-component.blade.php create mode 100644 resources/views/pages/photo-slider-create.blade.php create mode 100644 resources/views/pages/photo-slider-edit.blade.php create mode 100644 resources/views/pages/photo-slider-view.blade.php diff --git a/app/Http/Controllers/PhotoSliderController.php b/app/Http/Controllers/PhotoSliderController.php new file mode 100644 index 0000000..07da682 --- /dev/null +++ b/app/Http/Controllers/PhotoSliderController.php @@ -0,0 +1,329 @@ +route('login')->with('error', 'Please log in to view photo sliders.'); + } + + $page = $request->input('page', 1); + $pageSize = 5; + + $response = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ])->get("{$this->apiBaseUrl}/cms/photoSlider", [ + 'page' => $page, + 'page_size' => $pageSize, + '_search' => $request->input('_search', null), + ]); + + if ($response->status() === 401 || $response->status() === 403) { + Log::warning('Unauthorized or Forbidden API response: ', $response->json()); + return redirect()->route('login')->with('error', 'Your session has expired. Please log in again.'); + } + + $json = $response->json(); + + Log::info("PhotoSlider API Response (Page {$page}): ", $json); + + if ($response->successful() && isset($json['data']) && is_array($json['data'])) { + $sliders = array_map(function ($slider) { + Log::info('Processing photo slider record: ', $slider); + return [ + 'photoslider_uuid' => $slider['photoslider_uuid'] ?? $slider['id'] ?? null, + 'title' => $slider['title'] ?? 'Untitled', + 'type' => $slider['promo_type'] ?? 'Unknown', + 'startDate' => $slider['date_start'] ?? null, + 'endDate' => $slider['date_end'] ?? null, + 'isActive' => $slider['is_active'] ?? 0, + 'image' => $slider['image'] ?? null, // Include image field + ]; + }, $json['data']); + + $total = $json['meta']['total'] ?? count($sliders); + $lastPage = $json['meta']['last_page'] ?? ceil($total / $pageSize); + + return view('pages.home page.photo-slider', [ + 'sliders' => $sliders, + 'currentPage' => $page, + 'lastPage' => $lastPage, + 'total' => $total, + ]); + } else { + Log::warning('No photo slider data found or invalid API response: ', $json); + return view('pages.home page.photo-slider', [ + 'sliders' => [], + 'currentPage' => 1, + 'lastPage' => 1, + 'total' => 0, + ]); + } + } catch (\Exception $e) { + Log::error('Error fetching photo slider data: ' . $e->getMessage()); + return view('pages.home page.photo-slider', [ + 'sliders' => [], + 'currentPage' => 1, + 'lastPage' => 1, + 'total' => 0, + ]); + } + } + + public function create() + { + return view('pages.photo-slider-create'); + } + + public function store(Request $request) + { + try { + $user = Session::get('user'); + $accessToken = $user['access_token'] ?? null; + + if (!$accessToken) { + return redirect()->route('login')->with('error', 'Please log in to add a photo slider.'); + } + + // Validate the request + $request->validate([ + 'image' => 'required|file|mimes:jpeg,png,jpg,gif|max:2048', // Adjust max size as needed + ]); + + $data = [ + 'title' => $request->input('title'), + 'description' => $request->input('description'), + 'promo_type' => $request->input('type'), + 'date_start' => $request->input('startDate'), + 'date_end' => $request->input('endDate'), + 'is_active' => $request->input('isActive', 0), + ]; + + // Attach the image file + $response = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ])->attach( + 'image', file_get_contents($request->file('image')->getRealPath()), $request->file('image')->getClientOriginalName() + )->post("{$this->apiBaseUrl}/cms/photoSlider", $data); + + if ($response->successful()) { + return redirect()->route('photo-slider')->with('success', 'Photo slider created successfully.'); + } else { + Log::warning('Failed to create photo slider: ', $response->json()); + return redirect()->back()->with('error', $response->json()['message'] ?? 'Failed to create photo slider. Please try again.'); + } + } catch (\Exception $e) { + Log::error('Error creating photo slider: ' . $e->getMessage()); + return redirect()->back()->with('error', 'An error occurred while creating the photo slider: ' . $e->getMessage()); + } + } + + public function edit($uuid) + { + try { + $user = Session::get('user'); + $accessToken = $user['access_token'] ?? null; + + if (!$accessToken) { + return redirect()->route('login')->with('error', 'Please log in to edit a photo slider.'); + } + + $response = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ])->get("{$this->apiBaseUrl}/cms/photoSlider/{$uuid}"); + + $json = $response->json(); + + if ($response->successful() && isset($json['data'])) { + $slider = [ + 'photo_slider_uuid' => $json['data']['photoslider_uuid'] ?? $json['data']['id'] ?? null, + 'title' => $json['data']['title'] ?? 'Untitled', + 'description' => $json['data']['description'] ?? '', + 'type' => $json['data']['promo_type'] ?? 'Unknown', + 'startDate' => $json['data']['date_start'] ?? null, + 'endDate' => $json['data']['date_end'] ?? null, + 'isActive' => $json['data']['is_active'] ?? 0, + 'image' => $json['data']['image'] ?? null, + ]; + return view('pages.photo-slider-edit', ['slider' => $slider]); + } else { + Log::warning('No photo slider found or invalid API response: ', $json); + return redirect()->route('photo-slider')->with('error', 'Photo slider not found.'); + } + } catch (\Exception $e) { + Log::error('Error fetching photo slider for edit: ' . $e->getMessage()); + return redirect()->route('photo-slider')->with('error', 'An error occurred while loading the photo slider.'); + } + } + + public function update(Request $request, $uuid) + { + try { + $user = Session::get('user'); + $accessToken = $user['access_token'] ?? null; + + if (!$accessToken) { + return redirect()->route('login')->with('error', 'Please log in to update a photo slider.'); + } + + // Validate the request (image is optional for updates) + $request->validate([ + 'image' => 'nullable|file|mimes:jpeg,png,jpg,gif|max:2048', + ]); + + $data = [ + 'title' => $request->input('title'), + 'description' => $request->input('description'), + 'promo_type' => $request->input('type'), + 'date_start' => $request->input('startDate'), + 'date_end' => $request->input('endDate'), + 'is_active' => $request->input('isActive', 0), + ]; + + $client = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ]); + + // Attach the image if provided + if ($request->hasFile('image')) { + $client = $client->attach( + 'image', + file_get_contents($request->file('image')->getRealPath()), + $request->file('image')->getClientOriginalName() + ); + } + + $response = $client->post("{$this->apiBaseUrl}/cms/updatePhotoSlider/{$uuid}", $data); + + if ($response->successful()) { + return redirect()->route('photo-slider')->with('success', 'Photo slider updated successfully.'); + } else { + Log::warning('Failed to update photo slider: ', $response->json()); + return redirect()->back()->with('error', $response->json()['message'] ?? 'Failed to update photo slider. Please try again.'); + } + } catch (\Exception $e) { + Log::error('Error updating photo slider: ' . $e->getMessage()); + return redirect()->back()->with('error', 'An error occurred while updating the photo slider: ' . $e->getMessage()); + } + } + + public function show($uuid) + { + try { + $user = Session::get('user'); + $accessToken = $user['access_token'] ?? null; + + if (!$accessToken) { + return redirect()->route('login')->with('error', 'Please log in to view a photo slider.'); + } + + $response = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ])->get("{$this->apiBaseUrl}/cms/photoSlider/{$uuid}"); + + $json = $response->json(); + + if ($response->successful() && isset($json['data'])) { + $slider = [ + 'photo_slider_uuid' => $json['data']['photoslider_uuid'] ?? $json['data']['id'] ?? null, + 'title' => $json['data']['title'] ?? 'Untitled', + 'description' => $json['data']['description'] ?? '', + 'type' => $json['data']['promo_type'] ?? 'Unknown', + 'startDate' => $json['data']['date_start'] ?? null, + 'endDate' => $json['data']['date_end'] ?? null, + 'isActive' => $json['data']['is_active'] ?? 0, + 'image' => $json['data']['image'] ?? null, + ]; + return view('pages.photo-slider-view', ['slider' => $slider]); + } else { + Log::warning('No photo slider found or invalid API response: ', $json); + return redirect()->route('photo-slider')->with('error', 'Photo slider not found.'); + } + } catch (\Exception $e) { + Log::error('Error fetching photo slider for view: ' . $e->getMessage()); + return redirect()->route('photo-slider')->with('error', 'An error occurred while loading the photo slider.'); + } + } + + public function destroy($uuid) + { + try { + $user = Session::get('user'); + $accessToken = $user['access_token'] ?? null; + + if (!$accessToken) { + return redirect()->route('login')->with('error', 'Please log in to delete a photo slider.'); + } + + $response = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ])->delete("{$this->apiBaseUrl}/cms/photoSlider/{$uuid}"); + + if ($response->successful()) { + return redirect()->route('photo-slider')->with('success', 'Photo slider deleted successfully.'); + } else { + Log::warning('Failed to delete photo slider: ', $response->json()); + return redirect()->back()->with('error', 'Failed to delete photo slider. Please try again.'); + } + } catch (\Exception $e) { + Log::error('Error deleting photo slider: ' . $e->getMessage()); + return redirect()->back()->with('error', 'An error occurred while deleting the photo slider.'); + } + } + + public function batchDelete(Request $request) + { + try { + $user = Session::get('user'); + $accessToken = $user['access_token'] ?? null; + + if (!$accessToken) { + return redirect()->route('login')->with('error', 'Please log in to delete photo sliders.'); + } + + $uuids = $request->input('photoslider_uuid'); + + if (!is_array($uuids) || empty($uuids)) { + return redirect()->back()->with('error', 'No photo sliders selected for deletion.'); + } + + $response = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ])->delete("{$this->apiBaseUrl}/cms/photoSliderBatchDelete", [ + 'photoslider_uuid' => $uuids, + ]); + + if ($response->successful()) { + return redirect()->route('photo-slider')->with('success', 'Photo sliders deleted successfully.'); + } else { + Log::warning('Failed to batch delete photo sliders: ', $response->json()); + return redirect()->back()->with('error', 'Failed to delete photo sliders. Please try again.'); + } + } catch (\Exception $e) { + Log::error('Error batch deleting photo sliders: ' . $e->getMessage()); + return redirect()->back()->with('error', 'An error occurred while deleting photo sliders.'); + } + } +} \ No newline at end of file diff --git a/resources/views/components/photo-slider-component.blade.php b/resources/views/components/photo-slider-component.blade.php new file mode 100644 index 0000000..2d5e22b --- /dev/null +++ b/resources/views/components/photo-slider-component.blade.php @@ -0,0 +1,512 @@ +@props([ + 'pageTitle' => '', + 'data' => [], + 'columns' => [], + 'actions' => [], + 'showAddButton' => false, + 'addButtonUrl' => '#', + 'showCheckboxes' => false, + 'showBatchDelete' => false, + 'showEditModal' => false, + 'showViewModal' => false, + 'currentPage' => 1, + 'lastPage' => 1, + 'total' => 0, +]) + +
+
+
{{ $pageTitle }}
+ @if ($showAddButton) + + Add {{ $pageTitle }} + + @endif +
+
+
+ +
+
+
+ + + + +
+
+
+ +
+
+ + +
+ + + + @if ($showCheckboxes) + + @endif + @foreach ($columns as $index => $column) + + @endforeach + @if (!empty($actions)) + + @endif + + + +
+ + + {{ $column['name'] }} + @if ($column['sortable']) + + @endif + Action
+
+ + +
+ @if ($showBatchDelete) +
+ +
+ @endif + +
+
+ + + + + \ No newline at end of file diff --git a/resources/views/components/table-component.blade.php b/resources/views/components/table-component.blade.php new file mode 100644 index 0000000..ee4460b --- /dev/null +++ b/resources/views/components/table-component.blade.php @@ -0,0 +1,488 @@ +@props([ + 'pageTitle' => '', + 'data' => [], + 'columns' => [], + 'actions' => [], + 'showAddButton' => false, + 'addButtonUrl' => '#', + 'showCheckboxes' => false, + 'showBatchDelete' => false, + 'currentPage' => 1, + 'lastPage' => 1, + 'total' => 0, +]) + +
+
+
{{ $pageTitle }}
+ @if ($showAddButton) + + Add {{ $pageTitle }} + + @endif +
+
+
+ +
+
+
+ + + + +
+
+
+ +
+
+ + +
+ + + + @if ($showCheckboxes) + + @endif + @foreach ($columns as $index => $column) + + @endforeach + @if (!empty($actions)) + + @endif + + + +
+ + + {{ $column['name'] }} + @if ($column['sortable']) + + @endif + Action
+
+ + +
+ @if ($showBatchDelete) +
+ +
+ @endif + +
+
+ + + + + \ No newline at end of file diff --git a/resources/views/pages/home page/photo-slider.blade.php b/resources/views/pages/home page/photo-slider.blade.php index 85315bf..dd128b3 100644 --- a/resources/views/pages/home page/photo-slider.blade.php +++ b/resources/views/pages/home page/photo-slider.blade.php @@ -3,21 +3,41 @@ @section('page_title', 'Photo Slider') @section('content') - @include('components.table-component', [ - 'pageTitle' => 'Photo Slider', - // 'data' => $sliders, - 'columns' => [ - ['name' => 'Title', 'key' => 'title', 'sortable' => true], - ['name' => 'Type', 'key' => 'type', 'sortable' => true], - ['name' => 'Start Date', 'key' => 'startDate', 'sortable' => true], - ['name' => 'End Date', 'key' => 'endDate', 'sortable' => true] - ], - 'actions' => ['edit', 'view', 'delete'], - 'showAddButton' => true, - 'addButtonUrl' => '/add-photo-slider', - 'showCheckboxes' => true, - 'showBatchDelete' => true, - 'showEditModal' => true, - 'showViewModal' => true - ]) -@endsection +
+ @if (session('success')) + + @endif + @if (session('error')) + + @endif + @include('components.photo-slider-component', [ + 'pageTitle' => 'Photo Slider', + 'data' => $sliders, + 'columns' => [ + ['name' => 'Title', 'key' => 'title', 'sortable' => true], + ['name' => 'Type', 'key' => 'type', 'sortable' => true], + ['name' => 'Start Date', 'key' => 'startDate', 'sortable' => true], + ['name' => 'End Date', 'key' => 'endDate', 'sortable' => true] + ], + 'actions' => ['edit', 'view', 'delete'], + 'showAddButton' => true, + 'addButtonUrl' => route('photo-slider.create'), + 'showCheckboxes' => true, + 'showBatchDelete' => true, + 'showEditModal' => true, + 'showViewModal' => true, + 'currentPage' => $currentPage ?? 1, + 'lastPage' => $lastPage ?? 1, + 'total' => $total ?? 0, + ]) +
+

No photo sliders found.

+
+
+@endsection \ No newline at end of file diff --git a/resources/views/pages/photo-slider-create.blade.php b/resources/views/pages/photo-slider-create.blade.php new file mode 100644 index 0000000..a353dc3 --- /dev/null +++ b/resources/views/pages/photo-slider-create.blade.php @@ -0,0 +1,52 @@ +@extends('layouts.app') + +@section('page_title', 'Add Photo Slider') + +@section('content') +
+
+
Add New Photo Slider
+
+
+ @if (session('error')) + + @endif +
+ @csrf +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + Cancel +
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/pages/photo-slider-edit.blade.php b/resources/views/pages/photo-slider-edit.blade.php new file mode 100644 index 0000000..73405b1 --- /dev/null +++ b/resources/views/pages/photo-slider-edit.blade.php @@ -0,0 +1,53 @@ +@extends('layouts.app') + +@section('page_title', 'Edit Photo Slider') + +@section('content') +
+
+
Edit Photo Slider
+
+
+ @if (session('error')) + + @endif +
+ @method('PUT') + @csrf +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + Cancel +
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/pages/photo-slider-view.blade.php b/resources/views/pages/photo-slider-view.blade.php new file mode 100644 index 0000000..7d7bf01 --- /dev/null +++ b/resources/views/pages/photo-slider-view.blade.php @@ -0,0 +1,40 @@ +@extends('layouts.app') + +@section('page_title', 'View Photo Slider') + +@section('content') +
+
+
View Photo Slider
+
+
+
+ Title: {{ $slider['title'] }} +
+
+ Description: {{ $slider['description'] }} +
+
+ Type: {{ $slider['type'] }} +
+
+ Image: + @if ($slider['image']) + {{ $slider['title'] }} + @else + No image available. + @endif +
+
+ Start Date: {{ $slider['startDate'] }} +
+
+ End Date: {{ $slider['endDate'] }} +
+
+ Active: {{ $slider['isActive'] ? 'Yes' : 'No' }} +
+ Back +
+
+@endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index c140fb0..ba30758 100644 --- a/routes/web.php +++ b/routes/web.php @@ -4,7 +4,7 @@ use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Http; use App\Http\Controllers\AuthController; use App\Http\Controllers\UserManagementController; -use App\Http\Controllers\PhotoSliderViewController; +use App\Http\Controllers\PhotoSliderController; use App\Http\Controllers\TopUpController; @@ -26,9 +26,6 @@ Route::get('/dashboard', function () { return view('dashboard'); }); - -Route::get('/photo-slider', [PhotoSliderViewController::class, 'index'])->name('photo-slider.index'); - Route::get('/notification', function () { return view('pages.notification'); })->name('notification'); @@ -115,9 +112,6 @@ Route::get('/add-promotions', function () { return view('pages.add-promotions'); })->name('add-promotions'); -Route::get('/add-top-up', function () { - return view('pages.add-top-up'); -})->name('add-top-up'); Route::get('/add-card-types', function () { return view('pages.add-card-types'); @@ -177,3 +171,13 @@ Route::get('/top-up/{uuid}/edit', [TopUpController::class, 'edit'])->name('top-u Route::put('/top-up/{uuid}', [TopUpController::class, 'update'])->name('top-up.update'); Route::delete('/top-up/{uuid}', [TopUpController::class, 'destroy'])->name('top-up.destroy'); Route::delete('/top-up/batch', [TopUpController::class, 'batchDelete'])->name('top-up.batchDelete'); + +//Photo Slider +Route::get('/photo-slider', [PhotoSliderController::class, 'index'])->name('photo-slider'); +Route::get('/photo-slider/create', [PhotoSliderController::class, 'create'])->name('photo-slider.create'); +Route::post('/photo-slider', [PhotoSliderController::class, 'store'])->name('photo-slider.store'); +Route::get('/photo-slider/{id}/edit', [PhotoSliderController::class, 'edit'])->name('photo-slider.edit'); +Route::put('/photo-slider/{id}', [PhotoSliderController::class, 'update'])->name('photo-slider.update'); +Route::get('/photo-slider/{id}', [PhotoSliderController::class, 'show'])->name('photo-slider.show'); +Route::delete('/photo-slider/{id}', [PhotoSliderController::class, 'destroy'])->name('photo-slider.destroy'); +Route::delete('/photo-slider/batch', [PhotoSliderController::class, 'batchDelete'])->name('photo-slider.batchDelete');