From 629bed0897033efd11635d2684c0bb9a640efdbb Mon Sep 17 00:00:00 2001 From: ismailmasseran Date: Mon, 6 Jul 2026 12:50:55 +0800 Subject: [PATCH] Dev/v1.2 (#4) Co-authored-by: ISMAIL MASSERAN Reviewed-on: https://git.koppkb.com/KoPKB/My-KOPKB/pulls/4 --- package.json | 2 + pnpm-lock.yaml | 164 ++ src/.DS_Store | Bin 8196 -> 8196 bytes src/assets/images/logo-kopkb.svg | 418 ---- src/assets/images/logo.svg | 652 ++++- src/assets/images/logonew-mykopkb.svg | 185 -- .../theme-switcher/ThemeSwitcher.vue | 16 +- .../ui/pagination/PaginationRoot.vue | 30 +- src/components/ui/styles/pagination.styles.ts | 4 +- src/components/ui/usage/DataTable.vue | 65 +- src/docs/DocsLayout.vue | 11 - src/docs/pages/accordion.vue | 129 - src/docs/pages/alert.vue | 639 ----- src/docs/pages/avatar.vue | 239 -- src/docs/pages/badge.vue | 351 --- src/docs/pages/box.vue | 199 -- src/docs/pages/breadcrumb.vue | 181 -- src/docs/pages/button.vue | 1743 -------------- src/docs/pages/carousel.vue | 445 ---- src/docs/pages/chart.vue | 235 -- src/docs/pages/checkbox.vue | 235 -- src/docs/pages/combobox.vue | 1111 --------- src/docs/pages/datepicker.vue | 1771 -------------- src/docs/pages/dialog.vue | 560 ----- src/docs/pages/field.vue | 484 ---- src/docs/pages/input.vue | 74 - src/docs/pages/map.vue | 369 --- src/docs/pages/menu.vue | 831 ------- src/docs/pages/pagination.vue | 298 --- src/docs/pages/popover.vue | 447 ---- src/docs/pages/progress-circular.vue | 255 -- src/docs/pages/progress-linear.vue | 227 -- src/docs/pages/radio-group.vue | 325 --- src/docs/pages/scroll-area.vue | 259 -- src/docs/pages/select.vue | 886 ------- src/docs/pages/sheet.vue | 508 ---- src/docs/pages/slider.vue | 493 ---- src/docs/pages/slot.vue | 196 -- src/docs/pages/switch.vue | 230 -- src/docs/pages/table.vue | 653 ----- src/docs/pages/tabs.vue | 361 --- src/docs/pages/textarea.vue | 69 - src/docs/pages/toast.vue | 371 --- src/docs/pages/tooltip.vue | 287 --- src/main.ts | 2 + src/main/side-menu.ts | 470 +--- .../composables/useActivityLogList.ts | 74 + src/modules/activity-log/index.ts | 2 + src/modules/activity-log/menu.ts | 10 + .../activity-log/pages/ActivityLogList.vue | 105 + 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 + src/modules/auth/pages/AccountPending.vue | 4 +- src/modules/auth/pages/ForgotPassword.vue | 2 +- src/modules/auth/pages/Login.vue | 9 +- src/modules/auth/pages/PrivacyPolicy.vue | 6 +- src/modules/auth/pages/Register.vue | 2 +- src/modules/auth/pages/ResetPassword.vue | 63 +- src/modules/auth/pages/TermsConditions.vue | 11 +- src/modules/auth/pages/VerifyEmail.vue | 4 +- src/modules/auth/types/auth.types.ts | 2 + src/modules/dashboard/index.ts | 1 + src/modules/dashboard/menu.ts | 9 + .../pages/DashboardOverview-backup.vue} | 59 +- .../dashboard/pages/DashboardOverview.vue | 258 ++ src/modules/dashboard/routes.ts | 10 + .../composables/useExternalSystemDetail.ts | 41 + .../composables/useExternalSystemList.ts | 48 + .../data/dummy-external-systems.ts | 38 + src/modules/external-system/index.ts | 2 + src/modules/external-system/menu.ts | 9 + .../pages/ExternalSystemDetail.vue | 115 + .../pages/ExternalSystemList.vue | 104 + src/modules/external-system/routes.ts | 22 + .../types/external-system.types.ts | 20 + .../utils/external-system.utils.ts | 74 + .../pages/MembershipApplication.vue | 145 +- .../pages/MembershipApplicationDetail.vue | 319 +-- .../pages/MembershipApplicationEdit.vue | 215 +- .../pages/MembershipApplicationList.vue | 173 +- .../membership-application.service.ts | 23 +- .../types/membership-application.types.ts | 8 +- .../membership-application-form.utils.ts | 20 +- .../profile/components/MemberDigitalCard.vue | 186 ++ .../components/MemberDigitalCardBack.vue | 104 + .../components/MemberDigitalCardFlip.vue | 34 + .../components/MemberDigitalCardFront.vue | 97 + src/modules/profile/index.ts | 2 +- src/modules/profile/pages/EmploymentTab.vue | 69 +- src/modules/profile/pages/HeirTab.vue | 167 +- .../profile/pages/ProfileOverview2.vue | 208 +- .../profile/pages/PublicMemberProfile.vue | 140 ++ src/modules/profile/routes.ts | 9 + .../services/member-digital-card.service.ts | 35 + .../profile/services/profile.service.ts | 5 + .../services/public-member-profile.service.ts | 12 + .../types/public-member-profile.types.ts | 16 + .../utils/member-digital-card.utils.ts | 27 + src/modules/user/pages/UserHeirTab.vue | 17 +- src/modules/user/pages/UserProfileView.vue | 2 +- src/router/index.ts | 353 +-- src/themes/Enigma/SideMenu/SideMenu.vue | 10 +- src/themes/Layout.vue | 25 +- src/utils/applyAppearance.ts | 24 + src/views/AddProduct.vue | 913 ------- src/views/BlogLayout1.vue | 207 -- src/views/BlogLayout2.vue | 207 -- src/views/BlogLayout3.vue | 236 -- src/views/Categories.vue | 180 -- src/views/Chat.vue | 2120 ----------------- src/views/CrudForm.vue | 141 -- src/views/ErrorPage.vue | 33 - src/views/FaqLayout1.vue | 271 --- src/views/FaqLayout2.vue | 232 -- src/views/FaqLayout3.vue | 271 --- src/views/FileManager.vue | 235 -- src/views/ForbiddenPage.vue | 44 - src/views/Inbox.vue | 266 --- src/views/InvoiceLayout1.vue | 137 -- src/views/InvoiceLayout2.vue | 142 -- src/views/PointOfSale.vue | 282 --- src/views/Post.vue | 481 ---- src/views/PricingLayout1.vue | 131 - src/views/PricingLayout2.vue | 279 --- src/views/ProductGrid.vue | 152 -- src/views/ProductList.vue | 178 -- src/views/Reviews.vue | 192 -- src/views/SellerDetail.vue | 261 -- src/views/SellerList.vue | 207 -- src/views/TransactionDetail.vue | 209 -- src/views/TransactionList.vue | 207 -- src/views/UsersLayout1.vue | 153 -- src/views/UsersLayout2.vue | 103 - src/views/UsersLayout3.vue | 133 -- src/views/WizardLayout1.vue | 70 - src/views/WizardLayout2.vue | 85 - src/views/WizardLayout3.vue | 88 - vite.config.ts | 8 + 140 files changed, 3506 insertions(+), 26440 deletions(-) delete mode 100644 src/assets/images/logo-kopkb.svg delete mode 100644 src/assets/images/logonew-mykopkb.svg delete mode 100644 src/docs/DocsLayout.vue delete mode 100644 src/docs/pages/accordion.vue delete mode 100644 src/docs/pages/alert.vue delete mode 100644 src/docs/pages/avatar.vue delete mode 100644 src/docs/pages/badge.vue delete mode 100644 src/docs/pages/box.vue delete mode 100644 src/docs/pages/breadcrumb.vue delete mode 100644 src/docs/pages/button.vue delete mode 100644 src/docs/pages/carousel.vue delete mode 100644 src/docs/pages/chart.vue delete mode 100644 src/docs/pages/checkbox.vue delete mode 100644 src/docs/pages/combobox.vue delete mode 100644 src/docs/pages/datepicker.vue delete mode 100644 src/docs/pages/dialog.vue delete mode 100644 src/docs/pages/field.vue delete mode 100644 src/docs/pages/input.vue delete mode 100644 src/docs/pages/map.vue delete mode 100644 src/docs/pages/menu.vue delete mode 100644 src/docs/pages/pagination.vue delete mode 100644 src/docs/pages/popover.vue delete mode 100644 src/docs/pages/progress-circular.vue delete mode 100644 src/docs/pages/progress-linear.vue delete mode 100644 src/docs/pages/radio-group.vue delete mode 100644 src/docs/pages/scroll-area.vue delete mode 100644 src/docs/pages/select.vue delete mode 100644 src/docs/pages/sheet.vue delete mode 100644 src/docs/pages/slider.vue delete mode 100644 src/docs/pages/slot.vue delete mode 100644 src/docs/pages/switch.vue delete mode 100644 src/docs/pages/table.vue delete mode 100644 src/docs/pages/tabs.vue delete mode 100644 src/docs/pages/textarea.vue delete mode 100644 src/docs/pages/toast.vue delete mode 100644 src/docs/pages/tooltip.vue create mode 100644 src/modules/activity-log/composables/useActivityLogList.ts create mode 100644 src/modules/activity-log/index.ts create mode 100644 src/modules/activity-log/menu.ts create mode 100644 src/modules/activity-log/pages/ActivityLogList.vue create mode 100644 src/modules/activity-log/routes.ts create mode 100644 src/modules/activity-log/services/activity-log.service.ts create mode 100644 src/modules/activity-log/types/activity-log.types.ts create mode 100644 src/modules/activity-log/utils/activity-log.utils.ts create mode 100644 src/modules/dashboard/index.ts create mode 100644 src/modules/dashboard/menu.ts rename src/{views/DashboardOverview1.vue => modules/dashboard/pages/DashboardOverview-backup.vue} (91%) create mode 100644 src/modules/dashboard/pages/DashboardOverview.vue create mode 100644 src/modules/dashboard/routes.ts create mode 100644 src/modules/external-system/composables/useExternalSystemDetail.ts create mode 100644 src/modules/external-system/composables/useExternalSystemList.ts create mode 100644 src/modules/external-system/data/dummy-external-systems.ts create mode 100644 src/modules/external-system/index.ts create mode 100644 src/modules/external-system/menu.ts create mode 100644 src/modules/external-system/pages/ExternalSystemDetail.vue create mode 100644 src/modules/external-system/pages/ExternalSystemList.vue create mode 100644 src/modules/external-system/routes.ts create mode 100644 src/modules/external-system/types/external-system.types.ts create mode 100644 src/modules/external-system/utils/external-system.utils.ts create mode 100644 src/modules/profile/components/MemberDigitalCard.vue create mode 100644 src/modules/profile/components/MemberDigitalCardBack.vue create mode 100644 src/modules/profile/components/MemberDigitalCardFlip.vue create mode 100644 src/modules/profile/components/MemberDigitalCardFront.vue create mode 100644 src/modules/profile/pages/PublicMemberProfile.vue create mode 100644 src/modules/profile/services/member-digital-card.service.ts create mode 100644 src/modules/profile/services/public-member-profile.service.ts create mode 100644 src/modules/profile/types/public-member-profile.types.ts create mode 100644 src/modules/profile/utils/member-digital-card.utils.ts create mode 100644 src/utils/applyAppearance.ts delete mode 100644 src/views/AddProduct.vue delete mode 100644 src/views/BlogLayout1.vue delete mode 100644 src/views/BlogLayout2.vue delete mode 100644 src/views/BlogLayout3.vue delete mode 100644 src/views/Categories.vue delete mode 100644 src/views/Chat.vue delete mode 100644 src/views/CrudForm.vue delete mode 100644 src/views/ErrorPage.vue delete mode 100644 src/views/FaqLayout1.vue delete mode 100644 src/views/FaqLayout2.vue delete mode 100644 src/views/FaqLayout3.vue delete mode 100644 src/views/FileManager.vue delete mode 100644 src/views/ForbiddenPage.vue delete mode 100644 src/views/Inbox.vue delete mode 100644 src/views/InvoiceLayout1.vue delete mode 100644 src/views/InvoiceLayout2.vue delete mode 100644 src/views/PointOfSale.vue delete mode 100644 src/views/Post.vue delete mode 100644 src/views/PricingLayout1.vue delete mode 100644 src/views/PricingLayout2.vue delete mode 100644 src/views/ProductGrid.vue delete mode 100644 src/views/ProductList.vue delete mode 100644 src/views/Reviews.vue delete mode 100644 src/views/SellerDetail.vue delete mode 100644 src/views/SellerList.vue delete mode 100644 src/views/TransactionDetail.vue delete mode 100644 src/views/TransactionList.vue delete mode 100644 src/views/UsersLayout1.vue delete mode 100644 src/views/UsersLayout2.vue delete mode 100644 src/views/UsersLayout3.vue delete mode 100644 src/views/WizardLayout1.vue delete mode 100644 src/views/WizardLayout2.vue delete mode 100644 src/views/WizardLayout3.vue diff --git a/package.json b/package.json index 6d389fe..b54979a 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "lodash": "^4.17.21", "maplibre-gl": "^5.18.0", "pinia": "^3.0.4", + "qrcode": "^1.5.4", "sweetalert2": "^11.26.25", "tailwind-merge": "^3.5.0", "tailwindcss": "^4.1.18", @@ -71,6 +72,7 @@ "@types/jsdom": "^27.0.0", "@types/lodash": "^4.17.21", "@types/node": "^24.10.4", + "@types/qrcode": "^1.5.6", "@vitejs/plugin-vue": "^6.0.3", "@vitest/eslint-plugin": "^1.6.4", "@vue/eslint-config-prettier": "^10.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ef1bc00..c4f6589 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -119,6 +119,9 @@ importers: pinia: specifier: ^3.0.4 version: 3.0.4(typescript@5.9.3)(vue@3.5.35(typescript@5.9.3)) + qrcode: + specifier: ^1.5.4 + version: 1.5.4 sweetalert2: specifier: ^11.26.25 version: 11.26.25 @@ -156,6 +159,9 @@ importers: '@types/node': specifier: ^24.10.4 version: 24.12.4 + '@types/qrcode': + specifier: ^1.5.6 + version: 1.5.6 '@vitejs/plugin-vue': specifier: ^6.0.3 version: 6.0.7(vite@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(lightningcss@1.32.0))(vue@3.5.35(typescript@5.9.3)) @@ -1041,6 +1047,9 @@ packages: '@types/pako@2.0.4': resolution: {integrity: sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==} + '@types/qrcode@1.5.6': + resolution: {integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==} + '@types/raf@3.4.3': resolution: {integrity: sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==} @@ -1588,6 +1597,10 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + caniuse-lite@1.0.30001793: resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} @@ -1637,6 +1650,9 @@ packages: resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} engines: {node: '>=20'} + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -1758,6 +1774,10 @@ packages: supports-color: optional: true + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} @@ -1784,6 +1804,9 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dompurify@3.4.7: resolution: {integrity: sha512-2jBxDJY4RR06tQNy4w5FlFH7kfxsQZlufd0sbv+chfHCxeJwrFw2baUDsSwvBISD4K4RDbd0PTfy3uNXsR6siA==} @@ -2055,6 +2078,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -2109,6 +2136,10 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.6.0: resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} @@ -2501,6 +2532,10 @@ packages: resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} engines: {node: '>=20.0.0'} + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -2679,14 +2714,26 @@ packages: ospath@1.2.2: resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -2769,6 +2816,10 @@ packages: typescript: optional: true + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + postcss-selector-parser@7.1.1: resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} @@ -2833,6 +2884,11 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + qs@6.15.2: resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} engines: {node: '>=0.6'} @@ -2856,10 +2912,17 @@ packages: request-progress@3.0.0: resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -2916,6 +2979,9 @@ packages: engines: {node: '>=10'} hasBin: true + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -3393,6 +3459,9 @@ packages: resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} engines: {node: '>=20'} + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -3420,6 +3489,10 @@ packages: resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} engines: {node: '>=0.8'} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -3467,9 +3540,20 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + yauzl@3.3.2: resolution: {integrity: sha512-Md9ankxxN23wncAN8s7+Tn3Co52zLUPMtnrLAbVCnfG5d2tKBFfmygYSgXlqFgXObtzIgqkx7aNgDBpso9+4qA==} engines: {node: '>=12'} @@ -4215,6 +4299,10 @@ snapshots: '@types/pako@2.0.4': {} + '@types/qrcode@1.5.6': + dependencies: + '@types/node': 24.12.4 + '@types/raf@3.4.3': optional: true @@ -4978,6 +5066,8 @@ snapshots: callsites@3.1.0: {} + camelcase@5.3.1: {} + caniuse-lite@1.0.30001793: {} canvg@3.0.11: @@ -5033,6 +5123,12 @@ snapshots: slice-ansi: 8.0.0 string-width: 8.2.1 + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + clsx@2.1.1: {} codepage@1.15.0: {} @@ -5172,6 +5268,8 @@ snapshots: optionalDependencies: supports-color: 8.1.1 + decamelize@1.2.0: {} + decimal.js@10.6.0: {} deep-is@0.1.4: {} @@ -5189,6 +5287,8 @@ snapshots: detect-libc@2.1.2: {} + dijkstrajs@1.0.3: {} + dompurify@3.4.7: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -5505,6 +5605,11 @@ snapshots: dependencies: to-regex-range: 5.0.1 + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -5554,6 +5659,8 @@ snapshots: gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} + get-east-asian-width@1.6.0: {} get-intrinsic@1.3.0: @@ -5928,6 +6035,10 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 9.0.2 + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -6107,14 +6218,24 @@ snapshots: ospath@1.2.2: {} + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 + p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} pako@2.1.0: {} @@ -6177,6 +6298,8 @@ snapshots: optionalDependencies: typescript: 5.9.3 + pngjs@5.0.0: {} + postcss-selector-parser@7.1.1: dependencies: cssesc: 3.0.0 @@ -6225,6 +6348,12 @@ snapshots: punycode@2.3.1: {} + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + qs@6.15.2: dependencies: side-channel: 1.1.0 @@ -6250,8 +6379,12 @@ snapshots: dependencies: throttleit: 1.0.1 + require-directory@2.1.1: {} + require-from-string@2.0.2: {} + require-main-filename@2.0.0: {} + resolve-from@4.0.0: {} resolve-protobuf-schema@2.1.0: @@ -6323,6 +6456,8 @@ snapshots: semver@7.8.1: {} + set-blocking@2.0.0: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -6781,6 +6916,8 @@ snapshots: tr46: 6.0.0 webidl-conversions: 8.0.1 + which-module@2.0.1: {} + which@2.0.2: dependencies: isexe: 2.0.0 @@ -6800,6 +6937,12 @@ snapshots: word@0.3.0: {} + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -6843,8 +6986,29 @@ snapshots: xmlchars@2.2.0: {} + y18n@4.0.3: {} + yallist@3.1.1: {} + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + yauzl@3.3.2: dependencies: pend: 1.2.0 diff --git a/src/.DS_Store b/src/.DS_Store index 0c5a35f612d88fc45b24eb7e1fd16b1922ffec7a..16ce73f5f45f5b12ff27a46a581302ab87ca5bc7 100644 GIT binary patch delta 41 xcmZp1XmOa}&nUDpU^hRb&}JTilgyj{3ZG)!SeC)GnO))=%Vbs2MH|afnE*5D4%`3$ delta 143 zcmZp1XmOa}&nU7nU^hRb$YvgalgyGV3@Hrx49N_|o;mr+NjdpR3=9kc3=B*~n~w?K tWK?BkC}YTENM$HTSHR%Jz`)4&9}G4YN;7R{m-xmq`Krh%Vzo#x0RVv)EDZnv diff --git a/src/assets/images/logo-kopkb.svg b/src/assets/images/logo-kopkb.svg deleted file mode 100644 index ef88ccb..0000000 --- a/src/assets/images/logo-kopkb.svg +++ /dev/null @@ -1,418 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/images/logo.svg b/src/assets/images/logo.svg index 28c5228..5498014 100644 --- a/src/assets/images/logo.svg +++ b/src/assets/images/logo.svg @@ -1,9 +1,649 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/logonew-mykopkb.svg b/src/assets/images/logonew-mykopkb.svg deleted file mode 100644 index ce2be41..0000000 --- a/src/assets/images/logonew-mykopkb.svg +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SISTEM INFORMASI KOPERASI ONLINE - My - - - diff --git a/src/components/theme-switcher/ThemeSwitcher.vue b/src/components/theme-switcher/ThemeSwitcher.vue index aabd2e6..68d599e 100644 --- a/src/components/theme-switcher/ThemeSwitcher.vue +++ b/src/components/theme-switcher/ThemeSwitcher.vue @@ -3,6 +3,7 @@ import { SheetRoot, SheetContent } from '@/components/ui/sheet' import { Lucide } from '@/components/ui/lucide' import { useColorSchemeStore, type ColorSchemes } from '@/stores/color-scheme' import { useDarkModeStore } from '@/stores/dark-mode' +import { applyColorSchemeClass, applyDarkModeClass } from '@/utils/applyAppearance' import { ref } from 'vue' const themeSwitcherSheet = ref(false) @@ -10,30 +11,19 @@ const setThemeSwitcherSheet = (value: boolean) => { themeSwitcherSheet.value = value } -const setColorSchemeClass = () => { - const el = document.querySelectorAll('html')[0] - el?.setAttribute('data-theme', useColorSchemeStore().colorSchemeValue) - if (useDarkModeStore().darkModeValue) el?.classList.add('dark') -} const colorSchemeStore = useColorSchemeStore() const switchColorScheme = (colorScheme: ColorSchemes) => { useColorSchemeStore().setColorScheme(colorScheme) - setColorSchemeClass() + applyColorSchemeClass() setThemeSwitcherSheet(false) } -setColorSchemeClass() -const setDarkModeClass = () => { - const el = document.querySelectorAll('html')[0] - useDarkModeStore().darkModeValue ? el?.classList.add('dark') : el?.classList.remove('dark') -} const darkModeStore = useDarkModeStore() const switchDarkMode = (darkMode: boolean) => { useDarkModeStore().setDarkMode(darkMode) - setDarkModeClass() + applyDarkModeClass() setThemeSwitcherSheet(false) } -setDarkModeClass() const colorSchemes: Array = ['default', '1', '2', '3', '4', '5'] diff --git a/src/components/ui/pagination/PaginationRoot.vue b/src/components/ui/pagination/PaginationRoot.vue index 4e01884..a1c85e9 100644 --- a/src/components/ui/pagination/PaginationRoot.vue +++ b/src/components/ui/pagination/PaginationRoot.vue @@ -7,30 +7,28 @@ import { normalizeProps, useMachine } from "@zag-js/vue"; import { computed, provide } from "vue"; import { paginationRoot } from "@mykopkb/core/styles/pagination.styles"; -const { - class: className, - asChild = false, - count, - pageSize, - siblingCount, - ...props -} = defineProps & { class?: string; asChild?: boolean }>(); +const props = defineProps & { class?: string; asChild?: boolean }>(); -const service = useMachine(pagination.machine, { - ...props, - count, - pageSize, - siblingCount, - id: crypto.randomUUID(), +const paginationId = crypto.randomUUID(); + +const machineProps = computed(() => { + const { class: _class, asChild: _asChild, id: _id, ...rest } = props; + + return { + ...rest, + id: paginationId, + }; }); + +const service = useMachine(pagination.machine, machineProps); const api = computed(() => pagination.connect(service, normalizeProps)); provide("paginationApi", api);
diff --git a/src/components/ui/styles/pagination.styles.ts b/src/components/ui/styles/pagination.styles.ts index c5c3b28..1e0683e 100644 --- a/src/components/ui/styles/pagination.styles.ts +++ b/src/components/ui/styles/pagination.styles.ts @@ -1,7 +1,7 @@ export const paginationRoot = 'flex gap-1' export const paginationItem = [ - 'h-10 px-4 py-2 inline-flex items-center justify-center rounded-xl cursor-pointer hover:bg-foreground/5', - 'data-[selected]:border data-[selected]:bg-background data-[selected]:border-foreground/10 data-[selected]:font-medium data-[selected]:shadow-md/5', + 'h-10 min-w-10 px-3 py-2 inline-flex items-center justify-center rounded-xl cursor-pointer text-foreground hover:bg-foreground/5', + 'data-[selected]:border data-[selected]:bg-primary/10 data-[selected]:border-primary/30 data-[selected]:text-primary data-[selected]:font-semibold data-[selected]:shadow-md/5', 'data-[disabled]:opacity-70', ] export const paginationPrevTrigger = paginationItem diff --git a/src/components/ui/usage/DataTable.vue b/src/components/ui/usage/DataTable.vue index 3db6a24..5f63286 100644 --- a/src/components/ui/usage/DataTable.vue +++ b/src/components/ui/usage/DataTable.vue @@ -94,25 +94,29 @@ const props = withDefaults(defineProps<{ items: TableItem[]; loading?: boolean; itemsPerPage?: number; - page?: number; itemKey?: string; pagination?: PaginationData | null; showPagination?: boolean; currentSort?: SortConfig[]; exportable?: boolean; exportFileName?: string; + /** When true, table body scrolls inside a max-height box instead of growing the page. */ + scrollable?: boolean; + /** Max height of the scrollable table area (CSS value). */ + maxHeight?: string; }>(), { items: () => [], headers: () => [], loading: false, itemsPerPage: 10, - page: 1, itemKey: 'id', pagination: null, showPagination: false, currentSort: () => [], exportable: false, - exportFileName: 'table-data' + exportFileName: 'table-data', + scrollable: true, + maxHeight: 'min(70dvh, 640px)', }); // Define model props @@ -122,7 +126,6 @@ const itemsPerPageModel = defineModel('items-per-page'); // Emits const emit = defineEmits<{ 'update:sort-by': [value: SortConfig[]]; - 'update:page': [value: number]; 'update:items-per-page': [value: number]; 'update:column-widths': [value: Record]; 'export-error': [error: Error]; @@ -449,7 +452,6 @@ const setItemsPerPageValue = (details: { value: string[] }) => { const handlePageChange = (details: { page: number }) => { pageModel.value = details.page; - emit('update:page', details.page); }; const getItemKey = (item: TableItem, index: number) => { @@ -461,16 +463,18 @@ const currentPage = computed( () => pageModel.value ?? props.pagination?.current_page ?? 1, ); -const isFirstPage = computed(() => currentPage.value <= 1); - -const isLastPage = computed( - () => currentPage.value >= (props.pagination?.last_page ?? 1), -); - const slots = useSlots(); const showTableToolbar = computed(() => props.exportable || !!slots.toolbar); +const scrollContainerStyle = computed(() => { + if (!props.scrollable) { + return undefined; + } + + return { maxHeight: props.maxHeight }; +}); + const recordSummary = computed(() => { if (!props.pagination) return null; @@ -743,12 +747,20 @@ watch(sortBy, (newSort) => { -
- +
+
{
- - - + + + - - + + @@ -881,8 +886,8 @@ watch(sortBy, (newSort) => {