@ozdao/martyrs 0.2.539 → 0.2.541

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/dist/{globals.verifier-CJ1lr-NW.cjs → globals.verifier-Bi-XLEi9.cjs} +24 -23
  2. package/dist/{globals.verifier-BhqUrneb.js → globals.verifier-gPPX_jhf.js} +24 -23
  3. package/dist/inventory.server.cjs +1 -1
  4. package/dist/inventory.server.js +1 -1
  5. package/dist/{main-Zhs0EqRp.cjs → main-7IA3UHca.cjs} +6 -6
  6. package/dist/{main-gOfhekZG.js → main-BpBtIUcJ.js} +549 -549
  7. package/dist/martyrs/src/components/Button/Button.vue.cjs +1 -1
  8. package/dist/martyrs/src/components/Button/Button.vue.js +1 -1
  9. package/dist/martyrs/src/components/Dropdown/{Dropdown.vue.cjs → Dropdown.vue2.cjs} +2 -2
  10. package/dist/martyrs/src/components/Dropdown/Dropdown.vue2.cjs.map +1 -0
  11. package/dist/martyrs/src/components/Dropdown/{Dropdown.vue.js → Dropdown.vue2.js} +2 -2
  12. package/dist/martyrs/src/components/Dropdown/{Dropdown.vue.cjs.map → Dropdown.vue2.js.map} +1 -1
  13. package/dist/martyrs/src/components/EditImages/EditImages.vue.cjs +0 -93
  14. package/dist/martyrs/src/components/EditImages/EditImages.vue.cjs.map +1 -1
  15. package/dist/martyrs/src/components/EditImages/EditImages.vue.js +1 -94
  16. package/dist/martyrs/src/components/EditImages/EditImages.vue.js.map +1 -1
  17. package/dist/martyrs/src/components/EditImages/EditImages.vue2.cjs +93 -0
  18. package/dist/martyrs/src/components/EditImages/EditImages.vue2.cjs.map +1 -1
  19. package/dist/martyrs/src/components/EditImages/EditImages.vue2.js +94 -1
  20. package/dist/martyrs/src/components/EditImages/EditImages.vue2.js.map +1 -1
  21. package/dist/martyrs/src/components/Feed/Carousel.vue.cjs +1 -1
  22. package/dist/martyrs/src/components/Feed/Carousel.vue.js +1 -1
  23. package/dist/martyrs/src/components/Feed/Feed.vue.cjs +3 -3
  24. package/dist/martyrs/src/components/Feed/Feed.vue.js +3 -3
  25. package/dist/martyrs/src/components/FieldTags/create-tags.cjs +11 -2
  26. package/dist/martyrs/src/components/FieldTags/create-tags.cjs.map +1 -1
  27. package/dist/martyrs/src/components/FieldTags/create-tags.js +11 -2
  28. package/dist/martyrs/src/components/FieldTags/create-tags.js.map +1 -1
  29. package/dist/martyrs/src/components/Loader/{Loader.vue.cjs → Loader.vue2.cjs} +2 -2
  30. package/dist/martyrs/src/components/Loader/Loader.vue2.cjs.map +1 -0
  31. package/dist/martyrs/src/components/Loader/{Loader.vue.js → Loader.vue2.js} +2 -2
  32. package/dist/martyrs/src/components/Loader/{Loader.vue.cjs.map → Loader.vue2.js.map} +1 -1
  33. package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue.cjs +1 -1
  34. package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue.js +1 -1
  35. package/dist/martyrs/src/components/Menu/{Menu.vue.cjs → Menu.vue2.cjs} +2 -2
  36. package/dist/martyrs/src/components/Menu/Menu.vue2.cjs.map +1 -0
  37. package/dist/martyrs/src/components/Menu/{Menu.vue.js → Menu.vue2.js} +2 -2
  38. package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +1 -0
  39. package/dist/martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue.cjs +1 -1
  40. package/dist/martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue.js +1 -1
  41. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +3 -3
  42. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +3 -3
  43. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.cjs +1 -1
  44. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js +1 -1
  45. package/dist/martyrs/src/modules/auth/views/store/auth.cjs +0 -2
  46. package/dist/martyrs/src/modules/auth/views/store/auth.cjs.map +1 -1
  47. package/dist/martyrs/src/modules/auth/views/store/auth.js +0 -2
  48. package/dist/martyrs/src/modules/auth/views/store/auth.js.map +1 -1
  49. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.cjs +1 -1
  50. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +1 -1
  51. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +2 -2
  52. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +2 -2
  53. package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +3 -3
  54. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +3 -3
  55. package/dist/martyrs/src/modules/events/components/sections/Feed.vue.cjs +1 -1
  56. package/dist/martyrs/src/modules/events/components/sections/Feed.vue.js +1 -1
  57. package/dist/martyrs/src/modules/events/components/sections/List.vue.cjs +1 -1
  58. package/dist/martyrs/src/modules/events/components/sections/List.vue.js +1 -1
  59. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +1 -1
  60. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
  61. package/dist/martyrs/src/modules/globals/globals.client.cjs +0 -3
  62. package/dist/martyrs/src/modules/globals/globals.client.cjs.map +1 -1
  63. package/dist/martyrs/src/modules/globals/globals.client.js +0 -3
  64. package/dist/martyrs/src/modules/globals/globals.client.js.map +1 -1
  65. package/dist/martyrs/src/modules/globals/views/classes/globals.app.cjs +31 -41
  66. package/dist/martyrs/src/modules/globals/views/classes/globals.app.cjs.map +1 -1
  67. package/dist/martyrs/src/modules/globals/views/classes/globals.app.js +31 -41
  68. package/dist/martyrs/src/modules/globals/views/classes/globals.app.js.map +1 -1
  69. package/dist/martyrs/src/modules/globals/views/classes/module-registry.cjs +0 -3
  70. package/dist/martyrs/src/modules/globals/views/classes/module-registry.cjs.map +1 -1
  71. package/dist/martyrs/src/modules/globals/views/classes/module-registry.js +0 -3
  72. package/dist/martyrs/src/modules/globals/views/classes/module-registry.js.map +1 -1
  73. package/dist/martyrs/src/modules/globals/views/classes/store.cjs +0 -5
  74. package/dist/martyrs/src/modules/globals/views/classes/store.cjs.map +1 -1
  75. package/dist/martyrs/src/modules/globals/views/classes/store.js +0 -5
  76. package/dist/martyrs/src/modules/globals/views/classes/store.js.map +1 -1
  77. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +2 -2
  78. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +2 -2
  79. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.cjs +1 -1
  80. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.js +1 -1
  81. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +1 -1
  82. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +1 -1
  83. package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.cjs +1 -1
  84. package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.js +1 -1
  85. package/dist/martyrs/src/modules/globals/views/components/sections/{Filters.vue.cjs → Filters.vue2.cjs} +2 -2
  86. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.cjs.map +1 -0
  87. package/dist/martyrs/src/modules/globals/views/components/sections/{Filters.vue.js → Filters.vue2.js} +2 -2
  88. package/dist/martyrs/src/modules/globals/views/components/sections/{Filters.vue.cjs.map → Filters.vue2.js.map} +1 -1
  89. package/dist/martyrs/src/modules/globals/views/store/globals.cjs +2 -2
  90. package/dist/martyrs/src/modules/globals/views/store/globals.cjs.map +1 -1
  91. package/dist/martyrs/src/modules/globals/views/store/globals.js +2 -2
  92. package/dist/martyrs/src/modules/globals/views/store/globals.js.map +1 -1
  93. package/dist/martyrs/src/modules/globals/views/utils/vue-app-renderer.cjs +7 -3
  94. package/dist/martyrs/src/modules/globals/views/utils/vue-app-renderer.cjs.map +1 -1
  95. package/dist/martyrs/src/modules/globals/views/utils/vue-app-renderer.js +7 -3
  96. package/dist/martyrs/src/modules/globals/views/utils/vue-app-renderer.js.map +1 -1
  97. package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.cjs +2 -2
  98. package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.js +1 -1
  99. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.cjs +1 -1
  100. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +1 -1
  101. package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.cjs +1 -1
  102. package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.js +1 -1
  103. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.cjs +1 -1
  104. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
  105. package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs +2 -2
  106. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +2 -2
  107. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs +1 -1
  108. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +1 -1
  109. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs +2 -2
  110. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +2 -2
  111. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs +1 -1
  112. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +1 -1
  113. package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs +2 -2
  114. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +2 -2
  115. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.cjs +1 -1
  116. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +1 -1
  117. package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.cjs +1 -1
  118. package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +1 -1
  119. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +3 -3
  120. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +3 -3
  121. package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.cjs +4 -4
  122. package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js +4 -4
  123. package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.cjs +4 -4
  124. package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +4 -4
  125. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +4 -4
  126. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +4 -4
  127. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +4 -4
  128. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +4 -4
  129. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.cjs +1 -1
  130. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
  131. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +1 -1
  132. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
  133. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +1 -1
  134. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -1
  135. package/dist/martyrs/src/modules/organizations/router/organizations.cjs +1 -1
  136. package/dist/martyrs/src/modules/organizations/router/organizations.js +1 -1
  137. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.cjs +1 -1
  138. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
  139. package/dist/martyrs/src/modules/products/components/elements/Image360.vue.cjs +1 -1
  140. package/dist/martyrs/src/modules/products/components/elements/Image360.vue.js +1 -1
  141. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.cjs +1 -1
  142. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
  143. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +19 -3
  144. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs.map +1 -1
  145. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +19 -3
  146. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js.map +1 -1
  147. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs +1 -1
  148. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +1 -1
  149. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +1 -1
  150. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
  151. package/dist/martyrs/src/modules/products/components/pages/ProductRecommmendation.vue.cjs +1 -1
  152. package/dist/martyrs/src/modules/products/components/pages/ProductRecommmendation.vue.js +1 -1
  153. package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs +1 -1
  154. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +1 -1
  155. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.cjs +1 -1
  156. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +1 -1
  157. package/dist/martyrs/src/modules/products/store/categories.cjs +4 -0
  158. package/dist/martyrs/src/modules/products/store/categories.cjs.map +1 -1
  159. package/dist/martyrs/src/modules/products/store/categories.js +4 -0
  160. package/dist/martyrs/src/modules/products/store/categories.js.map +1 -1
  161. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs +1 -1
  162. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
  163. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs +1 -1
  164. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
  165. package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.cjs +1 -1
  166. package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +1 -1
  167. package/dist/martyrs.cjs.js +1 -1
  168. package/dist/martyrs.es.js +1 -1
  169. package/dist/music.server.cjs +1 -1
  170. package/dist/music.server.js +1 -1
  171. package/dist/orders.server.cjs +1 -1
  172. package/dist/orders.server.js +1 -1
  173. package/dist/organizations.server.cjs +1 -1
  174. package/dist/organizations.server.js +1 -1
  175. package/dist/products.server.cjs +10 -2
  176. package/dist/products.server.js +10 -2
  177. package/dist/rents.server.cjs +1 -1
  178. package/dist/rents.server.js +1 -1
  179. package/dist/{web-bMa0DMyG.cjs → web-C9bVm6Nw.cjs} +1 -1
  180. package/dist/{web-DxxU2bwy.js → web-DsdyXC8n.js} +1 -1
  181. package/package.json +1 -1
  182. package/src/components/FieldTags/FieldTagsNew.vue +366 -0
  183. package/src/components/FieldTags/README.md +513 -0
  184. package/src/components/FieldTags/create-tags.js +15 -2
  185. package/src/modules/auth/views/store/auth.js +0 -2
  186. package/src/modules/globals/controllers/classes/globals.validator.js +24 -23
  187. package/src/modules/globals/globals.client.js +0 -3
  188. package/src/modules/globals/views/classes/globals.app.js +21 -34
  189. package/src/modules/globals/views/classes/module-registry.js +0 -3
  190. package/src/modules/globals/views/classes/store.js +0 -7
  191. package/src/modules/globals/views/store/globals.js +2 -2
  192. package/src/modules/globals/views/utils/vue-app-renderer.js +11 -3
  193. package/src/modules/products/components/pages/CategoryEdit.vue +20 -0
  194. package/src/modules/products/middlewares/categories.verifier.js +9 -1
  195. package/src/modules/products/store/categories.js +5 -0
  196. package/dist/martyrs/src/components/Dropdown/Dropdown.vue.js.map +0 -1
  197. package/dist/martyrs/src/components/Loader/Loader.vue.js.map +0 -1
  198. package/dist/martyrs/src/components/Menu/Menu.vue.cjs.map +0 -1
  199. package/dist/martyrs/src/components/Menu/Menu.vue.js.map +0 -1
  200. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"module-registry.js","sources":["../../../../../../../src/modules/globals/views/classes/module-registry.js"],"sourcesContent":["// module-registry.js - централизованный регистр модулей\nimport { ref, readonly } from 'vue';\n\nexport class ModuleRegistry {\n constructor() {\n this.modules = new Map();\n this.loaders = new Map();\n this.initialized = new Map();\n this.dependencies = new Map();\n this.loadingPromises = new Map(); // Для предотвращения дублирования загрузки\n }\n\n // Регистрация модуля с ленивой загрузкой\n register(name, config) {\n this.loaders.set(name, {\n loader: config.loader,\n routes: config.routes || [],\n dependencies: config.dependencies || [],\n priority: config.priority || 'normal',\n preload: config.preload || false,\n critical: config.critical || false,\n });\n }\n\n // Загрузка модуля\n async load(name, context = {}) {\n // Если модуль уже загружен\n if (this.modules.has(name)) {\n return this.modules.get(name);\n }\n\n // Если модуль уже загружается, вернуть существующий промис\n if (this.loadingPromises.has(name)) {\n return this.loadingPromises.get(name);\n }\n\n const config = this.loaders.get(name);\n if (!config) {\n throw new Error(`Module ${name} not registered`);\n }\n\n // Создаем промис загрузки и сохраняем его\n const loadPromise = this._loadModule(name, context, config);\n this.loadingPromises.set(name, loadPromise);\n\n try {\n const module = await loadPromise;\n this.loadingPromises.delete(name);\n return module;\n } catch (error) {\n this.loadingPromises.delete(name);\n throw error;\n }\n }\n\n // Внутренний метод для загрузки модуля\n async _loadModule(name, context, config) {\n const loadStart = Date.now();\n\n // Загружаем зависимости\n if (config.dependencies.length > 0) {\n await Promise.all(\n config.dependencies.map(dep => this.load(dep, context))\n );\n }\n\n // Загружаем сам модуль\n const module = await config.loader();\n \n const mod = module.default || module;\n \n this.modules.set(name, mod);\n \n // Инициализируем если есть контекст\n if (context.app && !this.initialized.has(name)) {\n await this.initialize(name, context);\n }\n\n return mod;\n }\n\n // Инициализация модуля\n async initialize(name, { app, store, router, config }) {\n const module = this.modules.get(name);\n if (!module || this.initialized.has(name)) {\n return;\n }\n\n // Инициализируем зависимости\n const moduleConfig = this.loaders.get(name);\n if (moduleConfig.dependencies.length > 0) {\n for (const dep of moduleConfig.dependencies) {\n await this.initialize(dep, { app, store, router, config });\n }\n }\n\n // Инициализируем модуль\n // Поддерживаем оба варианта: module.initialize и module.default.initialize для обратной совместимости\n const initFunc = module.initialize || (module.default && module.default.initialize);\n console.log(`[DEBUG registry] Module ${name} initFunc found:`, !!initFunc);\n if (initFunc) {\n console.log(`[DEBUG registry] Calling initialize for ${name}`);\n await initFunc(app, store, router, config);\n console.log(`[DEBUG registry] Module ${name} initialize completed`);\n }\n \n this.initialized.set(name, true);\n }\n\n // Получить модули для маршрута\n getModulesForRoute(path) {\n const modules = [];\n \n // Нормализуем путь - убираем trailing slash если это не корень\n const normalizedPath = path === '/' ? '/' : path.replace(/\\/$/, '');\n \n for (const [name, config] of this.loaders) {\n if (config.routes.some(route => {\n if (typeof route === 'string') {\n // Для корневого роута матчим все пути\n if (route === '/') {\n return true;\n }\n // Для остальных роутов проверяем начало пути\n // но учитываем границы сегментов (не /events должен матчить /event)\n const normalizedRoute = route.replace(/\\/$/, '');\n return normalizedPath === normalizedRoute || \n normalizedPath.startsWith(normalizedRoute + '/');\n }\n if (route instanceof RegExp) {\n return route.test(normalizedPath);\n }\n return false;\n })) {\n modules.push({ name, ...config });\n }\n }\n\n // Сортируем по приоритету\n return modules.sort((a, b) => {\n const priorities = { critical: 0, high: 1, normal: 2, low: 3 };\n return (priorities[a.priority] || 2) - (priorities[b.priority] || 2);\n });\n }\n \n // Получить критические модули для маршрута (для SSR)\n getCriticalModulesForRoute(path) {\n const allModules = this.getModulesForRoute(path);\n \n // Фильтруем только критические модули и модули с высоким приоритетом\n const criticalModules = allModules.filter(m => \n m.critical || m.priority === 'critical' || m.priority === 'high'\n );\n \n // Добавляем базовые модули, которые всегда критические\n const baseModules = ['globals', 'auth'];\n const moduleNames = new Set([...baseModules, ...criticalModules.map(m => m.name)]);\n \n // Добавляем зависимости критических модулей\n for (const moduleName of moduleNames) {\n const config = this.loaders.get(moduleName);\n if (config && config.dependencies) {\n for (const dep of config.dependencies) {\n moduleNames.add(dep);\n }\n }\n }\n \n return Array.from(moduleNames);\n }\n\n // Предзагрузка модулей\n async preloadModules(context) {\n const toPreload = [];\n \n for (const [name, config] of this.loaders) {\n if (config.preload || config.critical) {\n toPreload.push({ name, ...config });\n }\n }\n\n // Сортируем по приоритету\n toPreload.sort((a, b) => {\n if (a.critical && !b.critical) return -1;\n if (!a.critical && b.critical) return 1;\n const priorities = { critical: 0, high: 1, normal: 2, low: 3 };\n return (priorities[a.priority] || 2) - (priorities[b.priority] || 2);\n });\n\n // Загружаем критические синхронно\n const critical = toPreload.filter(m => m.critical);\n for (const module of critical) {\n await this.load(module.name, context);\n }\n\n // Остальные в фоне\n const normal = toPreload.filter(m => !m.critical);\n if (typeof window !== 'undefined' && 'requestIdleCallback' in window) {\n window.requestIdleCallback(() => {\n normal.forEach(module => this.load(module.name, context));\n });\n } else {\n setTimeout(() => {\n normal.forEach(module => this.load(module.name, context));\n }, 100);\n }\n }\n\n}\n\n// Создаем глобальный регистр\nexport const moduleRegistry = new ModuleRegistry();\n\n// Утилита для использования в компонентах\nexport async function useModule(name) {\n return moduleRegistry.load(name);\n}\n\n// Composable для Vue\nexport function useModuleLoader() {\n const loading = ref(false);\n const error = ref(null);\n\n const loadModule = async (name) => {\n loading.value = true;\n error.value = null;\n \n try {\n const module = await moduleRegistry.load(name);\n return module;\n } catch (e) {\n error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n return {\n loadModule,\n loading: readonly(loading),\n error: readonly(error),\n };\n}"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module-registry.js","sources":["../../../../../../../src/modules/globals/views/classes/module-registry.js"],"sourcesContent":["// module-registry.js - централизованный регистр модулей\nimport { ref, readonly } from 'vue';\n\nexport class ModuleRegistry {\n constructor() {\n this.modules = new Map();\n this.loaders = new Map();\n this.initialized = new Map();\n this.dependencies = new Map();\n this.loadingPromises = new Map(); // Для предотвращения дублирования загрузки\n }\n\n // Регистрация модуля с ленивой загрузкой\n register(name, config) {\n this.loaders.set(name, {\n loader: config.loader,\n routes: config.routes || [],\n dependencies: config.dependencies || [],\n priority: config.priority || 'normal',\n preload: config.preload || false,\n critical: config.critical || false,\n });\n }\n\n // Загрузка модуля\n async load(name, context = {}) {\n // Если модуль уже загружен\n if (this.modules.has(name)) {\n return this.modules.get(name);\n }\n\n // Если модуль уже загружается, вернуть существующий промис\n if (this.loadingPromises.has(name)) {\n return this.loadingPromises.get(name);\n }\n\n const config = this.loaders.get(name);\n if (!config) {\n throw new Error(`Module ${name} not registered`);\n }\n\n // Создаем промис загрузки и сохраняем его\n const loadPromise = this._loadModule(name, context, config);\n this.loadingPromises.set(name, loadPromise);\n\n try {\n const module = await loadPromise;\n this.loadingPromises.delete(name);\n return module;\n } catch (error) {\n this.loadingPromises.delete(name);\n throw error;\n }\n }\n\n // Внутренний метод для загрузки модуля\n async _loadModule(name, context, config) {\n const loadStart = Date.now();\n\n // Загружаем зависимости\n if (config.dependencies.length > 0) {\n await Promise.all(\n config.dependencies.map(dep => this.load(dep, context))\n );\n }\n\n // Загружаем сам модуль\n const module = await config.loader();\n \n const mod = module.default || module;\n \n this.modules.set(name, mod);\n \n // Инициализируем если есть контекст\n if (context.app && !this.initialized.has(name)) {\n await this.initialize(name, context);\n }\n\n return mod;\n }\n\n // Инициализация модуля\n async initialize(name, { app, store, router, config }) {\n const module = this.modules.get(name);\n if (!module || this.initialized.has(name)) {\n return;\n }\n\n // Инициализируем зависимости\n const moduleConfig = this.loaders.get(name);\n if (moduleConfig.dependencies.length > 0) {\n for (const dep of moduleConfig.dependencies) {\n await this.initialize(dep, { app, store, router, config });\n }\n }\n\n // Инициализируем модуль\n // Поддерживаем оба варианта: module.initialize и module.default.initialize для обратной совместимости\n const initFunc = module.initialize || (module.default && module.default.initialize);\n if (initFunc) {\n await initFunc(app, store, router, config);\n }\n \n this.initialized.set(name, true);\n }\n\n // Получить модули для маршрута\n getModulesForRoute(path) {\n const modules = [];\n \n // Нормализуем путь - убираем trailing slash если это не корень\n const normalizedPath = path === '/' ? '/' : path.replace(/\\/$/, '');\n \n for (const [name, config] of this.loaders) {\n if (config.routes.some(route => {\n if (typeof route === 'string') {\n // Для корневого роута матчим все пути\n if (route === '/') {\n return true;\n }\n // Для остальных роутов проверяем начало пути\n // но учитываем границы сегментов (не /events должен матчить /event)\n const normalizedRoute = route.replace(/\\/$/, '');\n return normalizedPath === normalizedRoute || \n normalizedPath.startsWith(normalizedRoute + '/');\n }\n if (route instanceof RegExp) {\n return route.test(normalizedPath);\n }\n return false;\n })) {\n modules.push({ name, ...config });\n }\n }\n\n // Сортируем по приоритету\n return modules.sort((a, b) => {\n const priorities = { critical: 0, high: 1, normal: 2, low: 3 };\n return (priorities[a.priority] || 2) - (priorities[b.priority] || 2);\n });\n }\n \n // Получить критические модули для маршрута (для SSR)\n getCriticalModulesForRoute(path) {\n const allModules = this.getModulesForRoute(path);\n \n // Фильтруем только критические модули и модули с высоким приоритетом\n const criticalModules = allModules.filter(m => \n m.critical || m.priority === 'critical' || m.priority === 'high'\n );\n \n // Добавляем базовые модули, которые всегда критические\n const baseModules = ['globals', 'auth'];\n const moduleNames = new Set([...baseModules, ...criticalModules.map(m => m.name)]);\n \n // Добавляем зависимости критических модулей\n for (const moduleName of moduleNames) {\n const config = this.loaders.get(moduleName);\n if (config && config.dependencies) {\n for (const dep of config.dependencies) {\n moduleNames.add(dep);\n }\n }\n }\n \n return Array.from(moduleNames);\n }\n\n // Предзагрузка модулей\n async preloadModules(context) {\n const toPreload = [];\n \n for (const [name, config] of this.loaders) {\n if (config.preload || config.critical) {\n toPreload.push({ name, ...config });\n }\n }\n\n // Сортируем по приоритету\n toPreload.sort((a, b) => {\n if (a.critical && !b.critical) return -1;\n if (!a.critical && b.critical) return 1;\n const priorities = { critical: 0, high: 1, normal: 2, low: 3 };\n return (priorities[a.priority] || 2) - (priorities[b.priority] || 2);\n });\n\n // Загружаем критические синхронно\n const critical = toPreload.filter(m => m.critical);\n for (const module of critical) {\n await this.load(module.name, context);\n }\n\n // Остальные в фоне\n const normal = toPreload.filter(m => !m.critical);\n if (typeof window !== 'undefined' && 'requestIdleCallback' in window) {\n window.requestIdleCallback(() => {\n normal.forEach(module => this.load(module.name, context));\n });\n } else {\n setTimeout(() => {\n normal.forEach(module => this.load(module.name, context));\n }, 100);\n }\n }\n\n}\n\n// Создаем глобальный регистр\nexport const moduleRegistry = new ModuleRegistry();\n\n// Утилита для использования в компонентах\nexport async function useModule(name) {\n return moduleRegistry.load(name);\n}\n\n// Composable для Vue\nexport function useModuleLoader() {\n const loading = ref(false);\n const error = ref(null);\n\n const loadModule = async (name) => {\n loading.value = true;\n error.value = null;\n \n try {\n const module = await moduleRegistry.load(name);\n return module;\n } catch (e) {\n error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n return {\n loadModule,\n loading: readonly(loading),\n error: readonly(error),\n };\n}"],"names":[],"mappings":"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"}
@@ -20,21 +20,16 @@ function createStore() {
20
20
  return initialState;
21
21
  },
22
22
  async setInitialState(initialState, isHydration = false) {
23
- console.time("[PERF] Store.setInitialState");
24
23
  const modules = Object.entries(initialState);
25
- console.log(`[PERF] Setting initial state for ${modules.length} modules (hydration: ${isHydration})`);
26
24
  for (const [moduleName, moduleState] of modules) {
27
25
  if (this[moduleName] && this[moduleName].state) {
28
- console.time(`[PERF] Merge state: ${moduleName}`);
29
26
  if (isHydration) {
30
27
  Object.assign(this[moduleName].state, moduleState);
31
28
  } else {
32
29
  mergeReactive(this[moduleName].state, moduleState);
33
30
  }
34
- console.timeEnd(`[PERF] Merge state: ${moduleName}`);
35
31
  }
36
32
  }
37
- console.timeEnd("[PERF] Store.setInitialState");
38
33
  }
39
34
  });
