@ozdao/martyrs 0.2.583 → 0.2.585

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 (233) hide show
  1. package/dist/builder.js +2 -0
  2. package/dist/{main-vq1_XpmQ.js → main-xL-jtBkT.js} +12 -11
  3. package/dist/martyrs/dist/{main-vq1_XpmQ.js → main-xL-jtBkT.js} +3 -2
  4. package/dist/martyrs/dist/main-xL-jtBkT.js.map +1 -0
  5. package/dist/martyrs/dist/{web-BNJDRie_.js → web-BA6h6Z8P.js} +2 -2
  6. package/dist/martyrs/dist/{web-BNJDRie_.js.map → web-BA6h6Z8P.js.map} +1 -1
  7. package/dist/martyrs/src/components/Button/{Button.vue.js → Button.vue2.js} +3 -3
  8. package/dist/martyrs/src/components/Button/Button.vue2.js.map +1 -0
  9. package/dist/martyrs/src/components/Calendar/Calendar.vue2.js +5 -5
  10. package/dist/martyrs/src/components/Calendar/Calendar.vue2.js.map +1 -1
  11. package/dist/martyrs/src/components/Feed/Carousel.vue.js +1 -1
  12. package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
  13. package/dist/martyrs/src/components/Field/Field.vue.js +2 -2
  14. package/dist/martyrs/src/components/Field/Field.vue.js.map +1 -1
  15. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +2 -2
  16. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js.map +1 -1
  17. package/dist/martyrs/src/components/FieldDate/FieldDate.vue.js +2 -2
  18. package/dist/martyrs/src/components/FieldDate/FieldDate.vue.js.map +1 -1
  19. package/dist/martyrs/src/components/Loader/{Loader.vue2.js → Loader.vue.js} +2 -2
  20. package/dist/martyrs/src/components/Loader/Loader.vue.js.map +1 -0
  21. package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue.js +1 -1
  22. package/dist/martyrs/src/components/Media/Media.vue.js +1 -1
  23. package/dist/martyrs/src/components/Menu/{Menu.vue2.js → Menu.vue.js} +2 -2
  24. package/dist/martyrs/src/components/Menu/Menu.vue.js.map +1 -0
  25. package/dist/martyrs/src/components/Select/{Select.vue2.js → Select.vue.js} +2 -2
  26. package/dist/martyrs/src/components/Select/Select.vue.js.map +1 -0
  27. package/dist/martyrs/src/components/UploadImage/UploadImage.vue.js +1 -1
  28. package/dist/martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue.js +1 -1
  29. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
  30. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
  31. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +61 -42
  32. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js.map +1 -1
  33. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js +1 -1
  34. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js +1 -1
  35. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +1 -1
  36. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
  37. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
  38. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
  39. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
  40. package/dist/martyrs/src/modules/backoffice/backoffice.client.js +3 -15
  41. package/dist/martyrs/src/modules/backoffice/backoffice.client.js.map +1 -1
  42. package/dist/martyrs/src/modules/backoffice/configs/navigation.backoffice.config.js +99 -0
  43. package/dist/martyrs/src/modules/backoffice/configs/navigation.backoffice.config.js.map +1 -0
  44. package/dist/martyrs/src/modules/backoffice/{backoffice.router.js → router/backoffice.router.js} +9 -7
  45. package/dist/martyrs/src/modules/backoffice/router/backoffice.router.js.map +1 -0
  46. package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js +3 -3
  47. package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js.map +1 -1
  48. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +8 -2
  49. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js.map +1 -1
  50. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
  51. package/dist/martyrs/src/modules/core/core.client.js.map +1 -1
  52. package/dist/martyrs/src/modules/core/views/classes/core.app.js +5 -1
  53. package/dist/martyrs/src/modules/core/views/classes/core.app.js.map +1 -1
  54. package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js +2 -2
  55. package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js.map +1 -1
  56. package/dist/martyrs/src/modules/core/views/components/blocks/PopupAuth.vue.js +1 -1
  57. package/dist/martyrs/src/modules/core/views/components/blocks/PopupDateSelector.vue.js +2 -2
  58. package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js +22 -28
  59. package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js.map +1 -1
  60. package/dist/martyrs/src/modules/core/views/components/pages/404.vue.js +76 -7
  61. package/dist/martyrs/src/modules/core/views/components/pages/404.vue.js.map +1 -1
  62. package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js +3 -3
  63. package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js.map +1 -1
  64. package/dist/martyrs/src/modules/core/views/components/partials/NavigationBar.vue.js +1 -1
  65. package/dist/martyrs/src/modules/core/views/components/partials/Sidebar.vue.js +2 -2
  66. package/dist/martyrs/src/modules/core/views/components/partials/Sidebar.vue.js.map +1 -1
  67. package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue2.js +3 -3
  68. package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue2.js.map +1 -1
  69. package/dist/martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue.js +1 -1
  70. package/dist/martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue.js.map +1 -1
  71. package/dist/martyrs/src/modules/core/views/store/core.store.js +1 -0
  72. package/dist/martyrs/src/modules/core/views/store/core.store.js.map +1 -1
  73. package/dist/martyrs/src/modules/core/views/utils/vue-app-renderer.js +2 -1
  74. package/dist/martyrs/src/modules/core/views/utils/vue-app-renderer.js.map +1 -1
  75. package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.js +1 -1
  76. package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.js +1 -1
  77. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +2 -2
  78. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +3 -3
  79. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js.map +1 -1
  80. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +2 -1
  81. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js.map +1 -1
  82. package/dist/martyrs/src/modules/events/components/sections/EditTickets.vue.js +1 -1
  83. package/dist/martyrs/src/modules/events/components/sections/Feed.vue.js +1 -1
  84. package/dist/martyrs/src/modules/events/components/sections/List.vue.js +1 -1
  85. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +3 -3
  86. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js.map +1 -1
  87. package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +2 -2
  88. package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.js +1 -1
  89. package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.js +1 -1
  90. package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +2 -2
  91. package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.js +4 -4
  92. package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.js.map +1 -1
  93. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +2 -2
  94. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js.map +1 -1
  95. package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.js +1 -1
  96. package/dist/martyrs/src/modules/music/components/blocks/ActionButtons.vue.js +1 -1
  97. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +1 -1
  98. package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js +1 -1
  99. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +1 -1
  100. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +1 -1
  101. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +2 -2
  102. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +3 -3
  103. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +1 -1
  104. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +1 -1
  105. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +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.js +2 -2
  108. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +1 -1
  109. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +7 -7
  110. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js.map +1 -1
  111. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +2 -2
  112. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +2 -2
  113. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +1 -1
  114. package/dist/martyrs/src/modules/music/components/player/FullscreenPlayer.vue.js +1 -1
  115. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +1 -1
  116. package/dist/martyrs/src/modules/music/components/player/PlayerControls.vue.js +1 -1
  117. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +1 -1
  118. package/dist/martyrs/src/modules/notifications/components/sections/NotificationPreferences.vue.js +2 -2
  119. package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +2 -2
  120. package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +2 -2
  121. package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +2 -2
  122. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +2 -2
  123. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +1 -1
  124. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
  125. package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.js +1 -1
  126. package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.js +1 -1
  127. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +1 -1
  128. package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.js +1 -1
  129. package/dist/martyrs/src/modules/orders/router/orders.router.js +23 -0
  130. package/dist/martyrs/src/modules/orders/router/orders.router.js.map +1 -1
  131. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +1 -1
  132. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js.map +1 -1
  133. package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +1 -1
  134. package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js +1 -1
  135. package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +1 -1
  136. package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +1 -1
  137. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
  138. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
  139. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +4 -3
  140. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js.map +1 -1
  141. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +2 -2
  142. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +2 -2
  143. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +2 -2
  144. package/dist/martyrs/src/modules/pages/pages.router.js +7 -5
  145. package/dist/martyrs/src/modules/pages/pages.router.js.map +1 -1
  146. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
  147. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +3 -3
  148. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js.map +1 -1
  149. package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +2 -2
  150. package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js.map +1 -1
  151. package/dist/martyrs/src/modules/products/components/elements/Image360.vue.js +1 -1
  152. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
  153. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +3 -3
  154. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +1 -1
  155. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +2 -2
  156. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +1 -1
  157. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js.map +1 -1
  158. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
  159. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +3 -3
  160. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js.map +1 -1
  161. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +2 -2
  162. package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js +2 -2
  163. package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js.map +1 -1
  164. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js +1 -1
  165. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +1 -1
  166. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
  167. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
  168. package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +2 -2
  169. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
  170. package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js +1 -1
  171. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +2 -2
  172. package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js +1 -1
  173. package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js.map +1 -1
  174. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +2 -2
  175. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +2 -2
  176. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js.map +1 -1
  177. package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +3 -3
  178. package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js.map +1 -1
  179. package/dist/martyrs.css +1 -1
  180. package/dist/martyrs.es.js +1 -1
  181. package/dist/style.css +38 -33
  182. package/dist/{web-BNJDRie_.js → web-BA6h6Z8P.js} +1 -1
  183. package/package.json +1 -1
  184. package/src/builder/modes/ssr.rspack.dev.js +2 -0
  185. package/src/components/Calendar/Calendar.vue +4 -4
  186. package/src/components/Completion/Completion.vue +3 -3
  187. package/src/components/Field/Field.vue +1 -1
  188. package/src/components/FieldBig/FieldBig.vue +1 -1
  189. package/src/components/FieldDate/FieldDate.vue +1 -1
  190. package/src/modules/auth/views/components/pages/Profile.vue +33 -5
  191. package/src/modules/backoffice/backoffice.client.js +1 -25
  192. package/src/modules/backoffice/configs/navigation.backoffice.config.js +99 -0
  193. package/src/modules/backoffice/router/backoffice.router.js +8 -7
  194. package/src/modules/community/components/layouts/Community.vue +2 -2
  195. package/src/modules/community/components/pages/BlogPost.vue +9 -1
  196. package/src/modules/core/core.client.js +1 -0
  197. package/src/modules/core/views/classes/core.app.js +8 -3
  198. package/src/modules/core/views/components/blocks/CardHeader.vue +1 -1
  199. package/src/modules/core/views/components/layouts/Client.vue +41 -42
  200. package/src/modules/core/views/components/pages/404.vue +55 -3
  201. package/src/modules/core/views/components/partials/Header.vue +1 -1
  202. package/src/modules/core/views/components/partials/Sidebar.vue +1 -1
  203. package/src/modules/core/views/components/sections/Filters.vue +2 -2
  204. package/src/modules/core/views/components/sections/SectionPageTitle.vue +1 -1
  205. package/src/modules/core/views/store/core.store.js +1 -0
  206. package/src/modules/core/views/utils/vue-app-renderer.js +9 -1
  207. package/src/modules/events/components/pages/EditEventTickets.vue +2 -2
  208. package/src/modules/gallery/components/sections/BackofficeGallery.vue +1 -1
  209. package/src/modules/inventory/components/pages/Inventory.vue +4 -4
  210. package/src/modules/inventory/components/pages/InventoryEdit.vue +1 -1
  211. package/src/modules/music/components/pages/Playlist.vue +5 -5
  212. package/src/modules/orders/router/orders.router.js +33 -0
  213. package/src/modules/organizations/components/blocks/CardOrganization.vue +1 -1
  214. package/src/modules/pages/pages.router.js +4 -2
  215. package/src/modules/pages/views/components/pages/PageEdit.vue +2 -2
  216. package/src/modules/pages/views/components/partials/SidebarPages.vue +1 -1
  217. package/src/modules/pages/views/router/pages.backoffice.router.js +4 -3
  218. package/src/modules/products/components/pages/Products.vue +1 -1
  219. package/src/modules/products/components/sections/EditDiscounts.vue +1 -1
  220. package/src/modules/products/components/sections/ProductConfigurator.vue +1 -1
  221. package/src/modules/spots/components/pages/Spots.vue +1 -1
  222. package/src/modules/wallet/views/components/blocks/CryptoDeposit.vue +1 -1
  223. package/src/modules/wallet/views/components/pages/Wallet.vue +1 -1
  224. package/dist/martyrs/dist/main-vq1_XpmQ.js.map +0 -1
  225. package/dist/martyrs/src/components/Button/Button.vue.js.map +0 -1
  226. package/dist/martyrs/src/components/Loader/Loader.vue2.js.map +0 -1
  227. package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +0 -1
  228. package/dist/martyrs/src/components/Select/Select.vue2.js.map +0 -1
  229. package/dist/martyrs/src/modules/backoffice/backoffice.router.js.map +0 -1
  230. package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js +0 -150
  231. package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js.map +0 -1
  232. package/src/modules/backoffice/backoffice.router.js +0 -69
  233. package/src/modules/backoffice/components/partials/Sidebar.vue +0 -165
