member management functionality works

This commit is contained in:
armiejean 2025-05-16 12:31:02 +08:00
parent 2ed97e9578
commit 060f41ada6
6 changed files with 255 additions and 50 deletions

View File

@ -60,24 +60,20 @@ class CardMemberController extends Controller
$total = $json['meta']['total'] ?? count($members); $total = $json['meta']['total'] ?? count($members);
$lastPage = $json['meta']['last_page'] ?? ceil($total / $pageSize); $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 { } else {
Log::warning('No card member data found or invalid API response: ', $json); Log::warning('No card member data found or invalid API response: ', $json);
return view('pages.member management.card-member', [ $members = [];
'members' => [], $total = 0;
'currentPage' => 1, $lastPage = 1;
'lastPage' => 1,
'total' => 0,
'search' => $search,
]);
} }
return view('pages.member management.card-member', [
'members' => $members,
'currentPage' => $page,
'lastPage' => $lastPage,
'total' => $total,
'search' => $search,
]);
} catch (\Exception $e) { } catch (\Exception $e) {
Log::error('Error fetching card member data: ' . $e->getMessage()); Log::error('Error fetching card member data: ' . $e->getMessage());
return view('pages.member management.card-member', [ return view('pages.member management.card-member', [
@ -89,4 +85,151 @@ class CardMemberController extends Controller
]); ]);
} }
} }
public function lockedAccounts(Request $request)
{
try {
$user = Session::get('user');
$accessToken = $user['access_token'] ?? null;
if (!$accessToken) {
Log::info('No access token found, redirecting to login from locked-account');
return redirect()->route('login')->with('error', 'Please log in to view locked accounts.');
}
$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,
'_locked' => 1, // Fetch only locked accounts
]);
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("Locked Account API Response (Page {$page}): ", $json);
if ($response->successful() && isset($json['data']) && is_array($json['data'])) {
$members = array_map(function ($member) {
Log::info('Processing locked account 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);
} else {
Log::warning('No locked account data found or invalid API response: ', $json);
$members = [];
$total = 0;
$lastPage = 1;
}
return view('pages.member management.locked-account', [
'members' => $members,
'currentPage' => $page,
'lastPage' => $lastPage,
'total' => $total,
'search' => $search,
]);
} catch (\Exception $e) {
Log::error('Error fetching locked account data: ' . $e->getMessage());
return view('pages.member management.locked-account', [
'members' => [],
'currentPage' => 1,
'lastPage' => 1,
'total' => 0,
'search' => $search,
]);
}
}
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 member.');
}
$response = Http::withHeaders([
'Accept' => 'application/json',
'Authorization' => 'Bearer ' . $accessToken,
])->get("{$this->apiBaseUrl}/cms/member/{$uuid}");
$json = $response->json();
if ($response->successful() && isset($json['data'])) {
$member = [
'id' => $json['data']['lcard_uuid'] ?? null,
'cardNumber' => $json['data']['card_number'] ?? '',
'firstName' => $json['data']['firstname'] ?? '',
'lastName' => $json['data']['lastname'] ?? '',
'birthday' => $json['data']['birthdate'] ?? '',
'cardType' => $json['data']['card_type'] ?? '',
'status' => $json['data']['is_validated'] ? 'Active' : 'Inactive',
];
// Determine the view based on the referring route
$previousUrl = url()->previous();
if (str_contains($previousUrl, 'locked-account')) {
return view('pages.locked-account-view', ['member' => $member]);
}
return view('pages.card-member-view', ['member' => $member]);
} else {
Log::warning('No card member found or invalid API response: ', $json);
return redirect()->back()->with('error', 'Card member not found.');
}
} catch (\Exception $e) {
Log::error('Error fetching card member for view: ' . $e->getMessage());
return redirect()->back()->with('error', 'An error occurred while loading the card member.');
}
}
public function activate($uuid)
{
try {
$user = Session::get('user');
$accessToken = $user['access_token'] ?? null;
if (!$accessToken) {
return redirect()->route('login')->with('error', 'Please log in to activate an account.');
}
$response = Http::withHeaders([
'Accept' => 'application/json',
'Authorization' => 'Bearer ' . $accessToken,
])->post("{$this->apiBaseUrl}/cms/memberActivate/{$uuid}");
if ($response->successful()) {
return redirect()->route('locked-account')->with('success', 'Account activated successfully.');
} else {
Log::warning('Failed to activate account: ', $response->json());
return redirect()->back()->with('error', $response->json()['message'] ?? 'Failed to activate account. Please try again.');
}
} catch (\Exception $e) {
Log::error('Error activating account: ' . $e->getMessage());
return redirect()->back()->with('error', 'An error occurred while activating the account.');
}
}
} }

View File

