@ozdao/martyrs 0.2.583 → 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} +3 -3
- 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/Carousel.vue.js +1 -1
- 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/Loader/{Loader.vue2.js → Loader.vue.js} +2 -2
- package/dist/martyrs/src/components/Loader/Loader.vue.js.map +1 -0
- package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue.js +1 -1
- package/dist/martyrs/src/components/Media/Media.vue.js +1 -1
- package/dist/martyrs/src/components/Menu/{Menu.vue2.js → Menu.vue.js} +2 -2
- package/dist/martyrs/src/components/Menu/Menu.vue.js.map +1 -0
- 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/Tab/{Tab.vue2.js → Tab.vue.js} +2 -2
- package/dist/martyrs/src/components/Tab/Tab.vue.js.map +1 -0
- package/dist/martyrs/src/components/UploadImage/UploadImage.vue.js +1 -1
- package/dist/martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js +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 +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +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 +2 -2
- 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 +2 -2
- package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js +2 -2
- 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/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.vue2.js +3 -3
- package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue2.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue.js +2 -2
- 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 +3 -3
- 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/pages/EventsBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/sections/EditTickets.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/sections/Feed.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/sections/List.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/marketplace/views/components/sections/SectionMenu.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 +3 -3
- 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 +2 -2
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +7 -7
- 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 +2 -2
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +2 -2
- 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/sections/NotificationPreferences.vue.js +2 -2
- 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 +2 -2
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js +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/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/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 +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +4 -4
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +3 -3
- 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/elements/Image360.vue.js +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 +2 -2
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +4 -4
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +2 -2
- 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/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 +2 -2
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +2 -2
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.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/pages/Map.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +3 -3
- 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 +33 -33
- 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/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/orders/router/orders.router.js +33 -0
- package/src/modules/organizations/components/blocks/CardOrganization.vue +1 -1
- 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/Loader/Loader.vue2.js.map +0 -1
- package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +0 -1
- package/dist/martyrs/src/components/Select/Select.vue2.js.map +0 -1
- package/dist/martyrs/src/components/Tab/Tab.vue2.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Filters.vue2.js","sources":["../../../../../../../../src/modules/core/views/components/sections/Filters.vue"],"sourcesContent":["<template>\n <div class=\"flex o-x-scroll scroll-hide t-nowrap gap-thin\">\n <!-- All Filters Button -->\n <button\n @click=\"showAllFilters = true\"\n class=\"pd-small radius-medium bg-light flex-v-center flex gap-micro cursor-pointer\"\n :class=\"{ 'bg-main': activeFiltersCount > 0 }\"\n >\n <IconFilter class=\"i-regular\" />\n <span class=\"h-1r\"></span>\n <span v-if=\"activeFiltersCount\">{{ activeFiltersCount }}</span>\n </button>\n\n <!-- Individual Filter Buttons -->\n <button\n v-for=\"filter in filters\"\n :key=\"filter.value\"\n @click=\"openFilter(filter.value)\"\n class=\"pd-small radius-medium bg-light cursor-pointer flex-v-center flex gap-micro\"\n :class=\"{ 'selected bg-main': isFilterActive(filter) }\"\n >\n <IconCalendar v-if=\"filter.type === 'date'\" class=\"mn-r-micro i-regular\" />\n <span class=\"t-nowrap\">{{ filter.type === 'date' && getFilterValue(filter) ? formatFilterValue(filter) : filter.title }}</span>\n <span v-if=\"getFilterValue(filter) && filter.type !== 'date'\" class=\"mn-l-micro\">\n {{ formatFilterValue(filter) }}\n </span>\n </button>\n\n <!-- All Filters Popup -->\n <Popup\n :isPopupOpen=\"showAllFilters\"\n @close-popup=\"closeAllFilters\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"w-min-20r bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <FiltersGroup\n :filters=\"filters\"\n v-model:selected=\"tempSelected\"\n :immediate=\"false\"\n :showHeader=\"true\"\n :showApplyButton=\"true\"\n :showResetButton=\"true\"\n @update:selected=\"applyAllFilters\"\n />\n </Popup>\n\n <!-- Individual Filter Popups -->\n <Popup\n v-for=\"filter in filters\"\n :key=\"`popup-${filter.value}`\"\n :isPopupOpen=\"individualPopups[filter.value]\"\n @close-popup=\"cancelFilter(filter.value)\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <h4 class=\"mn-b-medium\">{{ filter.title }}</h4>\n\n <!-- Checkbox Filter -->\n <FilterCheckbox\n v-if=\"filter.type === 'checkbox'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <!-- Range Filter -->\n <FilterRange\n v-else-if=\"filter.type === 'range'\"\n v-model=\"tempSelected[filter.value]\"\n :minPlaceholder=\"filter.minPlaceholder || 'Min'\"\n :maxPlaceholder=\"filter.maxPlaceholder || 'Max'\"\n :label=\"filter.label\"\n />\n\n <!-- Date Filter -->\n <div v-else-if=\"filter.type === 'date'\">\n <div class=\"mn-t-small\">\n <Calendar\n v-model:date=\"tempSelected[filter.value]\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"bg-light radius-small\"\n />\n </div>\n </div>\n\n <!-- Radio/Options Filter -->\n <FilterOptions\n v-else-if=\"filter.type === 'radio'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <div class=\"flex gap-thin mn-t-medium\">\n <button\n @click=\"cancelFilter(filter.value)\"\n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n <button\n @click=\"applyFilter(filter.value)\"\n class=\"bg-main w-100 button flex-child-full\"\n >\n Apply\n </button>\n </div>\n </Popup>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, reactive, watch } from 'vue'\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport FiltersGroup from './filters/FiltersGroup.vue'\nimport FilterCheckbox from './filters/FilterCheckbox.vue'\nimport FilterRange from './filters/FilterRange.vue'\nimport FilterDateRange from './filters/FilterDateRange.vue'\nimport FilterOptions from './filters/FilterOptions.vue'\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue'\nimport IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\nconst filters = defineModel('filters', {\n type: Array,\n required: true\n})\n\nconst selected = defineModel('selected', {\n type: Object,\n default: () => ({})\n})\n\nconst emit = defineEmits(['select'])\n\nconst { formatDate, returnCurrency } = useGlobalMixins()\n\n// State\nconst showAllFilters = ref(false)\nconst individualPopups = reactive({})\nconst tempSelected = reactive({})\nconst tempDateRange = ref(null)\n\n// Initialize popups and temp values\nwatch(filters, (newFilters) => {\n newFilters.forEach(filter => {\n individualPopups[filter.value] = false\n \n if (!tempSelected[filter.value]) {\n if (filter.type === 'checkbox') {\n tempSelected[filter.value] = [...(selected.value[filter.value] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filter.value] = { ...(selected.value[filter.value] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filter.value] = selected.value[filter.value] || null\n } else {\n tempSelected[filter.value] = selected.value[filter.value] || null\n }\n }\n })\n}, { immediate: true, deep: true })\n\n// Sync selected to tempSelected\nwatch(selected, (newSelected) => {\n Object.keys(newSelected).forEach(key => {\n const filter = filters.value.find(f => f.value === key)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[key] = [...(newSelected[key] || [])]\n } else if (filter.type === 'range') {\n tempSelected[key] = { ...(newSelected[key] || { min: '', max: '' }) }\n } else {\n tempSelected[key] = newSelected[key]\n }\n }\n })\n}, { deep: true })\n\n// Computed\nconst activeFiltersCount = computed(() => {\n return Object.entries(selected.value).filter(([key, value]) => {\n if (Array.isArray(value)) return value.length > 0\n if (typeof value === 'object' && value !== null) {\n return value.min || value.max\n }\n return value !== null && value !== undefined\n }).length\n})\n\n// Methods\nconst openFilter = (filterValue) => {\n individualPopups[filterValue] = true\n}\n\nconst isFilterActive = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n if (Array.isArray(value)) return value.length > 0\n if (filter.type === 'range') return value.min || value.max\n return true\n}\n\nconst getFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n \n if (filter.type === 'range') {\n return value.min || value.max\n }\n \n if (filter.type === 'date') {\n return value && value.start && value.end\n }\n \n if (Array.isArray(value)) {\n return value.length > 0\n }\n \n return value\n}\n\nconst formatFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return ''\n \n if (Array.isArray(value)) {\n return `(${value.length})`\n }\n \n if (filter.type === 'range') {\n if (!value.min && !value.max) return ''\n return `${value.min || '0'}-${value.max || '∞'}`\n }\n \n if (filter.type === 'date') {\n if (!value || !value.start || !value.end) return ''\n return `${formatDate(value.start, { dayMonth: true, language: 'en' })} - ${formatDate(value.end, { dayMonth: true, language: 'en' })}`\n }\n \n if (filter.type === 'radio') {\n const option = filter.options.find(o => o.value === value)\n return option ? `(${option.label})` : ''\n }\n \n return ''\n}\n\nconst applyFilter = (filterValue) => {\n selected.value[filterValue] = tempSelected[filterValue]\n individualPopups[filterValue] = false\n emit('select', { filter: filterValue, value: tempSelected[filterValue] })\n}\n\nconst cancelFilter = (filterValue) => {\n const filter = filters.value.find(f => f.value === filterValue)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[filterValue] = [...(selected.value[filterValue] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filterValue] = { ...(selected.value[filterValue] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filterValue] = selected.value[filterValue] || null\n } else {\n tempSelected[filterValue] = selected.value[filterValue] || null\n }\n }\n individualPopups[filterValue] = false\n}\n\nconst applyAllFilters = (newValues) => {\n Object.entries(newValues).forEach(([key, value]) => {\n if (selected.value[key] !== value) {\n selected.value[key] = value\n emit('select', { filter: key, value })\n }\n })\n showAllFilters.value = false\n}\n\nconst closeAllFilters = () => {\n showAllFilters.value = false\n}\n</script>\n\n<style scoped>\n.filters-content {\n max-height: 60vh;\n overflow-y: auto;\n}\n</style>"],"names":["_useModel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Filters.vue2.js","sources":["../../../../../../../../src/modules/core/views/components/sections/Filters.vue"],"sourcesContent":["<template>\n <div class=\"flex o-x-scroll scroll-hide ws-nowrap gap-thin\">\n <!-- All Filters Button -->\n <button\n @click=\"showAllFilters = true\"\n class=\"pd-small radius-medium bg-light flex-v-center flex gap-micro cursor-pointer\"\n :class=\"{ 'bg-main': activeFiltersCount > 0 }\"\n >\n <IconFilter class=\"i-regular\" />\n <span class=\"h-1r\"></span>\n <span v-if=\"activeFiltersCount\">{{ activeFiltersCount }}</span>\n </button>\n\n <!-- Individual Filter Buttons -->\n <button\n v-for=\"filter in filters\"\n :key=\"filter.value\"\n @click=\"openFilter(filter.value)\"\n class=\"pd-small radius-medium bg-light cursor-pointer flex-v-center flex gap-micro\"\n :class=\"{ 'selected bg-main': isFilterActive(filter) }\"\n >\n <IconCalendar v-if=\"filter.type === 'date'\" class=\"mn-r-micro i-regular\" />\n <span class=\"ws-nowrap\">{{ filter.type === 'date' && getFilterValue(filter) ? formatFilterValue(filter) : filter.title }}</span>\n <span v-if=\"getFilterValue(filter) && filter.type !== 'date'\" class=\"mn-l-micro\">\n {{ formatFilterValue(filter) }}\n </span>\n </button>\n\n <!-- All Filters Popup -->\n <Popup\n :isPopupOpen=\"showAllFilters\"\n @close-popup=\"closeAllFilters\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"w-min-20r bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <FiltersGroup\n :filters=\"filters\"\n v-model:selected=\"tempSelected\"\n :immediate=\"false\"\n :showHeader=\"true\"\n :showApplyButton=\"true\"\n :showResetButton=\"true\"\n @update:selected=\"applyAllFilters\"\n />\n </Popup>\n\n <!-- Individual Filter Popups -->\n <Popup\n v-for=\"filter in filters\"\n :key=\"`popup-${filter.value}`\"\n :isPopupOpen=\"individualPopups[filter.value]\"\n @close-popup=\"cancelFilter(filter.value)\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <h4 class=\"mn-b-medium\">{{ filter.title }}</h4>\n\n <!-- Checkbox Filter -->\n <FilterCheckbox\n v-if=\"filter.type === 'checkbox'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <!-- Range Filter -->\n <FilterRange\n v-else-if=\"filter.type === 'range'\"\n v-model=\"tempSelected[filter.value]\"\n :minPlaceholder=\"filter.minPlaceholder || 'Min'\"\n :maxPlaceholder=\"filter.maxPlaceholder || 'Max'\"\n :label=\"filter.label\"\n />\n\n <!-- Date Filter -->\n <div v-else-if=\"filter.type === 'date'\">\n <div class=\"mn-t-small\">\n <Calendar\n v-model:date=\"tempSelected[filter.value]\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"bg-light radius-small\"\n />\n </div>\n </div>\n\n <!-- Radio/Options Filter -->\n <FilterOptions\n v-else-if=\"filter.type === 'radio'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <div class=\"flex gap-thin mn-t-medium\">\n <button\n @click=\"cancelFilter(filter.value)\"\n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n <button\n @click=\"applyFilter(filter.value)\"\n class=\"bg-main w-100 button flex-child-full\"\n >\n Apply\n </button>\n </div>\n </Popup>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, reactive, watch } from 'vue'\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport FiltersGroup from './filters/FiltersGroup.vue'\nimport FilterCheckbox from './filters/FilterCheckbox.vue'\nimport FilterRange from './filters/FilterRange.vue'\nimport FilterDateRange from './filters/FilterDateRange.vue'\nimport FilterOptions from './filters/FilterOptions.vue'\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue'\nimport IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\nconst filters = defineModel('filters', {\n type: Array,\n required: true\n})\n\nconst selected = defineModel('selected', {\n type: Object,\n default: () => ({})\n})\n\nconst emit = defineEmits(['select'])\n\nconst { formatDate, returnCurrency } = useGlobalMixins()\n\n// State\nconst showAllFilters = ref(false)\nconst individualPopups = reactive({})\nconst tempSelected = reactive({})\nconst tempDateRange = ref(null)\n\n// Initialize popups and temp values\nwatch(filters, (newFilters) => {\n newFilters.forEach(filter => {\n individualPopups[filter.value] = false\n \n if (!tempSelected[filter.value]) {\n if (filter.type === 'checkbox') {\n tempSelected[filter.value] = [...(selected.value[filter.value] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filter.value] = { ...(selected.value[filter.value] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filter.value] = selected.value[filter.value] || null\n } else {\n tempSelected[filter.value] = selected.value[filter.value] || null\n }\n }\n })\n}, { immediate: true, deep: true })\n\n// Sync selected to tempSelected\nwatch(selected, (newSelected) => {\n Object.keys(newSelected).forEach(key => {\n const filter = filters.value.find(f => f.value === key)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[key] = [...(newSelected[key] || [])]\n } else if (filter.type === 'range') {\n tempSelected[key] = { ...(newSelected[key] || { min: '', max: '' }) }\n } else {\n tempSelected[key] = newSelected[key]\n }\n }\n })\n}, { deep: true })\n\n// Computed\nconst activeFiltersCount = computed(() => {\n return Object.entries(selected.value).filter(([key, value]) => {\n if (Array.isArray(value)) return value.length > 0\n if (typeof value === 'object' && value !== null) {\n return value.min || value.max\n }\n return value !== null && value !== undefined\n }).length\n})\n\n// Methods\nconst openFilter = (filterValue) => {\n individualPopups[filterValue] = true\n}\n\nconst isFilterActive = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n if (Array.isArray(value)) return value.length > 0\n if (filter.type === 'range') return value.min || value.max\n return true\n}\n\nconst getFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n \n if (filter.type === 'range') {\n return value.min || value.max\n }\n \n if (filter.type === 'date') {\n return value && value.start && value.end\n }\n \n if (Array.isArray(value)) {\n return value.length > 0\n }\n \n return value\n}\n\nconst formatFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return ''\n \n if (Array.isArray(value)) {\n return `(${value.length})`\n }\n \n if (filter.type === 'range') {\n if (!value.min && !value.max) return ''\n return `${value.min || '0'}-${value.max || '∞'}`\n }\n \n if (filter.type === 'date') {\n if (!value || !value.start || !value.end) return ''\n return `${formatDate(value.start, { dayMonth: true, language: 'en' })} - ${formatDate(value.end, { dayMonth: true, language: 'en' })}`\n }\n \n if (filter.type === 'radio') {\n const option = filter.options.find(o => o.value === value)\n return option ? `(${option.label})` : ''\n }\n \n return ''\n}\n\nconst applyFilter = (filterValue) => {\n selected.value[filterValue] = tempSelected[filterValue]\n individualPopups[filterValue] = false\n emit('select', { filter: filterValue, value: tempSelected[filterValue] })\n}\n\nconst cancelFilter = (filterValue) => {\n const filter = filters.value.find(f => f.value === filterValue)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[filterValue] = [...(selected.value[filterValue] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filterValue] = { ...(selected.value[filterValue] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filterValue] = selected.value[filterValue] || null\n } else {\n tempSelected[filterValue] = selected.value[filterValue] || null\n }\n }\n individualPopups[filterValue] = false\n}\n\nconst applyAllFilters = (newValues) => {\n Object.entries(newValues).forEach(([key, value]) => {\n if (selected.value[key] !== value) {\n selected.value[key] = value\n emit('select', { filter: key, value })\n }\n })\n showAllFilters.value = false\n}\n\nconst closeAllFilters = () => {\n showAllFilters.value = false\n}\n</script>\n\n<style scoped>\n.filters-content {\n max-height: 60vh;\n overflow-y: auto;\n}\n</style>"],"names":["_useModel"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { resolveComponent, createElementBlock, openBlock, createElementVNode, createBlock, createCommentVNode, toDisplayString, Fragment, renderList, normalizeClass, withCtx, createTextVNode } from "vue";
|
|
2
|
-
import _sfc_main$1 from "../../../../../components/Tab/Tab.
|
|
2
|
+
import _sfc_main$1 from "../../../../../components/Tab/Tab.vue.js";
|
|
3
3
|
const _hoisted_1 = { class: "flex-v-center flex-nowrap flex" };
|
|
4
4
|
const _hoisted_2 = { class: "h2 mn-r-auto" };
|
|
5
5
|
const _hoisted_3 = ["onClick"];
|
|
@@ -49,7 +49,7 @@ const _sfc_main = {
|
|
|
49
49
|
selected: __props.tabs_current,
|
|
50
50
|
"onUpdate:selected": updateTabsCurrent,
|
|
51
51
|
tabs: __props.tabs,
|
|
52
|
-
class: "mn-t-small pd-thin bg-light radius-small w-max
|
|
52
|
+
class: "mn-t-small pd-thin bg-light radius-small w-max ws-nowrap o-scroll p-regular"
|
|
53
53
|
}, null, 8, ["selected", "tabs"])) : createCommentVNode("", true)
|
|
54
54
|
]);
|
|
55
55
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SectionPageTitle.vue.js","sources":["../../../../../../../../src/modules/core/views/components/sections/SectionPageTitle.vue"],"sourcesContent":["<template>\n <div>\n <header class=\"flex-v-center flex-nowrap flex\">\n <h1 class=\"h2 mn-r-auto\">{{ title }}</h1>\n\n <template \n v-for=\"action in actions\" \n v-if=\"actions && actions.length > 0\"\n >\n <router-link\n v-if=\"action.to\"\n :key=\"action.to\"\n :to=\"action.to\"\n :class=\"action.class || 'radius-extra pd-small pd-r-medium pd-l-medium p-regular uppercase fw-medium hover:scale-[1.05] ease cursor-pointer t-white bg-second flex-center flex'\"\n >\n {{ action.label }}\n </router-link>\n\n <button\n v-if=\"action.method\"\n @click=\"action.method\"\n :class=\"action.class || 'radius-extra pd-thin uppercase fw-medium hover:scale-[1.05] ease cursor-pointer t-white bg-second flex-center flex'\"\n >\n {{ action.label }}\n </button>\n </template>\n </header>\n\n <Tab\n v-if=\"tabs\"\n :selected=\"tabs_current\"\n @update:selected=\"updateTabsCurrent\"\n :tabs=\"tabs\"\n class=\"mn-t-small pd-thin bg-light radius-small w-max
|
|
1
|
+
{"version":3,"file":"SectionPageTitle.vue.js","sources":["../../../../../../../../src/modules/core/views/components/sections/SectionPageTitle.vue"],"sourcesContent":["<template>\n <div>\n <header class=\"flex-v-center flex-nowrap flex\">\n <h1 class=\"h2 mn-r-auto\">{{ title }}</h1>\n\n <template \n v-for=\"action in actions\" \n v-if=\"actions && actions.length > 0\"\n >\n <router-link\n v-if=\"action.to\"\n :key=\"action.to\"\n :to=\"action.to\"\n :class=\"action.class || 'radius-extra pd-small pd-r-medium pd-l-medium p-regular uppercase fw-medium hover:scale-[1.05] ease cursor-pointer t-white bg-second flex-center flex'\"\n >\n {{ action.label }}\n </router-link>\n\n <button\n v-if=\"action.method\"\n @click=\"action.method\"\n :class=\"action.class || 'radius-extra pd-thin uppercase fw-medium hover:scale-[1.05] ease cursor-pointer t-white bg-second flex-center flex'\"\n >\n {{ action.label }}\n </button>\n </template>\n </header>\n\n <Tab\n v-if=\"tabs\"\n :selected=\"tabs_current\"\n @update:selected=\"updateTabsCurrent\"\n :tabs=\"tabs\"\n class=\"mn-t-small pd-thin bg-light radius-small w-max ws-nowrap o-scroll p-regular\"\n />\n </div>\n</template>\n\n<script setup>\nimport { ref } from 'vue';\n\nimport Tab from '@martyrs/src/components/Tab/Tab.vue'\n\nconst emits = defineEmits([\n 'update:tabs_current'\n])\n\nconst props = defineProps({\n title: String,\n actions: Array,\n tabs: Array,\n tabs_current: [Object, String]\n});\n\nconst updateTabsCurrent = (newValue) => {\n emits('update:tabs_current', newValue); // Emitting to parent component\n}\n</script>\n\n<style scoped>\n</style>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AA2CA,UAAM,QAAQ;AAWd,UAAM,oBAAoB,CAAC,aAAa;AACtC,YAAM,uBAAuB,QAAQ;AAAA,IACvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ref, onMounted, onUnmounted, createBlock, openBlock, withCtx, createTextVNode, createCommentVNode, Teleport, createElementBlock, createElementVNode, createVNode } from "vue";
|
|
2
2
|
import { BarcodeScanner } from "../../../../../../node_modules/.pnpm/@capacitor-mlkit_barcode-scanning@7.3.0_@capacitor_core@7.4.4/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/index.js";
|
|
3
|
-
import _sfc_main$1 from "../../../../components/Button/Button.
|
|
3
|
+
import _sfc_main$1 from "../../../../components/Button/Button.vue2.js";
|
|
4
4
|
import { actions } from "../../store/tickets.js";
|
|
5
5
|
/* empty css */
|
|
6
6
|
const _hoisted_1 = {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createBlock, openBlock, withCtx, createTextVNode, toDisplayString } from "vue";
|
|
2
|
-
import _sfc_main$1 from "../../../../components/Button/Button.
|
|
2
|
+
import _sfc_main$1 from "../../../../components/Button/Button.vue2.js";
|
|
3
3
|
import { actions } from "../../store/tickets.js";
|
|
4
4
|
/* empty css */
|
|
5
5
|
import _export_sfc from "../../../../../../_virtual/_plugin-vue_export-helper.js";
|
|
@@ -12,10 +12,10 @@ import _sfc_main$9 from "../../../../components/Checkbox/Checkbox.vue.js";
|
|
|
12
12
|
import "axios";
|
|
13
13
|
/* empty css */
|
|
14
14
|
import UploadImage from "../../../../components/UploadImage/UploadImage.vue.js";
|
|
15
|
-
/* empty css
|
|
16
|
-
/* empty css
|
|
15
|
+
/* empty css */
|
|
16
|
+
/* empty css */
|
|
17
17
|
import _sfc_main$8 from "../../../../components/Feed/Feed.vue.js";
|
|
18
|
-
import _sfc_main$a from "../../../../components/Button/Button.
|
|
18
|
+
import _sfc_main$a from "../../../../components/Button/Button.vue2.js";
|
|
19
19
|
import _sfc_main$7 from "../../../core/views/components/blocks/Card.vue.js";
|
|
20
20
|
import _sfc_main$3 from "../sections/EditTickets.vue.js";
|
|
21
21
|
import _sfc_main$2 from "../../../icons/navigation/IconDelete.vue.js";
|
|
@@ -3,7 +3,7 @@ import _sfc_main$7 from "../../../../components/Feed/Feed.vue.js";
|
|
|
3
3
|
import _sfc_main$2 from "../../../../components/Block/Block.vue.js";
|
|
4
4
|
import _sfc_main$3 from "../../../../components/Popup/Popup.vue.js";
|
|
5
5
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
6
|
-
import _sfc_main$6 from "../../../../components/Button/Button.
|
|
6
|
+
import _sfc_main$6 from "../../../../components/Button/Button.vue2.js";
|
|
7
7
|
import _sfc_main$8 from "../../../../components/Dropdown/Dropdown.vue.js";
|
|
8
8
|
import _sfc_main$1 from "../elements/ButtonCheck.vue.js";
|
|
9
9
|
import _sfc_main$5 from "../../../icons/navigation/IconDelete.vue.js";
|
|
@@ -49,7 +49,7 @@ const _hoisted_21 = {
|
|
|
49
49
|
key: 1,
|
|
50
50
|
class: "bg-light radius-micro w-2r h-thin"
|
|
51
51
|
};
|
|
52
|
-
const _hoisted_22 = { class: "p-nano fw-medium
|
|
52
|
+
const _hoisted_22 = { class: "p-nano fw-medium ws-nowrap" };
|
|
53
53
|
const _hoisted_23 = ["onClick"];
|
|
54
54
|
const _hoisted_24 = ["href"];
|
|
55
55
|
const _hoisted_25 = ["src"];
|
|
@@ -370,7 +370,7 @@ const _sfc_main = {
|
|
|
370
370
|
createElementVNode("section", _hoisted_30, [
|
|
371
371
|
createElementVNode("button", {
|
|
372
372
|
onClick: ($event) => sendTicketEmail(ticket._id),
|
|
373
|
-
class: "w-100
|
|
373
|
+
class: "w-100 ws-nowrap bg-black br-1px br-white-transp-20 t-white button-small button"
|
|
374
374
|
}, " Send Email ", 8, _hoisted_31),
|
|
375
375
|
createElementVNode("button", {
|
|
376
376
|
onClick: ($event) => copyTicketLink(ticket._id),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditEventTickets.vue.js","sources":["../../../../../../../src/modules/events/components/pages/EditEventTickets.vue"],"sourcesContent":["<template>\n <article v-if=\"event\" class=\"pd-thin bg-white\">\n <!-- Header -->\n <header class=\"mn-b-medium flex-v-center flex-nowrap flex\">\n <h2>Tickets</h2>\n <button\n @click=\"openTicketsPopup()\"\n class=\"mn-l-auto radius-small button t-white bg-second\"\n v-html=\"'+ Add'\"\n />\n <ButtonCheck @qrcodecheck=\"fetchTickets = !fetchTickets\" class=\"mn-l-micro radius-small button t-white bg-second\" />\n </header>\n\n <!-- Statistics Cards -->\n <Block v-if=\"stats\" title=\"Statistics\" class=\"mn-b-thin\">\n <div class=\"cols-4 mobile:cols-2 gap-thin\">\n <div class=\"bg-white radius-medium pd-medium\">\n <p class=\"p-small fw-medium t-transp uppercase mn-b-thin\">Total Tickets</p>\n <h2 class=\"h2\">{{ stats.total }}</h2>\n </div>\n <div class=\"bg-white radius-medium pd-medium\">\n <p class=\"p-small fw-medium t-transp uppercase mn-b-thin\">Sold</p>\n <h2 class=\"h2 t-main\">{{ stats.sold }}</h2>\n </div>\n <div class=\"bg-white radius-medium pd-medium\">\n <p class=\"p-small fw-medium t-transp uppercase mn-b-thin\">Free</p>\n <h2 class=\"h2 t-grey\">{{ stats.free }}</h2>\n </div>\n <div class=\"bg-white radius-medium pd-medium\">\n <p class=\"p-small fw-medium t-transp uppercase mn-b-thin\">Refunds</p>\n <h2 class=\"h2 t-red\">{{ stats.refunded }}</h2>\n </div>\n </div>\n </Block>\n\n <!-- Attendance Graph -->\n <div v-if=\"attendance\" class=\"bg-light radius-medium pd-medium mn-b-thin\">\n <h4 class=\"mn-b-small fw-medium\">Attendance Graph</h4>\n\n <!-- General Stats -->\n <div class=\"flex-nowrap flex gap-thin mn-b-medium\">\n <div class=\"bg-white radius-small pd-small\">\n <span class=\"p-micro t-transp uppercase d-block mn-b-thin\">Total</span>\n <p class=\"p-medium fw-medium\">{{ attendance.total }}</p>\n </div>\n <div class=\"bg-white radius-small pd-small\">\n <span class=\"p-micro t-transp uppercase d-block mn-b-thin\">Expected</span>\n <p class=\"p-medium fw-medium\">{{ attendance.expected }}</p>\n </div>\n <div class=\"bg-white radius-small pd-small\">\n <span class=\"p-micro t-transp uppercase d-block mn-b-thin\">Arrived</span>\n <p class=\"p-medium fw-medium t-main\">{{ attendance.arrived }}</p>\n </div>\n </div>\n\n <!-- Timeline Graph -->\n <div v-if=\"attendance.timeline && attendance.timeline.length\" class=\"flex-nowrap flex flex-justify-around gap-micro scroll-hide o-y-hidden o-x-scroll mn-t-big\">\n <div\n v-for=\"slot in attendance.timeline\"\n :key=\"slot.time\"\n class=\"flex-column flex-v-center flex gap-micro flex-shrink-0\"\n >\n <div\n v-if=\"maxCount > 0\"\n class=\"bg-second radius-micro w-2r\"\n :style=\"{ height: `${Math.max((slot.count / maxCount) * 10, 0.5)}rem` }\"\n ></div>\n <div\n v-else\n class=\"bg-light radius-micro w-2r h-thin\"\n ></div>\n <p class=\"p-nano fw-medium t-nowrap\">{{ slot.time }}</p>\n </div>\n </div>\n </div>\n\n <!-- Add Tickets Popup -->\n <Popup\n @close-popup=\"closeTicketsPopup\"\n :isPopupOpen=\"isOpenTicketsPopup\"\n class=\"w-max-40r\"\n >\n <Block\n title=\"Add tickets\"\n placeholder=\"No parameters added yet\"\n class=\"cols-1 mn-b-thin gap-thin\"\n >\n <div\n class=\"gap-thin flex-nowrap flex\"\n v-for=\"(item, index) in newTickets\"\n :key=\"index\"\n >\n <Field\n v-model:field=\"item.name\"\n placeholder=\"Name\"\n class=\"w-50 bg-white radius-small pd-medium\"\n />\n <Field\n v-model:field=\"item.seat\"\n placeholder=\"Seat\"\n class=\"w-50 bg-white radius-small pd-medium\"\n />\n <Field\n v-model:field=\"item.email\"\n placeholder=\"Email\"\n class=\"w-100 bg-white radius-small pd-medium\"\n />\n\n <Field\n v-model:field=\"item.quantity\"\n placeholder=\"Quantity\"\n type=\"number\"\n class=\"w-25 bg-white radius-small pd-medium\"\n />\n\n <div v-if=\"index < 1\" @click=\"() => newTickets.push({name: '', value: '', target: event._id, type: 'event', quantity: 1})\" class=\"radius-small h-100 i-big flex-center flex aspect-1x1 bg-green\">\n <IconAdd\n class=\"i-medium\"\n :fill=\"'rgb(var(--white))'\"\n />\n </div>\n <div v-else @click=\"() => newTickets.splice(index, 1)\" class=\"radius-small h-100 i-big flex-center flex aspect-1x1 bg-red\">\n <IconDelete\n class=\"i-medium\"\n :fill=\"'rgb(var(--white))'\"\n />\n </div>\n </div>\n\n <Button\n :submit=\"onSubmit\"\n :callback=\"closeTicketsPopup\"\n class=\"w-100 bg-black t-white\"\n >\n Create Tickets\n </Button>\n </Block>\n </Popup>\n\n <!-- Tickets List -->\n <Feed\n :search=\"true\"\n :states=\"{\n empty: {\n title: 'No Tickets Found',\n description: 'Currently, there are no tickets.'\n }\n }\"\n :store=\"{\n read: (options) => tickets.actions.read(options),\n state: null\n }\"\n :options=\"{\n target: event._id\n }\"\n :external=\"fetchTickets\"\n v-slot=\"{ items }\"\n >\n <div\n v-for=\"(ticket, index) in items\"\n :key=\"index\"\n class=\"radius-medium bg-light gap-thin pd-medium flex-v-center flex-nowrap flex pos-relative mn-b-thin mobile:flex-v-start\"\n >\n <!-- QR Code - clickable PDF -->\n <a :href=\"ticket.image\" target=\"_blank\" class=\"flex-shrink-0\">\n <img loading=\"lazy\" :src=\"ticket.qrcode\" class=\"radius-small h-5r w-5r\">\n </a>\n\n <!-- Ticket Info -->\n <div class=\"w-100 o-hidden\">\n <h4 class=\"mn-b-thin flex-nowrap flex gap-thin\">\n <span>{{ ticket.client_refactor?.name || 'No name' }}</span><span v-if=\"ticket.seat\" class=\"pd-thin radius-micro p-small bg-second t-white\"> {{ ticket.seat }}</span>\n </h4>\n <p class=\"p-small t-transp mn-b-thin\">\n {{ ticket.client_refactor?.email || 'No email' }}\n </p>\n <span\n class=\"pd-thin radius-extra t-white fw-medium d-block w-max uppercase p-nano\"\n :class=\"{\n 'bg-main': ticket.status === 'unused',\n 'bg-grey': ticket.status === 'used',\n 'bg-red': ticket.status === 'deactivated'\n }\"\n >\n {{ ticket.status }}\n </span>\n </div>\n\n <!-- Actions -->\n <Dropdown\n :label=\"{ component: IconEllipsis, class: 't-transp i-regular' }\"\n :align=\"'right'\"\n class=\"cursor-pointer radius-small pd-small bg-white flex-shrink-0\"\n >\n <section class=\"bg-black flex-column flex gap-thin pd-thin radius-small\">\n <button\n @click=\"sendTicketEmail(ticket._id)\"\n class=\"w-100 t-nowrap bg-black br-1px br-white-transp-20 t-white button-small button\"\n >\n Send Email\n </button>\n\n <button\n @click=\"copyTicketLink(ticket._id)\"\n class=\"w-100 bg-black br-1px br-white-transp-20 t-white button-small button\"\n >\n Copy Link\n </button>\n\n <button\n v-if=\"ticket.status !== 'deactivated'\"\n @click=\"changeStatus(ticket, 'deactivated')\"\n class=\"w-100 bg-black br-1px br-white-transp-20 t-white button-small button\"\n >\n Deactivate\n </button>\n\n <button\n v-if=\"ticket.status === 'deactivated' || ticket.status === 'used'\"\n @click=\"changeStatus(ticket, 'unused')\"\n class=\"w-100 bg-black br-1px br-white-transp-20 t-white button-small button\"\n >\n Activate\n </button>\n </section>\n </Dropdown>\n </div>\n </Feed>\n </article>\n</template>\n\n<script setup>\nimport Feed from '@martyrs/src/components/Feed/Feed.vue';\nimport Block from '@martyrs/src/components/Block/Block.vue';\nimport Popup from \"@martyrs/src/components/Popup/Popup.vue\";\nimport Field from '@martyrs/src/components/Field/Field.vue';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue';\n\nimport ButtonCheck from '@martyrs/src/modules/events/components/elements/ButtonCheck.vue';\n\nimport IconDelete from '@martyrs/src/modules/icons/navigation/IconDelete.vue';\nimport IconAdd from '@martyrs/src/modules/icons/navigation/IconAdd.vue';\nimport IconFile from '@martyrs/src/modules/icons/entities/IconFile.vue';\nimport IconEmail from '@martyrs/src/modules/icons/entities/IconEmail.vue';\nimport IconAttach from '@martyrs/src/modules/icons/navigation/IconAttach.vue';\nimport IconDuplicate from '@martyrs/src/modules/icons/actions/IconDuplicate.vue';\nimport IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue';\n\nimport { ref, onMounted, computed } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\n\nimport * as events from '@martyrs/src/modules/events/store/events.js';\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\nimport * as tickets from '@martyrs/src/modules/events/store/tickets.js';\nimport { setSnack } from '@martyrs/src/modules/core/views/store/core.store.js';\n\nimport { useGlobalMixins } from \"@martyrs/src/modules/core/views/mixins/mixins.js\";\n\nconst { hasAccess } = useGlobalMixins();\n\nconst route = useRoute();\nconst router = useRouter();\n\nlet event = ref(null);\nconst stats = ref(null);\nconst attendance = ref(null);\n\nconst newTickets = ref([{\n name: '',\n email: '',\n target: null,\n type: 'event',\n seat: '',\n quantity: 1,\n}]);\n\nconst isOpenTicketsPopup = ref(false);\n\nfunction openTicketsPopup() {\n isOpenTicketsPopup.value = true;\n\n newTickets.value = [{\n name: '',\n email: '',\n target: event.value?._id,\n type: 'event',\n seat: '',\n quantity: 1,\n }];\n}\n\nfunction closeTicketsPopup() {\n isOpenTicketsPopup.value = false;\n}\n\nconst fetchTickets = ref(false);\n\n// Computed for max count in timeline\nconst maxCount = computed(() => {\n if (!attendance.value?.timeline) return 0;\n return Math.max(...attendance.value.timeline.map(slot => slot.count), 1);\n});\n\nonMounted(async () => {\n const data = await events.read({ user: auth.state.user._id, url: route.params.url });\n\n event.value = data.pop();\n\n if (!event.value) {\n router.push({name: 'notfound'});\n }\n\n if (event.value.owner.type === 'organization') {\n const isAccess = hasAccess(event.value.owner.target._id, 'events', 'edit', auth.state.accesses, auth.state.access.roles);\n\n if (!isAccess) {\n router.push({name: 'unauthorized'});\n }\n } else {\n if (event.value.creator.target._id !== auth.state.user._id) {\n router.push({name: 'unauthorized'});\n }\n }\n\n // Load statistics\n try {\n stats.value = await tickets.actions.getStats(event.value._id);\n attendance.value = await tickets.actions.getAttendance(event.value._id);\n } catch (error) {\n console.error('Error loading stats:', error);\n }\n});\n\nasync function onSubmit() {\n try {\n const response = await tickets.actions.create(newTickets.value);\n fetchTickets.value = !fetchTickets.value;\n\n // Refresh stats\n stats.value = await tickets.actions.getStats(event.value._id);\n attendance.value = await tickets.actions.getAttendance(event.value._id);\n } catch (error) {\n console.log(error);\n }\n}\n\nasync function changeStatus(ticket, status) {\n if (confirm('Are you sure you want to change ticket status?')) {\n try {\n const response = await tickets.actions.update({ ...ticket, status: status });\n fetchTickets.value = !fetchTickets.value;\n\n // Refresh stats\n stats.value = await tickets.actions.getStats(event.value._id);\n attendance.value = await tickets.actions.getAttendance(event.value._id);\n } catch (error) {\n console.error(error);\n }\n }\n}\n\nfunction viewPdf(ticket) {\n if (ticket.image) {\n window.open(ticket.image, '_blank');\n } else {\n alert('PDF not available for this ticket');\n }\n}\n\nasync function sendTicketEmail(ticketId) {\n try {\n await tickets.actions.sendEmail(ticketId);\n alert('Ticket sent successfully!');\n } catch (error) {\n console.error('Error sending email:', error);\n alert('Failed to send ticket');\n }\n}\n\nfunction copyTicketLink(ticketId) {\n const link = `${window.location.origin}/tickets/${ticketId}`;\n navigator.clipboard.writeText(link);\n setSnack('Link copied to clipboard');\n}\n\nfunction redirectTo() {\n // Placeholder callback\n}\n</script>\n\n<style lang=\"scss\">\n .dp__input {\n border: 0;\n padding: var(--medium);\n padding-left: 3rem;\n background: rgb(var(--grey))\n }\n</style>\n"],"names":["events.read","auth.state","tickets.actions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EditEventTickets.vue.js","sources":["../../../../../../../src/modules/events/components/pages/EditEventTickets.vue"],"sourcesContent":["<template>\n <article v-if=\"event\" class=\"pd-thin bg-white\">\n <!-- Header -->\n <header class=\"mn-b-medium flex-v-center flex-nowrap flex\">\n <h2>Tickets</h2>\n <button\n @click=\"openTicketsPopup()\"\n class=\"mn-l-auto radius-small button t-white bg-second\"\n v-html=\"'+ Add'\"\n />\n <ButtonCheck @qrcodecheck=\"fetchTickets = !fetchTickets\" class=\"mn-l-micro radius-small button t-white bg-second\" />\n </header>\n\n <!-- Statistics Cards -->\n <Block v-if=\"stats\" title=\"Statistics\" class=\"mn-b-thin\">\n <div class=\"cols-4 mobile:cols-2 gap-thin\">\n <div class=\"bg-white radius-medium pd-medium\">\n <p class=\"p-small fw-medium t-transp uppercase mn-b-thin\">Total Tickets</p>\n <h2 class=\"h2\">{{ stats.total }}</h2>\n </div>\n <div class=\"bg-white radius-medium pd-medium\">\n <p class=\"p-small fw-medium t-transp uppercase mn-b-thin\">Sold</p>\n <h2 class=\"h2 t-main\">{{ stats.sold }}</h2>\n </div>\n <div class=\"bg-white radius-medium pd-medium\">\n <p class=\"p-small fw-medium t-transp uppercase mn-b-thin\">Free</p>\n <h2 class=\"h2 t-grey\">{{ stats.free }}</h2>\n </div>\n <div class=\"bg-white radius-medium pd-medium\">\n <p class=\"p-small fw-medium t-transp uppercase mn-b-thin\">Refunds</p>\n <h2 class=\"h2 t-red\">{{ stats.refunded }}</h2>\n </div>\n </div>\n </Block>\n\n <!-- Attendance Graph -->\n <div v-if=\"attendance\" class=\"bg-light radius-medium pd-medium mn-b-thin\">\n <h4 class=\"mn-b-small fw-medium\">Attendance Graph</h4>\n\n <!-- General Stats -->\n <div class=\"flex-nowrap flex gap-thin mn-b-medium\">\n <div class=\"bg-white radius-small pd-small\">\n <span class=\"p-micro t-transp uppercase d-block mn-b-thin\">Total</span>\n <p class=\"p-medium fw-medium\">{{ attendance.total }}</p>\n </div>\n <div class=\"bg-white radius-small pd-small\">\n <span class=\"p-micro t-transp uppercase d-block mn-b-thin\">Expected</span>\n <p class=\"p-medium fw-medium\">{{ attendance.expected }}</p>\n </div>\n <div class=\"bg-white radius-small pd-small\">\n <span class=\"p-micro t-transp uppercase d-block mn-b-thin\">Arrived</span>\n <p class=\"p-medium fw-medium t-main\">{{ attendance.arrived }}</p>\n </div>\n </div>\n\n <!-- Timeline Graph -->\n <div v-if=\"attendance.timeline && attendance.timeline.length\" class=\"flex-nowrap flex flex-justify-around gap-micro scroll-hide o-y-hidden o-x-scroll mn-t-big\">\n <div\n v-for=\"slot in attendance.timeline\"\n :key=\"slot.time\"\n class=\"flex-column flex-v-center flex gap-micro flex-shrink-0\"\n >\n <div\n v-if=\"maxCount > 0\"\n class=\"bg-second radius-micro w-2r\"\n :style=\"{ height: `${Math.max((slot.count / maxCount) * 10, 0.5)}rem` }\"\n ></div>\n <div\n v-else\n class=\"bg-light radius-micro w-2r h-thin\"\n ></div>\n <p class=\"p-nano fw-medium ws-nowrap\">{{ slot.time }}</p>\n </div>\n </div>\n </div>\n\n <!-- Add Tickets Popup -->\n <Popup\n @close-popup=\"closeTicketsPopup\"\n :isPopupOpen=\"isOpenTicketsPopup\"\n class=\"w-max-40r\"\n >\n <Block\n title=\"Add tickets\"\n placeholder=\"No parameters added yet\"\n class=\"cols-1 mn-b-thin gap-thin\"\n >\n <div\n class=\"gap-thin flex-nowrap flex\"\n v-for=\"(item, index) in newTickets\"\n :key=\"index\"\n >\n <Field\n v-model:field=\"item.name\"\n placeholder=\"Name\"\n class=\"w-50 bg-white radius-small pd-medium\"\n />\n <Field\n v-model:field=\"item.seat\"\n placeholder=\"Seat\"\n class=\"w-50 bg-white radius-small pd-medium\"\n />\n <Field\n v-model:field=\"item.email\"\n placeholder=\"Email\"\n class=\"w-100 bg-white radius-small pd-medium\"\n />\n\n <Field\n v-model:field=\"item.quantity\"\n placeholder=\"Quantity\"\n type=\"number\"\n class=\"w-25 bg-white radius-small pd-medium\"\n />\n\n <div v-if=\"index < 1\" @click=\"() => newTickets.push({name: '', value: '', target: event._id, type: 'event', quantity: 1})\" class=\"radius-small h-100 i-big flex-center flex aspect-1x1 bg-green\">\n <IconAdd\n class=\"i-medium\"\n :fill=\"'rgb(var(--white))'\"\n />\n </div>\n <div v-else @click=\"() => newTickets.splice(index, 1)\" class=\"radius-small h-100 i-big flex-center flex aspect-1x1 bg-red\">\n <IconDelete\n class=\"i-medium\"\n :fill=\"'rgb(var(--white))'\"\n />\n </div>\n </div>\n\n <Button\n :submit=\"onSubmit\"\n :callback=\"closeTicketsPopup\"\n class=\"w-100 bg-black t-white\"\n >\n Create Tickets\n </Button>\n </Block>\n </Popup>\n\n <!-- Tickets List -->\n <Feed\n :search=\"true\"\n :states=\"{\n empty: {\n title: 'No Tickets Found',\n description: 'Currently, there are no tickets.'\n }\n }\"\n :store=\"{\n read: (options) => tickets.actions.read(options),\n state: null\n }\"\n :options=\"{\n target: event._id\n }\"\n :external=\"fetchTickets\"\n v-slot=\"{ items }\"\n >\n <div\n v-for=\"(ticket, index) in items\"\n :key=\"index\"\n class=\"radius-medium bg-light gap-thin pd-medium flex-v-center flex-nowrap flex pos-relative mn-b-thin mobile:flex-v-start\"\n >\n <!-- QR Code - clickable PDF -->\n <a :href=\"ticket.image\" target=\"_blank\" class=\"flex-shrink-0\">\n <img loading=\"lazy\" :src=\"ticket.qrcode\" class=\"radius-small h-5r w-5r\">\n </a>\n\n <!-- Ticket Info -->\n <div class=\"w-100 o-hidden\">\n <h4 class=\"mn-b-thin flex-nowrap flex gap-thin\">\n <span>{{ ticket.client_refactor?.name || 'No name' }}</span><span v-if=\"ticket.seat\" class=\"pd-thin radius-micro p-small bg-second t-white\"> {{ ticket.seat }}</span>\n </h4>\n <p class=\"p-small t-transp mn-b-thin\">\n {{ ticket.client_refactor?.email || 'No email' }}\n </p>\n <span\n class=\"pd-thin radius-extra t-white fw-medium d-block w-max uppercase p-nano\"\n :class=\"{\n 'bg-main': ticket.status === 'unused',\n 'bg-grey': ticket.status === 'used',\n 'bg-red': ticket.status === 'deactivated'\n }\"\n >\n {{ ticket.status }}\n </span>\n </div>\n\n <!-- Actions -->\n <Dropdown\n :label=\"{ component: IconEllipsis, class: 't-transp i-regular' }\"\n :align=\"'right'\"\n class=\"cursor-pointer radius-small pd-small bg-white flex-shrink-0\"\n >\n <section class=\"bg-black flex-column flex gap-thin pd-thin radius-small\">\n <button\n @click=\"sendTicketEmail(ticket._id)\"\n class=\"w-100 ws-nowrap bg-black br-1px br-white-transp-20 t-white button-small button\"\n >\n Send Email\n </button>\n\n <button\n @click=\"copyTicketLink(ticket._id)\"\n class=\"w-100 bg-black br-1px br-white-transp-20 t-white button-small button\"\n >\n Copy Link\n </button>\n\n <button\n v-if=\"ticket.status !== 'deactivated'\"\n @click=\"changeStatus(ticket, 'deactivated')\"\n class=\"w-100 bg-black br-1px br-white-transp-20 t-white button-small button\"\n >\n Deactivate\n </button>\n\n <button\n v-if=\"ticket.status === 'deactivated' || ticket.status === 'used'\"\n @click=\"changeStatus(ticket, 'unused')\"\n class=\"w-100 bg-black br-1px br-white-transp-20 t-white button-small button\"\n >\n Activate\n </button>\n </section>\n </Dropdown>\n </div>\n </Feed>\n </article>\n</template>\n\n<script setup>\nimport Feed from '@martyrs/src/components/Feed/Feed.vue';\nimport Block from '@martyrs/src/components/Block/Block.vue';\nimport Popup from \"@martyrs/src/components/Popup/Popup.vue\";\nimport Field from '@martyrs/src/components/Field/Field.vue';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue';\n\nimport ButtonCheck from '@martyrs/src/modules/events/components/elements/ButtonCheck.vue';\n\nimport IconDelete from '@martyrs/src/modules/icons/navigation/IconDelete.vue';\nimport IconAdd from '@martyrs/src/modules/icons/navigation/IconAdd.vue';\nimport IconFile from '@martyrs/src/modules/icons/entities/IconFile.vue';\nimport IconEmail from '@martyrs/src/modules/icons/entities/IconEmail.vue';\nimport IconAttach from '@martyrs/src/modules/icons/navigation/IconAttach.vue';\nimport IconDuplicate from '@martyrs/src/modules/icons/actions/IconDuplicate.vue';\nimport IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue';\n\nimport { ref, onMounted, computed } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\n\nimport * as events from '@martyrs/src/modules/events/store/events.js';\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\nimport * as tickets from '@martyrs/src/modules/events/store/tickets.js';\nimport { setSnack } from '@martyrs/src/modules/core/views/store/core.store.js';\n\nimport { useGlobalMixins } from \"@martyrs/src/modules/core/views/mixins/mixins.js\";\n\nconst { hasAccess } = useGlobalMixins();\n\nconst route = useRoute();\nconst router = useRouter();\n\nlet event = ref(null);\nconst stats = ref(null);\nconst attendance = ref(null);\n\nconst newTickets = ref([{\n name: '',\n email: '',\n target: null,\n type: 'event',\n seat: '',\n quantity: 1,\n}]);\n\nconst isOpenTicketsPopup = ref(false);\n\nfunction openTicketsPopup() {\n isOpenTicketsPopup.value = true;\n\n newTickets.value = [{\n name: '',\n email: '',\n target: event.value?._id,\n type: 'event',\n seat: '',\n quantity: 1,\n }];\n}\n\nfunction closeTicketsPopup() {\n isOpenTicketsPopup.value = false;\n}\n\nconst fetchTickets = ref(false);\n\n// Computed for max count in timeline\nconst maxCount = computed(() => {\n if (!attendance.value?.timeline) return 0;\n return Math.max(...attendance.value.timeline.map(slot => slot.count), 1);\n});\n\nonMounted(async () => {\n const data = await events.read({ user: auth.state.user._id, url: route.params.url });\n\n event.value = data.pop();\n\n if (!event.value) {\n router.push({name: 'notfound'});\n }\n\n if (event.value.owner.type === 'organization') {\n const isAccess = hasAccess(event.value.owner.target._id, 'events', 'edit', auth.state.accesses, auth.state.access.roles);\n\n if (!isAccess) {\n router.push({name: 'unauthorized'});\n }\n } else {\n if (event.value.creator.target._id !== auth.state.user._id) {\n router.push({name: 'unauthorized'});\n }\n }\n\n // Load statistics\n try {\n stats.value = await tickets.actions.getStats(event.value._id);\n attendance.value = await tickets.actions.getAttendance(event.value._id);\n } catch (error) {\n console.error('Error loading stats:', error);\n }\n});\n\nasync function onSubmit() {\n try {\n const response = await tickets.actions.create(newTickets.value);\n fetchTickets.value = !fetchTickets.value;\n\n // Refresh stats\n stats.value = await tickets.actions.getStats(event.value._id);\n attendance.value = await tickets.actions.getAttendance(event.value._id);\n } catch (error) {\n console.log(error);\n }\n}\n\nasync function changeStatus(ticket, status) {\n if (confirm('Are you sure you want to change ticket status?')) {\n try {\n const response = await tickets.actions.update({ ...ticket, status: status });\n fetchTickets.value = !fetchTickets.value;\n\n // Refresh stats\n stats.value = await tickets.actions.getStats(event.value._id);\n attendance.value = await tickets.actions.getAttendance(event.value._id);\n } catch (error) {\n console.error(error);\n }\n }\n}\n\nfunction viewPdf(ticket) {\n if (ticket.image) {\n window.open(ticket.image, '_blank');\n } else {\n alert('PDF not available for this ticket');\n }\n}\n\nasync function sendTicketEmail(ticketId) {\n try {\n await tickets.actions.sendEmail(ticketId);\n alert('Ticket sent successfully!');\n } catch (error) {\n console.error('Error sending email:', error);\n alert('Failed to send ticket');\n }\n}\n\nfunction copyTicketLink(ticketId) {\n const link = `${window.location.origin}/tickets/${ticketId}`;\n navigator.clipboard.writeText(link);\n setSnack('Link copied to clipboard');\n}\n\nfunction redirectTo() {\n // Placeholder callback\n}\n</script>\n\n<style lang=\"scss\">\n .dp__input {\n border: 0;\n padding: var(--medium);\n padding-left: 3rem;\n background: rgb(var(--grey))\n }\n</style>\n"],"names":["events.read","auth.state","tickets.actions"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, onMounted, createElementBlock, openBlock, createVNode, TransitionGroup, withCtx, createCommentVNode, createBlock, Fragment, renderList, unref, createElementVNode, toDisplayString, createTextVNode } from "vue";
|
|
2
|
-
/* empty css
|
|
2
|
+
/* empty css */
|
|
3
3
|
import _sfc_main$2 from "../../../constructor/components/sections/Viewer.vue.js";
|
|
4
4
|
import _sfc_main$4 from "../../../../components/Countdown/Countdown.vue.js";
|
|
5
5
|
import HeroEvent from "../sections/HeroEvent.vue.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { computed, ref, watch, createElementBlock, openBlock, createElementVNode, createCommentVNode, unref, createBlock, createVNode, isRef, withCtx, Fragment, renderList } from "vue";
|
|
2
2
|
import { useRoute, useRouter } from "vue-router";
|
|
3
|
-
import _sfc_main$1 from "../../../../components/Tab/Tab.
|
|
3
|
+
import _sfc_main$1 from "../../../../components/Tab/Tab.vue.js";
|
|
4
4
|
import _sfc_main$2 from "../../../../components/Feed/Feed.vue.js";
|
|
5
5
|
/* empty css */
|
|
6
6
|
import _sfc_main$3 from "../blocks/CardEvent.vue.js";
|
|
@@ -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,5 +1,5 @@
|
|
|
1
1
|
import { ref, onMounted, createElementBlock, openBlock, createVNode, TransitionGroup, withCtx, createBlock, createCommentVNode, Transition, Fragment, renderList } from "vue";
|
|
2
|
-
import Loader from "../../../../components/Loader/Loader.
|
|
2
|
+
import Loader from "../../../../components/Loader/Loader.vue.js";
|
|
3
3
|
import _sfc_main$1 from "../../../../components/EmptyState/EmptyState.vue.js";
|
|
4
4
|
import _sfc_main$2 from "../blocks/CardEvent.vue.js";
|
|
5
5
|
import { read } from "../../store/events.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, onMounted, createElementBlock, openBlock, createVNode, TransitionGroup, withCtx, createBlock, Fragment, renderList, normalizeClass } from "vue";
|
|
2
|
-
/* empty css
|
|
2
|
+
/* empty css */
|
|
3
3
|
import _sfc_main$1 from "../../../../components/EmptyState/EmptyState.vue.js";
|
|
4
4
|
import _sfc_main$2 from "../blocks/CardEventShort.vue.js";
|
|
5
5
|
import SkeletonEventShort from "../../../icons/skeletons/SkeletonEventShort.vue.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ref, createElementBlock, openBlock, createVNode, unref, isRef, withCtx, Fragment, renderList, createElementVNode, toDisplayString, createBlock, createCommentVNode, createTextVNode } from "vue";
|
|
2
2
|
import { useRoute } from "vue-router";
|
|
3
3
|
/* empty css */
|
|
4
|
-
import _sfc_main$8 from "../../../../components/Button/Button.
|
|
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";
|