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')
Dengan hormatnya,
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:-