@ -257,8 +257,9 @@
rowHtml += `<td class="text-center">`; rowHtml += `<td class="text-center">`;
tableConfig.actions.forEach(action => { tableConfig.actions.forEach(action => {
if (action === 'view') { if (action === 'view') {
const route = tableConfig.pageTitle === 'Locked Account' ? 'locked-account.show' : 'card-member.show';
rowHtml += ` rowHtml += `
<a href="{{ route('card-member.show', '') }}/${row.id}" class="btn btn-sm view-btn me-1" title="View"> <a href="{{ route('') }}/${route}/${row.id}" class="btn btn-sm view-btn me-1" title="View">
<i class="fa-solid fa-eye"></i> <i class="fa-solid fa-eye"></i>
</a>`; </a>`;
} }
@ -279,13 +280,15 @@
if (!pagination) return; if (!pagination) return;
pagination.innerHTML = ''; pagination.innerHTML = '';
const routeName = tableConfig.pageTitle === 'Locked Account' ? 'locked-account.index' : 'card-member.index';
const prevLi = document.createElement('li'); const prevLi = document.createElement('li');
prevLi.className = `page-item ${currentPage === 1 ? 'disabled' : ''}`; prevLi.className = `page-item ${currentPage === 1 ? 'disabled' : ''}`;
prevLi.innerHTML = `<a class="page-link" href="#" aria-label="Previous"><span aria-hidden="true">«</span></a>`; prevLi.innerHTML = `<a class="page-link" href="#" aria-label="Previous"><span aria-hidden="true">«</span></a>`;
prevLi.addEventListener('click', (e) => { prevLi.addEventListener('click', (e) => {
e.preventDefault(); e.preventDefault();
if (currentPage > 1) { if (currentPage > 1) {
window.location.href = `{{ route('card-member.index') }}?page=${currentPage - 1}&_search=${tableConfig.search || ''}`; window.location.href = `{{ route('') }}/${routeName}?page=${currentPage - 1}&_search=${tableConfig.search || ''}`;
} }
}); });
pagination.appendChild(prevLi); pagination.appendChild(prevLi);
@ -296,7 +299,7 @@
li.innerHTML = `<a class="page-link" href="#">${i}</a>`; li.innerHTML = `<a class="page-link" href="#">${i}</a>`;
li.addEventListener('click', (e) => { li.addEventListener('click', (e) => {
e.preventDefault(); e.preventDefault();
window.location.href = `{{ route('card-member.index') }}?page=${i}&_search=${tableConfig.search || ''}`; window.location.href = `{{ route('') }}/${routeName}?page=${i}&_search=${tableConfig.search || ''}`;
}); });
pagination.appendChild(li); pagination.appendChild(li);
} }
@ -307,7 +310,7 @@
nextLi.addEventListener('click', (e) => { nextLi.addEventListener('click', (e) => {
e.preventDefault(); e.preventDefault();
if (currentPage < tableConfig.lastPage) { if (currentPage < tableConfig.lastPage) {
window.location.href = `{{ route('card-member.index') }}?page=${currentPage + 1}&_search=${tableConfig.search || ''}`; window.location.href = `{{ route('') }}/${routeName}?page=${currentPage + 1}&_search=${tableConfig.search || ''}`;
} }
}); });
pagination.appendChild(nextLi); pagination.appendChild(nextLi);
@ -408,7 +411,8 @@
return; return;
} }
const memberId = this.getAttribute('data-id'); const memberId = this.getAttribute('data-id');
window.location.href = `{{ route('card-member.show', '') }}/${memberId}`; const route = tableConfig.pageTitle === 'Locked Account' ? 'locked-account.show' : 'card-member.show';
window.location.href = `{{ route('') }}/${route}/${memberId}`;
}); });
}); });
} }

View File

@ -26,7 +26,7 @@
<div class="mb-3"> <div class="mb-3">
<strong>Status:</strong> {{ $member['status'] }} <strong>Status:</strong> {{ $member['status'] }}
</div> </div>
<a href="{{ route('card-member.index') }}" class="btn btn-secondary">Back</a> <a href="{{ route('card-member') }}" class="btn btn-secondary">Back</a>
</div> </div>
</div> </div>
@endsection @endsection

View File

