diff --git a/app/Http/Controllers/CardMemberController.php b/app/Http/Controllers/CardMemberController.php
new file mode 100644
index 0000000..55c0a9d
--- /dev/null
+++ b/app/Http/Controllers/CardMemberController.php
@@ -0,0 +1,92 @@
+route('login')->with('error', 'Please log in to view card members.');
+ }
+
+ $page = $request->input('page', 1);
+ $pageSize = 5; // Fixed at 5 per page as per sample
+ $search = $request->input('_search', null);
+
+ $response = Http::withHeaders([
+ 'Accept' => 'application/json',
+ 'Authorization' => 'Bearer ' . $accessToken,
+ ])->get("{$this->apiBaseUrl}/cms/member", [
+ '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();
+
+ Log::info("Card Member API Response (Page {$page}): ", $json);
+
+ if ($response->successful() && isset($json['data']) && is_array($json['data'])) {
+ $members = array_map(function ($member) {
+ Log::info('Processing card member record: ', $member);
+ return [
+ 'id' => $member['lcard_uuid'] ?? null,
+ 'cardNumber' => $member['card_number'] ?? '',
+ 'firstName' => $member['firstname'] ?? '',
+ 'lastName' => $member['lastname'] ?? '',
+ 'birthday' => $member['birthdate'] ?? '',
+ 'cardType' => $member['card_type'] ?? '',
+ 'status' => $member['is_validated'] ? 'Active' : 'Inactive',
+ ];
+ }, $json['data']);
+
+ $total = $json['meta']['total'] ?? count($members);
+ $lastPage = $json['meta']['last_page'] ?? ceil($total / $pageSize);
+
+ return view('pages.member management.card-member', [
+ 'members' => $members,
+ 'currentPage' => $page,
+ 'lastPage' => $lastPage,
+ 'total' => $total,
+ 'search' => $search,
+ ]);
+ } else {
+ Log::warning('No card member data found or invalid API response: ', $json);
+ return view('pages.member management.card-member', [
+ 'members' => [],
+ 'currentPage' => 1,
+ 'lastPage' => 1,
+ 'total' => 0,
+ 'search' => $search,
+ ]);
+ }
+ } catch (\Exception $e) {
+ Log::error('Error fetching card member data: ' . $e->getMessage());
+ return view('pages.member management.card-member', [
+ 'members' => [],
+ 'currentPage' => 1,
+ 'lastPage' => 1,
+ 'total' => 0,
+ 'search' => $search,
+ ]);
+ }
+ }
+}
\ No newline at end of file
diff --git a/resources/views/components/card-member-component.blade.php b/resources/views/components/card-member-component.blade.php
new file mode 100644
index 0000000..1803efe
--- /dev/null
+++ b/resources/views/components/card-member-component.blade.php
@@ -0,0 +1,419 @@
+@props([
+ 'pageTitle' => '',
+ 'data' => [],
+ 'columns' => [],
+ 'actions' => [],
+ 'showAddButton' => false,
+ 'addButtonUrl' => '#',
+ 'showCheckboxes' => false,
+ 'showBatchDelete' => false,
+ 'showEditModal' => false,
+ 'showViewModal' => false,
+ 'currentPage' => 1,
+ 'lastPage' => 1,
+ 'total' => 0,
+])
+
+
+
+
+
+
+
+
+ Clear Filters
+
+
+
+
+
+
+
+
+
+ @if ($showBatchDelete)
+
+
+ Delete Selected
+
+
+ @endif
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/views/pages/card-member-view.blade.php b/resources/views/pages/card-member-view.blade.php
new file mode 100644
index 0000000..a2b5b75
--- /dev/null
+++ b/resources/views/pages/card-member-view.blade.php
@@ -0,0 +1,32 @@
+@extends('layouts.app')
+
+@section('page_title', 'View Card Member')
+
+@section('content')
+
+
+
+
+ Card Number: {{ $member['cardNumber'] }}
+
+
+ First Name: {{ $member['firstName'] }}
+
+
+ Last Name: {{ $member['lastName'] }}
+
+
+ Birthday: {{ $member['birthday'] ? date('F d, Y', strtotime($member['birthday'])) : 'N/A' }}
+
+
+ Card Type: {{ $member['cardType'] }}
+
+
+ Status: {{ $member['status'] }}
+
+
Back
+
+
+@endsection
\ No newline at end of file
diff --git a/resources/views/pages/member management/card-member.blade.php b/resources/views/pages/member management/card-member.blade.php
index 3801146..442bded 100644
--- a/resources/views/pages/member management/card-member.blade.php
+++ b/resources/views/pages/member management/card-member.blade.php
@@ -3,31 +3,42 @@
@section('page_title', 'Card Member')
@section('content')
- @php
- $members = [
- ['id' => 1, 'cardNumber' => '1234-5678-9012-3456', 'firstName' => 'John', 'lastName' => 'Doe', 'birthday' => '1990-05-15', 'cardType' => 'Gold', 'status' => 'Active'],
- ['id' => 2, 'cardNumber' => '9876-5432-1098-7654', 'firstName' => 'Jane', 'lastName' => 'Smith', 'birthday' => '1985-11-22', 'cardType' => 'Silver', 'status' => 'Inactive'],
- ['id' => 3, 'cardNumber' => '4567-8901-2345-6789', 'firstName' => 'Alice', 'lastName' => 'Johnson', 'birthday' => '1992-03-10', 'cardType' => 'Platinum', 'status' => 'Active'],
- ['id' => 4, 'cardNumber' => '3210-9876-5432-1098', 'firstName' => 'Bob', 'lastName' => 'Brown', 'birthday' => '1988-07-30', 'cardType' => 'Gold', 'status' => 'Active']
- ];
- @endphp
-
- @include('components.table-component', [
- 'pageTitle' => 'Card Member',
- 'data' => $members,
- 'columns' => [
- ['name' => 'Card Number', 'key' => 'cardNumber', 'sortable' => true],
- ['name' => 'First Name', 'key' => 'firstName', 'sortable' => true],
- ['name' => 'Last Name', 'key' => 'lastName', 'sortable' => true],
- ['name' => 'Birthday', 'key' => 'birthday', 'sortable' => true],
- ['name' => 'Card Type', 'key' => 'cardType', 'sortable' => true],
- ['name' => 'Status', 'key' => 'status', 'sortable' => true]
- ],
- 'actions' => ['view'],
- 'showAddButton' => false,
- 'showCheckboxes' => false,
- 'showBatchDelete' => false,
- 'showEditModal' => false,
- 'showViewModal' => true
- ])
+
+ @if (session('success'))
+
+ {{ session('success') }}
+
+
+ @endif
+ @if (session('error'))
+
+ {{ session('error') }}
+
+
+ @endif
+ @include('components.table-component', [
+ 'pageTitle' => 'Card Member',
+ 'data' => $members,
+ 'columns' => [
+ ['name' => 'Card Number', 'key' => 'cardNumber', 'sortable' => true],
+ ['name' => 'First Name', 'key' => 'firstName', 'sortable' => true],
+ ['name' => 'Last Name', 'key' => 'lastName', 'sortable' => true],
+ ['name' => 'Birthday', 'key' => 'birthday', 'sortable' => true],
+ ['name' => 'Card Type', 'key' => 'cardType', 'sortable' => true],
+ ['name' => 'Status', 'key' => 'status', 'sortable' => true]
+ ],
+ 'actions' => ['view'],
+ 'showAddButton' => false,
+ 'showCheckboxes' => false,
+ 'showBatchDelete' => false,
+ 'showEditModal' => false,
+ 'showViewModal' => true,
+ 'currentPage' => $currentPage ?? 1,
+ 'lastPage' => $lastPage ?? 1,
+ 'total' => $total ?? 0,
+ ])
+
+
No card members found.
+
+
@endsection
\ No newline at end of file
diff --git a/routes/web.php b/routes/web.php
index 92338b9..2bbaf6f 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -7,8 +7,7 @@ use App\Http\Controllers\UserManagementController;
use App\Http\Controllers\PhotoSliderController;
use App\Http\Controllers\TopUpController;
use App\Http\Controllers\NotificationController;
-
-
+use App\Http\Controllers\CardMemberController;
Route::get('/', function () {
return redirect()->route('login');
@@ -182,4 +181,8 @@ Route::delete('/photo-slider/batch', [PhotoSliderController::class, 'batchDelete
//Notification
Route::get('/notification', [NotificationController::class, 'index'])->name('notification');
Route::get('/notification/create', [NotificationController::class, 'create'])->name('notification.create');
-Route::post('/notification', [NotificationController::class, 'store'])->name('notification.store');
\ No newline at end of file
+Route::post('/notification', [NotificationController::class, 'store'])->name('notification.store');
+
+//Card Member
+Route::get('/card-member', [CardMemberController::class, 'index'])->name('card-member');
+Route::get('/card-member/{uuid}', [CardMemberController::class, 'show'])->name('card-member.show');
\ No newline at end of file