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, +]) + +
+ + | + @endif + @foreach ($columns as $index => $column) ++ {{ $column['name'] }} + @if ($column['sortable']) + + @endif + | + @endforeach + @if (!empty($actions)) +Action | + @endif +
---|
+ + | + @endif + @foreach ($columns as $index => $column) ++ {{ $column['name'] }} + @if ($column['sortable']) + + @endif + | + @endforeach + @if (!empty($actions)) +Action | + @endif +
---|
No photo sliders found.
+