From 195d0300a0bb7b24c982f8a9963e767b01db85bb Mon Sep 17 00:00:00 2001 From: Kavehhn174 Date: Sun, 30 Aug 2026 11:25:31 +0330 Subject: [PATCH] fix(gallery): resolve image zoom stretching and add rich viewer features --- package-lock.json | 7 + package.json | 1 + src/App.vue | 41 +- src/components/ListLoadingScreen.vue | 17 +- src/components/LoadingCheck.vue | 127 ++-- .../dashboard/PropertyStatusWidget.vue | 10 +- .../dashboard/QuickActionsWidget.vue | 11 +- .../dashboard/RecentSalesWidget.vue | 32 +- .../dashboard/RevenueStreamWidget.vue | 15 +- src/components/dashboard/StatsWidget.vue | 44 +- .../dashboard/WarehouseActivityWidget.vue | 47 +- src/layout/AppMenu.vue | 5 +- src/layout/AppTopbar.vue | 7 +- src/layout/composables/layout.js | 2 +- src/service/CategoryService.js | 1 - src/service/FeatureService.js | 1 - src/service/PermissionService.js | 9 +- src/service/PropertyService.js | 15 +- src/service/RoleService.js | 9 +- src/service/SettingService.js | 14 +- src/service/TransactionService.js | 15 +- src/service/UserService.js | 9 +- src/service/WarehouseItemService.js | 10 +- src/service/WarehouseService.js | 10 +- src/utils/jalali.js | 17 +- src/views/Dashboard.vue | 25 +- src/views/pages/Category/ListCategories.vue | 8 +- src/views/pages/Features/ListFeatures.vue | 45 +- src/views/pages/Property/CreateProperty.vue | 181 ++--- src/views/pages/Property/ListProperties.vue | 144 +--- src/views/pages/Property/PropertyMap.vue | 603 ++++++++--------- src/views/pages/Roles/ListRoles.vue | 60 +- src/views/pages/Settings/SearchSettings.vue | 162 +---- .../pages/Transaction/ListTransactions.vue | 3 - src/views/pages/Users/ListUsers.vue | 68 +- .../CreateWarehouseTransaction.vue | 446 +++++++----- .../ListWarehouseItemTransactions.vue | 251 ++++--- .../WarehouseItems/ListWarehouseItems.vue | 149 ++-- .../pages/WarehouseItems/ListWarehouses.vue | 174 +++-- .../WarehouseItems/WarehouseItemStockView.vue | 394 ++++++----- src/views/uikit/FileGallery.vue | 143 ++-- src/views/uikit/ImageGallery.vue | 189 +++--- src/views/uikit/ImageUploader.vue | 72 +- src/views/uikit/ImageViewerModal.vue | 636 ++++++++++++++++++ src/views/uikit/KiwiChips.vue | 16 +- src/views/uikit/KiwiToggleSwitch.vue | 14 +- src/views/uikit/MapComponent.vue | 335 ++++----- src/views/uikit/MediaDoc.vue | 17 +- 48 files changed, 2448 insertions(+), 2163 deletions(-) create mode 100644 src/views/uikit/ImageViewerModal.vue diff --git a/package-lock.json b/package-lock.json index b2d1b20..806d7b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "usng.js": "^0.4.5", "utm-latlng": "^1.0.8", "v-mapbox": "^5.1.0", + "viewerjs": "^1.12.0", "vue": "^3.4.34", "vue-cookies": "^1.8.3", "vue-filepond": "^7.0.4", @@ -4840,6 +4841,12 @@ "resolved": "https://registry.npmjs.org/vazirmatn/-/vazirmatn-33.0.3.tgz", "integrity": "sha512-fbjNc0CMjazZpIegWzz9OHGzI1APFboT+x7ZecXlUCtDe/nkyx7gtCTZnWS/+eeXG7fbfXymCPKJI8EsnM3iqw==" }, + "node_modules/viewerjs": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/viewerjs/-/viewerjs-1.12.0.tgz", + "integrity": "sha512-eQrV7FvqXj2Ysavd9LINI6bFAvXtw5YbdlMtdIo6Bmrv25hEOBeXoOX9E7cJwYuFAOPFzmppFvDn02QNHB120w==", + "license": "MIT" + }, "node_modules/vite": { "version": "5.4.11", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", diff --git a/package.json b/package.json index ff2da84..72fed21 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "usng.js": "^0.4.5", "utm-latlng": "^1.0.8", "v-mapbox": "^5.1.0", + "viewerjs": "^1.12.0", "vue": "^3.4.34", "vue-cookies": "^1.8.3", "vue-filepond": "^7.0.4", diff --git a/src/App.vue b/src/App.vue index be31b27..e84f797 100644 --- a/src/App.vue +++ b/src/App.vue @@ -6,28 +6,31 @@ axios.defaults.baseURL = import.meta.env.VITE_API_URL; axios.defaults.withCredentials = true; // Global Axios Request Interceptor for Authentication -axios.interceptors.request.use((config) => { - config.withCredentials = true; +axios.interceptors.request.use( + (config) => { + config.withCredentials = true; - // Resolve token from Cookies, localStorage, or document.cookie - let token = Cookies.get('bm-token') || (typeof localStorage !== 'undefined' ? localStorage.getItem('bm-token') : null); + // Resolve token from Cookies, localStorage, or document.cookie + let token = Cookies.get('bm-token') || (typeof localStorage !== 'undefined' ? localStorage.getItem('bm-token') : null); - if (!token && typeof document !== 'undefined') { - token = document.cookie - .split('; ') - .find((row) => row.startsWith('bm-token=')) - ?.split('=')[1]; + if (!token && typeof document !== 'undefined') { + token = document.cookie + .split('; ') + .find((row) => row.startsWith('bm-token=')) + ?.split('=')[1]; + } + + if (token && token !== 'undefined' && token !== 'null' && token.trim() !== '') { + config.headers = config.headers || {}; + config.headers.Authorization = `Bearer ${token.trim()}`; + } + + return config; + }, + (error) => { + return Promise.reject(error); } - - if (token && token !== 'undefined' && token !== 'null' && token.trim() !== '') { - config.headers = config.headers || {}; - config.headers.Authorization = `Bearer ${token.trim()}`; - } - - return config; -}, (error) => { - return Promise.reject(error); -}); +); @@ -111,7 +96,9 @@ const formatNumber = (num) => { @@ -129,12 +116,7 @@ const formatNumber = (num) => { diff --git a/src/components/dashboard/RevenueStreamWidget.vue b/src/components/dashboard/RevenueStreamWidget.vue index 53018a4..ee214cb 100644 --- a/src/components/dashboard/RevenueStreamWidget.vue +++ b/src/components/dashboard/RevenueStreamWidget.vue @@ -18,10 +18,7 @@ const { getPrimary, getSurface, isDarkTheme } = useLayout(); const chartData = ref(null); const chartOptions = ref(null); -const palette = [ - '#3b82f6', '#10b981', '#f59e0b', '#ec4899', '#8b5cf6', - '#06b6d4', '#f97316', '#6366f1', '#14b8a6', '#84cc16' -]; +const palette = ['#3b82f6', '#10b981', '#f59e0b', '#ec4899', '#8b5cf6', '#06b6d4', '#f97316', '#6366f1', '#14b8a6', '#84cc16']; function updateChart() { const documentStyle = getComputedStyle(document.documentElement); @@ -101,9 +98,13 @@ function updateChart() { }; } -watch(() => props.categoryStats, () => { - updateChart(); -}, { deep: true }); +watch( + () => props.categoryStats, + () => { + updateChart(); + }, + { deep: true } +); watch([getPrimary, getSurface, isDarkTheme], () => { updateChart(); diff --git a/src/components/dashboard/StatsWidget.vue b/src/components/dashboard/StatsWidget.vue index 6ef8be1..15d35b0 100644 --- a/src/components/dashboard/StatsWidget.vue +++ b/src/components/dashboard/StatsWidget.vue @@ -24,15 +24,15 @@ const warehouseFlow = computed(() => props.stats?.warehouseFlow || {});