@ -0,0 +1,44 @@
@extends('layouts.app')
@section('page_title', 'View Locked Account')
@section('content')
<div class="card">
<div class="card-header">
<h5 class="mb-0 fw-bold text-dark">View Locked Account</h5>
</div>
<div class="card-body">
@if (session('error'))
<div class="alert alert-danger alert-dismissible fade show" role="alert">
{{ session('error') }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@endif
<div class="mb-3">
<strong>Card Number:</strong> {{ $member['cardNumber'] }}
</div>
<div class="mb-3">
<strong>First Name:</strong> {{ $member['firstName'] }}
</div>
<div class="mb-3">
<strong>Last Name:</strong> {{ $member['lastName'] }}
</div>
<div class="mb-3">
<strong>Birthday:</strong> {{ $member['birthday'] ? date('F d, Y', strtotime($member['birthday'])) : 'N/A' }}
</div>
<div class="mb-3">
<strong>Card Type:</strong> {{ $member['cardType'] }}
</div>
<div class="mb-3">
<strong>Status:</strong> {{ $member['status'] }}
</div>
<div class="d-flex gap-2">
<a href="{{ route('locked-account') }}" class="btn btn-secondary">Back</a>
<form action="{{ route('locked-account.activate', $member['id']) }}" method="POST">
@csrf
<button type="submit" class="btn btn-success" onclick="return confirm('Are you sure you want to activate this account?')">Activate Account</button>
</form>
</div>
</div>
</div>
@endsection

View File

@ -3,31 +3,42 @@
@section('page_title', 'Locked Account') @section('page_title', 'Locked Account')
@section('content') @section('content')
@php <div id="locked-account-table">
$members = [ @if (session('success'))
['id' => 1, 'cardNumber' => '1234-5678-9012-3456', 'firstName' => 'John', 'lastName' => 'Doe', 'birthday' => '1990-05-15', 'cardType' => 'Gold', 'status' => 'Inactive'], <div class="alert alert-success alert-dismissible fade show" role="alert">
['id' => 2, 'cardNumber' => '9876-5432-1098-7654', 'firstName' => 'Jane', 'lastName' => 'Smith', 'birthday' => '1985-11-22', 'cardType' => 'Silver', 'status' => 'Inactive'], {{ session('success') }}
['id' => 3, 'cardNumber' => '4567-8901-2345-6789', 'firstName' => 'Alice', 'lastName' => 'Johnson', 'birthday' => '1992-03-10', 'cardType' => 'Platinum', 'status' => 'Inactive'], <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
['id' => 4, 'cardNumber' => '3210-9876-5432-1098', 'firstName' => 'Bob', 'lastName' => 'Brown', 'birthday' => '1988-07-30', 'cardType' => 'Gold', 'status' => 'Inactive'] </div>
]; @endif
@endphp @if (session('error'))
<div class="alert alert-danger alert-dismissible fade show" role="alert">
@include('components.table-component', [ {{ session('error') }}
'pageTitle' => 'Locked Account', <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
'data' => $members, </div>
'columns' => [ @endif
['name' => 'Card Number', 'key' => 'cardNumber', 'sortable' => true], @include('components.table-component', [
['name' => 'First Name', 'key' => 'firstName', 'sortable' => true], 'pageTitle' => 'Locked Account',
['name' => 'Last Name', 'key' => 'lastName', 'sortable' => true], 'data' => $members ?? [],
['name' => 'Birthday', 'key' => 'birthday', 'sortable' => true], 'columns' => [
['name' => 'Card Type', 'key' => 'cardType', 'sortable' => true], ['name' => 'Card Number', 'key' => 'cardNumber', 'sortable' => true],
['name' => 'Status', 'key' => 'status', 'sortable' => true] ['name' => 'First Name', 'key' => 'firstName', 'sortable' => true],
], ['name' => 'Last Name', 'key' => 'lastName', 'sortable' => true],
'actions' => ['view'], ['name' => 'Birthday', 'key' => 'birthday', 'sortable' => true],
'showAddButton' => false, ['name' => 'Card Type', 'key' => 'cardType', 'sortable' => true],
'showCheckboxes' => false, ['name' => 'Status', 'key' => 'status', 'sortable' => true]
'showBatchDelete' => false, ],
'showEditModal' => false, 'actions' => ['view'],
'showViewModal' => true 'showAddButton' => false,
]) 'showCheckboxes' => false,
'showBatchDelete' => false,
'showEditModal' => false,
'showViewModal' => true,
'currentPage' => $currentPage ?? 1,
'lastPage' => $lastPage ?? 1,
'total' => $total ?? 0,
])
<div id="no-data-message" style="display: {{ empty($members ?? []) ? 'block' : 'none' }}; text-align: center; margin-top: 20px;">
<p>No locked accounts found.</p>
</div>
</div>
@endsection @endsection

View File

@ -183,6 +183,9 @@ Route::get('/notification', [NotificationController::class, 'index'])->name('not
Route::get('/notification/create', [NotificationController::class, 'create'])->name('notification.create'); Route::get('/notification/create', [NotificationController::class, 'create'])->name('notification.create');
Route::post('/notification', [NotificationController::class, 'store'])->name('notification.store'); Route::post('/notification', [NotificationController::class, 'store'])->name('notification.store');
//Card Member //Member Management
Route::get('/card-member', [CardMemberController::class, 'index'])->name('card-member'); Route::get('/card-member', [CardMemberController::class, 'index'])->name('card-member');
Route::get('/card-member/{uuid}', [CardMemberController::class, 'show'])->name('card-member.show'); Route::get('/locked-account', [CardMemberController::class, 'lockedAccounts'])->name('locked-account');
Route::get('/card-member/{uuid}', [CardMemberController::class, 'show'])->name('card-member.show');
Route::get('/locked-account/{uuid}', [CardMemberController::class, 'show'])->name('locked-account.show');
Route::post('/locked-account/activate/{uuid}', [CardMemberController::class, 'activate'])->name('locked-account.activate');