@ozdao/martyrs 0.2.542 → 0.2.544
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/builder.cjs +10 -2
- package/dist/builder.js +10 -2
- package/dist/{main-Czyu-VcC.cjs → main-8f945Ngn.cjs} +7 -7
- package/dist/{main-ByKkD9qa.js → main-d9n_ibdE.js} +2621 -2622
- package/dist/martyrs/src/components/Dropdown/{Dropdown.vue2.cjs → Dropdown.vue.cjs} +2 -2
- package/dist/martyrs/src/components/Dropdown/{Dropdown.vue2.js.map → Dropdown.vue.cjs.map} +1 -1
- package/dist/martyrs/src/components/Dropdown/{Dropdown.vue2.js → Dropdown.vue.js} +2 -2
- package/dist/martyrs/src/components/Dropdown/Dropdown.vue.js.map +1 -0
- package/dist/martyrs/src/components/Feed/Carousel.vue.cjs +4 -2
- package/dist/martyrs/src/components/Feed/Carousel.vue.cjs.map +1 -1
- package/dist/martyrs/src/components/Feed/Carousel.vue.js +5 -3
- package/dist/martyrs/src/components/Feed/Carousel.vue.js.map +1 -1
- package/dist/martyrs/src/components/Feed/{Feed.vue.cjs → Feed.vue2.cjs} +7 -5
- package/dist/martyrs/src/components/Feed/Feed.vue2.cjs.map +1 -0
- package/dist/martyrs/src/components/Feed/{Feed.vue.js → Feed.vue2.js} +7 -5
- package/dist/martyrs/src/components/Feed/Feed.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Field/{Field.vue.cjs → Field.vue2.cjs} +2 -2
- package/dist/martyrs/src/components/Field/Field.vue2.cjs.map +1 -0
- package/dist/martyrs/src/components/Field/{Field.vue.js → Field.vue2.js} +2 -2
- package/dist/martyrs/src/components/Field/{Field.vue.cjs.map → Field.vue2.js.map} +1 -1
- package/dist/martyrs/src/components/FieldBig/FieldBig.vue.cjs +1 -1
- package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +1 -1
- package/dist/martyrs/src/components/FieldTags/{BlockTags.vue.cjs → BlockTags.vue2.cjs} +2 -2
- package/dist/martyrs/src/components/FieldTags/BlockTags.vue2.cjs.map +1 -0
- package/dist/martyrs/src/components/FieldTags/{BlockTags.vue.js → BlockTags.vue2.js} +2 -2
- package/dist/martyrs/src/components/FieldTags/{BlockTags.vue.cjs.map → BlockTags.vue2.js.map} +1 -1
- package/dist/martyrs/src/components/Menu/{Menu.vue2.cjs → Menu.vue.cjs} +2 -2
- package/dist/martyrs/src/components/Menu/Menu.vue.cjs.map +1 -0
- package/dist/martyrs/src/components/Menu/{Menu.vue2.js → Menu.vue.js} +2 -2
- package/dist/martyrs/src/components/Menu/Menu.vue.js.map +1 -0
- package/dist/martyrs/src/components/Tab/Tab.vue2.cjs +3 -1
- package/dist/martyrs/src/components/Tab/Tab.vue2.cjs.map +1 -1
- package/dist/martyrs/src/components/Tab/Tab.vue2.js +4 -2
- package/dist/martyrs/src/components/Tab/Tab.vue2.js.map +1 -1
- package/dist/martyrs/src/components/UploadImage/{UploadImage.vue.cjs → UploadImage.vue2.cjs} +7 -7
- package/dist/martyrs/src/components/UploadImage/UploadImage.vue2.cjs.map +1 -0
- package/dist/martyrs/src/components/UploadImage/{UploadImage.vue.js → UploadImage.vue2.js} +7 -7
- package/dist/martyrs/src/components/UploadImage/UploadImage.vue2.js.map +1 -0
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +3 -3
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +3 -3
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.cjs +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/ProfileEditProfile.vue.cjs +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
- package/dist/martyrs/src/modules/backoffice/components/pages/Dashboard.vue.cjs +1 -1
- package/dist/martyrs/src/modules/backoffice/components/pages/Dashboard.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.cjs +2 -7
- package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.js +2 -7
- package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/blocks/FooterBlogpost.vue.cjs +2 -13
- package/dist/martyrs/src/modules/community/components/blocks/FooterBlogpost.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/community/components/blocks/FooterBlogpost.vue.js +2 -13
- package/dist/martyrs/src/modules/community/components/blocks/FooterBlogpost.vue.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.cjs +1 -1
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/pages/Blog.vue.cjs +1 -1
- package/dist/martyrs/src/modules/community/components/pages/Blog.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +3 -3
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +3 -3
- package/dist/martyrs/src/modules/community/components/pages/Posts.vue.cjs +1 -1
- package/dist/martyrs/src/modules/community/components/pages/Posts.vue.js +1 -1
- package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.cjs +2 -2
- package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.js +2 -2
- package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.cjs +1 -1
- package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +4 -4
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +4 -4
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs +2 -2
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +2 -2
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +7 -5
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +7 -5
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EventsSearch.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EventsSearch.vue.js +1 -1
- package/dist/martyrs/src/modules/gallery/components/pages/Gallery.vue.cjs +1 -1
- package/dist/martyrs/src/modules/gallery/components/pages/Gallery.vue.js +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +3 -3
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +3 -3
- package/dist/martyrs/src/modules/globals/views/classes/globals.app.cjs +38 -30
- package/dist/martyrs/src/modules/globals/views/classes/globals.app.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/classes/globals.app.js +39 -31
- package/dist/martyrs/src/modules/globals/views/classes/globals.app.js.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockMultiselect.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockMultiselect.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.cjs +3 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.js +3 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.js.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.cjs +7 -7
- package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.js +8 -8
- package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.js.map +1 -1
- package/dist/martyrs/src/modules/globals/views/plugins/alert.plugin.cjs +1 -0
- package/dist/martyrs/src/modules/globals/views/plugins/alert.plugin.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/plugins/alert.plugin.js +1 -0
- package/dist/martyrs/src/modules/globals/views/plugins/alert.plugin.js.map +1 -1
- package/dist/martyrs/src/modules/globals/views/utils/vue-app-renderer.cjs +21 -1
- package/dist/martyrs/src/modules/globals/views/utils/vue-app-renderer.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/utils/vue-app-renderer.js +21 -1
- package/dist/martyrs/src/modules/globals/views/utils/vue-app-renderer.js.map +1 -1
- package/dist/martyrs/src/modules/icons/components/IconSearchPopup.vue.cjs +1 -1
- package/dist/martyrs/src/modules/icons/components/IconSearchPopup.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.cjs +3 -3
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.js +2 -2
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.cjs +3 -3
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.cjs +2 -2
- package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.cjs.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/marketplace/views/components/layouts/Marketplace.vue.cjs +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.js +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/pages/Catalog.vue.cjs +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/pages/Catalog.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.cjs +2 -2
- package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.cjs +2 -2
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs +2 -2
- package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs +2 -2
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs +2 -2
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs +2 -2
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs +2 -2
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderItem.vue.cjs +7 -5
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderItem.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderItem.vue.js +8 -6
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderItem.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/Applications.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/Applications.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/Customers.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/Customers.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.cjs +5 -3
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +5 -3
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +4 -4
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs.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/pages/Orders.vue.cjs +8 -6
- package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js +8 -6
- package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/partials/ShopCart.vue.cjs +3 -1
- package/dist/martyrs/src/modules/orders/components/partials/ShopCart.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/orders/components/partials/ShopCart.vue.js +3 -1
- package/dist/martyrs/src/modules/orders/components/partials/ShopCart.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +3 -3
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +3 -3
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.cjs +7 -7
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js +7 -7
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.cjs +3 -3
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +3 -3
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.cjs +7 -7
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +7 -7
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +7 -7
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +7 -7
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +6 -6
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +6 -6
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +3 -3
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.cjs +2 -2
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/router/organizations.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/router/organizations.js +1 -1
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.cjs +1 -1
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
- package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.cjs +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.cjs +11 -5
- package/dist/martyrs/src/modules/products/components/blocks/CardCategory.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/CardCategory.vue.js +12 -6
- package/dist/martyrs/src/modules/products/components/blocks/CardCategory.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/CardProduct.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/CardProduct.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/ProductDiscounts.vue.cjs +4 -2
- package/dist/martyrs/src/modules/products/components/blocks/ProductDiscounts.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/ProductDiscounts.vue.js +5 -3
- package/dist/martyrs/src/modules/products/components/blocks/ProductDiscounts.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/elements/Price.vue.cjs +4 -2
- package/dist/martyrs/src/modules/products/components/elements/Price.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/elements/Price.vue.js +5 -3
- package/dist/martyrs/src/modules/products/components/elements/Price.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/elements/{THC.vue.cjs → THC.vue2.cjs} +2 -2
- package/dist/martyrs/src/modules/products/components/elements/THC.vue2.cjs.map +1 -0
- package/dist/martyrs/src/modules/products/components/elements/{THC.vue.js → THC.vue2.js} +2 -2
- package/dist/martyrs/src/modules/products/components/elements/THC.vue2.js.map +1 -0
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.cjs +5 -2
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +5 -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.cjs +4 -4
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +4 -4
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs +8 -8
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +8 -8
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditIngredients.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditIngredients.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditRecommended.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditRecommended.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.cjs +5 -3
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +5 -3
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs +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/RentsEdit.vue.cjs +2 -2
- package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs +2 -2
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +2 -2
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +2 -2
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.js +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/pages/Payments.vue.cjs +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/pages/Payments.vue.js +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.cjs +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +1 -1
- package/dist/martyrs.cjs.js +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.cjs +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.cjs +1 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js +1 -1
- package/dist/style.css +23 -23
- package/dist/{web-BklgIiYr.js → web-BkaOiiSn.js} +1 -1
- package/dist/{web-CQBm7C6L.cjs → web-CROHFHoW.cjs} +1 -1
- package/package.json +1 -1
- package/src/builder/modes/ssr.prod.js +2 -0
- package/src/builder/modes/ssr.rspack.dev.js +2 -0
- package/src/builder/templates/page.js +4 -0
- package/src/builder/templates/screen.js +4 -0
- package/src/components/Feed/Carousel.vue +3 -0
- package/src/components/Feed/Feed.vue +3 -0
- package/src/components/Tab/Tab.vue +2 -0
- package/src/components/UploadImage/UploadImage.vue +4 -4
- package/src/modules/community/components/blocks/CardBlogpost.vue +2 -7
- package/src/modules/community/components/blocks/FooterBlogpost.vue +2 -13
- package/src/modules/events/components/pages/Event.vue +2 -0
- package/src/modules/globals/TASK.MD +105 -1
- package/src/modules/globals/views/classes/globals.app.js +76 -48
- package/src/modules/globals/views/components/blocks/PopupDateSelector.vue +2 -0
- package/src/modules/globals/views/components/sections/Filters.vue +1 -1
- package/src/modules/globals/views/plugins/alert.plugin.js +1 -0
- package/src/modules/globals/views/utils/vue-app-renderer.js +25 -1
- package/src/modules/landing/components/sections/SectionGuide.vue +2 -2
- package/src/modules/orders/components/blocks/CardOrderItem.vue +2 -0
- package/src/modules/orders/components/blocks/CardOrderVar1.vue +12 -1
- package/src/modules/orders/components/pages/OrderBackoffice.vue +2 -0
- package/src/modules/orders/components/pages/OrderCreateBackoffice.vue +1 -1
- package/src/modules/orders/components/pages/Orders.vue +2 -0
- package/src/modules/orders/components/partials/ShopCart.vue +2 -0
- package/src/modules/products/components/blocks/CardCategory.vue +6 -0
- package/src/modules/products/components/blocks/ProductDiscounts.vue +3 -0
- package/src/modules/products/components/elements/Price.vue +3 -0
- package/src/modules/products/components/pages/Categories.vue +4 -1
- package/src/modules/products/components/pages/Products.vue +1 -1
- package/src/modules/products/components/sections/EditVariants.vue +2 -0
- package/dist/martyrs/src/components/Dropdown/Dropdown.vue2.cjs.map +0 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.cjs.map +0 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.js.map +0 -1
- package/dist/martyrs/src/components/Field/Field.vue.js.map +0 -1
- package/dist/martyrs/src/components/FieldTags/BlockTags.vue.js.map +0 -1
- package/dist/martyrs/src/components/Menu/Menu.vue2.cjs.map +0 -1
- package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +0 -1
- package/dist/martyrs/src/components/UploadImage/UploadImage.vue.cjs.map +0 -1
- package/dist/martyrs/src/components/UploadImage/UploadImage.vue.js.map +0 -1
- package/dist/martyrs/src/modules/products/components/elements/THC.vue.cjs.map +0 -1
- package/dist/martyrs/src/modules/products/components/elements/THC.vue.js.map +0 -1
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import { ref, createElementBlock, openBlock, createVNode, unref, isRef, withCtx, Fragment, renderList, createElementVNode, toDisplayString, createBlock, createCommentVNode, createTextVNode } from "vue";
|
|
2
2
|
import { useRoute } from "vue-router";
|
|
3
|
-
/* empty css
|
|
3
|
+
/* empty css */
|
|
4
4
|
import _sfc_main$8 from "../../../../components/Button/Button.vue.js";
|
|
5
5
|
/* empty css */
|
|
6
6
|
import _sfc_main$4 from "../../../../components/Chips/Chips.vue2.js";
|
|
7
7
|
/* empty css */
|
|
8
8
|
import _sfc_main$5 from "../../../../components/Popup/Popup.vue.js";
|
|
9
|
-
import _sfc_main$2 from "../../../../components/Feed/Feed.
|
|
9
|
+
import _sfc_main$2 from "../../../../components/Feed/Feed.vue2.js";
|
|
10
10
|
import PhotoViewer from "../../../../components/PhotoViewer/PhotoViewer.vue.js";
|
|
11
11
|
import { state } from "../../../auth/views/store/auth.js";
|
|
12
12
|
import gallery from "../../store/gallery.js";
|
|
13
13
|
import _sfc_main$3 from "../../../globals/views/components/blocks/CardHeader.vue.js";
|
|
14
14
|
import _sfc_main$1 from "../../../globals/views/components/sections/SectionPageTitle.vue.js";
|
|
15
15
|
import _sfc_main$6 from "../../../../components/EditImages/EditImages.vue2.js";
|
|
16
|
-
import _sfc_main$7 from "../../../../components/FieldTags/BlockTags.
|
|
16
|
+
import _sfc_main$7 from "../../../../components/FieldTags/BlockTags.vue2.js";
|
|
17
17
|
const _hoisted_1 = { class: "cols-1 gap-thin pd-thin" };
|
|
18
18
|
const _hoisted_2 = { class: "pos-relative" };
|
|
19
19
|
const _hoisted_3 = ["src", "onClick"];
|
|
@@ -53,6 +53,10 @@ function createUniversalApp({
|
|
|
53
53
|
const router = getRouter(context);
|
|
54
54
|
context.router = router;
|
|
55
55
|
const initCriticalModules = async () => {
|
|
56
|
+
const isSSRHydration = typeof window !== "undefined" && !process.env.MOBILE_APP;
|
|
57
|
+
if (isSSRHydration) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
56
60
|
const criticalModules = ["globals", "auth", "organizations", "backoffice"];
|
|
57
61
|
for (const moduleName of criticalModules) {
|
|
58
62
|
try {
|
|
@@ -64,12 +68,29 @@ function createUniversalApp({
|
|
|
64
68
|
}
|
|
65
69
|
};
|
|
66
70
|
if (typeof window !== "undefined") {
|
|
71
|
+
const originalPush = router.push.bind(router);
|
|
72
|
+
router.replace.bind(router);
|
|
73
|
+
async function paintNow() {
|
|
74
|
+
await vue.nextTick();
|
|
75
|
+
await new Promise(requestAnimationFrame);
|
|
76
|
+
await new Promise(requestAnimationFrame);
|
|
77
|
+
await new Promise((r) => setTimeout(r, 0));
|
|
78
|
+
}
|
|
79
|
+
router.push = async (...args) => {
|
|
80
|
+
store.globals.state.loading = true;
|
|
81
|
+
await paintNow();
|
|
82
|
+
setTimeout(() => {
|
|
83
|
+
originalPush(...args);
|
|
84
|
+
}, 0);
|
|
85
|
+
return Promise.resolve();
|
|
86
|
+
};
|
|
67
87
|
router.beforeEach(async (to, from) => {
|
|
68
|
-
const
|
|
88
|
+
const target = to.redirectedFrom || to;
|
|
89
|
+
const requiredModules = moduleRegistry.getModulesForRoute(target.path);
|
|
69
90
|
const modulesToLoad = requiredModules.filter((m) => !moduleRegistry.initialized.has(m.name));
|
|
70
91
|
if (modulesToLoad.length > 0) {
|
|
71
|
-
if (
|
|
72
|
-
|
|
92
|
+
if (to.redirectedFrom) {
|
|
93
|
+
console.log("[Router] Loading modules for redirected path:", target.path, "modules:", modulesToLoad.map((m) => m.name));
|
|
73
94
|
}
|
|
74
95
|
for (const module2 of modulesToLoad) {
|
|
75
96
|
try {
|
|
@@ -79,10 +100,13 @@ function createUniversalApp({
|
|
|
79
100
|
console.error(`Failed to load module ${module2.name}:`, error);
|
|
80
101
|
}
|
|
81
102
|
}
|
|
82
|
-
return
|
|
103
|
+
return { path: target.fullPath, replace: true };
|
|
83
104
|
}
|
|
84
105
|
});
|
|
85
106
|
}
|
|
107
|
+
router.beforeResolve(async (to, from) => {
|
|
108
|
+
store.globals.state.loading = false;
|
|
109
|
+
});
|
|
86
110
|
if (typeof window !== "undefined") {
|
|
87
111
|
window.addEventListener("error", (e) => {
|
|
88
112
|
if (e.message && e.message.includes("Loading chunk")) {
|
|
@@ -121,7 +145,8 @@ function createUniversalApp({
|
|
|
121
145
|
store,
|
|
122
146
|
i18n,
|
|
123
147
|
meta,
|
|
124
|
-
moduleRegistry
|
|
148
|
+
moduleRegistry,
|
|
149
|
+
config
|
|
125
150
|
};
|
|
126
151
|
};
|
|
127
152
|
if (!process.env.MOBILE_APP) {
|
|
@@ -135,6 +160,11 @@ function createUniversalApp({
|
|
|
135
160
|
const { setSSRStore } = await Promise.resolve().then(() => require("./store.cjs"));
|
|
136
161
|
setSSRStore(store);
|
|
137
162
|
}
|
|
163
|
+
if (typeof window === "undefined") {
|
|
164
|
+
moduleRegistry2.initialized.clear();
|
|
165
|
+
moduleRegistry2.modules.clear();
|
|
166
|
+
moduleRegistry2.loadingPromises.clear();
|
|
167
|
+
}
|
|
138
168
|
const context = {
|
|
139
169
|
app,
|
|
140
170
|
store,
|
|
@@ -173,31 +203,9 @@ function createUniversalApp({
|
|
|
173
203
|
if (hooks.afterHydration) {
|
|
174
204
|
hooks.afterHydration({ app, router, store, moduleRegistry: moduleRegistry2 });
|
|
175
205
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
try {
|
|
180
|
-
await Promise.all([
|
|
181
|
-
moduleRegistry2.load("organizations", context),
|
|
182
|
-
moduleRegistry2.load("backoffice", context)
|
|
183
|
-
]);
|
|
184
|
-
} catch (error) {
|
|
185
|
-
console.error("Error loading core modules:", error);
|
|
186
|
-
}
|
|
187
|
-
}, 0);
|
|
188
|
-
requestIdleCallback(async () => {
|
|
189
|
-
try {
|
|
190
|
-
await moduleRegistry2.load("notifications", context);
|
|
191
|
-
if (typeof window !== "undefined") {
|
|
192
|
-
window.performance.mark("client-ready");
|
|
193
|
-
}
|
|
194
|
-
} catch (error) {
|
|
195
|
-
console.error("Error loading non-critical modules:", error);
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
}).catch((error) => {
|
|
199
|
-
console.error("Error loading auth module:", error);
|
|
200
|
-
});
|
|
206
|
+
if (typeof window !== "undefined") {
|
|
207
|
+
window.performance.mark("client-ready");
|
|
208
|
+
}
|
|
201
209
|
}).catch((error) => {
|
|
202
210
|
console.error("Hydration failed:", error);
|
|
203
211
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"globals.app.cjs","sources":["../../../../../../../src/modules/globals/views/classes/globals.app.js"],"sourcesContent":["// client-factory.js - фабрика для создания клиентского приложения\nimport { createApp as createVueApp, createSSRApp as createVueSSRApp } from 'vue';\nimport { createHead } from '@unhead/vue';\n\nexport function createUniversalApp({\n getConfig,\n getRouter,\n getLocales,\n getStore,\n getHooks = {}\n}) {\n // Lazy imports to avoid circular dependencies\n const getLayoutApp = () => import('../components/layouts/App.vue').then(m => m.default);\n const getModuleRegistry = () => import('./module-registry.js').then(m => m.moduleRegistry);\n const getWebsockets = () => import('./globals.websocket.js').then(m => m.default);\n const getAppRenderer = () => import('../utils/vue-app-renderer.js');\n \n // Асинхронная инициализация для избежания циклических зависимостей\n async function initializeApp() {\n // Создаем конфигурацию\n const config = await getConfig();\n const hooks = getHooks;\n \n const [layoutApp, moduleRegistry, globalWebSocket, appRenderer] = await Promise.all([\n getLayoutApp(),\n getModuleRegistry(),\n getWebsockets(),\n getAppRenderer()\n ]);\n \n // Регистрация модуля globals первым\n moduleRegistry.register('globals', {\n loader: () => import('../../globals.client.js'),\n critical: true,\n priority: 'critical'\n });\n \n // Регистрация модулей из config\n Object.entries(config.modules).forEach(([name, module]) => {\n if (module.loader) {\n moduleRegistry.register(name, {\n loader: module.loader,\n routes: module.routes || [],\n priority: module.priority || 'normal',\n critical: module.critical || false,\n dependencies: module.dependencies || [],\n preload: module.preload || false\n });\n }\n });\n \n // Основная функция создания приложения\n function createApp() {\n const store = getStore();\n const app = process.env.MOBILE_APP \n ? createVueApp(layoutApp, config) \n : createVueSSRApp(layoutApp, config);\n \n const meta = createHead();\n const i18n = getLocales();\n \n const context = {\n app,\n store,\n router: null,\n config,\n };\n \n // Создаем роутер с контекстом\n const router = getRouter(context);\n context.router = router;\n \n // Загружаем только критические модули синхронно\n const initCriticalModules = async () => {\n // Критические модули одинаковые для всех проектов\n const criticalModules = ['globals', 'auth', 'organizations', 'backoffice'];\n \n for (const moduleName of criticalModules) {\n try {\n await moduleRegistry.load(moduleName, context);\n await moduleRegistry.initialize(moduleName, context);\n } catch (error) {\n console.error(`Failed to load critical module ${moduleName}:`, error);\n }\n }\n };\n \n // Router guard для загрузки модулей ДО навигации (только на клиенте)\n if (typeof window !== 'undefined') {\n router.beforeEach(async (to, from) => {\n // Получаем модули для маршрута\n const requiredModules = moduleRegistry.getModulesForRoute(to.path);\n \n // Проверяем, какие модули еще не загружены\n const modulesToLoad = requiredModules.filter(m => !moduleRegistry.initialized.has(m.name));\n \n if (modulesToLoad.length > 0) {\n // Показываем глобальный лоадер\n if (store.globals && store.globals.state) {\n store.globals.state.loading = true;\n }\n \n // Загружаем и инициализируем модули\n for (const module of modulesToLoad) {\n try {\n await moduleRegistry.load(module.name, context);\n await moduleRegistry.initialize(module.name, context);\n } catch (error) {\n console.error(`Failed to load module ${module.name}:`, error);\n }\n }\n \n // Лоадер остается включенным - страница сама выключит через globals.state.loading = false\n \n // После загрузки модулей и регистрации их роутов,\n // возвращаем тот же путь для повторной навигации с новыми роутами\n return to.fullPath;\n }\n });\n }\n \n // Error handler для lazy loaded chunks\n if (typeof window !== 'undefined') {\n window.addEventListener('error', (e) => {\n if (e.message && e.message.includes('Loading chunk')) {\n console.error('Chunk loading failed:', e);\n // Можно показать уведомление пользователю\n // или попытаться перезагрузить\n }\n });\n }\n \n // Инициализация в правильном порядке\n const initialize = async () => {\n // Хук ДО инициализации\n if (hooks.beforeInitialize) {\n await hooks.beforeInitialize(context);\n }\n \n // 1. Критические модули\n await initCriticalModules();\n \n // 2. WebSocket (отложим после гидратации)\n if (typeof window !== 'undefined') {\n // Откладываем инициализацию WebSocket после гидратации\n requestIdleCallback(() => {\n globalWebSocket.initialize({\n wsUrl: process.env.WSS_URL || undefined,\n maxReconnectAttempts: 5,\n reconnectDelay: 3000,\n pingInterval: 30000,\n });\n });\n \n // 3. Предзагрузка важных модулей в фоне\n requestIdleCallback(() => {\n moduleRegistry.preloadModules(context);\n });\n }\n \n // 5. Подключаем Vue плагины\n app.use(router).use(i18n).use(meta);\n \n // 6. Монтируем приложение\n if (process.env.MOBILE_APP) {\n app.mount('#app');\n }\n\n // Хук ПОСЛЕ инициализации\n if (hooks.afterInitialize) {\n await hooks.afterInitialize(context);\n }\n \n return {\n app,\n router,\n store,\n i18n,\n meta,\n moduleRegistry,\n };\n };\n \n // Возвращаем промис для SSR\n if (!process.env.MOBILE_APP) {\n return initialize();\n }\n \n // Для SPA инициализируем сразу\n initialize();\n }\n \n // FOR SSR / SERVER ENTRY\n async function renderApp({ url, cookies, languages, ssrContext }) {\n const { app, router, store, i18n, meta, moduleRegistry } = await createApp();\n \n // Set SSR store for useStore calls\n if (typeof window === 'undefined') {\n const { setSSRStore } = await import('./store.js');\n setSSRStore(store);\n }\n \n \n // if (typeof window === 'undefined') {\n // moduleRegistry.initialized.clear();\n // moduleRegistry.modules.clear();\n // moduleRegistry.loadingPromises.clear();\n \n // // На сервере загружаем auth для SSR рендеринга (vue-app-renderer требует его)\n // const context = { app, store, router, config };\n // await moduleRegistry.load('globals', context);\n // await moduleRegistry.initialize('globals', context);\n // await moduleRegistry.load('auth', context);\n // await moduleRegistry.initialize('auth', context);\n // }\n \n const context = {\n app,\n store,\n router,\n config,\n ssr: true,\n };\n \n // Для SSR загружаем модули для текущего маршрута\n const requiredModules = moduleRegistry.getModulesForRoute(url);\n \n // Собираем имена модулей которые нужны для текущего роута\n const currentRouteModules = [];\n \n // Загружаем необходимые модули для SSR\n for (const module of requiredModules) {\n await moduleRegistry.load(module.name, context);\n await moduleRegistry.initialize(module.name, context);\n currentRouteModules.push(module.name);\n }\n \n // После загрузки модулей и регистрации роутов, выполняем навигацию\n await router.push(url);\n await router.isReady();\n \n const result = await appRenderer.render({\n url,\n cookies,\n createApp: () => ({ app, router, store, i18n, meta }),\n ssrContext\n });\n \n if (ssrContext?.modules) {\n result.usedModules = Array.from(ssrContext.modules);\n }\n \n // Передаем только модули текущего роута + критические модули\n // Это не реальные модули а метаданные для дегидратации\n const criticalModules = ['globals', 'auth', 'organizations', 'backoffice'];\n const allModulesForRoute = [...new Set([...criticalModules, ...currentRouteModules])];\n \n result.loadedModules = allModulesForRoute;\n \n return result;\n }\n \n // FOR SPA\n if (typeof window !== 'undefined' && process.env.MOBILE_APP) {\n createApp();\n }\n \n // FOR SSR / CLIENT ENTRY\n if (typeof window !== 'undefined' && !process.env.MOBILE_APP) {\n // Используем renderAndMountApp для правильной гидратации со state\n appRenderer.renderAndMountApp({ createApp, hooks }).then(({ app, router, store, moduleRegistry }) => {\n // Хук ПОСЛЕ гидратации\n if (hooks.afterHydration) {\n hooks.afterHydration({ app, router, store, moduleRegistry });\n }\n \n // Создаем context для загрузки модулей\n const context = { app, store, router, config };\n \n // Загружаем auth модуль сразу - он критичен\n moduleRegistry.load('auth', context).then(() => {\n // Загружаем важные модули в следующем тике\n setTimeout(async () => {\n try {\n await Promise.all([\n moduleRegistry.load('organizations', context),\n moduleRegistry.load('backoffice', context),\n ]);\n } catch (error) {\n console.error('Error loading core modules:', error);\n }\n }, 0);\n \n // Загружаем некритичные модули когда браузер idle\n requestIdleCallback(async () => {\n try {\n await moduleRegistry.load('notifications', context);\n // Маркер для тестов\n if (typeof window !== 'undefined') {\n window.performance.mark('client-ready');\n }\n } catch (error) {\n console.error('Error loading non-critical modules:', error);\n }\n });\n }).catch(error => {\n console.error('Error loading auth module:', error);\n });\n }).catch(error => {\n console.error('Hydration failed:', error);\n });\n }\n \n return { createApp, renderApp };\n }\n \n // Возвращаем промис, который резолвится с функциями\n return initializeApp();\n}"],"names":["module","createVueApp","createVueSSRApp","createHead","moduleRegistry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"globals.app.cjs","sources":["../../../../../../../src/modules/globals/views/classes/globals.app.js"],"sourcesContent":["// client-factory.js - фабрика для создания клиентского приложения\nimport { nextTick, createApp as createVueApp, createSSRApp as createVueSSRApp } from 'vue';\nimport { createHead } from '@unhead/vue';\n\nexport function createUniversalApp({\n getConfig,\n getRouter,\n getLocales,\n getStore,\n getHooks = {}\n}) {\n // Lazy imports to avoid circular dependencies\n const getLayoutApp = () => import('../components/layouts/App.vue').then(m => m.default);\n const getModuleRegistry = () => import('./module-registry.js').then(m => m.moduleRegistry);\n const getWebsockets = () => import('./globals.websocket.js').then(m => m.default);\n const getAppRenderer = () => import('../utils/vue-app-renderer.js');\n \n // Асинхронная инициализация для избежания циклических зависимостей\n async function initializeApp() {\n // Создаем конфигурацию\n const config = await getConfig();\n const hooks = getHooks;\n \n const [layoutApp, moduleRegistry, globalWebSocket, appRenderer] = await Promise.all([\n getLayoutApp(),\n getModuleRegistry(),\n getWebsockets(),\n getAppRenderer()\n ]);\n \n // Регистрация модуля globals первым\n moduleRegistry.register('globals', {\n loader: () => import('../../globals.client.js'),\n critical: true,\n priority: 'critical'\n });\n \n // Регистрация модулей из config\n Object.entries(config.modules).forEach(([name, module]) => {\n if (module.loader) {\n moduleRegistry.register(name, {\n loader: module.loader,\n routes: module.routes || [],\n priority: module.priority || 'normal',\n critical: module.critical || false,\n dependencies: module.dependencies || [],\n preload: module.preload || false\n });\n }\n });\n \n // Основная функция создания приложения\n function createApp() {\n const store = getStore();\n const app = process.env.MOBILE_APP \n ? createVueApp(layoutApp, config) \n : createVueSSRApp(layoutApp, config);\n \n const meta = createHead();\n const i18n = getLocales();\n \n const context = {\n app,\n store,\n router: null,\n config,\n };\n \n // Создаем роутер с контекстом\n const router = getRouter(context);\n context.router = router;\n \n // Загружаем только критические модули синхронно\n const initCriticalModules = async () => {\n // Если это SSR гидратация - модули загрузятся в renderAndMountApp\n const isSSRHydration = typeof window !== 'undefined' && !process.env.MOBILE_APP;\n if (isSSRHydration) {\n return;\n }\n \n // Для SPA и сервера загружаем как обычно\n const criticalModules = ['globals', 'auth', 'organizations', 'backoffice'];\n \n for (const moduleName of criticalModules) {\n try {\n await moduleRegistry.load(moduleName, context);\n await moduleRegistry.initialize(moduleName, context);\n } catch (error) {\n console.error(`Failed to load critical module ${moduleName}:`, error);\n }\n }\n };\n \n // Router guard для загрузки модулей ДО навигации (только на клиенте)\n if (typeof window !== 'undefined') {\n const originalPush = router.push.bind(router);\n const originalReplace = router.replace.bind(router);\n\n async function paintNow() {\n await nextTick(); // flush реактивки в DOM\n await new Promise(requestAnimationFrame); // кадр layout/style\n await new Promise(requestAnimationFrame); // кадр отрисовки\n // иногда в WebView помогает ещё макротаск\n await new Promise(r => setTimeout(r, 0));\n }\n\n router.push = async (...args) => {\n // Включаем лоадер\n store.globals.state.loading = true;\n \n // Даем браузеру отрисовать лоадер\n await paintNow();\n \n // Запускаем навигацию асинхронно, чтобы не блокировать UI\n setTimeout(() => {\n originalPush(...args);\n }, 0);\n \n // Возвращаем промис для совместимости\n return Promise.resolve();\n };\n\n // router.replace = async (...args) => {\n // // Включаем лоадер\n // store.globals.state.loading = true;\n \n // // Даем браузеру отрисовать лоадер\n // await paintNow();\n \n // // Запускаем навигацию асинхронно\n // setTimeout(() => {\n // originalReplace(...args);\n // }, 0);\n \n // return Promise.resolve();\n // };\n\n router.beforeEach(async (to, from) => {\n // Получаем оригинальный путь ДО fallback редиректа на 404\n // Это критически важно для SSR гидратации вложенных роутов!\n const target = to.redirectedFrom || to;\n \n // Используем оригинальный путь для определения нужных модулей\n const requiredModules = moduleRegistry.getModulesForRoute(target.path);\n \n // Проверяем, какие модули еще не загружены\n const modulesToLoad = requiredModules.filter(m => !moduleRegistry.initialized.has(m.name));\n \n if (modulesToLoad.length > 0) {\n // Логируем если это редирект с 404 (для отладки)\n if (to.redirectedFrom) {\n console.log('[Router] Loading modules for redirected path:', target.path, 'modules:', modulesToLoad.map(m => m.name));\n }\n \n // Загружаем и инициализируем модули\n for (const module of modulesToLoad) {\n try {\n await moduleRegistry.load(module.name, context);\n await moduleRegistry.initialize(module.name, context);\n } catch (error) {\n console.error(`Failed to load module ${module.name}:`, error);\n }\n }\n \n // После загрузки модулей и регистрации их роутов,\n // возвращаем объект с оригинальным путем и replace: true\n // Это заставит роутер заново резолвить маршрут с новыми роутами\n return { path: target.fullPath, replace: true };\n }\n });\n }\n\n router.beforeResolve(async (to, from) => {\n store.globals.state.loading = false;\n })\n \n // Error handler для lazy loaded chunks\n if (typeof window !== 'undefined') {\n window.addEventListener('error', (e) => {\n if (e.message && e.message.includes('Loading chunk')) {\n console.error('Chunk loading failed:', e);\n // Можно показать уведомление пользователю\n // или попытаться перезагрузить\n }\n });\n }\n \n // Инициализация в правильном порядке\n const initialize = async () => {\n // Хук ДО инициализации\n if (hooks.beforeInitialize) {\n await hooks.beforeInitialize(context);\n }\n \n // 1. Критические модули\n await initCriticalModules();\n \n // 2. WebSocket (отложим после гидратации)\n if (typeof window !== 'undefined') {\n // Откладываем инициализацию WebSocket после гидратации\n requestIdleCallback(() => {\n globalWebSocket.initialize({\n wsUrl: process.env.WSS_URL || undefined,\n maxReconnectAttempts: 5,\n reconnectDelay: 3000,\n pingInterval: 30000,\n });\n });\n \n // 3. Предзагрузка важных модулей в фоне\n requestIdleCallback(() => {\n moduleRegistry.preloadModules(context);\n });\n }\n \n // 5. Подключаем Vue плагины\n app.use(router).use(i18n).use(meta);\n \n // 6. Монтируем приложение\n if (process.env.MOBILE_APP) {\n app.mount('#app');\n }\n\n // Хук ПОСЛЕ инициализации\n if (hooks.afterInitialize) {\n await hooks.afterInitialize(context);\n }\n \n return {\n app,\n router,\n store,\n i18n,\n meta,\n moduleRegistry,\n config,\n };\n };\n \n // Возвращаем промис для SSR\n if (!process.env.MOBILE_APP) {\n return initialize();\n }\n \n // Для SPA инициализируем сразу\n initialize();\n }\n \n // FOR SSR / SERVER ENTRY\n async function renderApp({ url, cookies, languages, ssrContext }) {\n const { app, router, store, i18n, meta, moduleRegistry } = await createApp();\n \n // Set SSR store for useStore calls\n if (typeof window === 'undefined') {\n const { setSSRStore } = await import('./store.js');\n setSSRStore(store);\n }\n \n \n if (typeof window === 'undefined') {\n moduleRegistry.initialized.clear();\n moduleRegistry.modules.clear();\n moduleRegistry.loadingPromises.clear();\n }\n // // На сервере загружаем auth для SSR рендеринга (vue-app-renderer требует его)\n // const context = { app, store, router, config };\n // await moduleRegistry.load('globals', context);\n // await moduleRegistry.initialize('globals', context);\n // await moduleRegistry.load('auth', context);\n // await moduleRegistry.initialize('auth', context);\n // }\n \n const context = {\n app,\n store,\n router,\n config,\n ssr: true,\n };\n \n // Для SSR загружаем модули для текущего маршрута\n const requiredModules = moduleRegistry.getModulesForRoute(url);\n \n // Собираем имена модулей которые нужны для текущего роута\n const currentRouteModules = [];\n \n // Загружаем необходимые модули для SSR\n for (const module of requiredModules) {\n await moduleRegistry.load(module.name, context);\n await moduleRegistry.initialize(module.name, context);\n currentRouteModules.push(module.name);\n }\n \n // После загрузки модулей и регистрации роутов, выполняем навигацию\n await router.push(url);\n await router.isReady();\n \n const result = await appRenderer.render({\n url,\n cookies,\n createApp: () => ({ app, router, store, i18n, meta }),\n ssrContext\n });\n \n if (ssrContext?.modules) {\n result.usedModules = Array.from(ssrContext.modules);\n }\n \n // Передаем только модули текущего роута + критические модули\n // Это не реальные модули а метаданные для дегидратации\n const criticalModules = ['globals', 'auth', 'organizations', 'backoffice'];\n const allModulesForRoute = [...new Set([...criticalModules, ...currentRouteModules])];\n \n result.loadedModules = allModulesForRoute;\n \n return result;\n }\n \n // FOR SPA\n if (typeof window !== 'undefined' && process.env.MOBILE_APP) {\n createApp();\n }\n \n // FOR SSR / CLIENT ENTRY\n if (typeof window !== 'undefined' && !process.env.MOBILE_APP) {\n // Используем renderAndMountApp для правильной гидратации со state\n appRenderer.renderAndMountApp({ createApp, hooks }).then(({ app, router, store, moduleRegistry }) => {\n // Хук ПОСЛЕ гидратации\n if (hooks.afterHydration) {\n hooks.afterHydration({ app, router, store, moduleRegistry });\n }\n \n // Модули уже загружены в renderAndMountApp, просто ставим маркер\n if (typeof window !== 'undefined') {\n window.performance.mark('client-ready');\n }\n }).catch(error => {\n console.error('Hydration failed:', error);\n });\n }\n \n return { createApp, renderApp };\n }\n \n // Возвращаем промис, который резолвится с функциями\n return initializeApp();\n}"],"names":["module","createVueApp","createVueSSRApp","createHead","nextTick","moduleRegistry"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createApp, createSSRApp } from "vue";
|
|
1
|
+
import { createApp, createSSRApp, nextTick } from "vue";
|
|
2
2
|
import { c as createHead } from "../../../../../../node_modules/.pnpm/@unhead_vue@1.11.20_vue@3.5.21_typescript@5.9.2_/node_modules/@unhead/vue/dist/shared/vue.ziyDaVMR.js";
|
|
3
3
|
function createUniversalApp({
|
|
4
4
|
getConfig,
|
|
@@ -51,6 +51,10 @@ function createUniversalApp({
|
|
|
51
51
|
const router = getRouter(context);
|
|
52
52
|
context.router = router;
|
|
53
53
|
const initCriticalModules = async () => {
|
|
54
|
+
const isSSRHydration = typeof window !== "undefined" && !process.env.MOBILE_APP;
|
|
55
|
+
if (isSSRHydration) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
54
58
|
const criticalModules = ["globals", "auth", "organizations", "backoffice"];
|
|
55
59
|
for (const moduleName of criticalModules) {
|
|
56
60
|
try {
|
|
@@ -62,12 +66,29 @@ function createUniversalApp({
|
|
|
62
66
|
}
|
|
63
67
|
};
|
|
64
68
|
if (typeof window !== "undefined") {
|
|
69
|
+
const originalPush = router.push.bind(router);
|
|
70
|
+
router.replace.bind(router);
|
|
71
|
+
async function paintNow() {
|
|
72
|
+
await nextTick();
|
|
73
|
+
await new Promise(requestAnimationFrame);
|
|
74
|
+
await new Promise(requestAnimationFrame);
|
|
75
|
+
await new Promise((r) => setTimeout(r, 0));
|
|
76
|
+
}
|
|
77
|
+
router.push = async (...args) => {
|
|
78
|
+
store.globals.state.loading = true;
|
|
79
|
+
await paintNow();
|
|
80
|
+
setTimeout(() => {
|
|
81
|
+
originalPush(...args);
|
|
82
|
+
}, 0);
|
|
83
|
+
return Promise.resolve();
|
|
84
|
+
};
|
|
65
85
|
router.beforeEach(async (to, from) => {
|
|
66
|
-
const
|
|
86
|
+
const target = to.redirectedFrom || to;
|
|
87
|
+
const requiredModules = moduleRegistry.getModulesForRoute(target.path);
|
|
67
88
|
const modulesToLoad = requiredModules.filter((m) => !moduleRegistry.initialized.has(m.name));
|
|
68
89
|
if (modulesToLoad.length > 0) {
|
|
69
|
-
if (
|
|
70
|
-
|
|
90
|
+
if (to.redirectedFrom) {
|
|
91
|
+
console.log("[Router] Loading modules for redirected path:", target.path, "modules:", modulesToLoad.map((m) => m.name));
|
|
71
92
|
}
|
|
72
93
|
for (const module of modulesToLoad) {
|
|
73
94
|
try {
|
|
@@ -77,10 +98,13 @@ function createUniversalApp({
|
|
|
77
98
|
console.error(`Failed to load module ${module.name}:`, error);
|
|
78
99
|
}
|
|
79
100
|
}
|
|
80
|
-
return
|
|
101
|
+
return { path: target.fullPath, replace: true };
|
|
81
102
|
}
|
|
82
103
|
});
|
|
83
104
|
}
|
|
105
|
+
router.beforeResolve(async (to, from) => {
|
|
106
|
+
store.globals.state.loading = false;
|
|
107
|
+
});
|
|
84
108
|
if (typeof window !== "undefined") {
|
|
85
109
|
window.addEventListener("error", (e) => {
|
|
86
110
|
if (e.message && e.message.includes("Loading chunk")) {
|
|
@@ -119,7 +143,8 @@ function createUniversalApp({
|
|
|
119
143
|
store,
|
|
120
144
|
i18n,
|
|
121
145
|
meta,
|
|
122
|
-
moduleRegistry
|
|
146
|
+
moduleRegistry,
|
|
147
|
+
config
|
|
123
148
|
};
|
|
124
149
|
};
|
|
125
150
|
if (!process.env.MOBILE_APP) {
|
|
@@ -133,6 +158,11 @@ function createUniversalApp({
|
|
|
133
158
|
const { setSSRStore } = await import("./store.js");
|
|
134
159
|
setSSRStore(store);
|
|
135
160
|
}
|
|
161
|
+
if (typeof window === "undefined") {
|
|
162
|
+
moduleRegistry2.initialized.clear();
|
|
163
|
+
moduleRegistry2.modules.clear();
|
|
164
|
+
moduleRegistry2.loadingPromises.clear();
|
|
165
|
+
}
|
|
136
166
|
const context = {
|
|
137
167
|
app,
|
|
138
168
|
store,
|
|
@@ -171,31 +201,9 @@ function createUniversalApp({
|
|
|
171
201
|
if (hooks.afterHydration) {
|
|
172
202
|
hooks.afterHydration({ app, router, store, moduleRegistry: moduleRegistry2 });
|
|
173
203
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
try {
|
|
178
|
-
await Promise.all([
|
|
179
|
-
moduleRegistry2.load("organizations", context),
|
|
180
|
-
moduleRegistry2.load("backoffice", context)
|
|
181
|
-
]);
|
|
182
|
-
} catch (error) {
|
|
183
|
-
console.error("Error loading core modules:", error);
|
|
184
|
-
}
|
|
185
|
-
}, 0);
|
|
186
|
-
requestIdleCallback(async () => {
|
|
187
|
-
try {
|
|
188
|
-
await moduleRegistry2.load("notifications", context);
|
|
189
|
-
if (typeof window !== "undefined") {
|
|
190
|
-
window.performance.mark("client-ready");
|
|
191
|
-
}
|
|
192
|
-
} catch (error) {
|
|
193
|
-
console.error("Error loading non-critical modules:", error);
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
}).catch((error) => {
|
|
197
|
-
console.error("Error loading auth module:", error);
|
|
198
|
-
});
|
|
204
|
+
if (typeof window !== "undefined") {
|
|
205
|
+
window.performance.mark("client-ready");
|
|
206
|
+
}
|
|
199
207
|
}).catch((error) => {
|
|
200
208
|
console.error("Hydration failed:", error);
|
|
201
209
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"globals.app.js","sources":["../../../../../../../src/modules/globals/views/classes/globals.app.js"],"sourcesContent":["// client-factory.js - фабрика для создания клиентского приложения\nimport { createApp as createVueApp, createSSRApp as createVueSSRApp } from 'vue';\nimport { createHead } from '@unhead/vue';\n\nexport function createUniversalApp({\n getConfig,\n getRouter,\n getLocales,\n getStore,\n getHooks = {}\n}) {\n // Lazy imports to avoid circular dependencies\n const getLayoutApp = () => import('../components/layouts/App.vue').then(m => m.default);\n const getModuleRegistry = () => import('./module-registry.js').then(m => m.moduleRegistry);\n const getWebsockets = () => import('./globals.websocket.js').then(m => m.default);\n const getAppRenderer = () => import('../utils/vue-app-renderer.js');\n \n // Асинхронная инициализация для избежания циклических зависимостей\n async function initializeApp() {\n // Создаем конфигурацию\n const config = await getConfig();\n const hooks = getHooks;\n \n const [layoutApp, moduleRegistry, globalWebSocket, appRenderer] = await Promise.all([\n getLayoutApp(),\n getModuleRegistry(),\n getWebsockets(),\n getAppRenderer()\n ]);\n \n // Регистрация модуля globals первым\n moduleRegistry.register('globals', {\n loader: () => import('../../globals.client.js'),\n critical: true,\n priority: 'critical'\n });\n \n // Регистрация модулей из config\n Object.entries(config.modules).forEach(([name, module]) => {\n if (module.loader) {\n moduleRegistry.register(name, {\n loader: module.loader,\n routes: module.routes || [],\n priority: module.priority || 'normal',\n critical: module.critical || false,\n dependencies: module.dependencies || [],\n preload: module.preload || false\n });\n }\n });\n \n // Основная функция создания приложения\n function createApp() {\n const store = getStore();\n const app = process.env.MOBILE_APP \n ? createVueApp(layoutApp, config) \n : createVueSSRApp(layoutApp, config);\n \n const meta = createHead();\n const i18n = getLocales();\n \n const context = {\n app,\n store,\n router: null,\n config,\n };\n \n // Создаем роутер с контекстом\n const router = getRouter(context);\n context.router = router;\n \n // Загружаем только критические модули синхронно\n const initCriticalModules = async () => {\n // Критические модули одинаковые для всех проектов\n const criticalModules = ['globals', 'auth', 'organizations', 'backoffice'];\n \n for (const moduleName of criticalModules) {\n try {\n await moduleRegistry.load(moduleName, context);\n await moduleRegistry.initialize(moduleName, context);\n } catch (error) {\n console.error(`Failed to load critical module ${moduleName}:`, error);\n }\n }\n };\n \n // Router guard для загрузки модулей ДО навигации (только на клиенте)\n if (typeof window !== 'undefined') {\n router.beforeEach(async (to, from) => {\n // Получаем модули для маршрута\n const requiredModules = moduleRegistry.getModulesForRoute(to.path);\n \n // Проверяем, какие модули еще не загружены\n const modulesToLoad = requiredModules.filter(m => !moduleRegistry.initialized.has(m.name));\n \n if (modulesToLoad.length > 0) {\n // Показываем глобальный лоадер\n if (store.globals && store.globals.state) {\n store.globals.state.loading = true;\n }\n \n // Загружаем и инициализируем модули\n for (const module of modulesToLoad) {\n try {\n await moduleRegistry.load(module.name, context);\n await moduleRegistry.initialize(module.name, context);\n } catch (error) {\n console.error(`Failed to load module ${module.name}:`, error);\n }\n }\n \n // Лоадер остается включенным - страница сама выключит через globals.state.loading = false\n \n // После загрузки модулей и регистрации их роутов,\n // возвращаем тот же путь для повторной навигации с новыми роутами\n return to.fullPath;\n }\n });\n }\n \n // Error handler для lazy loaded chunks\n if (typeof window !== 'undefined') {\n window.addEventListener('error', (e) => {\n if (e.message && e.message.includes('Loading chunk')) {\n console.error('Chunk loading failed:', e);\n // Можно показать уведомление пользователю\n // или попытаться перезагрузить\n }\n });\n }\n \n // Инициализация в правильном порядке\n const initialize = async () => {\n // Хук ДО инициализации\n if (hooks.beforeInitialize) {\n await hooks.beforeInitialize(context);\n }\n \n // 1. Критические модули\n await initCriticalModules();\n \n // 2. WebSocket (отложим после гидратации)\n if (typeof window !== 'undefined') {\n // Откладываем инициализацию WebSocket после гидратации\n requestIdleCallback(() => {\n globalWebSocket.initialize({\n wsUrl: process.env.WSS_URL || undefined,\n maxReconnectAttempts: 5,\n reconnectDelay: 3000,\n pingInterval: 30000,\n });\n });\n \n // 3. Предзагрузка важных модулей в фоне\n requestIdleCallback(() => {\n moduleRegistry.preloadModules(context);\n });\n }\n \n // 5. Подключаем Vue плагины\n app.use(router).use(i18n).use(meta);\n \n // 6. Монтируем приложение\n if (process.env.MOBILE_APP) {\n app.mount('#app');\n }\n\n // Хук ПОСЛЕ инициализации\n if (hooks.afterInitialize) {\n await hooks.afterInitialize(context);\n }\n \n return {\n app,\n router,\n store,\n i18n,\n meta,\n moduleRegistry,\n };\n };\n \n // Возвращаем промис для SSR\n if (!process.env.MOBILE_APP) {\n return initialize();\n }\n \n // Для SPA инициализируем сразу\n initialize();\n }\n \n // FOR SSR / SERVER ENTRY\n async function renderApp({ url, cookies, languages, ssrContext }) {\n const { app, router, store, i18n, meta, moduleRegistry } = await createApp();\n \n // Set SSR store for useStore calls\n if (typeof window === 'undefined') {\n const { setSSRStore } = await import('./store.js');\n setSSRStore(store);\n }\n \n \n // if (typeof window === 'undefined') {\n // moduleRegistry.initialized.clear();\n // moduleRegistry.modules.clear();\n // moduleRegistry.loadingPromises.clear();\n \n // // На сервере загружаем auth для SSR рендеринга (vue-app-renderer требует его)\n // const context = { app, store, router, config };\n // await moduleRegistry.load('globals', context);\n // await moduleRegistry.initialize('globals', context);\n // await moduleRegistry.load('auth', context);\n // await moduleRegistry.initialize('auth', context);\n // }\n \n const context = {\n app,\n store,\n router,\n config,\n ssr: true,\n };\n \n // Для SSR загружаем модули для текущего маршрута\n const requiredModules = moduleRegistry.getModulesForRoute(url);\n \n // Собираем имена модулей которые нужны для текущего роута\n const currentRouteModules = [];\n \n // Загружаем необходимые модули для SSR\n for (const module of requiredModules) {\n await moduleRegistry.load(module.name, context);\n await moduleRegistry.initialize(module.name, context);\n currentRouteModules.push(module.name);\n }\n \n // После загрузки модулей и регистрации роутов, выполняем навигацию\n await router.push(url);\n await router.isReady();\n \n const result = await appRenderer.render({\n url,\n cookies,\n createApp: () => ({ app, router, store, i18n, meta }),\n ssrContext\n });\n \n if (ssrContext?.modules) {\n result.usedModules = Array.from(ssrContext.modules);\n }\n \n // Передаем только модули текущего роута + критические модули\n // Это не реальные модули а метаданные для дегидратации\n const criticalModules = ['globals', 'auth', 'organizations', 'backoffice'];\n const allModulesForRoute = [...new Set([...criticalModules, ...currentRouteModules])];\n \n result.loadedModules = allModulesForRoute;\n \n return result;\n }\n \n // FOR SPA\n if (typeof window !== 'undefined' && process.env.MOBILE_APP) {\n createApp();\n }\n \n // FOR SSR / CLIENT ENTRY\n if (typeof window !== 'undefined' && !process.env.MOBILE_APP) {\n // Используем renderAndMountApp для правильной гидратации со state\n appRenderer.renderAndMountApp({ createApp, hooks }).then(({ app, router, store, moduleRegistry }) => {\n // Хук ПОСЛЕ гидратации\n if (hooks.afterHydration) {\n hooks.afterHydration({ app, router, store, moduleRegistry });\n }\n \n // Создаем context для загрузки модулей\n const context = { app, store, router, config };\n \n // Загружаем auth модуль сразу - он критичен\n moduleRegistry.load('auth', context).then(() => {\n // Загружаем важные модули в следующем тике\n setTimeout(async () => {\n try {\n await Promise.all([\n moduleRegistry.load('organizations', context),\n moduleRegistry.load('backoffice', context),\n ]);\n } catch (error) {\n console.error('Error loading core modules:', error);\n }\n }, 0);\n \n // Загружаем некритичные модули когда браузер idle\n requestIdleCallback(async () => {\n try {\n await moduleRegistry.load('notifications', context);\n // Маркер для тестов\n if (typeof window !== 'undefined') {\n window.performance.mark('client-ready');\n }\n } catch (error) {\n console.error('Error loading non-critical modules:', error);\n }\n });\n }).catch(error => {\n console.error('Error loading auth module:', error);\n });\n }).catch(error => {\n console.error('Hydration failed:', error);\n });\n }\n \n return { createApp, renderApp };\n }\n \n // Возвращаем промис, который резолвится с функциями\n return initializeApp();\n}"],"names":["createApp","createVueApp","createVueSSRApp","moduleRegistry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"globals.app.js","sources":["../../../../../../../src/modules/globals/views/classes/globals.app.js"],"sourcesContent":["// client-factory.js - фабрика для создания клиентского приложения\nimport { nextTick, createApp as createVueApp, createSSRApp as createVueSSRApp } from 'vue';\nimport { createHead } from '@unhead/vue';\n\nexport function createUniversalApp({\n getConfig,\n getRouter,\n getLocales,\n getStore,\n getHooks = {}\n}) {\n // Lazy imports to avoid circular dependencies\n const getLayoutApp = () => import('../components/layouts/App.vue').then(m => m.default);\n const getModuleRegistry = () => import('./module-registry.js').then(m => m.moduleRegistry);\n const getWebsockets = () => import('./globals.websocket.js').then(m => m.default);\n const getAppRenderer = () => import('../utils/vue-app-renderer.js');\n \n // Асинхронная инициализация для избежания циклических зависимостей\n async function initializeApp() {\n // Создаем конфигурацию\n const config = await getConfig();\n const hooks = getHooks;\n \n const [layoutApp, moduleRegistry, globalWebSocket, appRenderer] = await Promise.all([\n getLayoutApp(),\n getModuleRegistry(),\n getWebsockets(),\n getAppRenderer()\n ]);\n \n // Регистрация модуля globals первым\n moduleRegistry.register('globals', {\n loader: () => import('../../globals.client.js'),\n critical: true,\n priority: 'critical'\n });\n \n // Регистрация модулей из config\n Object.entries(config.modules).forEach(([name, module]) => {\n if (module.loader) {\n moduleRegistry.register(name, {\n loader: module.loader,\n routes: module.routes || [],\n priority: module.priority || 'normal',\n critical: module.critical || false,\n dependencies: module.dependencies || [],\n preload: module.preload || false\n });\n }\n });\n \n // Основная функция создания приложения\n function createApp() {\n const store = getStore();\n const app = process.env.MOBILE_APP \n ? createVueApp(layoutApp, config) \n : createVueSSRApp(layoutApp, config);\n \n const meta = createHead();\n const i18n = getLocales();\n \n const context = {\n app,\n store,\n router: null,\n config,\n };\n \n // Создаем роутер с контекстом\n const router = getRouter(context);\n context.router = router;\n \n // Загружаем только критические модули синхронно\n const initCriticalModules = async () => {\n // Если это SSR гидратация - модули загрузятся в renderAndMountApp\n const isSSRHydration = typeof window !== 'undefined' && !process.env.MOBILE_APP;\n if (isSSRHydration) {\n return;\n }\n \n // Для SPA и сервера загружаем как обычно\n const criticalModules = ['globals', 'auth', 'organizations', 'backoffice'];\n \n for (const moduleName of criticalModules) {\n try {\n await moduleRegistry.load(moduleName, context);\n await moduleRegistry.initialize(moduleName, context);\n } catch (error) {\n console.error(`Failed to load critical module ${moduleName}:`, error);\n }\n }\n };\n \n // Router guard для загрузки модулей ДО навигации (только на клиенте)\n if (typeof window !== 'undefined') {\n const originalPush = router.push.bind(router);\n const originalReplace = router.replace.bind(router);\n\n async function paintNow() {\n await nextTick(); // flush реактивки в DOM\n await new Promise(requestAnimationFrame); // кадр layout/style\n await new Promise(requestAnimationFrame); // кадр отрисовки\n // иногда в WebView помогает ещё макротаск\n await new Promise(r => setTimeout(r, 0));\n }\n\n router.push = async (...args) => {\n // Включаем лоадер\n store.globals.state.loading = true;\n \n // Даем браузеру отрисовать лоадер\n await paintNow();\n \n // Запускаем навигацию асинхронно, чтобы не блокировать UI\n setTimeout(() => {\n originalPush(...args);\n }, 0);\n \n // Возвращаем промис для совместимости\n return Promise.resolve();\n };\n\n // router.replace = async (...args) => {\n // // Включаем лоадер\n // store.globals.state.loading = true;\n \n // // Даем браузеру отрисовать лоадер\n // await paintNow();\n \n // // Запускаем навигацию асинхронно\n // setTimeout(() => {\n // originalReplace(...args);\n // }, 0);\n \n // return Promise.resolve();\n // };\n\n router.beforeEach(async (to, from) => {\n // Получаем оригинальный путь ДО fallback редиректа на 404\n // Это критически важно для SSR гидратации вложенных роутов!\n const target = to.redirectedFrom || to;\n \n // Используем оригинальный путь для определения нужных модулей\n const requiredModules = moduleRegistry.getModulesForRoute(target.path);\n \n // Проверяем, какие модули еще не загружены\n const modulesToLoad = requiredModules.filter(m => !moduleRegistry.initialized.has(m.name));\n \n if (modulesToLoad.length > 0) {\n // Логируем если это редирект с 404 (для отладки)\n if (to.redirectedFrom) {\n console.log('[Router] Loading modules for redirected path:', target.path, 'modules:', modulesToLoad.map(m => m.name));\n }\n \n // Загружаем и инициализируем модули\n for (const module of modulesToLoad) {\n try {\n await moduleRegistry.load(module.name, context);\n await moduleRegistry.initialize(module.name, context);\n } catch (error) {\n console.error(`Failed to load module ${module.name}:`, error);\n }\n }\n \n // После загрузки модулей и регистрации их роутов,\n // возвращаем объект с оригинальным путем и replace: true\n // Это заставит роутер заново резолвить маршрут с новыми роутами\n return { path: target.fullPath, replace: true };\n }\n });\n }\n\n router.beforeResolve(async (to, from) => {\n store.globals.state.loading = false;\n })\n \n // Error handler для lazy loaded chunks\n if (typeof window !== 'undefined') {\n window.addEventListener('error', (e) => {\n if (e.message && e.message.includes('Loading chunk')) {\n console.error('Chunk loading failed:', e);\n // Можно показать уведомление пользователю\n // или попытаться перезагрузить\n }\n });\n }\n \n // Инициализация в правильном порядке\n const initialize = async () => {\n // Хук ДО инициализации\n if (hooks.beforeInitialize) {\n await hooks.beforeInitialize(context);\n }\n \n // 1. Критические модули\n await initCriticalModules();\n \n // 2. WebSocket (отложим после гидратации)\n if (typeof window !== 'undefined') {\n // Откладываем инициализацию WebSocket после гидратации\n requestIdleCallback(() => {\n globalWebSocket.initialize({\n wsUrl: process.env.WSS_URL || undefined,\n maxReconnectAttempts: 5,\n reconnectDelay: 3000,\n pingInterval: 30000,\n });\n });\n \n // 3. Предзагрузка важных модулей в фоне\n requestIdleCallback(() => {\n moduleRegistry.preloadModules(context);\n });\n }\n \n // 5. Подключаем Vue плагины\n app.use(router).use(i18n).use(meta);\n \n // 6. Монтируем приложение\n if (process.env.MOBILE_APP) {\n app.mount('#app');\n }\n\n // Хук ПОСЛЕ инициализации\n if (hooks.afterInitialize) {\n await hooks.afterInitialize(context);\n }\n \n return {\n app,\n router,\n store,\n i18n,\n meta,\n moduleRegistry,\n config,\n };\n };\n \n // Возвращаем промис для SSR\n if (!process.env.MOBILE_APP) {\n return initialize();\n }\n \n // Для SPA инициализируем сразу\n initialize();\n }\n \n // FOR SSR / SERVER ENTRY\n async function renderApp({ url, cookies, languages, ssrContext }) {\n const { app, router, store, i18n, meta, moduleRegistry } = await createApp();\n \n // Set SSR store for useStore calls\n if (typeof window === 'undefined') {\n const { setSSRStore } = await import('./store.js');\n setSSRStore(store);\n }\n \n \n if (typeof window === 'undefined') {\n moduleRegistry.initialized.clear();\n moduleRegistry.modules.clear();\n moduleRegistry.loadingPromises.clear();\n }\n // // На сервере загружаем auth для SSR рендеринга (vue-app-renderer требует его)\n // const context = { app, store, router, config };\n // await moduleRegistry.load('globals', context);\n // await moduleRegistry.initialize('globals', context);\n // await moduleRegistry.load('auth', context);\n // await moduleRegistry.initialize('auth', context);\n // }\n \n const context = {\n app,\n store,\n router,\n config,\n ssr: true,\n };\n \n // Для SSR загружаем модули для текущего маршрута\n const requiredModules = moduleRegistry.getModulesForRoute(url);\n \n // Собираем имена модулей которые нужны для текущего роута\n const currentRouteModules = [];\n \n // Загружаем необходимые модули для SSR\n for (const module of requiredModules) {\n await moduleRegistry.load(module.name, context);\n await moduleRegistry.initialize(module.name, context);\n currentRouteModules.push(module.name);\n }\n \n // После загрузки модулей и регистрации роутов, выполняем навигацию\n await router.push(url);\n await router.isReady();\n \n const result = await appRenderer.render({\n url,\n cookies,\n createApp: () => ({ app, router, store, i18n, meta }),\n ssrContext\n });\n \n if (ssrContext?.modules) {\n result.usedModules = Array.from(ssrContext.modules);\n }\n \n // Передаем только модули текущего роута + критические модули\n // Это не реальные модули а метаданные для дегидратации\n const criticalModules = ['globals', 'auth', 'organizations', 'backoffice'];\n const allModulesForRoute = [...new Set([...criticalModules, ...currentRouteModules])];\n \n result.loadedModules = allModulesForRoute;\n \n return result;\n }\n \n // FOR SPA\n if (typeof window !== 'undefined' && process.env.MOBILE_APP) {\n createApp();\n }\n \n // FOR SSR / CLIENT ENTRY\n if (typeof window !== 'undefined' && !process.env.MOBILE_APP) {\n // Используем renderAndMountApp для правильной гидратации со state\n appRenderer.renderAndMountApp({ createApp, hooks }).then(({ app, router, store, moduleRegistry }) => {\n // Хук ПОСЛЕ гидратации\n if (hooks.afterHydration) {\n hooks.afterHydration({ app, router, store, moduleRegistry });\n }\n \n // Модули уже загружены в renderAndMountApp, просто ставим маркер\n if (typeof window !== 'undefined') {\n window.performance.mark('client-ready');\n }\n }).catch(error => {\n console.error('Hydration failed:', error);\n });\n }\n \n return { createApp, renderApp };\n }\n \n // Возвращаем промис, который резолвится с функциями\n return initializeApp();\n}"],"names":["createApp","createVueApp","createVueSSRApp","moduleRegistry"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
3
|
const vue = require("vue");
|
|
4
|
-
const Feed = require("../../../../../components/Feed/Feed.
|
|
4
|
+
const Feed = require("../../../../../components/Feed/Feed.vue2.cjs");
|
|
5
5
|
const BlockSearch = require("./BlockSearch.vue.cjs");
|
|
6
6
|
const Card = require("./Card.vue.cjs");
|
|
7
7
|
const clickOutside = require("../../../../../components/FieldPhone/click-outside.cjs");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, computed, watch, createElementBlock, openBlock, createCommentVNode, withDirectives, createElementVNode, normalizeClass, renderSlot, createTextVNode, toDisplayString, Fragment, renderList, createVNode, unref, withCtx } from "vue";
|
|
2
|
-
import _sfc_main$2 from "../../../../../components/Feed/Feed.
|
|
2
|
+
import _sfc_main$2 from "../../../../../components/Feed/Feed.vue2.js";
|
|
3
3
|
import _sfc_main$1 from "./BlockSearch.vue.js";
|
|
4
4
|
import _sfc_main$3 from "./Card.vue.js";
|
|
5
5
|
import clickOutside from "../../../../../components/FieldPhone/click-outside.js";
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
3
|
const vue = require("vue");
|
|
4
4
|
const IconSearch = require("../../../../icons/navigation/IconSearch.vue.cjs");
|
|
5
|
-
const Field = require("../../../../../components/Field/Field.
|
|
5
|
+
const Field = require("../../../../../components/Field/Field.vue2.cjs");
|
|
6
6
|
const _sfc_main = {
|
|
7
7
|
__name: "BlockSearch",
|
|
8
8
|
props: {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ref, watch, createBlock, openBlock, withCtx, createVNode } from "vue";
|
|
2
2
|
import _sfc_main$1 from "../../../../icons/navigation/IconSearch.vue.js";
|
|
3
|
-
import Field from "../../../../../components/Field/Field.
|
|
3
|
+
import Field from "../../../../../components/Field/Field.vue2.js";
|
|
4
4
|
const _sfc_main = {
|
|
5
5
|
__name: "BlockSearch",
|
|
6
6
|
props: {
|
|
@@ -3,7 +3,7 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
|
|
|
3
3
|
const vue = require("vue");
|
|
4
4
|
const vueRouter = require("vue-router");
|
|
5
5
|
const Tooltip = require("../../../../../components/Tooltip/Tooltip.vue2.cjs");
|
|
6
|
-
const Dropdown = require("../../../../../components/Dropdown/Dropdown.
|
|
6
|
+
const Dropdown = require("../../../../../components/Dropdown/Dropdown.vue.cjs");
|
|
7
7
|
const PlaceholderUserpic = require("../../../../icons/placeholders/PlaceholderUserpic.vue.cjs");
|
|
8
8
|
const PlaceholderOrganizationPic = require("../../../../icons/placeholders/PlaceholderOrganizationPic.vue.cjs");
|
|
9
9
|
const IconEllipsis = require("../../../../icons/navigation/IconEllipsis.vue.cjs");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { resolveComponent, createElementBlock, createCommentVNode, openBlock, createElementVNode, createBlock, withModifiers, resolveDynamicComponent, toDisplayString, withCtx, createTextVNode, Fragment, renderList, normalizeClass } from "vue";
|
|
2
2
|
import { useRouter } from "vue-router";
|
|
3
3
|
import _sfc_main$1 from "../../../../../components/Tooltip/Tooltip.vue2.js";
|
|
4
|
-
import _sfc_main$3 from "../../../../../components/Dropdown/Dropdown.
|
|
4
|
+
import _sfc_main$3 from "../../../../../components/Dropdown/Dropdown.vue.js";
|
|
5
5
|
import PlaceholderUserpic from "../../../../icons/placeholders/PlaceholderUserpic.vue.js";
|
|
6
6
|
import PlaceholderOrganizationPic from "../../../../icons/placeholders/PlaceholderOrganizationPic.vue.js";
|
|
7
7
|
import _sfc_main$4 from "../../../../icons/navigation/IconEllipsis.vue.js";
|
|
@@ -9,6 +9,7 @@ const Button = require("../../../../../components/Button/Button.vue.cjs");
|
|
|
9
9
|
const IconShopcartAdd = require("../../../../icons/actions/IconShopcartAdd.vue.cjs");
|
|
10
10
|
const PriceTotal = require("../../../../orders/components/elements/PriceTotal.vue.cjs");
|
|
11
11
|
const rents_store = require("../../../../rents/views/store/rents.store.cjs");
|
|
12
|
+
const mixins = require("../../mixins/mixins.cjs");
|
|
12
13
|
const _hoisted_1 = {
|
|
13
14
|
key: 0,
|
|
14
15
|
class: "flex w-100 mn-t-thin bg-light radius-small flex-center pd-thin mn-b-thin"
|
|
@@ -45,6 +46,7 @@ const _sfc_main = {
|
|
|
45
46
|
}
|
|
46
47
|
}
|
|
47
48
|
});
|
|
49
|
+
const { returnCurrency } = mixins.useGlobalMixins();
|
|
48
50
|
const selectedDates = vue.ref({ start: null, end: null });
|
|
49
51
|
const availabilityData = vue.ref([]);
|
|
50
52
|
const isLoading = vue.ref(false);
|
|
@@ -143,7 +145,7 @@ const _sfc_main = {
|
|
|
143
145
|
availabilityError.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2, vue.toDisplayString(availabilityError.value), 1)) : vue.createCommentVNode("", true),
|
|
144
146
|
vue.createVNode(PriceTotal.default, {
|
|
145
147
|
totalPrice: totalAmount.value,
|
|
146
|
-
currency:
|
|
148
|
+
currency: vue.unref(returnCurrency)(),
|
|
147
149
|
showFees: __props.showFees,
|
|
148
150
|
feesRate: __props.feesRate,
|
|
149
151
|
showVat: __props.showVat,
|
package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PopupDateSelector.vue.cjs","sources":["../../../../../../../../src/modules/globals/views/components/blocks/PopupDateSelector.vue"],"sourcesContent":["<template>\n <Popup @close-popup=\"closePopup\" :isPopupOpen=\"isOpen\" class=\"radius-medium tablet:w-min-30r pd-medium bg-white o-hidden\">\n <h5 class=\"w-100 t-center mn-b-small\">Select Rent Period</h5>\n <Calendar\n v-model:date=\"selectedDates\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n :availabilityData=\"availabilityData\"\n :showAvailability=\"false\"\n :lowAvailabilityThreshold=\"3\"\n :requiredQuantity=\"quantity\"\n class=\"bg-light radius-small\"\n :disabled=\"isLoading\"\n />\n <div v-if=\"isLoading\" class=\"flex w-100 mn-t-thin bg-light radius-small flex-center pd-thin mn-b-thin\">\n <Loader :centered=\"false\" />\n <span>Loading availability data...</span>\n </div>\n\n <div v-if=\"availabilityError\" class=\"pd-small t-error\">\n {{ availabilityError }}\n </div>\n \n <PriceTotal\n :totalPrice=\"totalAmount\"\n :currency=\"returnCurrency()\"\n :showFees=\"showFees\"\n :feesRate=\"feesRate\"\n :showVat=\"showVat\"\n :vatRate=\"vatRate\"\n />\n <Button\n @click=\"confirmSelection\"\n :disabled=\"!selectedDates.start || !selectedDates.end || isLoading || !isAvailable\"\n class=\"h-3r w-100 bg-main button\"\n >\n <div class=\"gap-thin flex flex-center flex-nowrap\">\n <IconShopcartAdd class=\"i-semi icon-button-main\" />\n <span>{{t('addtoorder')}}</span>\n </div>\n </Button>\n <Button\n v-if=\"showCancelButton\"\n @click=\"cancelSelection\"\n class=\"mn-t-thin h-3r w-100 t-white bg-red button\"\n >\n <span>{{ t('remove') }}</span>\n </Button>\n </Popup>\n</template>\n\n<script setup>\nimport { ref, computed, watch, onMounted } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Loader from '@martyrs/src/components/Loader/Loader.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport Button from '@martyrs/src/components/Button/Button.vue'\nimport IconShopcartAdd from '@martyrs/src/modules/icons/actions/IconShopcartAdd.vue'\nimport PriceTotal from '@martyrs/src/modules/orders/components/elements/PriceTotal.vue'\n// Import the store actions\nimport * as rents from '@martyrs/src/modules/rents/views/store/rents.store.js'\n\nconst props = defineProps({\n productId: { type: String, required: true },\n variantId: { type: String, required: true },\n quantity: { type: Number, default: 1 },\n price: { type: Number, required: true },\n isOpen: { type: Boolean, required: true },\n showFees: { type: Boolean, default: false },\n showVat: { type: Boolean, default: false },\n feesRate: { type: Number, default: 0 },\n vatRate: { type: Number, default: 0 },\n onConfirm: { type: Function, required: true },\n onCancel: { type: Function, default: null },\n showCancelButton: { type: Boolean, default: false }\n})\n\nconst emit = defineEmits(['close'])\nconst { t } = useI18n({\n messages: {\n en: {\n addtoorder: 'Add to Shopcart'\n }\n }\n})\n\nconst selectedDates = ref({ start: null, end: null })\nconst availabilityData = ref([])\nconst isLoading = ref(false)\nconst availabilityError = ref(null)\nconst isAvailable = ref(true)\n\n// Load availability data for the current month and next month\nasync function loadAvailabilityData() {\n if (!props.productId || !props.variantId) return;\n\n console.log('productId', props.productId)\n console.log('variantId', props.variantId)\n \n isLoading.value = true;\n availabilityError.value = null;\n \n try {\n const today = new Date();\n const start = new Date(today.getFullYear(), today.getMonth(), 1);\n const end = new Date(today.getFullYear(), today.getMonth() + 2, 0);\n \n const data = await rents.loadAvailability({\n productId: props.productId,\n variantId: props.variantId,\n startDate: start.toISOString().split('T')[0],\n endDate: end.toISOString().split('T')[0]\n });\n \n if (data && data.availability) {\n availabilityData.value = data.availability;\n }\n } catch (error) {\n console.error('Error loading availability data:', error);\n availabilityError.value = 'Failed to load availability data. Please try again.';\n } finally {\n isLoading.value = false;\n }\n}\n\n// Check availability for selected date range\nasync function checkAvailability() {\n if (!selectedDates.value.start || !selectedDates.value.end || !props.productId || !props.variantId) {\n isAvailable.value = false;\n return;\n }\n \n isLoading.value = true;\n availabilityError.value = null;\n \n try {\n const data = await rents.loadAvailability({\n productId: props.productId,\n variantId: props.variantId,\n startDate: selectedDates.value.start.split('T')[0],\n endDate: selectedDates.value.end.split('T')[0]\n });\n \n isAvailable.value = data.available >= props.quantity;\n \n if (!isAvailable.value) {\n availabilityError.value = `Insufficient quantity. Available: ${data.available}, needed: ${props.quantity}`;\n }\n } catch (error) {\n console.error('Error checking availability:', error);\n availabilityError.value = 'Failed to check availability. Please try again.';\n isAvailable.value = false;\n } finally {\n isLoading.value = false;\n }\n}\n\nfunction calculateDays(start, end) {\n if (!start || !end) return 0\n const startDate = new Date(start)\n const endDate = new Date(end)\n const diffTime = endDate - startDate\n const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1\n return diffDays > 0 ? diffDays : 0\n}\n\nconst numberOfDays = computed(() => calculateDays(selectedDates.value.start, selectedDates.value.end))\nconst totalAmount = computed(() => props.price * numberOfDays.value * props.quantity)\n\nfunction closePopup() {\n emit('close')\n}\n\nfunction confirmSelection() {\n if (selectedDates.value.start && selectedDates.value.end && isAvailable.value) {\n props.onConfirm(selectedDates.value)\n closePopup()\n }\n}\n\nfunction cancelSelection() {\n if (props.onCancel) {\n props.onCancel()\n }\n // Эмитим close-popup чтобы плагин закрыл попап\n emit('close-popup')\n}\n\nwatch([() => selectedDates.value.start, () => selectedDates.value.end], ([newStart, newEnd]) => {\n if (newStart && newEnd) {\n // checkAvailability();\n }\n}, { immediate: false });\n\nwatch(() => props.isOpen, (newVal) => {\n if (newVal) {\n loadAvailabilityData();\n } else {\n selectedDates.value = { start: null, end: null };\n availabilityError.value = null;\n }\n}, { immediate: true });\n\nonMounted(() => {\n if (props.isOpen) {\n loadAvailabilityData();\n }\n});\n</script>"],"names":["useI18n","ref","rents.loadAvailability","computed","watch","onMounted"],"mappings":"
|
|
1
|
+
{"version":3,"file":"PopupDateSelector.vue.cjs","sources":["../../../../../../../../src/modules/globals/views/components/blocks/PopupDateSelector.vue"],"sourcesContent":["<template>\n <Popup @close-popup=\"closePopup\" :isPopupOpen=\"isOpen\" class=\"radius-medium tablet:w-min-30r pd-medium bg-white o-hidden\">\n <h5 class=\"w-100 t-center mn-b-small\">Select Rent Period</h5>\n <Calendar\n v-model:date=\"selectedDates\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n :availabilityData=\"availabilityData\"\n :showAvailability=\"false\"\n :lowAvailabilityThreshold=\"3\"\n :requiredQuantity=\"quantity\"\n class=\"bg-light radius-small\"\n :disabled=\"isLoading\"\n />\n <div v-if=\"isLoading\" class=\"flex w-100 mn-t-thin bg-light radius-small flex-center pd-thin mn-b-thin\">\n <Loader :centered=\"false\" />\n <span>Loading availability data...</span>\n </div>\n\n <div v-if=\"availabilityError\" class=\"pd-small t-error\">\n {{ availabilityError }}\n </div>\n \n <PriceTotal\n :totalPrice=\"totalAmount\"\n :currency=\"returnCurrency()\"\n :showFees=\"showFees\"\n :feesRate=\"feesRate\"\n :showVat=\"showVat\"\n :vatRate=\"vatRate\"\n />\n <Button\n @click=\"confirmSelection\"\n :disabled=\"!selectedDates.start || !selectedDates.end || isLoading || !isAvailable\"\n class=\"h-3r w-100 bg-main button\"\n >\n <div class=\"gap-thin flex flex-center flex-nowrap\">\n <IconShopcartAdd class=\"i-semi icon-button-main\" />\n <span>{{t('addtoorder')}}</span>\n </div>\n </Button>\n <Button\n v-if=\"showCancelButton\"\n @click=\"cancelSelection\"\n class=\"mn-t-thin h-3r w-100 t-white bg-red button\"\n >\n <span>{{ t('remove') }}</span>\n </Button>\n </Popup>\n</template>\n\n<script setup>\nimport { ref, computed, watch, onMounted } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Loader from '@martyrs/src/components/Loader/Loader.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport Button from '@martyrs/src/components/Button/Button.vue'\nimport IconShopcartAdd from '@martyrs/src/modules/icons/actions/IconShopcartAdd.vue'\nimport PriceTotal from '@martyrs/src/modules/orders/components/elements/PriceTotal.vue'\n// Import the store actions\nimport * as rents from '@martyrs/src/modules/rents/views/store/rents.store.js'\nimport { useGlobalMixins } from '@martyrs/src/modules/globals/views/mixins/mixins.js'\n\nconst props = defineProps({\n productId: { type: String, required: true },\n variantId: { type: String, required: true },\n quantity: { type: Number, default: 1 },\n price: { type: Number, required: true },\n isOpen: { type: Boolean, required: true },\n showFees: { type: Boolean, default: false },\n showVat: { type: Boolean, default: false },\n feesRate: { type: Number, default: 0 },\n vatRate: { type: Number, default: 0 },\n onConfirm: { type: Function, required: true },\n onCancel: { type: Function, default: null },\n showCancelButton: { type: Boolean, default: false }\n})\n\nconst emit = defineEmits(['close'])\nconst { t } = useI18n({\n messages: {\n en: {\n addtoorder: 'Add to Shopcart'\n }\n }\n})\nconst { returnCurrency } = useGlobalMixins()\n\nconst selectedDates = ref({ start: null, end: null })\nconst availabilityData = ref([])\nconst isLoading = ref(false)\nconst availabilityError = ref(null)\nconst isAvailable = ref(true)\n\n// Load availability data for the current month and next month\nasync function loadAvailabilityData() {\n if (!props.productId || !props.variantId) return;\n\n console.log('productId', props.productId)\n console.log('variantId', props.variantId)\n \n isLoading.value = true;\n availabilityError.value = null;\n \n try {\n const today = new Date();\n const start = new Date(today.getFullYear(), today.getMonth(), 1);\n const end = new Date(today.getFullYear(), today.getMonth() + 2, 0);\n \n const data = await rents.loadAvailability({\n productId: props.productId,\n variantId: props.variantId,\n startDate: start.toISOString().split('T')[0],\n endDate: end.toISOString().split('T')[0]\n });\n \n if (data && data.availability) {\n availabilityData.value = data.availability;\n }\n } catch (error) {\n console.error('Error loading availability data:', error);\n availabilityError.value = 'Failed to load availability data. Please try again.';\n } finally {\n isLoading.value = false;\n }\n}\n\n// Check availability for selected date range\nasync function checkAvailability() {\n if (!selectedDates.value.start || !selectedDates.value.end || !props.productId || !props.variantId) {\n isAvailable.value = false;\n return;\n }\n \n isLoading.value = true;\n availabilityError.value = null;\n \n try {\n const data = await rents.loadAvailability({\n productId: props.productId,\n variantId: props.variantId,\n startDate: selectedDates.value.start.split('T')[0],\n endDate: selectedDates.value.end.split('T')[0]\n });\n \n isAvailable.value = data.available >= props.quantity;\n \n if (!isAvailable.value) {\n availabilityError.value = `Insufficient quantity. Available: ${data.available}, needed: ${props.quantity}`;\n }\n } catch (error) {\n console.error('Error checking availability:', error);\n availabilityError.value = 'Failed to check availability. Please try again.';\n isAvailable.value = false;\n } finally {\n isLoading.value = false;\n }\n}\n\nfunction calculateDays(start, end) {\n if (!start || !end) return 0\n const startDate = new Date(start)\n const endDate = new Date(end)\n const diffTime = endDate - startDate\n const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1\n return diffDays > 0 ? diffDays : 0\n}\n\nconst numberOfDays = computed(() => calculateDays(selectedDates.value.start, selectedDates.value.end))\nconst totalAmount = computed(() => props.price * numberOfDays.value * props.quantity)\n\nfunction closePopup() {\n emit('close')\n}\n\nfunction confirmSelection() {\n if (selectedDates.value.start && selectedDates.value.end && isAvailable.value) {\n props.onConfirm(selectedDates.value)\n closePopup()\n }\n}\n\nfunction cancelSelection() {\n if (props.onCancel) {\n props.onCancel()\n }\n // Эмитим close-popup чтобы плагин закрыл попап\n emit('close-popup')\n}\n\nwatch([() => selectedDates.value.start, () => selectedDates.value.end], ([newStart, newEnd]) => {\n if (newStart && newEnd) {\n // checkAvailability();\n }\n}, { immediate: false });\n\nwatch(() => props.isOpen, (newVal) => {\n if (newVal) {\n loadAvailabilityData();\n } else {\n selectedDates.value = { start: null, end: null };\n availabilityError.value = null;\n }\n}, { immediate: true });\n\nonMounted(() => {\n if (props.isOpen) {\n loadAvailabilityData();\n }\n});\n</script>"],"names":["useI18n","useGlobalMixins","ref","rents.loadAvailability","computed","watch","onMounted"],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import _sfc_main$3 from "../../../../../components/Button/Button.vue.js";
|
|
|
7
7
|
import _sfc_main$4 from "../../../../icons/actions/IconShopcartAdd.vue.js";
|
|
8
8
|
import _sfc_main$2 from "../../../../orders/components/elements/PriceTotal.vue.js";
|
|
9
9
|
import { loadAvailability } from "../../../../rents/views/store/rents.store.js";
|
|
10
|
+
import { useGlobalMixins } from "../../mixins/mixins.js";
|
|
10
11
|
const _hoisted_1 = {
|
|
11
12
|
key: 0,
|
|
12
13
|
class: "flex w-100 mn-t-thin bg-light radius-small flex-center pd-thin mn-b-thin"
|
|
@@ -43,6 +44,7 @@ const _sfc_main = {
|
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
46
|
});
|
|
47
|
+
const { returnCurrency } = useGlobalMixins();
|
|
46
48
|
const selectedDates = ref({ start: null, end: null });
|
|
47
49
|
const availabilityData = ref([]);
|
|
48
50
|
const isLoading = ref(false);
|
|
@@ -141,7 +143,7 @@ const _sfc_main = {
|
|
|
141
143
|
availabilityError.value ? (openBlock(), createElementBlock("div", _hoisted_2, toDisplayString(availabilityError.value), 1)) : createCommentVNode("", true),
|
|
142
144
|
createVNode(_sfc_main$2, {
|
|
143
145
|
totalPrice: totalAmount.value,
|
|
144
|
-
currency:
|
|
146
|
+
currency: unref(returnCurrency)(),
|
|
145
147
|
showFees: __props.showFees,
|
|
146
148
|
feesRate: __props.feesRate,
|
|
147
149
|
showVat: __props.showVat,
|