@ozdao/martyrs 0.2.571 → 0.2.574
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/_virtual/dayjs.min.js +1 -1
- package/dist/_virtual/weekOfYear.js +1 -1
- package/dist/builder.js +1194 -45
- package/dist/loader.js +30 -0
- package/dist/{main-BFvlam0J.js → main-BfEQkhXS.js} +1173 -1191
- package/dist/martyrs/dist/{main-BFvlam0J.js → main-BfEQkhXS.js} +94 -112
- package/dist/martyrs/dist/main-BfEQkhXS.js.map +1 -0
- package/dist/martyrs/dist/{web-CH5wzMHy.js → web-BqTV9va1.js} +3 -3
- package/dist/martyrs/dist/{web-CH5wzMHy.js.map → web-BqTV9va1.js.map} +1 -1
- package/dist/martyrs/node_modules/.pnpm/{@capacitor_core@7.0.1 → @capacitor_core@7.4.4}/node_modules/@capacitor/core/dist/index.js +2 -1
- package/dist/martyrs/node_modules/.pnpm/@capacitor_core@7.4.4/node_modules/@capacitor/core/dist/index.js.map +1 -0
- package/dist/martyrs/node_modules/.pnpm/{@capacitor_preferences@7.0.0_@capacitor_core@7.0.1 → @capacitor_preferences@7.0.2_@capacitor_core@7.4.4}/node_modules/@capacitor/preferences/dist/esm/index.js +1 -1
- package/dist/martyrs/node_modules/.pnpm/{@capacitor_preferences@7.0.0_@capacitor_core@7.0.1 → @capacitor_preferences@7.0.2_@capacitor_core@7.4.4}/node_modules/@capacitor/preferences/dist/esm/index.js.map +1 -1
- package/dist/martyrs/node_modules/.pnpm/{@capacitor_preferences@7.0.0_@capacitor_core@7.0.1 → @capacitor_preferences@7.0.2_@capacitor_core@7.4.4}/node_modules/@capacitor/preferences/dist/esm/web.js +1 -1
- package/dist/martyrs/node_modules/.pnpm/{@capacitor_preferences@7.0.0_@capacitor_core@7.0.1 → @capacitor_preferences@7.0.2_@capacitor_core@7.4.4}/node_modules/@capacitor/preferences/dist/esm/web.js.map +1 -1
- package/dist/{node_modules/.pnpm/@vue_server-renderer@3.5.13_vue@3.5.13_typescript@5.8.3_ → martyrs}/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js +1 -1
- package/dist/martyrs/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js.map +1 -0
- package/dist/martyrs/node_modules/@vue/shared/dist/shared.esm-bundler.js.map +1 -0
- package/dist/{node_modules/.pnpm/dayjs@1.11.13 → martyrs}/node_modules/dayjs/dayjs.min.js +1 -1
- package/dist/martyrs/node_modules/dayjs/dayjs.min.js.map +1 -0
- package/dist/{node_modules/.pnpm/dayjs@1.11.13 → martyrs}/node_modules/dayjs/plugin/weekOfYear.js +1 -1
- package/dist/martyrs/node_modules/dayjs/plugin/weekOfYear.js.map +1 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/regex.js +5 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/regex.js.map +1 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/rng.js +15 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/rng.js.map +1 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/stringify.js +17 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/stringify.js.map +1 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/v4.js +13 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/v4.js.map +1 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/validate.js +8 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/validate.js.map +1 -0
- package/dist/martyrs/src/components/Block/Block.vue.js +2 -2
- package/dist/martyrs/src/components/Block/Block.vue.js.map +1 -1
- package/dist/martyrs/src/components/BottomSheet/BottomSheet.vue.js +1 -1
- package/dist/martyrs/src/components/BottomSheet/BottomSheet.vue.js.map +1 -1
- package/dist/martyrs/src/components/Button/Button.vue2.js +1 -1
- package/dist/martyrs/src/components/Calendar/Calendar.vue2.js +6 -6
- package/dist/martyrs/src/components/Calendar/Calendar.vue2.js.map +1 -1
- package/dist/martyrs/src/components/Checkbox/Checkbox.vue.js +2 -2
- package/dist/martyrs/src/components/Checkbox/Checkbox.vue.js.map +1 -1
- package/dist/martyrs/src/components/Chips/Chips.vue.js +2 -2
- package/dist/martyrs/src/components/Countdown/Countdown.vue.js +5 -5
- package/dist/martyrs/src/components/Countdown/Countdown.vue.js.map +1 -1
- package/dist/martyrs/src/components/DatePicker/DatePicker.vue.js +4 -4
- package/dist/martyrs/src/components/DatePicker/DatePicker.vue.js.map +1 -1
- package/dist/martyrs/src/components/EditImages/{EditImages.vue.js → EditImages.vue2.js} +3 -3
- package/dist/martyrs/src/components/EditImages/EditImages.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Feed/Carousel.vue.js +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.js +3 -3
- package/dist/martyrs/src/components/Feed/Feed.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/FieldPhone/FieldPhone.vue.js +1 -1
- package/dist/martyrs/src/components/FieldPhone/FieldPhone.vue.js.map +1 -1
- package/dist/martyrs/src/components/FieldTags/BlockTags.vue.js +1 -1
- package/dist/martyrs/src/components/FieldTags/BlockTags.vue.js.map +1 -1
- package/dist/martyrs/src/components/Loader/{Loader.vue.js → Loader.vue2.js} +3 -3
- package/dist/martyrs/src/components/Loader/Loader.vue2.js.map +1 -0
- package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue.js +1 -1
- package/dist/martyrs/src/components/Media/Media.vue.js +1 -1
- package/dist/martyrs/src/components/Menu/{Menu.vue.js → Menu.vue2.js} +2 -2
- package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Menu/MenuItem.vue.js +2 -2
- package/dist/martyrs/src/components/Menu/MenuItem.vue.js.map +1 -1
- package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js +2 -2
- package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js.map +1 -1
- package/dist/martyrs/src/components/Radio/Radio.vue.js +1 -1
- package/dist/martyrs/src/components/Radio/Radio.vue.js.map +1 -1
- package/dist/martyrs/src/components/Select/Select.vue.js +2 -2
- package/dist/martyrs/src/components/Select/Select.vue.js.map +1 -1
- package/dist/martyrs/src/components/SelectMulti/{SelectMulti.vue2.js → SelectMulti.vue.js} +2 -2
- package/dist/martyrs/src/components/SelectMulti/SelectMulti.vue.js.map +1 -0
- package/dist/martyrs/src/components/Table/Table.vue.js +3 -3
- package/dist/martyrs/src/components/Table/Table.vue.js.map +1 -1
- package/dist/martyrs/src/components/Text/Text.vue.js +1 -1
- package/dist/martyrs/src/components/Text/Text.vue.js.map +1 -1
- package/dist/martyrs/src/components/Tooltip/{Tooltip.vue.js → Tooltip.vue2.js} +2 -2
- package/dist/martyrs/src/components/Tooltip/Tooltip.vue2.js.map +1 -0
- package/dist/martyrs/src/components/UploadImage/UploadImage.vue.js +4 -4
- package/dist/martyrs/src/components/UploadImage/UploadImage.vue.js.map +1 -1
- package/dist/martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue.js +4 -4
- package/dist/martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/blocks/CardUser.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/blocks/ProfileCard.vue.js +4 -4
- package/dist/martyrs/src/modules/auth/views/components/blocks/ProfileCard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +7 -7
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js.map +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/ResetPassword.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +3 -3
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js.map +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/SignUp.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/UserDashboard.vue.js +3 -3
- package/dist/martyrs/src/modules/auth/views/components/pages/UserDashboard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/FeaturedUsers.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/FeaturedUsers.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +7 -7
- package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/store/auth.js +1 -1
- package/dist/martyrs/src/modules/backoffice/components/pages/Dashboard.vue.js +4 -4
- package/dist/martyrs/src/modules/backoffice/components/pages/Dashboard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js +6 -6
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js.map +1 -1
- package/dist/martyrs/src/modules/chats/components/blocks/ChatMessage.vue.js +1 -1
- package/dist/martyrs/src/modules/chats/components/blocks/ChatMessage.vue.js.map +1 -1
- package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.js +2 -2
- package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/blocks/Activity.vue.js +7 -7
- package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/blocks/FooterBlogpost.vue.js +4 -4
- package/dist/martyrs/src/modules/community/components/blocks/FooterBlogpost.vue.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js +10 -10
- 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/community/components/pages/CreateBlogPost.vue.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/pages/Posts.vue.js +2 -2
- package/dist/martyrs/src/modules/community/components/pages/Posts.vue.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/sections/Comment.vue.js +3 -3
- package/dist/martyrs/src/modules/community/components/sections/Comment.vue.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/sections/Comments.vue.js +1 -1
- package/dist/martyrs/src/modules/constructor/components/elements/Audio.vue.js +1 -1
- package/dist/martyrs/src/modules/constructor/components/elements/Audio.vue.js.map +1 -1
- package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.js +1 -1
- package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.js.map +1 -1
- package/dist/martyrs/src/modules/constructor/components/elements/Textarea.vue2.js +1 -1
- package/dist/martyrs/src/modules/constructor/components/elements/Textarea.vue2.js.map +1 -1
- package/dist/martyrs/src/modules/constructor/components/elements/Video.vue.js +1 -1
- package/dist/martyrs/src/modules/constructor/components/elements/Video.vue.js.map +1 -1
- package/dist/martyrs/src/modules/constructor/components/sections/Constructor.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/classes/core.app.js +2 -1
- package/dist/martyrs/src/modules/core/views/classes/core.app.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/BlockSorting.vue.js +2 -2
- package/dist/martyrs/src/modules/core/views/components/blocks/BlockSorting.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js +9 -9
- package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/HelpCard.vue.js +2 -2
- package/dist/martyrs/src/modules/core/views/components/blocks/HelpCard.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/PopupAuth.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/PopupDateSelector.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/elements/ButtonDate.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/elements/ButtonDate.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/elements/PhotoStack.vue.js +3 -3
- package/dist/martyrs/src/modules/core/views/components/layouts/App.vue.js +25 -5
- package/dist/martyrs/src/modules/core/views/components/layouts/App.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js +4 -4
- package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/BottomNavigationBar.vue.js +11 -11
- package/dist/martyrs/src/modules/core/views/components/partials/BottomNavigationBar.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/CitySelection.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/CitySelection.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Footer.vue.js +16 -16
- package/dist/martyrs/src/modules/core/views/components/partials/Footer.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js +7 -7
- package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/LocationSelection.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/LocationSelection.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Navigation.vue.js +23 -23
- package/dist/martyrs/src/modules/core/views/components/partials/Navigation.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/NavigationBar.vue.js +3 -3
- package/dist/martyrs/src/modules/core/views/components/partials/NavigationBar.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Sidebar.vue.js +7 -7
- 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} +2 -2
- 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 +2 -2
- package/dist/martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/Walkthrough.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/filters/FilterCheckbox.vue2.js +2 -2
- package/dist/martyrs/src/modules/core/views/components/sections/filters/FilterCheckbox.vue2.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/filters/FilterDateRange.vue2.js +3 -3
- package/dist/martyrs/src/modules/core/views/components/sections/filters/FilterDateRange.vue2.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/filters/FilterRange.vue.js +2 -2
- package/dist/martyrs/src/modules/core/views/components/sections/filters/FilterRange.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/store/core.store.js +29 -47
- package/dist/martyrs/src/modules/core/views/store/core.store.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/utils/vue-app-renderer.js +21 -2
- package/dist/martyrs/src/modules/core/views/utils/vue-app-renderer.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/blocks/CardEvent.vue.js +5 -5
- package/dist/martyrs/src/modules/events/components/blocks/CardEvent.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/blocks/CardEventShort.vue.js +3 -3
- package/dist/martyrs/src/modules/events/components/blocks/CardEventShort.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +4 -4
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +18 -18
- 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 +7 -7
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.js +2 -2
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.js +2 -2
- package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/sections/EditTickets.vue.js +5 -5
- package/dist/martyrs/src/modules/events/components/sections/EditTickets.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/sections/EventsHot.vue.js +2 -2
- package/dist/martyrs/src/modules/events/components/sections/EventsHot.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/sections/Feed.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/sections/List.vue.js +2 -2
- package/dist/martyrs/src/modules/events/components/sections/List.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/sections/SelectDate.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/sections/SelectDate.vue.js.map +1 -1
- package/dist/martyrs/src/modules/gallery/components/pages/Gallery.vue.js +1 -1
- package/dist/martyrs/src/modules/gallery/components/pages/Gallery.vue.js.map +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +3 -3
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js.map +1 -1
- package/dist/martyrs/src/modules/icons/components/IconSearchPopup.vue.js +4 -4
- package/dist/martyrs/src/modules/icons/components/IconSearchPopup.vue.js.map +1 -1
- package/dist/martyrs/src/modules/icons/navigation/IconSort.vue.js +4 -4
- package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js +7 -7
- package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +3 -3
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.js +2 -2
- package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.js +10 -10
- 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 +5 -5
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/landing/components/sections/SectionEarn.vue.js +5 -5
- package/dist/martyrs/src/modules/landing/components/sections/SectionEarn.vue.js.map +1 -1
- package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.js +2 -2
- package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.js.map +1 -1
- package/dist/martyrs/src/modules/landing/components/sections/SectionHeroToken.vue.js +1 -1
- package/dist/martyrs/src/modules/landing/components/sections/SectionHeroToken.vue.js.map +1 -1
- package/dist/martyrs/src/modules/landing/components/sections/SectionJoinUs.vue.js +2 -2
- package/dist/martyrs/src/modules/landing/components/sections/SectionJoinUs.vue.js.map +1 -1
- package/dist/martyrs/src/modules/landing/components/sections/SectionMobileApp.vue.js +3 -3
- package/dist/martyrs/src/modules/landing/components/sections/SectionMobileApp.vue.js.map +1 -1
- package/dist/martyrs/src/modules/landing/components/sections/SectionOverview.vue.js +2 -2
- package/dist/martyrs/src/modules/landing/components/sections/SectionOverview.vue.js.map +1 -1
- package/dist/martyrs/src/modules/landing/components/sections/SectionRoadmap.vue.js +3 -3
- package/dist/martyrs/src/modules/landing/components/sections/SectionRoadmap.vue.js.map +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/pages/Marketplace.vue.js +6 -6
- package/dist/martyrs/src/modules/marketplace/views/components/pages/Marketplace.vue.js.map +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.js +4 -4
- package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/blocks/ActionButtons.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/blocks/ActionButtons.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +5 -5
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js +4 -4
- package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js +3 -3
- package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +5 -5
- package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +5 -5
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +8 -8
- package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +5 -5
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +7 -7
- package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +13 -13
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +23 -23
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +8 -8
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js +10 -13
- package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +9 -9
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +26 -26
- 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 +17 -17
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +26 -26
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js.map +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 +8 -8
- package/dist/martyrs/src/modules/music/components/player/FullscreenPlayer.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/music.client.js +6 -6
- package/dist/martyrs/src/modules/music/music.client.js.map +1 -1
- package/dist/martyrs/src/modules/notifications/components/blocks/NotificationItem.vue.js +2 -2
- package/dist/martyrs/src/modules/notifications/components/blocks/NotificationItem.vue.js.map +1 -1
- package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js +1 -1
- package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js.map +1 -1
- package/dist/martyrs/src/modules/notifications/notifications.client.js +2 -2
- package/dist/martyrs/src/modules/notifications/store/notifications.store.js +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardApplication.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/blocks/CardCustomer.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrder.vue.js +9 -9
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrder.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.js +5 -5
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderItem.vue.js +9 -9
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderItem.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.js +5 -5
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/StatusHistory.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/blocks/StatusHistory.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/elements/FieldSubscribeNewsletter.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/elements/FieldSubscribeNewsletter.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/elements/PriceTotal.vue.js +3 -3
- package/dist/martyrs/src/modules/orders/components/elements/PriceTotal.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/FormApplicationDetails.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +3 -3
- package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +17 -17
- 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 +2 -2
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +4 -4
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/partials/ShopCart.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/partials/ShopCart.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.js +3 -3
- package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/AskToLogin.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/AskToLogin.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.js +3 -3
- package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/sections/Succes.vue.js +3 -3
- package/dist/martyrs/src/modules/orders/store/shopcart.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +3 -3
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/Contacts.vue.js +8 -8
- package/dist/martyrs/src/modules/organizations/components/blocks/Contacts.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/Rating.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js +3 -3
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +6 -6
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +4 -4
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js.map +1 -1
- 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 +3 -3
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js.map +1 -1
- package/dist/martyrs/src/modules/pages/views/components/pages/Page.vue.js +5 -5
- package/dist/martyrs/src/modules/pages/views/components/pages/Page.vue.js.map +1 -1
- package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/CardCategory.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/CardCategory.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/CardPosition.vue.js +4 -4
- package/dist/martyrs/src/modules/products/components/blocks/CardPosition.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/CardProduct.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/blocks/CardProduct.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/ProductDiscounts.vue.js +5 -5
- package/dist/martyrs/src/modules/products/components/blocks/ProductDiscounts.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/ProductImages.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/blocks/ProductImages.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/ProductVariants.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/blocks/ProductVariants.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/elements/Image360.vue.js +5 -5
- package/dist/martyrs/src/modules/products/components/elements/Image360.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/elements/Price.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/elements/Price.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/elements/QuantitySelector.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/elements/QuantitySelector.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/elements/THC.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +7 -7
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +8 -8
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +12 -12
- 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 +4 -4
- package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +6 -6
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditRecommended.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditRecommended.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +9 -9
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/FilterProducts.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/sections/FilterProducts.vue.js.map +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 +2 -2
- package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +6 -6
- package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/blocks/CardRent.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/blocks/CardRent.vue.js.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/DateLabel.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.js +2 -2
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.js.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.js +8 -8
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.js.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttHeaderCell.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttHeaderCell.vue.js.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +6 -6
- package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/reports/components/pages/BackofficeReports.vue.js +3 -3
- package/dist/martyrs/src/modules/reports/components/pages/BackofficeReports.vue.js.map +1 -1
- package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +1 -1
- package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js.map +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.js +5 -5
- package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.js.map +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +2 -2
- package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js.map +1 -1
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +2 -2
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js.map +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Spot.vue.js +6 -6
- package/dist/martyrs/src/modules/spots/components/pages/Spot.vue.js.map +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js +3 -3
- 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 +5 -5
- package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CardBalanceReplenished.vue.js +5 -5
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CardBalanceReplenished.vue.js.map +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.js +5 -5
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CashDeposit.vue.js +2 -2
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CashDeposit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +4 -4
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDepositProcessing.vue.js +12 -12
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDepositProcessing.vue.js.map +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/elements/ConnectMetamask.vue.js +4 -4
- package/dist/martyrs/src/modules/wallet/views/components/elements/ConnectMetamask.vue.js.map +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +23 -23
- 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/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js +1 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js +1 -1
- package/dist/style.css +194 -202
- package/dist/{web-CH5wzMHy.js → web-BqTV9va1.js} +1 -1
- package/package.json +6 -8
- package/src/builder/modes/ssr.prod.js +1 -0
- package/src/builder/modes/ssr.rspack.dev.js +13 -6
- package/src/builder/rspack/rspack.config.base.js +7 -0
- package/src/builder/rspack/rspack.config.ssr.client.js +19 -44
- package/src/builder/templates/page.js +21 -0
- package/src/components/Block/Block.vue +1 -1
- package/src/components/BottomSheet/BottomSheet.vue +1 -1
- package/src/components/Calendar/Calendar.vue +5 -5
- package/src/components/Checkbox/Checkbox.vue +2 -2
- package/src/components/Chips/Chips.vue +2 -2
- package/src/components/Completion/Completion.vue +2 -2
- package/src/components/Countdown/Countdown.vue +5 -5
- package/src/components/DatePicker/DatePicker.vue +4 -4
- package/src/components/EditImages/EditImages.vue +1 -1
- package/src/components/Feed/Feed.old.vue +1 -1
- package/src/components/Feed/Feed.vue +1 -1
- package/src/components/FieldBig/FieldBig.vue +2 -2
- package/src/components/FieldPhone/FieldPhone.vue +1 -1
- package/src/components/FieldTags/BlockTags.vue +1 -1
- package/src/components/Loader/Loader.vue +1 -1
- package/src/components/Menu/MenuItem.vue +2 -2
- package/src/components/PhotoViewer/PhotoViewer.vue +1 -1
- package/src/components/Radio/Radio.vue +1 -1
- package/src/components/Select/Select.vue +1 -1
- package/src/components/Table/Table.vue +2 -2
- package/src/components/Text/Text.vue +1 -1
- package/src/components/UploadImage/UploadImage.vue +2 -2
- package/src/components/UploadImageMultiple/UploadImageMultiple.vue +3 -3
- package/src/configurator/components/layouts/layoutConfigurator.vue +1 -1
- package/src/configurator/components/pages/Styles.vue +2 -2
- package/src/jit/.claude/settings.local.json +10 -0
- package/src/jit/CLAUDE.md +387 -0
- package/src/jit/core.js +274 -0
- package/src/jit/extractor.js +140 -0
- package/src/jit/index.js +19 -0
- package/src/jit/loader.js +46 -0
- package/src/jit/plugin.js +209 -0
- package/src/jit/rules.js +474 -0
- package/src/jit/variants.js +128 -0
- package/src/modules/auth/views/components/blocks/CardUser.vue +2 -2
- package/src/modules/auth/views/components/blocks/ProfileCard.vue +4 -4
- package/src/modules/auth/views/components/layouts/Auth.vue +1 -1
- package/src/modules/auth/views/components/pages/EnterPassword.vue +2 -2
- package/src/modules/auth/views/components/pages/Profile.vue +5 -5
- package/src/modules/auth/views/components/pages/ProfileBlogposts.vue +1 -1
- package/src/modules/auth/views/components/pages/ProfileEditAccount.vue +2 -2
- package/src/modules/auth/views/components/pages/ResetPassword.vue +1 -1
- package/src/modules/auth/views/components/pages/SignIn.vue +3 -3
- package/src/modules/auth/views/components/pages/SignUp.vue +1 -1
- package/src/modules/auth/views/components/pages/UserDashboard.vue +3 -3
- package/src/modules/auth/views/components/sections/FeaturedUsers.vue +1 -1
- package/src/modules/auth/views/components/sections/ProfileCompletion.vue +2 -2
- package/src/modules/auth/views/components/sections/ProfileEditCredentials.vue +7 -7
- package/src/modules/auth/views/components/sections/SliderFeatures.vue +1 -1
- package/src/modules/backoffice/components/admin/Backcalls.vue +1 -1
- package/src/modules/backoffice/components/admin/FastOrders.vue +1 -1
- package/src/modules/backoffice/components/admin/ProductEdit.vue +2 -2
- package/src/modules/backoffice/components/admin/UserEdit.vue +1 -1
- package/src/modules/backoffice/components/admin/Users.vue +2 -2
- package/src/modules/backoffice/components/pages/Dashboard.vue +4 -4
- package/src/modules/backoffice/components/partials/Sidebar.vue +5 -5
- package/src/modules/chats/components/blocks/ChatMessage.vue +1 -1
- package/src/modules/chats/components/sections/ChatWindow.vue +2 -2
- package/src/modules/community/components/blocks/Activity.vue +7 -7
- package/src/modules/community/components/blocks/CardBlogpost.vue +1 -1
- package/src/modules/community/components/blocks/FooterBlogpost.vue +4 -4
- package/src/modules/community/components/layouts/Community.vue +10 -10
- package/src/modules/community/components/pages/CreateBlogPost.vue +1 -1
- package/src/modules/community/components/pages/Posts.vue +2 -2
- package/src/modules/community/components/sections/Comment.vue +2 -2
- package/src/modules/constructor/components/elements/Audio.vue +1 -1
- package/src/modules/constructor/components/elements/Caption.vue +1 -1
- package/src/modules/constructor/components/elements/Embed.vue +1 -1
- package/src/modules/constructor/components/elements/Textarea.vue +1 -1
- package/src/modules/constructor/components/elements/Video.vue +1 -1
- package/src/modules/core/views/classes/core.app.js +2 -1
- package/src/modules/core/views/components/blocks/BlockSorting.vue +2 -2
- package/src/modules/core/views/components/blocks/CardFooter.vue +4 -4
- package/src/modules/core/views/components/blocks/CardHeader.vue +7 -7
- package/src/modules/core/views/components/blocks/HelpCard.vue +1 -1
- package/src/modules/core/views/components/blocks/PopupAuth.vue +1 -1
- package/src/modules/core/views/components/elements/ButtonDate.vue +1 -1
- package/src/modules/core/views/components/elements/PhotoStack.vue +3 -3
- package/src/modules/core/views/components/layouts/App.vue +28 -4
- package/src/modules/core/views/components/layouts/Client.vue +4 -4
- package/src/modules/core/views/components/partials/BottomNavigationBar.vue +15 -15
- package/src/modules/core/views/components/partials/CitySelection.vue +1 -1
- package/src/modules/core/views/components/partials/Footer.centered.vue +17 -17
- package/src/modules/core/views/components/partials/Footer.vue +18 -18
- package/src/modules/core/views/components/partials/Header.vue +10 -11
- package/src/modules/core/views/components/partials/LocationSelection.vue +1 -1
- package/src/modules/core/views/components/partials/Navigation.vue +20 -19
- package/src/modules/core/views/components/partials/NavigationBar.vue +3 -3
- package/src/modules/core/views/components/partials/Sidebar.vue +6 -6
- package/src/modules/core/views/components/sections/SectionPageTitle.vue +2 -2
- package/src/modules/core/views/components/sections/filters/FilterCheckbox.vue +1 -1
- package/src/modules/core/views/components/sections/filters/FilterDateRange.vue +2 -2
- package/src/modules/core/views/components/sections/filters/FilterPrice.vue +2 -2
- package/src/modules/core/views/components/sections/filters/FilterRange.vue +2 -2
- package/src/modules/core/views/store/core.store.js +36 -60
- package/src/modules/core/views/utils/vue-app-renderer.js +31 -1
- package/src/modules/events/components/blocks/CardEvent.vue +6 -6
- package/src/modules/events/components/blocks/CardEventShort.vue +3 -3
- package/src/modules/events/components/pages/EditEvent.vue +1 -1
- package/src/modules/events/components/pages/EditEventTickets.vue +18 -18
- package/src/modules/events/components/pages/Event.vue +5 -5
- package/src/modules/events/components/pages/Events.vue +2 -2
- package/src/modules/events/components/pages/EventsBackoffice.vue +2 -2
- package/src/modules/events/components/sections/EditTickets.vue +5 -5
- package/src/modules/events/components/sections/EventsHot.vue +2 -2
- package/src/modules/events/components/sections/List.vue +1 -1
- package/src/modules/events/components/sections/SelectDate.vue +1 -1
- package/src/modules/gallery/components/pages/Gallery.vue +1 -1
- package/src/modules/gallery/components/sections/BackofficeGallery.vue +1 -1
- package/src/modules/governance/reactcode/src/components/CreateInitiativeForm.tsx +14 -14
- package/src/modules/governance/reactcode/src/components/CreateMilestoneForm.tsx +13 -13
- package/src/modules/governance/reactcode/src/components/EmptyState.tsx +2 -2
- package/src/modules/governance/reactcode/src/components/InitiativeCard.tsx +1 -1
- package/src/modules/governance/reactcode/src/components/LinkedEntityCard.tsx +1 -1
- package/src/modules/governance/reactcode/src/components/MilestoneCard.tsx +2 -2
- package/src/modules/governance/reactcode/src/components/ProductRepositories.tsx +6 -6
- package/src/modules/governance/reactcode/src/components/ProductSummary.tsx +18 -18
- package/src/modules/governance/reactcode/src/components/ProductTeam.tsx +7 -7
- package/src/modules/governance/reactcode/src/components/ProposeTaskForm.tsx +9 -9
- package/src/modules/governance/reactcode/src/components/TaskAssignForm.tsx +4 -4
- package/src/modules/governance/reactcode/src/components/TaskCard.tsx +1 -1
- package/src/modules/governance/reactcode/src/components/TaskStatusBadge.tsx +1 -1
- package/src/modules/governance/reactcode/src/components/VoteForm.tsx +6 -6
- package/src/modules/governance/reactcode/src/components/VotingCard.tsx +2 -2
- package/src/modules/governance/reactcode/src/components/VotingResults.tsx +15 -15
- package/src/modules/governance/reactcode/src/pages/InitiativeDetailPage.tsx +41 -41
- package/src/modules/governance/reactcode/src/pages/InitiativeMilestonesPage.tsx +8 -8
- package/src/modules/governance/reactcode/src/pages/InitiativesListPage.tsx +6 -6
- package/src/modules/governance/reactcode/src/pages/MilestoneDetailPage.tsx +9 -9
- package/src/modules/governance/reactcode/src/pages/RoadmapPage.tsx +14 -14
- package/src/modules/governance/reactcode/src/pages/TaskDetailPage.tsx +44 -44
- package/src/modules/governance/reactcode/src/pages/VotingDetailPage.tsx +8 -8
- package/src/modules/governance/reactcode/src/pages/VotingsListPage.tsx +3 -3
- package/src/modules/governance/reactcode-2/App.tsx +28 -0
- package/src/modules/governance/reactcode-2/README.md +20 -0
- package/src/modules/governance/reactcode-2/components/Charts.tsx +58 -0
- package/src/modules/governance/reactcode-2/components/Layout.tsx +457 -0
- package/src/modules/governance/reactcode-2/components/TaskPage.tsx +325 -0
- package/src/modules/governance/reactcode-2/components/VoteBadge.tsx +27 -0
- package/src/modules/governance/reactcode-2/components/VotingsFeedPage.tsx +328 -0
- package/src/modules/governance/reactcode-2/constants.ts +154 -0
- package/src/modules/governance/reactcode-2/index.html +70 -0
- package/src/modules/governance/reactcode-2/index.tsx +15 -0
- package/src/modules/governance/reactcode-2/metadata.json +5 -0
- package/src/modules/governance/reactcode-2/package.json +23 -0
- package/src/modules/governance/reactcode-2/pnpm-lock.yaml +1410 -0
- package/src/modules/governance/reactcode-2/tsconfig.json +29 -0
- package/src/modules/governance/reactcode-2/types.ts +48 -0
- package/src/modules/governance/reactcode-2/vite.config.ts +23 -0
- package/src/modules/governance/views/components/blocks/CardInitiativeItem.vue +10 -10
- package/src/modules/governance/views/components/blocks/CardMilestoneItem.vue +15 -15
- package/src/modules/governance/views/components/blocks/CardTaskItem.vue +9 -9
- package/src/modules/governance/views/components/blocks/CardVotingItem.vue +11 -11
- package/src/modules/governance/views/components/layouts/Governance.vue +1 -1
- package/src/modules/governance/views/components/pages/Governance.vue +3 -3
- package/src/modules/governance/views/components/pages/Initiative.vue +112 -112
- package/src/modules/governance/views/components/pages/InitiativeMilestones.vue +31 -31
- package/src/modules/governance/views/components/pages/Initiatives.vue +20 -22
- package/src/modules/governance/views/components/pages/Milestone.vue +25 -25
- package/src/modules/governance/views/components/pages/Roadmap.vue +47 -47
- package/src/modules/governance/views/components/pages/Task.vue +106 -106
- package/src/modules/governance/views/components/pages/Tasks.vue +16 -16
- package/src/modules/governance/views/components/pages/Voting.vue +23 -23
- package/src/modules/governance/views/components/pages/Votings.vue +7 -7
- package/src/modules/governance/views/components/partials/EmptyState.vue +3 -3
- package/src/modules/governance/views/components/partials/LinkedEntityCard.vue +11 -11
- package/src/modules/governance/views/components/partials/TaskStatusBadge.vue +4 -4
- package/src/modules/governance/views/components/partials/VoteForm.vue +14 -14
- package/src/modules/governance/views/components/partials/VotingResults.vue +22 -22
- package/src/modules/icons/components/IconSearchPopup.vue +3 -3
- package/src/modules/icons/entities/IconCash.vue +23 -0
- package/src/modules/icons/navigation/IconSort.vue +4 -4
- package/src/modules/icons/pages/IconsPage.vue +7 -7
- package/src/modules/inventory/components/forms/AdjustmentForm.vue +3 -3
- package/src/modules/inventory/components/forms/HistoryView.vue +1 -1
- package/src/modules/inventory/components/forms/StockAlertsForm.vue +1 -1
- package/src/modules/inventory/components/pages/Inventory.vue +10 -10
- package/src/modules/inventory/components/pages/InventoryEdit.vue +6 -6
- package/src/modules/landing/components/blocks/MapBlock.vue +2 -2
- package/src/modules/landing/components/sections/Examples.vue +1 -1
- package/src/modules/landing/components/sections/InstagramSection.vue +1 -1
- package/src/modules/landing/components/sections/SectionEarn.vue +4 -4
- package/src/modules/landing/components/sections/SectionFeature.vue +1 -1
- package/src/modules/landing/components/sections/SectionFocus.vue +2 -2
- package/src/modules/landing/components/sections/SectionGuide.vue +2 -2
- package/src/modules/landing/components/sections/SectionHeroToken.vue +1 -1
- package/src/modules/landing/components/sections/SectionHeroVideo.vue +2 -2
- package/src/modules/landing/components/sections/SectionJoinUs.vue +2 -2
- package/src/modules/landing/components/sections/SectionMobileApp.vue +3 -3
- package/src/modules/landing/components/sections/SectionOverview.vue +2 -2
- package/src/modules/landing/components/sections/SectionRoadmap.vue +2 -2
- package/src/modules/marketplace/views/components/layouts/Marketplace.vue +8 -8
- package/src/modules/marketplace/views/components/pages/Marketplace.vue +5 -5
- package/src/modules/marketplace/views/components/sections/SectionMenu.vue +2 -2
- package/src/modules/music/components/SidebarMusic.vue +11 -11
- package/src/modules/music/components/blocks/ActionButtons.vue +2 -2
- package/src/modules/music/components/cards/AlbumCard.vue +4 -4
- package/src/modules/music/components/cards/ArtistCard.vue +3 -8
- package/src/modules/music/components/cards/ArtistCardSmall.vue +2 -2
- package/src/modules/music/components/cards/PlaylistCard.vue +4 -4
- package/src/modules/music/components/cards/TrackListCard.vue +5 -5
- package/src/modules/music/components/forms/AlbumForm.vue +8 -8
- package/src/modules/music/components/forms/ArtistForm.vue +4 -4
- package/src/modules/music/components/forms/PlaylistForm.vue +7 -7
- package/src/modules/music/components/forms/SearchForm.vue +1 -1
- package/src/modules/music/components/forms/TrackForm.vue +13 -13
- package/src/modules/music/components/pages/Album.vue +22 -22
- package/src/modules/music/components/pages/Artist.vue +7 -7
- package/src/modules/music/components/pages/MusicHome.vue +13 -18
- package/src/modules/music/components/pages/MusicLibrary.vue +9 -9
- package/src/modules/music/components/pages/Playlist.vue +25 -25
- package/src/modules/music/components/pages/SearchResults.vue +15 -15
- package/src/modules/music/components/pages/Track.vue +25 -25
- package/src/modules/music/components/player/FullscreenPlayer.vue +5 -5
- package/src/modules/notifications/components/blocks/NotificationItem.vue +1 -1
- package/src/modules/notifications/components/elements/NotificationBadge.vue +1 -1
- package/src/modules/orders/components/blocks/CardApplication.vue +1 -1
- package/src/modules/orders/components/blocks/CardCustomer.vue +1 -1
- package/src/modules/orders/components/blocks/CardOrder.vue +9 -9
- package/src/modules/orders/components/blocks/CardOrderBackoffice.vue +5 -5
- package/src/modules/orders/components/blocks/CardOrderItem.vue +9 -9
- package/src/modules/orders/components/blocks/CardOrderUser.vue +3 -3
- package/src/modules/orders/components/blocks/CardOrderVar1.vue +4 -4
- package/src/modules/orders/components/blocks/StatusHistory.vue +3 -3
- package/src/modules/orders/components/elements/FieldSubscribeNewsletter.vue +1 -1
- package/src/modules/orders/components/elements/PriceTotal.vue +3 -3
- package/src/modules/orders/components/forms/FormApplicationDetails.vue +2 -2
- package/src/modules/orders/components/forms/FormCustomerDetails.vue +3 -3
- package/src/modules/orders/components/pages/Favorites.vue +1 -1
- package/src/modules/orders/components/pages/OrderBackoffice.vue +15 -15
- package/src/modules/orders/components/pages/OrderCreate.vue +2 -2
- package/src/modules/orders/components/pages/OrderCreateBackoffice.vue +4 -4
- package/src/modules/orders/components/pages/Orders_refact.vue +3 -3
- package/src/modules/orders/components/partials/ShopCart.vue +2 -2
- package/src/modules/orders/components/sections/ApplicationDetails.vue +2 -2
- package/src/modules/orders/components/sections/AskToLogin.vue +1 -1
- package/src/modules/orders/components/sections/CustomerDetails.vue +2 -2
- package/src/modules/orders/components/sections/Succes.vue +4 -4
- package/src/modules/organizations/components/blocks/CardDepartment.vue +1 -1
- package/src/modules/organizations/components/blocks/CardOrganization.vue +4 -4
- package/src/modules/organizations/components/blocks/Contacts.vue +8 -8
- package/src/modules/organizations/components/blocks/Rating.vue +1 -1
- package/src/modules/organizations/components/forms/AddExistingMembersForm.vue +3 -3
- package/src/modules/organizations/components/forms/DepartmentForm.vue +1 -1
- package/src/modules/organizations/components/forms/InviteForm.vue +1 -1
- package/src/modules/organizations/components/pages/Department.vue +2 -2
- package/src/modules/organizations/components/pages/DepartmentEdit.vue +1 -1
- package/src/modules/organizations/components/pages/Members.vue +1 -1
- package/src/modules/organizations/components/pages/Organization.new.vue +8 -8
- package/src/modules/organizations/components/pages/Organization.vue +6 -6
- package/src/modules/organizations/components/pages/OrganizationDocuments.vue +2 -2
- package/src/modules/organizations/components/pages/Organizations.vue +3 -3
- package/src/modules/organizations/components/sections/Documents.vue +2 -2
- package/src/modules/organizations/components/sections/MembersAdd.vue +1 -1
- package/src/modules/organizations/components/sections/Unit.vue +1 -1
- package/src/modules/pages/views/components/blocks/CardPage.vue +2 -2
- package/src/modules/pages/views/components/pages/Page.vue +5 -5
- package/src/modules/products/components/blocks/CardCategory.vue +1 -1
- package/src/modules/products/components/blocks/CardPosition.vue +4 -4
- package/src/modules/products/components/blocks/CardProduct.vue +3 -3
- package/src/modules/products/components/blocks/ProductDiscounts.vue +3 -3
- package/src/modules/products/components/blocks/ProductImages.vue +2 -2
- package/src/modules/products/components/blocks/ProductVariants.vue +2 -2
- package/src/modules/products/components/elements/Image360.vue +2 -2
- package/src/modules/products/components/elements/Price.vue +2 -2
- package/src/modules/products/components/elements/QuantitySelector.vue +3 -3
- package/src/modules/products/components/elements/THC.vue +1 -1
- package/src/modules/products/components/forms/ReorderSettingsForm.vue +1 -1
- package/src/modules/products/components/forms/StockAuditForm.vue +2 -2
- package/src/modules/products/components/forms/StockHistoryView.vue +1 -1
- package/src/modules/products/components/pages/Categories.vue +1 -1
- package/src/modules/products/components/pages/CategoryEdit.vue +2 -2
- package/src/modules/products/components/pages/Product.vue +6 -6
- package/src/modules/products/components/pages/ProductEdit.vue +6 -6
- package/src/modules/products/components/pages/Products.vue +11 -11
- package/src/modules/products/components/sections/EditAttributes.vue +4 -4
- package/src/modules/products/components/sections/EditCategories.vue +1 -1
- package/src/modules/products/components/sections/EditDiscounts.vue +6 -6
- package/src/modules/products/components/sections/EditRecommended.vue +1 -1
- package/src/modules/products/components/sections/EditVariants.vue +8 -8
- package/src/modules/products/components/sections/FilterProducts.vue +3 -3
- package/src/modules/products/components/sections/ProductConfigurator.vue +2 -2
- package/src/modules/products/components/sections/ProductInformationSection.vue +10 -10
- package/src/modules/products/components/sections/ProductsRecommended.vue +2 -2
- package/src/modules/products/components/sections/SectionProduct.vue +7 -7
- package/src/modules/products/experiments/product-recommendation/components/HeroRecommendation.vue +3 -3
- package/src/modules/rents/views/components/blocks/CardRent.vue +1 -1
- package/src/modules/rents/views/components/pages/Gant/DateLabel.vue +1 -1
- package/src/modules/rents/views/components/pages/Gant/GanttBar.vue +2 -2
- package/src/modules/rents/views/components/pages/Gant/GanttChart.vue +8 -8
- package/src/modules/rents/views/components/pages/Gant/GanttHeaderCell.vue +1 -1
- package/src/modules/rents/views/components/pages/Rents.vue +1 -1
- package/src/modules/rents/views/components/pages/RentsEdit.vue +6 -6
- package/src/modules/reports/components/pages/BackofficeReports.vue +3 -3
- package/src/modules/reports/components/sections/FormReport.vue +1 -1
- package/src/modules/spots/components/blocks/CardSpot.vue +4 -4
- package/src/modules/spots/components/blocks/SpotMemberModify.vue +1 -1
- package/src/modules/spots/components/layouts/Spots.vue +2 -2
- package/src/modules/spots/components/pages/Spot.vue +5 -5
- package/src/modules/spots/components/pages/SpotEdit.vue +2 -2
- package/src/modules/spots/components/pages/Spots.vue +3 -3
- package/src/modules/spots/components/sections/MapSection.vue +1 -1
- package/src/modules/spots/components/sections/WorktimeEdit.vue +4 -4
- package/src/modules/wallet/views/components/blocks/CardBalanceReplenished.vue +5 -5
- package/src/modules/wallet/views/components/blocks/CardDeposit.vue +5 -5
- package/src/modules/wallet/views/components/blocks/CashDeposit.vue +2 -2
- package/src/modules/wallet/views/components/blocks/CryptoDeposit.vue +4 -4
- package/src/modules/wallet/views/components/blocks/CryptoDepositProcessing.vue +11 -11
- package/src/modules/wallet/views/components/elements/ConnectMetamask.vue +4 -4
- package/src/modules/wallet/views/components/pages/Wallet.vue +22 -22
- package/src/styles/config.scss +193 -507
- package/src/styles/layout.scss +81 -1
- package/src/styles/reset.scss +2 -0
- package/src/styles/theme.scss +1 -8
- package/dist/martyrs/dist/main-BFvlam0J.js.map +0 -1
- package/dist/martyrs/node_modules/.pnpm/@capacitor_core@7.0.1/node_modules/@capacitor/core/dist/index.js.map +0 -1
- package/dist/martyrs/src/components/EditImages/EditImages.vue.js.map +0 -1
- package/dist/martyrs/src/components/Loader/Loader.vue.js.map +0 -1
- package/dist/martyrs/src/components/Menu/Menu.vue.js.map +0 -1
- package/dist/martyrs/src/components/SelectMulti/SelectMulti.vue2.js.map +0 -1
- package/dist/martyrs/src/components/Tooltip/Tooltip.vue.js.map +0 -1
- package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue.js.map +0 -1
- package/dist/node_modules/.pnpm/@vue_server-renderer@3.5.13_vue@3.5.13_typescript@5.8.3_/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js.map +0 -1
- package/dist/node_modules/.pnpm/@vue_shared@3.5.13/node_modules/@vue/shared/dist/shared.esm-bundler.js.map +0 -1
- package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/dayjs.min.js.map +0 -1
- package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/weekOfYear.js.map +0 -1
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/native.js +0 -6
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/native.js.map +0 -1
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/rng.js +0 -15
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/rng.js.map +0 -1
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/stringify.js +0 -11
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/stringify.js.map +0 -1
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v4.js +0 -20
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v4.js.map +0 -1
- package/src/modules/LAYOUT.MD +0 -767
- package/src/modules/STYLES.MD +0 -298
- package/src/modules/inventory/inventory.router.js +0 -72
- package/src/modules/products/products.router.js +0 -299
- package/src/styles/base/all.scss +0 -233
- package/src/styles/base/backgrounds.scss +0 -70
- package/src/styles/base/borders.scss +0 -407
- package/src/styles/base/scrolling.scss +0 -137
- package/src/styles/base/shadow_transitions_hover_refactor.scss +0 -158
- package/src/styles/base/transitions.scss +0 -109
- package/src/styles/responsive.scss +0 -152
- package/src/styles/typography.scss +0 -161
- /package/dist/{node_modules/.pnpm/@vue_shared@3.5.13 → martyrs}/node_modules/@vue/shared/dist/shared.esm-bundler.js +0 -0
|
@@ -5,7 +5,7 @@ import { useGlobalMixins } from "../../../core/views/mixins/mixins.js";
|
|
|
5
5
|
import { state as state$1 } from "../../../auth/views/store/auth.js";
|
|
6
6
|
import { state, actions } from "../../store/products.js";
|
|
7
7
|
import { state as state$2, actions as actions$1 } from "../../../orders/store/shopcart.js";
|
|
8
|
-
/* empty css
|
|
8
|
+
/* empty css */
|
|
9
9
|
/* empty css */
|
|
10
10
|
/* empty css */
|
|
11
11
|
/* empty css */
|
|
@@ -45,9 +45,9 @@ const _hoisted_10 = {
|
|
|
45
45
|
key: 5,
|
|
46
46
|
class: "mn-b-small flex-nowrap flex flex-v-center"
|
|
47
47
|
};
|
|
48
|
-
const _hoisted_11 = { class: "cols-2 mn-b-medium w-100 gap-small" };
|
|
48
|
+
const _hoisted_11 = { class: "cols-2 mobile:cols-1 mn-b-medium w-100 gap-small" };
|
|
49
49
|
const _hoisted_12 = { class: "w-100 pd-small radius-small bg-light product-attributes" };
|
|
50
|
-
const _hoisted_13 = { class: "mn-b-thin
|
|
50
|
+
const _hoisted_13 = { class: "mn-b-thin fw-demi" };
|
|
51
51
|
const _hoisted_14 = { class: "mn-b-small flex-nowrap flex flex-v-center" };
|
|
52
52
|
const _hoisted_15 = { class: "h-max mn-t-big pos-relative" };
|
|
53
53
|
const _sfc_main = {
|
|
@@ -204,12 +204,12 @@ const _sfc_main = {
|
|
|
204
204
|
}, null, 8, ["product-variants", "product-id", "product-name", "discounts"])) : createCommentVNode("", true),
|
|
205
205
|
product.value.included ? (openBlock(), createElementBlock("div", _hoisted_6, [
|
|
206
206
|
createVNode(_sfc_main$3, { class: "mn-r-micro i-medium" }),
|
|
207
|
-
_cache[0] || (_cache[0] = createElementVNode("p", { class: "
|
|
207
|
+
_cache[0] || (_cache[0] = createElementVNode("p", { class: "fw-medium" }, "Included", -1))
|
|
208
208
|
])) : createCommentVNode("", true),
|
|
209
209
|
product.value.included ? (openBlock(), createElementBlock("div", _hoisted_7, [
|
|
210
210
|
createElementVNode("div", _hoisted_8, [
|
|
211
211
|
createElementVNode("p", {
|
|
212
|
-
class: "
|
|
212
|
+
class: "fw-medium",
|
|
213
213
|
style: { "white-space": "pre-line" },
|
|
214
214
|
innerHTML: product.value.included
|
|
215
215
|
}, null, 8, _hoisted_9)
|
|
@@ -217,7 +217,7 @@ const _sfc_main = {
|
|
|
217
217
|
])) : createCommentVNode("", true),
|
|
218
218
|
product.value.attributes && product.value.attributes.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_10, [
|
|
219
219
|
createVNode(_sfc_main$4, { class: "mn-r-micro i-medium" }),
|
|
220
|
-
_cache[1] || (_cache[1] = createElementVNode("p", { class: "
|
|
220
|
+
_cache[1] || (_cache[1] = createElementVNode("p", { class: "fw-medium" }, "Product Details", -1))
|
|
221
221
|
])) : createCommentVNode("", true),
|
|
222
222
|
createElementVNode("div", _hoisted_11, [
|
|
223
223
|
product.value.attributes && product.value.attributes.length > 0 ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(product.value.attributes, (attributes) => {
|
|
@@ -229,7 +229,7 @@ const _sfc_main = {
|
|
|
229
229
|
]),
|
|
230
230
|
createElementVNode("div", _hoisted_14, [
|
|
231
231
|
createVNode(_sfc_main$5, { class: "mn-r-micro i-medium" }),
|
|
232
|
-
_cache[2] || (_cache[2] = createElementVNode("p", { class: "
|
|
232
|
+
_cache[2] || (_cache[2] = createElementVNode("p", { class: "fw-medium" }, "Provided by", -1))
|
|
233
233
|
]),
|
|
234
234
|
product.value.owner ? (openBlock(), createBlock(_sfc_main$6, {
|
|
235
235
|
key: 6,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Product.vue.js","sources":["../../../../../../../src/modules/products/components/pages/Product.vue"],"sourcesContent":["<template>\n <div v-if=\"products.state.current\" class=\"w-100 mobile:pd-thin pd-small bg-white\">\n <div class=\"cols-2 mobile:cols-1 tablet:cols-1 w-100 gap-regular\">\n\n <ProductImages\n :images=\"currentImages\"\n :product=\"product\"\n />\n\n <div class=\"pos-relative w-100 h-100 flex-column flex-h-center flex\">\n <!-- Edit Button -->\n <router-link\n v-if=\"hasAccess(route.params._id, 'products', 'edit', auth.state.accesses, auth.state.access.roles)\"\n :to=\"editPath\"\n class=\"\n z-index-2\n cursor-pointer \n pos-absolute pos-t-zero pos-r-zero\n radius-extra pd-thin bg-second\n \"\n >\n <IconEdit\n class=\"i-medium\"\n classes=\"fill-white\"\n />\n </router-link>\n\n <h2 class=\"w-100 h1-product mn-b-medium\">{{ product.name }}</h2>\n\n <p v-if=\"product.description\" class=\"w-100 mn-b-medium\" style=\"white-space: pre-line;\">\n {{ product.translations?.length > 1 ? t('description') : product.description }}\n </p>\n \n <!-- Компонент выбора вариантов товара -->\n <ProductConfigurator\n v-if=\"product.variants?.length > 0\"\n :product-variants=\"product.variants\"\n :product-id=\"product._id\"\n :product-name=\"product.name\"\n :discounts=\"product.discounts\"\n :regularPrice=\"100\"\n @variant-selected=\"handleVariantSelected\"\n @add-to-cart=\"handleAddToCart\"\n @update-images=\"handleUpdateImages\"\n />\n\n <div v-if=\"product.included\" class=\"mn-b-small flex-nowrap flex flex-v-center\">\n <IconList class=\"mn-r-micro i-medium\"/>\n <p class=\"t-medium \">Included</p>\n </div>\n\n <div v-if=\"product.included\" class=\"cols-1 mn-b-medium w-100 \">\n <div\n class=\"w-100 pd-small radius-small flex flex-column gap-small bg-light\"\n >\n <p class=\"t-medium\" style=\"white-space: pre-line;\" v-html=\"product.included\"></p>\n </div>\n </div>\n\n\n <div v-if=\"product.attributes && product.attributes.length > 0\" class=\"mn-b-small flex-nowrap flex flex-v-center\">\n <IconInfo class=\"mn-r-micro i-medium\"/>\n <p class=\"t-medium \">Product Details</p>\n </div>\n\n <div class=\"cols-2 mn-b-medium w-100 gap-small\">\n <div\n v-if=\"product.attributes && product.attributes.length > 0\"\n v-for=\"attributes in product.attributes\"\n class=\"w-100 pd-small radius-small bg-light product-attributes\"\n >\n <p class=\"mn-b-thin t-demi\">{{ attributes.name }}</p>\n <p>{{ attributes.value }}</p>\n </div>\n </div>\n\n <div class=\"mn-b-small flex-nowrap flex flex-v-center\">\n <IconGroups class=\"mn-r-micro i-medium\"/>\n <p class=\"t-medium \">Provided by</p>\n </div>\n\n <CardOrganization \n v-if=\"product.owner\"\n :organization=\"product.owner.target\"\n :showRating=\"true\"\n :showFollowers=\"false\"\n :showProducts=\"false\"\n class=\"bg-light w-100 o-hidden radius-medium pd-small \"\n />\n </div>\n </div>\n \n <ProductsRecommended \n v-if=\"product.recommended.length > 0\"\n :products=\"product.recommended\"\n class=\" mn-t-big h-max pos-relative\"\n />\n\n <div class=\"h-max mn-t-big pos-relative\">\n <h3 class=\"pd-b-small\">Most Popular</h3>\n <ProductsPopular class=\"mn-r-big-negative mn-l-big-negative\"/>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { computed, ref, onMounted, getCurrentInstance } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport { useI18n } from 'vue-i18n'\nimport { useGlobalMixins } from \"@martyrs/src/modules/core/views/mixins/mixins.js\"\n\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js'\nimport { useStore } from '@martyrs/src/modules/core/views/store/core.store.js'\nimport * as products from '@martyrs/src/modules/products/store/products.js'\nimport * as categories from '@martyrs/src/modules/products/store/categories.js'\nimport * as shopcart from '@martyrs/src/modules/orders/store/shopcart.js'\n\nimport Button from '@martyrs/src/components/Button/Button.vue'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Tab from '@martyrs/src/components/Tab/Tab.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\n\nimport IconEdit from '@martyrs/src/modules/icons/navigation/IconEdit.vue'\nimport IconInfo from '@martyrs/src/modules/icons/navigation/IconInfo.vue'\n\nimport IconShopcartAdd from '@martyrs/src/modules/icons/actions/IconShopcartAdd.vue'\n\nimport IconList from '@martyrs/src/modules/icons/entities/IconList.vue';\nimport IconGroups from '@martyrs/src/modules/icons/entities/IconGroups.vue'\n\nimport ProductImages from '@martyrs/src/modules/products/components/blocks/ProductImages.vue'\nimport ProductConfigurator from '@martyrs/src/modules/products/components/sections/ProductConfigurator.vue'\nimport ProductsRecommended from '@martyrs/src/modules/products/components/sections/ProductsRecommended.vue';\nimport ProductsPopular from '@martyrs/src/modules/products/components/sections/ProductsPopular.vue'\n\nimport CardOrganization from '@martyrs/src/modules/organizations/components/blocks/CardOrganization.vue'\n\nconst route = useRoute()\nconst router = useRouter()\nconst { proxy } = getCurrentInstance()\nconst { returnCurrency, hasAccess } = useGlobalMixins()\n\nconst product = computed(() => products.state.current)\nconst productImages = computed(() => products.state.current.images || [])\n\nconst editPath = computed(() => {\n\tif (route.meta.context === 'backoffice') {\n\t\treturn `/backoffice/products/${product.value._id}/edit`\n\t}\n\tif (route.meta.context === 'organization') {\n\t\treturn `/organizations/${route.params._id}/products/${product.value._id}/edit`\n\t}\n\treturn `/products/${product.value._id}/edit`\n})\n\n// Состояние для отслеживания текущих изображений (товара или варианта)\nconst currentImages = ref([])\n// Выбранный вариант товара\nconst selectedVariant = ref(null)\n\nconst text = {\n en: { addtoorder: 'Add to Cart', fastorder: 'Fast Order', description: 'Description' },\n ru: { addtoorder: 'Добавить в корзину', fastorder: 'Быстрый заказ', description: 'Описание' }\n}\n\nconst { t } = useI18n({ messages: text })\n\nconst emits = defineEmits(['page-loading', 'page-loaded']);\n\nconst recommendation = defineProps({\n recommendation: {\n type: Boolean,\n default: false\n }\n})\n \nproducts.state.current = null\n\nonMounted(async () => {\n emits('page-loading');\n \n await products.actions.read({ _id: route.params.product, lookup: ['variants','recommended','inventory'] })\n \n // Инициализируем текущие изображения изображениями товара\n currentImages.value = [...productImages.value]\n\n if (typeof gtag === 'function') {\n gtag('event', 'view_item', {\n currency: returnCurrency(),\n value: product.value.price || 0,\n items: [{\n item_id: product.value._id,\n item_name: product.value.name,\n price: product.value.price || 0,\n item_category: product.value.category || '',\n item_brand: product.value.owner?.target?.profile.name || ''\n }]\n });\n }\n\n emits('page-loaded');\n})\n\n// Обработчик выбора варианта\nfunction handleVariantSelected(variant) {\n selectedVariant.value = variant\n}\n\n// Обработчик обновления изображений при выборе варианта\nfunction handleUpdateImages(images) {\n if (images && images.length > 0) {\n currentImages.value = [...images]\n } else {\n // Если у варианта нет изображений, возвращаем изображения товара\n currentImages.value = [...productImages.value]\n }\n}\n\n// Функция добавления товара в корзину - теперь требует выбранный вариант\nasync function handleAddToCart({variant, quantity}) {\n console.log('variant is', variant)\n console.log('quantity is', quantity)\n let selectedDates = null\n\n try {\n if (!variant) {\n throw new Error('Variant is required for adding product to cart')\n }\n\n if (!shopcart.state.organization) {\n shopcart.state.organization = product.value.owner.target._id\n }\n \n if (product.value.listing === 'rent') {\n selectedDates = await proxy.$dateSelector(\n product.value._id,\n variant._id,\n quantity,\n variant.price || product.value.price\n );\n \n if (!selectedDates) throw new Error('Date selection cancelled')\n }\n \n // Если организация товара отличается от текущей в корзине\n if (shopcart.state.organization !== product.value.owner.target._id) {\n const result = await proxy.$alert({\n title: 'Replace items in your cart?',\n message: `Your cart has items from another vendor. If you continue, we'll clear it so you can order from this one instead.`,\n actions: [\n { label: 'Cancel', value: false },\n { label: 'Replace', value: true }\n ]\n })\n\n if (!result) throw new Error('Cart replacement cancelled')\n\n shopcart.state.positions = []\n shopcart.state.organization = product.value.owner.target._id\n }\n\n if (typeof gtag === 'function') {\n gtag('event', 'add_to_cart', {\n currency: returnCurrency(),\n value: variant.price || 0,\n items: [{\n item_id: product.value._id,\n item_name: product.value.name,\n price: variant.price || product.value.price || 0,\n quantity: 1,\n item_category: product.value.category || '',\n item_brand: product.value.owner?.target?.profile?.name || ''\n }]\n });\n }\n \n await shopcart.actions.addProductToCart(product.value, variant, product.value.owner.target._id, selectedDates, quantity)\n return true\n } catch (error) {\n console.error('Error while adding product to cart:', error)\n throw error\n }\n}\n</script>"],"names":["products.state","products.actions","shopcart.state","shopcart.actions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Product.vue.js","sources":["../../../../../../../src/modules/products/components/pages/Product.vue"],"sourcesContent":["<template>\n <div v-if=\"products.state.current\" class=\"w-100 mobile:pd-thin pd-small bg-white\">\n <div class=\"cols-2 mobile:cols-1 tablet:cols-1 w-100 gap-regular\">\n\n <ProductImages\n :images=\"currentImages\"\n :product=\"product\"\n />\n\n <div class=\"pos-relative w-100 h-100 flex-column flex-h-center flex\">\n <!-- Edit Button -->\n <router-link\n v-if=\"hasAccess(route.params._id, 'products', 'edit', auth.state.accesses, auth.state.access.roles)\"\n :to=\"editPath\"\n class=\"\n z-index-2\n cursor-pointer \n pos-absolute pos-t-zero pos-r-zero\n radius-extra pd-thin bg-second\n \"\n >\n <IconEdit\n class=\"i-medium\"\n classes=\"fill-white\"\n />\n </router-link>\n\n <h2 class=\"w-100 h1-product mn-b-medium\">{{ product.name }}</h2>\n\n <p v-if=\"product.description\" class=\"w-100 mn-b-medium\" style=\"white-space: pre-line;\">\n {{ product.translations?.length > 1 ? t('description') : product.description }}\n </p>\n \n <!-- Компонент выбора вариантов товара -->\n <ProductConfigurator\n v-if=\"product.variants?.length > 0\"\n :product-variants=\"product.variants\"\n :product-id=\"product._id\"\n :product-name=\"product.name\"\n :discounts=\"product.discounts\"\n :regularPrice=\"100\"\n @variant-selected=\"handleVariantSelected\"\n @add-to-cart=\"handleAddToCart\"\n @update-images=\"handleUpdateImages\"\n />\n\n <div v-if=\"product.included\" class=\"mn-b-small flex-nowrap flex flex-v-center\">\n <IconList class=\"mn-r-micro i-medium\"/>\n <p class=\"fw-medium \">Included</p>\n </div>\n\n <div v-if=\"product.included\" class=\"cols-1 mn-b-medium w-100 \">\n <div\n class=\"w-100 pd-small radius-small flex flex-column gap-small bg-light\"\n >\n <p class=\"fw-medium\" style=\"white-space: pre-line;\" v-html=\"product.included\"></p>\n </div>\n </div>\n\n\n <div v-if=\"product.attributes && product.attributes.length > 0\" class=\"mn-b-small flex-nowrap flex flex-v-center\">\n <IconInfo class=\"mn-r-micro i-medium\"/>\n <p class=\"fw-medium \">Product Details</p>\n </div>\n\n <div class=\"cols-2 mobile:cols-1 mn-b-medium w-100 gap-small\">\n <div\n v-if=\"product.attributes && product.attributes.length > 0\"\n v-for=\"attributes in product.attributes\"\n class=\"w-100 pd-small radius-small bg-light product-attributes\"\n >\n <p class=\"mn-b-thin fw-demi\">{{ attributes.name }}</p>\n <p>{{ attributes.value }}</p>\n </div>\n </div>\n\n <div class=\"mn-b-small flex-nowrap flex flex-v-center\">\n <IconGroups class=\"mn-r-micro i-medium\"/>\n <p class=\"fw-medium \">Provided by</p>\n </div>\n\n <CardOrganization \n v-if=\"product.owner\"\n :organization=\"product.owner.target\"\n :showRating=\"true\"\n :showFollowers=\"false\"\n :showProducts=\"false\"\n class=\"bg-light w-100 o-hidden radius-medium pd-small \"\n />\n </div>\n </div>\n \n <ProductsRecommended \n v-if=\"product.recommended.length > 0\"\n :products=\"product.recommended\"\n class=\" mn-t-big h-max pos-relative\"\n />\n\n <div class=\"h-max mn-t-big pos-relative\">\n <h3 class=\"pd-b-small\">Most Popular</h3>\n <ProductsPopular class=\"mn-r-big-negative mn-l-big-negative\"/>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { computed, ref, onMounted, getCurrentInstance } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport { useI18n } from 'vue-i18n'\nimport { useGlobalMixins } from \"@martyrs/src/modules/core/views/mixins/mixins.js\"\n\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js'\nimport { useStore } from '@martyrs/src/modules/core/views/store/core.store.js'\nimport * as products from '@martyrs/src/modules/products/store/products.js'\nimport * as categories from '@martyrs/src/modules/products/store/categories.js'\nimport * as shopcart from '@martyrs/src/modules/orders/store/shopcart.js'\n\nimport Button from '@martyrs/src/components/Button/Button.vue'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Tab from '@martyrs/src/components/Tab/Tab.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\n\nimport IconEdit from '@martyrs/src/modules/icons/navigation/IconEdit.vue'\nimport IconInfo from '@martyrs/src/modules/icons/navigation/IconInfo.vue'\n\nimport IconShopcartAdd from '@martyrs/src/modules/icons/actions/IconShopcartAdd.vue'\n\nimport IconList from '@martyrs/src/modules/icons/entities/IconList.vue';\nimport IconGroups from '@martyrs/src/modules/icons/entities/IconGroups.vue'\n\nimport ProductImages from '@martyrs/src/modules/products/components/blocks/ProductImages.vue'\nimport ProductConfigurator from '@martyrs/src/modules/products/components/sections/ProductConfigurator.vue'\nimport ProductsRecommended from '@martyrs/src/modules/products/components/sections/ProductsRecommended.vue';\nimport ProductsPopular from '@martyrs/src/modules/products/components/sections/ProductsPopular.vue'\n\nimport CardOrganization from '@martyrs/src/modules/organizations/components/blocks/CardOrganization.vue'\n\nconst route = useRoute()\nconst router = useRouter()\nconst { proxy } = getCurrentInstance()\nconst { returnCurrency, hasAccess } = useGlobalMixins()\n\nconst product = computed(() => products.state.current)\nconst productImages = computed(() => products.state.current.images || [])\n\nconst editPath = computed(() => {\n\tif (route.meta.context === 'backoffice') {\n\t\treturn `/backoffice/products/${product.value._id}/edit`\n\t}\n\tif (route.meta.context === 'organization') {\n\t\treturn `/organizations/${route.params._id}/products/${product.value._id}/edit`\n\t}\n\treturn `/products/${product.value._id}/edit`\n})\n\n// Состояние для отслеживания текущих изображений (товара или варианта)\nconst currentImages = ref([])\n// Выбранный вариант товара\nconst selectedVariant = ref(null)\n\nconst text = {\n en: { addtoorder: 'Add to Cart', fastorder: 'Fast Order', description: 'Description' },\n ru: { addtoorder: 'Добавить в корзину', fastorder: 'Быстрый заказ', description: 'Описание' }\n}\n\nconst { t } = useI18n({ messages: text })\n\nconst emits = defineEmits(['page-loading', 'page-loaded']);\n\nconst recommendation = defineProps({\n recommendation: {\n type: Boolean,\n default: false\n }\n})\n \nproducts.state.current = null\n\nonMounted(async () => {\n emits('page-loading');\n \n await products.actions.read({ _id: route.params.product, lookup: ['variants','recommended','inventory'] })\n \n // Инициализируем текущие изображения изображениями товара\n currentImages.value = [...productImages.value]\n\n if (typeof gtag === 'function') {\n gtag('event', 'view_item', {\n currency: returnCurrency(),\n value: product.value.price || 0,\n items: [{\n item_id: product.value._id,\n item_name: product.value.name,\n price: product.value.price || 0,\n item_category: product.value.category || '',\n item_brand: product.value.owner?.target?.profile.name || ''\n }]\n });\n }\n\n emits('page-loaded');\n})\n\n// Обработчик выбора варианта\nfunction handleVariantSelected(variant) {\n selectedVariant.value = variant\n}\n\n// Обработчик обновления изображений при выборе варианта\nfunction handleUpdateImages(images) {\n if (images && images.length > 0) {\n currentImages.value = [...images]\n } else {\n // Если у варианта нет изображений, возвращаем изображения товара\n currentImages.value = [...productImages.value]\n }\n}\n\n// Функция добавления товара в корзину - теперь требует выбранный вариант\nasync function handleAddToCart({variant, quantity}) {\n console.log('variant is', variant)\n console.log('quantity is', quantity)\n let selectedDates = null\n\n try {\n if (!variant) {\n throw new Error('Variant is required for adding product to cart')\n }\n\n if (!shopcart.state.organization) {\n shopcart.state.organization = product.value.owner.target._id\n }\n \n if (product.value.listing === 'rent') {\n selectedDates = await proxy.$dateSelector(\n product.value._id,\n variant._id,\n quantity,\n variant.price || product.value.price\n );\n \n if (!selectedDates) throw new Error('Date selection cancelled')\n }\n \n // Если организация товара отличается от текущей в корзине\n if (shopcart.state.organization !== product.value.owner.target._id) {\n const result = await proxy.$alert({\n title: 'Replace items in your cart?',\n message: `Your cart has items from another vendor. If you continue, we'll clear it so you can order from this one instead.`,\n actions: [\n { label: 'Cancel', value: false },\n { label: 'Replace', value: true }\n ]\n })\n\n if (!result) throw new Error('Cart replacement cancelled')\n\n shopcart.state.positions = []\n shopcart.state.organization = product.value.owner.target._id\n }\n\n if (typeof gtag === 'function') {\n gtag('event', 'add_to_cart', {\n currency: returnCurrency(),\n value: variant.price || 0,\n items: [{\n item_id: product.value._id,\n item_name: product.value.name,\n price: variant.price || product.value.price || 0,\n quantity: 1,\n item_category: product.value.category || '',\n item_brand: product.value.owner?.target?.profile?.name || ''\n }]\n });\n }\n \n await shopcart.actions.addProductToCart(product.value, variant, product.value.owner.target._id, selectedDates, quantity)\n return true\n } catch (error) {\n console.error('Error while adding product to cart:', error)\n throw error\n }\n}\n</script>"],"names":["products.state","products.actions","shopcart.state","shopcart.actions"],"mappings":"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"}
|
|
@@ -5,14 +5,14 @@ import _sfc_main$3 from "../../../../components/Tab/Tab.vue2.js";
|
|
|
5
5
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
6
6
|
import Select from "../../../../components/Select/Select.vue.js";
|
|
7
7
|
import _sfc_main$2 from "../../../../components/Button/Button.vue2.js";
|
|
8
|
-
import _sfc_main$4 from "../../../../components/EditImages/EditImages.
|
|
8
|
+
import _sfc_main$4 from "../../../../components/EditImages/EditImages.vue2.js";
|
|
9
9
|
import BlockMultiselect from "../../../core/views/components/blocks/BlockMultiselect.vue.js";
|
|
10
10
|
import _sfc_main$5 from "../../../icons/navigation/IconCross.vue.js";
|
|
11
11
|
import _sfc_main$a from "../../../icons/navigation/IconDelete.vue.js";
|
|
12
12
|
import _sfc_main$7 from "../sections/EditVariants.vue.js";
|
|
13
13
|
import _sfc_main$6 from "../sections/EditAttributes.vue.js";
|
|
14
14
|
import _sfc_main$8 from "../sections/EditDiscounts.vue.js";
|
|
15
|
-
/* empty css
|
|
15
|
+
/* empty css */
|
|
16
16
|
import _sfc_main$9 from "../sections/EditRecommended.vue.js";
|
|
17
17
|
import { useStore, setError } from "../../../core/views/store/core.store.js";
|
|
18
18
|
import { state as state$2 } from "../../../auth/views/store/auth.js";
|
|
@@ -22,25 +22,25 @@ const _hoisted_1 = {
|
|
|
22
22
|
key: 0,
|
|
23
23
|
class: "w-100 bg-white pd-thin gap-thin"
|
|
24
24
|
};
|
|
25
|
-
const _hoisted_2 = { class: "
|
|
25
|
+
const _hoisted_2 = { class: "truncate mn-r-auto" };
|
|
26
26
|
const _hoisted_3 = {
|
|
27
27
|
key: 2,
|
|
28
28
|
class: "cols-1 gap-thin"
|
|
29
29
|
};
|
|
30
30
|
const _hoisted_4 = { class: "flex-nowrap flex-v-center flex gap-thin" };
|
|
31
|
-
const _hoisted_5 = { class: "
|
|
31
|
+
const _hoisted_5 = { class: "fw-medium" };
|
|
32
32
|
const _hoisted_6 = ["onClick"];
|
|
33
33
|
const _hoisted_7 = { class: "flex-nowrap flex-v-center flex" };
|
|
34
34
|
const _hoisted_8 = ["src"];
|
|
35
35
|
const _hoisted_9 = { class: "w-100" };
|
|
36
|
-
const _hoisted_10 = { class: "
|
|
36
|
+
const _hoisted_10 = { class: "fw-medium" };
|
|
37
37
|
const _hoisted_11 = {
|
|
38
38
|
key: 0,
|
|
39
39
|
class: "t-small t-transp"
|
|
40
40
|
};
|
|
41
41
|
const _hoisted_12 = { class: "mn-b-thin flex-nowrap flex gap-thin" };
|
|
42
42
|
const _hoisted_13 = { class: "flex gap-thin mn-b-thin" };
|
|
43
|
-
const _hoisted_14 = { class: "radius-small pd-small flex-center flex aspect-1x1 bg-red cursor-pointer hover
|
|
43
|
+
const _hoisted_14 = { class: "radius-small pd-small flex-center flex aspect-1x1 bg-red cursor-pointer hover:scale-[1.05]" };
|
|
44
44
|
const _hoisted_15 = { class: "flex-nowrap flex gap-thin" };
|
|
45
45
|
const _sfc_main = {
|
|
46
46
|
__name: "ProductEdit",
|
|
@@ -223,7 +223,7 @@ const _sfc_main = {
|
|
|
223
223
|
classSearch: "bg-white radius-small",
|
|
224
224
|
classSelected: "bg-white pd-small radius-small",
|
|
225
225
|
classDropdown: "bg-white pd-small radius-medium bs-small",
|
|
226
|
-
classItem: "pd-small radius-small hover
|
|
226
|
+
classItem: "pd-small radius-small hover:bg-light cursor-pointer",
|
|
227
227
|
classFeed: "h-max-30r gap-thin flex-column flex o-scroll"
|
|
228
228
|
}, {
|
|
229
229
|
selected: withCtx(({ item, clear }) => [
|
|
@@ -231,7 +231,7 @@ const _sfc_main = {
|
|
|
231
231
|
createElementVNode("span", _hoisted_5, toDisplayString(item?.name || item), 1),
|
|
232
232
|
createElementVNode("button", {
|
|
233
233
|
onClick: withModifiers(clear, ["stop"]),
|
|
234
|
-
class: "i-small pd-micro bg-red radius-extra flex-center flex aspect-1x1 hover
|
|
234
|
+
class: "i-small pd-micro bg-red radius-extra flex-center flex aspect-1x1 hover:scale-[1.05]"
|
|
235
235
|
}, [
|
|
236
236
|
createVNode(_sfc_main$5, { class: "i-micro fill-white" })
|
|
237
237
|
], 8, _hoisted_6)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductEdit.vue.js","sources":["../../../../../../../src/modules/products/components/pages/ProductEdit.vue"],"sourcesContent":["<template>\n <div v-if=\"isPageLoaded\" class=\"w-100 bg-white pd-thin gap-thin\">\n \n <Block v-if=\"!MOBILE_APP\" class=\"flex-nowrap mn-b-thin gap-thin flex-v-center flex\">\n <h2 class=\"t-truncate mn-r-auto\">\n {{ route.params.product ? products.state.current.name : 'Create Product' }}\n </h2>\n\n <Button \n v-if=\"route.params.product\"\n :submit=\"onDelete\" \n :callback=\"redirectTo\"\n class=\"w-10 w-max-20r w-min-8r bg-red\"\n >\n Delete \n </Button>\n\n <Button \n :submit=\"onSubmit\" \n :callback=\"redirectTo\"\n class=\"w-10 w-max-20r w-min-8r bg-main\"\n >\n Save\n </Button>\n </Block>\n\n <!-- Tab Navigation -->\n <Tab\n v-model:selected=\"activeTab\"\n v-if=\"route.params.product\"\n :tabs=\"[\n { label: 'Details', value: 'details' },\n { label: 'Variants', value: 'variants' },\n { label: 'Discounts', value: 'discounts' },\n { label: 'Recommended', value: 'recommended' },\n { label: 'Localization', value: 'localization' }\n ]\"\n class=\"flex-child-default gap-micro scroll-hide bg-light radius-medium h-max pd-thin mn-b-thin o-x-scroll\"\n classTab=\"bg-white\"\n />\n\n <!-- Tab Content -->\n <div v-if=\"activeTab === 'details'\" class=\"cols-1 gap-thin\">\n <!-- Product Images -->\n <Block\n placeholder=\"The product doesn't have any images yet.\"\n class=\"h-min\"\n >\n <EditImages \n :images=\"products.state.current.images\"\n :uploadPath=\"'photos'\" \n @update:images=\"(imagesNew) => { products.state.current.images = imagesNew }\" \n />\n </Block>\n\n <Block title=\"Categories\">\n <BlockMultiselect\n v-model=\"products.state.current.category\"\n placeholder=\"Search categories...\"\n :multiple=\"true\"\n :transform=\"(item) => ({ _id: item._id, name: item.name })\"\n :store=\"{\n read: (options) => categories.actions.read(options),\n state: categories.state\n }\"\n :options=\"{\n rootOnly: false,\n excludeChildren: false,\n limit: 50\n }\"\n :skeleton=\"{\n hide: false,\n horizontal: true,\n class: 'radius-small',\n structure: [{ \n block: 'text', size: 'large'\n }]\n }\"\n :states=\"{\n empty: {\n title: 'No categories found',\n description: 'Try different search terms or create a new category',\n class: 'radius-small'\n }\n }\"\n key=\"_id\"\n :label=\"item => item.name\"\n classSearch=\"bg-white radius-small\"\n classSelected=\"bg-white pd-small radius-small\"\n classDropdown=\"bg-white pd-small radius-medium bs-small\"\n classItem=\"pd-small radius-small hover-bg-light cursor-pointer\"\n classFeed=\"h-max-30r gap-thin flex-column flex o-scroll\"\n >\n <!-- Слот для выбранных категорий -->\n <template #selected=\"{ item, clear }\">\n <div class=\"flex-nowrap flex-v-center flex gap-thin\">\n <span class=\"t-medium\">{{ item?.name || item }}</span>\n <button \n @click.stop=\"clear\"\n class=\"i-small pd-micro bg-red radius-extra flex-center flex aspect-1x1 hover-scale-1\"\n >\n <IconCross class=\"i-micro fill-white\" />\n </button>\n </div>\n </template>\n \n <!-- Слот для элементов в списке -->\n <template #item=\"{ item }\">\n <div class=\"flex-nowrap flex-v-center flex\">\n <img \n v-if=\"item.photo\" \n :src=\"(FILE_SERVER_URL || '') + item.photo\"\n class=\"i-medium radius-small object-fit-cover mn-r-thin\"\n />\n <div class=\"w-100\">\n <p class=\"t-medium\">{{ item.name }}</p>\n <p v-if=\"item.description\" class=\"t-small t-transp\">{{ item.description }}</p>\n </div>\n </div>\n </template>\n </BlockMultiselect>\n </Block>\n\n <!-- Product Profile -->\n <Block title=\"Profile\">\n <div class=\"mn-b-thin flex-nowrap flex gap-thin\">\n <Select \n v-model:select=\"products.state.current.status\"\n label=\"Status\"\n :options=\"[\n 'draft', \n 'published',\n 'featured',\n 'archived',\n 'removed'\n ]\"\n placeholder=\"Display product\"\n class=\"pos-relative w-100 bg-white radius-small pd-medium\"\n />\n <Select \n v-model:select=\"products.state.current.listing\"\n label=\"Type\"\n :options=\"[\n 'sale', \n 'rent',\n ]\"\n placeholder=\"Type of listing\"\n class=\"pos-relative w-100 bg-white radius-small pd-medium\"\n />\n </div>\n\n <Field \n v-model:field=\"products.state.current.name\" \n placeholder=\"Enter product name\"\n class=\"w-100 mn-b-thin bg-white radius-small pd-medium\"\n />\n <Field\n v-model:field=\"products.state.current.description\" \n placeholder=\"Enter product description\" \n class=\"w-100 bg-white radius-small mn-b-thin pd-medium\"\n style=\"resize: vertical\"\n type=\"textarea\"\n />\n <Field\n v-model:field=\"products.state.current.included\" \n placeholder=\"Enter what's inside\" \n class=\"w-100 bg-white radius-small pd-medium\"\n style=\"resize: vertical\"\n type=\"textarea\"\n />\n </Block>\n\n <!-- Price Block (only for new products) -->\n <Block v-if=\"!route.params.product\" title=\"Price\">\n <div class=\"flex gap-thin mn-b-thin\">\n <Field\n v-model:field=\"products.state.current.defaultVariant.price\"\n label=\"Price\"\n type=\"number\"\n placeholder=\"Enter price\"\n class=\"w-100 bg-white radius-small pd-medium\"\n />\n <Field\n v-model:field=\"products.state.current.defaultVariant.quantity\"\n label=\"Quantity\"\n type=\"number\"\n placeholder=\"Enter quantity\"\n class=\"w-100 bg-white radius-small pd-medium\"\n />\n <Select\n v-model:select=\"products.state.current.defaultVariant.unit\"\n label=\"Unit\"\n :options=\"['pcs', 'g', 'kg', 'ml', 'l', 'oz']\"\n placeholder=\"Select unit\"\n class=\"w-100 bg-white radius-small pd-medium\"\n />\n </div>\n </Block>\n\n <!-- Attributes -->\n <EditAttributes \n v-model:attributes=\"products.state.current.attributes\" \n />\n </div>\n\n <!-- Variants Tab -->\n <EditVariants\n\t\t\tv-if=\"activeTab === 'variants'\"\n v-model:variants=\"products.state.current.variants\" \n />\n\n <!-- Discounts Tab -->\n <EditDiscounts\n\t\t\tv-if=\"activeTab === 'discounts'\"\n v-model:discounts=\"products.state.current.discounts\"\n />\n <EditRecommended \n v-if=\"activeTab === 'recommended'\" \n v-model:recommended=\"products.state.current.recommended\"\n class=\"cols-1 gap-thin\"\n />\n\n <!-- Localization Tab -->\n <Block\n\t\t v-if=\"activeTab === 'localization'\"\n title=\"Localization\"\n placeholder=\"No localizations added yet\"\n :actions=\"[{\n label: '+',\n function: () => products.state.current.translations.push({locale: '', name: '', description: ''})\n }]\"\n >\n <div \n class=\"gap-thin mn-b-thin flex-nowrap flex\" \n v-for=\"(item, index) in products.state.current.translations\" \n :key=\"index\"\n > \n <Field\n v-model:field=\"item.locale\"\n placeholder=\"Locale (en, ru, etc.)\"\n class=\"w-30 bg-white radius-small pd-medium\"\n /> \n <Field\n v-model:field=\"item.name\"\n placeholder=\"Product name\"\n class=\"w-100 bg-white radius-small pd-medium\"\n />\n <Field\n v-model:field=\"item.description\"\n placeholder=\"Product description\"\n class=\"w-100 bg-white radius-small pd-medium\"\n />\n <div class=\"radius-small pd-small flex-center flex aspect-1x1 bg-red cursor-pointer hover-scale-1\">\n <IconDelete \n @click=\"() => products.state.current.translations.splice(index, 1)\" \n class=\"i-medium\"\n />\n </div>\n </div>\n </Block>\n\n <!-- Bottom Action Buttons -->\n <div class=\"flex-nowrap flex gap-thin\">\n <Button \n v-if=\"route.params.product\"\n :submit=\"onDelete\" \n class=\"bg-red t-white w-100\"\n >\n Delete \n </Button>\n\n <Button \n :submit=\"onSubmit\" \n class=\"w-100 bg-main\"\n >\n Save\n </Button>\n </div>\n </div>\n</template>\n\n<script setup>\n// Import libs\nimport { reactive, computed, onMounted, ref } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\n\n// Import components\nimport Block from '@martyrs/src/components/Block/Block.vue';\nimport Tab from \"@martyrs/src/components/Tab/Tab.vue\";\nimport Field from \"@martyrs/src/components/Field/Field.vue\";\nimport Select from '@martyrs/src/components/Select/Select.vue';\nimport Checkbox from \"@martyrs/src/components/Checkbox/Checkbox.vue\";\nimport Button from \"@martyrs/src/components/Button/Button.vue\";\nimport Tree from \"@martyrs/src/components/Tree/Tree.vue\";\nimport EditImages from '@martyrs/src/components/EditImages/EditImages.vue';\n\nimport BlockMultiselect from '@martyrs/src/modules/core/views/components/blocks/BlockMultiselect.vue';\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue';\nimport IconDelete from '@martyrs/src/modules/icons/navigation/IconDelete.vue';\n\nimport EditVariants from '@martyrs/src/modules/products/components/sections/EditVariants.vue';\nimport EditAttributes from '@martyrs/src/modules/products/components/sections/EditAttributes.vue';\nimport EditDiscounts from '@martyrs/src/modules/products/components/sections/EditDiscounts.vue';\nimport EditCategories from '@martyrs/src/modules/products/components/sections/EditCategories.vue';\nimport EditRecommended from '@martyrs/src/modules/products/components/sections/EditRecommended.vue';\n\n// Accessing router and store\nimport { useStore } from '@martyrs/src/modules/core/views/store/core.store.js';\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\nimport * as products from '@martyrs/src/modules/products/store/products.js';\nimport * as categories from '@martyrs/src/modules/products/store/categories.js';\n\nimport { setError } from '@martyrs/src/modules/core/views/store/core.store.js'\n\nconst route = useRoute()\nconst router = useRouter()\nconst store = useStore()\nconst emits = defineEmits(['page-loading', 'page-loaded']);\n\nlet isPageLoaded = ref(false)\nlet activeTab = ref('details')\n\nonMounted(async() => { \n emits('page-loading');\n\n products.mutations.resetProduct();\n\n if (route.params.product) {\n await products.actions.read({ _id: route.params.product, lookup: ['variants','categories','recommended'] });\n } else {\n // Убедимся, что массивы инициализированы\n if (!products.state.current.translations) {\n products.state.current.translations = []\n }\n // Убедимся, что массивы инициализированы\n if (!products.state.current.recommended) {\n products.state.current.recommended = []\n }\n if (!products.state.current.discounts) {\n products.state.current.discounts = []\n }\n // Инициализируем defaultVariant для нового продукта\n if (!products.state.current.defaultVariant) {\n products.state.current.defaultVariant = {\n price: null,\n quantity: 1,\n unit: 'pcs'\n }\n }\n\n try {\n // Data prefetching\n categories.state.all = await categories.actions.read({\n user: auth.state.user._id,\n rootOnly: true,\n excludeChildren: false,\n limit: 100\n })\n } catch (error) {\n console.error('error loading categories:', error);\n }\n\n }\n\n emits('page-loaded');\n isPageLoaded.value = true\n})\n\nasync function onSubmit() {\n try {\n if (route.params.product) {\n await products.actions.update(route.params.product, products.state.current)\n } else {\n products.state.current.owner = {\n target: route.params._id || auth.state.user._id,\n type: route.params._id ? 'organization' : 'user'\n }\n products.state.current.creator = {\n target: auth.state.user._id,\n type: 'user',\n hidden: false\n }\n \n // Передаем defaultVariant на бекенд при создании\n const productData = {\n ...products.state.current,\n defaultVariant: products.state.current.defaultVariant\n }\n \n await products.actions.create(productData)\n }\n \n redirectTo()\n } catch (error) {\n setError({ response: { data: { errorCode: \"PRODUCT_NOT_CREATED\" }} })\n console.error('Product creation error:', error)\n }\n}\n\nfunction onDelete() {\n products.actions.deleteProduct(products.state.current._id)\n}\n\nfunction redirectTo() {\n router.push({\n name: route.params._id ? 'Organization' : 'Products', \n params: route.params._id ? { _id: route.params._id } : {}\n })\n}\n</script>"],"names":["products.mutations","products.actions","products.state","categories.state","categories.actions","auth.state"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProductEdit.vue.js","sources":["../../../../../../../src/modules/products/components/pages/ProductEdit.vue"],"sourcesContent":["<template>\n <div v-if=\"isPageLoaded\" class=\"w-100 bg-white pd-thin gap-thin\">\n \n <Block v-if=\"!MOBILE_APP\" class=\"flex-nowrap mn-b-thin gap-thin flex-v-center flex\">\n <h2 class=\"truncate mn-r-auto\">\n {{ route.params.product ? products.state.current.name : 'Create Product' }}\n </h2>\n\n <Button \n v-if=\"route.params.product\"\n :submit=\"onDelete\" \n :callback=\"redirectTo\"\n class=\"w-10 w-max-20r w-min-8r bg-red\"\n >\n Delete \n </Button>\n\n <Button \n :submit=\"onSubmit\" \n :callback=\"redirectTo\"\n class=\"w-10 w-max-20r w-min-8r bg-main\"\n >\n Save\n </Button>\n </Block>\n\n <!-- Tab Navigation -->\n <Tab\n v-model:selected=\"activeTab\"\n v-if=\"route.params.product\"\n :tabs=\"[\n { label: 'Details', value: 'details' },\n { label: 'Variants', value: 'variants' },\n { label: 'Discounts', value: 'discounts' },\n { label: 'Recommended', value: 'recommended' },\n { label: 'Localization', value: 'localization' }\n ]\"\n class=\"flex-child-default gap-micro scroll-hide bg-light radius-medium h-max pd-thin mn-b-thin o-x-scroll\"\n classTab=\"bg-white\"\n />\n\n <!-- Tab Content -->\n <div v-if=\"activeTab === 'details'\" class=\"cols-1 gap-thin\">\n <!-- Product Images -->\n <Block\n placeholder=\"The product doesn't have any images yet.\"\n class=\"h-min\"\n >\n <EditImages \n :images=\"products.state.current.images\"\n :uploadPath=\"'photos'\" \n @update:images=\"(imagesNew) => { products.state.current.images = imagesNew }\" \n />\n </Block>\n\n <Block title=\"Categories\">\n <BlockMultiselect\n v-model=\"products.state.current.category\"\n placeholder=\"Search categories...\"\n :multiple=\"true\"\n :transform=\"(item) => ({ _id: item._id, name: item.name })\"\n :store=\"{\n read: (options) => categories.actions.read(options),\n state: categories.state\n }\"\n :options=\"{\n rootOnly: false,\n excludeChildren: false,\n limit: 50\n }\"\n :skeleton=\"{\n hide: false,\n horizontal: true,\n class: 'radius-small',\n structure: [{ \n block: 'text', size: 'large'\n }]\n }\"\n :states=\"{\n empty: {\n title: 'No categories found',\n description: 'Try different search terms or create a new category',\n class: 'radius-small'\n }\n }\"\n key=\"_id\"\n :label=\"item => item.name\"\n classSearch=\"bg-white radius-small\"\n classSelected=\"bg-white pd-small radius-small\"\n classDropdown=\"bg-white pd-small radius-medium bs-small\"\n classItem=\"pd-small radius-small hover:bg-light cursor-pointer\"\n classFeed=\"h-max-30r gap-thin flex-column flex o-scroll\"\n >\n <!-- Слот для выбранных категорий -->\n <template #selected=\"{ item, clear }\">\n <div class=\"flex-nowrap flex-v-center flex gap-thin\">\n <span class=\"fw-medium\">{{ item?.name || item }}</span>\n <button \n @click.stop=\"clear\"\n class=\"i-small pd-micro bg-red radius-extra flex-center flex aspect-1x1 hover:scale-[1.05]\"\n >\n <IconCross class=\"i-micro fill-white\" />\n </button>\n </div>\n </template>\n \n <!-- Слот для элементов в списке -->\n <template #item=\"{ item }\">\n <div class=\"flex-nowrap flex-v-center flex\">\n <img \n v-if=\"item.photo\" \n :src=\"(FILE_SERVER_URL || '') + item.photo\"\n class=\"i-medium radius-small object-fit-cover mn-r-thin\"\n />\n <div class=\"w-100\">\n <p class=\"fw-medium\">{{ item.name }}</p>\n <p v-if=\"item.description\" class=\"t-small t-transp\">{{ item.description }}</p>\n </div>\n </div>\n </template>\n </BlockMultiselect>\n </Block>\n\n <!-- Product Profile -->\n <Block title=\"Profile\">\n <div class=\"mn-b-thin flex-nowrap flex gap-thin\">\n <Select \n v-model:select=\"products.state.current.status\"\n label=\"Status\"\n :options=\"[\n 'draft', \n 'published',\n 'featured',\n 'archived',\n 'removed'\n ]\"\n placeholder=\"Display product\"\n class=\"pos-relative w-100 bg-white radius-small pd-medium\"\n />\n <Select \n v-model:select=\"products.state.current.listing\"\n label=\"Type\"\n :options=\"[\n 'sale', \n 'rent',\n ]\"\n placeholder=\"Type of listing\"\n class=\"pos-relative w-100 bg-white radius-small pd-medium\"\n />\n </div>\n\n <Field \n v-model:field=\"products.state.current.name\" \n placeholder=\"Enter product name\"\n class=\"w-100 mn-b-thin bg-white radius-small pd-medium\"\n />\n <Field\n v-model:field=\"products.state.current.description\" \n placeholder=\"Enter product description\" \n class=\"w-100 bg-white radius-small mn-b-thin pd-medium\"\n style=\"resize: vertical\"\n type=\"textarea\"\n />\n <Field\n v-model:field=\"products.state.current.included\" \n placeholder=\"Enter what's inside\" \n class=\"w-100 bg-white radius-small pd-medium\"\n style=\"resize: vertical\"\n type=\"textarea\"\n />\n </Block>\n\n <!-- Price Block (only for new products) -->\n <Block v-if=\"!route.params.product\" title=\"Price\">\n <div class=\"flex gap-thin mn-b-thin\">\n <Field\n v-model:field=\"products.state.current.defaultVariant.price\"\n label=\"Price\"\n type=\"number\"\n placeholder=\"Enter price\"\n class=\"w-100 bg-white radius-small pd-medium\"\n />\n <Field\n v-model:field=\"products.state.current.defaultVariant.quantity\"\n label=\"Quantity\"\n type=\"number\"\n placeholder=\"Enter quantity\"\n class=\"w-100 bg-white radius-small pd-medium\"\n />\n <Select\n v-model:select=\"products.state.current.defaultVariant.unit\"\n label=\"Unit\"\n :options=\"['pcs', 'g', 'kg', 'ml', 'l', 'oz']\"\n placeholder=\"Select unit\"\n class=\"w-100 bg-white radius-small pd-medium\"\n />\n </div>\n </Block>\n\n <!-- Attributes -->\n <EditAttributes \n v-model:attributes=\"products.state.current.attributes\" \n />\n </div>\n\n <!-- Variants Tab -->\n <EditVariants\n\t\t\tv-if=\"activeTab === 'variants'\"\n v-model:variants=\"products.state.current.variants\" \n />\n\n <!-- Discounts Tab -->\n <EditDiscounts\n\t\t\tv-if=\"activeTab === 'discounts'\"\n v-model:discounts=\"products.state.current.discounts\"\n />\n <EditRecommended \n v-if=\"activeTab === 'recommended'\" \n v-model:recommended=\"products.state.current.recommended\"\n class=\"cols-1 gap-thin\"\n />\n\n <!-- Localization Tab -->\n <Block\n\t\t v-if=\"activeTab === 'localization'\"\n title=\"Localization\"\n placeholder=\"No localizations added yet\"\n :actions=\"[{\n label: '+',\n function: () => products.state.current.translations.push({locale: '', name: '', description: ''})\n }]\"\n >\n <div \n class=\"gap-thin mn-b-thin flex-nowrap flex\" \n v-for=\"(item, index) in products.state.current.translations\" \n :key=\"index\"\n > \n <Field\n v-model:field=\"item.locale\"\n placeholder=\"Locale (en, ru, etc.)\"\n class=\"w-30 bg-white radius-small pd-medium\"\n /> \n <Field\n v-model:field=\"item.name\"\n placeholder=\"Product name\"\n class=\"w-100 bg-white radius-small pd-medium\"\n />\n <Field\n v-model:field=\"item.description\"\n placeholder=\"Product description\"\n class=\"w-100 bg-white radius-small pd-medium\"\n />\n <div class=\"radius-small pd-small flex-center flex aspect-1x1 bg-red cursor-pointer hover:scale-[1.05]\">\n <IconDelete \n @click=\"() => products.state.current.translations.splice(index, 1)\" \n class=\"i-medium\"\n />\n </div>\n </div>\n </Block>\n\n <!-- Bottom Action Buttons -->\n <div class=\"flex-nowrap flex gap-thin\">\n <Button \n v-if=\"route.params.product\"\n :submit=\"onDelete\" \n class=\"bg-red t-white w-100\"\n >\n Delete \n </Button>\n\n <Button \n :submit=\"onSubmit\" \n class=\"w-100 bg-main\"\n >\n Save\n </Button>\n </div>\n </div>\n</template>\n\n<script setup>\n// Import libs\nimport { reactive, computed, onMounted, ref } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\n\n// Import components\nimport Block from '@martyrs/src/components/Block/Block.vue';\nimport Tab from \"@martyrs/src/components/Tab/Tab.vue\";\nimport Field from \"@martyrs/src/components/Field/Field.vue\";\nimport Select from '@martyrs/src/components/Select/Select.vue';\nimport Checkbox from \"@martyrs/src/components/Checkbox/Checkbox.vue\";\nimport Button from \"@martyrs/src/components/Button/Button.vue\";\nimport Tree from \"@martyrs/src/components/Tree/Tree.vue\";\nimport EditImages from '@martyrs/src/components/EditImages/EditImages.vue';\n\nimport BlockMultiselect from '@martyrs/src/modules/core/views/components/blocks/BlockMultiselect.vue';\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue';\nimport IconDelete from '@martyrs/src/modules/icons/navigation/IconDelete.vue';\n\nimport EditVariants from '@martyrs/src/modules/products/components/sections/EditVariants.vue';\nimport EditAttributes from '@martyrs/src/modules/products/components/sections/EditAttributes.vue';\nimport EditDiscounts from '@martyrs/src/modules/products/components/sections/EditDiscounts.vue';\nimport EditCategories from '@martyrs/src/modules/products/components/sections/EditCategories.vue';\nimport EditRecommended from '@martyrs/src/modules/products/components/sections/EditRecommended.vue';\n\n// Accessing router and store\nimport { useStore } from '@martyrs/src/modules/core/views/store/core.store.js';\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\nimport * as products from '@martyrs/src/modules/products/store/products.js';\nimport * as categories from '@martyrs/src/modules/products/store/categories.js';\n\nimport { setError } from '@martyrs/src/modules/core/views/store/core.store.js'\n\nconst route = useRoute()\nconst router = useRouter()\nconst store = useStore()\nconst emits = defineEmits(['page-loading', 'page-loaded']);\n\nlet isPageLoaded = ref(false)\nlet activeTab = ref('details')\n\nonMounted(async() => { \n emits('page-loading');\n\n products.mutations.resetProduct();\n\n if (route.params.product) {\n await products.actions.read({ _id: route.params.product, lookup: ['variants','categories','recommended'] });\n } else {\n // Убедимся, что массивы инициализированы\n if (!products.state.current.translations) {\n products.state.current.translations = []\n }\n // Убедимся, что массивы инициализированы\n if (!products.state.current.recommended) {\n products.state.current.recommended = []\n }\n if (!products.state.current.discounts) {\n products.state.current.discounts = []\n }\n // Инициализируем defaultVariant для нового продукта\n if (!products.state.current.defaultVariant) {\n products.state.current.defaultVariant = {\n price: null,\n quantity: 1,\n unit: 'pcs'\n }\n }\n\n try {\n // Data prefetching\n categories.state.all = await categories.actions.read({\n user: auth.state.user._id,\n rootOnly: true,\n excludeChildren: false,\n limit: 100\n })\n } catch (error) {\n console.error('error loading categories:', error);\n }\n\n }\n\n emits('page-loaded');\n isPageLoaded.value = true\n})\n\nasync function onSubmit() {\n try {\n if (route.params.product) {\n await products.actions.update(route.params.product, products.state.current)\n } else {\n products.state.current.owner = {\n target: route.params._id || auth.state.user._id,\n type: route.params._id ? 'organization' : 'user'\n }\n products.state.current.creator = {\n target: auth.state.user._id,\n type: 'user',\n hidden: false\n }\n \n // Передаем defaultVariant на бекенд при создании\n const productData = {\n ...products.state.current,\n defaultVariant: products.state.current.defaultVariant\n }\n \n await products.actions.create(productData)\n }\n \n redirectTo()\n } catch (error) {\n setError({ response: { data: { errorCode: \"PRODUCT_NOT_CREATED\" }} })\n console.error('Product creation error:', error)\n }\n}\n\nfunction onDelete() {\n products.actions.deleteProduct(products.state.current._id)\n}\n\nfunction redirectTo() {\n router.push({\n name: route.params._id ? 'Organization' : 'Products', \n params: route.params._id ? { _id: route.params._id } : {}\n })\n}\n</script>"],"names":["products.mutations","products.actions","products.state","categories.state","categories.actions","auth.state"],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import "vue-i18n";
|
|
|
9
9
|
import { actions as actions$1 } from "../../store/categories.js";
|
|
10
10
|
/* empty css */
|
|
11
11
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
12
|
-
import Filters from "../../../core/views/components/sections/Filters.
|
|
12
|
+
import Filters from "../../../core/views/components/sections/Filters.vue2.js";
|
|
13
13
|
import Calendar from "../../../../components/Calendar/Calendar.vue2.js";
|
|
14
14
|
import _sfc_main$7 from "../../../../components/Popup/Popup.vue.js";
|
|
15
15
|
import _sfc_main$6 from "../blocks/CardProduct.vue.js";
|
|
@@ -25,8 +25,8 @@ const _hoisted_2 = {
|
|
|
25
25
|
class: "pd-medium flex-v-center flex-nowrap flex"
|
|
26
26
|
};
|
|
27
27
|
const _hoisted_3 = { class: "mn-r-medium" };
|
|
28
|
-
const _hoisted_4 = { class: "cols-
|
|
29
|
-
const _hoisted_5 = { class: "o-y-scroll br-r
|
|
28
|
+
const _hoisted_4 = { class: "cols-[1fr_3fr] mobile:cols-1 br-1px br-light z-index-3 pos-relative" };
|
|
29
|
+
const _hoisted_5 = { class: "o-y-scroll br-r-1px br-light pd-medium z-index-2 desktop-only h-100 pos-relative" };
|
|
30
30
|
const _hoisted_6 = { class: "w-100 o-y-scroll h-100" };
|
|
31
31
|
const _hoisted_7 = {
|
|
32
32
|
key: 0,
|
|
@@ -47,11 +47,11 @@ const _hoisted_19 = { class: "h-2r w-2r flex-child-auto aspect-1x1 flex-center f
|
|
|
47
47
|
const _hoisted_20 = { class: "mn-t-small" };
|
|
48
48
|
const _hoisted_21 = { class: "h-1r" };
|
|
49
49
|
const _hoisted_22 = { class: "w-100 rows-1 pd-thin pos-relative o-hidden" };
|
|
50
|
-
const _hoisted_23 = { class: "mn-b-thin mobile-only w-100 o-y-scroll scroll-hide scroll-snap-
|
|
50
|
+
const _hoisted_23 = { class: "mn-b-thin mobile-only w-100 o-y-scroll scroll-hide scroll-snap-x-mandatory scroll-pd-regular" };
|
|
51
51
|
const _hoisted_24 = { class: "gap-thin flex-nowrap flex" };
|
|
52
52
|
const _hoisted_25 = ["onClick"];
|
|
53
53
|
const _hoisted_26 = { class: "mn-b-thin mobile-only" };
|
|
54
|
-
const _hoisted_27 = { class: "cols-4 z-index-1 pos-relative w-100 rows-1 gap-thin" };
|
|
54
|
+
const _hoisted_27 = { class: "cols-4 mobile:cols-2 z-index-1 pos-relative w-100 rows-1 gap-thin" };
|
|
55
55
|
const _hoisted_28 = { class: "flex gap-small" };
|
|
56
56
|
const _sfc_main = {
|
|
57
57
|
__name: "Products",
|
|
@@ -206,7 +206,7 @@ const _sfc_main = {
|
|
|
206
206
|
onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$router.push({
|
|
207
207
|
name: unref(route).params?._id ? "Organization_ProductAdd" : "ProductAdd"
|
|
208
208
|
})),
|
|
209
|
-
class: "radius-
|
|
209
|
+
class: "radius-extra i-big hover:scale-[1.05] cursor-pointer t-white bg-second"
|
|
210
210
|
}, " + ")) : createCommentVNode("", true)
|
|
211
211
|
])) : createCommentVNode("", true),
|
|
212
212
|
createElementVNode("div", _hoisted_4, [
|
|
@@ -219,7 +219,7 @@ const _sfc_main = {
|
|
|
219
219
|
return openBlock(), createElementBlock("div", {
|
|
220
220
|
key: category._id,
|
|
221
221
|
onClick: ($event) => selectCategory(category),
|
|
222
|
-
class: "cursor-pointer hover
|
|
222
|
+
class: "cursor-pointer hover:underline mn-b-regular ease"
|
|
223
223
|
}, [
|
|
224
224
|
createTextVNode(toDisplayString(category.name) + " ", 1),
|
|
225
225
|
_cache[10] || (_cache[10] = createElementVNode("br", null, null, -1)),
|
|
@@ -241,7 +241,7 @@ const _sfc_main = {
|
|
|
241
241
|
createElementVNode("h4", _hoisted_12, toDisplayString(filter.name), 1),
|
|
242
242
|
createElementVNode("div", _hoisted_13, [
|
|
243
243
|
createVNode(IconChevronBottom, {
|
|
244
|
-
class: normalizeClass([{ "rotate-
|
|
244
|
+
class: normalizeClass([{ "rotate-180deg mn-t-micro-negative": isOpen }, "i-medium"]),
|
|
245
245
|
fill: "rgb(var(--black))"
|
|
246
246
|
}, null, 8, ["class"])
|
|
247
247
|
])
|
|
@@ -274,7 +274,7 @@ const _sfc_main = {
|
|
|
274
274
|
_cache[11] || (_cache[11] = createElementVNode("h4", { class: "w-100" }, " Price", -1)),
|
|
275
275
|
createElementVNode("div", _hoisted_16, [
|
|
276
276
|
createVNode(IconChevronBottom, {
|
|
277
|
-
class: normalizeClass([{ "rotate-
|
|
277
|
+
class: normalizeClass([{ "rotate-180deg mn-t-micro-negative": isOpen }, "i-medium"]),
|
|
278
278
|
fill: "rgb(var(--black))"
|
|
279
279
|
}, null, 8, ["class"])
|
|
280
280
|
])
|
|
@@ -311,7 +311,7 @@ const _sfc_main = {
|
|
|
311
311
|
_cache[12] || (_cache[12] = createElementVNode("h4", { class: "w-100" }, "Availability", -1)),
|
|
312
312
|
createElementVNode("div", _hoisted_19, [
|
|
313
313
|
createVNode(IconChevronBottom, {
|
|
314
|
-
class: normalizeClass([{ "rotate-
|
|
314
|
+
class: normalizeClass([{ "rotate-180deg mn-t-micro-negative": isOpen }, "i-medium"]),
|
|
315
315
|
fill: "rgb(var(--black))"
|
|
316
316
|
}, null, 8, ["class"])
|
|
317
317
|
])
|
|
@@ -324,7 +324,7 @@ const _sfc_main = {
|
|
|
324
324
|
tempSelectedDates.value = selectedFilters.value.availability;
|
|
325
325
|
showDatePickerPopup.value = true;
|
|
326
326
|
}),
|
|
327
|
-
class: normalizeClass([{ "bg-light": selectedFilters.value?.availability }, "pd-small field-wrapper radius-small bg-light cursor-pointer hover
|
|
327
|
+
class: normalizeClass([{ "bg-light": selectedFilters.value?.availability }, "pd-small field-wrapper radius-small bg-light cursor-pointer hover:bg-light ease flex-v-center flex gap-thin"])
|
|
328
328
|
}, [
|
|
329
329
|
createVNode(_sfc_main$4, { class: "i-medium" }),
|
|
330
330
|
createElementVNode("span", _hoisted_21, toDisplayString(selectedFilters.value.availability ? `${unref(formatDate)(selectedFilters.value.availability.start, { dayMonth: true, language: "en" })} - ${unref(formatDate)(selectedFilters.value.availability.end, { dayMonth: true, language: "en" })}` : "Select dates"), 1)
|
|
@@ -347,7 +347,7 @@ const _sfc_main = {
|
|
|
347
347
|
return openBlock(), createElementBlock("div", {
|
|
348
348
|
key: category._id,
|
|
349
349
|
onClick: ($event) => selectCategory(category),
|
|
350
|
-
class: "flex-child-default bg-light flex t-nowrap pd-medium radius-medium cursor-pointer hover
|
|
350
|
+
class: "flex-child-default bg-light flex t-nowrap pd-medium radius-medium cursor-pointer hover:bg-light ease"
|
|
351
351
|
}, toDisplayString(category.name), 9, _hoisted_25);
|
|
352
352
|
}), 128))
|
|
353
353
|
])
|
|
@@ -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-100 i-big hover-scale-1 cursor-pointer t-white bg-second\">\n +\n </button>\n </header>\n\n <div class=\"cols-2-1_3 br-1px br-solid br-light z-index-3 pos-relative\">\n\n <div class=\"o-y-scroll br-r br-solid 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-t-underline mn-b-regular transition-all\"\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-180 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-180 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-180 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 transition-all 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-type-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 transition-all\"\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 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 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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"}
|
|
@@ -10,8 +10,8 @@ const _hoisted_1 = {
|
|
|
10
10
|
class: "cols-1 gap-thin"
|
|
11
11
|
};
|
|
12
12
|
const _hoisted_2 = { class: "w-100" };
|
|
13
|
-
const _hoisted_3 = { class: "p-regular mn-b-thin
|
|
14
|
-
const _hoisted_4 = { class: "
|
|
13
|
+
const _hoisted_3 = { class: "p-regular mn-b-thin fw-medium d-block" };
|
|
14
|
+
const _hoisted_4 = { class: "fw-medium t-transp" };
|
|
15
15
|
const _hoisted_5 = { class: "flex gap-thin" };
|
|
16
16
|
const _hoisted_6 = ["onClick"];
|
|
17
17
|
const _hoisted_7 = ["onClick"];
|
|
@@ -93,13 +93,13 @@ const _sfc_main = {
|
|
|
93
93
|
createElementVNode("div", _hoisted_5, [
|
|
94
94
|
createElementVNode("div", {
|
|
95
95
|
onClick: () => openAttributePopup(index),
|
|
96
|
-
class: "radius-small pd-small flex-center flex aspect-1x1 bg-light cursor-pointer hover
|
|
96
|
+
class: "radius-small pd-small flex-center flex aspect-1x1 bg-light cursor-pointer hover:scale-[1.05]"
|
|
97
97
|
}, [
|
|
98
98
|
createVNode(_sfc_main$2, { class: "i-medium" })
|
|
99
99
|
], 8, _hoisted_6),
|
|
100
100
|
createElementVNode("div", {
|
|
101
101
|
onClick: () => attributes.value.splice(index, 1),
|
|
102
|
-
class: "radius-small pd-small flex-center flex aspect-1x1 bg-red cursor-pointer hover
|
|
102
|
+
class: "radius-small pd-small flex-center flex aspect-1x1 bg-red cursor-pointer hover:scale-[1.05]"
|
|
103
103
|
}, [
|
|
104
104
|
createVNode(_sfc_main$3, { class: "i-medium" })
|
|
105
105
|
], 8, _hoisted_7)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditAttributes.vue.js","sources":["../../../../../../../src/modules/products/components/sections/EditAttributes.vue"],"sourcesContent":["<template>\n <Block\n title=\"Parameters\"\n placeholder=\"No parameters added yet\"\n :actions=\"[{\n label: '+',\n function: () => openAttributePopup()\n }]\"\n >\n <div v-if=\"attributes.length > 0\" class=\"cols-1 gap-thin\">\n <div\n v-for=\"(attribute, index) in attributes\"\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
|
|
1
|
+
{"version":3,"file":"EditAttributes.vue.js","sources":["../../../../../../../src/modules/products/components/sections/EditAttributes.vue"],"sourcesContent":["<template>\n <Block\n title=\"Parameters\"\n placeholder=\"No parameters added yet\"\n :actions=\"[{\n label: '+',\n function: () => openAttributePopup()\n }]\"\n >\n <div v-if=\"attributes.length > 0\" class=\"cols-1 gap-thin\">\n <div\n v-for=\"(attribute, index) in attributes\"\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\">{{ attribute.name || 'Unnamed parameter' }}</p>\n <p class=\"fw-medium t-transp\">{{ attribute.value || 'No value' }}</p>\n </div>\n \n <div class=\"flex gap-thin\">\n <div @click=\"() => openAttributePopup(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=\"() => attributes.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 Parameter\"\n @close-popup=\"closeAttributePopup\"\n :isPopupOpen=\"isAttributePopupOpen\"\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=\"currentAttribute.name\"\n label=\"Name\"\n placeholder=\"Parameter Name\"\n class=\"w-100 bg-light radius-small pd-small\"\n />\n\n <Field\n v-model:field=\"currentAttribute.value\"\n label=\"Value\"\n placeholder=\"Parameter Value\"\n class=\"w-100 bg-light radius-small pd-small\"\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=\"closeAttributePopup\"\n >\n Cancel\n </Button>\n <Button\n class=\"bg-main w-100\"\n @click=\"saveAttribute\"\n >\n Save\n </Button>\n </div>\n </div>\n </Popup>\n</template>\n\n<script setup>\nimport { ref, reactive, defineModel } 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 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 attributes = defineModel('attributes');\n\n// Локальное состояние\nconst isAttributePopupOpen = ref(false);\nconst editingAttributeIndex = ref(null);\nconst currentAttribute = reactive({\n name: '',\n value: ''\n});\n\n// Функция открытия попапа добавления/редактирования\nfunction openAttributePopup(index) {\n // Если передан индекс, это редактирование существующего атрибута\n if (index !== undefined) {\n editingAttributeIndex.value = index;\n const attribute = attributes.value[index];\n \n // Копируем данные в currentAttribute\n Object.assign(currentAttribute, {\n name: attribute.name || '',\n value: attribute.value || ''\n });\n } else {\n // Сброс данных при создании нового атрибута\n editingAttributeIndex.value = null;\n Object.assign(currentAttribute, {\n name: '',\n value: ''\n });\n }\n \n isAttributePopupOpen.value = true;\n}\n\n// Закрытие попапа\nfunction closeAttributePopup() {\n isAttributePopupOpen.value = false;\n editingAttributeIndex.value = null;\n}\n\n// Сохранение атрибута\nfunction saveAttribute() {\n // Проверка на основные поля\n if (!currentAttribute.name) {\n alert('Parameter name is required');\n return;\n }\n\n // Создаем копию текущего атрибута для сохранения\n const attributeToSave = {\n name: currentAttribute.name,\n value: currentAttribute.value\n };\n\n // Если редактируем существующий атрибут\n if (editingAttributeIndex.value !== null) {\n // Обновляем существующий атрибут\n attributes.value.splice(editingAttributeIndex.value, 1, attributeToSave);\n } else {\n // Добавляем новый атрибут\n attributes.value.push(attributeToSave);\n }\n\n // Закрываем попап\n closeAttributePopup();\n}\n</script>"],"names":["_useModel"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAuFA,UAAM,aAAaA,SAAW,SAAC,YAAY;AAG3C,UAAM,uBAAuB,IAAI,KAAK;AACtC,UAAM,wBAAwB,IAAI,IAAI;AACtC,UAAM,mBAAmB,SAAS;AAAA,MAChC,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AAGD,aAAS,mBAAmB,OAAO;AAEjC,UAAI,UAAU,QAAW;AACvB,8BAAsB,QAAQ;AAC9B,cAAM,YAAY,WAAW,MAAM,KAAK;AAGxC,eAAO,OAAO,kBAAkB;AAAA,UAC9B,MAAM,UAAU,QAAQ;AAAA,UACxB,OAAO,UAAU,SAAS;AAAA,QAChC,CAAK;AAAA,MACH,OAAO;AAEL,8BAAsB,QAAQ;AAC9B,eAAO,OAAO,kBAAkB;AAAA,UAC9B,MAAM;AAAA,UACN,OAAO;AAAA,QACb,CAAK;AAAA,MACH;AAEA,2BAAqB,QAAQ;AAAA,IAC/B;AAGA,aAAS,sBAAsB;AAC7B,2BAAqB,QAAQ;AAC7B,4BAAsB,QAAQ;AAAA,IAChC;AAGA,aAAS,gBAAgB;AAEvB,UAAI,CAAC,iBAAiB,MAAM;AAC1B,cAAM,4BAA4B;AAClC;AAAA,MACF;AAGA,YAAM,kBAAkB;AAAA,QACtB,MAAM,iBAAiB;AAAA,QACvB,OAAO,iBAAiB;AAAA,MAC5B;AAGE,UAAI,sBAAsB,UAAU,MAAM;AAExC,mBAAW,MAAM,OAAO,sBAAsB,OAAO,GAAG,eAAe;AAAA,MACzE,OAAO;AAEL,mBAAW,MAAM,KAAK,eAAe;AAAA,MACvC;AAGA,0BAAmB;AAAA,IACrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|