40
35
  function mergeReactive(target, source) {
@@ -1 +1 @@
1
- {"version":3,"file":"store.cjs","sources":["../../../../../../../src/modules/globals/views/classes/store.js"],"sourcesContent":["import { isReactive, reactive } from 'vue';\n\n// Фабрика для создания store\nexport function createStore() {\n const store = reactive({\n modules: [],\n addStore(name, storage) {\n this[name] = storage;\n this.modules.push(name);\n },\n async getInitialState() {\n const initialState = {};\n for (const [moduleName, moduleStore] of Object.entries(this)) {\n if (moduleName !== 'modules' && moduleName !== 'addStore' && moduleName !== 'getInitialState' && moduleName !== 'setInitialState') {\n if (moduleStore.state) {\n initialState[moduleName] = JSON.parse(JSON.stringify(moduleStore.state));\n }\n }\n }\n return initialState;\n },\n async setInitialState(initialState, isHydration = false) {\n console.time('[PERF] Store.setInitialState');\n const modules = Object.entries(initialState);\n console.log(`[PERF] Setting initial state for ${modules.length} modules (hydration: ${isHydration})`);\n \n for (const [moduleName, moduleState] of modules) {\n if (this[moduleName] && this[moduleName].state) {\n console.time(`[PERF] Merge state: ${moduleName}`);\n \n // При гидратации просто заменяем state целиком для скорости\n if (isHydration) {\n Object.assign(this[moduleName].state, moduleState);\n } else {\n mergeReactive(this[moduleName].state, moduleState);\n }\n \n console.timeEnd(`[PERF] Merge state: ${moduleName}`);\n }\n }\n console.timeEnd('[PERF] Store.setInitialState');\n }\n });\n\n function mergeReactive(target, source) {\n // Оптимизированная версия слияния\n const keys = Object.keys(source);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const sourceValue = source[key];\n \n if (sourceValue !== null && typeof sourceValue === 'object' && !Array.isArray(sourceValue)) {\n if (isReactive(target[key])) {\n mergeReactive(target[key], sourceValue);\n } else {\n target[key] = sourceValue;\n }\n } else {\n target[key] = sourceValue;\n }\n }\n }\n\n return store;\n}\n\n// Синглтон для клиента\nlet clientStore = null;\n\n// Store для SSR должен создаваться в createApp и передаваться сюда\nlet ssrStore = null;\n\nexport function setSSRStore(store) {\n ssrStore = store;\n}\n\nexport function useStore() {\n if (typeof window === 'undefined') {\n // SSR: используем переданный store\n if (ssrStore) {\n return ssrStore;\n }\n // Fallback для обратной совместимости\n console.warn('[WARN] SSR store not set, creating new store instance');\n return createStore();\n }\n // Client: синглтон\n if (!clientStore) {\n clientStore = createStore();\n }\n return clientStore;\n}\n\nexport default useStore();\n"],"names":["store","reactive","isReactive"],"mappings":";;;AAGO,SAAS,cAAc;AAC5B,QAAMA,SAAQC,IAAAA,SAAS;AAAA,IACrB,SAAS,CAAA;AAAA,IACT,SAAS,MAAM,SAAS;AACtB,WAAK,IAAI,IAAI;AACb,WAAK,QAAQ,KAAK,IAAI;AAAA,IACxB;AAAA,IACA,MAAM,kBAAkB;AACtB,YAAM,eAAe,CAAA;AACrB,iBAAW,CAAC,YAAY,WAAW,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC5D,YAAI,eAAe,aAAa,eAAe,cAAc,eAAe,qBAAqB,eAAe,mBAAmB;AACjI,cAAI,YAAY,OAAO;AACrB,yBAAa,UAAU,IAAI,KAAK,MAAM,KAAK,UAAU,YAAY,KAAK,CAAC;AAAA,UACzE;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,gBAAgB,cAAc,cAAc,OAAO;AACvD,cAAQ,KAAK,8BAA8B;AAC3C,YAAM,UAAU,OAAO,QAAQ,YAAY;AAC3C,cAAQ,IAAI,oCAAoC,QAAQ,MAAM,wBAAwB,WAAW,GAAG;AAEpG,iBAAW,CAAC,YAAY,WAAW,KAAK,SAAS;AAC/C,YAAI,KAAK,UAAU,KAAK,KAAK,UAAU,EAAE,OAAO;AAC9C,kBAAQ,KAAK,uBAAuB,UAAU,EAAE;AAGhD,cAAI,aAAa;AACf,mBAAO,OAAO,KAAK,UAAU,EAAE,OAAO,WAAW;AAAA,UACnD,OAAO;AACL,0BAAc,KAAK,UAAU,EAAE,OAAO,WAAW;AAAA,UACnD;AAEA,kBAAQ,QAAQ,uBAAuB,UAAU,EAAE;AAAA,QACrD;AAAA,MACF;AACA,cAAQ,QAAQ,8BAA8B;AAAA,IAChD;AAAA,EACJ,CAAG;AAED,WAAS,cAAc,QAAQ,QAAQ;AAErC,UAAM,OAAO,OAAO,KAAK,MAAM;AAC/B,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,MAAM,KAAK,CAAC;AAClB,YAAM,cAAc,OAAO,GAAG;AAE9B,UAAI,gBAAgB,QAAQ,OAAO,gBAAgB,YAAY,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC1F,YAAIC,eAAW,OAAO,GAAG,CAAC,GAAG;AAC3B,wBAAc,OAAO,GAAG,GAAG,WAAW;AAAA,QACxC,OAAO;AACL,iBAAO,GAAG,IAAI;AAAA,QAChB;AAAA,MACF,OAAO;AACL,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAOF;AACT;AAGA,IAAI,cAAc;AAGlB,IAAI,WAAW;AAER,SAAS,YAAYA,QAAO;AACjC,aAAWA;AACb;AAEO,SAAS,WAAW;AACzB,MAAI,OAAO,WAAW,aAAa;AAEjC,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,YAAQ,KAAK,uDAAuD;AACpE,WAAO,YAAW;AAAA,EACpB;AAEA,MAAI,CAAC,aAAa;AAChB,kBAAc,YAAW;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,MAAA,QAAe,SAAQ;;;;;"}
1
+ {"version":3,"file":"store.cjs","sources":["../../../../../../../src/modules/globals/views/classes/store.js"],"sourcesContent":["import { isReactive, reactive } from 'vue';\n\n// Фабрика для создания store\nexport function createStore() {\n const store = reactive({\n modules: [],\n addStore(name, storage) {\n this[name] = storage;\n this.modules.push(name);\n },\n async getInitialState() {\n const initialState = {};\n for (const [moduleName, moduleStore] of Object.entries(this)) {\n if (moduleName !== 'modules' && moduleName !== 'addStore' && moduleName !== 'getInitialState' && moduleName !== 'setInitialState') {\n if (moduleStore.state) {\n initialState[moduleName] = JSON.parse(JSON.stringify(moduleStore.state));\n }\n }\n }\n return initialState;\n },\n async setInitialState(initialState, isHydration = false) {\n const modules = Object.entries(initialState);\n \n for (const [moduleName, moduleState] of modules) {\n if (this[moduleName] && this[moduleName].state) {\n // При гидратации просто заменяем state целиком для скорости\n if (isHydration) {\n Object.assign(this[moduleName].state, moduleState);\n } else {\n mergeReactive(this[moduleName].state, moduleState);\n }\n }\n }\n }\n });\n\n function mergeReactive(target, source) {\n // Оптимизированная версия слияния\n const keys = Object.keys(source);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const sourceValue = source[key];\n \n if (sourceValue !== null && typeof sourceValue === 'object' && !Array.isArray(sourceValue)) {\n if (isReactive(target[key])) {\n mergeReactive(target[key], sourceValue);\n } else {\n target[key] = sourceValue;\n }\n } else {\n target[key] = sourceValue;\n }\n }\n }\n\n return store;\n}\n\n// Синглтон для клиента\nlet clientStore = null;\n\n// Store для SSR должен создаваться в createApp и передаваться сюда\nlet ssrStore = null;\n\nexport function setSSRStore(store) {\n ssrStore = store;\n}\n\nexport function useStore() {\n if (typeof window === 'undefined') {\n // SSR: используем переданный store\n if (ssrStore) {\n return ssrStore;\n }\n // Fallback для обратной совместимости\n console.warn('[WARN] SSR store not set, creating new store instance');\n return createStore();\n }\n // Client: синглтон\n if (!clientStore) {\n clientStore = createStore();\n }\n return clientStore;\n}\n\nexport default useStore();\n"],"names":["store","reactive","isReactive"],"mappings":";;;AAGO,SAAS,cAAc;AAC5B,QAAMA,SAAQC,IAAAA,SAAS;AAAA,IACrB,SAAS,CAAA;AAAA,IACT,SAAS,MAAM,SAAS;AACtB,WAAK,IAAI,IAAI;AACb,WAAK,QAAQ,KAAK,IAAI;AAAA,IACxB;AAAA,IACA,MAAM,kBAAkB;AACtB,YAAM,eAAe,CAAA;AACrB,iBAAW,CAAC,YAAY,WAAW,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC5D,YAAI,eAAe,aAAa,eAAe,cAAc,eAAe,qBAAqB,eAAe,mBAAmB;AACjI,cAAI,YAAY,OAAO;AACrB,yBAAa,UAAU,IAAI,KAAK,MAAM,KAAK,UAAU,YAAY,KAAK,CAAC;AAAA,UACzE;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,gBAAgB,cAAc,cAAc,OAAO;AACvD,YAAM,UAAU,OAAO,QAAQ,YAAY;AAE3C,iBAAW,CAAC,YAAY,WAAW,KAAK,SAAS;AAC/C,YAAI,KAAK,UAAU,KAAK,KAAK,UAAU,EAAE,OAAO;AAE9C,cAAI,aAAa;AACf,mBAAO,OAAO,KAAK,UAAU,EAAE,OAAO,WAAW;AAAA,UACnD,OAAO;AACL,0BAAc,KAAK,UAAU,EAAE,OAAO,WAAW;AAAA,UACnD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACJ,CAAG;AAED,WAAS,cAAc,QAAQ,QAAQ;AAErC,UAAM,OAAO,OAAO,KAAK,MAAM;AAC/B,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,MAAM,KAAK,CAAC;AAClB,YAAM,cAAc,OAAO,GAAG;AAE9B,UAAI,gBAAgB,QAAQ,OAAO,gBAAgB,YAAY,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC1F,YAAIC,eAAW,OAAO,GAAG,CAAC,GAAG;AAC3B,wBAAc,OAAO,GAAG,GAAG,WAAW;AAAA,QACxC,OAAO;AACL,iBAAO,GAAG,IAAI;AAAA,QAChB;AAAA,MACF,OAAO;AACL,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAOF;AACT;AAGA,IAAI,cAAc;AAGlB,IAAI,WAAW;AAER,SAAS,YAAYA,QAAO;AACjC,aAAWA;AACb;AAEO,SAAS,WAAW;AACzB,MAAI,OAAO,WAAW,aAAa;AAEjC,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,YAAQ,KAAK,uDAAuD;AACpE,WAAO,YAAW;AAAA,EACpB;AAEA,MAAI,CAAC,aAAa;AAChB,kBAAc,YAAW;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,MAAA,QAAe,SAAQ;;;;;"}
@@ -18,21 +18,16 @@ function createStore() {
18
18
  return initialState;
19
19
  },
20
20
  async setInitialState(initialState, isHydration = false) {
21
- console.time("[PERF] Store.setInitialState");
22
21
  const modules = Object.entries(initialState);
23
- console.log(`[PERF] Setting initial state for ${modules.length} modules (hydration: ${isHydration})`);
24
22
  for (const [moduleName, moduleState] of modules) {
25
23
  if (this[moduleName] && this[moduleName].state) {
26
- console.time(`[PERF] Merge state: ${moduleName}`);
27
24
  if (isHydration) {
28
25
  Object.assign(this[moduleName].state, moduleState);
29
26
  } else {
30
27
  mergeReactive(this[moduleName].state, moduleState);
31
28
  }
32
- console.timeEnd(`[PERF] Merge state: ${moduleName}`);
33
29
  }
34
30
  }
35
- console.timeEnd("[PERF] Store.setInitialState");
36
31
  }
37
32
  });