@@ -1 +1 @@
1
- {"version":3,"file":"vue-app-renderer.js","sources":["../../../../../../../src/modules/core/views/utils/vue-app-renderer.js"],"sourcesContent":["import { setAuthToken } from '@martyrs/src/modules/core/views/utils/axios-instance.js';\nimport { renderSSRHead } from '@unhead/ssr';\nimport { renderToString } from '@vue/server-renderer';\n\nexport function renderAndMountApp({ createApp, hooks = {} }) {\n const start = async () => {\n // [LOADING 22] Starting client-side hydration\n performance.mark('loading-22-start');\n console.log('[LOADING 22] Starting client-side hydration...');\n\n const { app, router, store, moduleManager, config } = await createApp();\n \n let serverModules = [];\n \n // Загружаем модули которые были загружены на сервере\n if (typeof window !== 'undefined') {\n try {\n const modulesElement = document.querySelector('[data-loaded-modules]');\n if (modulesElement) {\n serverModules = JSON.parse(modulesElement.innerHTML);\n }\n } catch (e) {\n console.error('Failed to parse loaded modules', e);\n }\n \n const context = { app, store, router, config };\n\n // [LOADING 23] Loading server modules for hydration\n performance.mark('loading-23-start');\n console.log(`[LOADING 23] Loading ${serverModules.length} server modules for hydration...`);\n\n for (const moduleName of serverModules) {\n try {\n await moduleManager.load(moduleName, context);\n await moduleManager.initialize(moduleName, context);\n } catch (error) {\n console.error(`Failed to load module ${moduleName}:`, error);\n }\n }\n\n performance.mark('loading-23-end');\n performance.measure('loading-23', 'loading-23-start', 'loading-23-end');\n const measure23 = performance.getEntriesByName('loading-23')[0];\n console.log(`[LOADING 23] Server modules loaded in ${measure23?.duration?.toFixed(2)}ms`);\n }\n \n // Call beforeHydration hook if provided\n if (hooks.beforeHydration) {\n hooks.beforeHydration({ app, router, store, moduleManager });\n }\n\n // [LOADING 24] Parsing and applying initialState\n performance.mark('loading-24-start');\n console.log('[LOADING 24] Parsing and applying initialState...');\n\n let initialState;\n\n try {\n const initialStateElement = document.querySelector('[data-state]');\n\n if (initialStateElement && initialStateElement.innerHTML.trim() !== '') {\n const stateContent = initialStateElement.innerHTML.trim();\n \n // Validate JSON format before parsing\n if (stateContent.startsWith('{') && stateContent.endsWith('}')) {\n initialState = JSON.parse(stateContent);\n \n // Basic validation of state structure\n if (typeof initialState !== 'object' || initialState === null) {\n throw new Error('Invalid state format');\n }\n } else {\n throw new Error('Invalid JSON format');\n }\n }\n } catch (error) {\n console.error('Failed to parse user state', error);\n initialState = null;\n }\n\n if (initialState) {\n console.log('[AUTH COOKIE DEBUG] Browser initialState.auth:', initialState.auth);\n console.log('[AUTH COOKIE DEBUG] Has token?', !!initialState?.auth?.access?.token);\n console.log('[AUTH COOKIE DEBUG] Has auth but no status?', !!initialState?.auth && !initialState.auth.access?.status);\n\n // Применяем начальное состояние ко всем модулям (true = гидратация)\n store.setInitialState(initialState, true);\n\n // Гидратация session из auth данных — напрямую в reactive state\n if (initialState?.auth?.user?._id && store.core?.state?.session) {\n store.core.state.session.userId = initialState.auth.user._id;\n store.core.state.session.token = initialState.auth.access?.token;\n store.core.state.session.roles = initialState.auth.access?.roles;\n store.core.state.session.accesses = initialState.auth.accesses || [];\n console.log('[AUTH COOKIE DEBUG] Session hydrated with userId:', initialState.auth.user._id);\n }\n\n if (initialState?.auth?.access?.token) {\n console.log('[AUTH COOKIE DEBUG] Setting auth token from initialState');\n\n setAuthToken(initialState.auth.access.token);\n } else if (initialState?.auth && !initialState.auth.access?.status) {\n // Если SSR сбросил auth (из-за ошибки), удаляем куку в браузере\n console.log('[AUTH COOKIE DEBUG] SSR reset auth, removing cookie in browser');\n if (store.auth && store.auth.removeCookie) {\n await store.auth.removeCookie('user');\n }\n }\n } else {\n // Если нет initialState, сбрасываем авторизацию (если модуль auth загружен)\n if (store.auth && store.auth.actions) {\n store.auth.actions.resetState();\n // await store.auth.removeCookie('user');\n await store.auth.actions.logout();\n }\n }\n\n const savedPosition = localStorage.getItem('position');\n\n if (savedPosition) {\n store.core.state.position = JSON.parse(savedPosition);\n }\n\n // app.config.globalProperties.$i18n.locale = router.currentRoute.value.params.locale\n // app.config.globalProperties.$i18n.locale = router.currentRoute.value.params.locale\n // If user browser locae supported then change locale\n // if (i18n.global.availableLocales.includes(browserLocale)) {\n // app.config.globalProperties.$i18n.locale = browserLocale;\n // }\n\n performance.mark('loading-24-end');\n performance.measure('loading-24', 'loading-24-start', 'loading-24-end');\n const measure24 = performance.getEntriesByName('loading-24')[0];\n console.log(`[LOADING 24] InitialState parsed and applied in ${measure24?.duration?.toFixed(2)}ms`);\n\n await router.isReady();\n\n // [LOADING 25] Mounting the application\n performance.mark('loading-25-start');\n console.log('[LOADING 25] Mounting the application...');\n\n app.mount('#app');\n\n performance.mark('loading-25-end');\n performance.measure('loading-25', 'loading-25-start', 'loading-25-end');\n const measure25 = performance.getEntriesByName('loading-25')[0];\n console.log(`[LOADING 25] Application mounted in ${measure25?.duration?.toFixed(2)}ms`);\n\n // Return the objects for further use\n return { app, router, store, moduleManager };\n };\n return start();\n}\n\nexport async function render({ url, cookies, headers, ssrContext, createApp }) {\n // [LOADING 26] SSR render starting\n performance.mark('loading-26-start');\n console.log('[LOADING 26] SSR render starting...');\n\n const { app, router, store, meta } = createApp();\n\n await router.push(url);\n await router.isReady();\n\n // If user's language is supported, change the locale\n // if (language === 'en' || language === 'ru') {\n // app.config.globalProperties.$i18n.locale = language\n // }\n\n // app.config.globalProperties.$i18n.locale = router.currentRoute.value.params.locale\n\n const ctx = ssrContext || {};\n\n if (router.currentRoute.value.name?.toLowerCase() === 'notfound') {\n ctx.notFound = true;\n }\n\n let user = null;\n\n if (cookies.user) {\n try {\n user = JSON.parse(cookies.user);\n } catch (error) {\n console.error('Failed to parse user cookie', error);\n user = null;\n }\n }\n\n \n\n\n if (user) {\n // [LOADING 27] SSR auth initialization\n performance.mark('loading-27-start');\n console.log('[LOADING 27] SSR auth initialization...');\n\n if (store.auth && store.auth.actions) {\n try {\n await store.auth.actions.initialize(user);\n } catch (error) {\n console.error('[SSR] Auth initialization failed, continuing without auth:', error);\n // Сбрасываем состояние если инициализация упала\n if (store.auth.actions.resetState) {\n store.auth.actions.resetState();\n }\n }\n } else {\n console.warn('[SSR] Auth module not loaded, cannot initialize user');\n }\n\n performance.mark('loading-27-end');\n performance.measure('loading-27', 'loading-27-start', 'loading-27-end');\n const measure27 = performance.getEntriesByName('loading-27')[0];\n console.log(`[LOADING 27] SSR auth initialized in ${measure27?.duration?.toFixed(2)}ms`);\n } else {\n if (store.auth && store.auth.actions) {\n store.auth.actions.resetState();\n } else {\n console.warn('[SSR] Auth module not loaded, cannot reset state');\n }\n }\n\n // [LOADING 28] SSR renderToString\n performance.mark('loading-28-start');\n console.log('[LOADING 28] SSR renderToString starting...');\n\n // After render, ctx.modules will be populated with used module identifiers\n const html = await renderToString(app, ctx);\n\n // Добавляем атрибуты темы через meta API перед renderSSRHead\n let theme = cookies?.theme;\n if (!theme) {\n // Fallback на sec-ch-prefers-color-scheme если нет cookie\n const prefersColorScheme = headers?.['sec-ch-prefers-color-scheme'];\n theme = prefersColorScheme === 'dark' ? 'system-dark' : 'system';\n }\n\n const themeAttrs = {};\n if (theme === 'dark') {\n themeAttrs.class = 'dark-theme';\n themeAttrs['data-theme'] = 'dark';\n themeAttrs['color-scheme'] = 'dark';\n } else if (theme === 'light') {\n themeAttrs.class = 'light-theme';\n themeAttrs['data-theme'] = 'light';\n themeAttrs['color-scheme'] = 'light';\n } else {\n // system/system-dark - без класса, CSS media query сработает\n themeAttrs['color-scheme'] = 'light dark';\n }\n\n meta.push({ htmlAttrs: themeAttrs });\n\n // Синхронизируем store state с определённой темой для SSR\n store.core.state.theme.mode = (theme === 'dark') ? 'dark'\n : (theme === 'light') ? 'light'\n : 'system';\n\n const payload = await renderSSRHead(meta, {});\n const initialState = await store.getInitialState();\n\n performance.mark('loading-28-end');\n performance.measure('loading-28', 'loading-28-start', 'loading-28-end');\n const measure28 = performance.getEntriesByName('loading-28')[0];\n console.log(`[LOADING 28] SSR renderToString completed in ${measure28?.duration?.toFixed(2)}ms`);\n\n // Total SSR render time\n performance.measure('loading-26-total', 'loading-26-start', 'loading-28-end');\n const measure26Total = performance.getEntriesByName('loading-26-total')[0];\n console.log(`[LOADING 26] Total SSR render completed in ${measure26Total?.duration?.toFixed(2)}ms`);\n\n return {\n html,\n meta: payload,\n state: initialState,\n statusCode: router.currentRoute?.value?.name?.toLowerCase() === 'notfound' ? 404 : 200,\n usedModules: Array.from(ctx.modules || new Set()), // Return used modules\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vue-app-renderer.js","sources":["../../../../../../../src/modules/core/views/utils/vue-app-renderer.js"],"sourcesContent":["import { setAuthToken } from '@martyrs/src/modules/core/views/utils/axios-instance.js';\nimport { renderSSRHead } from '@unhead/ssr';\nimport { renderToString } from '@vue/server-renderer';\n\nexport function renderAndMountApp({ createApp, hooks = {} }) {\n const start = async () => {\n // [LOADING 22] Starting client-side hydration\n performance.mark('loading-22-start');\n console.log('[LOADING 22] Starting client-side hydration...');\n\n const { app, router, store, moduleManager, config } = await createApp();\n \n let serverModules = [];\n \n // Загружаем модули которые были загружены на сервере\n if (typeof window !== 'undefined') {\n try {\n const modulesElement = document.querySelector('[data-loaded-modules]');\n if (modulesElement) {\n serverModules = JSON.parse(modulesElement.innerHTML);\n }\n } catch (e) {\n console.error('Failed to parse loaded modules', e);\n }\n \n const context = { app, store, router, config };\n\n // [LOADING 23] Loading server modules for hydration\n performance.mark('loading-23-start');\n console.log(`[LOADING 23] Loading ${serverModules.length} server modules for hydration...`);\n\n for (const moduleName of serverModules) {\n try {\n await moduleManager.load(moduleName, context);\n await moduleManager.initialize(moduleName, context);\n } catch (error) {\n console.error(`Failed to load module ${moduleName}:`, error);\n }\n }\n\n performance.mark('loading-23-end');\n performance.measure('loading-23', 'loading-23-start', 'loading-23-end');\n const measure23 = performance.getEntriesByName('loading-23')[0];\n console.log(`[LOADING 23] Server modules loaded in ${measure23?.duration?.toFixed(2)}ms`);\n }\n \n // Call beforeHydration hook if provided\n if (hooks.beforeHydration) {\n hooks.beforeHydration({ app, router, store, moduleManager });\n }\n\n // [LOADING 24] Parsing and applying initialState\n performance.mark('loading-24-start');\n console.log('[LOADING 24] Parsing and applying initialState...');\n\n let initialState;\n\n try {\n const initialStateElement = document.querySelector('[data-state]');\n\n if (initialStateElement && initialStateElement.innerHTML.trim() !== '') {\n const stateContent = initialStateElement.innerHTML.trim();\n \n // Validate JSON format before parsing\n if (stateContent.startsWith('{') && stateContent.endsWith('}')) {\n initialState = JSON.parse(stateContent);\n \n // Basic validation of state structure\n if (typeof initialState !== 'object' || initialState === null) {\n throw new Error('Invalid state format');\n }\n } else {\n throw new Error('Invalid JSON format');\n }\n }\n } catch (error) {\n console.error('Failed to parse user state', error);\n initialState = null;\n }\n\n if (initialState) {\n console.log('[AUTH COOKIE DEBUG] Browser initialState.auth:', initialState.auth);\n console.log('[AUTH COOKIE DEBUG] Has token?', !!initialState?.auth?.access?.token);\n console.log('[AUTH COOKIE DEBUG] Has auth but no status?', !!initialState?.auth && !initialState.auth.access?.status);\n\n // Применяем начальное состояние ко всем модулям (true = гидратация)\n store.setInitialState(initialState, true);\n\n // Гидратация session из auth данных — напрямую в reactive state\n if (initialState?.auth?.user?._id && store.core?.state?.session) {\n store.core.state.session.userId = initialState.auth.user._id;\n store.core.state.session.token = initialState.auth.access?.token;\n store.core.state.session.roles = initialState.auth.access?.roles;\n store.core.state.session.accesses = initialState.auth.accesses || [];\n console.log('[AUTH COOKIE DEBUG] Session hydrated with userId:', initialState.auth.user._id);\n }\n\n if (initialState?.auth?.access?.token) {\n console.log('[AUTH COOKIE DEBUG] Setting auth token from initialState');\n\n setAuthToken(initialState.auth.access.token);\n } else if (initialState?.auth && !initialState.auth.access?.status) {\n // Если SSR сбросил auth (из-за ошибки), удаляем куку в браузере\n console.log('[AUTH COOKIE DEBUG] SSR reset auth, removing cookie in browser');\n if (store.auth && store.auth.removeCookie) {\n await store.auth.removeCookie('user');\n }\n }\n } else {\n // Если нет initialState, сбрасываем авторизацию (если модуль auth загружен)\n if (store.auth && store.auth.actions) {\n store.auth.actions.resetState();\n // await store.auth.removeCookie('user');\n await store.auth.actions.logout();\n }\n }\n\n const savedPosition = localStorage.getItem('position');\n\n if (savedPosition) {\n store.core.state.position = JSON.parse(savedPosition);\n }\n\n // app.config.globalProperties.$i18n.locale = router.currentRoute.value.params.locale\n // app.config.globalProperties.$i18n.locale = router.currentRoute.value.params.locale\n // If user browser locae supported then change locale\n // if (i18n.global.availableLocales.includes(browserLocale)) {\n // app.config.globalProperties.$i18n.locale = browserLocale;\n // }\n\n performance.mark('loading-24-end');\n performance.measure('loading-24', 'loading-24-start', 'loading-24-end');\n const measure24 = performance.getEntriesByName('loading-24')[0];\n console.log(`[LOADING 24] InitialState parsed and applied in ${measure24?.duration?.toFixed(2)}ms`);\n\n await router.isReady();\n\n // [LOADING 25] Mounting the application\n performance.mark('loading-25-start');\n console.log('[LOADING 25] Mounting the application...');\n\n app.mount('#app');\n\n performance.mark('loading-25-end');\n performance.measure('loading-25', 'loading-25-start', 'loading-25-end');\n const measure25 = performance.getEntriesByName('loading-25')[0];\n console.log(`[LOADING 25] Application mounted in ${measure25?.duration?.toFixed(2)}ms`);\n\n // Return the objects for further use\n return { app, router, store, moduleManager };\n };\n return start();\n}\n\nexport async function render({ url, cookies, headers, ssrContext, createApp }) {\n // [LOADING 26] SSR render starting\n performance.mark('loading-26-start');\n console.log('[LOADING 26] SSR render starting...');\n\n const { app, router, store, meta } = createApp();\n\n await router.push(url);\n await router.isReady();\n\n // If user's language is supported, change the locale\n // if (language === 'en' || language === 'ru') {\n // app.config.globalProperties.$i18n.locale = language\n // }\n\n // app.config.globalProperties.$i18n.locale = router.currentRoute.value.params.locale\n\n const ctx = ssrContext || {};\n\n if (router.currentRoute.value.name?.toLowerCase() === 'notfound') {\n ctx.notFound = true;\n }\n\n let user = null;\n\n if (cookies.user) {\n try {\n user = JSON.parse(cookies.user);\n } catch (error) {\n console.error('Failed to parse user cookie', error);\n user = null;\n }\n }\n\n \n\n\n if (user) {\n // [LOADING 27] SSR auth initialization\n performance.mark('loading-27-start');\n console.log('[LOADING 27] SSR auth initialization...');\n\n if (store.auth && store.auth.actions) {\n try {\n await store.auth.actions.initialize(user);\n } catch (error) {\n console.error('[SSR] Auth initialization failed, continuing without auth:', error);\n // Сбрасываем состояние если инициализация упала\n if (store.auth.actions.resetState) {\n store.auth.actions.resetState();\n }\n }\n } else {\n console.warn('[SSR] Auth module not loaded, cannot initialize user');\n }\n\n performance.mark('loading-27-end');\n performance.measure('loading-27', 'loading-27-start', 'loading-27-end');\n const measure27 = performance.getEntriesByName('loading-27')[0];\n console.log(`[LOADING 27] SSR auth initialized in ${measure27?.duration?.toFixed(2)}ms`);\n } else {\n if (store.auth && store.auth.actions) {\n store.auth.actions.resetState();\n } else {\n console.warn('[SSR] Auth module not loaded, cannot reset state');\n }\n }\n\n // [LOADING 28] SSR renderToString\n performance.mark('loading-28-start');\n console.log('[LOADING 28] SSR renderToString starting...');\n\n // After render, ctx.modules will be populated with used module identifiers\n const html = await renderToString(app, ctx);\n\n // Добавляем атрибуты темы через meta API перед renderSSRHead\n let theme = cookies?.theme;\n if (!theme) {\n // Fallback на sec-ch-prefers-color-scheme если нет cookie\n const prefersColorScheme = headers?.['sec-ch-prefers-color-scheme'];\n theme = prefersColorScheme === 'dark' ? 'system-dark' : 'system';\n }\n\n const themeAttrs = {};\n if (theme === 'dark') {\n themeAttrs.class = 'dark-theme';\n themeAttrs['data-theme'] = 'dark';\n themeAttrs['color-scheme'] = 'dark';\n } else if (theme === 'light') {\n themeAttrs.class = 'light-theme';\n themeAttrs['data-theme'] = 'light';\n themeAttrs['color-scheme'] = 'light';\n } else {\n // system/system-dark - без класса, CSS media query сработает\n themeAttrs['color-scheme'] = 'light dark';\n }\n\n meta.push({ htmlAttrs: themeAttrs });\n\n // Синхронизируем store state с определённой темой для SSR\n store.core.state.theme.mode = (theme === 'dark') ? 'dark'\n : (theme === 'light') ? 'light'\n : 'system';\n\n const payload = await renderSSRHead(meta, {});\n const initialState = await store.getInitialState();\n\n performance.mark('loading-28-end');\n performance.measure('loading-28', 'loading-28-start', 'loading-28-end');\n const measure28 = performance.getEntriesByName('loading-28')[0];\n console.log(`[LOADING 28] SSR renderToString completed in ${measure28?.duration?.toFixed(2)}ms`);\n\n // Total SSR render time\n performance.measure('loading-26-total', 'loading-26-start', 'loading-28-end');\n const measure26Total = performance.getEntriesByName('loading-26-total')[0];\n console.log(`[LOADING 26] Total SSR render completed in ${measure26Total?.duration?.toFixed(2)}ms`);\n\n // Определяем HTTP статус код:\n // 1. Если store.core.state.notFound === true - 404\n // 2. Если роут называется 'notfound' - 404\n // 3. Иначе - 200\n const statusCode = store.core.state.notFound\n ? 404\n : (router.currentRoute?.value?.name?.toLowerCase() === 'notfound' ? 404 : 200);\n\n return {\n html,\n meta: payload,\n state: initialState,\n statusCode,\n usedModules: Array.from(ctx.modules || new Set()), // Return used modules\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { ref, onMounted, onUnmounted, createBlock, openBlock, withCtx, createTextVNode, createCommentVNode, Teleport, createElementBlock, createElementVNode, createVNode } from "vue";
2
2
  import { BarcodeScanner } from "../../../../../../node_modules/.pnpm/@capacitor-mlkit_barcode-scanning@7.3.0_@capacitor_core@7.4.4/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/index.js";
3
- import _sfc_main$1 from "../../../../components/Button/Button.vue.js";
3
+ import _sfc_main$1 from "../../../../components/Button/Button.vue2.js";
4
4
  import { actions } from "../../store/tickets.js";
5
5
  /* empty css */
6
6
  const _hoisted_1 = {
@@ -1,5 +1,5 @@
1
1
  import { createBlock, openBlock, withCtx, createTextVNode, toDisplayString } from "vue";
2
- import _sfc_main$1 from "../../../../components/Button/Button.vue.js";
2
+ import _sfc_main$1 from "../../../../components/Button/Button.vue2.js";
3
3
  import { actions } from "../../store/tickets.js";
4
4
  /* empty css */
5
5
  import _export_sfc from "../../../../../../_virtual/_plugin-vue_export-helper.js";
@@ -12,10 +12,10 @@ import _sfc_main$9 from "../../../../components/Checkbox/Checkbox.vue.js";
12
12
  import "axios";
13
13
  /* empty css */
14
14
  import UploadImage from "../../../../components/UploadImage/UploadImage.vue.js";
15
- /* empty css */
15
+ /* empty css */
16
16
  /* empty css */
17
17
  import _sfc_main$8 from "../../../../components/Feed/Feed.vue.js";
18
- import _sfc_main$a from "../../../../components/Button/Button.vue.js";
18
+ import _sfc_main$a from "../../../../components/Button/Button.vue2.js";
19
19
  import _sfc_main$7 from "../../../core/views/components/blocks/Card.vue.js";
20
20
  import _sfc_main$3 from "../sections/EditTickets.vue.js";
21
21
  import _sfc_main$2 from "../../../icons/navigation/IconDelete.vue.js";
@@ -3,7 +3,7 @@ import _sfc_main$7 from "../../../../components/Feed/Feed.vue.js";
3
3
  import _sfc_main$2 from "../../../../components/Block/Block.vue.js";
4
4
  import _sfc_main$3 from "../../../../components/Popup/Popup.vue.js";
5
5
  import Field from "../../../../components/Field/Field.vue.js";
6
- import _sfc_main$6 from "../../../../components/Button/Button.vue.js";
6
+ import _sfc_main$6 from "../../../../components/Button/Button.vue2.js";
7
7
  import _sfc_main$8 from "../../../../components/Dropdown/Dropdown.vue.js";
8
8
  import _sfc_main$1 from "../elements/ButtonCheck.vue.js";
9
9
  import _sfc_main$5 from "../../../icons/navigation/IconDelete.vue.js";
@@ -49,7 +49,7 @@ const _hoisted_21 = {
49
49
  key: 1,
50
50
  class: "bg-light radius-micro w-2r h-thin"
51
51
  };
52
- const _hoisted_22 = { class: "p-nano fw-medium t-nowrap" };
52
+ const _hoisted_22 = { class: "p-nano fw-medium ws-nowrap" };
53
53
  const _hoisted_23 = ["onClick"];
54
54
  const _hoisted_24 = ["href"];
55
55
  const _hoisted_25 = ["src"];
@@ -370,7 +370,7 @@ const _sfc_main = {
370
370
  createElementVNode("section", _hoisted_30, [
371
371
  createElementVNode("button", {
372
372
  onClick: ($event) => sendTicketEmail(ticket._id),
373
- class: "w-100 t-nowrap bg-black br-1px br-white-transp-20 t-white button-small button"
373
+ class: "w-100 ws-nowrap bg-black br-1px br-white-transp-20 t-white button-small button"
374
374
  }, " Send Email ", 8, _hoisted_31),
375
375
  createElementVNode("button", {
376
376
  onClick: ($event) => copyTicketLink(ticket._id),
@@ -1 +1 @@
1
- {"version":3,"file":"EditEventTickets.vue.js","sources":["../../../../../../../src/modules/events/components/pages/EditEventTickets.vue"],"sourcesContent":["<template>\n <article v-if=\"event\" class=\"pd-thin bg-white\">\n <!-- Header -->\n <header class=\"mn-b-medium flex-v-center flex-nowrap flex\">\n <h2>Tickets</h2>\n <button\n @click=\"openTicketsPopup()\"\n class=\"mn-l-auto radius-small button t-white bg-second\"\n v-html=\"'+ Add'\"\n />\n <ButtonCheck @qrcodecheck=\"fetchTickets = !fetchTickets\" class=\"mn-l-micro radius-small button t-white bg-second\" />\n </header>\n\n <!-- Statistics Cards -->\n <Block v-if=\"stats\" title=\"Statistics\" class=\"mn-b-thin\">\n <div class=\"cols-4 mobile:cols-2 gap-thin\">\n <div class=\"bg-white radius-medium pd-medium\">\n <p class=\"p-small fw-medium t-transp uppercase mn-b-thin\">Total Tickets</p>\n <h2 class=\"h2\">{{ stats.total }}</h2>\n </div>\n <div class=\"bg-white radius-medium pd-medium\">\n <p class=\"p-small fw-medium t-transp uppercase mn-b-thin\">Sold</p>\n <h2 class=\"h2 t-main\">{{ stats.sold }}</h2>\n </div>\n <div class=\"bg-white radius-medium pd-medium\">\n <p class=\"p-small fw-medium t-transp uppercase mn-b-thin\">Free</p>\n <h2 class=\"h2 t-grey\">{{ stats.free }}</h2>\n </div>\n <div class=\"bg-white radius-medium pd-medium\">\n <p class=\"p-small fw-medium t-transp uppercase mn-b-thin\">Refunds</p>\n <h2 class=\"h2 t-red\">{{ stats.refunded }}</h2>\n </div>\n </div>\n </Block>\n\n <!-- Attendance Graph -->\n <div v-if=\"attendance\" class=\"bg-light radius-medium pd-medium mn-b-thin\">\n <h4 class=\"mn-b-small fw-medium\">Attendance Graph</h4>\n\n <!-- General Stats -->\n <div class=\"flex-nowrap flex gap-thin mn-b-medium\">\n <div class=\"bg-white radius-small pd-small\">\n <span class=\"p-micro t-transp uppercase d-block mn-b-thin\">Total</span>\n <p class=\"p-medium fw-medium\">{{ attendance.total }}</p>\n </div>\n <div class=\"bg-white radius-small pd-small\">\n <span class=\"p-micro t-transp uppercase d-block mn-b-thin\">Expected</span>\n <p class=\"p-medium fw-medium\">{{ attendance.expected }}</p>\n </div>\n <div class=\"bg-white radius-small pd-small\">\n <span class=\"p-micro t-transp uppercase d-block mn-b-thin\">Arrived</span>\n <p class=\"p-medium fw-medium t-main\">{{ attendance.arrived }}</p>\n </div>\n </div>\n\n <!-- Timeline Graph -->\n <div v-if=\"attendance.timeline && attendance.timeline.length\" class=\"flex-nowrap flex flex-justify-around gap-micro scroll-hide o-y-hidden o-x-scroll mn-t-big\">\n <div\n v-for=\"slot in attendance.timeline\"\n :key=\"slot.time\"\n class=\"flex-column flex-v-center flex gap-micro flex-shrink-0\"\n >\n <div\n v-if=\"maxCount > 0\"\n class=\"bg-second radius-micro w-2r\"\n :style=\"{ height: `${Math.max((slot.count / maxCount) * 10, 0.5)}rem` }\"\n ></div>\n <div\n v-else\n class=\"bg-light radius-micro w-2r h-thin\"\n ></div>\n <p class=\"p-nano fw-medium t-nowrap\">{{ slot.time }}</p>\n </div>\n </div>\n </div>\n\n <!-- Add Tickets Popup -->\n <Popup\n @close-popup=\"closeTicketsPopup\"\n :isPopupOpen=\"isOpenTicketsPopup\"\n class=\"w-max-40r\"\n >\n <Block\n title=\"Add tickets\"\n placeholder=\"No parameters added yet\"\n class=\"cols-1 mn-b-thin gap-thin\"\n >\n <div\n class=\"gap-thin flex-nowrap flex\"\n v-for=\"(item, index) in newTickets\"\n :key=\"index\"\n >\n <Field\n v-model:field=\"item.name\"\n placeholder=\"Name\"\n class=\"w-50 bg-white radius-small pd-medium\"\n />\n <Field\n v-model:field=\"item.seat\"\n placeholder=\"Seat\"\n class=\"w-50 bg-white radius-small pd-medium\"\n />\n <Field\n v-model:field=\"item.email\"\n placeholder=\"Email\"\n class=\"w-100 bg-white radius-small pd-medium\"\n />\n\n <Field\n v-model:field=\"item.quantity\"\n placeholder=\"Quantity\"\n type=\"number\"\n class=\"w-25 bg-white radius-small pd-medium\"\n />\n\n <div v-if=\"index < 1\" @click=\"() => newTickets.push({name: '', value: '', target: event._id, type: 'event', quantity: 1})\" class=\"radius-small h-100 i-big flex-center flex aspect-1x1 bg-green\">\n <IconAdd\n class=\"i-medium\"\n :fill=\"'rgb(var(--white))'\"\n />\n </div>\n <div v-else @click=\"() => newTickets.splice(index, 1)\" class=\"radius-small h-100 i-big flex-center flex aspect-1x1 bg-red\">\n <IconDelete\n class=\"i-medium\"\n :fill=\"'rgb(var(--white))'\"\n />\n </div>\n </div>\n\n <Button\n :submit=\"onSubmit\"\n :callback=\"closeTicketsPopup\"\n class=\"w-100 bg-black t-white\"\n >\n Create Tickets\n </Button>\n </Block>\n </Popup>\n\n <!-- Tickets List -->\n <Feed\n :search=\"true\"\n :states=\"{\n empty: {\n title: 'No Tickets Found',\n description: 'Currently, there are no tickets.'\n }\n }\"\n :store=\"{\n read: (options) => tickets.actions.read(options),\n state: null\n }\"\n :options=\"{\n target: event._id\n }\"\n :external=\"fetchTickets\"\n v-slot=\"{ items }\"\n >\n <div\n v-for=\"(ticket, index) in items\"\n :key=\"index\"\n class=\"radius-medium bg-light gap-thin pd-medium flex-v-center flex-nowrap flex pos-relative mn-b-thin mobile:flex-v-start\"\n >\n <!-- QR Code - clickable PDF -->\n <a :href=\"ticket.image\" target=\"_blank\" class=\"flex-shrink-0\">\n <img loading=\"lazy\" :src=\"ticket.qrcode\" class=\"radius-small h-5r w-5r\">\n </a>\n\n <!-- Ticket Info -->\n <div class=\"w-100 o-hidden\">\n <h4 class=\"mn-b-thin flex-nowrap flex gap-thin\">\n <span>{{ ticket.client_refactor?.name || 'No name' }}</span><span v-if=\"ticket.seat\" class=\"pd-thin radius-micro p-small bg-second t-white\"> {{ ticket.seat }}</span>\n </h4>\n <p class=\"p-small t-transp mn-b-thin\">\n {{ ticket.client_refactor?.email || 'No email' }}\n </p>\n <span\n class=\"pd-thin radius-extra t-white fw-medium d-block w-max uppercase p-nano\"\n :class=\"{\n 'bg-main': ticket.status === 'unused',\n 'bg-grey': ticket.status === 'used',\n 'bg-red': ticket.status === 'deactivated'\n }\"\n >\n {{ ticket.status }}\n </span>\n </div>\n\n <!-- Actions -->\n <Dropdown\n :label=\"{ component: IconEllipsis, class: 't-transp i-regular' }\"\n :align=\"'right'\"\n class=\"cursor-pointer radius-small pd-small bg-white flex-shrink-0\"\n >\n <section class=\"bg-black flex-column flex gap-thin pd-thin radius-small\">\n <button\n @click=\"sendTicketEmail(ticket._id)\"\n class=\"w-100 t-nowrap bg-black br-1px br-white-transp-20 t-white button-small button\"\n >\n Send Email\n </button>\n\n <button\n @click=\"copyTicketLink(ticket._id)\"\n class=\"w-100 bg-black br-1px br-white-transp-20 t-white button-small button\"\n >\n Copy Link\n </button>\n\n <button\n v-if=\"ticket.status !== 'deactivated'\"\n @click=\"changeStatus(ticket, 'deactivated')\"\n class=\"w-100 bg-black br-1px br-white-transp-20 t-white button-small button\"\n >\n Deactivate\n </button>\n\n <button\n v-if=\"ticket.status === 'deactivated' || ticket.status === 'used'\"\n @click=\"changeStatus(ticket, 'unused')\"\n class=\"w-100 bg-black br-1px br-white-transp-20 t-white button-small button\"\n >\n Activate\n </button>\n </section>\n </Dropdown>\n </div>\n </Feed>\n </article>\n</template>\n\n<script setup>\nimport Feed from '@martyrs/src/components/Feed/Feed.vue';\nimport Block from '@martyrs/src/components/Block/Block.vue';\nimport Popup from \"@martyrs/src/components/Popup/Popup.vue\";\nimport Field from '@martyrs/src/components/Field/Field.vue';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue';\n\nimport ButtonCheck from '@martyrs/src/modules/events/components/elements/ButtonCheck.vue';\n\nimport IconDelete from '@martyrs/src/modules/icons/navigation/IconDelete.vue';\nimport IconAdd from '@martyrs/src/modules/icons/navigation/IconAdd.vue';\nimport IconFile from '@martyrs/src/modules/icons/entities/IconFile.vue';\nimport IconEmail from '@martyrs/src/modules/icons/entities/IconEmail.vue';\nimport IconAttach from '@martyrs/src/modules/icons/navigation/IconAttach.vue';\nimport IconDuplicate from '@martyrs/src/modules/icons/actions/IconDuplicate.vue';\nimport IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue';\n\nimport { ref, onMounted, computed } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\n\nimport * as events from '@martyrs/src/modules/events/store/events.js';\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\nimport * as tickets from '@martyrs/src/modules/events/store/tickets.js';\nimport { setSnack } from '@martyrs/src/modules/core/views/store/core.store.js';\n\nimport { useGlobalMixins } from \"@martyrs/src/modules/core/views/mixins/mixins.js\";\n\nconst { hasAccess } = useGlobalMixins();\n\nconst route = useRoute();\nconst router = useRouter();\n\nlet event = ref(null);\nconst stats = ref(null);\nconst attendance = ref(null);\n\nconst newTickets = ref([{\n name: '',\n email: '',\n target: null,\n type: 'event',\n seat: '',\n quantity: 1,\n}]);\n\nconst isOpenTicketsPopup = ref(false);\n\nfunction openTicketsPopup() {\n isOpenTicketsPopup.value = true;\n\n newTickets.value = [{\n name: '',\n email: '',\n target: event.value?._id,\n type: 'event',\n seat: '',\n quantity: 1,\n }];\n}\n\nfunction closeTicketsPopup() {\n isOpenTicketsPopup.value = false;\n}\n\nconst fetchTickets = ref(false);\n\n// Computed for max count in timeline\nconst maxCount = computed(() => {\n if (!attendance.value?.timeline) return 0;\n return Math.max(...attendance.value.timeline.map(slot => slot.count), 1);\n});\n\nonMounted(async () => {\n const data = await events.read({ user: auth.state.user._id, url: route.params.url });\n\n event.value = data.pop();\n\n if (!event.value) {\n router.push({name: 'notfound'});\n }\n\n if (event.value.owner.type === 'organization') {\n const isAccess = hasAccess(event.value.owner.target._id, 'events', 'edit', auth.state.accesses, auth.state.access.roles);\n\n if (!isAccess) {\n router.push({name: 'unauthorized'});\n }\n } else {\n if (event.value.creator.target._id !== auth.state.user._id) {\n router.push({name: 'unauthorized'});\n }\n }\n\n // Load statistics\n try {\n stats.value = await tickets.actions.getStats(event.value._id);\n attendance.value = await tickets.actions.getAttendance(event.value._id);\n } catch (error) {\n console.error('Error loading stats:', error);\n }\n});\n\nasync function onSubmit() {\n try {\n const response = await tickets.actions.create(newTickets.value);\n fetchTickets.value = !fetchTickets.value;\n\n // Refresh stats\n stats.value = await tickets.actions.getStats(event.value._id);\n attendance.value = await tickets.actions.getAttendance(event.value._id);\n } catch (error) {\n console.log(error);\n }\n}\n\nasync function changeStatus(ticket, status) {\n if (confirm('Are you sure you want to change ticket status?')) {\n try {\n const response = await tickets.actions.update({ ...ticket, status: status });\n fetchTickets.value = !fetchTickets.value;\n\n // Refresh stats\n stats.value = await tickets.actions.getStats(event.value._id);\n attendance.value = await tickets.actions.getAttendance(event.value._id);\n } catch (error) {\n console.error(error);\n }\n }\n}\n\nfunction viewPdf(ticket) {\n if (ticket.image) {\n window.open(ticket.image, '_blank');\n } else {\n alert('PDF not available for this ticket');\n }\n}\n\nasync function sendTicketEmail(ticketId) {\n try {\n await tickets.actions.sendEmail(ticketId);\n alert('Ticket sent successfully!');\n } catch (error) {\n console.error('Error sending email:', error);\n alert('Failed to send ticket');\n }\n}\n\nfunction copyTicketLink(ticketId) {\n const link = `${window.location.origin}/tickets/${ticketId}`;\n navigator.clipboard.writeText(link);\n setSnack('Link copied to clipboard');\n}\n\nfunction redirectTo() {\n // Placeholder callback\n}\n</script>\n\n<style lang=\"scss\">\n .dp__input {\n border: 0;\n padding: var(--medium);\n padding-left: 3rem;\n background: rgb(var(--grey))\n }\n</style>\n"],"names":["events.read","auth.state","tickets.actions"],"mappings":"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"}
1
+ {"version":3,"file":"EditEventTickets.vue.js","sources":["../../../../../../../src/modules/events/components/pages/EditEventTickets.vue"],"sourcesContent":["<template>\n <article v-if=\"event\" class=\"pd-thin bg-white\">\n <!-- Header -->\n <header class=\"mn-b-medium flex-v-center flex-nowrap flex\">\n <h2>Tickets</h2>\n <button\n @click=\"openTicketsPopup()\"\n class=\"mn-l-auto radius-small button t-white bg-second\"\n v-html=\"'+ Add'\"\n />\n <ButtonCheck @qrcodecheck=\"fetchTickets = !fetchTickets\" class=\"mn-l-micro radius-small button t-white bg-second\" />\n </header>\n\n <!-- Statistics Cards -->\n <Block v-if=\"stats\" title=\"Statistics\" class=\"mn-b-thin\">\n <div class=\"cols-4 mobile:cols-2 gap-thin\">\n <div class=\"bg-white radius-medium pd-medium\">\n <p class=\"p-small fw-medium t-transp uppercase mn-b-thin\">Total Tickets</p>\n <h2 class=\"h2\">{{ stats.total }}</h2>\n </div>\n <div class=\"bg-white radius-medium pd-medium\">\n <p class=\"p-small fw-medium t-transp uppercase mn-b-thin\">Sold</p>\n <h2 class=\"h2 t-main\">{{ stats.sold }}</h2>\n </div>\n <div class=\"bg-white radius-medium pd-medium\">\n <p class=\"p-small fw-medium t-transp uppercase mn-b-thin\">Free</p>\n <h2 class=\"h2 t-grey\">{{ stats.free }}</h2>\n </div>\n <div class=\"bg-white radius-medium pd-medium\">\n <p class=\"p-small fw-medium t-transp uppercase mn-b-thin\">Refunds</p>\n <h2 class=\"h2 t-red\">{{ stats.refunded }}</h2>\n </div>\n </div>\n </Block>\n\n <!-- Attendance Graph -->\n <div v-if=\"attendance\" class=\"bg-light radius-medium pd-medium mn-b-thin\">\n <h4 class=\"mn-b-small fw-medium\">Attendance Graph</h4>\n\n <!-- General Stats -->\n <div class=\"flex-nowrap flex gap-thin mn-b-medium\">\n <div class=\"bg-white radius-small pd-small\">\n <span class=\"p-micro t-transp uppercase d-block mn-b-thin\">Total</span>\n <p class=\"p-medium fw-medium\">{{ attendance.total }}</p>\n </div>\n <div class=\"bg-white radius-small pd-small\">\n <span class=\"p-micro t-transp uppercase d-block mn-b-thin\">Expected</span>\n <p class=\"p-medium fw-medium\">{{ attendance.expected }}</p>\n </div>\n <div class=\"bg-white radius-small pd-small\">\n <span class=\"p-micro t-transp uppercase d-block mn-b-thin\">Arrived</span>\n <p class=\"p-medium fw-medium t-main\">{{ attendance.arrived }}</p>\n </div>\n </div>\n\n <!-- Timeline Graph -->\n <div v-if=\"attendance.timeline && attendance.timeline.length\" class=\"flex-nowrap flex flex-justify-around gap-micro scroll-hide o-y-hidden o-x-scroll mn-t-big\">\n <div\n v-for=\"slot in attendance.timeline\"\n :key=\"slot.time\"\n class=\"flex-column flex-v-center flex gap-micro flex-shrink-0\"\n >\n <div\n v-if=\"maxCount > 0\"\n class=\"bg-second radius-micro w-2r\"\n :style=\"{ height: `${Math.max((slot.count / maxCount) * 10, 0.5)}rem` }\"\n ></div>\n <div\n v-else\n class=\"bg-light radius-micro w-2r h-thin\"\n ></div>\n <p class=\"p-nano fw-medium ws-nowrap\">{{ slot.time }}</p>\n </div>\n </div>\n </div>\n\n <!-- Add Tickets Popup -->\n <Popup\n @close-popup=\"closeTicketsPopup\"\n :isPopupOpen=\"isOpenTicketsPopup\"\n class=\"w-max-40r\"\n >\n <Block\n title=\"Add tickets\"\n placeholder=\"No parameters added yet\"\n class=\"cols-1 mn-b-thin gap-thin\"\n >\n <div\n class=\"gap-thin flex-nowrap flex\"\n v-for=\"(item, index) in newTickets\"\n :key=\"index\"\n >\n <Field\n v-model:field=\"item.name\"\n placeholder=\"Name\"\n class=\"w-50 bg-white radius-small pd-medium\"\n />\n <Field\n v-model:field=\"item.seat\"\n placeholder=\"Seat\"\n class=\"w-50 bg-white radius-small pd-medium\"\n />\n <Field\n v-model:field=\"item.email\"\n placeholder=\"Email\"\n class=\"w-100 bg-white radius-small pd-medium\"\n />\n\n <Field\n v-model:field=\"item.quantity\"\n placeholder=\"Quantity\"\n type=\"number\"\n class=\"w-25 bg-white radius-small pd-medium\"\n />\n\n <div v-if=\"index < 1\" @click=\"() => newTickets.push({name: '', value: '', target: event._id, type: 'event', quantity: 1})\" class=\"radius-small h-100 i-big flex-center flex aspect-1x1 bg-green\">\n <IconAdd\n class=\"i-medium\"\n :fill=\"'rgb(var(--white))'\"\n />\n </div>\n <div v-else @click=\"() => newTickets.splice(index, 1)\" class=\"radius-small h-100 i-big flex-center flex aspect-1x1 bg-red\">\n <IconDelete\n class=\"i-medium\"\n :fill=\"'rgb(var(--white))'\"\n />\n </div>\n </div>\n\n <Button\n :submit=\"onSubmit\"\n :callback=\"closeTicketsPopup\"\n class=\"w-100 bg-black t-white\"\n >\n Create Tickets\n </Button>\n </Block>\n </Popup>\n\n <!-- Tickets List -->\n <Feed\n :search=\"true\"\n :states=\"{\n empty: {\n title: 'No Tickets Found',\n description: 'Currently, there are no tickets.'\n }\n }\"\n :store=\"{\n read: (options) => tickets.actions.read(options),\n state: null\n }\"\n :options=\"{\n target: event._id\n }\"\n :external=\"fetchTickets\"\n v-slot=\"{ items }\"\n >\n <div\n v-for=\"(ticket, index) in items\"\n :key=\"index\"\n class=\"radius-medium bg-light gap-thin pd-medium flex-v-center flex-nowrap flex pos-relative mn-b-thin mobile:flex-v-start\"\n >\n <!-- QR Code - clickable PDF -->\n <a :href=\"ticket.image\" target=\"_blank\" class=\"flex-shrink-0\">\n <img loading=\"lazy\" :src=\"ticket.qrcode\" class=\"radius-small h-5r w-5r\">\n </a>\n\n <!-- Ticket Info -->\n <div class=\"w-100 o-hidden\">\n <h4 class=\"mn-b-thin flex-nowrap flex gap-thin\">\n <span>{{ ticket.client_refactor?.name || 'No name' }}</span><span v-if=\"ticket.seat\" class=\"pd-thin radius-micro p-small bg-second t-white\"> {{ ticket.seat }}</span>\n </h4>\n <p class=\"p-small t-transp mn-b-thin\">\n {{ ticket.client_refactor?.email || 'No email' }}\n </p>\n <span\n class=\"pd-thin radius-extra t-white fw-medium d-block w-max uppercase p-nano\"\n :class=\"{\n 'bg-main': ticket.status === 'unused',\n 'bg-grey': ticket.status === 'used',\n 'bg-red': ticket.status === 'deactivated'\n }\"\n >\n {{ ticket.status }}\n </span>\n </div>\n\n <!-- Actions -->\n <Dropdown\n :label=\"{ component: IconEllipsis, class: 't-transp i-regular' }\"\n :align=\"'right'\"\n class=\"cursor-pointer radius-small pd-small bg-white flex-shrink-0\"\n >\n <section class=\"bg-black flex-column flex gap-thin pd-thin radius-small\">\n <button\n @click=\"sendTicketEmail(ticket._id)\"\n class=\"w-100 ws-nowrap bg-black br-1px br-white-transp-20 t-white button-small button\"\n >\n Send Email\n </button>\n\n <button\n @click=\"copyTicketLink(ticket._id)\"\n class=\"w-100 bg-black br-1px br-white-transp-20 t-white button-small button\"\n >\n Copy Link\n </button>\n\n <button\n v-if=\"ticket.status !== 'deactivated'\"\n @click=\"changeStatus(ticket, 'deactivated')\"\n class=\"w-100 bg-black br-1px br-white-transp-20 t-white button-small button\"\n >\n Deactivate\n </button>\n\n <button\n v-if=\"ticket.status === 'deactivated' || ticket.status === 'used'\"\n @click=\"changeStatus(ticket, 'unused')\"\n class=\"w-100 bg-black br-1px br-white-transp-20 t-white button-small button\"\n >\n Activate\n </button>\n </section>\n </Dropdown>\n </div>\n </Feed>\n </article>\n</template>\n\n<script setup>\nimport Feed from '@martyrs/src/components/Feed/Feed.vue';\nimport Block from '@martyrs/src/components/Block/Block.vue';\nimport Popup from \"@martyrs/src/components/Popup/Popup.vue\";\nimport Field from '@martyrs/src/components/Field/Field.vue';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue';\n\nimport ButtonCheck from '@martyrs/src/modules/events/components/elements/ButtonCheck.vue';\n\nimport IconDelete from '@martyrs/src/modules/icons/navigation/IconDelete.vue';\nimport IconAdd from '@martyrs/src/modules/icons/navigation/IconAdd.vue';\nimport IconFile from '@martyrs/src/modules/icons/entities/IconFile.vue';\nimport IconEmail from '@martyrs/src/modules/icons/entities/IconEmail.vue';\nimport IconAttach from '@martyrs/src/modules/icons/navigation/IconAttach.vue';\nimport IconDuplicate from '@martyrs/src/modules/icons/actions/IconDuplicate.vue';\nimport IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue';\n\nimport { ref, onMounted, computed } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\n\nimport * as events from '@martyrs/src/modules/events/store/events.js';\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\nimport * as tickets from '@martyrs/src/modules/events/store/tickets.js';\nimport { setSnack } from '@martyrs/src/modules/core/views/store/core.store.js';\n\nimport { useGlobalMixins } from \"@martyrs/src/modules/core/views/mixins/mixins.js\";\n\nconst { hasAccess } = useGlobalMixins();\n\nconst route = useRoute();\nconst router = useRouter();\n\nlet event = ref(null);\nconst stats = ref(null);\nconst attendance = ref(null);\n\nconst newTickets = ref([{\n name: '',\n email: '',\n target: null,\n type: 'event',\n seat: '',\n quantity: 1,\n}]);\n\nconst isOpenTicketsPopup = ref(false);\n\nfunction openTicketsPopup() {\n isOpenTicketsPopup.value = true;\n\n newTickets.value = [{\n name: '',\n email: '',\n target: event.value?._id,\n type: 'event',\n seat: '',\n quantity: 1,\n }];\n}\n\nfunction closeTicketsPopup() {\n isOpenTicketsPopup.value = false;\n}\n\nconst fetchTickets = ref(false);\n\n// Computed for max count in timeline\nconst maxCount = computed(() => {\n if (!attendance.value?.timeline) return 0;\n return Math.max(...attendance.value.timeline.map(slot => slot.count), 1);\n});\n\nonMounted(async () => {\n const data = await events.read({ user: auth.state.user._id, url: route.params.url });\n\n event.value = data.pop();\n\n if (!event.value) {\n router.push({name: 'notfound'});\n }\n\n if (event.value.owner.type === 'organization') {\n const isAccess = hasAccess(event.value.owner.target._id, 'events', 'edit', auth.state.accesses, auth.state.access.roles);\n\n if (!isAccess) {\n router.push({name: 'unauthorized'});\n }\n } else {\n if (event.value.creator.target._id !== auth.state.user._id) {\n router.push({name: 'unauthorized'});\n }\n }\n\n // Load statistics\n try {\n stats.value = await tickets.actions.getStats(event.value._id);\n attendance.value = await tickets.actions.getAttendance(event.value._id);\n } catch (error) {\n console.error('Error loading stats:', error);\n }\n});\n\nasync function onSubmit() {\n try {\n const response = await tickets.actions.create(newTickets.value);\n fetchTickets.value = !fetchTickets.value;\n\n // Refresh stats\n stats.value = await tickets.actions.getStats(event.value._id);\n attendance.value = await tickets.actions.getAttendance(event.value._id);\n } catch (error) {\n console.log(error);\n }\n}\n\nasync function changeStatus(ticket, status) {\n if (confirm('Are you sure you want to change ticket status?')) {\n try {\n const response = await tickets.actions.update({ ...ticket, status: status });\n fetchTickets.value = !fetchTickets.value;\n\n // Refresh stats\n stats.value = await tickets.actions.getStats(event.value._id);\n attendance.value = await tickets.actions.getAttendance(event.value._id);\n } catch (error) {\n console.error(error);\n }\n }\n}\n\nfunction viewPdf(ticket) {\n if (ticket.image) {\n window.open(ticket.image, '_blank');\n } else {\n alert('PDF not available for this ticket');\n }\n}\n\nasync function sendTicketEmail(ticketId) {\n try {\n await tickets.actions.sendEmail(ticketId);\n alert('Ticket sent successfully!');\n } catch (error) {\n console.error('Error sending email:', error);\n alert('Failed to send ticket');\n }\n}\n\nfunction copyTicketLink(ticketId) {\n const link = `${window.location.origin}/tickets/${ticketId}`;\n navigator.clipboard.writeText(link);\n setSnack('Link copied to clipboard');\n}\n\nfunction redirectTo() {\n // Placeholder callback\n}\n</script>\n\n<style lang=\"scss\">\n .dp__input {\n border: 0;\n padding: var(--medium);\n padding-left: 3rem;\n background: rgb(var(--grey))\n }\n</style>\n"],"names":["events.read","auth.state","tickets.actions"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { ref, onMounted, createElementBlock, openBlock, createVNode, TransitionGroup, withCtx, createCommentVNode, createBlock, Fragment, renderList, unref, createElementVNode, toDisplayString, createTextVNode } from "vue";
2
- /* empty css */
2
+ /* empty css */
3
3
  import _sfc_main$2 from "../../../constructor/components/sections/Viewer.vue.js";
4
4
  import _sfc_main$4 from "../../../../components/Countdown/Countdown.vue.js";
5
5
  import HeroEvent from "../sections/HeroEvent.vue.js";
@@ -20,6 +20,7 @@ import SkeletonEvent from "../../../icons/skeletons/SkeletonEvent.vue.js";
20
20
  /* empty css */
21
21
  /* empty css */
22
22
  /* empty css */
23
+ /* empty css */
23
24
  /* empty css */
24
25
  import ButtonJoin from "../elements/ButtonJoin.vue.js";
25
26
  import _sfc_main$5 from "../../../community/components/sections/Comments.vue.js";
@@ -1 +1 @@
1
- {"version":3,"file":"Event.vue.js","sources":["../../../../../../../src/modules/events/components/pages/Event.vue"],"sourcesContent":["<template>\n <section id=\"eventPage\">\n <TransitionGroup tag=\"ul\" name=\"fade\" class=\"bg-light\">\n <SkeletonEvent\n v-if=\"isLoading\"\n v-for=\"i in 3\" :key=\"i\"\n />\n\n <HeroEvent\n v-if=\"!isLoading && event &&event.cover\"\n :content=\"{\n title: event.name,\n ticketLinkStripe: event.ticketLinkStripe,\n cover: event.cover,\n subtitle: event.subtitle,\n }\"\n :options=\"{\n date: event.date.start,\n }\"\n class=\"o-hidden\"\n />\n\n <div class=\"cols-[2fr_1fr] mobile:cols-1 gap-small bg-white t-black pd-t-zero mobile:pd-small pd-extra\" v-if=\"!isLoading && event\"> \n \n <div class=\"bg-light mobile:pd-medium pd-big radius-big\">\n\n <h1 class=\"z-index-1 mn-b-semi\">\n {{event?.name}}\n </h1>\n\n <div class=\"flex flex-wrap gap-micro fw-medium p-medium mn-b-semi justify-start align-center\">\n <span v-if=\"event.date?.start\" class=\"mn-r-nano d-inline-block w-max pd-b-micro pd-t-micro pd-r-thin pd-l-thin radius-small fw-medium bg-white\">\n <IconDate :fill=\"'rgb(var(--black))'\" class=\"w-1r h-auto\"/>\n {{formatDate(event.date.start, locale)}}\n </span>\n\n\n <span\n v-for=\"(chip, index) in event.tags\"\n :key=\"index\"\n class=\"d-inline-flex pd-b-micro pd-t-micro pd-r-thin pd-l-thin radius-small bg-main\"\n >\n {{ chip }}\n </span>\n </div>\n\n <p class=\"z-index-1 p-medium mn-b-semi\">\n {{event?.description}}\n </p>\n\n <hr v-if=\"event?.content?.length > 0\" class=\"bg-black-transp-10 mn-b-semi mn-t-semi d-block\">\n\n <Viewer\n v-if=\"event && event.content\"\n :content=\"event.content\"\n :notitle=\"true\"\n />\n\n </div>\n\n <div class=\"\">\n \n <div class=\"radius-semi pd-medium bg-light mn-b-thin\">\n\n <div class=\"mn-b-small flex-nowrap flex-v-center flex pos-relative\">\n <h4 class=\"mn-r-auto\">Tickets</h4>\n <PhotoStack\n :number=\"event.numberOfTickets\"\n :photos=\"event.participantsPhotos\" \n />\n </div>\n <div v-if=\"event?.ticketsTypes?.length > 0\" v-for=\"ticketType in event.ticketsTypes\" class=\"pd-medium w-100 radius-medium bg-white mn-b-small\">\n <div class=\"flex-nowrap mn-b-small p-medium flex\">\n <span class=\"mn-r-auto\">{{ticketType.name}}</span>\n <span class=\"fw-medium\">{{ticketType.price}} {{returnCurrency()}}</span>\n </div>\n <a :href=\"ticketType.link\" class=\"d-block t-center pd-l-medium pd-r-medium pd-t-small pd-b-small radius-extra uppercase fw-medium t-white w-100 bg-second \">\n Buy Now\n </a>\n </div>\n\n <ButtonJoin \n v-if=\"auth.state.user._id && !event?.ticketsTypes?.length > 0\"\n :type=\"'event'\" \n :hasTicket=\"event.hasTicket\" \n :targetId=\"event._id\" \n :userId=\"auth.state.user._id\"\n class=\" w-100 pd-medium mn-auto\"\n @updateTicket=\"handleTicketUpdate\"\n />\n\n <p v-if=\"event?.ticketsTypes.length > 0\" class=\"z-index-1 t-transp p-small mn-t-small \">Buy ticket online with special price:</p>\n <Countdown \n v-if=\"event?.date?.start && event?.ticketsTypes?.length > 0\"\n class=\"mn-t-thin radius-medium bg-white w-100\"\n :date=\"event?.date?.start\"\n />\n </div>\n\n\n </div>\n\n <Comments \n v-if=\"!isLoading && event\" \n :type=\"'event'\" \n :target=\"event._id\" \n :owner=\"auth.state.user._id\"\n class=\"bg-light radius-medium mobile:radius-zero pd-medium\"\n />\n\n </div>\n \n </TransitionGroup> \n\n </section>\n</template>\n\n<script setup>\nimport { ref, onMounted } from 'vue';\n\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport Chips from '@martyrs/src/components/Chips/Chips.vue';\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\n\nimport Viewer from '@martyrs/src/modules/constructor/components/sections/Viewer.vue';\n\nimport Countdown from \"@martyrs/src/components/Countdown/Countdown.vue\";\n\nimport HeroEvent from '@martyrs/src/modules/events/components/sections/HeroEvent.vue';\n\nimport PhotoStack from \"@martyrs/src/modules/core/views/components/elements/PhotoStack.vue\";\n\nimport { SkeletonEvent, IconDate } from '@martyrs/src/modules/icons/icons.client.js';\n\nimport ButtonJoin from '@martyrs/src/modules/events/components/elements/ButtonJoin.vue';\nimport Comments from '@martyrs/src/modules/community/components/sections/Comments.vue';\n\nimport Image from '@martyrs/src/modules/constructor/components/elements/Image.vue';\nimport User from '@martyrs/src/modules/auth/views/components/blocks/CardUser.vue';\n\nimport * as events from '@martyrs/src/modules/events/store/events.js';\nimport * as tickets from '@martyrs/src/modules/events/store/tickets.js';\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\n\nimport { useRoute } from 'vue-router';\nimport { useI18n } from 'vue-i18n';\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\nconst route = useRoute();\nconst { locale } = useI18n();\nconst { returnCurrency, formatDate } = useGlobalMixins();\nconst qrcode = ref(null);\n\nconst handleTicketUpdate = ({ ticket, hasTicket, targetId }) => {\n tickets.mutations.handleTicketUpdate(event.value, ticket, hasTicket, targetId);\n console.log('HANDLE TICKET UPDATE', ticket, event.value);\n qrcode.value = ticket.qrcode;\n};\n\nfunction clickBuyTicket() {\n gtag('event', 'buy_ticket', {\n 'event_category': 'conversion',\n 'event_label': 'Buy Ticket'\n });\n}\n\nconst event = ref(null);\nconst isLoading = ref(true);\n\nonMounted(async () => {\n isLoading.value = true;\n\n const data = await events.read({\n user: auth.state.user._id,\n url: route.params.url\n });\n\n event.value = data[0];\n isLoading.value = false;\n});\n</script>\n\n\n<style>\n #eventPage {\n display: block;\n }\n</style>"],"names":["tickets.mutations","events.read","auth.state"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoJA,UAAM,QAAQ,SAAQ;AACtB,UAAM,EAAE,OAAM,IAAK,QAAO;AAC1B,UAAM,EAAE,gBAAgB,WAAU,IAAK,gBAAe;AACtD,UAAM,SAAS,IAAI,IAAI;AAEvB,UAAM,qBAAqB,CAAC,EAAE,QAAQ,WAAW,SAAQ,MAAO;AAC9DA,gBAAkB,mBAAmB,MAAM,OAAO,QAAQ,WAAW,QAAQ;AAC7E,cAAQ,IAAI,wBAAwB,QAAQ,MAAM,KAAK;AACvD,aAAO,QAAQ,OAAO;AAAA,IACxB;AASA,UAAM,QAAQ,IAAI,IAAI;AACtB,UAAM,YAAY,IAAI,IAAI;AAE1B,cAAU,YAAY;AACnB,gBAAU,QAAQ;AAElB,YAAM,OAAO,MAAMC,KAAY;AAAA,QAC5B,MAAMC,MAAW,KAAK;AAAA,QACtB,KAAK,MAAM,OAAO;AAAA,MACxB,CAAI;AAED,YAAM,QAAQ,KAAK,CAAC;AACpB,gBAAU,QAAQ;AAAA,IACrB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Event.vue.js","sources":["../../../../../../../src/modules/events/components/pages/Event.vue"],"sourcesContent":["<template>\n <section id=\"eventPage\">\n <TransitionGroup tag=\"ul\" name=\"fade\" class=\"bg-light\">\n <SkeletonEvent\n v-if=\"isLoading\"\n v-for=\"i in 3\" :key=\"i\"\n />\n\n <HeroEvent\n v-if=\"!isLoading && event &&event.cover\"\n :content=\"{\n title: event.name,\n ticketLinkStripe: event.ticketLinkStripe,\n cover: event.cover,\n subtitle: event.subtitle,\n }\"\n :options=\"{\n date: event.date.start,\n }\"\n class=\"o-hidden\"\n />\n\n <div class=\"cols-[2fr_1fr] mobile:cols-1 gap-small bg-white t-black pd-t-zero mobile:pd-small pd-extra\" v-if=\"!isLoading && event\"> \n \n <div class=\"bg-light mobile:pd-medium pd-big radius-big\">\n\n <h1 class=\"z-index-1 mn-b-semi\">\n {{event?.name}}\n </h1>\n\n <div class=\"flex flex-wrap gap-micro fw-medium p-medium mn-b-semi justify-start align-center\">\n <span v-if=\"event.date?.start\" class=\"mn-r-nano d-inline-block w-max pd-b-micro pd-t-micro pd-r-thin pd-l-thin radius-small fw-medium bg-white\">\n <IconDate :fill=\"'rgb(var(--black))'\" class=\"w-1r h-auto\"/>\n {{formatDate(event.date.start, locale)}}\n </span>\n\n\n <span\n v-for=\"(chip, index) in event.tags\"\n :key=\"index\"\n class=\"d-inline-flex pd-b-micro pd-t-micro pd-r-thin pd-l-thin radius-small bg-main\"\n >\n {{ chip }}\n </span>\n </div>\n\n <p class=\"z-index-1 p-medium mn-b-semi\">\n {{event?.description}}\n </p>\n\n <hr v-if=\"event?.content?.length > 0\" class=\"bg-black-transp-10 mn-b-semi mn-t-semi d-block\">\n\n <Viewer\n v-if=\"event && event.content\"\n :content=\"event.content\"\n :notitle=\"true\"\n />\n\n </div>\n\n <div class=\"\">\n \n <div class=\"radius-semi pd-medium bg-light mn-b-thin\">\n\n <div class=\"mn-b-small flex-nowrap flex-v-center flex pos-relative\">\n <h4 class=\"mn-r-auto\">Tickets</h4>\n <PhotoStack\n :number=\"event.numberOfTickets\"\n :photos=\"event.participantsPhotos\" \n />\n </div>\n <div v-if=\"event?.ticketsTypes?.length > 0\" v-for=\"ticketType in event.ticketsTypes\" class=\"pd-medium w-100 radius-medium bg-white mn-b-small\">\n <div class=\"flex-nowrap mn-b-small p-medium flex\">\n <span class=\"mn-r-auto\">{{ticketType.name}}</span>\n <span class=\"fw-medium\">{{ticketType.price}} {{returnCurrency()}}</span>\n </div>\n <a :href=\"ticketType.link\" class=\"d-block t-center pd-l-medium pd-r-medium pd-t-small pd-b-small radius-extra uppercase fw-medium t-white w-100 bg-second \">\n Buy Now\n </a>\n </div>\n\n <ButtonJoin \n v-if=\"auth.state.user._id && !event?.ticketsTypes?.length > 0\"\n :type=\"'event'\" \n :hasTicket=\"event.hasTicket\" \n :targetId=\"event._id\" \n :userId=\"auth.state.user._id\"\n class=\" w-100 pd-medium mn-auto\"\n @updateTicket=\"handleTicketUpdate\"\n />\n\n <p v-if=\"event?.ticketsTypes.length > 0\" class=\"z-index-1 t-transp p-small mn-t-small \">Buy ticket online with special price:</p>\n <Countdown \n v-if=\"event?.date?.start && event?.ticketsTypes?.length > 0\"\n class=\"mn-t-thin radius-medium bg-white w-100\"\n :date=\"event?.date?.start\"\n />\n </div>\n\n\n </div>\n\n <Comments \n v-if=\"!isLoading && event\" \n :type=\"'event'\" \n :target=\"event._id\" \n :owner=\"auth.state.user._id\"\n class=\"bg-light radius-medium mobile:radius-zero pd-medium\"\n />\n\n </div>\n \n </TransitionGroup> \n\n </section>\n</template>\n\n<script setup>\nimport { ref, onMounted } from 'vue';\n\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport Chips from '@martyrs/src/components/Chips/Chips.vue';\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\n\nimport Viewer from '@martyrs/src/modules/constructor/components/sections/Viewer.vue';\n\nimport Countdown from \"@martyrs/src/components/Countdown/Countdown.vue\";\n\nimport HeroEvent from '@martyrs/src/modules/events/components/sections/HeroEvent.vue';\n\nimport PhotoStack from \"@martyrs/src/modules/core/views/components/elements/PhotoStack.vue\";\n\nimport { SkeletonEvent, IconDate } from '@martyrs/src/modules/icons/icons.client.js';\n\nimport ButtonJoin from '@martyrs/src/modules/events/components/elements/ButtonJoin.vue';\nimport Comments from '@martyrs/src/modules/community/components/sections/Comments.vue';\n\nimport Image from '@martyrs/src/modules/constructor/components/elements/Image.vue';\nimport User from '@martyrs/src/modules/auth/views/components/blocks/CardUser.vue';\n\nimport * as events from '@martyrs/src/modules/events/store/events.js';\nimport * as tickets from '@martyrs/src/modules/events/store/tickets.js';\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\n\nimport { useRoute } from 'vue-router';\nimport { useI18n } from 'vue-i18n';\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\nconst route = useRoute();\nconst { locale } = useI18n();\nconst { returnCurrency, formatDate } = useGlobalMixins();\nconst qrcode = ref(null);\n\nconst handleTicketUpdate = ({ ticket, hasTicket, targetId }) => {\n tickets.mutations.handleTicketUpdate(event.value, ticket, hasTicket, targetId);\n console.log('HANDLE TICKET UPDATE', ticket, event.value);\n qrcode.value = ticket.qrcode;\n};\n\nfunction clickBuyTicket() {\n gtag('event', 'buy_ticket', {\n 'event_category': 'conversion',\n 'event_label': 'Buy Ticket'\n });\n}\n\nconst event = ref(null);\nconst isLoading = ref(true);\n\nonMounted(async () => {\n isLoading.value = true;\n\n const data = await events.read({\n user: auth.state.user._id,\n url: route.params.url\n });\n\n event.value = data[0];\n isLoading.value = false;\n});\n</script>\n\n\n<style>\n #eventPage {\n display: block;\n }\n</style>"],"names":["tickets.mutations","events.read","auth.state"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoJA,UAAM,QAAQ,SAAQ;AACtB,UAAM,EAAE,OAAM,IAAK,QAAO;AAC1B,UAAM,EAAE,gBAAgB,WAAU,IAAK,gBAAe;AACtD,UAAM,SAAS,IAAI,IAAI;AAEvB,UAAM,qBAAqB,CAAC,EAAE,QAAQ,WAAW,SAAQ,MAAO;AAC9DA,gBAAkB,mBAAmB,MAAM,OAAO,QAAQ,WAAW,QAAQ;AAC7E,cAAQ,IAAI,wBAAwB,QAAQ,MAAM,KAAK;AACvD,aAAO,QAAQ,OAAO;AAAA,IACxB;AASA,UAAM,QAAQ,IAAI,IAAI;AACtB,UAAM,YAAY,IAAI,IAAI;AAE1B,cAAU,YAAY;AACnB,gBAAU,QAAQ;AAElB,YAAM,OAAO,MAAMC,KAAY;AAAA,QAC5B,MAAMC,MAAW,KAAK;AAAA,QACtB,KAAK,MAAM,OAAO;AAAA,MACxB,CAAI;AAED,YAAM,QAAQ,KAAK,CAAC;AACpB,gBAAU,QAAQ;AAAA,IACrB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,7 +1,7 @@
1
1
  import { ref, reactive, createBlock, openBlock, withCtx, createElementBlock, createVNode, Fragment, renderList, createElementVNode, toDisplayString, unref, createCommentVNode, createTextVNode } from "vue";
2
2
  import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
3
3
  import Field from "../../../../components/Field/Field.vue.js";
4
- import _sfc_main$2 from "../../../../components/Button/Button.vue.js";
4
+ import _sfc_main$2 from "../../../../components/Button/Button.vue2.js";
5
5
  import _sfc_main$5 from "../../../../components/Popup/Popup.vue.js";
6
6
  import UploadImage from "../../../../components/UploadImage/UploadImage.vue.js";
7
7
  import FieldDate from "../../../../components/FieldDate/FieldDate.vue.js";
@@ -1,5 +1,5 @@
1
1
  import { ref, onMounted, createElementBlock, openBlock, createVNode, TransitionGroup, withCtx, createBlock, createCommentVNode, Transition, Fragment, renderList } from "vue";
2
- import Loader from "../../../../components/Loader/Loader.vue2.js";
2
+ import Loader from "../../../../components/Loader/Loader.vue.js";
3
3
  import _sfc_main$1 from "../../../../components/EmptyState/EmptyState.vue.js";
4
4
  import _sfc_main$2 from "../blocks/CardEvent.vue.js";
5
5
  import { read } from "../../store/events.js";
@@ -1,5 +1,5 @@
1
1
  import { ref, onMounted, createElementBlock, openBlock, createVNode, TransitionGroup, withCtx, createBlock, Fragment, renderList, normalizeClass } from "vue";
2
- /* empty css */
2
+ /* empty css */
3
3
  import _sfc_main$1 from "../../../../components/EmptyState/EmptyState.vue.js";
4
4
  import _sfc_main$2 from "../blocks/CardEventShort.vue.js";
5
5
  import SkeletonEventShort from "../../../icons/skeletons/SkeletonEventShort.vue.js";
@@ -1,8 +1,8 @@
1
1
  import { ref, createElementBlock, openBlock, createVNode, unref, isRef, withCtx, Fragment, renderList, createElementVNode, toDisplayString, createBlock, createCommentVNode, createTextVNode } from "vue";
2
2
  import { useRoute } from "vue-router";
3
3
  /* empty css */
4
- import _sfc_main$8 from "../../../../components/Button/Button.vue.js";
5
- /* empty css */
4
+ import _sfc_main$8 from "../../../../components/Button/Button.vue2.js";
5
+ /* empty css */
6
6
  import _sfc_main$4 from "../../../../components/Chips/Chips.vue.js";
7
7
  /* empty css */
8
8
  import _sfc_main$5 from "../../../../components/Popup/Popup.vue.js";
@@ -246,7 +246,7 @@ const _sfc_main = {
246
246
  createVNode(_sfc_main$8, {
247
247
  submit: () => createPhoto("draft"),
248
248
  callback: closePhotoPopup,
249
- class: "t-nowrap bg-second w-100"
249
+ class: "ws-nowrap bg-second w-100"
250
250
  }, {
251
251
  default: withCtx(() => _cache[5] || (_cache[5] = [
252
252
  createTextVNode(" To drafts ")
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeGallery.vue.js","sources":["../../../../../../../src/modules/gallery/components/sections/BackofficeGallery.vue"],"sourcesContent":["<template>\n <div class=\"cols-1 gap-thin pd-thin\">\n <SectionPageTitle\n title=\"Gallery\"\n @update:tabs_current=\"(update) => tab = update\"\n :tabs_current=\"tab\"\n :tabs=\"[\n { name: 'All', value: 'all' },\n { name: 'Featured', value: 'featured' },\n { name: 'Published', value: 'published' },\n { name: 'Draft', value: 'draft' },\n { name: 'Archived', value: 'archived' }\n ]\"\n :actions=\"[\n ...(hasAccess(route.params._id, 'gallery', 'create', auth.state.accesses, auth.state.access.roles) ? [{ method: () => openPhotoPopup(null), label: 'Add Photo' }] : [])\n ]\"\n class=\"mn-b-small bg-light bg-light radius-big\"\n />\n\n <Feed\n v-model:items=\"photos\"\n v-model:sort=\"sort\"\n v-model:date=\"date\"\n :states=\"{\n empty: {\n title: 'No Photos Found',\n description: 'Currently, there are no photos in gallery.'\n },\n }\"\n :store=\"{\n read: (options) => gallery.read(options)\n }\"\n :options=\"{\n limit: 15,\n owner: route.params._id,\n ...(tab !== 'all' && { status: tab })\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"cols-3 mobile:cols-1 gap-thin\"\n >\n <div v-for=\"item in items\" :key=\"item._id\" class=\"bg-light radius-small flex-column pos-relative flex-wrap\">\n\n <CardHeader \n :entity=\"item\"\n :entityType=\"'photo'\"\n :user=\"auth.state.user._id\"\n :owner=\"item.creator\" \n :creator=\"item.creator\"\n :date=\"item.createdAt\"\n :actions=\"[\n ...(hasAccess(route.params._id, 'gallery', 'delete', auth.state.accesses, auth.state.access.roles) ? [{ method: () => deletePhoto(item), label: 'Delete' }] : []),\n ...(hasAccess(route.params._id, 'gallery', 'edit', auth.state.accesses, auth.state.access.roles) ? [\n ...(item.status !== 'archived' ? [{ method: () => changeStatus(item, 'archived'), label: 'Archive' }] : []),\n ...(item.status !== 'published' ? [{ method: () => changeStatus(item, 'published'), label: 'Publish' }] : []),\n ...(item.status !== 'draft' ? [{ method: () => changeStatus(item, 'draft'), label: 'Draft' }] : [])\n ] : [])\n ]\"\n class=\"pd-small mn-b-small\"\n />\n\n <div class=\"pos-relative\">\n <img loading=\"lazy\" \n :src=\"(FILE_SERVER_URL || '') + item.cover\" \n class=\"w-100 h-20r object-fit-contain bg-black \" @click=\"openPreviewPopup(item)\" \n />\n <div \n class=\"pos-absolute pos-t-0 pos-r-0 pd-micro t-white uppercase fw-semi p-small flex-center flex pd-r-small pd-l-small mn-r-small mn-t-small w-min bg-second radius-extra\"\n >\n {{item.status}}\n </div>\n </div>\n \n <div class=\"pd-small\">\n <Chips \n v-if=\"item.tags?.length > 0\" \n :chips=\"item.tags\"\n />\n </div>\n </div>\n </Feed>\n\n <Popup \n @close-popup=\"closePreviewPopup\" \n :isPopupOpen=\"isOpenPreviewPopup\"\n class=\"bg-black o-hidden w-100 h-100 radius-big\"\n >\n <PhotoViewer\n :photoUrl=\"selectedPhoto.image\"\n />\n </Popup>\n\n <Popup \n title=\"Add Photo\" \n @close-popup=\"closePhotoPopup\" \n :isPopupOpen=\"isOpenPhotoPopup\"\n class=\"bg-white w-max-30r radius-big pd-big\"\n >\n <img loading=\"lazy\" \n v-if=\"selectedImage.cover\" \n :src=\"selectedImage.cover\" \n class=\"radius-small w-100 mn-b-small h-20r object-fit-cover \" \n />\n\n <EditImages \n :images=\"uploadedImages\" \n :uploadPath=\"'/photos'\" \n @update:images=\"onUpdatedImages\" \n class=\"mn-b-semi bg-light radius-medium\"\n />\n\n <BlockTags\n @tags-changed=\"newTags => selectedImage.tags = newTags\"\n :tags=\"selectedImage.tags\"\n :tagsSuggested=\"[\n {text: 'people' },\n {text: 'events' },\n {text: 'place' },\n {text: 'food' },\n {text: 'drinks' },\n {text: 'special' },\n ]\"\n class=\"mn-b-semi\"\n />\n\n <div class=\"flex-nowrap flex gap-thin\">\n <Button \n :submit=\"() => createPhoto('draft')\" \n :callback=\"closePhotoPopup\" \n class=\"t-nowrap bg-second w-100\"\n >\n To drafts\n </Button>\n <Button \n :submit=\"() => createPhoto('published')\" \n :callback=\"closePhotoPopup\" \n class=\"bg-main w-100\"\n >\n Publish\n </Button>\n </div>\n </Popup>\n </div>\n</template>\n\n<script setup>\nimport { ref, onMounted, reactive, computed } from 'vue'\nimport { useRoute } from 'vue-router'\n\nimport Field from '@martyrs/src/components/Field/Field.vue'\nimport Button from '@martyrs/src/components/Button/Button.vue'\nimport Select from '@martyrs/src/components/Select/Select.vue'\nimport Chips from '@martyrs/src/components/Chips/Chips.vue'\nimport Checkbox from '@martyrs/src/components/Checkbox/Checkbox.vue';\nimport SelectMulti from '@martyrs/src/components/SelectMulti/SelectMulti.vue';\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Feed from '@martyrs/src/components/Feed/Feed.vue'\nimport PhotoViewer from '@martyrs/src/components/PhotoViewer/PhotoViewer.vue'\n\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\nimport * as organizations from '@martyrs/src/modules/organizations/store/organizations.js';\n \nimport gallery from '@martyrs/src/modules/gallery/store/gallery.js';\n\nimport CardHeader from '@martyrs/src/modules/core/views/components/blocks/CardHeader.vue'\nimport SectionPageTitle from '@martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue'\n\nimport EditImages from '@martyrs/src/components/EditImages/EditImages.vue';\nimport BlockTags from '@martyrs/src/components/FieldTags/BlockTags.vue';\n\nconst route = useRoute();\n\n// Tabs\nconst tab = ref('all')\n// Sort\nlet sort = ref({\n param: 'createdAt',\n order: 'desc',\n options: [{\n label: 'Date',\n value: 'createdAt'\n },{\n label: 'Popularity',\n value: 'views'\n },{\n label: 'Creator',\n value: 'creator'\n }]\n})\n// Date\nlet date = ref({\n start: null,\n end: null\n})\n// Popup\n// Preview Photo\nconst isOpenPreviewPopup = ref(false);\nfunction openPreviewPopup(photo) {\n isOpenPreviewPopup.value = true;\n selectedPhoto.value = photo;\n}\nfunction closePreviewPopup() {\n isOpenPreviewPopup.value = false;\n selectedPhoto.value = null;\n}\n// Add Photo\nconst isOpenPhotoPopup = ref(false);\nfunction openPhotoPopup(photo) {\n isOpenPhotoPopup.value = true;\n selectedPhoto.value = photo;\n}\nfunction closePhotoPopup() {\n isOpenPhotoPopup.value = false;\n selectedPhoto.value = null;\n uploadedImages.value = [];\n selectedImage.value = { tags: null, image: null };\n}\n// Selected Photo\nconst selectedPhoto = ref(null);\nconst selectedCategory = ref('all')\nconst selectedImage = ref({\n tags: null,\n image: null\n})\nconst uploadedImages = ref([])\nconst onUpdatedImages = (newImages) => {\n uploadedImages.value = newImages\n}\n// Gallery Grid\nconst photos = ref([])\n\nconst deletePhoto = async (item) => {\n let deletedPhoto = JSON.parse(JSON.stringify(item));\n\n deletedPhoto.owner.target = deletedPhoto.owner.target._id\n deletedPhoto.creator.target = deletedPhoto.creator.target._id\n\n await gallery.delete(deletedPhoto);\n\n gallery.removeItem(deletedPhoto, photos.value)\n};\n\nconst changeStatus = async (item, status) => {\n let updatedPhoto = JSON.parse(JSON.stringify(item));\n\n updatedPhoto.status = status\n\n updatedPhoto.owner.target = updatedPhoto.owner.target._id\n updatedPhoto.creator.target = updatedPhoto.creator.target._id\n\n updatedPhoto = await gallery.update(updatedPhoto)\n gallery.updateItem(updatedPhoto, photos.value)\n}\n\nconst createPhoto = async (status) => {\n if (uploadedImages.length < 1) {\n alert('Upload at least 1 image')\n return\n }\n\n let createdPhotos = await gallery.create({\n images: uploadedImages.value,\n tags: selectedImage.value.tags,\n status: status,\n owner: {\n type: 'Organization',\n target: route.params._id\n },\n creator: {\n type: 'User',\n target: auth.state.user._id\n }\n })\n\n for (let createdPhoto of createdPhotos) {\n gallery.addItem(createdPhoto, photos.value)\n }\n}\n</script>\n\n<style scoped>\n</style>"],"names":["auth.state"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA2KA,UAAM,QAAQ,SAAQ;AAGtB,UAAM,MAAM,IAAI,KAAK;AAErB,QAAI,OAAO,IAAI;AAAA,MACb,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS,CAAC;AAAA,QACR,OAAO;AAAA,QACP,OAAO;AAAA,MACX,GAAI;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,MACX,GAAI;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,MACX,CAAG;AAAA,IACH,CAAC;AAED,QAAI,OAAO,IAAI;AAAA,MACb,OAAO;AAAA,MACP,KAAK;AAAA,IACP,CAAC;AAGD,UAAM,qBAAqB,IAAI,KAAK;AACpC,aAAS,iBAAiB,OAAO;AAC/B,yBAAmB,QAAQ;AAC3B,oBAAc,QAAQ;AAAA,IACxB;AACA,aAAS,oBAAoB;AAC3B,yBAAmB,QAAQ;AAC3B,oBAAc,QAAQ;AAAA,IACxB;AAEA,UAAM,mBAAmB,IAAI,KAAK;AAClC,aAAS,eAAe,OAAO;AAC7B,uBAAiB,QAAQ;AACzB,oBAAc,QAAQ;AAAA,IACxB;AACA,aAAS,kBAAkB;AACzB,uBAAiB,QAAQ;AACzB,oBAAc,QAAQ;AACtB,qBAAe,QAAQ,CAAA;AACvB,oBAAc,QAAQ,EAAE,MAAM,MAAM,OAAO,KAAI;AAAA,IACjD;AAEA,UAAM,gBAAgB,IAAI,IAAI;AACL,QAAI,KAAK;AAClC,UAAM,gBAAgB,IAAI;AAAA,MACxB,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AACD,UAAM,iBAAiB,IAAI,CAAA,CAAE;AAC7B,UAAM,kBAAkB,CAAC,cAAc;AACrC,qBAAe,QAAQ;AAAA,IACzB;AAEA,UAAM,SAAS,IAAI,CAAA,CAAE;AAErB,UAAM,cAAc,OAAO,SAAS;AAClC,UAAI,eAAe,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC;AAElD,mBAAa,MAAM,SAAS,aAAa,MAAM,OAAO;AACtD,mBAAa,QAAQ,SAAS,aAAa,QAAQ,OAAO;AAE1D,YAAM,QAAQ,OAAO,YAAY;AAEjC,cAAQ,WAAW,cAAc,OAAO,KAAK;AAAA,IAC/C;AAEA,UAAM,eAAe,OAAO,MAAM,WAAW;AAC3C,UAAI,eAAe,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC;AAElD,mBAAa,SAAS;AAEtB,mBAAa,MAAM,SAAS,aAAa,MAAM,OAAO;AACtD,mBAAa,QAAQ,SAAS,aAAa,QAAQ,OAAO;AAE1D,qBAAe,MAAM,QAAQ,OAAO,YAAY;AAChD,cAAQ,WAAW,cAAc,OAAO,KAAK;AAAA,IAC/C;AAEA,UAAM,cAAc,OAAO,WAAW;AACpC,UAAI,eAAe,SAAS,GAAG;AAC7B,cAAM,yBAAyB;AAC/B;AAAA,MACF;AAEA,UAAI,gBAAgB,MAAM,QAAQ,OAAO;AAAA,QACvC,QAAQ,eAAe;AAAA,QACvB,MAAM,cAAc,MAAM;AAAA,QAC1B;AAAA,QACA,OAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ,MAAM,OAAO;AAAA,QAC3B;AAAA,QACI,SAAS;AAAA,UACP,MAAM;AAAA,UACN,QAAQA,MAAW,KAAK;AAAA,QAC9B;AAAA,MACA,CAAG;AAED,eAAS,gBAAgB,eAAe;AACtC,gBAAQ,QAAQ,cAAc,OAAO,KAAK;AAAA,MAC5C;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"BackofficeGallery.vue.js","sources":["../../../../../../../src/modules/gallery/components/sections/BackofficeGallery.vue"],"sourcesContent":["<template>\n <div class=\"cols-1 gap-thin pd-thin\">\n <SectionPageTitle\n title=\"Gallery\"\n @update:tabs_current=\"(update) => tab = update\"\n :tabs_current=\"tab\"\n :tabs=\"[\n { name: 'All', value: 'all' },\n { name: 'Featured', value: 'featured' },\n { name: 'Published', value: 'published' },\n { name: 'Draft', value: 'draft' },\n { name: 'Archived', value: 'archived' }\n ]\"\n :actions=\"[\n ...(hasAccess(route.params._id, 'gallery', 'create', auth.state.accesses, auth.state.access.roles) ? [{ method: () => openPhotoPopup(null), label: 'Add Photo' }] : [])\n ]\"\n class=\"mn-b-small bg-light bg-light radius-big\"\n />\n\n <Feed\n v-model:items=\"photos\"\n v-model:sort=\"sort\"\n v-model:date=\"date\"\n :states=\"{\n empty: {\n title: 'No Photos Found',\n description: 'Currently, there are no photos in gallery.'\n },\n }\"\n :store=\"{\n read: (options) => gallery.read(options)\n }\"\n :options=\"{\n limit: 15,\n owner: route.params._id,\n ...(tab !== 'all' && { status: tab })\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"cols-3 mobile:cols-1 gap-thin\"\n >\n <div v-for=\"item in items\" :key=\"item._id\" class=\"bg-light radius-small flex-column pos-relative flex-wrap\">\n\n <CardHeader \n :entity=\"item\"\n :entityType=\"'photo'\"\n :user=\"auth.state.user._id\"\n :owner=\"item.creator\" \n :creator=\"item.creator\"\n :date=\"item.createdAt\"\n :actions=\"[\n ...(hasAccess(route.params._id, 'gallery', 'delete', auth.state.accesses, auth.state.access.roles) ? [{ method: () => deletePhoto(item), label: 'Delete' }] : []),\n ...(hasAccess(route.params._id, 'gallery', 'edit', auth.state.accesses, auth.state.access.roles) ? [\n ...(item.status !== 'archived' ? [{ method: () => changeStatus(item, 'archived'), label: 'Archive' }] : []),\n ...(item.status !== 'published' ? [{ method: () => changeStatus(item, 'published'), label: 'Publish' }] : []),\n ...(item.status !== 'draft' ? [{ method: () => changeStatus(item, 'draft'), label: 'Draft' }] : [])\n ] : [])\n ]\"\n class=\"pd-small mn-b-small\"\n />\n\n <div class=\"pos-relative\">\n <img loading=\"lazy\" \n :src=\"(FILE_SERVER_URL || '') + item.cover\" \n class=\"w-100 h-20r object-fit-contain bg-black \" @click=\"openPreviewPopup(item)\" \n />\n <div \n class=\"pos-absolute pos-t-0 pos-r-0 pd-micro t-white uppercase fw-semi p-small flex-center flex pd-r-small pd-l-small mn-r-small mn-t-small w-min bg-second radius-extra\"\n >\n {{item.status}}\n </div>\n </div>\n \n <div class=\"pd-small\">\n <Chips \n v-if=\"item.tags?.length > 0\" \n :chips=\"item.tags\"\n />\n </div>\n </div>\n </Feed>\n\n <Popup \n @close-popup=\"closePreviewPopup\" \n :isPopupOpen=\"isOpenPreviewPopup\"\n class=\"bg-black o-hidden w-100 h-100 radius-big\"\n >\n <PhotoViewer\n :photoUrl=\"selectedPhoto.image\"\n />\n </Popup>\n\n <Popup \n title=\"Add Photo\" \n @close-popup=\"closePhotoPopup\" \n :isPopupOpen=\"isOpenPhotoPopup\"\n class=\"bg-white w-max-30r radius-big pd-big\"\n >\n <img loading=\"lazy\" \n v-if=\"selectedImage.cover\" \n :src=\"selectedImage.cover\" \n class=\"radius-small w-100 mn-b-small h-20r object-fit-cover \" \n />\n\n <EditImages \n :images=\"uploadedImages\" \n :uploadPath=\"'/photos'\" \n @update:images=\"onUpdatedImages\" \n class=\"mn-b-semi bg-light radius-medium\"\n />\n\n <BlockTags\n @tags-changed=\"newTags => selectedImage.tags = newTags\"\n :tags=\"selectedImage.tags\"\n :tagsSuggested=\"[\n {text: 'people' },\n {text: 'events' },\n {text: 'place' },\n {text: 'food' },\n {text: 'drinks' },\n {text: 'special' },\n ]\"\n class=\"mn-b-semi\"\n />\n\n <div class=\"flex-nowrap flex gap-thin\">\n <Button \n :submit=\"() => createPhoto('draft')\" \n :callback=\"closePhotoPopup\" \n class=\"ws-nowrap bg-second w-100\"\n >\n To drafts\n </Button>\n <Button \n :submit=\"() => createPhoto('published')\" \n :callback=\"closePhotoPopup\" \n class=\"bg-main w-100\"\n >\n Publish\n </Button>\n </div>\n </Popup>\n </div>\n</template>\n\n<script setup>\nimport { ref, onMounted, reactive, computed } from 'vue'\nimport { useRoute } from 'vue-router'\n\nimport Field from '@martyrs/src/components/Field/Field.vue'\nimport Button from '@martyrs/src/components/Button/Button.vue'\nimport Select from '@martyrs/src/components/Select/Select.vue'\nimport Chips from '@martyrs/src/components/Chips/Chips.vue'\nimport Checkbox from '@martyrs/src/components/Checkbox/Checkbox.vue';\nimport SelectMulti from '@martyrs/src/components/SelectMulti/SelectMulti.vue';\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Feed from '@martyrs/src/components/Feed/Feed.vue'\nimport PhotoViewer from '@martyrs/src/components/PhotoViewer/PhotoViewer.vue'\n\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\nimport * as organizations from '@martyrs/src/modules/organizations/store/organizations.js';\n \nimport gallery from '@martyrs/src/modules/gallery/store/gallery.js';\n\nimport CardHeader from '@martyrs/src/modules/core/views/components/blocks/CardHeader.vue'\nimport SectionPageTitle from '@martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue'\n\nimport EditImages from '@martyrs/src/components/EditImages/EditImages.vue';\nimport BlockTags from '@martyrs/src/components/FieldTags/BlockTags.vue';\n\nconst route = useRoute();\n\n// Tabs\nconst tab = ref('all')\n// Sort\nlet sort = ref({\n param: 'createdAt',\n order: 'desc',\n options: [{\n label: 'Date',\n value: 'createdAt'\n },{\n label: 'Popularity',\n value: 'views'\n },{\n label: 'Creator',\n value: 'creator'\n }]\n})\n// Date\nlet date = ref({\n start: null,\n end: null\n})\n// Popup\n// Preview Photo\nconst isOpenPreviewPopup = ref(false);\nfunction openPreviewPopup(photo) {\n isOpenPreviewPopup.value = true;\n selectedPhoto.value = photo;\n}\nfunction closePreviewPopup() {\n isOpenPreviewPopup.value = false;\n selectedPhoto.value = null;\n}\n// Add Photo\nconst isOpenPhotoPopup = ref(false);\nfunction openPhotoPopup(photo) {\n isOpenPhotoPopup.value = true;\n selectedPhoto.value = photo;\n}\nfunction closePhotoPopup() {\n isOpenPhotoPopup.value = false;\n selectedPhoto.value = null;\n uploadedImages.value = [];\n selectedImage.value = { tags: null, image: null };\n}\n// Selected Photo\nconst selectedPhoto = ref(null);\nconst selectedCategory = ref('all')\nconst selectedImage = ref({\n tags: null,\n image: null\n})\nconst uploadedImages = ref([])\nconst onUpdatedImages = (newImages) => {\n uploadedImages.value = newImages\n}\n// Gallery Grid\nconst photos = ref([])\n\nconst deletePhoto = async (item) => {\n let deletedPhoto = JSON.parse(JSON.stringify(item));\n\n deletedPhoto.owner.target = deletedPhoto.owner.target._id\n deletedPhoto.creator.target = deletedPhoto.creator.target._id\n\n await gallery.delete(deletedPhoto);\n\n gallery.removeItem(deletedPhoto, photos.value)\n};\n\nconst changeStatus = async (item, status) => {\n let updatedPhoto = JSON.parse(JSON.stringify(item));\n\n updatedPhoto.status = status\n\n updatedPhoto.owner.target = updatedPhoto.owner.target._id\n updatedPhoto.creator.target = updatedPhoto.creator.target._id\n\n updatedPhoto = await gallery.update(updatedPhoto)\n gallery.updateItem(updatedPhoto, photos.value)\n}\n\nconst createPhoto = async (status) => {\n if (uploadedImages.length < 1) {\n alert('Upload at least 1 image')\n return\n }\n\n let createdPhotos = await gallery.create({\n images: uploadedImages.value,\n tags: selectedImage.value.tags,\n status: status,\n owner: {\n type: 'Organization',\n target: route.params._id\n },\n creator: {\n type: 'User',\n target: auth.state.user._id\n }\n })\n\n for (let createdPhoto of createdPhotos) {\n gallery.addItem(createdPhoto, photos.value)\n }\n}\n</script>\n\n<style scoped>\n</style>"],"names":["auth.state"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA2KA,UAAM,QAAQ,SAAQ;AAGtB,UAAM,MAAM,IAAI,KAAK;AAErB,QAAI,OAAO,IAAI;AAAA,MACb,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS,CAAC;AAAA,QACR,OAAO;AAAA,QACP,OAAO;AAAA,MACX,GAAI;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,MACX,GAAI;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,MACX,CAAG;AAAA,IACH,CAAC;AAED,QAAI,OAAO,IAAI;AAAA,MACb,OAAO;AAAA,MACP,KAAK;AAAA,IACP,CAAC;AAGD,UAAM,qBAAqB,IAAI,KAAK;AACpC,aAAS,iBAAiB,OAAO;AAC/B,yBAAmB,QAAQ;AAC3B,oBAAc,QAAQ;AAAA,IACxB;AACA,aAAS,oBAAoB;AAC3B,yBAAmB,QAAQ;AAC3B,oBAAc,QAAQ;AAAA,IACxB;AAEA,UAAM,mBAAmB,IAAI,KAAK;AAClC,aAAS,eAAe,OAAO;AAC7B,uBAAiB,QAAQ;AACzB,oBAAc,QAAQ;AAAA,IACxB;AACA,aAAS,kBAAkB;AACzB,uBAAiB,QAAQ;AACzB,oBAAc,QAAQ;AACtB,qBAAe,QAAQ,CAAA;AACvB,oBAAc,QAAQ,EAAE,MAAM,MAAM,OAAO,KAAI;AAAA,IACjD;AAEA,UAAM,gBAAgB,IAAI,IAAI;AACL,QAAI,KAAK;AAClC,UAAM,gBAAgB,IAAI;AAAA,MACxB,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AACD,UAAM,iBAAiB,IAAI,CAAA,CAAE;AAC7B,UAAM,kBAAkB,CAAC,cAAc;AACrC,qBAAe,QAAQ;AAAA,IACzB;AAEA,UAAM,SAAS,IAAI,CAAA,CAAE;AAErB,UAAM,cAAc,OAAO,SAAS;AAClC,UAAI,eAAe,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC;AAElD,mBAAa,MAAM,SAAS,aAAa,MAAM,OAAO;AACtD,mBAAa,QAAQ,SAAS,aAAa,QAAQ,OAAO;AAE1D,YAAM,QAAQ,OAAO,YAAY;AAEjC,cAAQ,WAAW,cAAc,OAAO,KAAK;AAAA,IAC/C;AAEA,UAAM,eAAe,OAAO,MAAM,WAAW;AAC3C,UAAI,eAAe,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC;AAElD,mBAAa,SAAS;AAEtB,mBAAa,MAAM,SAAS,aAAa,MAAM,OAAO;AACtD,mBAAa,QAAQ,SAAS,aAAa,QAAQ,OAAO;AAE1D,qBAAe,MAAM,QAAQ,OAAO,YAAY;AAChD,cAAQ,WAAW,cAAc,OAAO,KAAK;AAAA,IAC/C;AAEA,UAAM,cAAc,OAAO,WAAW;AACpC,UAAI,eAAe,SAAS,GAAG;AAC7B,cAAM,yBAAyB;AAC/B;AAAA,MACF;AAEA,UAAI,gBAAgB,MAAM,QAAQ,OAAO;AAAA,QACvC,QAAQ,eAAe;AAAA,QACvB,MAAM,cAAc,MAAM;AAAA,QAC1B;AAAA,QACA,OAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ,MAAM,OAAO;AAAA,QAC3B;AAAA,QACI,SAAS;AAAA,UACP,MAAM;AAAA,UACN,QAAQA,MAAW,KAAK;AAAA,QAC9B;AAAA,MACA,CAAG;AAED,eAAS,gBAAgB,eAAe;AACtC,gBAAQ,QAAQ,cAAc,OAAO,KAAK;AAAA,MAC5C;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,8 +1,8 @@
1
1
  import { ref, onMounted, createElementBlock, openBlock, createElementVNode, createCommentVNode, createVNode, Fragment, renderList, normalizeClass, createBlock, resolveDynamicComponent, toDisplayString, withCtx, createTextVNode } from "vue";
2
2
  import { useRoute } from "vue-router";
3
3
  import Field from "../../../../components/Field/Field.vue.js";
4
- import Select from "../../../../components/Select/Select.vue2.js";
5
- import _sfc_main$2 from "../../../../components/Button/Button.vue.js";
4
+ import Select from "../../../../components/Select/Select.vue.js";
5
+ import _sfc_main$2 from "../../../../components/Button/Button.vue2.js";
6
6
  import { state } from "../../../auth/views/store/auth.js";
7
7
  import { actions } from "../../../spots/store/spots.js";
8
8
  import variantsStore from "../../../products/store/variants.store.js";
@@ -1,6 +1,6 @@
1
1
  import { ref, watch, createElementBlock, openBlock, createElementVNode, Fragment, renderList, createVNode, withCtx, createTextVNode } from "vue";
2
2
  import _sfc_main$1 from "../../../../components/Checkbox/Checkbox.vue.js";
3
- import _sfc_main$2 from "../../../../components/Button/Button.vue.js";
3
+ import _sfc_main$2 from "../../../../components/Button/Button.vue2.js";
4
4
  const _hoisted_1 = { class: "w-100" };
5
5
  const _hoisted_2 = { class: "mn-b-medium" };
6
6
  const _hoisted_3 = { class: "flex-nowrap flex gap-small" };
@@ -1,6 +1,6 @@
1
1
  import { ref, onMounted, createElementBlock, openBlock, createElementVNode, createVNode, createBlock, toDisplayString, createCommentVNode, Fragment, renderList, normalizeClass, createTextVNode, withCtx } from "vue";
2
2
  import PlaceholderImage from "../../../icons/placeholders/PlaceholderImage.vue.js";
3
- import _sfc_main$1 from "../../../../components/Button/Button.vue.js";
3
+ import _sfc_main$1 from "../../../../components/Button/Button.vue2.js";
4
4
  import { actions } from "../../store/inventory.store.js";
5
5
  /* empty css */
6
6
  import _export_sfc from "../../../../../../_virtual/_plugin-vue_export-helper.js";
@@ -1,8 +1,8 @@
1
1
  import { ref, computed, onMounted, createElementBlock, openBlock, createElementVNode, createVNode, toDisplayString, withCtx, createTextVNode } from "vue";
2
2
  import { useRoute } from "vue-router";
3
3
  import Field from "../../../../components/Field/Field.vue.js";
4
- import Select from "../../../../components/Select/Select.vue2.js";
5
- import _sfc_main$1 from "../../../../components/Button/Button.vue.js";
4
+ import Select from "../../../../components/Select/Select.vue.js";
5
+ import _sfc_main$1 from "../../../../components/Button/Button.vue2.js";
6
6
  import { state } from "../../../auth/views/store/auth.js";
7
7
  import { actions } from "../../../spots/store/spots.js";
8
8
  import variantsStore from "../../../products/store/variants.store.js";
@@ -21,7 +21,7 @@ const _hoisted_2 = { class: "mn-b-medium flex-v-center flex-nowrap flex" };
21
21
  const _hoisted_3 = { class: "rows-1" };
22
22
  const _hoisted_4 = { class: "w-max-20r truncate flex gap-small flex-nowrap flex-v-center" };
23
23
  const _hoisted_5 = ["src"];
24
- const _hoisted_6 = { class: "truncate t-nowrap" };
24
+ const _hoisted_6 = { class: "truncate ws-nowrap" };
25
25
  const _hoisted_7 = { class: "w-max-10r flex-nowrap flex truncate" };
26
26
  const _hoisted_8 = { key: 1 };
27
27
  const _hoisted_9 = { class: "w-max-10r flex-nowrap flex truncate" };
@@ -235,15 +235,15 @@ const _sfc_main = {
235
235
  createElementVNode("div", _hoisted_16, [
236
236
  createElementVNode("button", {
237
237
  onClick: ($event) => openStockAudit(row),
238
- class: "cursor-pointer t-left t-nowrap w-100 pd-small"
238
+ class: "cursor-pointer t-left ws-nowrap w-100 pd-small"
239
239
  }, " Audit Stock ", 8, _hoisted_17),
240
240
  createElementVNode("button", {
241
241
  onClick: ($event) => openStockHistory(row),
242
- class: "cursor-pointer t-left t-nowrap w-100 pd-small"
242
+ class: "cursor-pointer t-left ws-nowrap w-100 pd-small"
243
243
  }, " Stock History ", 8, _hoisted_18),
244
244
  createElementVNode("button", {
245
245
  onClick: ($event) => openReorderSettings(row),
246
- class: "cursor-pointer t-left t-nowrap w-100 pd-small"
246
+ class: "cursor-pointer t-left ws-nowrap w-100 pd-small"
247
247
  }, " Set Alerts ", 8, _hoisted_19)
248
248
  ])
249
249
  ]),
@@ -1 +1 @@
1
- {"version":3,"file":"Inventory.vue.js","sources":["../../../../../../../src/modules/inventory/components/pages/Inventory.vue"],"sourcesContent":["<template>\n <div class=\"pd-thin\">\n <!-- Header -->\n <header class=\"mn-b-medium flex-v-center flex-nowrap flex\">\n <h2>Inventory</h2>\n <button\n @click=\"route.meta.context === 'backoffice' ? router.push({ name: 'BackofficeInventoryAudit' }) : router.push({ name: 'OrganizationInventoryAudit', params: { _id: route.params._id } })\"\n class=\"mn-l-auto radius-small button t-white bg-second\"\n v-html=\"'+ New Audit'\"\n />\n </header>\n\n <!-- Products Feed -->\n <div class=\"rows-1\">\n <Feed\n :search=\"true\"\n v-model:sort=\"sort\"\n v-model:items=\"items\"\n :store=\"{\n read: (options) => products.actions.read(options),\n state: products.state\n }\"\n :actions=\"[{\n key: 'settings',\n component: IconSettings,\n props: {\n class: 'h-3r pd-r-small pd-l-small flex-center flex bg-light t-black radius-small hover:scale-[1.05] cursor-pointer'\n },\n handler: openViewSettings\n }]\"\n :options=\"{\n limit: 15,\n lookup: ['inventory','categories'],\n owner: route.params._id,\n sortParam: sort.param,\n sortOrder: sort.order\n }\"\n >\n <Table\n :columns=\"columns.filter(col => col.visible)\"\n :items=\"items\"\n class=\"bg-white z-index-1 br-1px br-light radius-medium\"\n >\n <!-- Name column (was \"product\") -->\n <template #cell-name=\"{ row }\">\n <div class=\"w-max-20r truncate flex gap-small flex-nowrap flex-v-center\">\n <img\n v-if=\"row.images?.length\"\n :src=\"(FILE_SERVER_URL || '') + row.images[0]\"\n alt=\"Product\"\n class=\"w-3r h-3r radius-small bg-light object-fit-cover\"\n />\n <PlaceholderImage v-else class=\"w-3r h-3r radius-small\" />\n <p class=\"truncate t-nowrap\">{{ row.name || 'Unknown Product' }}</p>\n </div>\n </template>\n\n <!-- Categories -->\n <template #cell-category=\"{ row }\">\n <div class=\"w-max-10r flex-nowrap flex truncate\">\n <p\n v-if=\"row.category?.length\"\n v-for=\"cat in row.category\"\n :key=\"cat._id\"\n class=\"w-max truncate pd-small mn-r-micro radius-small bg-light t-small\"\n >\n {{ cat.name }}\n </p>\n <p v-else>-</p>\n </div>\n </template>\n\n <!-- Storages -->\n <template #cell-storages=\"{ row }\">\n <div class=\"w-max-10r flex-nowrap flex truncate\">\n <p\n v-if=\"row.availabilityDetails?.length\"\n v-for=\"avail in row.availabilityDetails\" \n :key=\"avail._id\"\n class=\"w-max truncate pd-small mn-r-micro radius-small bg-light t-small\"\n >\n\n <span class=\"fw-medium\">{{ avail.available || 0 }}</span> · \n <span class=\"t-small\">{{ avail.storageName || avail.storage }}:</span>\n </p>\n <p v-else>No stock</p>\n </div>\n </template>\n\n <!-- Available (replaces stock) -->\n <template #cell-available=\"{ row }\">\n <div class=\"flex-column flex\">\n <span class=\"d-block mn-b-thin\">\n {{ row.available }} ·\n {{ row.available <= 5 ? 'Low' : row.available <= 10 ? 'Medium' : 'High' }}\n </span>\n <div class=\"w-100 h-micro radius-thin bg-light\">\n <div\n class=\"h-100 radius-thin\"\n :class=\"\n row.available <= 1\n ? 'bg-red t-white'\n : row.available <= 2\n ? 'bg-orange t-white'\n : 'bg-green t-white'\n \"\n :style=\"`width: ${\n Math.min(\n (row.available / (row.alert !== undefined ? row.alert : 50)) * 100,\n 100\n )\n }%`\"\n />\n </div>\n </div>\n </template>\n <!-- Price -->\n <template #cell-price=\"{ row }\">\n {{ formatPrice(row.price || 0) }}\n </template>\n\n <!-- Actions -->\n <template #cell-actions=\"{ row }\">\n <Dropdown\n :label=\"{ component: IconEllipsis, class: 't-transp i-medium' }\"\n class=\"cursor-pointer aspect-1x1 pd-nano radius-small hover:bg-light\"\n align=\"right\"\n >\n <div class=\"bg-white radius-small\">\n <button @click=\"openStockAudit(row)\" class=\"cursor-pointer t-left t-nowrap w-100 pd-small\">\n Audit Stock\n </button>\n <button @click=\"openStockHistory(row)\" class=\"cursor-pointer t-left t-nowrap w-100 pd-small\">\n Stock History\n </button>\n <button @click=\"openReorderSettings(row)\" class=\"cursor-pointer t-left t-nowrap w-100 pd-small\">\n Set Alerts\n </button>\n </div>\n </Dropdown>\n </template>\n </Table>\n </Feed>\n </div>\n <!-- Modals -->\n <Popup\n :isPopupOpen=\"showAuditModal\"\n @close-popup=\"showAuditModal = false\"\n title=\"Audit Stock\"\n class=\"bg-white radius-medium pd-medium w-min-40r\"\n >\n <AdjustmentForm\n :product=\"selectedProduct\"\n @close=\"showAuditModal = false\"\n @adjustment-created=\"handleAdjustmentCreated\"\n />\n </Popup>\n\n <Popup\n :isPopupOpen=\"showReorderModal\"\n @close-popup=\"showReorderModal = false\"\n title=\"Stock Level Alerts\"\n class=\"bg-white radius-medium pd-medium w-min-30r\"\n >\n <StockAlertsForm\n :product=\"selectedProduct\"\n @close=\"showReorderModal = false\"\n />\n </Popup>\n\n <Popup\n :isPopupOpen=\"showHistoryModal\"\n @close-popup=\"showHistoryModal = false\"\n title=\"Stock History\"\n class=\"bg-white radius-medium pd-medium w-min-50r\"\n >\n <HistoryView\n :product=\"selectedProduct\"\n @close=\"showHistoryModal = false\"\n />\n </Popup>\n\n <Popup\n :isPopupOpen=\"showSettingsModal\"\n @close-popup=\"showSettingsModal = false\"\n title=\"View Settings\"\n class=\"bg-white radius-medium pd-medium w-min-30r\"\n >\n <ColumnSettingsMenu\n :columns=\"columns\"\n @save=\"handleColumnsUpdate\"\n @close=\"showSettingsModal = false\"\n />\n </Popup>\n </div>\n</template>\n\n<script setup>\nimport { ref, reactive } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js'\n\n// Components\nimport Table from '@martyrs/src/components/Table/Table.vue'\nimport Feed from '@martyrs/src/components/Feed/Feed.vue'\nimport PlaceholderImage from '@martyrs/src/modules/icons/placeholders/PlaceholderImage.vue'\nimport Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Chips from '@martyrs/src/components/Chips/Chips.vue'\n\n\n// Icons\nimport IconSettings from '@martyrs/src/modules/icons/entities/IconSettings.vue'\nimport IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue'\n\n// Forms\nimport AdjustmentForm from '../forms/AdjustmentForm.vue'\nimport StockAlertsForm from '../forms/StockAlertsForm.vue'\nimport HistoryView from '../forms/HistoryView.vue'\nimport ColumnSettingsMenu from '../forms/ColumnSettingsMenu.vue'\n\n// Stores\nimport * as inventory from '@martyrs/src/modules/inventory/store/inventory.store.js'\nimport * as products from '@martyrs/src/modules/products/store/products.js'\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js'\nimport stockAlerts from '@martyrs/src/modules/inventory/store/stock.alerts.store.js'\n\n// Router\nconst route = useRoute()\nconst router = useRouter()\nconst { formatPrice } = useGlobalMixins()\n\n// Products items state\nconst items = ref([])\n\n// Feed controls\nconst sort = ref({\n param: 'available',\n order: 'asc',\n options: [\n { label: 'Available', value: 'available' },\n { label: 'Name', value: 'name' },\n { label: 'Price', value: 'price' },\n { label: 'Created', value: 'createdAt' }\n ]\n})\n\nconst filter = reactive({\n active: false,\n class: '',\n selected: { category: [], stockLevel: [] },\n options: [\n { title: 'Categories', value: 'category', options: [] },\n {\n title: 'Stock Level',\n value: 'stockLevel',\n options: [\n { label: 'Low', value: 'low' },\n { label: 'Medium', value: 'medium' },\n { label: 'High', value: 'high' }\n ]\n }\n ]\n})\n\n// Column definitions + visibility, combined into one\nconst columns = reactive([\n { key: 'name', label: 'Product Name', component: true, visible: true },\n { key: 'category', label: 'Categories', component: true, visible: true },\n { key: 'storages', label: 'Storages', component: true, visible: true },\n { key: 'available',label: 'Total Available', component: true, visible: true },\n { key: 'price', label: 'Unit Price', component: true, visible: true },\n { key: 'actions', label: '', component: true, visible: true }\n])\n\n// Modal & selection state\nconst showAuditModal = ref(false)\nconst showReorderModal = ref(false)\nconst showHistoryModal = ref(false)\nconst showSettingsModal = ref(false)\nconst selectedProduct = ref(null)\n\n// Handlers\nfunction openStockAudit(row) {\n selectedProduct.value = row\n showAuditModal.value = true\n}\n\n// Update product after adjustment\nfunction handleAdjustmentCreated(adjustment) {\n // Find the product in items array\n const productIndex = items.value.findIndex(item => item._id === adjustment.product)\n \n if (productIndex !== -1) {\n // Update the available quantity\n items.value[productIndex].available += adjustment.quantity\n \n // Update availabilityDetails if present\n if (items.value[productIndex].availabilityDetails) {\n const storageDetail = items.value[productIndex].availabilityDetails.find(\n detail => detail.storage === adjustment.storage\n )\n \n if (storageDetail) {\n storageDetail.available += adjustment.quantity\n } else {\n // Add new storage detail if not found\n items.value[productIndex].availabilityDetails.push({\n storage: adjustment.storage,\n available: adjustment.quantity,\n storageName: adjustment.storageName || adjustment.storage\n })\n }\n }\n }\n \n showAuditModal.value = false\n}\nfunction openReorderSettings(row = null) {\n selectedProduct.value = row\n showReorderModal.value = true\n}\nfunction openStockHistory(row) {\n selectedProduct.value = row\n showHistoryModal.value = true\n}\nfunction openViewSettings() {\n showSettingsModal.value = true\n}\nfunction handleColumnsUpdate(updated) {\n // Update column visibility\n columns.forEach(col => {\n col.visible = updated.includes(col.key)\n })\n showSettingsModal.value = false\n}\n</script>\n\n<style>\n.bg-orange {\n background-color: rgb(var(--orange));\n}\n</style>\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Inventory.vue.js","sources":["../../../../../../../src/modules/inventory/components/pages/Inventory.vue"],"sourcesContent":["<template>\n <div class=\"pd-thin\">\n <!-- Header -->\n <header class=\"mn-b-medium flex-v-center flex-nowrap flex\">\n <h2>Inventory</h2>\n <button\n @click=\"route.meta.context === 'backoffice' ? router.push({ name: 'BackofficeInventoryAudit' }) : router.push({ name: 'OrganizationInventoryAudit', params: { _id: route.params._id } })\"\n class=\"mn-l-auto radius-small button t-white bg-second\"\n v-html=\"'+ New Audit'\"\n />\n </header>\n\n <!-- Products Feed -->\n <div class=\"rows-1\">\n <Feed\n :search=\"true\"\n v-model:sort=\"sort\"\n v-model:items=\"items\"\n :store=\"{\n read: (options) => products.actions.read(options),\n state: products.state\n }\"\n :actions=\"[{\n key: 'settings',\n component: IconSettings,\n props: {\n class: 'h-3r pd-r-small pd-l-small flex-center flex bg-light t-black radius-small hover:scale-[1.05] cursor-pointer'\n },\n handler: openViewSettings\n }]\"\n :options=\"{\n limit: 15,\n lookup: ['inventory','categories'],\n owner: route.params._id,\n sortParam: sort.param,\n sortOrder: sort.order\n }\"\n >\n <Table\n :columns=\"columns.filter(col => col.visible)\"\n :items=\"items\"\n class=\"bg-white z-index-1 br-1px br-light radius-medium\"\n >\n <!-- Name column (was \"product\") -->\n <template #cell-name=\"{ row }\">\n <div class=\"w-max-20r truncate flex gap-small flex-nowrap flex-v-center\">\n <img\n v-if=\"row.images?.length\"\n :src=\"(FILE_SERVER_URL || '') + row.images[0]\"\n alt=\"Product\"\n class=\"w-3r h-3r radius-small bg-light object-fit-cover\"\n />\n <PlaceholderImage v-else class=\"w-3r h-3r radius-small\" />\n <p class=\"truncate ws-nowrap\">{{ row.name || 'Unknown Product' }}</p>\n </div>\n </template>\n\n <!-- Categories -->\n <template #cell-category=\"{ row }\">\n <div class=\"w-max-10r flex-nowrap flex truncate\">\n <p\n v-if=\"row.category?.length\"\n v-for=\"cat in row.category\"\n :key=\"cat._id\"\n class=\"w-max truncate pd-small mn-r-micro radius-small bg-light t-small\"\n >\n {{ cat.name }}\n </p>\n <p v-else>-</p>\n </div>\n </template>\n\n <!-- Storages -->\n <template #cell-storages=\"{ row }\">\n <div class=\"w-max-10r flex-nowrap flex truncate\">\n <p\n v-if=\"row.availabilityDetails?.length\"\n v-for=\"avail in row.availabilityDetails\" \n :key=\"avail._id\"\n class=\"w-max truncate pd-small mn-r-micro radius-small bg-light t-small\"\n >\n\n <span class=\"fw-medium\">{{ avail.available || 0 }}</span> · \n <span class=\"t-small\">{{ avail.storageName || avail.storage }}:</span>\n </p>\n <p v-else>No stock</p>\n </div>\n </template>\n\n <!-- Available (replaces stock) -->\n <template #cell-available=\"{ row }\">\n <div class=\"flex-column flex\">\n <span class=\"d-block mn-b-thin\">\n {{ row.available }} ·\n {{ row.available <= 5 ? 'Low' : row.available <= 10 ? 'Medium' : 'High' }}\n </span>\n <div class=\"w-100 h-micro radius-thin bg-light\">\n <div\n class=\"h-100 radius-thin\"\n :class=\"\n row.available <= 1\n ? 'bg-red t-white'\n : row.available <= 2\n ? 'bg-orange t-white'\n : 'bg-green t-white'\n \"\n :style=\"`width: ${\n Math.min(\n (row.available / (row.alert !== undefined ? row.alert : 50)) * 100,\n 100\n )\n }%`\"\n />\n </div>\n </div>\n </template>\n <!-- Price -->\n <template #cell-price=\"{ row }\">\n {{ formatPrice(row.price || 0) }}\n </template>\n\n <!-- Actions -->\n <template #cell-actions=\"{ row }\">\n <Dropdown\n :label=\"{ component: IconEllipsis, class: 't-transp i-medium' }\"\n class=\"cursor-pointer aspect-1x1 pd-nano radius-small hover:bg-light\"\n align=\"right\"\n >\n <div class=\"bg-white radius-small\">\n <button @click=\"openStockAudit(row)\" class=\"cursor-pointer t-left ws-nowrap w-100 pd-small\">\n Audit Stock\n </button>\n <button @click=\"openStockHistory(row)\" class=\"cursor-pointer t-left ws-nowrap w-100 pd-small\">\n Stock History\n </button>\n <button @click=\"openReorderSettings(row)\" class=\"cursor-pointer t-left ws-nowrap w-100 pd-small\">\n Set Alerts\n </button>\n </div>\n </Dropdown>\n </template>\n </Table>\n </Feed>\n </div>\n <!-- Modals -->\n <Popup\n :isPopupOpen=\"showAuditModal\"\n @close-popup=\"showAuditModal = false\"\n title=\"Audit Stock\"\n class=\"bg-white radius-medium pd-medium w-min-40r\"\n >\n <AdjustmentForm\n :product=\"selectedProduct\"\n @close=\"showAuditModal = false\"\n @adjustment-created=\"handleAdjustmentCreated\"\n />\n </Popup>\n\n <Popup\n :isPopupOpen=\"showReorderModal\"\n @close-popup=\"showReorderModal = false\"\n title=\"Stock Level Alerts\"\n class=\"bg-white radius-medium pd-medium w-min-30r\"\n >\n <StockAlertsForm\n :product=\"selectedProduct\"\n @close=\"showReorderModal = false\"\n />\n </Popup>\n\n <Popup\n :isPopupOpen=\"showHistoryModal\"\n @close-popup=\"showHistoryModal = false\"\n title=\"Stock History\"\n class=\"bg-white radius-medium pd-medium w-min-50r\"\n >\n <HistoryView\n :product=\"selectedProduct\"\n @close=\"showHistoryModal = false\"\n />\n </Popup>\n\n <Popup\n :isPopupOpen=\"showSettingsModal\"\n @close-popup=\"showSettingsModal = false\"\n title=\"View Settings\"\n class=\"bg-white radius-medium pd-medium w-min-30r\"\n >\n <ColumnSettingsMenu\n :columns=\"columns\"\n @save=\"handleColumnsUpdate\"\n @close=\"showSettingsModal = false\"\n />\n </Popup>\n </div>\n</template>\n\n<script setup>\nimport { ref, reactive } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js'\n\n// Components\nimport Table from '@martyrs/src/components/Table/Table.vue'\nimport Feed from '@martyrs/src/components/Feed/Feed.vue'\nimport PlaceholderImage from '@martyrs/src/modules/icons/placeholders/PlaceholderImage.vue'\nimport Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Chips from '@martyrs/src/components/Chips/Chips.vue'\n\n\n// Icons\nimport IconSettings from '@martyrs/src/modules/icons/entities/IconSettings.vue'\nimport IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue'\n\n// Forms\nimport AdjustmentForm from '../forms/AdjustmentForm.vue'\nimport StockAlertsForm from '../forms/StockAlertsForm.vue'\nimport HistoryView from '../forms/HistoryView.vue'\nimport ColumnSettingsMenu from '../forms/ColumnSettingsMenu.vue'\n\n// Stores\nimport * as inventory from '@martyrs/src/modules/inventory/store/inventory.store.js'\nimport * as products from '@martyrs/src/modules/products/store/products.js'\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js'\nimport stockAlerts from '@martyrs/src/modules/inventory/store/stock.alerts.store.js'\n\n// Router\nconst route = useRoute()\nconst router = useRouter()\nconst { formatPrice } = useGlobalMixins()\n\n// Products items state\nconst items = ref([])\n\n// Feed controls\nconst sort = ref({\n param: 'available',\n order: 'asc',\n options: [\n { label: 'Available', value: 'available' },\n { label: 'Name', value: 'name' },\n { label: 'Price', value: 'price' },\n { label: 'Created', value: 'createdAt' }\n ]\n})\n\nconst filter = reactive({\n active: false,\n class: '',\n selected: { category: [], stockLevel: [] },\n options: [\n { title: 'Categories', value: 'category', options: [] },\n {\n title: 'Stock Level',\n value: 'stockLevel',\n options: [\n { label: 'Low', value: 'low' },\n { label: 'Medium', value: 'medium' },\n { label: 'High', value: 'high' }\n ]\n }\n ]\n})\n\n// Column definitions + visibility, combined into one\nconst columns = reactive([\n { key: 'name', label: 'Product Name', component: true, visible: true },\n { key: 'category', label: 'Categories', component: true, visible: true },\n { key: 'storages', label: 'Storages', component: true, visible: true },\n { key: 'available',label: 'Total Available', component: true, visible: true },\n { key: 'price', label: 'Unit Price', component: true, visible: true },\n { key: 'actions', label: '', component: true, visible: true }\n])\n\n// Modal & selection state\nconst showAuditModal = ref(false)\nconst showReorderModal = ref(false)\nconst showHistoryModal = ref(false)\nconst showSettingsModal = ref(false)\nconst selectedProduct = ref(null)\n\n// Handlers\nfunction openStockAudit(row) {\n selectedProduct.value = row\n showAuditModal.value = true\n}\n\n// Update product after adjustment\nfunction handleAdjustmentCreated(adjustment) {\n // Find the product in items array\n const productIndex = items.value.findIndex(item => item._id === adjustment.product)\n \n if (productIndex !== -1) {\n // Update the available quantity\n items.value[productIndex].available += adjustment.quantity\n \n // Update availabilityDetails if present\n if (items.value[productIndex].availabilityDetails) {\n const storageDetail = items.value[productIndex].availabilityDetails.find(\n detail => detail.storage === adjustment.storage\n )\n \n if (storageDetail) {\n storageDetail.available += adjustment.quantity\n } else {\n // Add new storage detail if not found\n items.value[productIndex].availabilityDetails.push({\n storage: adjustment.storage,\n available: adjustment.quantity,\n storageName: adjustment.storageName || adjustment.storage\n })\n }\n }\n }\n \n showAuditModal.value = false\n}\nfunction openReorderSettings(row = null) {\n selectedProduct.value = row\n showReorderModal.value = true\n}\nfunction openStockHistory(row) {\n selectedProduct.value = row\n showHistoryModal.value = true\n}\nfunction openViewSettings() {\n showSettingsModal.value = true\n}\nfunction handleColumnsUpdate(updated) {\n // Update column visibility\n columns.forEach(col => {\n col.visible = updated.includes(col.key)\n })\n showSettingsModal.value = false\n}\n</script>\n\n<style>\n.bg-orange {\n background-color: rgb(var(--orange));\n}\n</style>\n"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { ref, computed, onMounted, createElementBlock, openBlock, createElementVNode, createVNode, withCtx, unref, Fragment, renderList, createBlock, createCommentVNode, toDisplayString } from "vue";
2
2
  import _sfc_main$4 from "../../../../components/Block/Block.vue.js";
3
- import _sfc_main$7 from "../../../../components/Button/Button.vue.js";
3
+ import _sfc_main$7 from "../../../../components/Button/Button.vue2.js";
4
4
  import Field from "../../../../components/Field/Field.vue.js";
5
5
  import _sfc_main$2 from "../../../../components/Feed/Feed.vue.js";
6
- /* empty css */
6
+ /* empty css */
7
7
  /* empty css */
8
8
  import _sfc_main$1 from "../../../../components/Popup/Popup.vue.js";
9
9
  import _sfc_main$3 from "../../../orders/components/blocks/CardOrderItem.vue.js";