@ozdao/martyrs 0.2.582 → 0.2.584
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{main-vq1_XpmQ.js → main-fmp55tJF.js} +11 -11
- package/dist/martyrs/dist/{main-vq1_XpmQ.js → main-fmp55tJF.js} +2 -2
- package/dist/martyrs/dist/main-fmp55tJF.js.map +1 -0
- package/dist/martyrs/dist/{web-BNJDRie_.js → web-BDuQSQKS.js} +2 -2
- package/dist/martyrs/dist/{web-BNJDRie_.js.map → web-BDuQSQKS.js.map} +1 -1
- package/dist/martyrs/src/components/Button/{Button.vue.js → Button.vue2.js} +2 -2
- package/dist/martyrs/src/components/Button/Button.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Calendar/Calendar.vue2.js +5 -5
- package/dist/martyrs/src/components/Calendar/Calendar.vue2.js.map +1 -1
- package/dist/martyrs/src/components/EditImages/{EditImages.vue.js → EditImages.vue2.js} +2 -2
- package/dist/martyrs/src/components/EditImages/EditImages.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
- package/dist/martyrs/src/components/Field/Field.vue.js +2 -2
- package/dist/martyrs/src/components/Field/Field.vue.js.map +1 -1
- package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +2 -2
- package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js.map +1 -1
- package/dist/martyrs/src/components/FieldDate/FieldDate.vue.js +2 -2
- package/dist/martyrs/src/components/FieldDate/FieldDate.vue.js.map +1 -1
- package/dist/martyrs/src/components/Select/{Select.vue2.js → Select.vue.js} +2 -2
- package/dist/martyrs/src/components/Select/Select.vue.js.map +1 -0
- package/dist/martyrs/src/components/Spoiler/{Spoiler.vue.js → Spoiler.vue2.js} +2 -2
- package/dist/martyrs/src/components/Spoiler/Spoiler.vue2.js.map +1 -0
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +7 -13
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/UserDashboard.vue.js +182 -89
- package/dist/martyrs/src/modules/auth/views/components/pages/UserDashboard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/configs/navigation.user.config.js +9 -2
- package/dist/martyrs/src/modules/auth/views/configs/navigation.user.config.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js +3 -3
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js +2 -2
- package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/PopupAuth.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/PopupDateSelector.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js +3 -3
- package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Navigation.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/NavigationBar.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Sidebar.vue.js +2 -2
- package/dist/martyrs/src/modules/core/views/components/partials/Sidebar.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/{Filters.vue.js → Filters.vue2.js} +5 -5
- package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue2.js.map +1 -0
- package/dist/martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +2 -2
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +3 -3
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/sections/EditTickets.vue.js +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +4 -4
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +2 -2
- package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +2 -2
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.js +4 -4
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.js +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/pages/Marketplace.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/blocks/ActionButtons.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +6 -6
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/FullscreenPlayer.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/PlayerControls.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +1 -1
- package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js +3 -3
- package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js.map +1 -1
- package/dist/martyrs/src/modules/notifications/components/sections/NotificationPreferences.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.js +90 -175
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +8 -8
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js +41 -28
- package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/orders.client.js +14 -14
- package/dist/martyrs/src/modules/orders/orders.client.js.map +1 -1
- package/dist/martyrs/src/modules/orders/router/orders.router.js +23 -0
- package/dist/martyrs/src/modules/orders/router/orders.router.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +89 -40
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -1
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
- package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +2 -2
- package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/sections/FilterProducts.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +2 -2
- package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Spot.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js.map +1 -1
- package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +2 -2
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +3 -3
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js.map +1 -1
- package/dist/martyrs.css +1 -1
- package/dist/martyrs.es.js +1 -1
- package/dist/style.css +105 -110
- package/dist/{web-BNJDRie_.js → web-BDuQSQKS.js} +1 -1
- package/package.json +1 -1
- package/src/components/Calendar/Calendar.vue +4 -4
- package/src/components/Completion/Completion.vue +3 -3
- package/src/components/Field/Field.vue +1 -1
- package/src/components/FieldBig/FieldBig.vue +1 -1
- package/src/components/FieldDate/FieldDate.vue +1 -1
- package/src/modules/TASKS.MD +26 -1
- package/src/modules/auth/views/components/pages/Profile.vue +9 -15
- package/src/modules/auth/views/components/pages/UserDashboard.vue +214 -125
- package/src/modules/auth/views/configs/navigation.user.config.js +8 -2
- package/src/modules/community/components/layouts/Community.vue +2 -2
- package/src/modules/core/views/components/blocks/CardHeader.vue +1 -1
- package/src/modules/core/views/components/partials/Header.vue +1 -1
- package/src/modules/core/views/components/partials/Sidebar.vue +1 -1
- package/src/modules/core/views/components/sections/Filters.vue +2 -2
- package/src/modules/core/views/components/sections/SectionPageTitle.vue +1 -1
- package/src/modules/events/components/pages/EditEventTickets.vue +2 -2
- package/src/modules/gallery/components/sections/BackofficeGallery.vue +1 -1
- package/src/modules/inventory/components/pages/Inventory.vue +4 -4
- package/src/modules/inventory/components/pages/InventoryEdit.vue +1 -1
- package/src/modules/music/components/pages/Playlist.vue +5 -5
- package/src/modules/notifications/components/elements/NotificationBadge.vue +1 -1
- package/src/modules/orders/components/blocks/CardOrderUser.vue +88 -190
- package/src/modules/orders/components/pages/OrderBackoffice.vue +5 -5
- package/src/modules/orders/components/pages/Orders.vue +56 -50
- package/src/modules/orders/router/orders.router.js +33 -0
- package/src/modules/organizations/components/blocks/CardOrganization.vue +1 -1
- package/src/modules/organizations/components/pages/OrganizationEdit.vue +42 -11
- package/src/modules/pages/views/components/pages/PageEdit.vue +2 -2
- package/src/modules/pages/views/components/partials/SidebarPages.vue +1 -1
- package/src/modules/products/components/pages/Products.vue +1 -1
- package/src/modules/products/components/sections/EditDiscounts.vue +1 -1
- package/src/modules/products/components/sections/ProductConfigurator.vue +1 -1
- package/src/modules/spots/components/pages/Spots.vue +1 -1
- package/src/modules/wallet/views/components/blocks/CryptoDeposit.vue +1 -1
- package/src/modules/wallet/views/components/pages/Wallet.vue +1 -1
- package/dist/martyrs/dist/main-vq1_XpmQ.js.map +0 -1
- package/dist/martyrs/src/components/Button/Button.vue.js.map +0 -1
- package/dist/martyrs/src/components/EditImages/EditImages.vue.js.map +0 -1
- package/dist/martyrs/src/components/Select/Select.vue2.js.map +0 -1
- package/dist/martyrs/src/components/SelectMulti/SelectMulti.vue2.js +0 -625
- package/dist/martyrs/src/components/SelectMulti/SelectMulti.vue2.js.map +0 -1
- package/dist/martyrs/src/components/Spoiler/Spoiler.vue.js.map +0 -1
- package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue.js.map +0 -1
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusCanceled.vue.js +0 -32
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusCanceled.vue.js.map +0 -1
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusConfirmed.vue.js +0 -32
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusConfirmed.vue.js.map +0 -1
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusCreated.vue.js +0 -32
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusCreated.vue.js.map +0 -1
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusDelay.vue.js +0 -32
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusDelay.vue.js.map +0 -1
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusFinished.vue.js +0 -32
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusFinished.vue.js.map +0 -1
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusInUse.vue.js +0 -32
- package/dist/martyrs/src/modules/orders/components/icons/IconStatusInUse.vue.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Products.vue.js","sources":["../../../../../../../src/modules/products/components/pages/Products.vue"],"sourcesContent":["<template>\n <div class=\"pos-relative\">\n <header \n v-if=\"route.name !== 'Organization' && !MOBILE_APP\"\n class=\"pd-medium flex-v-center flex-nowrap flex\"\n >\n <h2 class=\"mn-r-medium\">{{ currentCategory ? currentCategory.name : 'All Products' }}</h2>\n <button \n v-if=\"route.params._id && hasAccess(route.params._id, 'products', 'create', auth.state.accesses, auth.state.access.roles)\"\n @click=\"$router.push({\n name: route.params?._id ? 'Organization_ProductAdd' : 'ProductAdd'\n })\" \n class=\"radius-extra i-big hover:scale-[1.05] cursor-pointer t-white bg-second\">\n +\n </button>\n </header>\n\n <div class=\"cols-[1fr_3fr] mobile:cols-1 br-1px br-light z-index-3 pos-relative\">\n\n <div class=\"o-y-scroll br-r-1px br-light pd-medium z-index-2 desktop-only h-100 pos-relative\">\n <div class=\"w-100 o-y-scroll h-100\">\n <!-- Категории -->\n <div class=\"mn-b-medium\" v-if=\"currentCategories.length > 0\">\n <h4 class=\"mn-b-medium\">\n {{ route.params.categoryPath ? 'Subcategories' : 'Categories' }}\n </h4>\n <div class=\"gap-micro\">\n <div\n v-for=\"category in currentCategories\"\n :key=\"category._id\"\n @click=\"selectCategory(category)\"\n class=\"cursor-pointer hover:underline mn-b-regular ease\"\n >\n {{ category.name }}\n <br>\n <span v-for=\"subcategory in category.children\">{{subcategory.name}}</span>\n </div>\n </div>\n </div>\n\n <!-- Фильтры категории -->\n <Spoiler \n v-for=\"filter in categoryFilters\"\n :key=\"filter.name\"\n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\">{{ filter.name }}</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180deg mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-medium\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small\">\n <Checkbox \n v-for=\"option in filter.options\"\n :key=\"option.text || option\"\n v-model:radio=\"selectedFilters[filter.name]\"\n :label=\"option.text || option\"\n :value=\"option.text || option\"\n mode=\"checkbox\"\n class=\"mn-b-micro\"\n />\n </div>\n </template>\n </Spoiler>\n \n <!-- Цена за сутки -->\n <Spoiler \n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\"> Price</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180deg mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-medium\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small flex gap-thin\">\n <Field\n v-model:field=\"selectedFilters.price.min\"\n placeholder=\"From\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n <Field\n v-model:field=\"selectedFilters.price.max\"\n placeholder=\"To\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n </div>\n </template>\n </Spoiler>\n\n <!-- Доступность -->\n <Spoiler \n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\">Availability</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180deg mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-medium\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small\">\n <div \n @click=\"() => { tempSelectedDates = selectedFilters.availability; showDatePickerPopup = true; }\"\n :class=\"{ 'bg-light': selectedFilters?.availability }\"\n class=\"pd-small field-wrapper radius-small bg-light cursor-pointer hover:bg-light ease flex-v-center flex gap-thin\"\n >\n <IconCalendar class=\"i-medium\" />\n <span class=\"h-1r\">{{ selectedFilters.availability ? `${formatDate(selectedFilters.availability.start, { dayMonth: true, language: 'en' })} - ${formatDate(selectedFilters.availability.end, { dayMonth: true, language: 'en' })}` : 'Select dates'}}</span>\n </div>\n </div>\n </template>\n </Spoiler>\n\n <!-- Кнопка очистки фильтров -->\n <button \n @click=\"clearAllFilters\"\n class=\"bg-main w-100 button mn-t-medium\"\n >\n Clear Filters\n </button>\n </div>\n </div>\n\n <div class=\"w-100 rows-1 pd-thin pos-relative o-hidden\">\n \n <slot></slot>\n\n <div class=\"mn-b-thin mobile-only w-100 o-y-scroll scroll-hide scroll-snap-x-mandatory scroll-pd-regular\">\n <div class=\"gap-thin flex-nowrap flex\">\n <div\n v-for=\"category in currentCategories\"\n :key=\"category._id\"\n @click=\"selectCategory(category)\"\n class=\" flex-child-default bg-light flex t-nowrap pd-medium radius-medium cursor-pointer hover:bg-light ease\"\n >\n {{ category.name }}\n </div>\n </div>\n </div>\n\n <Feed\n :search=\"true\"\n v-model:sort=\"products.state.sort\"\n :showLoadMore=\"false\"\n :states=\"{\n empty: {\n title: 'No Products Found',\n description: 'Currently, there are no products available.'\n }\n }\"\n :store=\"{\n read: (options) => products.actions.read(options),\n state: products.state\n }\"\n :options=\"{\n limit: 16,\n owner: route.name?.includes('Organization') ? route.params._id : null,\n lookup: ['variants','rents','inventory'],\n categories: route.params.categoryPath ? `/${route.params.categoryPath}` : null,\n filters: processedFilters,\n priceMin: selectedFilters.price?.min,\n priceMax: selectedFilters.price?.max,\n dateStart: selectedFilters.availability?.start,\n dateEnd: selectedFilters.availability?.end\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"\"\n \n >\n <div class=\"mn-b-thin mobile-only\">\n <Filters\n v-model:filters=\"availableFilters\"\n v-model:selected=\"selectedFilters\"\n class=\"\"\n />\n </div>\n <div class=\"cols-4 mobile:cols-2 z-index-1 pos-relative w-100 rows-1 gap-thin\">\n <router-link\n v-for=\"product in items\"\n :to=\"route.params._id ? `/organizations/${route.params._id}/products/${product._id}` : `/products/${product._id}`\"\n class=\"pos-relative h-100 w-100\"\n >\n <CardProduct\n :key=\"product._id\"\n :product=\"product\"\n :user=\"auth.state.access\"\n :organization=\"route.params._id\"\n :access=\"hasAccess(route.params._id, 'products', 'edit', auth.state.accesses, auth.state.access.roles)\"\n class=\"pos-relative h-100 w-100 bg-light\"\n />\n </router-link>\n </div>\n </Feed>\n\n </div>\n </div>\n \n <!-- Date Picker Popup -->\n <Popup\n :isPopupOpen=\"showDatePickerPopup\"\n @close-popup=\"showDatePickerPopup = false\"\n class=\"pd-medium bg-white radius-medium\"\n style=\"min-width: 350px;\"\n >\n <h3 class=\"mn-b-medium\">Select Date Range</h3>\n \n <Calendar\n v-model:date=\"tempSelectedDates\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"mn-b-medium radius-small bg-light\"\n />\n \n <div class=\"flex gap-small\">\n <button \n @click=\"showDatePickerPopup = false\"\n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n <button \n @click=\"applyDateFilter\"\n class=\"bg-main button w-100 flex-child-full\"\n >\n Apply\n </button>\n \n </div>\n </Popup>\n</div>\n\n</template>\n\n\n<script setup=\"props\">\n // Import libs\n import { ref, computed, watch, onMounted, onUnmounted } from 'vue'\n import { useRoute, useRouter } from 'vue-router'\n\n // Import components\n import Tab from '@martyrs/src/components/Tab/Tab.vue'\n import Feed from '@martyrs/src/components/Feed/Feed.vue'\n\n import FilterProducts from '@martyrs/src/modules/products/components/sections/FilterProducts.vue'\n import BlockSearch from '@martyrs/src/modules/core/views/components/blocks/BlockSearch.vue'\n import Filters from '@martyrs/src/modules/core/views/components/sections/Filters.vue'\n import Spoiler from \"@martyrs/src/components/Spoiler/Spoiler.vue\"\n import Field from \"@martyrs/src/components/Field/Field.vue\"\n import Calendar from \"@martyrs/src/components/Calendar/Calendar.vue\"\n import Popup from \"@martyrs/src/components/Popup/Popup.vue\"\n import Checkbox from \"@martyrs/src/components/Checkbox/Checkbox.vue\"\n\n import CardProduct from '@martyrs/src/modules/products/components/blocks/CardProduct.vue'\n\n import IconPlus from '@martyrs/src/modules/icons/navigation/IconPlus.vue'\n import IconChevronBottom from '@martyrs/src/modules/icons/navigation/IconChevronBottom.vue'\n import IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\n\n // Accessing router and store\n import * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\n import { useStore } from '@martyrs/src/modules/core/views/store/core.store.js';\n import * as products from '@martyrs/src/modules/products/store/products.js';\n import * as categories from '@martyrs/src/modules/products/store/categories.js';\n import { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\n const emits = defineEmits(['page-loading', 'page-loaded']);\n const route = useRoute()\n const router = useRouter()\n const store = useStore()\n const { generateFilters, formatDate, hasAccess, returnCurrency } = useGlobalMixins()\n\n // Категории и фильтры\n const currentCategories = ref([]);\n const currentCategory = ref(null);\n const categoryFilters = ref([]);\n // const selectedFilters = ref({});\n\n const availableFilters = ref([\n {\n title: 'Price',\n value: 'price',\n type: 'range',\n minPlaceholder: 'From',\n maxPlaceholder: 'To'\n },\n {\n title: 'Availability',\n value: 'availability',\n type: 'date'\n }\n ])\n\n const selectedFilters = ref({\n price: { min: '', max: '' },\n availability: null\n })\n\n const showDatePickerPopup = ref(false);\n const tempSelectedDates = ref(null);\n\n // Computed property for processed filters\n const processedFilters = computed(() => {\n const filters = [];\n \n // Обрабатываем фильтры категорий\n Object.entries(selectedFilters.value).forEach(([key, value]) => {\n if (key === 'price' || key === 'availability') return; // эти обрабатываются отдельно\n \n if (Array.isArray(value) && value.length > 0) {\n filters.push({\n parameter: key,\n values: value,\n caseSensitive: false\n });\n } else if (value && typeof value === 'string' && value.trim() !== '') {\n filters.push({\n parameter: key,\n values: [value],\n caseSensitive: false\n });\n }\n });\n \n return filters.length > 0 ? JSON.stringify(filters) : '';\n });\n\n\n\n\n const processedLookups = computed(() => {\n const lookups = ['variants'];\n if (selectedFilters.value.availability) {\n lookups.push('rents');\n }\n return lookups;\n });\n\n const loadCategoryData = async () => {\n const categoryPath = route.params.categoryPath;\n \n // Очищаем фильтры категории из предыдущей загрузки\n availableFilters.value = availableFilters.value.filter(f => f.value === 'price' || f.value === 'availability');\n \n try {\n if (categoryPath) {\n // Загружаем категорию и её прямых детей\n const result = await categories.actions.read({ \n url: `/${categoryPath}`,\n depth: 1,\n tree: false\n });\n \n if (result.length > 0) {\n currentCategory.value = result[0];\n currentCategories.value = result[0].children || [];\n categoryFilters.value = result[0].filters || [];\n \n // Добавляем фильтры категории в availableFilters\n (result[0].filters || []).forEach(filter => {\n availableFilters.value.push({\n title: filter.name,\n value: filter.name,\n type: 'checkbox',\n options: (filter.options || []).map(option => ({\n label: typeof option === 'string' ? option : option.text,\n value: typeof option === 'string' ? option : option.text\n }))\n });\n // Инициализируем массив для фильтра\n if (!selectedFilters.value[filter.name]) {\n selectedFilters.value[filter.name] = [];\n }\n });\n }\n } else {\n // Загружаем только корневые категории\n const result = await categories.actions.read({ \n root: true,\n tree: false\n });\n \n currentCategories.value = result;\n categoryFilters.value = [];\n }\n } catch (error) {\n console.error('Error loading categories:', error);\n currentCategories.value = [];\n categoryFilters.value = [];\n }\n };\n\n // Функция для выбора категории\n const selectCategory = (category) => {\n const categoryPath = category.url ? category.url.substring(1) : '';\n \n if (!categoryPath) {\n console.warn('No URL found for category:', category);\n return;\n }\n \n // Переходим к странице категории используя wildcard роут\n if (route.params._id) {\n router.push(`/organizations/${route.params._id}/products/categories/${categoryPath}`);\n } else {\n router.push(`/products/categories/${categoryPath}`);\n }\n };\n\n\n // Функция применения фильтра дат\n const applyDateFilter = () => {\n selectedFilters.value.availability = tempSelectedDates.value;\n showDatePickerPopup.value = false;\n };\n \n // Функция очистки всех фильтров\n const clearAllFilters = () => {\n selectedFilters.value.price = { min: '', max: '' };\n selectedFilters.value.availability = null;\n \n // Очищаем фильтры категорий\n categoryFilters.value.forEach(filter => {\n selectedFilters.value[filter.name] = [];\n });\n };\n\n if (route.params?._id) {\n store.core.state.navigation_bar.actions = [{\n component: IconPlus,\n props: {\n fill: \"rgb(var(--main))\"\n },\n condition: () => auth.state.user && auth.state.user._id,\n action: () => route.params._id ? router.push({ name: 'Organization_ProductAdd', params: { _id: route.params._id} }) : router.push({ name: 'ProductAdd' })\n }];\n }\n\n onMounted(async () => {\n emits('page-loading');\n await loadCategoryData();\n emits('page-loaded');\n });\n\n onUnmounted(() => {\n store.core.state.navigation_bar.actions = [];\n });\n\n</script>\n\n<style lang=\"scss\">\n\n\n</style>\n"],"names":["categories.actions","IconPlus","auth.state"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Products.vue.js","sources":["../../../../../../../src/modules/products/components/pages/Products.vue"],"sourcesContent":["<template>\n <div class=\"pos-relative\">\n <header \n v-if=\"route.name !== 'Organization' && !MOBILE_APP\"\n class=\"pd-medium flex-v-center flex-nowrap flex\"\n >\n <h2 class=\"mn-r-medium\">{{ currentCategory ? currentCategory.name : 'All Products' }}</h2>\n <button \n v-if=\"route.params._id && hasAccess(route.params._id, 'products', 'create', auth.state.accesses, auth.state.access.roles)\"\n @click=\"$router.push({\n name: route.params?._id ? 'Organization_ProductAdd' : 'ProductAdd'\n })\" \n class=\"radius-extra i-big hover:scale-[1.05] cursor-pointer t-white bg-second\">\n +\n </button>\n </header>\n\n <div class=\"cols-[1fr_3fr] mobile:cols-1 br-1px br-light z-index-3 pos-relative\">\n\n <div class=\"o-y-scroll br-r-1px br-light pd-medium z-index-2 desktop-only h-100 pos-relative\">\n <div class=\"w-100 o-y-scroll h-100\">\n <!-- Категории -->\n <div class=\"mn-b-medium\" v-if=\"currentCategories.length > 0\">\n <h4 class=\"mn-b-medium\">\n {{ route.params.categoryPath ? 'Subcategories' : 'Categories' }}\n </h4>\n <div class=\"gap-micro\">\n <div\n v-for=\"category in currentCategories\"\n :key=\"category._id\"\n @click=\"selectCategory(category)\"\n class=\"cursor-pointer hover:underline mn-b-regular ease\"\n >\n {{ category.name }}\n <br>\n <span v-for=\"subcategory in category.children\">{{subcategory.name}}</span>\n </div>\n </div>\n </div>\n\n <!-- Фильтры категории -->\n <Spoiler \n v-for=\"filter in categoryFilters\"\n :key=\"filter.name\"\n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\">{{ filter.name }}</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180deg mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-medium\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small\">\n <Checkbox \n v-for=\"option in filter.options\"\n :key=\"option.text || option\"\n v-model:radio=\"selectedFilters[filter.name]\"\n :label=\"option.text || option\"\n :value=\"option.text || option\"\n mode=\"checkbox\"\n class=\"mn-b-micro\"\n />\n </div>\n </template>\n </Spoiler>\n \n <!-- Цена за сутки -->\n <Spoiler \n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\"> Price</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180deg mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-medium\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small flex gap-thin\">\n <Field\n v-model:field=\"selectedFilters.price.min\"\n placeholder=\"From\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n <Field\n v-model:field=\"selectedFilters.price.max\"\n placeholder=\"To\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n </div>\n </template>\n </Spoiler>\n\n <!-- Доступность -->\n <Spoiler \n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\">Availability</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180deg mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-medium\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small\">\n <div \n @click=\"() => { tempSelectedDates = selectedFilters.availability; showDatePickerPopup = true; }\"\n :class=\"{ 'bg-light': selectedFilters?.availability }\"\n class=\"pd-small field-wrapper radius-small bg-light cursor-pointer hover:bg-light ease flex-v-center flex gap-thin\"\n >\n <IconCalendar class=\"i-medium\" />\n <span class=\"h-1r\">{{ selectedFilters.availability ? `${formatDate(selectedFilters.availability.start, { dayMonth: true, language: 'en' })} - ${formatDate(selectedFilters.availability.end, { dayMonth: true, language: 'en' })}` : 'Select dates'}}</span>\n </div>\n </div>\n </template>\n </Spoiler>\n\n <!-- Кнопка очистки фильтров -->\n <button \n @click=\"clearAllFilters\"\n class=\"bg-main w-100 button mn-t-medium\"\n >\n Clear Filters\n </button>\n </div>\n </div>\n\n <div class=\"w-100 rows-1 pd-thin pos-relative o-hidden\">\n \n <slot></slot>\n\n <div class=\"mn-b-thin mobile-only w-100 o-y-scroll scroll-hide scroll-snap-x-mandatory scroll-pd-regular\">\n <div class=\"gap-thin flex-nowrap flex\">\n <div\n v-for=\"category in currentCategories\"\n :key=\"category._id\"\n @click=\"selectCategory(category)\"\n class=\" flex-child-default bg-light flex ws-nowrap pd-medium radius-medium cursor-pointer hover:bg-light ease\"\n >\n {{ category.name }}\n </div>\n </div>\n </div>\n\n <Feed\n :search=\"true\"\n v-model:sort=\"products.state.sort\"\n :showLoadMore=\"false\"\n :states=\"{\n empty: {\n title: 'No Products Found',\n description: 'Currently, there are no products available.'\n }\n }\"\n :store=\"{\n read: (options) => products.actions.read(options),\n state: products.state\n }\"\n :options=\"{\n limit: 16,\n owner: route.name?.includes('Organization') ? route.params._id : null,\n lookup: ['variants','rents','inventory'],\n categories: route.params.categoryPath ? `/${route.params.categoryPath}` : null,\n filters: processedFilters,\n priceMin: selectedFilters.price?.min,\n priceMax: selectedFilters.price?.max,\n dateStart: selectedFilters.availability?.start,\n dateEnd: selectedFilters.availability?.end\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"\"\n \n >\n <div class=\"mn-b-thin mobile-only\">\n <Filters\n v-model:filters=\"availableFilters\"\n v-model:selected=\"selectedFilters\"\n class=\"\"\n />\n </div>\n <div class=\"cols-4 mobile:cols-2 z-index-1 pos-relative w-100 rows-1 gap-thin\">\n <router-link\n v-for=\"product in items\"\n :to=\"route.params._id ? `/organizations/${route.params._id}/products/${product._id}` : `/products/${product._id}`\"\n class=\"pos-relative h-100 w-100\"\n >\n <CardProduct\n :key=\"product._id\"\n :product=\"product\"\n :user=\"auth.state.access\"\n :organization=\"route.params._id\"\n :access=\"hasAccess(route.params._id, 'products', 'edit', auth.state.accesses, auth.state.access.roles)\"\n class=\"pos-relative h-100 w-100 bg-light\"\n />\n </router-link>\n </div>\n </Feed>\n\n </div>\n </div>\n \n <!-- Date Picker Popup -->\n <Popup\n :isPopupOpen=\"showDatePickerPopup\"\n @close-popup=\"showDatePickerPopup = false\"\n class=\"pd-medium bg-white radius-medium\"\n style=\"min-width: 350px;\"\n >\n <h3 class=\"mn-b-medium\">Select Date Range</h3>\n \n <Calendar\n v-model:date=\"tempSelectedDates\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"mn-b-medium radius-small bg-light\"\n />\n \n <div class=\"flex gap-small\">\n <button \n @click=\"showDatePickerPopup = false\"\n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n <button \n @click=\"applyDateFilter\"\n class=\"bg-main button w-100 flex-child-full\"\n >\n Apply\n </button>\n \n </div>\n </Popup>\n</div>\n\n</template>\n\n\n<script setup=\"props\">\n // Import libs\n import { ref, computed, watch, onMounted, onUnmounted } from 'vue'\n import { useRoute, useRouter } from 'vue-router'\n\n // Import components\n import Tab from '@martyrs/src/components/Tab/Tab.vue'\n import Feed from '@martyrs/src/components/Feed/Feed.vue'\n\n import FilterProducts from '@martyrs/src/modules/products/components/sections/FilterProducts.vue'\n import BlockSearch from '@martyrs/src/modules/core/views/components/blocks/BlockSearch.vue'\n import Filters from '@martyrs/src/modules/core/views/components/sections/Filters.vue'\n import Spoiler from \"@martyrs/src/components/Spoiler/Spoiler.vue\"\n import Field from \"@martyrs/src/components/Field/Field.vue\"\n import Calendar from \"@martyrs/src/components/Calendar/Calendar.vue\"\n import Popup from \"@martyrs/src/components/Popup/Popup.vue\"\n import Checkbox from \"@martyrs/src/components/Checkbox/Checkbox.vue\"\n\n import CardProduct from '@martyrs/src/modules/products/components/blocks/CardProduct.vue'\n\n import IconPlus from '@martyrs/src/modules/icons/navigation/IconPlus.vue'\n import IconChevronBottom from '@martyrs/src/modules/icons/navigation/IconChevronBottom.vue'\n import IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\n\n // Accessing router and store\n import * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\n import { useStore } from '@martyrs/src/modules/core/views/store/core.store.js';\n import * as products from '@martyrs/src/modules/products/store/products.js';\n import * as categories from '@martyrs/src/modules/products/store/categories.js';\n import { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\n const emits = defineEmits(['page-loading', 'page-loaded']);\n const route = useRoute()\n const router = useRouter()\n const store = useStore()\n const { generateFilters, formatDate, hasAccess, returnCurrency } = useGlobalMixins()\n\n // Категории и фильтры\n const currentCategories = ref([]);\n const currentCategory = ref(null);\n const categoryFilters = ref([]);\n // const selectedFilters = ref({});\n\n const availableFilters = ref([\n {\n title: 'Price',\n value: 'price',\n type: 'range',\n minPlaceholder: 'From',\n maxPlaceholder: 'To'\n },\n {\n title: 'Availability',\n value: 'availability',\n type: 'date'\n }\n ])\n\n const selectedFilters = ref({\n price: { min: '', max: '' },\n availability: null\n })\n\n const showDatePickerPopup = ref(false);\n const tempSelectedDates = ref(null);\n\n // Computed property for processed filters\n const processedFilters = computed(() => {\n const filters = [];\n \n // Обрабатываем фильтры категорий\n Object.entries(selectedFilters.value).forEach(([key, value]) => {\n if (key === 'price' || key === 'availability') return; // эти обрабатываются отдельно\n \n if (Array.isArray(value) && value.length > 0) {\n filters.push({\n parameter: key,\n values: value,\n caseSensitive: false\n });\n } else if (value && typeof value === 'string' && value.trim() !== '') {\n filters.push({\n parameter: key,\n values: [value],\n caseSensitive: false\n });\n }\n });\n \n return filters.length > 0 ? JSON.stringify(filters) : '';\n });\n\n\n\n\n const processedLookups = computed(() => {\n const lookups = ['variants'];\n if (selectedFilters.value.availability) {\n lookups.push('rents');\n }\n return lookups;\n });\n\n const loadCategoryData = async () => {\n const categoryPath = route.params.categoryPath;\n \n // Очищаем фильтры категории из предыдущей загрузки\n availableFilters.value = availableFilters.value.filter(f => f.value === 'price' || f.value === 'availability');\n \n try {\n if (categoryPath) {\n // Загружаем категорию и её прямых детей\n const result = await categories.actions.read({ \n url: `/${categoryPath}`,\n depth: 1,\n tree: false\n });\n \n if (result.length > 0) {\n currentCategory.value = result[0];\n currentCategories.value = result[0].children || [];\n categoryFilters.value = result[0].filters || [];\n \n // Добавляем фильтры категории в availableFilters\n (result[0].filters || []).forEach(filter => {\n availableFilters.value.push({\n title: filter.name,\n value: filter.name,\n type: 'checkbox',\n options: (filter.options || []).map(option => ({\n label: typeof option === 'string' ? option : option.text,\n value: typeof option === 'string' ? option : option.text\n }))\n });\n // Инициализируем массив для фильтра\n if (!selectedFilters.value[filter.name]) {\n selectedFilters.value[filter.name] = [];\n }\n });\n }\n } else {\n // Загружаем только корневые категории\n const result = await categories.actions.read({ \n root: true,\n tree: false\n });\n \n currentCategories.value = result;\n categoryFilters.value = [];\n }\n } catch (error) {\n console.error('Error loading categories:', error);\n currentCategories.value = [];\n categoryFilters.value = [];\n }\n };\n\n // Функция для выбора категории\n const selectCategory = (category) => {\n const categoryPath = category.url ? category.url.substring(1) : '';\n \n if (!categoryPath) {\n console.warn('No URL found for category:', category);\n return;\n }\n \n // Переходим к странице категории используя wildcard роут\n if (route.params._id) {\n router.push(`/organizations/${route.params._id}/products/categories/${categoryPath}`);\n } else {\n router.push(`/products/categories/${categoryPath}`);\n }\n };\n\n\n // Функция применения фильтра дат\n const applyDateFilter = () => {\n selectedFilters.value.availability = tempSelectedDates.value;\n showDatePickerPopup.value = false;\n };\n \n // Функция очистки всех фильтров\n const clearAllFilters = () => {\n selectedFilters.value.price = { min: '', max: '' };\n selectedFilters.value.availability = null;\n \n // Очищаем фильтры категорий\n categoryFilters.value.forEach(filter => {\n selectedFilters.value[filter.name] = [];\n });\n };\n\n if (route.params?._id) {\n store.core.state.navigation_bar.actions = [{\n component: IconPlus,\n props: {\n fill: \"rgb(var(--main))\"\n },\n condition: () => auth.state.user && auth.state.user._id,\n action: () => route.params._id ? router.push({ name: 'Organization_ProductAdd', params: { _id: route.params._id} }) : router.push({ name: 'ProductAdd' })\n }];\n }\n\n onMounted(async () => {\n emits('page-loading');\n await loadCategoryData();\n emits('page-loaded');\n });\n\n onUnmounted(() => {\n store.core.state.navigation_bar.actions = [];\n });\n\n</script>\n\n<style lang=\"scss\">\n\n\n</style>\n"],"names":["categories.actions","IconPlus","auth.state"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useModel, ref, reactive, createElementBlock, openBlock, Fragment, createVNode, withCtx, createCommentVNode, renderList, createElementVNode, toDisplayString, 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$5 from "../../../../components/Button/Button.
|
|
4
|
+
import _sfc_main$5 from "../../../../components/Button/Button.vue2.js";
|
|
5
5
|
import _sfc_main$4 from "../../../../components/Popup/Popup.vue.js";
|
|
6
6
|
import _sfc_main$2 from "../../../icons/navigation/IconEdit.vue.js";
|
|
7
7
|
import _sfc_main$3 from "../../../icons/navigation/IconDelete.vue.js";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { useModel, ref, reactive, createElementBlock, openBlock, Fragment, createVNode, withCtx, createCommentVNode, renderList, createElementVNode, toDisplayString, 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$5 from "../../../../components/Button/Button.
|
|
4
|
+
import _sfc_main$5 from "../../../../components/Button/Button.vue2.js";
|
|
5
5
|
import _sfc_main$4 from "../../../../components/Popup/Popup.vue.js";
|
|
6
|
-
import Select from "../../../../components/Select/Select.
|
|
6
|
+
import Select from "../../../../components/Select/Select.vue.js";
|
|
7
7
|
import _sfc_main$2 from "../../../icons/navigation/IconEdit.vue.js";
|
|
8
8
|
import _sfc_main$3 from "../../../icons/navigation/IconDelete.vue.js";
|
|
9
9
|
const _hoisted_1 = {
|
|
@@ -235,7 +235,7 @@ const _sfc_main = {
|
|
|
235
235
|
{ value: "discount", label: "Discount (%)" },
|
|
236
236
|
{ value: "special_price", label: "Special Price" }
|
|
237
237
|
],
|
|
238
|
-
class: "pos-relative
|
|
238
|
+
class: "pos-relative ws-nowrap bg-white gap-small flex flex-column pd-thin radius-thin"
|
|
239
239
|
}, null, 8, ["select"])
|
|
240
240
|
]),
|
|
241
241
|
_: 1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditDiscounts.vue.js","sources":["../../../../../../../src/modules/products/components/sections/EditDiscounts.vue"],"sourcesContent":["<template>\n <Block\n title=\"Discounts\"\n placeholder=\"No discounts added yet\"\n :actions=\"[{\n label: '+',\n function: () => openDiscountPopup()\n }]\"\n >\n <div v-if=\"discounts.length > 0\" class=\"cols-1 gap-thin\">\n <div\n v-for=\"(discount, index) in discounts\"\n :key=\"index\"\n class=\"bg-white radius-small pd-small flex-nowrap flex-v-center flex gap-thin\"\n >\n <div class=\"w-100\">\n <p class=\"p-regular mn-b-thin fw-medium d-block\">{{ discount.name || 'Unnamed discount' }}</p>\n <p class=\"fw-medium t-transp\">\n <template v-if=\"discount.type === 'special_price'\">\n Special price: {{ formatPrice(discount.value) }}\n </template>\n <template v-else>\n {{ discount.value }}% off\n </template>\n </p>\n <p v-if=\"discount.date && (discount.date.start || discount.date.end)\" class=\"t-small t-transp\">\n {{ formatDateRange(discount.date) }}\n </p>\n </div>\n \n <div class=\"flex gap-thin\">\n <div @click=\"() => openDiscountPopup(index)\" class=\"radius-small pd-small flex-center flex aspect-1x1 bg-light cursor-pointer hover:scale-[1.05]\">\n <IconEdit\n class=\"i-medium\"\n />\n </div>\n <div @click=\"() => discounts.splice(index, 1)\" class=\"radius-small pd-small flex-center flex aspect-1x1 bg-red cursor-pointer hover:scale-[1.05]\">\n <IconDelete\n class=\"i-medium\"\n />\n </div>\n </div>\n </div>\n </div>\n </Block>\n\n <Popup\n title=\"Edit Discount\"\n @close-popup=\"closeDiscountPopup\"\n :isPopupOpen=\"isDiscountPopupOpen\"\n class=\"bg-white w-max-40r radius-medium pd-medium\"\n >\n <div class=\"cols-1 gap-thin\">\n <Field\n v-model:field=\"currentDiscount.name\"\n label=\"Name\"\n placeholder=\"Discount Name\"\n class=\"w-100 bg-light radius-small pd-small\"\n />\n\n <Field\n v-model:field=\"currentDiscount.description\"\n label=\"Description\"\n type=\"textarea\"\n placeholder=\"Discount Description\"\n class=\"w-100 bg-light radius-small pd-small\"\n />\n\n <Field\n v-model:field=\"currentDiscount.value\"\n :label=\"currentDiscount.type === 'special_price' ? 'Special Price' : 'Discount'\"\n :placeholder=\"currentDiscount.type === 'special_price' ? 'New price' : 'Discount percentage'\"\n class=\"w-100 bg-light radius-small pd-small\"\n >\n <Select \n v-model:select=\"currentDiscount.type\" \n placeholder=\"Select type\"\n value=\"label\"\n property=\"value\"\n :options=\"[\n { value: 'discount', label: 'Discount (%)' },\n { value: 'special_price', label: 'Special Price' },\n ]\"\n class=\"pos-relative t-nowrap bg-white gap-small flex flex-column pd-thin radius-thin\"\n />\n </Field>\n\n <Field\n v-model:field=\"currentDiscount.quantity\"\n label=\"Quantity\"\n type=\"number\"\n placeholder=\"Quantity to get discount\"\n class=\"w-100 bg-light radius-small pd-small\"\n />\n\n <div class=\"fw-medium mn-t-micro mn-b-micro\">Date Range</div>\n <div class=\"cols-2 mobile:cols-1 gap-thin\">\n <Field\n v-model:field=\"currentDiscount.date.start\"\n label=\"Start Date\"\n type=\"date\"\n class=\"w-100 bg-light radius-small pd-small\"\n />\n \n <Field\n v-model:field=\"currentDiscount.date.end\"\n label=\"End Date\"\n type=\"date\"\n class=\"w-100 bg-light radius-small pd-small\"\n />\n </div>\n\n <div class=\"fw-medium mn-t-micro mn-b-micro\">Time Range</div>\n <div class=\"cols-2 mobile:cols-1 gap-thin\">\n <Field\n v-model:field=\"currentDiscount.time.start\"\n label=\"Start Time\"\n type=\"time\"\n class=\"w-100 bg-light radius-small pd-small\"\n />\n \n <Field\n v-model:field=\"currentDiscount.time.end\"\n label=\"End Time\"\n type=\"time\"\n class=\"w-100 bg-light radius-small pd-small\"\n />\n </div>\n \n \n \n <div class=\"flex gap-thin mn-t-medium\">\n <Button\n :showSuccess=\"false\"\n :showLoader=\"false\"\n class=\"bg-red t-white w-100\"\n @click=\"closeDiscountPopup\"\n >\n Cancel\n </Button>\n <Button\n class=\"bg-main w-100\"\n @click=\"saveDiscount\"\n >\n Save Discount\n </Button>\n </div>\n </div>\n </Popup>\n</template>\n\n<script setup>\nimport { ref, reactive, defineModel, computed } from 'vue';\nimport Block from '@martyrs/src/components/Block/Block.vue';\nimport Field from '@martyrs/src/components/Field/Field.vue';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport Popup from '@martyrs/src/components/Popup/Popup.vue';\nimport Select from '@martyrs/src/components/Select/Select.vue';\nimport IconEdit from '@martyrs/src/modules/icons/navigation/IconEdit.vue';\nimport IconDelete from '@martyrs/src/modules/icons/navigation/IconDelete.vue';\n\n// Используем defineModel для более простой работы с v-model в родительском компоненте\nconst discounts = defineModel('discounts', { default: () => [] });\n\n// Локальное состояние\nconst isDiscountPopupOpen = ref(false);\nconst editingDiscountIndex = ref(null);\nconst currentDiscount = reactive({\n name: '',\n description: '',\n type: 'discount', // discount или special_price\n value: 0,\n quantity: 1,\n date: {\n start: null,\n end: null\n },\n time: {\n start: '',\n end: ''\n },\n users: []\n});\n\n// Используется для форматирования диапазона дат\nfunction formatDateRange(dateRange) {\n if (!dateRange) return '';\n \n let result = '';\n \n if (dateRange.start) {\n const startDate = new Date(dateRange.start);\n result += startDate.toLocaleDateString();\n }\n \n result += ' - ';\n \n if (dateRange.end) {\n const endDate = new Date(dateRange.end);\n result += endDate.toLocaleDateString();\n }\n \n return result;\n}\n\n// Функция открытия попапа добавления/редактирования\nfunction openDiscountPopup(index) {\n // Если передан индекс, это редактирование существующей скидки\n if (index !== undefined) {\n editingDiscountIndex.value = index;\n const discount = discounts.value[index];\n \n // Копируем данные в currentDiscount\n Object.assign(currentDiscount, {\n name: discount.name || '',\n description: discount.description || '',\n type: discount.type || 'discount',\n value: discount.value || 0,\n quantity: discount.quantity || 1,\n date: {\n start: discount.date?.start || null,\n end: discount.date?.end || null\n },\n time: {\n start: discount.time?.start || '',\n end: discount.time?.end || ''\n },\n users: Array.isArray(discount.users) ? [...discount.users] : []\n });\n } else {\n // Сброс данных при создании новой скидки\n editingDiscountIndex.value = null;\n Object.assign(currentDiscount, {\n name: '',\n description: '',\n type: 'discount',\n value: 0,\n quantity: 1,\n date: {\n start: null,\n end: null\n },\n time: {\n start: '',\n end: ''\n },\n users: []\n });\n }\n \n isDiscountPopupOpen.value = true;\n}\n\n// Закрытие попапа\nfunction closeDiscountPopup() {\n isDiscountPopupOpen.value = false;\n editingDiscountIndex.value = null;\n}\n\n\n\n// Сохранение скидки\nfunction saveDiscount() {\n // Проверка на основные поля\n if (currentDiscount.type === 'discount' && (currentDiscount.value < 0 || currentDiscount.value > 100)) {\n alert('Discount value must be between 0 and 100');\n return;\n }\n\n if (currentDiscount.type === 'special_price' && currentDiscount.value < 0) {\n alert('Special price must be greater than or equal to 0');\n return;\n }\n\n // Создаем копию текущей скидки для сохранения\n const discountToSave = {\n name: currentDiscount.name,\n description: currentDiscount.description,\n type: currentDiscount.type || 'discount',\n value: parseFloat(currentDiscount.value) || 0,\n quantity: parseInt(currentDiscount.quantity) || 1,\n date: {\n start: currentDiscount.date.start,\n end: currentDiscount.date.end\n },\n time: {\n start: currentDiscount.time.start,\n end: currentDiscount.time.end\n },\n users: [...currentDiscount.users]\n };\n\n // Если редактируем существующую скидку\n if (editingDiscountIndex.value !== null) {\n // Обновляем существующую скидку\n discounts.value.splice(editingDiscountIndex.value, 1, discountToSave);\n } else {\n // Добавляем новую скидку\n if (!discounts.value) {\n discounts.value = [];\n }\n discounts.value.push(discountToSave);\n }\n\n // Закрываем попап\n closeDiscountPopup();\n}\n</script>"],"names":["_useModel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EditDiscounts.vue.js","sources":["../../../../../../../src/modules/products/components/sections/EditDiscounts.vue"],"sourcesContent":["<template>\n <Block\n title=\"Discounts\"\n placeholder=\"No discounts added yet\"\n :actions=\"[{\n label: '+',\n function: () => openDiscountPopup()\n }]\"\n >\n <div v-if=\"discounts.length > 0\" class=\"cols-1 gap-thin\">\n <div\n v-for=\"(discount, index) in discounts\"\n :key=\"index\"\n class=\"bg-white radius-small pd-small flex-nowrap flex-v-center flex gap-thin\"\n >\n <div class=\"w-100\">\n <p class=\"p-regular mn-b-thin fw-medium d-block\">{{ discount.name || 'Unnamed discount' }}</p>\n <p class=\"fw-medium t-transp\">\n <template v-if=\"discount.type === 'special_price'\">\n Special price: {{ formatPrice(discount.value) }}\n </template>\n <template v-else>\n {{ discount.value }}% off\n </template>\n </p>\n <p v-if=\"discount.date && (discount.date.start || discount.date.end)\" class=\"t-small t-transp\">\n {{ formatDateRange(discount.date) }}\n </p>\n </div>\n \n <div class=\"flex gap-thin\">\n <div @click=\"() => openDiscountPopup(index)\" class=\"radius-small pd-small flex-center flex aspect-1x1 bg-light cursor-pointer hover:scale-[1.05]\">\n <IconEdit\n class=\"i-medium\"\n />\n </div>\n <div @click=\"() => discounts.splice(index, 1)\" class=\"radius-small pd-small flex-center flex aspect-1x1 bg-red cursor-pointer hover:scale-[1.05]\">\n <IconDelete\n class=\"i-medium\"\n />\n </div>\n </div>\n </div>\n </div>\n </Block>\n\n <Popup\n title=\"Edit Discount\"\n @close-popup=\"closeDiscountPopup\"\n :isPopupOpen=\"isDiscountPopupOpen\"\n class=\"bg-white w-max-40r radius-medium pd-medium\"\n >\n <div class=\"cols-1 gap-thin\">\n <Field\n v-model:field=\"currentDiscount.name\"\n label=\"Name\"\n placeholder=\"Discount Name\"\n class=\"w-100 bg-light radius-small pd-small\"\n />\n\n <Field\n v-model:field=\"currentDiscount.description\"\n label=\"Description\"\n type=\"textarea\"\n placeholder=\"Discount Description\"\n class=\"w-100 bg-light radius-small pd-small\"\n />\n\n <Field\n v-model:field=\"currentDiscount.value\"\n :label=\"currentDiscount.type === 'special_price' ? 'Special Price' : 'Discount'\"\n :placeholder=\"currentDiscount.type === 'special_price' ? 'New price' : 'Discount percentage'\"\n class=\"w-100 bg-light radius-small pd-small\"\n >\n <Select \n v-model:select=\"currentDiscount.type\" \n placeholder=\"Select type\"\n value=\"label\"\n property=\"value\"\n :options=\"[\n { value: 'discount', label: 'Discount (%)' },\n { value: 'special_price', label: 'Special Price' },\n ]\"\n class=\"pos-relative ws-nowrap bg-white gap-small flex flex-column pd-thin radius-thin\"\n />\n </Field>\n\n <Field\n v-model:field=\"currentDiscount.quantity\"\n label=\"Quantity\"\n type=\"number\"\n placeholder=\"Quantity to get discount\"\n class=\"w-100 bg-light radius-small pd-small\"\n />\n\n <div class=\"fw-medium mn-t-micro mn-b-micro\">Date Range</div>\n <div class=\"cols-2 mobile:cols-1 gap-thin\">\n <Field\n v-model:field=\"currentDiscount.date.start\"\n label=\"Start Date\"\n type=\"date\"\n class=\"w-100 bg-light radius-small pd-small\"\n />\n \n <Field\n v-model:field=\"currentDiscount.date.end\"\n label=\"End Date\"\n type=\"date\"\n class=\"w-100 bg-light radius-small pd-small\"\n />\n </div>\n\n <div class=\"fw-medium mn-t-micro mn-b-micro\">Time Range</div>\n <div class=\"cols-2 mobile:cols-1 gap-thin\">\n <Field\n v-model:field=\"currentDiscount.time.start\"\n label=\"Start Time\"\n type=\"time\"\n class=\"w-100 bg-light radius-small pd-small\"\n />\n \n <Field\n v-model:field=\"currentDiscount.time.end\"\n label=\"End Time\"\n type=\"time\"\n class=\"w-100 bg-light radius-small pd-small\"\n />\n </div>\n \n \n \n <div class=\"flex gap-thin mn-t-medium\">\n <Button\n :showSuccess=\"false\"\n :showLoader=\"false\"\n class=\"bg-red t-white w-100\"\n @click=\"closeDiscountPopup\"\n >\n Cancel\n </Button>\n <Button\n class=\"bg-main w-100\"\n @click=\"saveDiscount\"\n >\n Save Discount\n </Button>\n </div>\n </div>\n </Popup>\n</template>\n\n<script setup>\nimport { ref, reactive, defineModel, computed } from 'vue';\nimport Block from '@martyrs/src/components/Block/Block.vue';\nimport Field from '@martyrs/src/components/Field/Field.vue';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport Popup from '@martyrs/src/components/Popup/Popup.vue';\nimport Select from '@martyrs/src/components/Select/Select.vue';\nimport IconEdit from '@martyrs/src/modules/icons/navigation/IconEdit.vue';\nimport IconDelete from '@martyrs/src/modules/icons/navigation/IconDelete.vue';\n\n// Используем defineModel для более простой работы с v-model в родительском компоненте\nconst discounts = defineModel('discounts', { default: () => [] });\n\n// Локальное состояние\nconst isDiscountPopupOpen = ref(false);\nconst editingDiscountIndex = ref(null);\nconst currentDiscount = reactive({\n name: '',\n description: '',\n type: 'discount', // discount или special_price\n value: 0,\n quantity: 1,\n date: {\n start: null,\n end: null\n },\n time: {\n start: '',\n end: ''\n },\n users: []\n});\n\n// Используется для форматирования диапазона дат\nfunction formatDateRange(dateRange) {\n if (!dateRange) return '';\n \n let result = '';\n \n if (dateRange.start) {\n const startDate = new Date(dateRange.start);\n result += startDate.toLocaleDateString();\n }\n \n result += ' - ';\n \n if (dateRange.end) {\n const endDate = new Date(dateRange.end);\n result += endDate.toLocaleDateString();\n }\n \n return result;\n}\n\n// Функция открытия попапа добавления/редактирования\nfunction openDiscountPopup(index) {\n // Если передан индекс, это редактирование существующей скидки\n if (index !== undefined) {\n editingDiscountIndex.value = index;\n const discount = discounts.value[index];\n \n // Копируем данные в currentDiscount\n Object.assign(currentDiscount, {\n name: discount.name || '',\n description: discount.description || '',\n type: discount.type || 'discount',\n value: discount.value || 0,\n quantity: discount.quantity || 1,\n date: {\n start: discount.date?.start || null,\n end: discount.date?.end || null\n },\n time: {\n start: discount.time?.start || '',\n end: discount.time?.end || ''\n },\n users: Array.isArray(discount.users) ? [...discount.users] : []\n });\n } else {\n // Сброс данных при создании новой скидки\n editingDiscountIndex.value = null;\n Object.assign(currentDiscount, {\n name: '',\n description: '',\n type: 'discount',\n value: 0,\n quantity: 1,\n date: {\n start: null,\n end: null\n },\n time: {\n start: '',\n end: ''\n },\n users: []\n });\n }\n \n isDiscountPopupOpen.value = true;\n}\n\n// Закрытие попапа\nfunction closeDiscountPopup() {\n isDiscountPopupOpen.value = false;\n editingDiscountIndex.value = null;\n}\n\n\n\n// Сохранение скидки\nfunction saveDiscount() {\n // Проверка на основные поля\n if (currentDiscount.type === 'discount' && (currentDiscount.value < 0 || currentDiscount.value > 100)) {\n alert('Discount value must be between 0 and 100');\n return;\n }\n\n if (currentDiscount.type === 'special_price' && currentDiscount.value < 0) {\n alert('Special price must be greater than or equal to 0');\n return;\n }\n\n // Создаем копию текущей скидки для сохранения\n const discountToSave = {\n name: currentDiscount.name,\n description: currentDiscount.description,\n type: currentDiscount.type || 'discount',\n value: parseFloat(currentDiscount.value) || 0,\n quantity: parseInt(currentDiscount.quantity) || 1,\n date: {\n start: currentDiscount.date.start,\n end: currentDiscount.date.end\n },\n time: {\n start: currentDiscount.time.start,\n end: currentDiscount.time.end\n },\n users: [...currentDiscount.users]\n };\n\n // Если редактируем существующую скидку\n if (editingDiscountIndex.value !== null) {\n // Обновляем существующую скидку\n discounts.value.splice(editingDiscountIndex.value, 1, discountToSave);\n } else {\n // Добавляем новую скидку\n if (!discounts.value) {\n discounts.value = [];\n }\n discounts.value.push(discountToSave);\n }\n\n // Закрываем попап\n closeDiscountPopup();\n}\n</script>"],"names":["_useModel"],"mappings":"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"}
|
|
@@ -5,11 +5,11 @@ import variantsStore from "../../store/variants.store.js";
|
|
|
5
5
|
import { state } from "../../store/products.js";
|
|
6
6
|
import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
|
|
7
7
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
8
|
-
import _sfc_main$3 from "../../../../components/Button/Button.
|
|
8
|
+
import _sfc_main$3 from "../../../../components/Button/Button.vue2.js";
|
|
9
9
|
import _sfc_main$7 from "../../../../components/Popup/Popup.vue.js";
|
|
10
|
-
import Select from "../../../../components/Select/Select.
|
|
10
|
+
import Select from "../../../../components/Select/Select.vue.js";
|
|
11
11
|
import _sfc_main$2 from "../../../../components/Feed/Feed.vue.js";
|
|
12
|
-
import _sfc_main$9 from "../../../../components/EditImages/EditImages.
|
|
12
|
+
import _sfc_main$9 from "../../../../components/EditImages/EditImages.vue2.js";
|
|
13
13
|
import _sfc_main$8 from "./EditIngredients.vue.js";
|
|
14
14
|
import PlaceholderImage from "../../../icons/placeholders/PlaceholderImage.vue.js";
|
|
15
15
|
import _sfc_main$5 from "../../../icons/navigation/IconEdit.vue.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, watch, onMounted, createElementBlock, openBlock, createVNode, createElementVNode, withCtx, Fragment, renderList, createBlock, toDisplayString, unref } from "vue";
|
|
2
|
-
import _sfc_main$1 from "../../../../components/Spoiler/Spoiler.
|
|
2
|
+
import _sfc_main$1 from "../../../../components/Spoiler/Spoiler.vue2.js";
|
|
3
3
|
import _sfc_main$2 from "../../../../components/Checkbox/Checkbox.vue.js";
|
|
4
4
|
import { useI18n } from "vue-i18n";
|
|
5
5
|
import { useRoute, useRouter } from "vue-router";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ref, computed, createElementBlock, createCommentVNode, openBlock, createVNode, createElementVNode, toDisplayString, withCtx, unref, Fragment } from "vue";
|
|
2
2
|
import { useI18n } from "vue-i18n";
|
|
3
3
|
import _sfc_main$5 from "../../../icons/actions/IconShopcartAdd.vue.js";
|
|
4
|
-
import _sfc_main$4 from "../../../../components/Button/Button.
|
|
4
|
+
import _sfc_main$4 from "../../../../components/Button/Button.vue2.js";
|
|
5
5
|
import _sfc_main$1 from "../blocks/ProductVariants.vue.js";
|
|
6
6
|
import ProductDiscounts from "../blocks/ProductDiscounts.vue.js";
|
|
7
7
|
import _sfc_main$3 from "../elements/QuantitySelector.vue.js";
|
|
@@ -27,7 +27,7 @@ const _hoisted_9 = {
|
|
|
27
27
|
key: 0,
|
|
28
28
|
class: "gap-micro flex flex-center flex-nowrap"
|
|
29
29
|
};
|
|
30
|
-
const _hoisted_10 = { class: "
|
|
30
|
+
const _hoisted_10 = { class: "ws-nowrap" };
|
|
31
31
|
const _hoisted_11 = { key: 0 };
|
|
32
32
|
const _hoisted_12 = { key: 1 };
|
|
33
33
|
const _sfc_main = {
|
package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductConfigurator.vue.js","sources":["../../../../../../../src/modules/products/components/sections/ProductConfigurator.vue"],"sourcesContent":["<template>\n <div v-if=\"productVariants?.length\" class=\"w-100\">\n <!-- Variants Selection Component -->\n <ProductVariants\n :productVariants=\"productVariants\"\n :productId=\"productId\"\n :productName=\"productName\"\n @variant-selected=\"handleVariantSelected\"\n @update-images=\"$emit('update-images', $event)\"\n />\n \n <!-- Discounts Component -->\n <ProductDiscounts\n :discounts=\"discounts\"\n :regularPrice=\"regularPrice\"\n :selectedVariant=\"selectedVariant\"\n :productVariants=\"productVariants\"\n @select-discount=\"handleDiscountSelected\"\n class=\"mn-b-medium\"\n />\n \n <!-- Показываем цену, если нет вариантов или не выбран ни один вариант -->\n <div class=\"flex-nowrap flex gap-thin\">\n <div class=\"\">\n <p class=\"fw-medium mn-b-thin\">Price</p>\n <Price \n :product=\"selectedVariant || productVariants[0]\"\n :variants=\"productVariants\" \n size=\"big\" \n class=\"flex gap-micro flex-center pd-small bg-second t-white w-max mn-b-medium\" \n />\n </div>\n \n \n <!-- Quantity Selection -->\n <div class=\"w-100\">\n <div class=\"flex flex-nowrap flex-v-center mn-b-thin\">\n <p class=\"fw-medium\">Quantity</p>\n <span v-if=\"selectedVariant\" class=\"t-small t-transp mn-l-thin\">\n (Max: {{ maxQuantity }})\n </span>\n </div>\n \n <QuantitySelector v-model=\"quantity\" :maxValue=\"maxQuantity\" />\n </div>\n </div>\n\n <!-- Out of stock notice -->\n <div v-if=\"selectedVariant && !selectedVariant.available\" class=\"mn-b-medium\">\n <div class=\"flex flex-nowrap gap-small pd-small bg-error-light radius-small t-error\">\n <span>Out of stock</span>\n </div>\n </div>\n\n <!-- Add to cart button -->\n <div class=\"w-100 mn-b-medium\">\n <Button\n :submit=\"isVariantAvailable ? addProductToCart : undefined\"\n :disabled=\"!isVariantAvailable\"\n class=\"cursor-pointer pd-medium radius-big w-100 bg-main button h-3r\"\n >\n <div v-if=\"isVariantAvailable\" class=\"gap-micro flex flex-center flex-nowrap\">\n <IconShopcartAdd class=\"i-medium\"/>\n <span class=\"
|
|
1
|
+
{"version":3,"file":"ProductConfigurator.vue.js","sources":["../../../../../../../src/modules/products/components/sections/ProductConfigurator.vue"],"sourcesContent":["<template>\n <div v-if=\"productVariants?.length\" class=\"w-100\">\n <!-- Variants Selection Component -->\n <ProductVariants\n :productVariants=\"productVariants\"\n :productId=\"productId\"\n :productName=\"productName\"\n @variant-selected=\"handleVariantSelected\"\n @update-images=\"$emit('update-images', $event)\"\n />\n \n <!-- Discounts Component -->\n <ProductDiscounts\n :discounts=\"discounts\"\n :regularPrice=\"regularPrice\"\n :selectedVariant=\"selectedVariant\"\n :productVariants=\"productVariants\"\n @select-discount=\"handleDiscountSelected\"\n class=\"mn-b-medium\"\n />\n \n <!-- Показываем цену, если нет вариантов или не выбран ни один вариант -->\n <div class=\"flex-nowrap flex gap-thin\">\n <div class=\"\">\n <p class=\"fw-medium mn-b-thin\">Price</p>\n <Price \n :product=\"selectedVariant || productVariants[0]\"\n :variants=\"productVariants\" \n size=\"big\" \n class=\"flex gap-micro flex-center pd-small bg-second t-white w-max mn-b-medium\" \n />\n </div>\n \n \n <!-- Quantity Selection -->\n <div class=\"w-100\">\n <div class=\"flex flex-nowrap flex-v-center mn-b-thin\">\n <p class=\"fw-medium\">Quantity</p>\n <span v-if=\"selectedVariant\" class=\"t-small t-transp mn-l-thin\">\n (Max: {{ maxQuantity }})\n </span>\n </div>\n \n <QuantitySelector v-model=\"quantity\" :maxValue=\"maxQuantity\" />\n </div>\n </div>\n\n <!-- Out of stock notice -->\n <div v-if=\"selectedVariant && !selectedVariant.available\" class=\"mn-b-medium\">\n <div class=\"flex flex-nowrap gap-small pd-small bg-error-light radius-small t-error\">\n <span>Out of stock</span>\n </div>\n </div>\n\n <!-- Add to cart button -->\n <div class=\"w-100 mn-b-medium\">\n <Button\n :submit=\"isVariantAvailable ? addProductToCart : undefined\"\n :disabled=\"!isVariantAvailable\"\n class=\"cursor-pointer pd-medium radius-big w-100 bg-main button h-3r\"\n >\n <div v-if=\"isVariantAvailable\" class=\"gap-micro flex flex-center flex-nowrap\">\n <IconShopcartAdd class=\"i-medium\"/>\n <span class=\"ws-nowrap\">{{ t('addtoorder') }}</span>\n </div>\n <template v-else>\n <span v-if=\"!selectedVariant && productVariants.length > 1\">Select variant</span>\n <span v-else>Out of Stock</span>\n </template>\n </Button>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport IconShopcartAdd from '@martyrs/src/modules/icons/actions/IconShopcartAdd.vue';\nimport Button from '@martyrs/src/components/Button/Button.vue';\n\nimport ProductVariants from '../blocks/ProductVariants.vue';\nimport ProductDiscounts from '../blocks/ProductDiscounts.vue';\nimport QuantitySelector from '../elements/QuantitySelector.vue';\n\nimport Price from '@martyrs/src/modules/products/components/elements/Price.vue'\n\nconst props = defineProps({\n productVariants: { type: Array, default: () => [] },\n productId: { type: String, required: true },\n productName: { type: String, required: true },\n discounts: { type: Array, default: () => [] },\n regularPrice: { type: String, required: true }\n});\n\nconst emits = defineEmits(['variant-selected', 'add-to-cart', 'update-images']);\nconst { t } = useI18n({ messages: { en: { addtoorder: 'Add to Cart' }, ru: { addtoorder: 'Добавить в корзину' } } });\n\nconst selectedVariant = ref(null);\nconst quantity = ref(1);\n\n// Computed properties\nconst isVariantAvailable = computed(() => \n selectedVariant.value ? selectedVariant.value.available :\n props.productVariants.length === 1 ? props.productVariants[0].available : false\n);\n\nconst maxQuantity = computed(() => \n selectedVariant.value ? selectedVariant.value.available : \n props.productVariants.length === 1 ? props.productVariants[0].available || 1 : 1\n);\n\n// Methods\nfunction handleVariantSelected(variant) {\n selectedVariant.value = variant;\n if (quantity.value > variant.available) quantity.value = variant.available;\n emits('variant-selected', variant);\n}\n\nfunction handleDiscountSelected(discount) {\n // Update quantity based on discount requirements\n if (discount.quantity && discount.quantity > quantity.value) {\n quantity.value = discount.quantity;\n }\n}\n\nfunction addProductToCart() {\n const variant = selectedVariant.value || \n (props.productVariants.length === 1 ? props.productVariants[0] : null);\n \n if (!variant || !variant.available || quantity.value > variant.available) return false;\n \n emits('add-to-cart', {\n variant: variant,\n quantity: quantity.value\n });\n \n return true;\n}\n</script>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsFA,UAAM,QAAQ;AAQd,UAAM,QAAQ;AACd,UAAM,EAAE,EAAC,IAAK,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,cAAa,GAAI,IAAI,EAAE,YAAY,qBAAoB,EAAE,EAAE,CAAE;AAEnH,UAAM,kBAAkB,IAAI,IAAI;AAChC,UAAM,WAAW,IAAI,CAAC;AAGtB,UAAM,qBAAqB;AAAA,MAAS,MAClC,gBAAgB,QAAQ,gBAAgB,MAAM,YAC9C,MAAM,gBAAgB,WAAW,IAAI,MAAM,gBAAgB,CAAC,EAAE,YAAY;AAAA,IAC5E;AAEA,UAAM,cAAc;AAAA,MAAS,MAC3B,gBAAgB,QAAQ,gBAAgB,MAAM,YAC9C,MAAM,gBAAgB,WAAW,IAAI,MAAM,gBAAgB,CAAC,EAAE,aAAa,IAAI;AAAA,IACjF;AAGA,aAAS,sBAAsB,SAAS;AACtC,sBAAgB,QAAQ;AACxB,UAAI,SAAS,QAAQ,QAAQ,UAAW,UAAS,QAAQ,QAAQ;AACjE,YAAM,oBAAoB,OAAO;AAAA,IACnC;AAEA,aAAS,uBAAuB,UAAU;AAExC,UAAI,SAAS,YAAY,SAAS,WAAW,SAAS,OAAO;AAC3D,iBAAS,QAAQ,SAAS;AAAA,MAC5B;AAAA,IACF;AAEA,aAAS,mBAAmB;AAC1B,YAAM,UAAU,gBAAgB,UAC7B,MAAM,gBAAgB,WAAW,IAAI,MAAM,gBAAgB,CAAC,IAAI;AAEnE,UAAI,CAAC,WAAW,CAAC,QAAQ,aAAa,SAAS,QAAQ,QAAQ,UAAW,QAAO;AAEjF,YAAM,eAAe;AAAA,QACnB;AAAA,QACA,UAAU,SAAS;AAAA,MACvB,CAAG;AAED,aAAO;AAAA,IACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getCurrentInstance, ref, computed, createElementBlock, openBlock, createElementVNode, Fragment, renderList, createBlock, withCtx, createVNode, withModifiers, toDisplayString } from "vue";
|
|
2
2
|
import { useRouter } from "vue-router";
|
|
3
|
-
import _sfc_main$4 from "../../../../components/Button/Button.
|
|
3
|
+
import _sfc_main$4 from "../../../../components/Button/Button.vue2.js";
|
|
4
4
|
import _sfc_main$2 from "../../../../components/Checkbox/Checkbox.vue.js";
|
|
5
5
|
import _sfc_main$1 from "../blocks/CardProduct.vue.js";
|
|
6
6
|
import _sfc_main$3 from "../../../icons/entities/IconProducts.vue.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { computed, ref, createElementBlock, openBlock, createElementVNode, createBlock, createCommentVNode, createVNode, unref, toDisplayString, Transition, withCtx, Fragment, renderList, createTextVNode } from "vue";
|
|
2
|
-
import _sfc_main$4 from "../../../../components/Button/Button.
|
|
2
|
+
import _sfc_main$4 from "../../../../components/Button/Button.vue2.js";
|
|
3
3
|
import _sfc_main$3 from "../../../../components/Tab/Tab.vue.js";
|
|
4
4
|
import _sfc_main$1 from "../../../icons/navigation/IconEdit.vue.js";
|
|
5
5
|
import PlaceholderImage from "../../../icons/placeholders/PlaceholderImage.vue.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { computed, ref, watch, createElementBlock, openBlock, createElementVNode, createVNode, withCtx, createTextVNode } from "vue";
|
|
2
2
|
import dayjs from "../../../../../../../../_virtual/dayjs.min.js";
|
|
3
3
|
import _sfc_main$2 from "../../../../../../components/Tab/Tab.vue.js";
|
|
4
|
-
import _sfc_main$3 from "../../../../../../components/Button/Button.
|
|
4
|
+
import _sfc_main$3 from "../../../../../../components/Button/Button.vue2.js";
|
|
5
5
|
import _sfc_main$4 from "../../../../../../components/Dropdown/Dropdown.vue.js";
|
|
6
6
|
import Calendar from "../../../../../../components/Calendar/Calendar.vue2.js";
|
|
7
7
|
import _sfc_main$1 from "./DateLabel.vue.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ref, computed, onMounted, createElementBlock, openBlock, createElementVNode, createVNode, toDisplayString, unref, withCtx, Fragment, renderList, createBlock, createCommentVNode, createTextVNode } from "vue";
|
|
2
2
|
import _sfc_main$4 from "../../../../../components/Block/Block.vue.js";
|
|
3
|
-
import _sfc_main$5 from "../../../../../components/Button/Button.
|
|
3
|
+
import _sfc_main$5 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
6
|
import _sfc_main$1 from "../../../../../components/Popup/Popup.vue.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { reactive, ref, createElementBlock, openBlock, renderSlot, createVNode, withCtx, createElementVNode, createTextVNode } from "vue";
|
|
2
2
|
import _sfc_main$1 from "../../../../components/Popup/Popup.vue.js";
|
|
3
|
-
import _sfc_main$2 from "../../../../components/Button/Button.
|
|
4
|
-
import Select from "../../../../components/Select/Select.
|
|
3
|
+
import _sfc_main$2 from "../../../../components/Button/Button.vue2.js";
|
|
4
|
+
import Select from "../../../../components/Select/Select.vue.js";
|
|
5
5
|
import { actions } from "../../store/reports.js";
|
|
6
6
|
const _sfc_main = {
|
|
7
7
|
__name: "FormReport",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ref, computed, resolveComponent, createElementBlock, openBlock, createElementVNode, createCommentVNode, createBlock, toDisplayString } from "vue";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import _export_sfc from "../../../../../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
-
/* empty css
|
|
4
|
+
/* empty css */
|
|
5
5
|
/* empty css */
|
|
6
6
|
const _hoisted_1 = { class: "br-grey-transp-25 radius-small mn-b-small" };
|
|
7
7
|
const _hoisted_2 = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ref, onMounted, watch, resolveComponent, createElementBlock, openBlock, createElementVNode, createVNode, unref, createCommentVNode, toDisplayString, withCtx, Transition, createBlock, resolveDynamicComponent } from "vue";
|
|
2
2
|
import { useRoute, useRouter } from "vue-router";
|
|
3
3
|
import { useI18n } from "vue-i18n";
|
|
4
|
-
/* empty css
|
|
4
|
+
/* empty css */
|
|
5
5
|
/* empty css */
|
|
6
6
|
/* empty css */
|
|
7
7
|
/* empty css */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ref, onMounted, createElementBlock, openBlock, createElementVNode, createVNode, withCtx, createTextVNode } from "vue";
|
|
2
2
|
import { useRouter, useRoute } from "vue-router";
|
|
3
3
|
import { Loader } from "../../../../../../node_modules/.pnpm/@googlemaps_js-api-loader@1.16.8/node_modules/@googlemaps/js-api-loader/dist/index.js";
|
|
4
|
-
import _sfc_main$1 from "../../../../components/Button/Button.
|
|
4
|
+
import _sfc_main$1 from "../../../../components/Button/Button.vue2.js";
|
|
5
5
|
import { actions, state as state$1 } from "../../../organizations/store/organizations.js";
|
|
6
6
|
import { useStore } from "../../../core/views/store/core.store.js";
|
|
7
7
|
import { state } from "../../../marketplace/views/store/marketplace.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { computed, onMounted, createElementBlock, createCommentVNode, openBlock, createVNode, createElementVNode, unref, withCtx, Fragment, renderList, createBlock, toDisplayString } from "vue";
|
|
2
2
|
import { useRoute, useRouter } from "vue-router";
|
|
3
|
-
import _sfc_main$1 from "../../../../components/Spoiler/Spoiler.
|
|
3
|
+
import _sfc_main$1 from "../../../../components/Spoiler/Spoiler.vue2.js";
|
|
4
4
|
import Map from "../../../../components/Map/Map.vue.js";
|
|
5
5
|
import SpotSub from "../blocks/SpotSub.vue.js";
|
|
6
6
|
import _sfc_main$2 from "../../../auth/views/components/blocks/CardUser.vue.js";
|
|
@@ -4,11 +4,11 @@ import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
|
|
|
4
4
|
import UploadImage from "../../../../components/UploadImage/UploadImage.vue.js";
|
|
5
5
|
/* empty css */
|
|
6
6
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
7
|
-
import Select from "../../../../components/Select/Select.
|
|
7
|
+
import Select from "../../../../components/Select/Select.vue.js";
|
|
8
8
|
import _sfc_main$3 from "../../../../components/Checkbox/Checkbox.vue.js";
|
|
9
9
|
import _sfc_main$4 from "../../../../components/Address/Address.vue.js";
|
|
10
10
|
import _sfc_main$5 from "../../../../components/LocationMarker/LocationMarker.vue.js";
|
|
11
|
-
import _sfc_main$2 from "../../../../components/Button/Button.
|
|
11
|
+
import _sfc_main$2 from "../../../../components/Button/Button.vue2.js";
|
|
12
12
|
/* empty css */
|
|
13
13
|
import WorktimeEdit from "../sections/WorktimeEdit.vue.js";
|
|
14
14
|
import { actions, state } from "../../store/spots.js";
|
|
@@ -71,7 +71,7 @@ const _sfc_main = {
|
|
|
71
71
|
return openBlock(), createElementBlock("div", {
|
|
72
72
|
key: category._id,
|
|
73
73
|
onClick: ($event) => selectCategory(category),
|
|
74
|
-
class: "flex-child-default bg-light flex
|
|
74
|
+
class: "flex-child-default bg-light flex ws-nowrap pd-medium radius-medium cursor-pointer hover:bg-light ease"
|
|
75
75
|
}, toDisplayString(category.name), 9, _hoisted_6);
|
|
76
76
|
}), 128))
|
|
77
77
|
])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Spots.vue.js","sources":["../../../../../../../src/modules/spots/components/pages/Spots.vue"],"sourcesContent":["<template>\n <div class=\"pos-relative\">\n <header \n v-if=\"route.name !== 'Organization' && !MOBILE_APP\"\n class=\"pd-medium flex-v-center flex-nowrap flex\"\n >\n <h2 class=\"mn-r-medium\">Spots</h2>\n <button\n v-if=\"hasAccess(route.params._id, 'spots', 'create', auth.state.accesses, auth.state.access.roles)\"\n @click=\"$router.push({\n name: getRouteName('Create Spot'),\n params: { _id: route.params._id }\n })\"\n class=\"radius-extra i-big hover:scale-[1.05] cursor-pointer t-white bg-second\">\n +\n </button>\n </header>\n\n <div class=\"w-100 rows-1 pd-thin pos-relative o-hidden\">\n \n <div class=\"mn-b-thin w-100 o-y-scroll scroll-hide scroll-snap-x-mandatory scroll-pd-regular\">\n <div class=\"gap-thin flex-nowrap flex\">\n <div\n v-for=\"category in currentCategories\"\n :key=\"category._id\"\n @click=\"selectCategory(category)\"\n class=\"flex-child-default bg-light flex
|
|
1
|
+
{"version":3,"file":"Spots.vue.js","sources":["../../../../../../../src/modules/spots/components/pages/Spots.vue"],"sourcesContent":["<template>\n <div class=\"pos-relative\">\n <header \n v-if=\"route.name !== 'Organization' && !MOBILE_APP\"\n class=\"pd-medium flex-v-center flex-nowrap flex\"\n >\n <h2 class=\"mn-r-medium\">Spots</h2>\n <button\n v-if=\"hasAccess(route.params._id, 'spots', 'create', auth.state.accesses, auth.state.access.roles)\"\n @click=\"$router.push({\n name: getRouteName('Create Spot'),\n params: { _id: route.params._id }\n })\"\n class=\"radius-extra i-big hover:scale-[1.05] cursor-pointer t-white bg-second\">\n +\n </button>\n </header>\n\n <div class=\"w-100 rows-1 pd-thin pos-relative o-hidden\">\n \n <div class=\"mn-b-thin w-100 o-y-scroll scroll-hide scroll-snap-x-mandatory scroll-pd-regular\">\n <div class=\"gap-thin flex-nowrap flex\">\n <div\n v-for=\"category in currentCategories\"\n :key=\"category._id\"\n @click=\"selectCategory(category)\"\n class=\"flex-child-default bg-light flex ws-nowrap pd-medium radius-medium cursor-pointer hover:bg-light ease\"\n >\n {{ category.name }}\n </div>\n </div>\n </div>\n\n <Feed\n :search=\"true\"\n v-model:filter=\"spots.state.filter\"\n v-model:sort=\"spots.state.sort\"\n :showLoadMore=\"false\"\n :states=\"{\n empty: {\n title: 'No Spots Found',\n description: 'Currently, there are no spots available.'\n }\n }\"\n :store=\"{\n read: (options) => spots.actions.read(options),\n state: spots.state\n }\"\n :options=\"{\n limit: 12,\n organization: route.params._id || null,\n user: auth.state.user._id,\n search: route.query.search\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"cols-1 pos-relative w-100 rows-1 gap-thin\"\n >\n <CardSpot\n v-for=\"(spot, index) in items\"\n :key=\"index\"\n :spot=\"spot\"\n :organization=\"organization\"\n :editAccess=\"hasAccess(route.params._id, 'spots', 'edit', auth.state.accesses, auth.state.access.roles)\"\n :showDeliveryOptions=\"true\"\n :showPaymentOptions=\"true\"\n class=\"radius-medium h-min-big bg-light\"\n @click=\"$router.push({\n name: getRouteName('Spot'),\n params: {\n _id: route.params._id,\n spot: spot._id\n }\n })\"\n />\n </Feed>\n\n </div>\n </div>\n</template>\n\n<script setup=\"props\">\n // Import libs\n import { ref, watch, onMounted, onUnmounted } from 'vue'\n import { useRoute, useRouter } from 'vue-router'\n\n // Import components\n import Feed from '@martyrs/src/components/Feed/Feed.vue'\n\n import CardSpot from '@martyrs/src/modules/spots/components/blocks/CardSpot.vue'\n\n import IconPlus from '@martyrs/src/modules/icons/navigation/IconPlus.vue'\n\n // Accessing router and store\n import * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\n import { useStore } from '@martyrs/src/modules/core/views/store/core.store.js';\n\nconst store = useStore();\n import * as spots from '@martyrs/src/modules/spots/store/spots.js';\n import * as organizations from '@martyrs/src/modules/organizations/store/organizations.js';\n import { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\n const route = useRoute()\n const router = useRouter()\n const { hasAccess } = useGlobalMixins()\n\n const getRouteName = (baseName) => `${route.meta?.context || ''}${baseName}`\n\n // Props\n const props = defineProps({\n organization: {\n type: Object,\n default: null\n }\n })\n\n // Categories for mobile view\n const currentCategories = ref([]);\n\n const selectCategory = (category) => {\n // Implementation for category selection\n console.log('Category selected:', category);\n };\n\n store.core.state.navigation_bar.actions = [{\n component: IconPlus,\n props: {\n fill: \"rgb(var(--main))\"\n },\n condition: () => auth.state.user && auth.state.user._id,\n action: () => router.push({ name: getRouteName('Create Spot'), params: { _id: route.params._id } })\n }]\n\n onMounted(async () => {\n if (route.params._id) {\n await organizations.actions.read({ _id: route.params._id });\n }\n })\n\n onUnmounted(() => {\n store.core.state.navigation_bar.actions = [];\n });\n</script>\n\n<style lang=\"scss\">\n</style>\n"],"names":["IconPlus","auth.state","organizations.actions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkGA,UAAM,QAAQ,SAAQ;AAKpB,UAAM,QAAQ,SAAQ;AACtB,UAAM,SAAS,UAAS;AACxB,UAAM,EAAE,UAAS,IAAK,gBAAe;AAErC,UAAM,eAAe,CAAC,aAAa,GAAG,MAAM,MAAM,WAAW,EAAE,GAAG,QAAQ;AAW1E,UAAM,oBAAoB,IAAI,EAAE;AAEhC,UAAM,iBAAiB,CAAC,aAAa;AAEnC,cAAQ,IAAI,sBAAsB,QAAQ;AAAA,IAC5C;AAEA,UAAM,KAAK,MAAM,eAAe,UAAU,CAAC;AAAA,MACzC,WAAWA;AAAAA,MACX,OAAO;AAAA,QACL,MAAM;AAAA,MACZ;AAAA,MACI,WAAW,MAAMC,MAAW,QAAQA,MAAW,KAAK;AAAA,MACpD,QAAQ,MAAM,OAAO,KAAK,EAAE,MAAM,aAAa,aAAa,GAAG,QAAQ,EAAE,KAAK,MAAM,OAAO,IAAG,EAAE,CAAE;AAAA,IACtG,CAAG;AAED,cAAU,YAAY;AACpB,UAAI,MAAM,OAAO,KAAK;AACpB,cAAMC,QAAsB,KAAK,EAAE,KAAK,MAAM,OAAO,KAAK;AAAA,MAC5D;AAAA,IACF,CAAC;AAED,gBAAY,MAAM;AAChB,YAAM,KAAK,MAAM,eAAe,UAAU,CAAA;AAAA,IAC5C,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { mergeModels, useModel, ref, computed, onMounted, createElementBlock, openBlock, createElementVNode, createVNode, toDisplayString, unref, withCtx, createTextVNode, Fragment, renderList, normalizeClass, createCommentVNode, createBlock } from "vue";
|
|
2
2
|
import { useI18n } from "vue-i18n";
|
|
3
|
-
import _sfc_main$1 from "../../../../components/Button/Button.
|
|
3
|
+
import _sfc_main$1 from "../../../../components/Button/Button.vue2.js";
|
|
4
4
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
5
|
-
import Select from "../../../../components/Select/Select.
|
|
5
|
+
import Select from "../../../../components/Select/Select.vue.js";
|
|
6
6
|
import _sfc_main$3 from "../../../../components/Checkbox/Checkbox.vue.js";
|
|
7
7
|
import _sfc_main$2 from "../../../../components/Popup/Popup.vue.js";
|
|
8
8
|
/* empty css */
|
|
@@ -4,7 +4,7 @@ import { BigNumber } from "../../../../../../node_modules/.pnpm/bignumber.js@9.1
|
|
|
4
4
|
import { state, actions } from "../../store/wallet.store.js";
|
|
5
5
|
import text from "../../localization/wallet.json.js";
|
|
6
6
|
import Field from "../../../../../components/Field/Field.vue.js";
|
|
7
|
-
import Select from "../../../../../components/Select/Select.
|
|
7
|
+
import Select from "../../../../../components/Select/Select.vue.js";
|
|
8
8
|
const _hoisted_1 = { class: "mn-b-small t-center fw-bold" };
|
|
9
9
|
const _hoisted_2 = { class: "fw-semi" };
|
|
10
10
|
const _hoisted_3 = ["disabled"];
|
|
@@ -64,7 +64,7 @@ const _sfc_main = {
|
|
|
64
64
|
options: depositOptions.value,
|
|
65
65
|
select: unref(state).chosenNetwork,
|
|
66
66
|
"onUpdate:select": _cache[0] || (_cache[0] = ($event) => unref(state).chosenNetwork = $event),
|
|
67
|
-
class: "bg-light
|
|
67
|
+
class: "bg-light ws-nowrap pd-r-thin pd-l-thin pd-t-nano pd-b-nano radius-thin"
|
|
68
68
|
}, null, 8, ["options", "select"])
|
|
69
69
|
]),
|
|
70
70
|
_: 1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CryptoDeposit.vue.js","sources":["../../../../../../../../src/modules/wallet/views/components/blocks/CryptoDeposit.vue"],"sourcesContent":["<template>\n <h3 class=\"mn-b-small t-center fw-bold\">{{ t('wallet.depositWithCrypto') }}</h3>\n\n <Field \n v-if=\"state.config\"\n v-model:field=\"amount\"\n :placeholder=\"t('wallet.enterAmount')\"\n class=\"mn-b-thin bg-white w-100 br-1px br-black-transp-5 pd-small radius-small\" \n >\n <Select \n :options=\"depositOptions\"\n v-model:select=\"state.chosenNetwork\"\n class=\"bg-light
|
|
1
|
+
{"version":3,"file":"CryptoDeposit.vue.js","sources":["../../../../../../../../src/modules/wallet/views/components/blocks/CryptoDeposit.vue"],"sourcesContent":["<template>\n <h3 class=\"mn-b-small t-center fw-bold\">{{ t('wallet.depositWithCrypto') }}</h3>\n\n <Field \n v-if=\"state.config\"\n v-model:field=\"amount\"\n :placeholder=\"t('wallet.enterAmount')\"\n class=\"mn-b-thin bg-white w-100 br-1px br-black-transp-5 pd-small radius-small\" \n >\n <Select \n :options=\"depositOptions\"\n v-model:select=\"state.chosenNetwork\"\n class=\"bg-light ws-nowrap pd-r-thin pd-l-thin pd-t-nano pd-b-nano radius-thin\"\n />\n </Field>\n\n <p class=\"fw-semi\">You will receive: {{ receiveAmount }} {{t('wallet.token')}}</p>\n\n <button\n class=\"uppercase w-100 bg-main t-black pd-thin radius-medium t-center br-2px br-black-transp-10 mn-t-small\"\n @click=\"actions.requestCryptoDeposit(amount).then(() => switchMenu(5))\"\n :disabled=\"state.depositRequestIsActive || !state.config\"\n >\n {{ t('wallet.pay') }}\n </button>\n\n <button\n class=\"uppercase w-100 t-center mn-t-small\"\n @click=\"backSelection\"\n >\n {{ t('wallet.backToSelection') }}\n </button>\n</template>\n\n<script setup>\n import { useI18n } from 'vue-i18n'\n import { ref, onMounted, computed } from 'vue';\n import { BigNumber } from 'bignumber.js';\n\n import { state, actions } from '@martyrs/src/modules/wallet/views/store/wallet.store';\n import text from '@martyrs/src/modules/wallet/views/localization/wallet.json'\n import Field from '@martyrs/src/components/Field/Field.vue'\n import Select from '@martyrs/src/components/Select/Select.vue'\n\n BigNumber.config({\n EXPONENTIAL_AT: [-1000, 20000]\n });\n\n const amount = ref(1);\n const emits = defineEmits(['back-selection', 'switch-menu'])\n\n // Localization\n const { t } = useI18n({\n useScope: 'global', \n ...text\n })\n\n const receiveAmount = computed(() =>\n new BigNumber(amount.value)\n .dividedBy(process.env.TOKEN_EXCHANGE_RATE)\n .toString()\n )\n\n const depositOptions = computed(() => {\n const options = [];\n\n const networks = Object.keys(state.config || {});\n\n for (const network of networks) {\n for (const token of Object.keys(state.config[network].tokens)) {\n options.push({\n name: `${network}-${token}`,\n value: {\n token: state.config[network].tokens[token],\n network: network\n }\n });\n }\n }\n\n return options;\n });\n\n onMounted(() => {\n actions.loadConfig();\n })\n\n function backSelection() {\n emits(\"back-selection\")\n }\n\n function switchMenu(screen = 0) {\n emits(\"switch-menu\", screen)\n }\n</script>\n\n<style scoped>\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;AA4CE,cAAU,OAAO;AAAA,MACf,gBAAgB,CAAC,MAAO,GAAK;AAAA,IACjC,CAAG;AAED,UAAM,SAAS,IAAI,CAAC;AACpB,UAAM,QAAQ;AAGd,UAAM,EAAE,EAAC,IAAK,QAAQ;AAAA,MACpB,UAAU;AAAA,MACV,GAAG;AAAA,IACP,CAAG;AAED,UAAM,gBAAgB;AAAA,MAAS,MAC7B,IAAI,UAAU,OAAO,KAAK,EACvB,UAAU,QAAQ,IAAI,mBAAmB,EACzC,SAAQ;AAAA,IACf;AAEE,UAAM,iBAAiB,SAAS,MAAM;AACpC,YAAM,UAAU,CAAA;AAEhB,YAAM,WAAW,OAAO,KAAK,MAAM,UAAU,CAAA,CAAE;AAE/C,iBAAW,WAAW,UAAU;AAC9B,mBAAW,SAAS,OAAO,KAAK,MAAM,OAAO,OAAO,EAAE,MAAM,GAAG;AAC7D,kBAAQ,KAAK;AAAA,YACX,MAAM,GAAG,OAAO,IAAI,KAAK;AAAA,YACzB,OAAO;AAAA,cACL,OAAO,MAAM,OAAO,OAAO,EAAE,OAAO,KAAK;AAAA,cACzC;AAAA,YACZ;AAAA,UACA,CAAS;AAAA,QACH;AAAA,MACF;AAEA,aAAO;AAAA,IACT,CAAC;AAED,cAAU,MAAM;AACd,cAAQ,WAAU;AAAA,IACpB,CAAC;AAED,aAAS,gBAAgB;AACvB,YAAM,gBAAgB;AAAA,IACxB;AAEA,aAAS,WAAW,SAAS,GAAG;AAC9B,YAAM,eAAe,MAAM;AAAA,IAC7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -4,11 +4,11 @@ import Web3 from "web3";
|
|
|
4
4
|
import { state, actions } from "../../store/wallet.store.js";
|
|
5
5
|
import text from "../../localization/wallet.json.js";
|
|
6
6
|
import _sfc_main$3 from "../../../../../components/Popup/Popup.vue.js";
|
|
7
|
-
import _sfc_main$1 from "../../../../../components/Button/Button.
|
|
7
|
+
import _sfc_main$1 from "../../../../../components/Button/Button.vue2.js";
|
|
8
8
|
import "vue-router";
|
|
9
9
|
/* empty css */
|
|
10
10
|
/* empty css */
|
|
11
|
-
/* empty css
|
|
11
|
+
/* empty css */
|
|
12
12
|
import _sfc_main$2 from "../elements/ConnectMetamask.vue.js";
|
|
13
13
|
import _sfc_main$4 from "../blocks/CashDeposit.vue.js";
|
|
14
14
|
import _sfc_main$5 from "../blocks/CardDeposit.vue.js";
|
|
@@ -108,7 +108,7 @@ const _sfc_main = {
|
|
|
108
108
|
]),
|
|
109
109
|
createElementVNode("button", {
|
|
110
110
|
onClick: openGetMorePopup,
|
|
111
|
-
class: "
|
|
111
|
+
class: "ws-nowrap w-max bg-main fw-medium button"
|
|
112
112
|
}, "Get More"),
|
|
113
113
|
createVNode(_sfc_main$1, {
|
|
114
114
|
submit: unref(actions).collectRewards,
|