38
33
  function mergeReactive(target, source) {
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sources":["../../../../../../../src/modules/globals/views/classes/store.js"],"sourcesContent":["import { isReactive, reactive } from 'vue';\n\n// Фабрика для создания store\nexport function createStore() {\n const store = reactive({\n modules: [],\n addStore(name, storage) {\n this[name] = storage;\n this.modules.push(name);\n },\n async getInitialState() {\n const initialState = {};\n for (const [moduleName, moduleStore] of Object.entries(this)) {\n if (moduleName !== 'modules' && moduleName !== 'addStore' && moduleName !== 'getInitialState' && moduleName !== 'setInitialState') {\n if (moduleStore.state) {\n initialState[moduleName] = JSON.parse(JSON.stringify(moduleStore.state));\n }\n }\n }\n return initialState;\n },\n async setInitialState(initialState, isHydration = false) {\n console.time('[PERF] Store.setInitialState');\n const modules = Object.entries(initialState);\n console.log(`[PERF] Setting initial state for ${modules.length} modules (hydration: ${isHydration})`);\n \n for (const [moduleName, moduleState] of modules) {\n if (this[moduleName] && this[moduleName].state) {\n console.time(`[PERF] Merge state: ${moduleName}`);\n \n // При гидратации просто заменяем state целиком для скорости\n if (isHydration) {\n Object.assign(this[moduleName].state, moduleState);\n } else {\n mergeReactive(this[moduleName].state, moduleState);\n }\n \n console.timeEnd(`[PERF] Merge state: ${moduleName}`);\n }\n }\n console.timeEnd('[PERF] Store.setInitialState');\n }\n });\n\n function mergeReactive(target, source) {\n // Оптимизированная версия слияния\n const keys = Object.keys(source);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const sourceValue = source[key];\n \n if (sourceValue !== null && typeof sourceValue === 'object' && !Array.isArray(sourceValue)) {\n if (isReactive(target[key])) {\n mergeReactive(target[key], sourceValue);\n } else {\n target[key] = sourceValue;\n }\n } else {\n target[key] = sourceValue;\n }\n }\n }\n\n return store;\n}\n\n// Синглтон для клиента\nlet clientStore = null;\n\n// Store для SSR должен создаваться в createApp и передаваться сюда\nlet ssrStore = null;\n\nexport function setSSRStore(store) {\n ssrStore = store;\n}\n\nexport function useStore() {\n if (typeof window === 'undefined') {\n // SSR: используем переданный store\n if (ssrStore) {\n return ssrStore;\n }\n // Fallback для обратной совместимости\n console.warn('[WARN] SSR store not set, creating new store instance');\n return createStore();\n }\n // Client: синглтон\n if (!clientStore) {\n clientStore = createStore();\n }\n return clientStore;\n}\n\nexport default useStore();\n"],"names":["store"],"mappings":";AAGO,SAAS,cAAc;AAC5B,QAAMA,SAAQ,SAAS;AAAA,IACrB,SAAS,CAAA;AAAA,IACT,SAAS,MAAM,SAAS;AACtB,WAAK,IAAI,IAAI;AACb,WAAK,QAAQ,KAAK,IAAI;AAAA,IACxB;AAAA,IACA,MAAM,kBAAkB;AACtB,YAAM,eAAe,CAAA;AACrB,iBAAW,CAAC,YAAY,WAAW,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC5D,YAAI,eAAe,aAAa,eAAe,cAAc,eAAe,qBAAqB,eAAe,mBAAmB;AACjI,cAAI,YAAY,OAAO;AACrB,yBAAa,UAAU,IAAI,KAAK,MAAM,KAAK,UAAU,YAAY,KAAK,CAAC;AAAA,UACzE;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,gBAAgB,cAAc,cAAc,OAAO;AACvD,cAAQ,KAAK,8BAA8B;AAC3C,YAAM,UAAU,OAAO,QAAQ,YAAY;AAC3C,cAAQ,IAAI,oCAAoC,QAAQ,MAAM,wBAAwB,WAAW,GAAG;AAEpG,iBAAW,CAAC,YAAY,WAAW,KAAK,SAAS;AAC/C,YAAI,KAAK,UAAU,KAAK,KAAK,UAAU,EAAE,OAAO;AAC9C,kBAAQ,KAAK,uBAAuB,UAAU,EAAE;AAGhD,cAAI,aAAa;AACf,mBAAO,OAAO,KAAK,UAAU,EAAE,OAAO,WAAW;AAAA,UACnD,OAAO;AACL,0BAAc,KAAK,UAAU,EAAE,OAAO,WAAW;AAAA,UACnD;AAEA,kBAAQ,QAAQ,uBAAuB,UAAU,EAAE;AAAA,QACrD;AAAA,MACF;AACA,cAAQ,QAAQ,8BAA8B;AAAA,IAChD;AAAA,EACJ,CAAG;AAED,WAAS,cAAc,QAAQ,QAAQ;AAErC,UAAM,OAAO,OAAO,KAAK,MAAM;AAC/B,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,MAAM,KAAK,CAAC;AAClB,YAAM,cAAc,OAAO,GAAG;AAE9B,UAAI,gBAAgB,QAAQ,OAAO,gBAAgB,YAAY,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC1F,YAAI,WAAW,OAAO,GAAG,CAAC,GAAG;AAC3B,wBAAc,OAAO,GAAG,GAAG,WAAW;AAAA,QACxC,OAAO;AACL,iBAAO,GAAG,IAAI;AAAA,QAChB;AAAA,MACF,OAAO;AACL,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAOA;AACT;AAGA,IAAI,cAAc;AAGlB,IAAI,WAAW;AAER,SAAS,YAAYA,QAAO;AACjC,aAAWA;AACb;AAEO,SAAS,WAAW;AACzB,MAAI,OAAO,WAAW,aAAa;AAEjC,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,YAAQ,KAAK,uDAAuD;AACpE,WAAO,YAAW;AAAA,EACpB;AAEA,MAAI,CAAC,aAAa;AAChB,kBAAc,YAAW;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,MAAA,QAAe,SAAQ;"}
1
+ {"version":3,"file":"store.js","sources":["../../../../../../../src/modules/globals/views/classes/store.js"],"sourcesContent":["import { isReactive, reactive } from 'vue';\n\n// Фабрика для создания store\nexport function createStore() {\n const store = reactive({\n modules: [],\n addStore(name, storage) {\n this[name] = storage;\n this.modules.push(name);\n },\n async getInitialState() {\n const initialState = {};\n for (const [moduleName, moduleStore] of Object.entries(this)) {\n if (moduleName !== 'modules' && moduleName !== 'addStore' && moduleName !== 'getInitialState' && moduleName !== 'setInitialState') {\n if (moduleStore.state) {\n initialState[moduleName] = JSON.parse(JSON.stringify(moduleStore.state));\n }\n }\n }\n return initialState;\n },\n async setInitialState(initialState, isHydration = false) {\n const modules = Object.entries(initialState);\n \n for (const [moduleName, moduleState] of modules) {\n if (this[moduleName] && this[moduleName].state) {\n // При гидратации просто заменяем state целиком для скорости\n if (isHydration) {\n Object.assign(this[moduleName].state, moduleState);\n } else {\n mergeReactive(this[moduleName].state, moduleState);\n }\n }\n }\n }\n });\n\n function mergeReactive(target, source) {\n // Оптимизированная версия слияния\n const keys = Object.keys(source);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const sourceValue = source[key];\n \n if (sourceValue !== null && typeof sourceValue === 'object' && !Array.isArray(sourceValue)) {\n if (isReactive(target[key])) {\n mergeReactive(target[key], sourceValue);\n } else {\n target[key] = sourceValue;\n }\n } else {\n target[key] = sourceValue;\n }\n }\n }\n\n return store;\n}\n\n// Синглтон для клиента\nlet clientStore = null;\n\n// Store для SSR должен создаваться в createApp и передаваться сюда\nlet ssrStore = null;\n\nexport function setSSRStore(store) {\n ssrStore = store;\n}\n\nexport function useStore() {\n if (typeof window === 'undefined') {\n // SSR: используем переданный store\n if (ssrStore) {\n return ssrStore;\n }\n // Fallback для обратной совместимости\n console.warn('[WARN] SSR store not set, creating new store instance');\n return createStore();\n }\n // Client: синглтон\n if (!clientStore) {\n clientStore = createStore();\n }\n return clientStore;\n}\n\nexport default useStore();\n"],"names":["store"],"mappings":";AAGO,SAAS,cAAc;AAC5B,QAAMA,SAAQ,SAAS;AAAA,IACrB,SAAS,CAAA;AAAA,IACT,SAAS,MAAM,SAAS;AACtB,WAAK,IAAI,IAAI;AACb,WAAK,QAAQ,KAAK,IAAI;AAAA,IACxB;AAAA,IACA,MAAM,kBAAkB;AACtB,YAAM,eAAe,CAAA;AACrB,iBAAW,CAAC,YAAY,WAAW,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC5D,YAAI,eAAe,aAAa,eAAe,cAAc,eAAe,qBAAqB,eAAe,mBAAmB;AACjI,cAAI,YAAY,OAAO;AACrB,yBAAa,UAAU,IAAI,KAAK,MAAM,KAAK,UAAU,YAAY,KAAK,CAAC;AAAA,UACzE;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,gBAAgB,cAAc,cAAc,OAAO;AACvD,YAAM,UAAU,OAAO,QAAQ,YAAY;AAE3C,iBAAW,CAAC,YAAY,WAAW,KAAK,SAAS;AAC/C,YAAI,KAAK,UAAU,KAAK,KAAK,UAAU,EAAE,OAAO;AAE9C,cAAI,aAAa;AACf,mBAAO,OAAO,KAAK,UAAU,EAAE,OAAO,WAAW;AAAA,UACnD,OAAO;AACL,0BAAc,KAAK,UAAU,EAAE,OAAO,WAAW;AAAA,UACnD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACJ,CAAG;AAED,WAAS,cAAc,QAAQ,QAAQ;AAErC,UAAM,OAAO,OAAO,KAAK,MAAM;AAC/B,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,MAAM,KAAK,CAAC;AAClB,YAAM,cAAc,OAAO,GAAG;AAE9B,UAAI,gBAAgB,QAAQ,OAAO,gBAAgB,YAAY,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC1F,YAAI,WAAW,OAAO,GAAG,CAAC,GAAG;AAC3B,wBAAc,OAAO,GAAG,GAAG,WAAW;AAAA,QACxC,OAAO;AACL,iBAAO,GAAG,IAAI;AAAA,QAChB;AAAA,MACF,OAAO;AACL,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAOA;AACT;AAGA,IAAI,cAAc;AAGlB,IAAI,WAAW;AAER,SAAS,YAAYA,QAAO;AACjC,aAAWA;AACb;AAEO,SAAS,WAAW;AACzB,MAAI,OAAO,WAAW,aAAa;AAEjC,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,YAAQ,KAAK,uDAAuD;AACpE,WAAO,YAAW;AAAA,EACpB;AAEA,MAAI,CAAC,aAAa;AAChB,kBAAc,YAAW;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,MAAA,QAAe,SAAQ;"}
@@ -3,12 +3,12 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
3
3
  const vue = require("vue");
4
4
  const vueRouter = require("vue-router");
5
5
  const Tooltip = require("../../../../../components/Tooltip/Tooltip.vue2.cjs");
6
- const Dropdown = require("../../../../../components/Dropdown/Dropdown.vue.cjs");
6
+ const Dropdown = require("../../../../../components/Dropdown/Dropdown.vue2.cjs");
7
7
  const PlaceholderUserpic = require("../../../../icons/placeholders/PlaceholderUserpic.vue.cjs");
8
8
  const PlaceholderOrganizationPic = require("../../../../icons/placeholders/PlaceholderOrganizationPic.vue.cjs");
9
9
  const IconEllipsis = require("../../../../icons/navigation/IconEllipsis.vue.cjs");
10
10
  const FormReport = require("../../../../reports/components/sections/FormReport.vue.cjs");
11
- ;/* empty css */
11
+ ;/* empty css */
12
12
  ;/* empty css */
13
13
  const PhotoStack = require("../elements/PhotoStack.vue.cjs");
14
14
  const _hoisted_1 = {
@@ -1,12 +1,12 @@
1
1
  import { resolveComponent, createElementBlock, createCommentVNode, openBlock, createElementVNode, createBlock, withModifiers, resolveDynamicComponent, toDisplayString, withCtx, createTextVNode, Fragment, renderList, normalizeClass } from "vue";
2
2
  import { useRouter } from "vue-router";
3
3
  import _sfc_main$1 from "../../../../../components/Tooltip/Tooltip.vue2.js";
4
- import _sfc_main$3 from "../../../../../components/Dropdown/Dropdown.vue.js";
4
+ import _sfc_main$3 from "../../../../../components/Dropdown/Dropdown.vue2.js";
5
5
  import PlaceholderUserpic from "../../../../icons/placeholders/PlaceholderUserpic.vue.js";
6
6
  import PlaceholderOrganizationPic from "../../../../icons/placeholders/PlaceholderOrganizationPic.vue.js";
7
7
  import _sfc_main$4 from "../../../../icons/navigation/IconEllipsis.vue.js";
8
8
  import _sfc_main$5 from "../../../../reports/components/sections/FormReport.vue.js";
9
- /* empty css */
9
+ /* empty css */
10
10
  /* empty css */
11
11
  import _sfc_main$2 from "../elements/PhotoStack.vue.js";
12
12
  const _hoisted_1 = {
@@ -3,7 +3,7 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
3
3
  const vue = require("vue");
4
4
  const vueI18n = require("vue-i18n");
5
5
  const Popup = require("../../../../../components/Popup/Popup.vue.cjs");
6
- const Loader = require("../../../../../components/Loader/Loader.vue.cjs");
6
+ const Loader = require("../../../../../components/Loader/Loader.vue2.cjs");
7
7
  const Calendar = require("../../../../../components/Calendar/Calendar.vue2.cjs");
8
8
  const Button = require("../../../../../components/Button/Button.vue.cjs");
9
9
  const IconShopcartAdd = require("../../../../icons/actions/IconShopcartAdd.vue.cjs");
@@ -1,7 +1,7 @@
1
1
  import { ref, computed, watch, onMounted, createBlock, openBlock, withCtx, createElementVNode, createVNode, createElementBlock, createCommentVNode, toDisplayString, unref } from "vue";
2
2
  import { useI18n } from "vue-i18n";
3
3
  import _sfc_main$1 from "../../../../../components/Popup/Popup.vue.js";
4
- import Loader from "../../../../../components/Loader/Loader.vue.js";
4
+ import Loader from "../../../../../components/Loader/Loader.vue2.js";
5
5
  import Calendar from "../../../../../components/Calendar/Calendar.vue2.js";
6
6
  import _sfc_main$3 from "../../../../../components/Button/Button.vue.js";
7
7
  import _sfc_main$4 from "../../../../icons/actions/IconShopcartAdd.vue.js";
@@ -8,7 +8,7 @@ const Snack = require("../../../../../components/Status/Snack.vue.cjs");
8
8
  const Popup = require("../../../../../components/Popup/Popup.vue.cjs");
9
9
  require("vue-i18n");
10
10
  ;/* empty css */
11
- const Loader = require("../../../../../components/Loader/Loader.vue.cjs");
11
+ const Loader = require("../../../../../components/Loader/Loader.vue2.cjs");
12
12
  ;/* empty css */
13
13
  ;/* empty css */
14
14
  const LocationSelection = require("../partials/LocationSelection.vue.cjs");
@@ -6,7 +6,7 @@ import _sfc_main$5 from "../../../../../components/Status/Snack.vue.js";
6
6
  import _sfc_main$1 from "../../../../../components/Popup/Popup.vue.js";
7
7
  import "vue-i18n";
8
8
  /* empty css */
9
- import Loader from "../../../../../components/Loader/Loader.vue.js";
9
+ import Loader from "../../../../../components/Loader/Loader.vue2.js";
10
10
  /* empty css */
11
11
  /* empty css */
12
12
  import _sfc_main$2 from "../partials/LocationSelection.vue.js";
@@ -5,7 +5,7 @@ const vueRouter = require("vue-router");
5
5
  const IconChevronBottom = require("../../../../icons/navigation/IconChevronBottom.vue.cjs");
6
6
  const globals = require("../../store/globals.cjs");
7
7
  const auth = require("../../../../auth/views/store/auth.cjs");
8
- ;/* empty css */
8
+ ;/* empty css */
9
9
  ;/* empty css */
10
10
  ;/* empty css */
11
11
  const _pluginVue_exportHelper = require("../../../../../../../_virtual/_plugin-vue_export-helper.cjs");
@@ -3,7 +3,7 @@ import { useRouter, useRoute } from "vue-router";
3
3
  import IconChevronBottom from "../../../../icons/navigation/IconChevronBottom.vue.js";
4
4
  import { state } from "../../store/globals.js";
5
5
  import { state as state$1 } from "../../../../auth/views/store/auth.js";
6
- /* empty css */
6
+ /* empty css */
7
7
  /* empty css */
8
8
  /* empty css */
9
9
  import _export_sfc from "../../../../../../../_virtual/_plugin-vue_export-helper.js";
@@ -8,7 +8,7 @@ const Field = require("../../../../../components/Field/Field.vue.cjs");
8
8
  const Calendar = require("../../../../../components/Calendar/Calendar.vue2.cjs");
9
9
  const IconFilter = require("../../../../icons/navigation/IconFilter.vue.cjs");
10
10
  const IconCalendar = ;/* empty css */
11
- ;/* empty css */
11
+ ;/* empty css */
12
12
  const _pluginVue_exportHelper = require("../../../../../../../_virtual/_plugin-vue_export-helper.cjs");
13
13
  const _hoisted_1 = { class: "flex t-nowrap gap-thin" };
14
14
  const _hoisted_2 = { key: 0 };
@@ -382,4 +382,4 @@ const _sfc_main = {
382
382
  };
383
383
  const Filters = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-c337ccbe"]]);
384
384
  exports.default = Filters;
385
- //# sourceMappingURL=Filters.vue.cjs.map
385
+ //# sourceMappingURL=Filters.vue2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Filters.vue2.cjs","sources":["../../../../../../../../src/modules/globals/views/components/sections/Filters.vue"],"sourcesContent":["<template>\n <div class=\"flex t-nowrap gap-thin\">\n <!-- All Filters Button -->\n <button\n @click=\"showAllFilters = true\"\n class=\"pd-small radius-medium bg-light flex-v-center flex gap-micro cursor-pointer\"\n :class=\"{ 'bg-main': activeFiltersCount > 0 }\"\n >\n <IconFilter class=\"i-medium\" />\n <span class=\"h-1r\"></span>\n <span v-if=\"activeFiltersCount\">{{ activeFiltersCount }}</span>\n </button>\n\n <!-- Individual Filter Buttons -->\n <button\n v-for=\"filter in filters\"\n :key=\"filter.value\"\n @click=\"openFilter(filter.value)\"\n class=\"pd-small radius-medium bg-light cursor-pointer flex-v-center flex gap-micro\"\n :class=\"{ 'selected bg-main': isFilterActive(filter) }\"\n >\n <IconCalendar v-if=\"filter.type === 'date'\" class=\"mn-r-micro i-medium\" />\n <span class=\"t-nowrap\">{{ filter.type === 'date' && getFilterValue(filter) ? formatFilterValue(filter) : filter.title }}</span>\n <span v-if=\"getFilterValue(filter) && filter.type !== 'date'\" class=\"mn-l-micro\">\n {{ formatFilterValue(filter) }}\n </span>\n </button>\n\n <!-- All Filters Popup -->\n <Popup\n :isPopupOpen=\"showAllFilters\"\n @close-popup=\"showAllFilters = false\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"w-min-20r bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <div class=\"flex-v-center flex-nowrap flex mn-b-medium\">\n <h3 class=\"flex-child-full\">Filters</h3>\n </div>\n\n <div class=\"filters-content\">\n <div \n v-for=\"filter in filters\" \n :key=\"filter.value\"\n class=\"mn-b-medium\"\n >\n <h4 class=\"mn-b-small\">{{ filter.title }}</h4>\n \n <!-- Checkbox Filter -->\n <div v-if=\"filter.type === 'checkbox'\">\n <Checkbox\n v-for=\"option in filter.options\"\n :key=\"option.value\"\n :label=\"option.label\"\n :value=\"option.value\"\n v-model:radio=\"tempSelected[filter.value]\"\n mode=\"checkbox\"\n class=\"mn-b-micro\"\n />\n </div>\n\n <!-- Radio Filter -->\n <div v-else-if=\"filter.type === 'radio'\">\n <div\n v-for=\"option in filter.options\"\n :key=\"option.value\"\n @click=\"tempSelected[filter.value] = option.value\"\n class=\"pd-small radius-small cursor-pointer mn-b-micro\"\n :class=\"{ \n 'bg-main': tempSelected[filter.value] === option.value,\n 'bg-light': tempSelected[filter.value] !== option.value\n }\"\n >\n {{ option.label }}\n </div>\n </div>\n\n <!-- Range Filter -->\n <div v-else-if=\"filter.type === 'range'\" class=\"flex gap-thin\">\n <Field\n v-model:field=\"tempSelected[filter.value].min\"\n :placeholder=\"filter.minPlaceholder || 'Min'\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n <Field\n v-model:field=\"tempSelected[filter.value].max\"\n :placeholder=\"filter.maxPlaceholder || 'Max'\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n </div>\n\n <!-- Date Filter -->\n <div v-else-if=\"filter.type === 'date'\">\n <Calendar\n v-model:date=\"tempSelected[filter.value]\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"bg-light radius-small\"\n />\n </div>\n </div>\n </div>\n\n <div class=\"flex gap-thin mn-t-medium\">\n <button \n @click=\"applyAllFilters\" \n class=\"button bg-main flex-child-full\"\n >\n Apply\n </button>\n <button \n @click=\"resetFilters\" \n class=\"button bg-light\"\n >\n Reset Filters\n </button>\n </div>\n </Popup>\n\n <!-- Individual Filter Popups -->\n <Popup\n v-for=\"filter in filters\"\n :key=\"`popup-${filter.value}`\"\n :isPopupOpen=\"individualPopups[filter.value]\"\n @close-popup=\"individualPopups[filter.value] = false\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <h4 class=\"mn-b-medium\">{{ filter.title }}</h4>\n \n <!-- Checkbox Filter -->\n <div v-if=\"filter.type === 'checkbox'\">\n <Checkbox\n v-for=\"option in filter.options\"\n :key=\"option.value\"\n :label=\"option.label\"\n :value=\"option.value\"\n v-model:radio=\"tempSelected[filter.value]\"\n mode=\"checkbox\"\n class=\"mn-b-micro\"\n />\n </div>\n\n <!-- Radio Filter -->\n <div v-else-if=\"filter.type === 'radio'\">\n <div\n v-for=\"option in filter.options\"\n :key=\"option.value\"\n @click=\"tempSelected[filter.value] = option.value\"\n class=\"pd-small radius-small cursor-pointer mn-b-micro\"\n :class=\"{ \n 'bg-main': tempSelected[filter.value] === option.value,\n 'bg-light': tempSelected[filter.value] !== option.value\n }\"\n >\n {{ option.label }}\n </div>\n </div>\n\n <!-- Range Filter -->\n <div v-else-if=\"filter.type === 'range'\" class=\"flex gap-thin\">\n <Field\n v-model:field=\"tempSelected[filter.value].min\"\n :placeholder=\"filter.minPlaceholder || 'Min'\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n <Field\n v-model:field=\"tempSelected[filter.value].max\"\n :placeholder=\"filter.maxPlaceholder || 'Max'\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n </div>\n\n <!-- Date Filter -->\n <div v-else-if=\"filter.type === 'date'\">\n <div class=\"mn-t-small\">\n <Calendar\n v-model:date=\"tempSelected[filter.value]\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"bg-light radius-small\"\n />\n </div>\n </div>\n\n <div class=\"flex gap-thin mn-t-medium\">\n <button \n @click=\"cancelFilter(filter.value)\" \n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n <button \n @click=\"applyFilter(filter.value)\" \n class=\"bg-main w-100 button flex-child-full\"\n >\n Apply\n </button>\n \n \n </div>\n </Popup>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, reactive, watch } from 'vue'\nimport { useGlobalMixins } from '@martyrs/src/modules/globals/views/mixins/mixins.js'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Checkbox from '@martyrs/src/components/Checkbox/Checkbox.vue'\nimport Field from '@martyrs/src/components/Field/Field.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue'\nimport IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\nconst filters = defineModel('filters', {\n type: Array,\n required: true\n})\n\nconst selected = defineModel('selected', {\n type: Object,\n default: () => ({})\n})\n\nconst emit = defineEmits(['select'])\n\nconst { formatDate } = useGlobalMixins()\n\n// State\nconst showAllFilters = ref(false)\nconst individualPopups = reactive({})\nconst tempSelected = reactive({})\nconst tempDateRange = ref(null)\n\n// Initialize popups and temp values\nwatch(filters, (newFilters) => {\n newFilters.forEach(filter => {\n individualPopups[filter.value] = false\n \n if (!tempSelected[filter.value]) {\n if (filter.type === 'checkbox') {\n tempSelected[filter.value] = [...(selected.value[filter.value] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filter.value] = { ...(selected.value[filter.value] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filter.value] = selected.value[filter.value] || null\n } else {\n tempSelected[filter.value] = selected.value[filter.value] || null\n }\n }\n })\n}, { immediate: true, deep: true })\n\n// Sync selected to tempSelected\nwatch(selected, (newSelected) => {\n Object.keys(newSelected).forEach(key => {\n const filter = filters.value.find(f => f.value === key)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[key] = [...(newSelected[key] || [])]\n } else if (filter.type === 'range') {\n tempSelected[key] = { ...(newSelected[key] || { min: '', max: '' }) }\n } else {\n tempSelected[key] = newSelected[key]\n }\n }\n })\n}, { deep: true })\n\n// Computed\nconst activeFiltersCount = computed(() => {\n return Object.entries(selected.value).filter(([key, value]) => {\n if (Array.isArray(value)) return value.length > 0\n if (typeof value === 'object' && value !== null) {\n return value.min || value.max\n }\n return value !== null && value !== undefined\n }).length\n})\n\n// Methods\nconst openFilter = (filterValue) => {\n individualPopups[filterValue] = true\n}\n\nconst isFilterActive = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n if (Array.isArray(value)) return value.length > 0\n if (filter.type === 'range') return value.min || value.max\n return true\n}\n\nconst getFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n \n if (filter.type === 'range') {\n return value.min || value.max\n }\n \n if (filter.type === 'date') {\n return value && value.start && value.end\n }\n \n if (Array.isArray(value)) {\n return value.length > 0\n }\n \n return value\n}\n\nconst formatFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return ''\n \n if (Array.isArray(value)) {\n return `(${value.length})`\n }\n \n if (filter.type === 'range') {\n if (!value.min && !value.max) return ''\n return `${value.min || '0'}-${value.max || '∞'}`\n }\n \n if (filter.type === 'date') {\n if (!value || !value.start || !value.end) return ''\n return `${formatDate(value.start, { dayMonth: true, language: 'en' })} - ${formatDate(value.end, { dayMonth: true, language: 'en' })}`\n }\n \n if (filter.type === 'radio') {\n const option = filter.options.find(o => o.value === value)\n return option ? `(${option.label})` : ''\n }\n \n return ''\n}\n\nconst applyFilter = (filterValue) => {\n selected.value[filterValue] = tempSelected[filterValue]\n individualPopups[filterValue] = false\n emit('select', { filter: filterValue, value: tempSelected[filterValue] })\n}\n\nconst cancelFilter = (filterValue) => {\n const filter = filters.value.find(f => f.value === filterValue)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[filterValue] = [...(selected.value[filterValue] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filterValue] = { ...(selected.value[filterValue] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filterValue] = selected.value[filterValue] || null\n } else {\n tempSelected[filterValue] = selected.value[filterValue] || null\n }\n }\n individualPopups[filterValue] = false\n}\n\nconst applyAllFilters = () => {\n Object.entries(tempSelected).forEach(([key, value]) => {\n if (selected.value[key] !== value) {\n selected.value[key] = value\n emit('select', { filter: key, value })\n }\n })\n showAllFilters.value = false\n}\n\nconst resetFilters = () => {\n filters.value.forEach(filter => {\n if (filter.type === 'checkbox') {\n tempSelected[filter.value] = []\n selected.value[filter.value] = []\n } else if (filter.type === 'range') {\n tempSelected[filter.value] = { min: '', max: '' }\n selected.value[filter.value] = { min: '', max: '' }\n } else if (filter.type === 'date') {\n tempSelected[filter.value] = null\n selected.value[filter.value] = null\n } else {\n tempSelected[filter.value] = null\n selected.value[filter.value] = null\n }\n emit('select', { filter: filter.value, value: null })\n })\n}\n</script>\n\n<style scoped>\n.filters-content {\n max-height: 60vh;\n overflow-y: auto;\n}\n</style>"],"names":["_useModel","useGlobalMixins","ref","reactive","watch","computed"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+NA,UAAM,UAAUA,IAAAA,SAAW,SAAC,SAG3B;AAED,UAAM,WAAWA,IAAAA,SAAW,SAAC,UAG5B;AAED,UAAM,OAAO;AAEb,UAAM,EAAE,WAAU,IAAKC,OAAAA,gBAAe;AAGtC,UAAM,iBAAiBC,IAAAA,IAAI,KAAK;AAChC,UAAM,mBAAmBC,IAAAA,SAAS,CAAA,CAAE;AACpC,UAAM,eAAeA,IAAAA,SAAS,CAAA,CAAE;AACVD,QAAAA,IAAI,IAAI;AAG9BE,QAAAA,MAAM,SAAS,CAAC,eAAe;AAC7B,iBAAW,QAAQ,YAAU;AAC3B,yBAAiB,OAAO,KAAK,IAAI;AAEjC,YAAI,CAAC,aAAa,OAAO,KAAK,GAAG;AAC/B,cAAI,OAAO,SAAS,YAAY;AAC9B,yBAAa,OAAO,KAAK,IAAI,CAAC,GAAI,SAAS,MAAM,OAAO,KAAK,KAAK,EAAG;AAAA,UACvE,WAAW,OAAO,SAAS,SAAS;AAClC,yBAAa,OAAO,KAAK,IAAI,EAAE,GAAI,SAAS,MAAM,OAAO,KAAK,KAAK,EAAE,KAAK,IAAI,KAAK,GAAE,EAAG;AAAA,UAC1F,WAAW,OAAO,SAAS,QAAQ;AACjC,yBAAa,OAAO,KAAK,IAAI,SAAS,MAAM,OAAO,KAAK,KAAK;AAAA,UAC/D,OAAO;AACL,yBAAa,OAAO,KAAK,IAAI,SAAS,MAAM,OAAO,KAAK,KAAK;AAAA,UAC/D;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,GAAG,EAAE,WAAW,MAAM,MAAM,KAAI,CAAE;AAGlCA,QAAAA,MAAM,UAAU,CAAC,gBAAgB;AAC/B,aAAO,KAAK,WAAW,EAAE,QAAQ,SAAO;AACtC,cAAM,SAAS,QAAQ,MAAM,KAAK,OAAK,EAAE,UAAU,GAAG;AACtD,YAAI,QAAQ;AACV,cAAI,OAAO,SAAS,YAAY;AAC9B,yBAAa,GAAG,IAAI,CAAC,GAAI,YAAY,GAAG,KAAK,EAAG;AAAA,UAClD,WAAW,OAAO,SAAS,SAAS;AAClC,yBAAa,GAAG,IAAI,EAAE,GAAI,YAAY,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,GAAE,EAAG;AAAA,UACrE,OAAO;AACL,yBAAa,GAAG,IAAI,YAAY,GAAG;AAAA,UACrC;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,GAAG,EAAE,MAAM,KAAI,CAAE;AAGjB,UAAM,qBAAqBC,IAAAA,SAAS,MAAM;AACxC,aAAO,OAAO,QAAQ,SAAS,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,MAAM;AAC7D,YAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,SAAS;AAChD,YAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,iBAAO,MAAM,OAAO,MAAM;AAAA,QAC5B;AACA,eAAO,UAAU,QAAQ,UAAU;AAAA,MACrC,CAAC,EAAE;AAAA,IACL,CAAC;AAGD,UAAM,aAAa,CAAC,gBAAgB;AAClC,uBAAiB,WAAW,IAAI;AAAA,IAClC;AAEA,UAAM,iBAAiB,CAAC,WAAW;AACjC,YAAM,QAAQ,SAAS,MAAM,OAAO,KAAK;AACzC,UAAI,CAAC,MAAO,QAAO;AACnB,UAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,SAAS;AAChD,UAAI,OAAO,SAAS,QAAS,QAAO,MAAM,OAAO,MAAM;AACvD,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,CAAC,WAAW;AACjC,YAAM,QAAQ,SAAS,MAAM,OAAO,KAAK;AACzC,UAAI,CAAC,MAAO,QAAO;AAEnB,UAAI,OAAO,SAAS,SAAS;AAC3B,eAAO,MAAM,OAAO,MAAM;AAAA,MAC5B;AAEA,UAAI,OAAO,SAAS,QAAQ;AAC1B,eAAO,SAAS,MAAM,SAAS,MAAM;AAAA,MACvC;AAEA,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAO,MAAM,SAAS;AAAA,MACxB;AAEA,aAAO;AAAA,IACT;AAEA,UAAM,oBAAoB,CAAC,WAAW;AACpC,YAAM,QAAQ,SAAS,MAAM,OAAO,KAAK;AACzC,UAAI,CAAC,MAAO,QAAO;AAEnB,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAO,IAAI,MAAM,MAAM;AAAA,MACzB;AAEA,UAAI,OAAO,SAAS,SAAS;AAC3B,YAAI,CAAC,MAAM,OAAO,CAAC,MAAM,IAAK,QAAO;AACrC,eAAO,GAAG,MAAM,OAAO,GAAG,IAAI,MAAM,OAAO,GAAG;AAAA,MAChD;AAEA,UAAI,OAAO,SAAS,QAAQ;AAC1B,YAAI,CAAC,SAAS,CAAC,MAAM,SAAS,CAAC,MAAM,IAAK,QAAO;AACjD,eAAO,GAAG,WAAW,MAAM,OAAO,EAAE,UAAU,MAAM,UAAU,KAAI,CAAE,CAAC,MAAM,WAAW,MAAM,KAAK,EAAE,UAAU,MAAM,UAAU,KAAI,CAAE,CAAC;AAAA,MACtI;AAEA,UAAI,OAAO,SAAS,SAAS;AAC3B,cAAM,SAAS,OAAO,QAAQ,KAAK,OAAK,EAAE,UAAU,KAAK;AACzD,eAAO,SAAS,IAAI,OAAO,KAAK,MAAM;AAAA,MACxC;AAEA,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,CAAC,gBAAgB;AACnC,eAAS,MAAM,WAAW,IAAI,aAAa,WAAW;AACtD,uBAAiB,WAAW,IAAI;AAChC,WAAK,UAAU,EAAE,QAAQ,aAAa,OAAO,aAAa,WAAW,EAAC,CAAE;AAAA,IAC1E;AAEA,UAAM,eAAe,CAAC,gBAAgB;AACpC,YAAM,SAAS,QAAQ,MAAM,KAAK,OAAK,EAAE,UAAU,WAAW;AAC9D,UAAI,QAAQ;AACV,YAAI,OAAO,SAAS,YAAY;AAC9B,uBAAa,WAAW,IAAI,CAAC,GAAI,SAAS,MAAM,WAAW,KAAK,EAAG;AAAA,QACrE,WAAW,OAAO,SAAS,SAAS;AAClC,uBAAa,WAAW,IAAI,EAAE,GAAI,SAAS,MAAM,WAAW,KAAK,EAAE,KAAK,IAAI,KAAK,GAAE,EAAG;AAAA,QACxF,WAAW,OAAO,SAAS,QAAQ;AACjC,uBAAa,WAAW,IAAI,SAAS,MAAM,WAAW,KAAK;AAAA,QAC7D,OAAO;AACL,uBAAa,WAAW,IAAI,SAAS,MAAM,WAAW,KAAK;AAAA,QAC7D;AAAA,MACF;AACA,uBAAiB,WAAW,IAAI;AAAA,IAClC;AAEA,UAAM,kBAAkB,MAAM;AAC5B,aAAO,QAAQ,YAAY,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACrD,YAAI,SAAS,MAAM,GAAG,MAAM,OAAO;AACjC,mBAAS,MAAM,GAAG,IAAI;AACtB,eAAK,UAAU,EAAE,QAAQ,KAAK,MAAK,CAAE;AAAA,QACvC;AAAA,MACF,CAAC;AACD,qBAAe,QAAQ;AAAA,IACzB;AAEA,UAAM,eAAe,MAAM;AACzB,cAAQ,MAAM,QAAQ,YAAU;AAC9B,YAAI,OAAO,SAAS,YAAY;AAC9B,uBAAa,OAAO,KAAK,IAAI,CAAA;AAC7B,mBAAS,MAAM,OAAO,KAAK,IAAI,CAAA;AAAA,QACjC,WAAW,OAAO,SAAS,SAAS;AAClC,uBAAa,OAAO,KAAK,IAAI,EAAE,KAAK,IAAI,KAAK,GAAE;AAC/C,mBAAS,MAAM,OAAO,KAAK,IAAI,EAAE,KAAK,IAAI,KAAK,GAAE;AAAA,QACnD,WAAW,OAAO,SAAS,QAAQ;AACjC,uBAAa,OAAO,KAAK,IAAI;AAC7B,mBAAS,MAAM,OAAO,KAAK,IAAI;AAAA,QACjC,OAAO;AACL,uBAAa,OAAO,KAAK,IAAI;AAC7B,mBAAS,MAAM,OAAO,KAAK,IAAI;AAAA,QACjC;AACA,aAAK,UAAU,EAAE,QAAQ,OAAO,OAAO,OAAO,KAAI,CAAE;AAAA,MACtD,CAAC;AAAA,IACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -6,7 +6,7 @@ import Field from "../../../../../components/Field/Field.vue.js";
6
6
  import Calendar from "../../../../../components/Calendar/Calendar.vue2.js";
7
7
  import _sfc_main$1 from "../../../../icons/navigation/IconFilter.vue.js";
8
8
  import _sfc_main$2 from "../../../../icons/entities/IconCalendar.vue.js";
9
- /* empty css */
9
+ /* empty css */
10
10
  import _export_sfc from "../../../../../../../_virtual/_plugin-vue_export-helper.js";
11
11
  const _hoisted_1 = { class: "flex t-nowrap gap-thin" };
12
12
  const _hoisted_2 = { key: 0 };
@@ -382,4 +382,4 @@ const Filters = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-c3
382
382
  export {
383
383
  Filters as default
384
384
  };
385
- //# sourceMappingURL=Filters.vue.js.map
385
+ //# sourceMappingURL=Filters.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Filters.vue.cjs","sources":["../../../../../../../../src/modules/globals/views/components/sections/Filters.vue"],"sourcesContent":["<template>\n <div class=\"flex t-nowrap gap-thin\">\n <!-- All Filters Button -->\n <button\n @click=\"showAllFilters = true\"\n class=\"pd-small radius-medium bg-light flex-v-center flex gap-micro cursor-pointer\"\n :class=\"{ 'bg-main': activeFiltersCount > 0 }\"\n >\n <IconFilter class=\"i-medium\" />\n <span class=\"h-1r\"></span>\n <span v-if=\"activeFiltersCount\">{{ activeFiltersCount }}</span>\n </button>\n\n <!-- Individual Filter Buttons -->\n <button\n v-for=\"filter in filters\"\n :key=\"filter.value\"\n @click=\"openFilter(filter.value)\"\n class=\"pd-small radius-medium bg-light cursor-pointer flex-v-center flex gap-micro\"\n :class=\"{ 'selected bg-main': isFilterActive(filter) }\"\n >\n <IconCalendar v-if=\"filter.type === 'date'\" class=\"mn-r-micro i-medium\" />\n <span class=\"t-nowrap\">{{ filter.type === 'date' && getFilterValue(filter) ? formatFilterValue(filter) : filter.title }}</span>\n <span v-if=\"getFilterValue(filter) && filter.type !== 'date'\" class=\"mn-l-micro\">\n {{ formatFilterValue(filter) }}\n </span>\n </button>\n\n <!-- All Filters Popup -->\n <Popup\n :isPopupOpen=\"showAllFilters\"\n @close-popup=\"showAllFilters = false\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"w-min-20r bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <div class=\"flex-v-center flex-nowrap flex mn-b-medium\">\n <h3 class=\"flex-child-full\">Filters</h3>\n </div>\n\n <div class=\"filters-content\">\n <div \n v-for=\"filter in filters\" \n :key=\"filter.value\"\n class=\"mn-b-medium\"\n >\n <h4 class=\"mn-b-small\">{{ filter.title }}</h4>\n \n <!-- Checkbox Filter -->\n <div v-if=\"filter.type === 'checkbox'\">\n <Checkbox\n v-for=\"option in filter.options\"\n :key=\"option.value\"\n :label=\"option.label\"\n :value=\"option.value\"\n v-model:radio=\"tempSelected[filter.value]\"\n mode=\"checkbox\"\n class=\"mn-b-micro\"\n />\n </div>\n\n <!-- Radio Filter -->\n <div v-else-if=\"filter.type === 'radio'\">\n <div\n v-for=\"option in filter.options\"\n :key=\"option.value\"\n @click=\"tempSelected[filter.value] = option.value\"\n class=\"pd-small radius-small cursor-pointer mn-b-micro\"\n :class=\"{ \n 'bg-main': tempSelected[filter.value] === option.value,\n 'bg-light': tempSelected[filter.value] !== option.value\n }\"\n >\n {{ option.label }}\n </div>\n </div>\n\n <!-- Range Filter -->\n <div v-else-if=\"filter.type === 'range'\" class=\"flex gap-thin\">\n <Field\n v-model:field=\"tempSelected[filter.value].min\"\n :placeholder=\"filter.minPlaceholder || 'Min'\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n <Field\n v-model:field=\"tempSelected[filter.value].max\"\n :placeholder=\"filter.maxPlaceholder || 'Max'\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n </div>\n\n <!-- Date Filter -->\n <div v-else-if=\"filter.type === 'date'\">\n <Calendar\n v-model:date=\"tempSelected[filter.value]\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"bg-light radius-small\"\n />\n </div>\n </div>\n </div>\n\n <div class=\"flex gap-thin mn-t-medium\">\n <button \n @click=\"applyAllFilters\" \n class=\"button bg-main flex-child-full\"\n >\n Apply\n </button>\n <button \n @click=\"resetFilters\" \n class=\"button bg-light\"\n >\n Reset Filters\n </button>\n </div>\n </Popup>\n\n <!-- Individual Filter Popups -->\n <Popup\n v-for=\"filter in filters\"\n :key=\"`popup-${filter.value}`\"\n :isPopupOpen=\"individualPopups[filter.value]\"\n @close-popup=\"individualPopups[filter.value] = false\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <h4 class=\"mn-b-medium\">{{ filter.title }}</h4>\n \n <!-- Checkbox Filter -->\n <div v-if=\"filter.type === 'checkbox'\">\n <Checkbox\n v-for=\"option in filter.options\"\n :key=\"option.value\"\n :label=\"option.label\"\n :value=\"option.value\"\n v-model:radio=\"tempSelected[filter.value]\"\n mode=\"checkbox\"\n class=\"mn-b-micro\"\n />\n </div>\n\n <!-- Radio Filter -->\n <div v-else-if=\"filter.type === 'radio'\">\n <div\n v-for=\"option in filter.options\"\n :key=\"option.value\"\n @click=\"tempSelected[filter.value] = option.value\"\n class=\"pd-small radius-small cursor-pointer mn-b-micro\"\n :class=\"{ \n 'bg-main': tempSelected[filter.value] === option.value,\n 'bg-light': tempSelected[filter.value] !== option.value\n }\"\n >\n {{ option.label }}\n </div>\n </div>\n\n <!-- Range Filter -->\n <div v-else-if=\"filter.type === 'range'\" class=\"flex gap-thin\">\n <Field\n v-model:field=\"tempSelected[filter.value].min\"\n :placeholder=\"filter.minPlaceholder || 'Min'\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n <Field\n v-model:field=\"tempSelected[filter.value].max\"\n :placeholder=\"filter.maxPlaceholder || 'Max'\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n </div>\n\n <!-- Date Filter -->\n <div v-else-if=\"filter.type === 'date'\">\n <div class=\"mn-t-small\">\n <Calendar\n v-model:date=\"tempSelected[filter.value]\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"bg-light radius-small\"\n />\n </div>\n </div>\n\n <div class=\"flex gap-thin mn-t-medium\">\n <button \n @click=\"cancelFilter(filter.value)\" \n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n <button \n @click=\"applyFilter(filter.value)\" \n class=\"bg-main w-100 button flex-child-full\"\n >\n Apply\n </button>\n \n \n </div>\n </Popup>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, reactive, watch } from 'vue'\nimport { useGlobalMixins } from '@martyrs/src/modules/globals/views/mixins/mixins.js'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Checkbox from '@martyrs/src/components/Checkbox/Checkbox.vue'\nimport Field from '@martyrs/src/components/Field/Field.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue'\nimport IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\nconst filters = defineModel('filters', {\n type: Array,\n required: true\n})\n\nconst selected = defineModel('selected', {\n type: Object,\n default: () => ({})\n})\n\nconst emit = defineEmits(['select'])\n\nconst { formatDate } = useGlobalMixins()\n\n// State\nconst showAllFilters = ref(false)\nconst individualPopups = reactive({})\nconst tempSelected = reactive({})\nconst tempDateRange = ref(null)\n\n// Initialize popups and temp values\nwatch(filters, (newFilters) => {\n newFilters.forEach(filter => {\n individualPopups[filter.value] = false\n \n if (!tempSelected[filter.value]) {\n if (filter.type === 'checkbox') {\n tempSelected[filter.value] = [...(selected.value[filter.value] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filter.value] = { ...(selected.value[filter.value] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filter.value] = selected.value[filter.value] || null\n } else {\n tempSelected[filter.value] = selected.value[filter.value] || null\n }\n }\n })\n}, { immediate: true, deep: true })\n\n// Sync selected to tempSelected\nwatch(selected, (newSelected) => {\n Object.keys(newSelected).forEach(key => {\n const filter = filters.value.find(f => f.value === key)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[key] = [...(newSelected[key] || [])]\n } else if (filter.type === 'range') {\n tempSelected[key] = { ...(newSelected[key] || { min: '', max: '' }) }\n } else {\n tempSelected[key] = newSelected[key]\n }\n }\n })\n}, { deep: true })\n\n// Computed\nconst activeFiltersCount = computed(() => {\n return Object.entries(selected.value).filter(([key, value]) => {\n if (Array.isArray(value)) return value.length > 0\n if (typeof value === 'object' && value !== null) {\n return value.min || value.max\n }\n return value !== null && value !== undefined\n }).length\n})\n\n// Methods\nconst openFilter = (filterValue) => {\n individualPopups[filterValue] = true\n}\n\nconst isFilterActive = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n if (Array.isArray(value)) return value.length > 0\n if (filter.type === 'range') return value.min || value.max\n return true\n}\n\nconst getFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n \n if (filter.type === 'range') {\n return value.min || value.max\n }\n \n if (filter.type === 'date') {\n return value && value.start && value.end\n }\n \n if (Array.isArray(value)) {\n return value.length > 0\n }\n \n return value\n}\n\nconst formatFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return ''\n \n if (Array.isArray(value)) {\n return `(${value.length})`\n }\n \n if (filter.type === 'range') {\n if (!value.min && !value.max) return ''\n return `${value.min || '0'}-${value.max || '∞'}`\n }\n \n if (filter.type === 'date') {\n if (!value || !value.start || !value.end) return ''\n return `${formatDate(value.start, { dayMonth: true, language: 'en' })} - ${formatDate(value.end, { dayMonth: true, language: 'en' })}`\n }\n \n if (filter.type === 'radio') {\n const option = filter.options.find(o => o.value === value)\n return option ? `(${option.label})` : ''\n }\n \n return ''\n}\n\nconst applyFilter = (filterValue) => {\n selected.value[filterValue] = tempSelected[filterValue]\n individualPopups[filterValue] = false\n emit('select', { filter: filterValue, value: tempSelected[filterValue] })\n}\n\nconst cancelFilter = (filterValue) => {\n const filter = filters.value.find(f => f.value === filterValue)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[filterValue] = [...(selected.value[filterValue] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filterValue] = { ...(selected.value[filterValue] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filterValue] = selected.value[filterValue] || null\n } else {\n tempSelected[filterValue] = selected.value[filterValue] || null\n }\n }\n individualPopups[filterValue] = false\n}\n\nconst applyAllFilters = () => {\n Object.entries(tempSelected).forEach(([key, value]) => {\n if (selected.value[key] !== value) {\n selected.value[key] = value\n emit('select', { filter: key, value })\n }\n })\n showAllFilters.value = false\n}\n\nconst resetFilters = () => {\n filters.value.forEach(filter => {\n if (filter.type === 'checkbox') {\n tempSelected[filter.value] = []\n selected.value[filter.value] = []\n } else if (filter.type === 'range') {\n tempSelected[filter.value] = { min: '', max: '' }\n selected.value[filter.value] = { min: '', max: '' }\n } else if (filter.type === 'date') {\n tempSelected[filter.value] = null\n selected.value[filter.value] = null\n } else {\n tempSelected[filter.value] = null\n selected.value[filter.value] = null\n }\n emit('select', { filter: filter.value, value: null })\n })\n}\n</script>\n\n<style scoped>\n.filters-content {\n max-height: 60vh;\n overflow-y: auto;\n}\n</style>"],"names":["_useModel","useGlobalMixins","ref","reactive","watch","computed"],"mappings":"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"}
1
+ {"version":3,"file":"Filters.vue2.js","sources":["../../../../../../../../src/modules/globals/views/components/sections/Filters.vue"],"sourcesContent":["<template>\n <div class=\"flex t-nowrap gap-thin\">\n <!-- All Filters Button -->\n <button\n @click=\"showAllFilters = true\"\n class=\"pd-small radius-medium bg-light flex-v-center flex gap-micro cursor-pointer\"\n :class=\"{ 'bg-main': activeFiltersCount > 0 }\"\n >\n <IconFilter class=\"i-medium\" />\n <span class=\"h-1r\"></span>\n <span v-if=\"activeFiltersCount\">{{ activeFiltersCount }}</span>\n </button>\n\n <!-- Individual Filter Buttons -->\n <button\n v-for=\"filter in filters\"\n :key=\"filter.value\"\n @click=\"openFilter(filter.value)\"\n class=\"pd-small radius-medium bg-light cursor-pointer flex-v-center flex gap-micro\"\n :class=\"{ 'selected bg-main': isFilterActive(filter) }\"\n >\n <IconCalendar v-if=\"filter.type === 'date'\" class=\"mn-r-micro i-medium\" />\n <span class=\"t-nowrap\">{{ filter.type === 'date' && getFilterValue(filter) ? formatFilterValue(filter) : filter.title }}</span>\n <span v-if=\"getFilterValue(filter) && filter.type !== 'date'\" class=\"mn-l-micro\">\n {{ formatFilterValue(filter) }}\n </span>\n </button>\n\n <!-- All Filters Popup -->\n <Popup\n :isPopupOpen=\"showAllFilters\"\n @close-popup=\"showAllFilters = false\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"w-min-20r bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <div class=\"flex-v-center flex-nowrap flex mn-b-medium\">\n <h3 class=\"flex-child-full\">Filters</h3>\n </div>\n\n <div class=\"filters-content\">\n <div \n v-for=\"filter in filters\" \n :key=\"filter.value\"\n class=\"mn-b-medium\"\n >\n <h4 class=\"mn-b-small\">{{ filter.title }}</h4>\n \n <!-- Checkbox Filter -->\n <div v-if=\"filter.type === 'checkbox'\">\n <Checkbox\n v-for=\"option in filter.options\"\n :key=\"option.value\"\n :label=\"option.label\"\n :value=\"option.value\"\n v-model:radio=\"tempSelected[filter.value]\"\n mode=\"checkbox\"\n class=\"mn-b-micro\"\n />\n </div>\n\n <!-- Radio Filter -->\n <div v-else-if=\"filter.type === 'radio'\">\n <div\n v-for=\"option in filter.options\"\n :key=\"option.value\"\n @click=\"tempSelected[filter.value] = option.value\"\n class=\"pd-small radius-small cursor-pointer mn-b-micro\"\n :class=\"{ \n 'bg-main': tempSelected[filter.value] === option.value,\n 'bg-light': tempSelected[filter.value] !== option.value\n }\"\n >\n {{ option.label }}\n </div>\n </div>\n\n <!-- Range Filter -->\n <div v-else-if=\"filter.type === 'range'\" class=\"flex gap-thin\">\n <Field\n v-model:field=\"tempSelected[filter.value].min\"\n :placeholder=\"filter.minPlaceholder || 'Min'\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n <Field\n v-model:field=\"tempSelected[filter.value].max\"\n :placeholder=\"filter.maxPlaceholder || 'Max'\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n </div>\n\n <!-- Date Filter -->\n <div v-else-if=\"filter.type === 'date'\">\n <Calendar\n v-model:date=\"tempSelected[filter.value]\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"bg-light radius-small\"\n />\n </div>\n </div>\n </div>\n\n <div class=\"flex gap-thin mn-t-medium\">\n <button \n @click=\"applyAllFilters\" \n class=\"button bg-main flex-child-full\"\n >\n Apply\n </button>\n <button \n @click=\"resetFilters\" \n class=\"button bg-light\"\n >\n Reset Filters\n </button>\n </div>\n </Popup>\n\n <!-- Individual Filter Popups -->\n <Popup\n v-for=\"filter in filters\"\n :key=\"`popup-${filter.value}`\"\n :isPopupOpen=\"individualPopups[filter.value]\"\n @close-popup=\"individualPopups[filter.value] = false\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <h4 class=\"mn-b-medium\">{{ filter.title }}</h4>\n \n <!-- Checkbox Filter -->\n <div v-if=\"filter.type === 'checkbox'\">\n <Checkbox\n v-for=\"option in filter.options\"\n :key=\"option.value\"\n :label=\"option.label\"\n :value=\"option.value\"\n v-model:radio=\"tempSelected[filter.value]\"\n mode=\"checkbox\"\n class=\"mn-b-micro\"\n />\n </div>\n\n <!-- Radio Filter -->\n <div v-else-if=\"filter.type === 'radio'\">\n <div\n v-for=\"option in filter.options\"\n :key=\"option.value\"\n @click=\"tempSelected[filter.value] = option.value\"\n class=\"pd-small radius-small cursor-pointer mn-b-micro\"\n :class=\"{ \n 'bg-main': tempSelected[filter.value] === option.value,\n 'bg-light': tempSelected[filter.value] !== option.value\n }\"\n >\n {{ option.label }}\n </div>\n </div>\n\n <!-- Range Filter -->\n <div v-else-if=\"filter.type === 'range'\" class=\"flex gap-thin\">\n <Field\n v-model:field=\"tempSelected[filter.value].min\"\n :placeholder=\"filter.minPlaceholder || 'Min'\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n <Field\n v-model:field=\"tempSelected[filter.value].max\"\n :placeholder=\"filter.maxPlaceholder || 'Max'\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n </div>\n\n <!-- Date Filter -->\n <div v-else-if=\"filter.type === 'date'\">\n <div class=\"mn-t-small\">\n <Calendar\n v-model:date=\"tempSelected[filter.value]\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"bg-light radius-small\"\n />\n </div>\n </div>\n\n <div class=\"flex gap-thin mn-t-medium\">\n <button \n @click=\"cancelFilter(filter.value)\" \n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n <button \n @click=\"applyFilter(filter.value)\" \n class=\"bg-main w-100 button flex-child-full\"\n >\n Apply\n </button>\n \n \n </div>\n </Popup>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, reactive, watch } from 'vue'\nimport { useGlobalMixins } from '@martyrs/src/modules/globals/views/mixins/mixins.js'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Checkbox from '@martyrs/src/components/Checkbox/Checkbox.vue'\nimport Field from '@martyrs/src/components/Field/Field.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue'\nimport IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\nconst filters = defineModel('filters', {\n type: Array,\n required: true\n})\n\nconst selected = defineModel('selected', {\n type: Object,\n default: () => ({})\n})\n\nconst emit = defineEmits(['select'])\n\nconst { formatDate } = useGlobalMixins()\n\n// State\nconst showAllFilters = ref(false)\nconst individualPopups = reactive({})\nconst tempSelected = reactive({})\nconst tempDateRange = ref(null)\n\n// Initialize popups and temp values\nwatch(filters, (newFilters) => {\n newFilters.forEach(filter => {\n individualPopups[filter.value] = false\n \n if (!tempSelected[filter.value]) {\n if (filter.type === 'checkbox') {\n tempSelected[filter.value] = [...(selected.value[filter.value] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filter.value] = { ...(selected.value[filter.value] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filter.value] = selected.value[filter.value] || null\n } else {\n tempSelected[filter.value] = selected.value[filter.value] || null\n }\n }\n })\n}, { immediate: true, deep: true })\n\n// Sync selected to tempSelected\nwatch(selected, (newSelected) => {\n Object.keys(newSelected).forEach(key => {\n const filter = filters.value.find(f => f.value === key)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[key] = [...(newSelected[key] || [])]\n } else if (filter.type === 'range') {\n tempSelected[key] = { ...(newSelected[key] || { min: '', max: '' }) }\n } else {\n tempSelected[key] = newSelected[key]\n }\n }\n })\n}, { deep: true })\n\n// Computed\nconst activeFiltersCount = computed(() => {\n return Object.entries(selected.value).filter(([key, value]) => {\n if (Array.isArray(value)) return value.length > 0\n if (typeof value === 'object' && value !== null) {\n return value.min || value.max\n }\n return value !== null && value !== undefined\n }).length\n})\n\n// Methods\nconst openFilter = (filterValue) => {\n individualPopups[filterValue] = true\n}\n\nconst isFilterActive = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n if (Array.isArray(value)) return value.length > 0\n if (filter.type === 'range') return value.min || value.max\n return true\n}\n\nconst getFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n \n if (filter.type === 'range') {\n return value.min || value.max\n }\n \n if (filter.type === 'date') {\n return value && value.start && value.end\n }\n \n if (Array.isArray(value)) {\n return value.length > 0\n }\n \n return value\n}\n\nconst formatFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return ''\n \n if (Array.isArray(value)) {\n return `(${value.length})`\n }\n \n if (filter.type === 'range') {\n if (!value.min && !value.max) return ''\n return `${value.min || '0'}-${value.max || '∞'}`\n }\n \n if (filter.type === 'date') {\n if (!value || !value.start || !value.end) return ''\n return `${formatDate(value.start, { dayMonth: true, language: 'en' })} - ${formatDate(value.end, { dayMonth: true, language: 'en' })}`\n }\n \n if (filter.type === 'radio') {\n const option = filter.options.find(o => o.value === value)\n return option ? `(${option.label})` : ''\n }\n \n return ''\n}\n\nconst applyFilter = (filterValue) => {\n selected.value[filterValue] = tempSelected[filterValue]\n individualPopups[filterValue] = false\n emit('select', { filter: filterValue, value: tempSelected[filterValue] })\n}\n\nconst cancelFilter = (filterValue) => {\n const filter = filters.value.find(f => f.value === filterValue)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[filterValue] = [...(selected.value[filterValue] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filterValue] = { ...(selected.value[filterValue] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filterValue] = selected.value[filterValue] || null\n } else {\n tempSelected[filterValue] = selected.value[filterValue] || null\n }\n }\n individualPopups[filterValue] = false\n}\n\nconst applyAllFilters = () => {\n Object.entries(tempSelected).forEach(([key, value]) => {\n if (selected.value[key] !== value) {\n selected.value[key] = value\n emit('select', { filter: key, value })\n }\n })\n showAllFilters.value = false\n}\n\nconst resetFilters = () => {\n filters.value.forEach(filter => {\n if (filter.type === 'checkbox') {\n tempSelected[filter.value] = []\n selected.value[filter.value] = []\n } else if (filter.type === 'range') {\n tempSelected[filter.value] = { min: '', max: '' }\n selected.value[filter.value] = { min: '', max: '' }\n } else if (filter.type === 'date') {\n tempSelected[filter.value] = null\n selected.value[filter.value] = null\n } else {\n tempSelected[filter.value] = null\n selected.value[filter.value] = null\n }\n emit('select', { filter: filter.value, value: null })\n })\n}\n</script>\n\n<style scoped>\n.filters-content {\n max-height: 60vh;\n overflow-y: auto;\n}\n</style>"],"names":["_useModel"],"mappings":"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"}
@@ -116,7 +116,7 @@ function setError(error) {
116
116
  errorData = error;
117
117
  if (error?.info) errorData = error.info;
118
118
  if (error?.response?.data) errorData = error.response.data;
119
- if (errorData?.error === "VALIDATION_ERROR" && errorData?.errors) {
119
+ if ((errorData?.error === "VALIDATION_ERROR" || errorData?.errors) && errorData?.errors) {
120
120
  const errorMessages = [];
121
121
  for (const field in errorData.errors) {
122
122
  const fieldErrors = errorData.errors[field];
@@ -126,7 +126,7 @@ function setError(error) {
126
126
  errorMessages.push(fieldErrors);
127
127
  }
128
128
  }
129
- state.error.message = errorMessages.join(", ") || "Validation error";
129
+ state.error.message = errorMessages.join(", ") || errorData.message || "Validation error";
130
130
  } else if (error && errorData.errorCode) {
131
131
  state.error.message = errorData.errorCode;
132
132
  } else {
@@ -1 +1 @@
1
- {"version":3,"file":"globals.cjs","sources":["../../../../../../../src/modules/globals/views/store/globals.js"],"sourcesContent":["// Vue modules\nimport { Preferences } from '@capacitor/preferences';\nimport { reactive } from 'vue';\n\n// import i18n from \"@/localization.js\";\n\n// State\nconst state = reactive({\n loading: false,\n\n isOpenLocationPopup: false,\n isOpenSidebar: false,\n\n position: null,\n search: null,\n\n theme: {\n darkmode: false,\n },\n\n navigation_bar: {\n name: null,\n actions: null,\n },\n\n error: {\n status: '',\n headers: '',\n data: '',\n show: false,\n name: '',\n message: '',\n },\n snack: {\n show: false,\n type: 'notification',\n message: '',\n duration: 3000\n }\n});\n\n// Actions\nconst actions = {\n setLoading(status) {\n state.loading = status;\n },\n\n // Black/White Theme\n async setTheme(isDarkMode) {\n // Cache root element\n if (!state.theme.rootElement) {\n state.theme.rootElement = document.documentElement;\n }\n const root = state.theme.rootElement;\n\n state.theme.darkmode = isDarkMode;\n\n await Preferences.set({\n key: 'darkmode',\n value: JSON.stringify(state.theme.darkmode),\n });\n\n if (isDarkMode) {\n root.classList.add('dark-theme');\n } else {\n root.classList.remove('dark-theme');\n }\n\n const variableNames = ['--white', '--light', '--grey', '--dark', '--black'];\n\n // Проверяем, сохранены ли оригинальные цвета\n if (!state.theme.originalColors) {\n // Сохраняем оригинальные цвета один раз\n state.theme.originalColors = {};\n const computedStyle = getComputedStyle(root);\n variableNames.forEach(variableName => {\n state.theme.originalColors[variableName] = computedStyle.getPropertyValue(variableName).trim();\n });\n }\n\n if (isDarkMode) {\n invertColors(variableNames, state.theme.originalColors);\n } else {\n // Восстанавливаем оригинальные цвета батчем\n variableNames.forEach(variableName => {\n root.style.setProperty(variableName, state.theme.originalColors[variableName]);\n });\n }\n },\n\n toggleTheme() {\n this.setTheme(!state.theme.darkmode);\n },\n\n add(array, item) {\n const existingItemIndex = array.findIndex(i => i._id === item._id);\n\n if (existingItemIndex === -1) {\n array.push(item);\n } else {\n array[existingItemIndex] = item;\n }\n },\n\n update(array, item) {\n const existingItemIndex = array.findIndex(i => i._id === item._id);\n if (existingItemIndex === -1) {\n // If the item doesn't exist, push it to the array\n array.push(item);\n } else {\n // Update the item in the array without creating a new array\n Object.assign(array[existingItemIndex], item);\n }\n },\n\n delete(array, item) {\n const existingItemIndex = array.findIndex(c => c._id === item._id);\n\n if (existingItemIndex !== -1) {\n array.splice(existingItemIndex, 1);\n }\n },\n\n increment(array, item) {\n console.log(array);\n console.log(item);\n const arrayItem = array.find(i => i._id === item._id);\n\n if (arrayItem) {\n arrayItem.quantity++;\n }\n },\n\n decrement(array, item) {\n const arrayItem = array.find(i => i._id === item._id);\n\n const arrayItemIndex = array.indexOf(arrayItem);\n\n if (arrayItemIndex > -1) {\n arrayItem.quantity--;\n\n if (arrayItem.quantity < 1) array.splice(arrayItemIndex, 1);\n }\n },\n\n reset(array) {\n array = [];\n },\n};\n\n// Mutations\nfunction setError(error) {\n state.error.show = true;\n let errorData;\n\n errorData = error;\n\n // Обработка ошибок из fetch API (Store class)\n if (error?.info) errorData = error.info;\n \n // Обработка ошибок из axios\n if (error?.response?.data) errorData = error.response.data;\n\n // Обработка ошибок верификации\n if (errorData?.error === 'VALIDATION_ERROR' && errorData?.errors) {\n // Собираем все сообщения об ошибках в одну строку\n const errorMessages = [];\n for (const field in errorData.errors) {\n const fieldErrors = errorData.errors[field];\n if (Array.isArray(fieldErrors)) {\n errorMessages.push(...fieldErrors);\n } else if (typeof fieldErrors === 'string') {\n errorMessages.push(fieldErrors);\n }\n }\n state.error.message = errorMessages.join(', ') || 'Validation error';\n } else if (error && errorData.errorCode) {\n // state.error.message = i18n.global.t(`errors.${errorData.errorCode}`);\n state.error.message = errorData.errorCode;\n } else {\n state.error.message = errorData.message || error.message || 'Unknown error';\n }\n\n state.error.show = true;\n\n if (typeof window !== 'undefined' && window.requestAnimationFrame) {\n requestAnimationFrame(() => {\n setTimeout(() => (state.error.show = false), 5000);\n });\n } else {\n setTimeout(() => (state.error.show = false), 5000);\n }\n}\n\nfunction setSnack(data) {\n // Handle different input formats\n let type = 'notification'\n let message = ''\n let duration = 3000\n\n if (typeof data === 'string') {\n message = data\n } else if (data instanceof Error) {\n type = 'error'\n message = data.message\n } else if (data?.response?.data) {\n // Handle API errors\n type = 'error'\n const errorData = data.response.data\n message = errorData.errorCode || errorData.message || 'Unknown error'\n } else if (typeof data === 'object') {\n type = data.type || 'notification'\n message = data.message || ''\n duration = data.duration || 3000\n }\n\n // Update state\n state.snack = {\n show: true,\n type,\n message,\n duration\n }\n\n // Auto-hide\n if (typeof window !== 'undefined' && window.requestAnimationFrame) {\n requestAnimationFrame(() => {\n setTimeout(() => {state.snack.show = false }, duration)\n });\n } else {\n setTimeout(() => {state.snack.show = false }, duration)\n }\n \n}\n\nfunction invertColors(variableNames, originalColors) {\n variableNames.forEach(variableName => {\n const baseColor = originalColors[variableName];\n const colorArray = baseColor.split(',').map(Number);\n\n let invertedColor;\n\n if (variableName === '--white') {\n invertedColor = colorArray.map(value => 255 - value / 1.075);\n } else if (variableName === '--black') {\n invertedColor = colorArray.map(value => 255 - value);\n } else if (variableName === '--grey') {\n invertedColor = colorArray.map(value => 255 - value * 2);\n } else {\n invertedColor = colorArray.map(value => 255 - value / 1.075);\n }\n // Устанавливаем новые значения переменных CSS\n document.documentElement.style.setProperty(variableName, state.theme.darkmode ? invertedColor.join(', ') : baseColor);\n });\n}\n\nexport { actions, setError, setSnack, state };\n"],"names":["reactive","Preferences"],"mappings":"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"}
1
+ {"version":3,"file":"globals.cjs","sources":["../../../../../../../src/modules/globals/views/store/globals.js"],"sourcesContent":["// Vue modules\nimport { Preferences } from '@capacitor/preferences';\nimport { reactive } from 'vue';\n\n// import i18n from \"@/localization.js\";\n\n// State\nconst state = reactive({\n loading: false,\n\n isOpenLocationPopup: false,\n isOpenSidebar: false,\n\n position: null,\n search: null,\n\n theme: {\n darkmode: false,\n },\n\n navigation_bar: {\n name: null,\n actions: null,\n },\n\n error: {\n status: '',\n headers: '',\n data: '',\n show: false,\n name: '',\n message: '',\n },\n snack: {\n show: false,\n type: 'notification',\n message: '',\n duration: 3000\n }\n});\n\n// Actions\nconst actions = {\n setLoading(status) {\n state.loading = status;\n },\n\n // Black/White Theme\n async setTheme(isDarkMode) {\n // Cache root element\n if (!state.theme.rootElement) {\n state.theme.rootElement = document.documentElement;\n }\n const root = state.theme.rootElement;\n\n state.theme.darkmode = isDarkMode;\n\n await Preferences.set({\n key: 'darkmode',\n value: JSON.stringify(state.theme.darkmode),\n });\n\n if (isDarkMode) {\n root.classList.add('dark-theme');\n } else {\n root.classList.remove('dark-theme');\n }\n\n const variableNames = ['--white', '--light', '--grey', '--dark', '--black'];\n\n // Проверяем, сохранены ли оригинальные цвета\n if (!state.theme.originalColors) {\n // Сохраняем оригинальные цвета один раз\n state.theme.originalColors = {};\n const computedStyle = getComputedStyle(root);\n variableNames.forEach(variableName => {\n state.theme.originalColors[variableName] = computedStyle.getPropertyValue(variableName).trim();\n });\n }\n\n if (isDarkMode) {\n invertColors(variableNames, state.theme.originalColors);\n } else {\n // Восстанавливаем оригинальные цвета батчем\n variableNames.forEach(variableName => {\n root.style.setProperty(variableName, state.theme.originalColors[variableName]);\n });\n }\n },\n\n toggleTheme() {\n this.setTheme(!state.theme.darkmode);\n },\n\n add(array, item) {\n const existingItemIndex = array.findIndex(i => i._id === item._id);\n\n if (existingItemIndex === -1) {\n array.push(item);\n } else {\n array[existingItemIndex] = item;\n }\n },\n\n update(array, item) {\n const existingItemIndex = array.findIndex(i => i._id === item._id);\n if (existingItemIndex === -1) {\n // If the item doesn't exist, push it to the array\n array.push(item);\n } else {\n // Update the item in the array without creating a new array\n Object.assign(array[existingItemIndex], item);\n }\n },\n\n delete(array, item) {\n const existingItemIndex = array.findIndex(c => c._id === item._id);\n\n if (existingItemIndex !== -1) {\n array.splice(existingItemIndex, 1);\n }\n },\n\n increment(array, item) {\n console.log(array);\n console.log(item);\n const arrayItem = array.find(i => i._id === item._id);\n\n if (arrayItem) {\n arrayItem.quantity++;\n }\n },\n\n decrement(array, item) {\n const arrayItem = array.find(i => i._id === item._id);\n\n const arrayItemIndex = array.indexOf(arrayItem);\n\n if (arrayItemIndex > -1) {\n arrayItem.quantity--;\n\n if (arrayItem.quantity < 1) array.splice(arrayItemIndex, 1);\n }\n },\n\n reset(array) {\n array = [];\n },\n};\n\n// Mutations\nfunction setError(error) {\n state.error.show = true;\n let errorData;\n\n errorData = error;\n\n // Обработка ошибок из fetch API (Store class)\n if (error?.info) errorData = error.info;\n \n // Обработка ошибок из axios\n if (error?.response?.data) errorData = error.response.data;\n\n // Обработка ошибок верификации\n if ((errorData?.error === 'VALIDATION_ERROR' || errorData?.errors) && errorData?.errors) {\n // Собираем все сообщения об ошибках в одну строку\n const errorMessages = [];\n for (const field in errorData.errors) {\n const fieldErrors = errorData.errors[field];\n if (Array.isArray(fieldErrors)) {\n errorMessages.push(...fieldErrors);\n } else if (typeof fieldErrors === 'string') {\n errorMessages.push(fieldErrors);\n }\n }\n state.error.message = errorMessages.join(', ') || errorData.message || 'Validation error';\n } else if (error && errorData.errorCode) {\n // state.error.message = i18n.global.t(`errors.${errorData.errorCode}`);\n state.error.message = errorData.errorCode;\n } else {\n state.error.message = errorData.message || error.message || 'Unknown error';\n }\n\n state.error.show = true;\n\n if (typeof window !== 'undefined' && window.requestAnimationFrame) {\n requestAnimationFrame(() => {\n setTimeout(() => (state.error.show = false), 5000);\n });\n } else {\n setTimeout(() => (state.error.show = false), 5000);\n }\n}\n\nfunction setSnack(data) {\n // Handle different input formats\n let type = 'notification'\n let message = ''\n let duration = 3000\n\n if (typeof data === 'string') {\n message = data\n } else if (data instanceof Error) {\n type = 'error'\n message = data.message\n } else if (data?.response?.data) {\n // Handle API errors\n type = 'error'\n const errorData = data.response.data\n message = errorData.errorCode || errorData.message || 'Unknown error'\n } else if (typeof data === 'object') {\n type = data.type || 'notification'\n message = data.message || ''\n duration = data.duration || 3000\n }\n\n // Update state\n state.snack = {\n show: true,\n type,\n message,\n duration\n }\n\n // Auto-hide\n if (typeof window !== 'undefined' && window.requestAnimationFrame) {\n requestAnimationFrame(() => {\n setTimeout(() => {state.snack.show = false }, duration)\n });\n } else {\n setTimeout(() => {state.snack.show = false }, duration)\n }\n \n}\n\nfunction invertColors(variableNames, originalColors) {\n variableNames.forEach(variableName => {\n const baseColor = originalColors[variableName];\n const colorArray = baseColor.split(',').map(Number);\n\n let invertedColor;\n\n if (variableName === '--white') {\n invertedColor = colorArray.map(value => 255 - value / 1.075);\n } else if (variableName === '--black') {\n invertedColor = colorArray.map(value => 255 - value);\n } else if (variableName === '--grey') {\n invertedColor = colorArray.map(value => 255 - value * 2);\n } else {\n invertedColor = colorArray.map(value => 255 - value / 1.075);\n }\n // Устанавливаем новые значения переменных CSS\n document.documentElement.style.setProperty(variableName, state.theme.darkmode ? invertedColor.join(', ') : baseColor);\n });\n}\n\nexport { actions, setError, setSnack, state };\n"],"names":["reactive","Preferences"],"mappings":"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"}
@@ -114,7 +114,7 @@ function setError(error) {
114
114
  errorData = error;
115
115
  if (error?.info) errorData = error.info;
116
116
  if (error?.response?.data) errorData = error.response.data;
117
- if (errorData?.error === "VALIDATION_ERROR" && errorData?.errors) {
117
+ if ((errorData?.error === "VALIDATION_ERROR" || errorData?.errors) && errorData?.errors) {
118
118
  const errorMessages = [];
119
119
  for (const field in errorData.errors) {
120
120
  const fieldErrors = errorData.errors[field];
@@ -124,7 +124,7 @@ function setError(error) {
124
124
  errorMessages.push(fieldErrors);
125
125
  }
126
126
  }
127
- state.error.message = errorMessages.join(", ") || "Validation error";
127
+ state.error.message = errorMessages.join(", ") || errorData.message || "Validation error";
128
128
  } else if (error && errorData.errorCode) {
129
129
  state.error.message = errorData.errorCode;
130
130
  } else {