From 501545959f344c2f7c3db99fad78194ded3cfe00 Mon Sep 17 00:00:00 2001
From: ISMAIL MASSERAN
Date: Mon, 6 Jul 2026 12:50:14 +0800
Subject: [PATCH] DONE: add bos signature on letter, remove unused files or
templates files, update logo to mykopkb, remove theme switcher use gradient
colour, add external system module on frontend
---
.../Controllers/ActivityLogController.php | 11 +-
.../Providers/ActivityLogServiceProvider.php | 5 +
.../views/pdf/approved-letter.blade.php | 6 +-
be/Modules/User/Config/config.php | 2 +-
be/app/Services/LetterService.php | 13 +-
be/config/letter.php | 8 +
be/config/mail.php | 2 +-
be/public/images/logo/logo-kopkb.svg | 418 ----
be/public/images/logo/logo.svg | 649 ++++++
be/resources/assets/signatures/signature.svg | 22 +
.../views/pdf/layouts/letter.blade.php | 6 +
.../pdf/preview-approved-membership.blade.php | 14 +-
fe/src/.DS_Store | Bin 8196 -> 8196 bytes
fe/src/assets/images/logo.svg | 1065 ++++++----
fe/src/assets/images/logonew-mykopkb.svg | 185 --
.../theme-switcher/ThemeSwitcher.vue | 16 +-
fe/src/components/ui/usage/DataTable.vue | 32 +-
fe/src/docs/DocsLayout.vue | 11 -
fe/src/docs/pages/alert.vue | 639 ------
fe/src/docs/pages/box.vue | 199 --
fe/src/docs/pages/breadcrumb.vue | 181 --
fe/src/docs/pages/chart.vue | 235 ---
fe/src/docs/pages/combobox.vue | 1111 -----------
fe/src/docs/pages/datepicker.vue | 1771 -----------------
fe/src/docs/pages/dialog.vue | 560 ------
fe/src/docs/pages/field.vue | 484 -----
fe/src/docs/pages/menu.vue | 831 --------
fe/src/docs/pages/pagination.vue | 298 ---
fe/src/docs/pages/popover.vue | 447 -----
fe/src/docs/pages/progress-circular.vue | 255 ---
fe/src/docs/pages/progress-linear.vue | 227 ---
fe/src/docs/pages/radio-group.vue | 325 ---
fe/src/docs/pages/scroll-area.vue | 259 ---
fe/src/docs/pages/select.vue | 886 ---------
fe/src/docs/pages/sheet.vue | 508 -----
fe/src/docs/pages/slider.vue | 493 -----
fe/src/docs/pages/slot.vue | 196 --
fe/src/docs/pages/switch.vue | 230 ---
fe/src/docs/pages/tabs.vue | 361 ----
fe/src/docs/pages/textarea.vue | 69 -
fe/src/docs/pages/toast.vue | 371 ----
fe/src/docs/pages/tooltip.vue | 287 ---
fe/src/main.ts | 2 +
fe/src/main/side-menu.ts | 195 +-
.../composables/useActivityLogList.ts | 74 +
fe/src/modules/activity-log/index.ts | 2 +
fe/src/modules/activity-log/menu.ts | 10 +
.../activity-log/pages/ActivityLogList.vue | 105 +
fe/src/modules/activity-log/routes.ts | 14 +
.../services/activity-log.service.ts | 17 +
.../activity-log/types/activity-log.types.ts | 26 +
.../activity-log/utils/activity-log.utils.ts | 6 +
fe/src/modules/auth/pages/TermsConditions.vue | 10 +-
.../composables/useExternalSystemDetail.ts | 41 +
.../composables/useExternalSystemList.ts | 48 +
.../data/dummy-external-systems.ts | 38 +
fe/src/modules/external-system/index.ts | 2 +
fe/src/modules/external-system/menu.ts | 9 +
.../pages/ExternalSystemDetail.vue | 115 ++
.../pages/ExternalSystemList.vue | 104 +
fe/src/modules/external-system/routes.ts | 22 +
.../types/external-system.types.ts | 20 +
.../utils/external-system.utils.ts | 74 +
.../profile/pages/ProfileOverview2.vue | 2 +-
.../profile/pages/PublicMemberProfile.vue | 2 +-
fe/src/router/index.ts | 248 +--
fe/src/themes/Enigma/SideMenu/SideMenu.vue | 10 +-
fe/src/themes/Layout.vue | 23 +-
fe/src/utils/applyAppearance.ts | 24 +
fe/src/views/AddProduct.vue | 913 ---------
fe/src/views/BlogLayout1.vue | 207 --
fe/src/views/BlogLayout2.vue | 207 --
fe/src/views/BlogLayout3.vue | 236 ---
fe/src/views/Categories.vue | 180 --
fe/src/views/CrudForm.vue | 141 --
fe/src/views/ErrorPage.vue | 33 -
fe/src/views/FaqLayout1.vue | 271 ---
fe/src/views/FaqLayout2.vue | 232 ---
fe/src/views/FaqLayout3.vue | 271 ---
fe/src/views/FileManager.vue | 235 ---
fe/src/views/ForbiddenPage.vue | 44 -
fe/src/views/InvoiceLayout1.vue | 137 --
fe/src/views/InvoiceLayout2.vue | 142 --
fe/src/views/PointOfSale.vue | 282 ---
fe/src/views/PricingLayout1.vue | 131 --
fe/src/views/PricingLayout2.vue | 279 ---
fe/src/views/ProductGrid.vue | 152 --
fe/src/views/ProductList.vue | 178 --
fe/src/views/Reviews.vue | 192 --
fe/src/views/SellerDetail.vue | 261 ---
fe/src/views/SellerList.vue | 207 --
fe/src/views/TransactionDetail.vue | 209 --
fe/src/views/TransactionList.vue | 207 --
93 files changed, 2187 insertions(+), 18091 deletions(-)
delete mode 100644 be/public/images/logo/logo-kopkb.svg
create mode 100644 be/public/images/logo/logo.svg
create mode 100644 be/resources/assets/signatures/signature.svg
delete mode 100644 fe/src/assets/images/logonew-mykopkb.svg
delete mode 100644 fe/src/docs/DocsLayout.vue
delete mode 100644 fe/src/docs/pages/alert.vue
delete mode 100644 fe/src/docs/pages/box.vue
delete mode 100644 fe/src/docs/pages/breadcrumb.vue
delete mode 100644 fe/src/docs/pages/chart.vue
delete mode 100644 fe/src/docs/pages/combobox.vue
delete mode 100644 fe/src/docs/pages/datepicker.vue
delete mode 100644 fe/src/docs/pages/dialog.vue
delete mode 100644 fe/src/docs/pages/field.vue
delete mode 100644 fe/src/docs/pages/menu.vue
delete mode 100644 fe/src/docs/pages/pagination.vue
delete mode 100644 fe/src/docs/pages/popover.vue
delete mode 100644 fe/src/docs/pages/progress-circular.vue
delete mode 100644 fe/src/docs/pages/progress-linear.vue
delete mode 100644 fe/src/docs/pages/radio-group.vue
delete mode 100644 fe/src/docs/pages/scroll-area.vue
delete mode 100644 fe/src/docs/pages/select.vue
delete mode 100644 fe/src/docs/pages/sheet.vue
delete mode 100644 fe/src/docs/pages/slider.vue
delete mode 100644 fe/src/docs/pages/slot.vue
delete mode 100644 fe/src/docs/pages/switch.vue
delete mode 100644 fe/src/docs/pages/tabs.vue
delete mode 100644 fe/src/docs/pages/textarea.vue
delete mode 100644 fe/src/docs/pages/toast.vue
delete mode 100644 fe/src/docs/pages/tooltip.vue
create mode 100644 fe/src/modules/activity-log/composables/useActivityLogList.ts
create mode 100644 fe/src/modules/activity-log/index.ts
create mode 100644 fe/src/modules/activity-log/menu.ts
create mode 100644 fe/src/modules/activity-log/pages/ActivityLogList.vue
create mode 100644 fe/src/modules/activity-log/routes.ts
create mode 100644 fe/src/modules/activity-log/services/activity-log.service.ts
create mode 100644 fe/src/modules/activity-log/types/activity-log.types.ts
create mode 100644 fe/src/modules/activity-log/utils/activity-log.utils.ts
create mode 100644 fe/src/modules/external-system/composables/useExternalSystemDetail.ts
create mode 100644 fe/src/modules/external-system/composables/useExternalSystemList.ts
create mode 100644 fe/src/modules/external-system/data/dummy-external-systems.ts
create mode 100644 fe/src/modules/external-system/index.ts
create mode 100644 fe/src/modules/external-system/menu.ts
create mode 100644 fe/src/modules/external-system/pages/ExternalSystemDetail.vue
create mode 100644 fe/src/modules/external-system/pages/ExternalSystemList.vue
create mode 100644 fe/src/modules/external-system/routes.ts
create mode 100644 fe/src/modules/external-system/types/external-system.types.ts
create mode 100644 fe/src/modules/external-system/utils/external-system.utils.ts
create mode 100644 fe/src/utils/applyAppearance.ts
delete mode 100644 fe/src/views/AddProduct.vue
delete mode 100644 fe/src/views/BlogLayout1.vue
delete mode 100644 fe/src/views/BlogLayout2.vue
delete mode 100644 fe/src/views/BlogLayout3.vue
delete mode 100644 fe/src/views/Categories.vue
delete mode 100644 fe/src/views/CrudForm.vue
delete mode 100644 fe/src/views/ErrorPage.vue
delete mode 100644 fe/src/views/FaqLayout1.vue
delete mode 100644 fe/src/views/FaqLayout2.vue
delete mode 100644 fe/src/views/FaqLayout3.vue
delete mode 100644 fe/src/views/FileManager.vue
delete mode 100644 fe/src/views/ForbiddenPage.vue
delete mode 100644 fe/src/views/InvoiceLayout1.vue
delete mode 100644 fe/src/views/InvoiceLayout2.vue
delete mode 100644 fe/src/views/PointOfSale.vue
delete mode 100644 fe/src/views/PricingLayout1.vue
delete mode 100644 fe/src/views/PricingLayout2.vue
delete mode 100644 fe/src/views/ProductGrid.vue
delete mode 100644 fe/src/views/ProductList.vue
delete mode 100644 fe/src/views/Reviews.vue
delete mode 100644 fe/src/views/SellerDetail.vue
delete mode 100644 fe/src/views/SellerList.vue
delete mode 100644 fe/src/views/TransactionDetail.vue
delete mode 100644 fe/src/views/TransactionList.vue
diff --git a/be/Modules/ActivityLog/Http/Controllers/ActivityLogController.php b/be/Modules/ActivityLog/Http/Controllers/ActivityLogController.php
index 0a1e8d7..fdbbe69 100644
--- a/be/Modules/ActivityLog/Http/Controllers/ActivityLogController.php
+++ b/be/Modules/ActivityLog/Http/Controllers/ActivityLogController.php
@@ -3,17 +3,22 @@
namespace Modules\ActivityLog\Http\Controllers;
use App\Http\Controllers\Controller;
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Http\Request;
use Spatie\Activitylog\Models\Activity;
use App\Services\ActivityLogger;
class ActivityLogController extends Controller
{
+ use AuthorizesRequests;
+
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
+ $this->authorize('viewAny', Activity::class);
+
// ActivityLogger::logView(new Activity, 'Viewed activity logs');
$perPage = $request->get('per_page', 10);
@@ -27,8 +32,10 @@ class ActivityLogController extends Controller
$q->where('description', 'ILIKE', "%{$search}%")
->orWhere('subject_type', 'ILIKE', "%{$search}%")
->orWhere('event', 'ILIKE', "%{$search}%")
- ->orWhere('causer.name', 'ILIKE', "%{$search}%")
- ->orWhere('causer.email', 'ILIKE', "%{$search}%");
+ ->orWhereHas('causer', function ($causerQuery) use ($search) {
+ $causerQuery->where('name', 'ILIKE', "%{$search}%")
+ ->orWhere('email', 'ILIKE', "%{$search}%");
+ });
});
}
diff --git a/be/Modules/ActivityLog/Providers/ActivityLogServiceProvider.php b/be/Modules/ActivityLog/Providers/ActivityLogServiceProvider.php
index d1fad58..69101d9 100644
--- a/be/Modules/ActivityLog/Providers/ActivityLogServiceProvider.php
+++ b/be/Modules/ActivityLog/Providers/ActivityLogServiceProvider.php
@@ -3,7 +3,10 @@
namespace Modules\ActivityLog\Providers;
use Illuminate\Support\Facades\Blade;
+use Illuminate\Support\Facades\Gate;
use Illuminate\Support\ServiceProvider;
+use Modules\ActivityLog\Policies\ActivityLogPolicy;
+use Spatie\Activitylog\Models\Activity;
use Nwidart\Modules\Traits\PathNamespace;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
@@ -21,6 +24,8 @@ class ActivityLogServiceProvider extends ServiceProvider
*/
public function boot(): void
{
+ Gate::policy(Activity::class, ActivityLogPolicy::class);
+
$this->registerCommands();
$this->registerCommandSchedules();
$this->registerTranslations();
diff --git a/be/Modules/MembershipApplication/Resources/views/pdf/approved-letter.blade.php b/be/Modules/MembershipApplication/Resources/views/pdf/approved-letter.blade.php
index 8646b8d..21c1fea 100644
--- a/be/Modules/MembershipApplication/Resources/views/pdf/approved-letter.blade.php
+++ b/be/Modules/MembershipApplication/Resources/views/pdf/approved-letter.blade.php
@@ -66,7 +66,11 @@
@section('letter-signature')
KOPERASI PERMODALAN KELANTAN BERHAD
-
+
+ @if (! empty($signatureUrl))
+
+ @endif
+
MUHAMMAD NAFIS BIN ZAINUDIN
Pengurus Besar
b/p Setiausaha
diff --git a/be/Modules/User/Config/config.php b/be/Modules/User/Config/config.php
index 57bdafc..6484b21 100644
--- a/be/Modules/User/Config/config.php
+++ b/be/Modules/User/Config/config.php
@@ -4,5 +4,5 @@ return [
'name' => 'User',
'public_profile_token_ttl_days' => (int) env('PUBLIC_PROFILE_TOKEN_TTL_DAYS', 90),
'frontend_url' => rtrim(env('FRONTEND_URL', env('APP_URL', 'http://localhost')), '/'),
- 'digital_card_logo_path' => env('DIGITAL_CARD_LOGO_PATH', public_path('images/logo/logo-kopkb.svg')),
+ 'digital_card_logo_path' => env('DIGITAL_CARD_LOGO_PATH', public_path('images/logo/logo.svg')),
];
diff --git a/be/app/Services/LetterService.php b/be/app/Services/LetterService.php
index ba27182..a7f9c81 100644
--- a/be/app/Services/LetterService.php
+++ b/be/app/Services/LetterService.php
@@ -56,11 +56,14 @@ class LetterService
public function prepareViewData(array $overrides = []): array
{
$logoPath = $overrides['logoPath'] ?? config('mail.logo_path');
+ $signaturePath = $overrides['signaturePath'] ?? config('letter.signature_path');
return array_merge([
'letterLayout' => LetterLayout::resolve(),
'logoPath' => $logoPath,
- 'logoUrl' => $this->resolveLogoDataUri($logoPath),
+ 'logoUrl' => $this->resolveImageDataUri($logoPath),
+ 'signaturePath' => $signaturePath,
+ 'signatureUrl' => $this->resolveImageDataUri($signaturePath),
'organizationAddress' => $overrides['organizationAddress'] ?? null,
'organizationContact' => $overrides['organizationContact'] ?? null,
], $overrides);
@@ -97,14 +100,14 @@ class LetterService
return $browsershot;
}
- protected function resolveLogoDataUri(?string $logoPath): ?string
+ protected function resolveImageDataUri(?string $path): ?string
{
- if (empty($logoPath) || ! file_exists($logoPath)) {
+ if (empty($path) || ! file_exists($path)) {
return null;
}
- $mime = mime_content_type($logoPath) ?: 'image/svg+xml';
+ $mime = mime_content_type($path) ?: 'image/svg+xml';
- return 'data:'.$mime.';base64,'.base64_encode(file_get_contents($logoPath));
+ return 'data:'.$mime.';base64,'.base64_encode(file_get_contents($path));
}
}
diff --git a/be/config/letter.php b/be/config/letter.php
index dad463b..4b232b4 100644
--- a/be/config/letter.php
+++ b/be/config/letter.php
@@ -82,4 +82,12 @@ return [
'black' => '#000000',
],
+ /*
+ |--------------------------------------------------------------------------
+ | Assets
+ |--------------------------------------------------------------------------
+ */
+
+ 'signature_path' => resource_path('assets/signatures/signature.svg'),
+
];
diff --git a/be/config/mail.php b/be/config/mail.php
index 86d1427..3b53d7f 100644
--- a/be/config/mail.php
+++ b/be/config/mail.php
@@ -124,6 +124,6 @@ return [
|
*/
- 'logo_path' => public_path('images/logo/logo-kopkb-letterhead.svg'),
+ 'logo_path' => public_path('images/logo/logo.svg'),
];
diff --git a/be/public/images/logo/logo-kopkb.svg b/be/public/images/logo/logo-kopkb.svg
deleted file mode 100644
index ef88ccb..0000000
--- a/be/public/images/logo/logo-kopkb.svg
+++ /dev/null
@@ -1,418 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/be/public/images/logo/logo.svg b/be/public/images/logo/logo.svg
new file mode 100644
index 0000000..5498014
--- /dev/null
+++ b/be/public/images/logo/logo.svg
@@ -0,0 +1,649 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/be/resources/assets/signatures/signature.svg b/be/resources/assets/signatures/signature.svg
new file mode 100644
index 0000000..aa1cf66
--- /dev/null
+++ b/be/resources/assets/signatures/signature.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
diff --git a/be/resources/views/pdf/layouts/letter.blade.php b/be/resources/views/pdf/layouts/letter.blade.php
index e649a3a..35f34c6 100644
--- a/be/resources/views/pdf/layouts/letter.blade.php
+++ b/be/resources/views/pdf/layouts/letter.blade.php
@@ -239,6 +239,12 @@
height: var(--letter-signature-space-height);
}
+ .signature-space-img {
+ height: var(--letter-signature-space-height);
+ width: auto;
+ display: block;
+ }
+
.signatory-name {
font-weight: bold;
text-transform: uppercase;
diff --git a/be/resources/views/pdf/preview-approved-membership.blade.php b/be/resources/views/pdf/preview-approved-membership.blade.php
index fd2819b..620b66f 100644
--- a/be/resources/views/pdf/preview-approved-membership.blade.php
+++ b/be/resources/views/pdf/preview-approved-membership.blade.php
@@ -27,19 +27,19 @@
2. Sukacita dimaklumkan bahawa, permohonan tuan untuk menjadi anggota Koperasi
- Permodalan Kelantan Berhad(KoPKB) telah {{ membership_applications.board_result }} dalam {{ User manual fills before generate }}
+ Permodalan Kelantan Berhad(KoPKB) telah dalam
3. Pihak Koperasi akan membuat potongan gaji melalui majikan tuan sebagaiman ketetapan berikut:-