From 41b7cd37c0882871c043495a2033f8d78e50279b Mon Sep 17 00:00:00 2001 From: armiejean Date: Fri, 16 May 2025 15:48:45 +0800 Subject: [PATCH] card type functionality works --- app/Http/Controllers/CardTypeController.php | 414 ++++++++++++++++++ .../components/card-type-component.blade.php | 166 +++++++ .../views/pages/about us/card-types.blade.php | 164 ++----- .../views/pages/add-card-types.blade.php | 240 +++++----- .../views/pages/edit-card-types.blade.php | 130 ++++++ .../views/pages/view-card-types.blade.php | 42 ++ routes/web.php | 14 +- 7 files changed, 928 insertions(+), 242 deletions(-) create mode 100644 app/Http/Controllers/CardTypeController.php create mode 100644 resources/views/components/card-type-component.blade.php create mode 100644 resources/views/pages/edit-card-types.blade.php create mode 100644 resources/views/pages/view-card-types.blade.php diff --git a/app/Http/Controllers/CardTypeController.php b/app/Http/Controllers/CardTypeController.php new file mode 100644 index 0000000..49e4445 --- /dev/null +++ b/app/Http/Controllers/CardTypeController.php @@ -0,0 +1,414 @@ +route('login')->with('error', 'Please log in to view card types.'); + } + + $page = $request->input('page', 1); + $pageSize = 5; + $search = $request->input('_search', null); + + $response = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ])->get("{$this->apiBaseUrl}/cardType", [ + 'page' => $page, + 'page_size' => $pageSize, + '_search' => $search, + ]); + + 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(); + + if ($response->successful() && isset($json['data']) && is_array($json['data'])) { + $cardTypes = array_map(function ($item) { + return [ + 'id' => $item['cardtype_uuid'] ?? null, + 'cardCode' => $item['code'] ?? '', + 'cardTypeDescription' => $item['description'] ?? '', + 'cardTypeShortDescription' => $item['short_description'] ?? '', + 'cardTypeImage' => $item['image'] ?? '', + 'virtualCardFontColor' => $item['virtual_card_font_color'] ?? '', + 'cardTypeCoverImage' => $item['bg_image'] ?? '', + 'idNumberRequired' => $item['id_number'] ? 'Yes' : 'No', + 'idNumberDescription' => $item['id_number_description'] ?? '', + 'termsAndConditions' => $item['terms_and_conditions'] ?? '', + 'faqs' => $item['faqs'] ?? '', + 'type' => $item['type'] ?? '', + ]; + }, $json['data']); + + $total = $json['meta']['total'] ?? count($cardTypes); + $lastPage = $json['meta']['last_page'] ?? ceil($total / $pageSize); + } else { + Log::warning('No card types data found or invalid API response: ', $json); + $cardTypes = []; + $total = 0; + $lastPage = 1; + } + + return view('pages.about us.card-types', [ + 'cardTypes' => $cardTypes, + 'currentPage' => $page, + 'lastPage' => $lastPage, + 'total' => $total, + 'search' => $search, + ]); + } catch (\Exception $e) { + Log::error('Error fetching card types: ' . $e->getMessage()); + return view('pages.about us.card-types', [ + 'cardTypes' => [], + 'currentPage' => 1, + 'lastPage' => 1, + 'total' => 0, + 'search' => $search, + ]); + } + } + + public function create() + { + try { + $user = Session::get('user'); + $accessToken = $user['access_token'] ?? null; + + if (!$accessToken) { + return redirect()->route('login')->with('error', 'Please log in to add a card type.'); + } + + return view('pages.add-card-types', [ + 'fontColors' => ['White', 'Black'], + 'idNumberOptions' => ['Yes', 'No'], + 'cardTypes' => ['Visa', 'MasterCard', 'Amex'], + ]); + } catch (\Exception $e) { + Log::error('Error loading create card type page: ' . $e->getMessage()); + return view('pages.add-card-types', [ + 'fontColors' => ['White', 'Black'], + 'idNumberOptions' => ['Yes', 'No'], + 'cardTypes' => ['Visa', 'MasterCard', 'Amex'], + ]); + } + } + + 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 card type.'); + } + + $request->validate([ + 'code' => 'required|string|max:50', + 'type' => 'required|in:Visa,MasterCard,Amex', + 'description' => 'required|string|max:255', + 'short_description' => 'required|string|max:100', + 'image' => 'nullable|file|mimes:jpeg,png,jpg,gif|max:2048', + 'bg_image' => 'nullable|file|mimes:jpeg,png,jpg,gif|max:2048', + 'virtual_card_font_color' => 'required|in:White,Black', + 'id_number' => 'required|in:Yes,No', + 'id_number_description' => 'nullable|string|max:255', + 'terms_and_conditions' => 'required|string', + 'faqs' => 'required|string', + ]); + + $payload = [ + 'code' => $request->input('code'), + 'type' => $request->input('type'), + 'description' => $request->input('description'), + 'short_description' => $request->input('short_description'), + 'virtual_card_font_color' => $request->input('virtual_card_font_color'), + 'id_number' => $request->input('id_number') === 'Yes' ? 1 : 0, + 'id_number_description' => $request->input('id_number_description', ''), + 'terms_and_conditions' => $request->input('terms_and_conditions'), + 'faqs' => $request->input('faqs'), + ]; + + $client = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ]); + + if ($request->hasFile('image')) { + $image = $request->file('image'); + $client = $client->attach('image', file_get_contents($image->getPathname()), $image->getClientOriginalName()); + } + + if ($request->hasFile('bg_image')) { + $bgImage = $request->file('bg_image'); + $client = $client->attach('bg_image', file_get_contents($bgImage->getPathname()), $bgImage->getClientOriginalName()); + } + + $response = $client->post("{$this->apiBaseUrl}/cardType", $payload); + + $json = $response->json(); + Log::info('API response for creating card type: ', $json); + + if ($response->successful()) { + Log::info('Card type created successfully: ', $json); + return redirect()->route('card-types')->with('success', $json['message'] ?? 'Card type added successfully.'); + } else { + $errorMessage = $json['message'] ?? 'Failed to add card type. Please try again.'; + if (isset($json['errors'])) { + $errorMessage .= ' Errors: ' . json_encode($json['errors']); + } + throw new \Exception($errorMessage); + } + } catch (\Exception $e) { + Log::error('Error creating card type: ' . $e->getMessage()); + return redirect()->back()->withErrors(['error' => 'An error occurred while adding the card type: ' . $e->getMessage()])->withInput(); + } + } + + 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 card type.'); + } + + $response = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ])->get("{$this->apiBaseUrl}/cardType/{$uuid}"); + + $json = $response->json(); + + if ($response->successful() && isset($json['data'])) { + $cardType = [ + 'id' => $json['data']['cardtype_uuid'] ?? null, + 'cardCode' => $json['data']['code'] ?? '', + 'cardTypeDescription' => $json['data']['description'] ?? '', + 'cardTypeShortDescription' => $json['data']['short_description'] ?? '', + 'cardTypeImage' => $json['data']['image'] ?? '', + 'virtualCardFontColor' => $json['data']['virtual_card_font_color'] ?? '', + 'cardTypeCoverImage' => $json['data']['bg_image'] ?? '', + 'idNumberRequired' => $json['data']['id_number'] ? 'Yes' : 'No', + 'idNumberDescription' => $json['data']['id_number_description'] ?? '', + 'termsAndConditions' => $json['data']['terms_and_conditions'] ?? '', + 'faqs' => $json['data']['faqs'] ?? '', + 'type' => $json['data']['type'] ?? '', + ]; + return view('pages.view-card-types', ['cardType' => $cardType]); + } else { + Log::warning('No card type found or invalid API response: ', $json); + return redirect()->back()->with('error', 'Card type not found.'); + } + } catch (\Exception $e) { + Log::error('Error fetching card type for view: ' . $e->getMessage()); + return redirect()->back()->with('error', 'An error occurred while loading the card type.'); + } + } + + 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 card type.'); + } + + $response = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ])->get("{$this->apiBaseUrl}/cardType/{$uuid}"); + + $json = $response->json(); + + if ($response->successful() && isset($json['data'])) { + $cardType = [ + 'id' => $json['data']['cardtype_uuid'] ?? null, + 'cardCode' => $json['data']['code'] ?? '', + 'cardTypeDescription' => $json['data']['description'] ?? '', + 'cardTypeShortDescription' => $json['data']['short_description'] ?? '', + 'cardTypeImage' => $json['data']['image'] ?? '', + 'virtualCardFontColor' => $json['data']['virtual_card_font_color'] ?? '', + 'cardTypeCoverImage' => $json['data']['bg_image'] ?? '', + 'idNumberRequired' => $json['data']['id_number'] ? 'Yes' : 'No', + 'idNumberDescription' => $json['data']['id_number_description'] ?? '', + 'termsAndConditions' => $json['data']['terms_and_conditions'] ?? '', + 'faqs' => $json['data']['faqs'] ?? '', + 'type' => $json['data']['type'] ?? '', + ]; + return view('pages.edit-card-types', [ + 'cardType' => $cardType, + 'fontColors' => ['White', 'Black'], + 'idNumberOptions' => ['Yes', 'No'], + 'cardTypes' => ['Visa', 'MasterCard', 'Amex'], + ]); + } else { + Log::warning('No card type found or invalid API response: ', $json); + return redirect()->back()->with('error', 'Card type not found.'); + } + } catch (\Exception $e) { + Log::error('Error fetching card type for edit: ' . $e->getMessage()); + return redirect()->back()->with('error', 'An error occurred while loading the card type.'); + } + } + + 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 card type.'); + } + + $request->validate([ + 'code' => 'required|string|max:50', + 'type' => 'required|in:Visa,MasterCard,Amex', + 'description' => 'required|string|max:255', + 'short_description' => 'required|string|max:100', + 'image' => 'nullable|file|mimes:jpeg,png,jpg,gif|max:2048', + 'bg_image' => 'nullable|file|mimes:jpeg,png,jpg,gif|max:2048', + 'virtual_card_font_color' => 'required|in:White,Black', + 'id_number' => 'required|in:Yes,No', + 'id_number_description' => 'nullable|string|max:255', + 'terms_and_conditions' => 'required|string', + 'faqs' => 'required|string', + ]); + + $payload = [ + 'code' => $request->input('code'), + 'type' => $request->input('type'), + 'description' => $request->input('description'), + 'short_description' => $request->input('short_description'), + 'virtual_card_font_color' => $request->input('virtual_card_font_color'), + 'id_number' => $request->input('id_number') === 'Yes' ? 1 : 0, + 'id_number_description' => $request->input('id_number_description', ''), + 'terms_and_conditions' => $request->input('terms_and_conditions'), + 'faqs' => $request->input('faqs'), + ]; + + $client = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ]); + + if ($request->hasFile('image')) { + $image = $request->file('image'); + $client = $client->attach('image', file_get_contents($image->getPathname()), $image->getClientOriginalName()); + } + + if ($request->hasFile('bg_image')) { + $bgImage = $request->file('bg_image'); + $client = $client->attach('bg_image', file_get_contents($bgImage->getPathname()), $bgImage->getClientOriginalName()); + } + + $response = $client->post("{$this->apiBaseUrl}/cardTypeUpdate/{$uuid}", $payload); + + $json = $response->json(); + Log::info('API response for updating card type: ', $json); + + if ($response->successful()) { + Log::info('Card type updated successfully: ', $json); + return redirect()->route('card-types')->with('success', $json['message'] ?? 'Card type updated successfully.'); + } else { + $errorMessage = $json['message'] ?? 'Failed to update card type. Please try again.'; + if (isset($json['errors'])) { + $errorMessage .= ' Errors: ' . json_encode($json['errors']); + } + return redirect()->back()->withErrors(['error' => $errorMessage]); + } + } catch (\Exception $e) { + Log::error('Error updating card type: ' . $e->getMessage()); + return redirect()->back()->withErrors(['error' => 'An error occurred while updating the card type: ' . $e->getMessage()]); + } + } + + 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 card type.'); + } + + $response = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ])->delete("{$this->apiBaseUrl}/cardType/{$uuid}"); + + if ($response->successful()) { + Log::info('Card type deleted successfully: ' . $uuid); + return redirect()->route('card-types')->with('success', 'Card type deleted successfully.'); + } else { + Log::warning('Failed to delete card type: ', $response->json()); + return redirect()->back()->with('error', $response->json()['message'] ?? 'Failed to delete card type. Please try again.'); + } + } catch (\Exception $e) { + Log::error('Error deleting card type: ' . $e->getMessage()); + return redirect()->back()->with('error', 'An error occurred while deleting the card type.'); + } + } + + 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 card types.'); + } + + $uuids = $request->input('cardtype_uuid', []); + + if (empty($uuids)) { + return redirect()->back()->with('error', 'No card types selected for deletion.'); + } + + $response = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ])->delete("{$this->apiBaseUrl}/cardTypeBatchDelete", [ + 'cardtype_uuid' => $uuids, + ]); + + if ($response->successful()) { + Log::info('Card types batch deleted successfully: ', $uuids); + return redirect()->route('card-types')->with('success', 'Selected card types deleted successfully.'); + } else { + Log::warning('Failed to batch delete card types: ', $response->json()); + return redirect()->back()->with('error', $response->json()['message'] ?? 'Failed to delete card types. Please try again.'); + } + } catch (\Exception $e) { + Log::error('Error batch deleting card types: ' . $e->getMessage()); + return redirect()->back()->with('error', 'An error occurred while deleting the card types.'); + } + } +} \ No newline at end of file diff --git a/resources/views/components/card-type-component.blade.php b/resources/views/components/card-type-component.blade.php new file mode 100644 index 0000000..54c8fc4 --- /dev/null +++ b/resources/views/components/card-type-component.blade.php @@ -0,0 +1,166 @@ +@props([ + 'pageTitle' => '', + 'data' => [], + 'columns' => [], + 'actions' => [], + 'showAddButton' => false, + 'addButtonUrl' => '#', + 'currentPage' => 1, + 'lastPage' => 1, + 'total' => 0, +]) + +
+
+
{{ $pageTitle }}
+ @if ($showAddButton) + + Add {{ $pageTitle }} + + @endif +
+
+
+ +
+
+
+ + + + +
+
+
+ + +
+ + + + @foreach ($columns as $index => $column) + + @endforeach + @if (!empty($actions)) + + @endif + + + +
+ {{ $column['name'] }} + @if ($column['sortable']) + + @endif + Action
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/resources/views/pages/about us/card-types.blade.php b/resources/views/pages/about us/card-types.blade.php index 5fd8ac7..be4d11a 100644 --- a/resources/views/pages/about us/card-types.blade.php +++ b/resources/views/pages/about us/card-types.blade.php @@ -3,123 +3,53 @@ @section('page_title', 'Card Types') @section('content') - @php - $cardTypes = [ - [ - 'id' => 1, - 'cardCode' => 'VISA01', - 'cardTypeDescription' => 'Visa Platinum Card', - 'cardTypeShortDescription' => 'Premium Visa card', - 'cardTypeImage' => '', - 'virtualCardFontColor' => 'White', - 'cardTypeCoverImage' => '', - 'idNumberRequired' => 'Yes', - 'idNumberDescription' => 'Government-issued ID required', - 'termsAndConditions' => 'Valid for 5 years. Annual fee applies.', - 'faqs' => 'Q: What is the credit limit? A: Up to $10,000.' +
+ @if (session('success')) + + @endif + @if (session('error')) + + @endif + @include('components.card-type-component', [ + 'pageTitle' => 'Card Types', + 'data' => $cardTypes ?? [], + 'columns' => [ + ['name' => 'Card Type Code', 'key' => 'cardCode', 'sortable' => true], + ['name' => 'Type', 'key' => 'type', 'sortable' => true], + ['name' => 'Card Type Description', 'key' => 'cardTypeDescription', 'sortable' => true], ], - [ - 'id' => 2, - 'cardCode' => 'MC02', - 'cardTypeDescription' => 'MasterCard Gold', - 'cardTypeShortDescription' => 'Gold MasterCard', - 'cardTypeImage' => '', - 'virtualCardFontColor' => 'Black', - 'cardTypeCoverImage' => '', - 'idNumberRequired' => 'No', - 'idNumberDescription' => '', - 'termsAndConditions' => 'No annual fee for first year.', - 'faqs' => 'Q: Can I use it abroad? A: Yes, globally accepted.' + 'allFields' => [ + ['name' => 'Card Code', 'key' => 'code', 'type' => 'text', 'required' => true], + ['name' => 'Type', 'key' => 'type', 'type' => 'select', 'options' => ['Visa', 'MasterCard', 'Amex'], 'required' => true], + ['name' => 'Card Type Description', 'key' => 'description', 'type' => 'text', 'required' => true], + ['name' => 'Card Type Short Description', 'key' => 'short_description', 'type' => 'text', 'required' => true], + ['name' => 'Card Type Image', 'key' => 'image', 'type' => 'file'], + ['name' => 'Virtual Card Font Color', 'key' => 'virtual_card_font_color', 'type' => 'select', 'options' => ['White', 'Black'], 'required' => true], + ['name' => 'Card Type Cover Image', 'key' => 'bg_image', 'type' => 'file'], + ['name' => 'ID Number Required?', 'key' => 'id_number', 'type' => 'select', 'options' => ['Yes', 'No'], 'required' => true], + ['name' => 'ID Number Description', 'key' => 'id_number_description', 'type' => 'text'], + ['name' => 'Terms and Conditions', 'key' => 'terms_and_conditions', 'type' => 'textarea', 'required' => true], + ['name' => 'FAQs', 'key' => 'faqs', 'type' => 'textarea', 'required' => true], ], - [ - 'id' => 3, - 'cardCode' => 'AMEX03', - 'cardTypeDescription' => 'Amex Rewards Card', - 'cardTypeShortDescription' => 'Amex Rewards', - 'cardTypeImage' => '', - 'virtualCardFontColor' => 'White', - 'cardTypeCoverImage' => '', - 'idNumberRequired' => 'Yes', - 'idNumberDescription' => 'Passport or driver’s license', - 'termsAndConditions' => 'Earn 2x points on travel.', - 'faqs' => 'Q: How to redeem points? A: Via app.' - ], - [ - 'id' => 4, - 'cardCode' => 'VISA04', - 'cardTypeDescription' => 'Visa Classic Card', - 'cardTypeShortDescription' => 'Basic Visa card', - 'cardTypeImage' => '', - 'virtualCardFontColor' => 'Black', - 'cardTypeCoverImage' => '', - 'idNumberRequired' => 'No', - 'idNumberDescription' => '', - 'termsAndConditions' => 'Standard rates apply.', - 'faqs' => 'Q: Is there a fee? A: No hidden fees.' - ], - [ - 'id' => 5, - 'cardCode' => 'MC05', - 'cardTypeDescription' => 'MasterCard Premium', - 'cardTypeShortDescription' => 'Premium MasterCard', - 'cardTypeImage' => '', - 'virtualCardFontColor' => 'White', - 'cardTypeCoverImage' => '', - 'idNumberRequired' => 'Yes', - 'idNumberDescription' => 'ID for verification', - 'termsAndConditions' => 'Free lounge access.', - 'faqs' => 'Q: Lounge access? A: At major airports.' - ], - [ - 'id' => 6, - 'cardCode' => 'AMEX06', - 'cardTypeDescription' => 'Amex Business Card', - 'cardTypeShortDescription' => 'Business Amex', - 'cardTypeImage' => '', - 'virtualCardFontColor' => 'Black', - 'cardTypeCoverImage' => '', - 'idNumberRequired' => 'No', - 'idNumberDescription' => '', - 'termsAndConditions' => 'For business expenses.', - 'faqs' => 'Q: Tax benefits? A: Consult accountant.' - ] - ]; - @endphp - - @include('components.table-component', [ - 'pageTitle' => 'Card Types', - 'data' => $cardTypes, - 'columns' => [ - ['name' => 'Card Type Code', 'key' => 'cardCode', 'sortable' => true], - ['name' => 'Card Type Description', 'key' => 'cardTypeDescription', 'sortable' => true] - ], - 'allFields' => [ - ['name' => 'Card Code', 'key' => 'cardCode', 'type' => 'text', 'required' => true], - ['name' => 'Card Type Description', 'key' => 'cardTypeDescription', 'type' => 'text', 'required' => true], - ['name' => 'Card Type Short Description', 'key' => 'cardTypeShortDescription', 'type' => 'text', 'required' => true], - ['name' => 'Card Type Image', 'key' => 'cardTypeImage', 'type' => 'file'], - ['name' => 'Virtual Card Font Color', 'key' => 'virtualCardFontColor', 'type' => 'select', 'options' => ['White', 'Black'], 'required' => true], - ['name' => 'Card Type Cover Image', 'key' => 'cardTypeCoverImage', 'type' => 'file'], - ['name' => 'ID Number Required?', 'key' => 'idNumberRequired', 'type' => 'select', 'options' => ['Yes', 'No'], 'required' => true], - ['name' => 'ID Number Description', 'key' => 'idNumberDescription', 'type' => 'text'], - ['name' => 'Terms and Conditions', 'key' => 'termsAndConditions', 'type' => 'textarea', 'required' => true], - ['name' => 'FAQs', 'key' => 'faqs', 'type' => 'textarea', 'required' => true] - ], - 'actions' => ['edit', 'view', 'delete'], - 'showAddButton' => true, - 'addButtonUrl' => '/add-card-types', - 'showCheckboxes' => true, - 'showBatchDelete' => true, - 'showEditModal' => true, - 'showViewModal' => true - ]) - - + 'actions' => ['edit', 'view', 'delete'], + 'showAddButton' => true, + 'addButtonUrl' => route('card-types.create'), + 'showCheckboxes' => true, + 'showBatchDelete' => true, + 'showEditModal' => true, + 'showViewModal' => true, + 'currentPage' => $currentPage ?? 1, + 'lastPage' => $lastPage ?? 1, + 'total' => $total ?? 0, + ]) +
+

No card types found.

+
+
@endsection \ No newline at end of file diff --git a/resources/views/pages/add-card-types.blade.php b/resources/views/pages/add-card-types.blade.php index 8292833..e749097 100644 --- a/resources/views/pages/add-card-types.blade.php +++ b/resources/views/pages/add-card-types.blade.php @@ -3,129 +3,121 @@ @section('page_title', 'Add Card Type') @section('content') -
-
Add Card Type
+
+

Add Card Type

+ @if (session('success')) + + @endif + @if ($errors->any()) + + @endif + +
+ @csrf +
+ + + @error('code') +
{{ $message }}
+ @enderror +
+
+ + + @error('type') +
{{ $message }}
+ @enderror +
+
+ + + @error('description') +
{{ $message }}
+ @enderror +
+
+ + + @error('short_description') +
{{ $message }}
+ @enderror +
+
+ + + @error('image') +
{{ $message }}
+ @enderror +
+
+ + + @error('virtual_card_font_color') +
{{ $message }}
+ @enderror +
+
+ + + @error('bg_image') +
{{ $message }}
+ @enderror +
+
+ + + @error('id_number') +
{{ $message }}
+ @enderror +
+
+ + + @error('id_number_description') +
{{ $message }}
+ @enderror +
+
+ + + @error('terms_and_conditions') +
{{ $message }}
+ @enderror +
+
+ + + @error('faqs') +
{{ $message }}
+ @enderror +
+ + Cancel +
-
-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
-
-
- - - - @endsection \ No newline at end of file diff --git a/resources/views/pages/edit-card-types.blade.php b/resources/views/pages/edit-card-types.blade.php new file mode 100644 index 0000000..4510702 --- /dev/null +++ b/resources/views/pages/edit-card-types.blade.php @@ -0,0 +1,130 @@ +@extends('layouts.app') + +@section('page_title', 'Edit Card Type') + +@section('content') +
+

Edit Card Type

+ @if (session('success')) + + @endif + @if ($errors->any()) + + @endif + +
+ @csrf + @method('POST') +
+ + + @error('code') +
{{ $message }}
+ @enderror +
+
+ + + @error('type') +
{{ $message }}
+ @enderror +
+
+ + + @error('description') +
{{ $message }}
+ @enderror +
+
+ + + @error('short_description') +
{{ $message }}
+ @enderror +
+
+ + + @if ($cardType['cardTypeImage']) +

Current image: View

+ @endif + @error('image') +
{{ $message }}
+ @enderror +
+
+ + + @error('virtual_card_font_color') +
{{ $message }}
+ @enderror +
+
+ + + @if ($cardType['cardTypeCoverImage']) +

Current image: View

+ @endif + @error('bg_image') +
{{ $message }}
+ @enderror +
+
+ + + @error('id_number') +
{{ $message }}
+ @enderror +
+
+ + + @error('id_number_description') +
{{ $message }}
+ @enderror +
+
+ + + @error('terms_and_conditions') +
{{ $message }}
+ @enderror +
+
+ + + @error('faqs') +
{{ $message }}
+ @enderror +
+ + Cancel +
+
+@endsection \ No newline at end of file diff --git a/resources/views/pages/view-card-types.blade.php b/resources/views/pages/view-card-types.blade.php new file mode 100644 index 0000000..5695a1f --- /dev/null +++ b/resources/views/pages/view-card-types.blade.php @@ -0,0 +1,42 @@ +@extends('layouts.app') + +@section('page_title', 'View Card Type') + +@section('content') +
+

View Card Type

+ @if (session('success')) + + @endif + @if (session('error')) + + @endif + +
+
+
{{ $cardType['cardTypeDescription'] }}
+

Card Code: {{ $cardType['cardCode'] }}

+

Type: {{ $cardType['type'] }}

+

Short Description: {{ $cardType['cardTypeShortDescription'] }}

+ @if ($cardType['cardTypeImage']) +

Card Image: View

+ @endif +

Font Color: {{ $cardType['virtualCardFontColor'] }}

+ @if ($cardType['cardTypeCoverImage']) +

Cover Image: View

+ @endif +

ID Number Required: {{ $cardType['idNumberRequired'] }}

+

ID Number Description: {{ $cardType['idNumberDescription'] ?: 'N/A' }}

+

Terms and Conditions: {{ $cardType['termsAndConditions'] }}

+

FAQs: {{ $cardType['faqs'] }}

+ Back +
+
+
+@endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 8ef1c0c..ce57947 100644 --- a/routes/web.php +++ b/routes/web.php @@ -10,6 +10,8 @@ use App\Http\Controllers\NotificationController; use App\Http\Controllers\CardMemberController; use App\Http\Controllers\PromotionController; use App\Http\Controllers\TermsAndPrivacyController; +use App\Http\Controllers\CardTypeController; + Route::get('/', function () { @@ -203,4 +205,14 @@ Route::get('/terms-and-privacy/{uuid}', [TermsAndPrivacyController::class, 'show Route::get('/terms-and-privacy/{uuid}/edit', [TermsAndPrivacyController::class, 'edit'])->name('terms-and-privacy.edit'); Route::put('/terms-and-privacy/{uuid}', [TermsAndPrivacyController::class, 'update'])->name('terms-and-privacy.update'); Route::delete('/terms-and-privacy/{uuid}', [TermsAndPrivacyController::class, 'destroy'])->name('terms-and-privacy.destroy'); -Route::delete('/terms-and-privacy/batch-delete', [TermsAndPrivacyController::class, 'batchDelete'])->name('terms-and-privacy.batchDelete'); \ No newline at end of file +Route::delete('/terms-and-privacy/batch-delete', [TermsAndPrivacyController::class, 'batchDelete'])->name('terms-and-privacy.batchDelete'); + +//Card Types +Route::get('/card-types', [CardTypeController::class, 'index'])->name('card-types'); +Route::get('/card-types/create', [CardTypeController::class, 'create'])->name('card-types.create'); +Route::post('/card-types', [CardTypeController::class, 'store'])->name('card-types.store'); +Route::get('/card-types/{uuid}', [CardTypeController::class, 'show'])->name('card-types.show'); +Route::get('/card-types/{uuid}/edit', [CardTypeController::class, 'edit'])->name('card-types.edit'); +Route::post('/card-types/{uuid}', [CardTypeController::class, 'update'])->name('card-types.update'); +Route::delete('/card-types/{uuid}', [CardTypeController::class, 'destroy'])->name('card-types.destroy'); +Route::delete('/card-types/batch-delete', [CardTypeController::class, 'batchDelete'])->name('card-types.batchDelete'); \ No newline at end of file