@ozdao/martyrs 0.2.582 → 0.2.584
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.
- package/dist/{main-vq1_XpmQ.js → main-fmp55tJF.js} +11 -11
- package/dist/martyrs/dist/{main-vq1_XpmQ.js → main-fmp55tJF.js} +2 -2
- package/dist/martyrs/dist/main-fmp55tJF.js.map +1 -0
- package/dist/martyrs/dist/{web-BNJDRie_.js → web-BDuQSQKS.js} +2 -2
- package/dist/martyrs/dist/{web-BNJDRie_.js.map → web-BDuQSQKS.js.map} +1 -1
- package/dist/martyrs/src/components/Button/{Button.vue.js → Button.vue2.js} +2 -2
- package/dist/martyrs/src/components/Button/Button.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Calendar/Calendar.vue2.js +5 -5
- package/dist/martyrs/src/components/Calendar/Calendar.vue2.js.map +1 -1
- package/dist/martyrs/src/components/EditImages/{EditImages.vue.js → EditImages.vue2.js} +2 -2
- package/dist/martyrs/src/components/EditImages/EditImages.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
- package/dist/martyrs/src/components/Field/Field.vue.js +2 -2
- package/dist/martyrs/src/components/Field/Field.vue.js.map +1 -1
- package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +2 -2
- package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js.map +1 -1
- package/dist/martyrs/src/components/FieldDate/FieldDate.vue.js +2 -2
- package/dist/martyrs/src/components/FieldDate/FieldDate.vue.js.map +1 -1
- package/dist/martyrs/src/components/Select/{Select.vue2.js → Select.vue.js} +2 -2
- package/dist/martyrs/src/components/Select/Select.vue.js.map +1 -0
- package/dist/martyrs/src/components/Spoiler/{Spoiler.vue.js → Spoiler.vue2.js} +2 -2
- package/dist/martyrs/src/components/Spoiler/Spoiler.vue2.js.map +1 -0
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +7 -13
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/UserDashboard.vue.js +182 -89
- package/dist/martyrs/src/modules/auth/views/components/pages/UserDashboard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/configs/navigation.user.config.js +9 -2
- package/dist/martyrs/src/modules/auth/views/configs/navigation.user.config.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js +3 -3
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js +2 -2
- package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/PopupAuth.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/PopupDateSelector.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js +3 -3
- package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Navigation.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/NavigationBar.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Sidebar.vue.js +2 -2
- package/dist/martyrs/src/modules/core/views/components/partials/Sidebar.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/{Filters.vue.js → Filters.vue2.js} +5 -5
- package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue2.js.map +1 -0
- package/dist/martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +2 -2
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +3 -3
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/sections/EditTickets.vue.js +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +4 -4
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +2 -2
- package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +2 -2
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.js +4 -4
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.js +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/pages/Marketplace.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/blocks/ActionButtons.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +6 -6
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/FullscreenPlayer.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/PlayerControls.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +1 -1
- package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js +3 -3
- package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js.map +1 -1
- package/dist/martyrs/src/modules/notifications/components/sections/NotificationPreferences.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.js +90 -175
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +8 -8
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js +41 -28
- package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/orders.client.js +14 -14
- package/dist/martyrs/src/modules/orders/orders.client.js.map +1 -1
- package/dist/martyrs/src/modules/orders/router/orders.router.js +23 -0
- package/dist/martyrs/src/modules/orders/router/orders.router.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +89 -40
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -1
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
- package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +2 -2
- package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/sections/FilterProducts.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +2 -2
- package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Spot.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js.map +1 -1
- package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +2 -2
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +3 -3
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js.map +1 -1
- package/dist/martyrs.css +1 -1
- package/dist/martyrs.es.js +1 -1
- package/dist/style.css +105 -110
- package/dist/{web-BNJDRie_.js → web-BDuQSQKS.js} +1 -1
- package/package.json +1 -1
- package/src/components/Calendar/Calendar.vue +4 -4
- package/src/components/Completion/Completion.vue +3 -3
- package/src/components/Field/Field.vue +1 -1
- package/src/components/FieldBig/FieldBig.vue +1 -1
- package/src/components/FieldDate/FieldDate.vue +1 -1
- package/src/modules/TASKS.MD +26 -1
- package/src/modules/auth/views/components/pages/Profile.vue +9 -15
- package/src/modules/auth/views/components/pages/UserDashboard.vue +214 -125
- package/src/modules/auth/views/configs/navigation.user.config.js +8 -2
- package/src/modules/community/components/layouts/Community.vue +2 -2
- package/src/modules/core/views/components/blocks/CardHeader.vue +1 -1
- package/src/modules/core/views/components/partials/Header.vue +1 -1
- package/src/modules/core/views/components/partials/Sidebar.vue +1 -1
- package/src/modules/core/views/components/sections/Filters.vue +2 -2
- package/src/modules/core/views/components/sections/SectionPageTitle.vue +1 -1
- package/src/modules/events/components/pages/EditEventTickets.vue +2 -2
- package/src/modules/gallery/components/sections/BackofficeGallery.vue +1 -1
- package/src/modules/inventory/components/pages/Inventory.vue +4 -4
- package/src/modules/inventory/components/pages/InventoryEdit.vue +1 -1
- package/src/modules/music/components/pages/Playlist.vue +5 -5
- package/src/modules/notifications/components/elements/NotificationBadge.vue +1 -1
- package/src/modules/orders/components/blocks/CardOrderUser.vue +88 -190
- package/src/modules/orders/components/pages/OrderBackoffice.vue +5 -5
- package/src/modules/orders/components/pages/Orders.vue +56 -50
- package/src/modules/orders/router/orders.router.js +33 -0
- package/src/modules/organizations/components/blocks/CardOrganization.vue +1 -1
- package/src/modules/organizations/components/pages/OrganizationEdit.vue +42 -11
- package/src/modules/pages/views/components/pages/PageEdit.vue +2 -2
- package/src/modules/pages/views/components/partials/SidebarPages.vue +1 -1
- package/src/modules/products/components/pages/Products.vue +1 -1
- package/src/modules/products/components/sections/EditDiscounts.vue +1 -1
- package/src/modules/products/components/sections/ProductConfigurator.vue +1 -1
- package/src/modules/spots/components/pages/Spots.vue +1 -1
- package/src/modules/wallet/views/components/blocks/CryptoDeposit.vue +1 -1
- package/src/modules/wallet/views/components/pages/Wallet.vue +1 -1
- package/dist/martyrs/dist/main-vq1_XpmQ.js.map +0 -1
- package/dist/martyrs/src/components/Button/Button.vue.js.map +0 -1
- package/dist/martyrs/src/components/EditImages/EditImages.vue.js.map +0 -1
- package/dist/martyrs/src/components/Select/Select.vue2.js.map +0 -1
- package/dist/martyrs/src/components/SelectMulti/SelectMulti.vue2.js +0 -625
- package/dist/martyrs/src/components/SelectMulti/SelectMulti.vue2.js.map +0 -1
- package/dist/martyrs/src/components/Spoiler/Spoiler.vue.js.map +0 -1
- package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue.js.map +0 -1
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusCanceled.vue.js +0 -32
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusCanceled.vue.js.map +0 -1
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusConfirmed.vue.js +0 -32
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusConfirmed.vue.js.map +0 -1
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusCreated.vue.js +0 -32
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusCreated.vue.js.map +0 -1
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusDelay.vue.js +0 -32
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusDelay.vue.js.map +0 -1
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusFinished.vue.js +0 -32
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusFinished.vue.js.map +0 -1
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusInUse.vue.js +0 -32
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusInUse.vue.js.map +0 -1
|
@@ -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,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.
|
|
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,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.
|
|
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";
|
|
@@ -12,7 +12,7 @@ import { state } from "../../../auth/views/store/auth.js";
|
|
|
12
12
|
import gallery from "../../store/gallery.js";
|
|
13
13
|
import _sfc_main$3 from "../../../core/views/components/blocks/CardHeader.vue.js";
|
|
14
14
|
import _sfc_main$1 from "../../../core/views/components/sections/SectionPageTitle.vue.js";
|
|
15
|
-
import _sfc_main$6 from "../../../../components/EditImages/EditImages.
|
|
15
|
+
import _sfc_main$6 from "../../../../components/EditImages/EditImages.vue2.js";
|
|
16
16
|
import _sfc_main$7 from "../../../../components/FieldTags/BlockTags.vue.js";
|
|
17
17
|
const _hoisted_1 = { class: "cols-1 gap-thin pd-thin" };
|
|
18
18
|
const _hoisted_2 = { class: "pos-relative" };
|
|
@@ -246,7 +246,7 @@ const _sfc_main = {
|
|
|
246
246
|
createVNode(_sfc_main$8, {
|
|
247
247
|
submit: () => createPhoto("draft"),
|
|
248
248
|
callback: closePhotoPopup,
|
|
249
|
-
class: "
|
|
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.
|
|
5
|
-
import _sfc_main$2 from "../../../../components/Button/Button.
|
|
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.
|
|
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.
|
|
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.
|
|
5
|
-
import _sfc_main$1 from "../../../../components/Button/Button.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InventoryEdit.vue.js","sources":["../../../../../../../src/modules/inventory/components/pages/InventoryEdit.vue"],"sourcesContent":["<template>\n <div class=\"pd-medium mobile:pd-thin\">\n <header class=\"mn-b-medium gap-small flex-v-center flex-nowrap flex\">\n <h2 class=\"\">Create Inventory Audit</h2>\n </header>\n \n <Popup \n title=\"Add position\" \n @close-popup=\"closeProductsPopup\" \n :isPopupOpen=\"isOpenProductsPopup\"\n class=\"bg-white w-100 w-max-30r radius-medium pd-medium\"\n >\n <Feed\n :search=\"{\n class: 'bg-light radius-small'\n }\"\n :states=\"{\n empty: {\n title: 'No Products Found',\n description: 'Currently, there are no such products available.'\n }\n }\"\n :store=\"{\n read: (options) => products.actions.read(options),\n state: null\n }\"\n :options=\"{\n owner: route.params._id,\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"flex-column flex gap-thin h-max-20r o-scroll\"\n >\n <CardOrderItem\n v-for=\"(product, index) in items\" \n :key=\"`${product._id}_${product.variant || 'no-variant'}_${index}`\"\n :editable=\"false\" \n :productId=\"product._id\"\n :variantId=\"product.variant\"\n :images=\"product.images\"\n :name=\"product.name\"\n :quantity=\"product.quantity || 1\"\n :unit=\"product.unit\"\n :dates=\"product.date\"\n :listing=\"product.listing\"\n :price=\"product.price\"\n @click=\"() => selectProduct(product)\"\n class=\"bg-light pd-small radius-small w-100\"\n />\n </Feed>\n </Popup>\n \n <!-- Popup for selecting variant of the product -->\n <Popup \n title=\"Select variant\" \n @close-popup=\"closeVariantsPopup\" \n :isPopupOpen=\"isVariantsPopupOpen\"\n class=\"bg-white w-100 w-max-30r radius-medium pd-medium\"\n >\n <Feed\n :store=\"variants\"\n :options=\"{\n product: selectedProduct._id,\n }\"\n :skeleton=\"{\n structure: [\n { block: 'text', size: 'small' },\n { block: 'text', size: 'medium' },\n { block: 'text', size: 'small' }\n ]\n }\"\n :states=\"{\n empty: {\n title: 'No variants',\n description: 'Create your first variant'\n }\n }\"\n v-slot=\"{ items }\"\n >\n <div class=\"gap-thin flex flex-column\">\n <div \n v-for=\"(variant, index) in items\" \n :key=\"index\"\n @click=\"addVariantToInventory(variant)\"\n class=\"w-100 cursor-pointer hover:scale-[1.05] bg-light pd-small radius-small flex-v-center flex-nowrap flex gap-thin\"\n >\n <div v-if=\"variant.images && variant.images.length\" class=\"aspect-1x1 h-3r radius-small o-hidden\">\n <img \n :src=\"(FILE_SERVER_URL || '') + variant.images[0]\" \n class=\"w-100 h-100 object-fit-cover\"\n />\n </div>\n <div>\n <p class=\"fw-medium\">{{ variant.name || 'Default variant' }}</p>\n <p v-if=\"variant.attributes && variant.attributes.length\" class=\"t-small t-transp\">\n {{ variant.attributes.map(attr => `${attr.name}: ${attr.value}`).join(', ') }}\n </p>\n </div>\n <p class=\"mn-l-auto\">{{ formatPrice(variant.cost) }}</p>\n </div>\n </div>\n </Feed>\n </Popup>\n\n <Block\n class=\"mn-b-thin\"\n >\n <Field\n v-model:field=\"inventory.state.current.comment\"\n placeholder=\"Describe details of the inventory audit\"\n type=\"textarea\"\n class=\"w-100 bg-white radius-small pd-medium\"\n /> \n <div class=\"fw-medium mn-t-small mn-b-thin\">Select Storage:</div>\n <Feed\n :states=\"{\n empty: {\n title: 'No Spots Found',\n description: 'Currently, there are no spots available.'\n }\n }\"\n :store=\"{\n read: (options) => spots.actions.read(options),\n state: null\n }\"\n :options=\"{\n user: auth.state.user._id,\n organization: route.params._id,\n limit: 3\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"flex-nowrap flex-column gap-thin flex\"\n >\n <CardSpot\n v-for=\"(spot, index) in items\"\n :key=\"index\"\n :spot=\"spot\"\n :organization=\"route.params._id\"\n :selected=\"inventory.state.current.storage === spot._id\"\n @click=\"() => inventory.state.current.storage = inventory.state.current.storage === spot._id ? null : spot._id\"\n class=\"radius-small h-min-big clickable bg-white\"\n />\n </Feed>\n\n\n </Block>\n\n <Block\n title=\"Positions\"\n :actions=\"[{\n label: '+',\n function: () => openProductsPopup()\n }]\"\n placeholder=\"No positions added yet\"\n class=\"h-100 flex-column flex gap-thin mn-b-thin\"\n >\n <CardPosition\n v-for=\"(position, index) in inventory.state.current.positions\" \n :key=\"position._id || index\" \n :image=\"position.image\"\n :name=\"position.name\"\n :title=\"formatPrice(position.cost * position.quantity)\"\n :title_class=\"[position.cost * position.quantity < 0 ? 't-red' : 't-grey']\"\n :subtitle=\"`${formatPrice(position.cost)} × ${Math.abs(position.quantity)}${position.unit} `\"\n >\n <template v-slot:actions>\n <QuantitySelector v-model=\"position.quantity\"/>\n \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=\"leftovers.state.current.positions.splice(index, 1)\" class=\"cursor-pointer t-left t-nowrap w-100 pd-small\">\n Delete\n </button>\n </div>\n </Dropdown> -->\n\n </template>\n </CardPosition>\n \n </Block>\n\n <!-- :actions=\"[{\n component: IconEdit,\n handler: () => store.core.actions.add(leftovers.state.current.positions, position),\n class: 'bg-light'\n },{\n component: IconDelete,\n handler: () => leftovers.state.current.positions.splice(index, 1),\n class: 'bg-red'\n }]\" -->\n\n <Block class=\"\">\n <section class=\"gap-thin flex-v-center flex-justify-start flex\">\n <span class=\"h3 mn-r-auto\">\n In total: {{formatPrice(totalPrice)}}\n </span>\n\n <!-- Save Draft -->\n <Button\n :submit=\"onSaveDraft\"\n class=\"bg-second w-min-5r button\"\n >\n <span>Save Draft</span>\n </Button>\n\n <!-- Publish -->\n <Button\n :submit=\"onPublish\"\n class=\"bg-main w-min-5r button\"\n >\n <span>Publish</span>\n </Button>\n\n <!-- Reset -->\n <Button\n :submit=\"onReset\"\n class=\"t-white w-min-5r bg-second button\"\n >\n <span>Reset</span>\n </Button>\n\n <!-- Delete button removed - only create mode supported -->\n </section>\n </Block>\n </div>\n</template>\n\n\n<script setup>\n import Block from '@martyrs/src/components/Block/Block.vue';\n import Button from \"@martyrs/src/components/Button/Button.vue\";\n import Field from '@martyrs/src/components/Field/Field.vue';\n import Feed from '@martyrs/src/components/Feed/Feed.vue';\n import Select from '@martyrs/src/components/Select/Select.vue';\n import Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue'\n import Popup from '@martyrs/src/components/Popup/Popup.vue';\n\n import CardOrderItem from '@martyrs/src/modules/orders/components/blocks/CardOrderItem.vue';\n import CardSpot from '@martyrs/src/modules/spots/components/blocks/CardSpot.vue'; \n\n import CardPosition from '@martyrs/src/modules/products/components/blocks/CardPosition.vue';\n import QuantitySelector from '@martyrs/src/modules/products/components/elements/QuantitySelector.vue';\n\n import { computed, onMounted, ref, reactive } from 'vue';\n import { useRoute, useRouter } from 'vue-router';\n import { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\n import { useStore } from '@martyrs/src/modules/core/views/store/core.store.js';\n import * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\n const store = useStore();\n import * as inventory from '@martyrs/src/modules/inventory/store/inventory.store.js';\n import * as products from '@martyrs/src/modules/products/store/products.js';\n import * as spots from '@martyrs/src/modules/spots/store/spots.js';\n import variants from '@martyrs/src/modules/products/store/variants.store.js';\n\n import IconEdit from '@martyrs/src/modules/icons/navigation/IconEdit.vue';\n import IconDelete from '@martyrs/src/modules/icons/navigation/IconDelete.vue';\n import IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue'\n\n const route = useRoute();\n const router = useRouter();\n const { formatPrice } = useGlobalMixins();\n \n const isOpenProductsPopup = ref(false);\n const isVariantsPopupOpen = ref(false);\n const selectedProduct = ref(null);\n\n const totalPrice = computed(() => {\n return inventory.state.current.positions.reduce((sum, position) => {\n return Number(sum) + Number(position.cost || 0) * Number(position.quantity || 1);\n }, 0);\n });\n\n function openProductsPopup() {\n isOpenProductsPopup.value = true;\n }\n\n function closeProductsPopup() {\n isOpenProductsPopup.value = false;\n }\n \n function closeVariantsPopup() {\n isVariantsPopupOpen.value = false;\n selectedProduct.value = null;\n }\n \n function selectProduct(product) {\n selectedProduct.value = product;\n closeProductsPopup();\n \n // If product has only one variant, add it directly without showing popup\n if (product.variants && product.variants.length === 1) {\n addVariantToInventory(product.variants[0]);\n return;\n }\n \n // If product has multiple variants or no variants defined, show popup\n isVariantsPopupOpen.value = true;\n }\n\n function formatProductName(product, variant) {\n if (!variant || product.variants?.length === 1 && !(variant.attributes?.length))\n return product.name;\n\n const attrs = variant.attributes?.map(a => a.value).filter(Boolean);\n return attrs?.length\n ? `${product.name} / ${attrs.join(' / ')}`\n : `${product.name} / ${variant.name}`;\n }\n\n \n function addVariantToInventory(variant) {\n // Create a position object that includes variant information\n console.log('variant',variant)\n const position = {\n _id: variant._id,\n product: selectedProduct.value._id, \n name: formatProductName(selectedProduct.value, variant),\n image: variant.images?.[0] || selectedProduct.value?.images?.[0] || null,\n cost: variant.cost || variant.price || 0,\n unit: variant.unit || 'pcs',\n quantity: 1,\n variant: {\n _id: variant._id,\n name: variant.name,\n attributes: variant.attributes || []\n }\n };\n // Add position to inventory state\n store.core.actions.add(inventory.state.current.positions, position);\n closeVariantsPopup();\n }\n\n onMounted(async () => {\n // Reset inventory state for new audit\n inventory.mutations.resetCurrent();\n });\n\n async function onReset() {\n inventory.mutations.resetCurrent();\n return true;\n }\n\n\n function prepareInventoryData(status = 'draft') {\n return {\n storage: inventory.state.current.storage,\n comment: inventory.state.current.comment,\n status: status,\n positions: inventory.state.current.positions.map(pos => ({\n product: pos.product,\n variant: pos.variant?._id,\n storage: inventory.state.current.storage,\n quantity: pos.quantity,\n reason: 'custom',\n comment: `Inventory audit: ${pos.name}`,\n cost: pos.cost\n })),\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\n function navigateBack() {\n if (route.meta.context === 'backoffice') {\n router.push({ name: 'BackofficeInventoryList' });\n } else if (route.meta.context === 'organization') {\n router.push({ name: 'OrganizationInventoryList', params: { _id: route.params._id } });\n }\n }\n\n async function onSaveDraft() {\n try {\n const inventoryData = prepareInventoryData('draft');\n await inventory.actions.createInventory(inventoryData);\n navigateBack();\n } catch (error) {\n console.error('Error creating draft inventory:', error);\n }\n }\n\n async function onPublish() {\n try {\n const inventoryData = prepareInventoryData('published');\n await inventory.actions.createInventory(inventoryData);\n navigateBack();\n } catch (error) {\n console.error('Error publishing inventory:', error);\n }\n }\n\n // Remove delete function as we only support creation mode\n</script>"],"names":["inventory.state","inventory.mutations","auth.state","inventory.actions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InventoryEdit.vue.js","sources":["../../../../../../../src/modules/inventory/components/pages/InventoryEdit.vue"],"sourcesContent":["<template>\n <div class=\"pd-medium mobile:pd-thin\">\n <header class=\"mn-b-medium gap-small flex-v-center flex-nowrap flex\">\n <h2 class=\"\">Create Inventory Audit</h2>\n </header>\n \n <Popup \n title=\"Add position\" \n @close-popup=\"closeProductsPopup\" \n :isPopupOpen=\"isOpenProductsPopup\"\n class=\"bg-white w-100 w-max-30r radius-medium pd-medium\"\n >\n <Feed\n :search=\"{\n class: 'bg-light radius-small'\n }\"\n :states=\"{\n empty: {\n title: 'No Products Found',\n description: 'Currently, there are no such products available.'\n }\n }\"\n :store=\"{\n read: (options) => products.actions.read(options),\n state: null\n }\"\n :options=\"{\n owner: route.params._id,\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"flex-column flex gap-thin h-max-20r o-scroll\"\n >\n <CardOrderItem\n v-for=\"(product, index) in items\" \n :key=\"`${product._id}_${product.variant || 'no-variant'}_${index}`\"\n :editable=\"false\" \n :productId=\"product._id\"\n :variantId=\"product.variant\"\n :images=\"product.images\"\n :name=\"product.name\"\n :quantity=\"product.quantity || 1\"\n :unit=\"product.unit\"\n :dates=\"product.date\"\n :listing=\"product.listing\"\n :price=\"product.price\"\n @click=\"() => selectProduct(product)\"\n class=\"bg-light pd-small radius-small w-100\"\n />\n </Feed>\n </Popup>\n \n <!-- Popup for selecting variant of the product -->\n <Popup \n title=\"Select variant\" \n @close-popup=\"closeVariantsPopup\" \n :isPopupOpen=\"isVariantsPopupOpen\"\n class=\"bg-white w-100 w-max-30r radius-medium pd-medium\"\n >\n <Feed\n :store=\"variants\"\n :options=\"{\n product: selectedProduct._id,\n }\"\n :skeleton=\"{\n structure: [\n { block: 'text', size: 'small' },\n { block: 'text', size: 'medium' },\n { block: 'text', size: 'small' }\n ]\n }\"\n :states=\"{\n empty: {\n title: 'No variants',\n description: 'Create your first variant'\n }\n }\"\n v-slot=\"{ items }\"\n >\n <div class=\"gap-thin flex flex-column\">\n <div \n v-for=\"(variant, index) in items\" \n :key=\"index\"\n @click=\"addVariantToInventory(variant)\"\n class=\"w-100 cursor-pointer hover:scale-[1.05] bg-light pd-small radius-small flex-v-center flex-nowrap flex gap-thin\"\n >\n <div v-if=\"variant.images && variant.images.length\" class=\"aspect-1x1 h-3r radius-small o-hidden\">\n <img \n :src=\"(FILE_SERVER_URL || '') + variant.images[0]\" \n class=\"w-100 h-100 object-fit-cover\"\n />\n </div>\n <div>\n <p class=\"fw-medium\">{{ variant.name || 'Default variant' }}</p>\n <p v-if=\"variant.attributes && variant.attributes.length\" class=\"t-small t-transp\">\n {{ variant.attributes.map(attr => `${attr.name}: ${attr.value}`).join(', ') }}\n </p>\n </div>\n <p class=\"mn-l-auto\">{{ formatPrice(variant.cost) }}</p>\n </div>\n </div>\n </Feed>\n </Popup>\n\n <Block\n class=\"mn-b-thin\"\n >\n <Field\n v-model:field=\"inventory.state.current.comment\"\n placeholder=\"Describe details of the inventory audit\"\n type=\"textarea\"\n class=\"w-100 bg-white radius-small pd-medium\"\n /> \n <div class=\"fw-medium mn-t-small mn-b-thin\">Select Storage:</div>\n <Feed\n :states=\"{\n empty: {\n title: 'No Spots Found',\n description: 'Currently, there are no spots available.'\n }\n }\"\n :store=\"{\n read: (options) => spots.actions.read(options),\n state: null\n }\"\n :options=\"{\n user: auth.state.user._id,\n organization: route.params._id,\n limit: 3\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"flex-nowrap flex-column gap-thin flex\"\n >\n <CardSpot\n v-for=\"(spot, index) in items\"\n :key=\"index\"\n :spot=\"spot\"\n :organization=\"route.params._id\"\n :selected=\"inventory.state.current.storage === spot._id\"\n @click=\"() => inventory.state.current.storage = inventory.state.current.storage === spot._id ? null : spot._id\"\n class=\"radius-small h-min-big clickable bg-white\"\n />\n </Feed>\n\n\n </Block>\n\n <Block\n title=\"Positions\"\n :actions=\"[{\n label: '+',\n function: () => openProductsPopup()\n }]\"\n placeholder=\"No positions added yet\"\n class=\"h-100 flex-column flex gap-thin mn-b-thin\"\n >\n <CardPosition\n v-for=\"(position, index) in inventory.state.current.positions\" \n :key=\"position._id || index\" \n :image=\"position.image\"\n :name=\"position.name\"\n :title=\"formatPrice(position.cost * position.quantity)\"\n :title_class=\"[position.cost * position.quantity < 0 ? 't-red' : 't-grey']\"\n :subtitle=\"`${formatPrice(position.cost)} × ${Math.abs(position.quantity)}${position.unit} `\"\n >\n <template v-slot:actions>\n <QuantitySelector v-model=\"position.quantity\"/>\n \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=\"leftovers.state.current.positions.splice(index, 1)\" class=\"cursor-pointer t-left ws-nowrap w-100 pd-small\">\n Delete\n </button>\n </div>\n </Dropdown> -->\n\n </template>\n </CardPosition>\n \n </Block>\n\n <!-- :actions=\"[{\n component: IconEdit,\n handler: () => store.core.actions.add(leftovers.state.current.positions, position),\n class: 'bg-light'\n },{\n component: IconDelete,\n handler: () => leftovers.state.current.positions.splice(index, 1),\n class: 'bg-red'\n }]\" -->\n\n <Block class=\"\">\n <section class=\"gap-thin flex-v-center flex-justify-start flex\">\n <span class=\"h3 mn-r-auto\">\n In total: {{formatPrice(totalPrice)}}\n </span>\n\n <!-- Save Draft -->\n <Button\n :submit=\"onSaveDraft\"\n class=\"bg-second w-min-5r button\"\n >\n <span>Save Draft</span>\n </Button>\n\n <!-- Publish -->\n <Button\n :submit=\"onPublish\"\n class=\"bg-main w-min-5r button\"\n >\n <span>Publish</span>\n </Button>\n\n <!-- Reset -->\n <Button\n :submit=\"onReset\"\n class=\"t-white w-min-5r bg-second button\"\n >\n <span>Reset</span>\n </Button>\n\n <!-- Delete button removed - only create mode supported -->\n </section>\n </Block>\n </div>\n</template>\n\n\n<script setup>\n import Block from '@martyrs/src/components/Block/Block.vue';\n import Button from \"@martyrs/src/components/Button/Button.vue\";\n import Field from '@martyrs/src/components/Field/Field.vue';\n import Feed from '@martyrs/src/components/Feed/Feed.vue';\n import Select from '@martyrs/src/components/Select/Select.vue';\n import Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue'\n import Popup from '@martyrs/src/components/Popup/Popup.vue';\n\n import CardOrderItem from '@martyrs/src/modules/orders/components/blocks/CardOrderItem.vue';\n import CardSpot from '@martyrs/src/modules/spots/components/blocks/CardSpot.vue'; \n\n import CardPosition from '@martyrs/src/modules/products/components/blocks/CardPosition.vue';\n import QuantitySelector from '@martyrs/src/modules/products/components/elements/QuantitySelector.vue';\n\n import { computed, onMounted, ref, reactive } from 'vue';\n import { useRoute, useRouter } from 'vue-router';\n import { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\n import { useStore } from '@martyrs/src/modules/core/views/store/core.store.js';\n import * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\n const store = useStore();\n import * as inventory from '@martyrs/src/modules/inventory/store/inventory.store.js';\n import * as products from '@martyrs/src/modules/products/store/products.js';\n import * as spots from '@martyrs/src/modules/spots/store/spots.js';\n import variants from '@martyrs/src/modules/products/store/variants.store.js';\n\n import IconEdit from '@martyrs/src/modules/icons/navigation/IconEdit.vue';\n import IconDelete from '@martyrs/src/modules/icons/navigation/IconDelete.vue';\n import IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue'\n\n const route = useRoute();\n const router = useRouter();\n const { formatPrice } = useGlobalMixins();\n \n const isOpenProductsPopup = ref(false);\n const isVariantsPopupOpen = ref(false);\n const selectedProduct = ref(null);\n\n const totalPrice = computed(() => {\n return inventory.state.current.positions.reduce((sum, position) => {\n return Number(sum) + Number(position.cost || 0) * Number(position.quantity || 1);\n }, 0);\n });\n\n function openProductsPopup() {\n isOpenProductsPopup.value = true;\n }\n\n function closeProductsPopup() {\n isOpenProductsPopup.value = false;\n }\n \n function closeVariantsPopup() {\n isVariantsPopupOpen.value = false;\n selectedProduct.value = null;\n }\n \n function selectProduct(product) {\n selectedProduct.value = product;\n closeProductsPopup();\n \n // If product has only one variant, add it directly without showing popup\n if (product.variants && product.variants.length === 1) {\n addVariantToInventory(product.variants[0]);\n return;\n }\n \n // If product has multiple variants or no variants defined, show popup\n isVariantsPopupOpen.value = true;\n }\n\n function formatProductName(product, variant) {\n if (!variant || product.variants?.length === 1 && !(variant.attributes?.length))\n return product.name;\n\n const attrs = variant.attributes?.map(a => a.value).filter(Boolean);\n return attrs?.length\n ? `${product.name} / ${attrs.join(' / ')}`\n : `${product.name} / ${variant.name}`;\n }\n\n \n function addVariantToInventory(variant) {\n // Create a position object that includes variant information\n console.log('variant',variant)\n const position = {\n _id: variant._id,\n product: selectedProduct.value._id, \n name: formatProductName(selectedProduct.value, variant),\n image: variant.images?.[0] || selectedProduct.value?.images?.[0] || null,\n cost: variant.cost || variant.price || 0,\n unit: variant.unit || 'pcs',\n quantity: 1,\n variant: {\n _id: variant._id,\n name: variant.name,\n attributes: variant.attributes || []\n }\n };\n // Add position to inventory state\n store.core.actions.add(inventory.state.current.positions, position);\n closeVariantsPopup();\n }\n\n onMounted(async () => {\n // Reset inventory state for new audit\n inventory.mutations.resetCurrent();\n });\n\n async function onReset() {\n inventory.mutations.resetCurrent();\n return true;\n }\n\n\n function prepareInventoryData(status = 'draft') {\n return {\n storage: inventory.state.current.storage,\n comment: inventory.state.current.comment,\n status: status,\n positions: inventory.state.current.positions.map(pos => ({\n product: pos.product,\n variant: pos.variant?._id,\n storage: inventory.state.current.storage,\n quantity: pos.quantity,\n reason: 'custom',\n comment: `Inventory audit: ${pos.name}`,\n cost: pos.cost\n })),\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\n function navigateBack() {\n if (route.meta.context === 'backoffice') {\n router.push({ name: 'BackofficeInventoryList' });\n } else if (route.meta.context === 'organization') {\n router.push({ name: 'OrganizationInventoryList', params: { _id: route.params._id } });\n }\n }\n\n async function onSaveDraft() {\n try {\n const inventoryData = prepareInventoryData('draft');\n await inventory.actions.createInventory(inventoryData);\n navigateBack();\n } catch (error) {\n console.error('Error creating draft inventory:', error);\n }\n }\n\n async function onPublish() {\n try {\n const inventoryData = prepareInventoryData('published');\n await inventory.actions.createInventory(inventoryData);\n navigateBack();\n } catch (error) {\n console.error('Error publishing inventory:', error);\n }\n }\n\n // Remove delete function as we only support creation mode\n</script>"],"names":["inventory.state","inventory.mutations","auth.state","inventory.actions"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createElementBlock, openBlock, createElementVNode, createCommentVNode, toDisplayString, unref, Fragment, renderList, createBlock, withCtx, createVNode, normalizeClass } from "vue";
|
|
2
|
-
import _sfc_main$1 from "../../../../components/Spoiler/Spoiler.
|
|
2
|
+
import _sfc_main$1 from "../../../../components/Spoiler/Spoiler.vue2.js";
|
|
3
3
|
import { useI18n } from "vue-i18n";
|
|
4
4
|
import IconChevronBottom from "../../../icons/navigation/IconChevronBottom.vue.js";
|
|
5
5
|
const _hoisted_1 = { class: "" };
|
|
@@ -2,7 +2,7 @@ import { ref, watch, createElementBlock, openBlock, createElementVNode, unref, c
|
|
|
2
2
|
import { useRoute, useRouter } from "vue-router";
|
|
3
3
|
import { useI18n } from "vue-i18n";
|
|
4
4
|
import _sfc_main$2 from "../../../../../components/Feed/Feed.vue.js";
|
|
5
|
-
import Filters from "../../../../core/views/components/sections/Filters.
|
|
5
|
+
import Filters from "../../../../core/views/components/sections/Filters.vue2.js";
|
|
6
6
|
import _sfc_main$1 from "../../../../core/views/components/sections/filters/FiltersGroup.vue.js";
|
|
7
7
|
import Field from "../../../../../components/Field/Field.vue.js";
|
|
8
8
|
import _sfc_main$3 from "../../../../organizations/components/blocks/CardOrganization.vue.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, createElementBlock, openBlock, Fragment, renderList, createBlock, normalizeClass, withCtx, createCommentVNode, createTextVNode, resolveDynamicComponent, toDisplayString, createElementVNode, createVNode } from "vue";
|
|
2
|
-
import _sfc_main$1 from "../../../../components/Button/Button.
|
|
2
|
+
import _sfc_main$1 from "../../../../components/Button/Button.vue2.js";
|
|
3
3
|
import _sfc_main$2 from "../../../../components/Dropdown/Dropdown.vue.js";
|
|
4
4
|
import _sfc_main$3 from "../../../icons/navigation/IconEllipsis.vue.js";
|
|
5
5
|
const _hoisted_1 = { class: "flex gap-small mn-b-medium" };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { computed, resolveComponent, createBlock, openBlock, withCtx, createElementVNode, createVNode, createElementBlock, createCommentVNode, withModifiers, toDisplayString } from "vue";
|
|
2
2
|
import Media from "../../../../components/Media/Media.vue.js";
|
|
3
|
-
import _sfc_main$1 from "../../../../components/Button/Button.
|
|
3
|
+
import _sfc_main$1 from "../../../../components/Button/Button.vue2.js";
|
|
4
4
|
import _sfc_main$2 from "../../../icons/navigation/IconPlay.vue.js";
|
|
5
5
|
import { actions } from "../../store/player.js";
|
|
6
6
|
import { state, actions as actions$1 } from "../../store/albums.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { resolveComponent, createBlock, openBlock, withCtx, createElementVNode, createCommentVNode, createElementBlock, toDisplayString, createTextVNode } from "vue";
|
|
2
|
-
import _sfc_main$2 from "../../../../components/Button/Button.
|
|
2
|
+
import _sfc_main$2 from "../../../../components/Button/Button.vue2.js";
|
|
3
3
|
import Media from "../../../../components/Media/Media.vue.js";
|
|
4
4
|
import _sfc_main$1 from "../../../icons/navigation/IconCheckmark.vue.js";
|
|
5
5
|
/* empty css */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { computed, resolveComponent, createBlock, openBlock, withCtx, createElementVNode, createVNode, createElementBlock, createCommentVNode, withModifiers, toDisplayString } from "vue";
|
|
2
2
|
import Media from "../../../../components/Media/Media.vue.js";
|
|
3
|
-
import _sfc_main$1 from "../../../../components/Button/Button.
|
|
3
|
+
import _sfc_main$1 from "../../../../components/Button/Button.vue2.js";
|
|
4
4
|
import _sfc_main$2 from "../../../icons/navigation/IconPlay.vue.js";
|
|
5
5
|
import { actions as actions$1 } from "../../store/player.js";
|
|
6
6
|
import { actions, state } from "../../store/playlists.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, resolveComponent, createElementBlock, openBlock, normalizeClass, createElementVNode, createCommentVNode, createBlock, toDisplayString, withModifiers, withCtx, createVNode, createTextVNode } from "vue";
|
|
2
|
-
import _sfc_main$1 from "../../../../components/Button/Button.
|
|
2
|
+
import _sfc_main$1 from "../../../../components/Button/Button.vue2.js";
|
|
3
3
|
import Media from "../../../../components/Media/Media.vue.js";
|
|
4
4
|
import _sfc_main$2 from "../../../icons/navigation/IconPlay.vue.js";
|
|
5
5
|
import _sfc_main$3 from "../../../icons/navigation/IconPause.vue.js";
|
|
@@ -2,8 +2,8 @@ import { reactive, ref, watch, onMounted, createElementBlock, openBlock, createE
|
|
|
2
2
|
import { useRouter, useRoute } from "vue-router";
|
|
3
3
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
4
4
|
import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
|
|
5
|
-
import _sfc_main$3 from "../../../../components/Button/Button.
|
|
6
|
-
import Select from "../../../../components/Select/Select.
|
|
5
|
+
import _sfc_main$3 from "../../../../components/Button/Button.vue2.js";
|
|
6
|
+
import Select from "../../../../components/Select/Select.vue.js";
|
|
7
7
|
import UploadImage from "../../../../components/UploadImage/UploadImage.vue.js";
|
|
8
8
|
import _sfc_main$2 from "../../../icons/navigation/IconCross.vue.js";
|
|
9
9
|
import BlockMultiselect from "../../../core/views/components/blocks/BlockMultiselect.vue.js";
|
|
@@ -2,9 +2,9 @@ import { reactive, ref, watch, onMounted, createElementBlock, openBlock, createE
|
|
|
2
2
|
import { useRouter, useRoute } from "vue-router";
|
|
3
3
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
4
4
|
import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
|
|
5
|
-
import _sfc_main$4 from "../../../../components/Button/Button.
|
|
5
|
+
import _sfc_main$4 from "../../../../components/Button/Button.vue2.js";
|
|
6
6
|
import _sfc_main$3 from "../../../../components/Checkbox/Checkbox.vue.js";
|
|
7
|
-
import Select from "../../../../components/Select/Select.
|
|
7
|
+
import Select from "../../../../components/Select/Select.vue.js";
|
|
8
8
|
import UploadImage from "../../../../components/UploadImage/UploadImage.vue.js";
|
|
9
9
|
/* empty css */
|
|
10
10
|
import BlockMultiselect from "../../../core/views/components/blocks/BlockMultiselect.vue.js";
|
|
@@ -2,7 +2,7 @@ import { reactive, ref, watch, computed, onMounted, createElementBlock, openBloc
|
|
|
2
2
|
import { useRouter, useRoute } from "vue-router";
|
|
3
3
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
4
4
|
import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
|
|
5
|
-
import _sfc_main$4 from "../../../../components/Button/Button.
|
|
5
|
+
import _sfc_main$4 from "../../../../components/Button/Button.vue2.js";
|
|
6
6
|
import _sfc_main$3 from "../../../../components/Radio/Radio.vue.js";
|
|
7
7
|
import UploadImage from "../../../../components/UploadImage/UploadImage.vue.js";
|
|
8
8
|
import _sfc_main$2 from "../../../icons/navigation/IconCross.vue.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, watch, onMounted, createElementBlock, openBlock, createVNode, withDirectives, createBlock, createCommentVNode, createElementVNode, withKeys, vModelText, withCtx } from "vue";
|
|
2
|
-
import _sfc_main$2 from "../../../../components/Button/Button.
|
|
2
|
+
import _sfc_main$2 from "../../../../components/Button/Button.vue2.js";
|
|
3
3
|
import _sfc_main$1 from "../../../icons/navigation/IconSearch.vue.js";
|
|
4
4
|
import _sfc_main$3 from "../../../icons/navigation/IconCross.vue.js";
|
|
5
5
|
/* empty css */
|