@ozdao/martyrs 0.2.583 → 0.2.585
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.js +2 -0
- package/dist/{main-vq1_XpmQ.js → main-xL-jtBkT.js} +12 -11
- package/dist/martyrs/dist/{main-vq1_XpmQ.js → main-xL-jtBkT.js} +3 -2
- package/dist/martyrs/dist/main-xL-jtBkT.js.map +1 -0
- package/dist/martyrs/dist/{web-BNJDRie_.js → web-BA6h6Z8P.js} +2 -2
- package/dist/martyrs/dist/{web-BNJDRie_.js.map → web-BA6h6Z8P.js.map} +1 -1
- package/dist/martyrs/src/components/Button/{Button.vue.js → Button.vue2.js} +3 -3
- package/dist/martyrs/src/components/Button/Button.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Calendar/Calendar.vue2.js +5 -5
- package/dist/martyrs/src/components/Calendar/Calendar.vue2.js.map +1 -1
- package/dist/martyrs/src/components/Feed/Carousel.vue.js +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
- package/dist/martyrs/src/components/Field/Field.vue.js +2 -2
- package/dist/martyrs/src/components/Field/Field.vue.js.map +1 -1
- package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +2 -2
- package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js.map +1 -1
- package/dist/martyrs/src/components/FieldDate/FieldDate.vue.js +2 -2
- package/dist/martyrs/src/components/FieldDate/FieldDate.vue.js.map +1 -1
- package/dist/martyrs/src/components/Loader/{Loader.vue2.js → Loader.vue.js} +2 -2
- package/dist/martyrs/src/components/Loader/Loader.vue.js.map +1 -0
- package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue.js +1 -1
- package/dist/martyrs/src/components/Media/Media.vue.js +1 -1
- package/dist/martyrs/src/components/Menu/{Menu.vue2.js → Menu.vue.js} +2 -2
- package/dist/martyrs/src/components/Menu/Menu.vue.js.map +1 -0
- package/dist/martyrs/src/components/Select/{Select.vue2.js → Select.vue.js} +2 -2
- package/dist/martyrs/src/components/Select/Select.vue.js.map +1 -0
- package/dist/martyrs/src/components/UploadImage/UploadImage.vue.js +1 -1
- package/dist/martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +61 -42
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
- package/dist/martyrs/src/modules/backoffice/backoffice.client.js +3 -15
- package/dist/martyrs/src/modules/backoffice/backoffice.client.js.map +1 -1
- package/dist/martyrs/src/modules/backoffice/configs/navigation.backoffice.config.js +99 -0
- package/dist/martyrs/src/modules/backoffice/configs/navigation.backoffice.config.js.map +1 -0
- package/dist/martyrs/src/modules/backoffice/{backoffice.router.js → router/backoffice.router.js} +9 -7
- package/dist/martyrs/src/modules/backoffice/router/backoffice.router.js.map +1 -0
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js +3 -3
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +8 -2
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
- package/dist/martyrs/src/modules/core/core.client.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/classes/core.app.js +5 -1
- package/dist/martyrs/src/modules/core/views/classes/core.app.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js +2 -2
- package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/PopupAuth.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/PopupDateSelector.vue.js +2 -2
- package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js +22 -28
- package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/pages/404.vue.js +76 -7
- package/dist/martyrs/src/modules/core/views/components/pages/404.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js +3 -3
- package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/NavigationBar.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Sidebar.vue.js +2 -2
- package/dist/martyrs/src/modules/core/views/components/partials/Sidebar.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue2.js +3 -3
- package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue2.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/store/core.store.js +1 -0
- package/dist/martyrs/src/modules/core/views/store/core.store.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/utils/vue-app-renderer.js +2 -1
- package/dist/martyrs/src/modules/core/views/utils/vue-app-renderer.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +2 -2
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +3 -3
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +2 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/sections/EditTickets.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/sections/Feed.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/sections/List.vue.js +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +3 -3
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +2 -2
- package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +2 -2
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.js +4 -4
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/blocks/ActionButtons.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +3 -3
- package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +7 -7
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/FullscreenPlayer.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/PlayerControls.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +1 -1
- package/dist/martyrs/src/modules/notifications/components/sections/NotificationPreferences.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/router/orders.router.js +23 -0
- package/dist/martyrs/src/modules/orders/router/orders.router.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +4 -3
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +2 -2
- package/dist/martyrs/src/modules/pages/pages.router.js +7 -5
- package/dist/martyrs/src/modules/pages/pages.router.js.map +1 -1
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
- package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +2 -2
- package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/elements/Image360.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +2 -2
- package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js.map +1 -1
- package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +2 -2
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +3 -3
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js.map +1 -1
- package/dist/martyrs.css +1 -1
- package/dist/martyrs.es.js +1 -1
- package/dist/style.css +38 -33
- package/dist/{web-BNJDRie_.js → web-BA6h6Z8P.js} +1 -1
- package/package.json +1 -1
- package/src/builder/modes/ssr.rspack.dev.js +2 -0
- package/src/components/Calendar/Calendar.vue +4 -4
- package/src/components/Completion/Completion.vue +3 -3
- package/src/components/Field/Field.vue +1 -1
- package/src/components/FieldBig/FieldBig.vue +1 -1
- package/src/components/FieldDate/FieldDate.vue +1 -1
- package/src/modules/auth/views/components/pages/Profile.vue +33 -5
- package/src/modules/backoffice/backoffice.client.js +1 -25
- package/src/modules/backoffice/configs/navigation.backoffice.config.js +99 -0
- package/src/modules/backoffice/router/backoffice.router.js +8 -7
- package/src/modules/community/components/layouts/Community.vue +2 -2
- package/src/modules/community/components/pages/BlogPost.vue +9 -1
- package/src/modules/core/core.client.js +1 -0
- package/src/modules/core/views/classes/core.app.js +8 -3
- package/src/modules/core/views/components/blocks/CardHeader.vue +1 -1
- package/src/modules/core/views/components/layouts/Client.vue +41 -42
- package/src/modules/core/views/components/pages/404.vue +55 -3
- package/src/modules/core/views/components/partials/Header.vue +1 -1
- package/src/modules/core/views/components/partials/Sidebar.vue +1 -1
- package/src/modules/core/views/components/sections/Filters.vue +2 -2
- package/src/modules/core/views/components/sections/SectionPageTitle.vue +1 -1
- package/src/modules/core/views/store/core.store.js +1 -0
- package/src/modules/core/views/utils/vue-app-renderer.js +9 -1
- package/src/modules/events/components/pages/EditEventTickets.vue +2 -2
- package/src/modules/gallery/components/sections/BackofficeGallery.vue +1 -1
- package/src/modules/inventory/components/pages/Inventory.vue +4 -4
- package/src/modules/inventory/components/pages/InventoryEdit.vue +1 -1
- package/src/modules/music/components/pages/Playlist.vue +5 -5
- package/src/modules/orders/router/orders.router.js +33 -0
- package/src/modules/organizations/components/blocks/CardOrganization.vue +1 -1
- package/src/modules/pages/pages.router.js +4 -2
- package/src/modules/pages/views/components/pages/PageEdit.vue +2 -2
- package/src/modules/pages/views/components/partials/SidebarPages.vue +1 -1
- package/src/modules/pages/views/router/pages.backoffice.router.js +4 -3
- package/src/modules/products/components/pages/Products.vue +1 -1
- package/src/modules/products/components/sections/EditDiscounts.vue +1 -1
- package/src/modules/products/components/sections/ProductConfigurator.vue +1 -1
- package/src/modules/spots/components/pages/Spots.vue +1 -1
- package/src/modules/wallet/views/components/blocks/CryptoDeposit.vue +1 -1
- package/src/modules/wallet/views/components/pages/Wallet.vue +1 -1
- package/dist/martyrs/dist/main-vq1_XpmQ.js.map +0 -1
- package/dist/martyrs/src/components/Button/Button.vue.js.map +0 -1
- package/dist/martyrs/src/components/Loader/Loader.vue2.js.map +0 -1
- package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +0 -1
- package/dist/martyrs/src/components/Select/Select.vue2.js.map +0 -1
- package/dist/martyrs/src/modules/backoffice/backoffice.router.js.map +0 -1
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js +0 -150
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js.map +0 -1
- package/src/modules/backoffice/backoffice.router.js +0 -69
- package/src/modules/backoffice/components/partials/Sidebar.vue +0 -165
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Client.vue.js","sources":["../../../../../../../../src/modules/core/views/components/layouts/Client.vue"],"sourcesContent":["<template>\n\t<div \n\t\tid=\"app-wrapper\"\n\t\tclass=\"flex flex-column h-100 w-100 pos-relative o-hidden\"\n\t\t:class=\"{\n\t\t\t[(route.name \n ? route.name.replace(/\\s+/g, '_') \n : route.path.replace(/\\W+/g, '_')\n ).toLowerCase()]: true,\n \t\t'pd-t-big': MOBILE_APP === 'ios', \n\t\t\t'bg-white': headerTheme === 'light',\n\t\t\t'bg-black': headerTheme === 'dark',\n \t}\"\n\t>\n\t\t<transition name=\"moveFromTop\" appear>\n\t\t\t<Loader v-if=\"!page || store.core.state.loading\" :centered=\"true\" class=\"pos-fixed\"/>\n\t\t</transition>\n\n\t <transition \n\t name=\"moveFromTop\" \n\t mode=\"out-in\"\n\t >\n\t <section \n\t v-if=\"FirstUse && route.meta.walkthrough\"\n\t class=\"w-100 h-100\" \n\t >\n\t <component \n\t :is=\"route.meta.walkthrough\"\n\t name=\"Walkthrough\"\n\t @updateFirstUse=\"updateFirstUse\" \n\t :slides=\"[1,2,3]\" \n\t class=\"tab\"\n\t >\n\t </component>\n\t </section>\n\t </transition>\n\n <component\n\t\t\tv-if=\"!MOBILE_APP && route.meta.header\"\n ref=\"header\" \n :is=\"route.meta.header\"\n :theme=\"headerTheme\"\n :logotype=\"route.meta.logotype\"\n :location=\"route.meta.location\"\n :class=\"{\n \t'header-scrolled': scrollOffset > 50 \n }\"\n >\n \t<component\n\t\t v-if=\"route.meta?.header_navigation\"\n\t\t :is=\"route.meta.header_navigation\"\n\t\t :horizontal=\"true\"\n\t\t\t\t:navigationItems=\"route.meta.header_navigation_items\"\n\t\t\t\t:stateSidebar=\"store.core.state.isOpenSidebar\"\n\t\t\t\t:theme=\"headerTheme\"\n\t\t />\n \t</component>\n\n\t\t<transition name=\"moveFromTop\" mode=\"out-in\" appear>\n\t\t\t<component\n \tv-if=\"MOBILE_APP && !route.meta.hideNavigationBar\"\n :is=\"route.meta.navigationbar\"\n :logotype=\"route.meta.logotype\"\n :navigationItems=\"route.meta.sidebar_navigation_items\"\n\t :stateSidebar=\"store.core.state.isOpenSidebar\"\n />\n\t\t</transition>\n\n\t <Popup\n\t \t@close-popup=\"closeLocationPopup\"\n\t \t:isPopupOpen=\"store.core.state.isOpenLocationPopup\"\n\t \tclass=\"bg-white pd-semi w-m-33r radius-big\"\n\t >\n\t \t<LocationSelection />\n\t </Popup>\n\n\t <!-- class=\"flex flex-nowrap ease-in-out o-hidden pos-relative\" -->\n\t\t<section \n\t\t\tid=\"screen\" \n\t\t\tref=\"screen\"\n\t\t\tclass=\"flex flex-nowrap h-100 pos-relative o-hidden ease-in-out\"\n\t\t\t:class=\"{\n\t\t\t\t'': MOBILE_APP === 'ios',\n }\"\n\t\t>\n\t\t\t<ShopCart \n\t\t\t\t:class=\"{\n\t\t\t\t\t'mobile:pd-t-extra': MOBILE_APP === 'ios', \n\t\t\t\t}\"\n\t\t\t/>\n\t <component\n\t v-if=\"route.meta?.sidebar\"\n\t :is=\"route.meta.sidebar\"\n\t :stateSidebar=\"store.core.state.isOpenSidebar\"\n\t :widthHidden='route.meta?.sidebar_width_hidden'\n\t :width=\"route.meta?.sidebar_width\"\n\t :theme=\"headerTheme\"\n\t @closeSidebar=\"() => store.core.state.isOpenSidebar = false\"\n\t >\n\t \t<!-- Header slot -->\n\t \t<template #header>\n\t \t\t<component\n\t \t\t\tv-if=\"route.meta?.sidebar_header_component\"\n\t \t\t\t:is=\"route.meta.sidebar_header_component\"\n\t \t\t\t:theme=\"headerTheme\"\n\t \t\t/>\n\t \t</template>\n\n\t \t<!-- Navigation (default slot) -->\n\t \t<transition name=\"moveFromTop\" mode=\"out-in\">\n\t\t <component\n\t\t v-if=\"route.meta?.sidebar_navigation\"\n\t\t :is=\"route.meta.sidebar_navigation\"\n\t\t :key=\"route.meta.sidebar_navigation\"\n\t\t :navigationItems=\"route.meta.sidebar_navigation_items\"\n\t\t\t :stateSidebar=\"store.core.state.isOpenSidebar\"\n\t\t\t\t\t\t:theme=\"headerTheme\"\n\t\t />\n\t </transition>\n\n\t <!-- Footer slot -->\n\t \t<template #footer>\n\t \t\t<component\n\t \t\t\tv-if=\"route.meta?.sidebar_footer_component\"\n\t \t\t\t:is=\"route.meta.sidebar_footer_component\"\n\t \t\t\t:theme=\"headerTheme\"\n\t \t\t/>\n\t \t</template>\n\t </component>\n\t\t <!-- rows-[minmax(0,1fr)] z-index-1 pos-relative w-100 h-100 -->\n\t\t <div class=\"rows-[minmax(0,1fr)] z-index-1 pos-relative w-100 h-100\">\n\t\t \t<div id=\"scrollview\" ref=\"scrollview\" @scroll=\"handleScroll\" class=\"o-y-scroll o-x-hidden h-100\">\n\t \t\t\t<Status\n\t \t\t\t\tv-if=\"store.core.state.error.show\"\n\t\t\t\t\t\t:data=\"store.core.state.error\"\n\t\t\t\t\t\t@close=\"store.core.state.error.show = false\"\n\t\t\t\t\t\tclass=\"z-index-7\"\n\t\t\t\t\t/>\n\t\t\t\t\t<Snack\n\t \t\t\t\tv-if=\"store.core.state.snack.show\"\n\t\t\t\t\t\t:type=\"store.core.state.snack.type\"\n\t\t\t\t\t\t:message=\"store.core.state.snack.message\"\n\t\t\t\t\t\t:show=\"store.core.state.snack.show\"\n\t\t\t\t\t\t@close=\"store.core.state.snack.show = false\"\n\t\t\t\t\t\tclass=\"z-index-7\"\n\t\t\t\t\t/>\n\t\t\t\t\t<div class=\"h-min-100 pos-relative w-100\">\n\t\t\t\t\t\t<!-- <section v-if=\"!route.meta?.breadcrumbs?.hide\" class=\"pd-thin pd-b-zero\">\n\t\t\t\t\t\t\t<Breadcrumbs \n\t\t\t\t\t\t\t\tv-if=\"!MOBILE_APP\"\n\t\t\t\t\t\t\t\tclass=\"bg-light pd-small radius-small\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</section> -->\n\n\t\t\t\t \t\t<Suspense @resolve=\"onSuspenseResolved\">\n\t\t\t\t\t\t\t<router-view \n\t\t\t\t\t\t\t\tid=\"view\"\n\t\t\t\t\t\t\t\tv-slot=\"{ Component, route }\" \n\t\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t\t'scroll-hide': MOBILE_APP,\n\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t\tclass=\"h-min-100 pos-relative w-100\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<transition @before-enter=\"scrollTop\" name=\"scaleTransition\" mode=\"out-in\" appear>\n\t\t\t\t\t \t<component \n\t\t\t\t\t \t\tref=\"page\" \n\t\t\t\t\t \t\t:is=\"Component\" \n\t\t\t\t\t \t\tclass=\"w-100 h-min-100\"\n\t\t\t\t \t\t \t@page-loading=\"handlePageLoading\"\n\t\t\t @page-loaded=\"handlePageLoaded\"\n\t\t\t :key=\"componentKey\"\n\t\t\t\t\t \t/>\n\t\t\t\t\t \t<!-- Key пока выключил непонятно какие проблемы это вызовет -->\n\t\t\t\t\t \t<!-- :key=\"route.path\" -->\n\t\t\t\t\t </transition>\n\t\t\t\t\t\t </router-view>\n\t\t\t\t\t\t</Suspense>\n\t\t\t\t </div>\n\t\t\t \n\t\t\t \t<transition @before-enter=\"scrollTop\" name=\"scaleTransition\" mode=\"out-in\" appear>\n\t\t <component\n\t\t\t\t\t\t\tv-if=\"!MOBILE_APP && route.meta.footer && !route.meta.hideFooter && page && !store.core.state.loading\"\n\t\t\t\t ref=\"footer\"\n\t\t\t\t :is=\"route.meta.footer\"\n\t\t\t\t :theme=\"route.meta.footer_theme || 'light'\"\n\t\t\t\t :logotype=\"route.meta.logotype\"\n\t\t\t\t :location=\"route.meta.location\"\n\t\t\t\t />\n\t\t\t \t</transition>\n\n\t\t\t\t\t<component\n\t\t\t v-if=\"route.meta.player\"\n\t\t\t id=\"player-wrapper\"\n\t\t\t class=\"z-index-2 \"\n\t\t\t \t:is=\"route.meta.player\"\n\t\t\t />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</section>\n\n\n\t\t<router-view \n\t\t\tname=\"defaultBottom\"\n\t\t\tv-slot=\"{ Component, route }\" \n\t\t>\n\t\t\t<component \n \t\t:is=\"Component\" \n \t/>\n\t\t</router-view>\n\n <component \n v-if=\"MOBILE_APP && route.meta.title_hide\"\n class=\"z-index-2\"\n \t:is=\"route.meta.bottombar\"\n />\n\n\n\t</div>\n</template>\n\n\n\n<script setup>\n\timport { computed, ref, onMounted } from 'vue';\n\t// Router\n\timport { useRoute } from 'vue-router';\n\t// Store\n\timport { useStore } from '@martyrs/src/modules/core/views/store/core.store.js';\n\timport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\t// Partials\n\timport Status from '@martyrs/src/components/Status/Status.vue';\n\timport Snack from '@martyrs/src/components/Status/Snack.vue';\n\timport Popup from '@martyrs/src/components/Popup/Popup.vue';\n\timport Breadcrumbs from '@martyrs/src/components/Breadcrumbs/Breadcrumbs.vue'\n\timport Loader from '@martyrs/src/components/Loader/Loader.vue';\n\n\timport NavigationBar from '@martyrs/src/modules/core/views/components/partials/NavigationBar.vue';\n\timport LocationSelection from '@martyrs/src/modules/core/views/components/partials/LocationSelection.vue';\n\n\timport ShopCart from '@martyrs/src/modules/orders/components/partials/ShopCart.vue';\n\t// PROPS\n\tconst props = defineProps({\n env: {\n type: Object,\n required: true\n },\n app: {\n type: Object,\n required: true\n },\n modules: {\n type: Object,\n required: true\n }\n })\n\n\tconst store = useStore()\n\n\t/////////////////////////////\n // LOADING\n /////////////////////////////\n // State\n let show = ref(false)\n // Preloader\n const page = ref(null)\n const scrollview = ref(null)\n\n // isPageLoading убран - используем core.state.loading\n \n // Обработчики событий загрузки\n function handlePageLoading() {\n store.core.state.loading = true;\n }\n\n function handlePageLoaded() {\n store.core.state.loading = false;\n }\n\n // Обработка события разрешения Suspense (когда async setup компонента завершается)\n function onSuspenseResolved() {\n // Если страница не отправляет событие page-loaded, этот обработчик\n // может служить запасным вариантом для отключения лоадера\n // Можно оставить закомментированным, если все страницы будут явно вызывать handlePageLoaded\n store.core.state.loading = false;\n }\n\t/////////////////////////////\n\t// CREATED\n\t/////////////////////////////\n\tconst route = useRoute()\n\t// const router = useRouter()\n\n\t// Инициализация sidebar для SSR + первая загрузка\n\tif (route.meta?.sidebarOpenOnEnter === true) {\n\t\tstore.core.state.isOpenSidebar = true\n\t}\n\n\t// Ref Code\n\tconst referalCode = ref(route.query.referalCode);\n\t/////////////////////////////\n\t// Methods\n\t/////////////////////////////\n\tfunction closeLocationPopup() {\n\t store.core.state.isOpenLocationPopup = false;\n\t}\n\tfunction scrollTop(){\n\t\tif (scrollview.value) scrollview.value.scrollTop = 0;\n\t}\n\t// Scrolling header\n\tconst scrollOffset = ref(0)\n\tlet isScrolled = false\n\tconst header = ref(null)\n\n\tconst headerTheme = computed(() => {\n\t\tif (scrollOffset.value > 50) {\n\t\t\treturn route.meta.header_theme || 'light'\n\t\t} else {\n\t\t\treturn route.meta.header_theme || 'light'\n\t\t}\n\t})\n\n\tconst handleScroll = () => {\n\t scrollOffset.value = event.target.scrollTop\n\t};\n/////////////////////////////\n // FIRST USE\n /////////////////////////////\n const FirstUse = ref(false);\n\n import { Preferences } from '@capacitor/preferences';\n\n async function getFirstUse() {\n const ret = await Preferences.get({ key: 'first-use' });\n FirstUse.value = ret.value ? JSON.parse(ret.value) : true;\n }\n\n const updateFirstUse = (value) => {\n FirstUse.value = value;\n }\n\n\tconst { isPhone, isTablet } = useGlobalMixins();\n\n\tonMounted(async () => {\n\t await getFirstUse()\n\n\t\t// Закрываем sidebar на mobile (CSS уже скрыл визуально)\n\t\tif ((isPhone() || isTablet()) && store.core.state.isOpenSidebar) {\n\t\t\tstore.core.state.isOpenSidebar = false\n\t\t}\n\n\t\t// Регистрация единого Service Worker (PWA + push notifications)\n\t\tif ('serviceWorker' in navigator && !window.__MOBILE_APP__) {\n\t \twindow.addEventListener('load', () => {\n\t \tnavigator.serviceWorker.register('/sw.js').then(registration => {\n\t \tconsole.log('Unified SW registered: ', registration);\n\t \t}).catch(registrationError => {\n\t \tconsole.log('SW registration failed: ', registrationError);\n\t \t});\n\t });\n\t \t}\n\n\t\tif (!store.core.state.position && route.meta.location) {\n store.core.state.isOpenLocationPopup = true;\n } else {\n store.core.state.isOpenLocationPopup = false;\n }\n\n\t\tif (referalCode.value) {\n\t\t localStorage.setItem('referalCode', referalCode.value);\n\t\t}\n\n\t\tif (page.value) show.value = true\n\t});\n\n\tconst componentKey = computed(() => {\n\t // Собираем только значимые параметры (ID сущностей)\n\t const significantParams = ['_id', 'product', 'organization', 'categoryPath', 'country', 'state', 'city']\n\t .map(param => route.params[param])\n\t .filter(Boolean)\n\t .join('-');\n\n\t return significantParams || route.name;\n\t});\n</script>\n\n<style lang=\"scss\">\n\t.fade-enter-active, .fade-leave-active {\n\t transition: opacity .5s;\n\t}\n\t.fade-enter, .fade-leave-to /* .fade-leave-active в версии 2.1.8+ */ {\n\t opacity: 0;\n\t}\n\n\t\n .fade-move,\n .fade-enter-active,\n .fade-leave-active {\n transition: all 0.5s cubic-bezier(0.55, 0, 0.1, 1);\n }\n\n /* 2. declare enter from and leave to state */\n .fade-enter-from,\n .fade-leave-to {\n opacity: 0;\n transform: translate(30px, 0);\n }\n\n /* 3. ensure leaving items are taken out of layout flow so that moving\n animations can be calculated correctly. */\n .fade-leave-active {\n position: absolute;\n }\n\n.moveFromTop-enter-active,\n.moveFromTop-leave-active {\n transition: all 0.3s ease, max-height 0.2s ease;\n overflow: hidden;\n}\n\n.moveFromTop-enter-from,\n.moveFromTop-leave-to {\n transform: translateY(-1rem);\n opacity: 0;\n // max-height: 0;\n}\n\n.moveFromTop-enter-to,\n.moveFromTop-leave-from {\n // max-height: 100vh; \n}\n\n\t.moveFromTopAbsolute-enter-active,\n\t.moveFromTopAbsolute-leave-active {\n\t\ttransform: translateY(0);\n\t\topacity: 1;\n\t\ttransition: all 0.5s ease; \n\t\t\n\t}\n\t.moveFromTopAbsolute-enter-from,\n\t.moveFromTopAbsolute-leave-to {\n\t\tposition: absolute;\n\t\ttransform: translateY(-1rem);\n\t\topacity: 0;\n\t\ttransition: all 0.5s ease;\n\t}\n\t.ScaleOut-enter-active,\n\t.ScaleOut-leave-active {\n\t\topacity: 1;\n\t\ttransform: scale(1);\n\t\ttransition: all 0.3s ease; \n\t\t\n\t}\n\t.ScaleOut-enter-from,\n\t.ScaleOut-leave-to {\n\t\topacity: 0;\n\t\ttransform: scale(0.9);\n\t\ttransition: all 0.3s ease;\n\t}\n\t.slide-fade-enter-active {\n\t\t// min-height: 100vh;\n\t transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n\t}\n\n\t.slide-fade-leave-active {\n\t\t// min-height: 100vh;\n\t transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n\t}\n\n\t.slide-fade-enter-from,\n\t.slide-fade-leave-to {\n\t\tmin-height: 0;\n\t transform: translateX(20px);\n\t opacity: 0;\n\t left: 0;\n\t top: 0;\n\t}\n\n\t.scaleTransition-5px-enter-active,\n .scaleTransition-5px-leave-active {\n transform: translateY(0px); \n opacity: 1;\n z-index: 1;\n transition: all 0.2s ease;\n }\n\n .scaleTransition-5px-enter-from,\n .scaleTransition-5px-leave-to {\n opacity: 0;\n z-index: 0;\n position: absolute;\n transform: translateY(-30px); \n transition: all 0.2s ease;\n }\n\n .scaleTransition-enter-from,\n .scaleTransition-leave-to {\n opacity: 0;\n z-index: 0;\n position: absolute;\n width: inherit;\n height: inherit;\n display: block;\n transform: translateY(30px); \n transition: all 0.5s ease;\n }\n\n .scaleTransition-enter-active,\n .scaleTransition-leave-active {\n transform: translateY(0px); \n opacity: 1;\n z-index: 1;\n transition: all 0.5s ease;\n }\n .scaleTransition-enter-from,\n .scaleTransition-leave-to {\n opacity: 0;\n z-index: 0;\n position: absolute;\n width: inherit;\n height: inherit;\n display: block;\n transform: translateY(30px); \n transition: all 0.5s ease;\n }\n\n .scaleIn-enter-active,\n .scaleIn-leave-active {\n // background: red;\n transition: all 0.5s ease;\n > section,div { transform-origin: 0 0; transform: translateZ(0px); transition: all 0.5s ease; }\n }\n .scaleIn-enter-from,\n .scaleIn-leave-to {\n opacity: 0;\n transform: scale(0.95);\n > section,div { transform: translateZ(-30px); transition: all 0.5s ease; }\n }\n\n\n</style>"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Client.vue.js","sources":["../../../../../../../../src/modules/core/views/components/layouts/Client.vue"],"sourcesContent":["<template>\n\t<div \n\t\tid=\"app-wrapper\"\n\t\tclass=\"flex flex-column h-100 w-100 pos-relative o-hidden\"\n\t\t:class=\"{\n\t\t\t[(route.name \n ? route.name.replace(/\\s+/g, '_') \n : route.path.replace(/\\W+/g, '_')\n ).toLowerCase()]: true,\n \t\t'pd-t-big': MOBILE_APP === 'ios', \n\t\t\t'bg-white': headerTheme === 'light',\n\t\t\t'bg-black': headerTheme === 'dark',\n \t}\"\n\t>\n\t\t<transition name=\"moveFromTop\" appear>\n\t\t\t<Loader v-if=\"!page || store.core.state.loading\" :centered=\"true\" class=\"pos-fixed z-index-10\"/>\n\t\t</transition>\n\n\t <transition \n\t name=\"moveFromTop\" \n\t mode=\"out-in\"\n\t >\n\t <section \n\t v-if=\"FirstUse && route.meta.walkthrough\"\n\t class=\"w-100 h-100\" \n\t >\n\t <component \n\t :is=\"route.meta.walkthrough\"\n\t name=\"Walkthrough\"\n\t @updateFirstUse=\"updateFirstUse\" \n\t :slides=\"[1,2,3]\" \n\t class=\"tab\"\n\t >\n\t </component>\n\t </section>\n\t </transition>\n\n <component\n\t\t\tv-if=\"!MOBILE_APP && route.meta.header\"\n ref=\"header\" \n :is=\"route.meta.header\"\n :theme=\"headerTheme\"\n :logotype=\"route.meta.logotype\"\n :location=\"route.meta.location\"\n :class=\"{\n \t'header-scrolled': scrollOffset > 50 \n }\"\n >\n \t<component\n\t\t v-if=\"route.meta?.header_navigation\"\n\t\t :is=\"route.meta.header_navigation\"\n\t\t :horizontal=\"true\"\n\t\t\t\t:navigationItems=\"route.meta.header_navigation_items\"\n\t\t\t\t:stateSidebar=\"store.core.state.isOpenSidebar\"\n\t\t\t\t:theme=\"headerTheme\"\n\t\t />\n \t</component>\n\n\t\t<transition name=\"moveFromTop\" mode=\"out-in\" appear>\n\t\t\t<component\n \tv-if=\"MOBILE_APP && !route.meta.hideNavigationBar\"\n :is=\"route.meta.navigationbar\"\n :logotype=\"route.meta.logotype\"\n :navigationItems=\"route.meta.sidebar_navigation_items\"\n\t :stateSidebar=\"store.core.state.isOpenSidebar\"\n />\n\t\t</transition>\n\n\t <Popup\n\t \t@close-popup=\"closeLocationPopup\"\n\t \t:isPopupOpen=\"store.core.state.isOpenLocationPopup\"\n\t \tclass=\"bg-white pd-semi w-m-33r radius-big\"\n\t >\n\t \t<LocationSelection />\n\t </Popup>\n\n\t <!-- class=\"flex flex-nowrap ease-in-out o-hidden pos-relative\" -->\n\t\t<section \n\t\t\tid=\"screen\" \n\t\t\tref=\"screen\"\n\t\t\tclass=\"flex flex-nowrap h-100 pos-relative o-hidden ease-in-out\"\n\t\t\t:class=\"{\n\t\t\t\t'': MOBILE_APP === 'ios',\n }\"\n\t\t>\n\t\t\t<ShopCart \n\t\t\t\t:class=\"{\n\t\t\t\t\t'mobile:pd-t-extra': MOBILE_APP === 'ios', \n\t\t\t\t}\"\n\t\t\t/>\n\t <component\n\t v-if=\"route.meta?.sidebar\"\n\t :is=\"route.meta.sidebar\"\n\t :stateSidebar=\"store.core.state.isOpenSidebar\"\n\t :widthHidden='route.meta?.sidebar_width_hidden'\n\t :width=\"route.meta?.sidebar_width\"\n\t :theme=\"headerTheme\"\n\t @closeSidebar=\"() => store.core.state.isOpenSidebar = false\"\n\t >\n\t \t<!-- Header slot -->\n\t \t<template #header>\n\t \t\t<component\n\t \t\t\tv-if=\"route.meta?.sidebar_header_component\"\n\t \t\t\t:is=\"route.meta.sidebar_header_component\"\n\t \t\t\t:theme=\"headerTheme\"\n\t \t\t/>\n\t \t</template>\n\n\t \t<!-- Navigation (default slot) -->\n\t \t<transition name=\"moveFromTop\" mode=\"out-in\">\n\t\t <component\n\t\t v-if=\"route.meta?.sidebar_navigation\"\n\t\t :is=\"route.meta.sidebar_navigation\"\n\t\t :key=\"route.meta.sidebar_navigation\"\n\t\t :navigationItems=\"route.meta.sidebar_navigation_items\"\n\t\t\t :stateSidebar=\"store.core.state.isOpenSidebar\"\n\t\t\t\t\t\t:theme=\"headerTheme\"\n\t\t />\n\t </transition>\n\n\t <!-- Footer slot -->\n\t \t<template #footer>\n\t \t\t<component\n\t \t\t\tv-if=\"route.meta?.sidebar_footer_component\"\n\t \t\t\t:is=\"route.meta.sidebar_footer_component\"\n\t \t\t\t:theme=\"headerTheme\"\n\t \t\t/>\n\t \t</template>\n\t </component>\n\t\t <!-- rows-[minmax(0,1fr)] z-index-1 pos-relative w-100 h-100 -->\n\t\t <div class=\"rows-[minmax(0,1fr)] z-index-1 pos-relative w-100 h-100\">\n\n\t\t\t<div id=\"scrollview\" ref=\"scrollview\" @scroll=\"handleScroll\" class=\"o-y-scroll o-x-hidden h-100\">\n\t \t\t\t<Status\n\t \t\t\t\tv-if=\"store.core.state.error.show\"\n\t\t\t\t\t:data=\"store.core.state.error\"\n\t\t\t\t\t@close=\"store.core.state.error.show = false\"\n\t\t\t\t\tclass=\"z-index-7\"\n\t\t\t\t/>\n\t\t\t\t<Snack\n\t\t\t\t\tv-if=\"store.core.state.snack.show\"\n\t\t\t\t\t:type=\"store.core.state.snack.type\"\n\t\t\t\t\t:message=\"store.core.state.snack.message\"\n\t\t\t\t\t:show=\"store.core.state.snack.show\"\n\t\t\t\t\t@close=\"store.core.state.snack.show = false\"\n\t\t\t\t\tclass=\"z-index-7\"\n\t\t\t\t/>\n\t\t\t\t\t<div class=\"h-min-100 pos-relative w-100\">\n\t\t\t\t\t\t<!-- <section v-if=\"!route.meta?.breadcrumbs?.hide\" class=\"pd-thin pd-b-zero\">\n\t\t\t\t\t\t\t<Breadcrumbs \n\t\t\t\t\t\t\t\tv-if=\"!MOBILE_APP\"\n\t\t\t\t\t\t\t\tclass=\"bg-light pd-small radius-small\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</section> -->\n\n\t\t\t\t\t\t<Suspense @resolve=\"onSuspenseResolved\">\n\t\t\t\t\t\t\t<router-view\n\t\t\t\t\t\t\t\tid=\"view\"\n\t\t\t\t\t\t\t\tv-slot=\"{ Component, route }\"\n\t\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t\t'scroll-hide': MOBILE_APP,\n\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t\tclass=\"h-min-100 pos-relative w-100\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<transition @before-enter=\"scrollTop\" name=\"scaleTransition\" mode=\"out-in\" appear>\n\n\t\t\t\t\t\t\t\t\t<div :key=\"componentKey\" class=\"w-100 h-min-100\">\n\t\t\t\t\t\t\t\t\t\t<component\n\t\t\t\t\t\t\t\t\t\t\tref=\"page\"\n\t\t\t\t\t\t\t\t\t\t\t:is=\"Component\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"w-100 h-min-100\"\n\t\t\t\t\t\t\t\t\t\t\t@page-loading=\"handlePageLoading\"\n\t\t\t\t\t\t\t\t\t\t\t@page-loaded=\"handlePageLoaded\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<component\n\t\t\t\t\t\t\t\t\t\t\tv-if=\"!MOBILE_APP && route.meta.footer && !route.meta.hideFooter\"\n\t\t\t\t\t\t\t\t\t\t\tref=\"footer\"\n\t\t\t\t\t\t\t\t\t\t\t:is=\"route.meta.footer\"\n\t\t\t\t\t\t\t\t\t\t\t:theme=\"route.meta.footer_theme || 'light'\"\n\t\t\t\t\t\t\t\t\t\t\t:logotype=\"route.meta.logotype\"\n\t\t\t\t\t\t\t\t\t\t\t:location=\"route.meta.location\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</transition>\n\t\t\t\t\t\t\t</router-view>\n\t\t\t\t\t\t</Suspense>\n\t\t\t\t </div>\n\n\t\t\t\t\t<component\n\t\t\t v-if=\"route.meta.player\"\n\t\t\t id=\"player-wrapper\"\n\t\t\t class=\"z-index-2 \"\n\t\t\t \t:is=\"route.meta.player\"\n\t\t\t />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</section>\n\n\n\t\t<router-view \n\t\t\tname=\"defaultBottom\"\n\t\t\tv-slot=\"{ Component, route }\" \n\t\t>\n\t\t\t<component \n \t\t:is=\"Component\" \n \t/>\n\t\t</router-view>\n\n <component \n v-if=\"MOBILE_APP && route.meta.title_hide\"\n class=\"z-index-2\"\n \t:is=\"route.meta.bottombar\"\n />\n\n\n\t</div>\n</template>\n\n\n\n<script setup>\n\timport { computed, ref, onMounted } from 'vue';\n\t// Router\n\timport { useRoute } from 'vue-router';\n\t// Store\n\timport { useStore } from '@martyrs/src/modules/core/views/store/core.store.js';\n\timport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\t// Partials\n\timport Status from '@martyrs/src/components/Status/Status.vue';\n\timport Snack from '@martyrs/src/components/Status/Snack.vue';\n\timport Popup from '@martyrs/src/components/Popup/Popup.vue';\n\timport Breadcrumbs from '@martyrs/src/components/Breadcrumbs/Breadcrumbs.vue'\n\timport Loader from '@martyrs/src/components/Loader/Loader.vue';\n\t\n\timport NavigationBar from '@martyrs/src/modules/core/views/components/partials/NavigationBar.vue';\n\timport LocationSelection from '@martyrs/src/modules/core/views/components/partials/LocationSelection.vue';\n\n\timport ShopCart from '@martyrs/src/modules/orders/components/partials/ShopCart.vue';\n\t// PROPS\n\tconst props = defineProps({\n env: {\n type: Object,\n required: true\n },\n app: {\n type: Object,\n required: true\n },\n modules: {\n type: Object,\n required: true\n }\n })\n\n\tconst store = useStore()\n\n\n\t/////////////////////////////\n // LOADING\n /////////////////////////////\n // State\n let show = ref(false)\n // Preloader\n const page = ref(null)\n const scrollview = ref(null)\n\n // isPageLoading убран - используем core.state.loading\n \n // Обработчики событий загрузки\n function handlePageLoading() {\n store.core.state.loading = true;\n }\n\n function handlePageLoaded() {\n store.core.state.loading = false;\n }\n\n // Обработка события разрешения Suspense (когда async setup компонента завершается)\n function onSuspenseResolved() {\n // Если страница не отправляет событие page-loaded, этот обработчик\n // может служить запасным вариантом для отключения лоадера\n // Можно оставить закомментированным, если все страницы будут явно вызывать handlePageLoaded\n store.core.state.loading = false;\n }\n\t/////////////////////////////\n\t// CREATED\n\t/////////////////////////////\n\tconst route = useRoute()\n\t// const router = useRouter()\n\n\t// Инициализация sidebar для SSR + первая загрузка\n\tif (route.meta?.sidebarOpenOnEnter === true) {\n\t\tstore.core.state.isOpenSidebar = true\n\t}\n\n\t// Ref Code\n\tconst referalCode = ref(route.query.referalCode);\n\t/////////////////////////////\n\t// Methods\n\t/////////////////////////////\n\tfunction closeLocationPopup() {\n\t store.core.state.isOpenLocationPopup = false;\n\t}\n\tfunction scrollTop(){\n\t\tif (scrollview.value) scrollview.value.scrollTop = 0;\n\t}\n\t// Scrolling header\n\tconst scrollOffset = ref(0)\n\tlet isScrolled = false\n\tconst header = ref(null)\n\n\tconst headerTheme = computed(() => {\n\t\tif (scrollOffset.value > 50) {\n\t\t\treturn route.meta.header_theme || 'light'\n\t\t} else {\n\t\t\treturn route.meta.header_theme || 'light'\n\t\t}\n\t})\n\n\tconst handleScroll = () => {\n\t scrollOffset.value = event.target.scrollTop\n\t};\n/////////////////////////////\n // FIRST USE\n /////////////////////////////\n const FirstUse = ref(false);\n\n import { Preferences } from '@capacitor/preferences';\n\n async function getFirstUse() {\n const ret = await Preferences.get({ key: 'first-use' });\n FirstUse.value = ret.value ? JSON.parse(ret.value) : true;\n }\n\n const updateFirstUse = (value) => {\n FirstUse.value = value;\n }\n\n\tconst { isPhone, isTablet } = useGlobalMixins();\n\n\tonMounted(async () => {\n\t await getFirstUse()\n\n\t\t// Закрываем sidebar на mobile (CSS уже скрыл визуально)\n\t\tif ((isPhone() || isTablet()) && store.core.state.isOpenSidebar) {\n\t\t\tstore.core.state.isOpenSidebar = false\n\t\t}\n\n\t\t// Регистрация единого Service Worker (PWA + push notifications)\n\t\tif ('serviceWorker' in navigator && !window.__MOBILE_APP__) {\n\t \twindow.addEventListener('load', () => {\n\t \tnavigator.serviceWorker.register('/sw.js').then(registration => {\n\t \tconsole.log('Unified SW registered: ', registration);\n\t \t}).catch(registrationError => {\n\t \tconsole.log('SW registration failed: ', registrationError);\n\t \t});\n\t });\n\t \t}\n\n\t\tif (!store.core.state.position && route.meta.location) {\n store.core.state.isOpenLocationPopup = true;\n } else {\n store.core.state.isOpenLocationPopup = false;\n }\n\n\t\tif (referalCode.value) {\n\t\t localStorage.setItem('referalCode', referalCode.value);\n\t\t}\n\n\t\tif (page.value) show.value = true\n\t});\n\n\tconst componentKey = computed(() => {\n\t // Собираем только значимые параметры (ID сущностей)\n\t const significantParams = ['_id', 'product', 'organization', 'categoryPath', 'country', 'state', 'city']\n\t .map(param => route.params[param])\n\t .filter(Boolean)\n\t .join('-');\n\n\t return significantParams || route.name;\n\t});\n</script>\n\n<style lang=\"scss\">\n\t.fade-enter-active, .fade-leave-active {\n\t transition: opacity .5s;\n\t}\n\t.fade-enter, .fade-leave-to /* .fade-leave-active в версии 2.1.8+ */ {\n\t opacity: 0;\n\t}\n\n\t\n .fade-move,\n .fade-enter-active,\n .fade-leave-active {\n transition: all 0.5s cubic-bezier(0.55, 0, 0.1, 1);\n }\n\n /* 2. declare enter from and leave to state */\n .fade-enter-from,\n .fade-leave-to {\n opacity: 0;\n transform: translate(30px, 0);\n }\n\n /* 3. ensure leaving items are taken out of layout flow so that moving\n animations can be calculated correctly. */\n .fade-leave-active {\n position: absolute;\n }\n\n.moveFromTop-enter-active,\n.moveFromTop-leave-active {\n transition: all 0.3s ease, max-height 0.2s ease;\n overflow: hidden;\n}\n\n.moveFromTop-enter-from,\n.moveFromTop-leave-to {\n transform: translateY(-1rem);\n opacity: 0;\n // max-height: 0;\n}\n\n.moveFromTop-enter-to,\n.moveFromTop-leave-from {\n // max-height: 100vh; \n}\n\n\t.moveFromTopAbsolute-enter-active,\n\t.moveFromTopAbsolute-leave-active {\n\t\ttransform: translateY(0);\n\t\topacity: 1;\n\t\ttransition: all 0.5s ease; \n\t\t\n\t}\n\t.moveFromTopAbsolute-enter-from,\n\t.moveFromTopAbsolute-leave-to {\n\t\tposition: absolute;\n\t\ttransform: translateY(-1rem);\n\t\topacity: 0;\n\t\ttransition: all 0.5s ease;\n\t}\n\t.ScaleOut-enter-active,\n\t.ScaleOut-leave-active {\n\t\topacity: 1;\n\t\ttransform: scale(1);\n\t\ttransition: all 0.3s ease; \n\t\t\n\t}\n\t.ScaleOut-enter-from,\n\t.ScaleOut-leave-to {\n\t\topacity: 0;\n\t\ttransform: scale(0.9);\n\t\ttransition: all 0.3s ease;\n\t}\n\t.slide-fade-enter-active {\n\t\t// min-height: 100vh;\n\t transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n\t}\n\n\t.slide-fade-leave-active {\n\t\t// min-height: 100vh;\n\t transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n\t}\n\n\t.slide-fade-enter-from,\n\t.slide-fade-leave-to {\n\t\tmin-height: 0;\n\t transform: translateX(20px);\n\t opacity: 0;\n\t left: 0;\n\t top: 0;\n\t}\n\n\t.scaleTransition-5px-enter-active,\n .scaleTransition-5px-leave-active {\n transform: translateY(0px); \n opacity: 1;\n z-index: 1;\n transition: all 0.2s ease;\n }\n\n .scaleTransition-5px-enter-from,\n .scaleTransition-5px-leave-to {\n opacity: 0;\n z-index: 0;\n position: absolute;\n transform: translateY(-30px); \n transition: all 0.2s ease;\n }\n\n .scaleTransition-enter-from,\n .scaleTransition-leave-to {\n opacity: 0;\n z-index: 0;\n position: absolute;\n width: inherit;\n height: inherit;\n display: block;\n transform: translateY(30px); \n transition: all 0.5s ease;\n }\n\n .scaleTransition-enter-active,\n .scaleTransition-leave-active {\n transform: translateY(0px); \n opacity: 1;\n z-index: 1;\n transition: all 0.5s ease;\n }\n .scaleTransition-enter-from,\n .scaleTransition-leave-to {\n opacity: 0;\n z-index: 0;\n position: absolute;\n width: inherit;\n height: inherit;\n display: block;\n transform: translateY(30px); \n transition: all 0.5s ease;\n }\n\n .scaleIn-enter-active,\n .scaleIn-leave-active {\n // background: red;\n transition: all 0.5s ease;\n > section,div { transform-origin: 0 0; transform: translateZ(0px); transition: all 0.5s ease; }\n }\n .scaleIn-enter-from,\n .scaleIn-leave-to {\n opacity: 0;\n transform: scale(0.95);\n > section,div { transform: translateZ(-30px); transition: all 0.5s ease; }\n }\n\n\n</style>"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,80 @@
|
|
|
1
|
-
import { createElementBlock, openBlock } from "vue";
|
|
1
|
+
import { resolveComponent, createElementBlock, openBlock, createElementVNode, createStaticVNode, createVNode, withCtx, createTextVNode } from "vue";
|
|
2
|
+
import { useRouter } from "vue-router";
|
|
3
|
+
import _sfc_main$1 from "../../../../icons/entities/IconHome.vue.js";
|
|
4
|
+
import _sfc_main$2 from "../../../../icons/navigation/IconArrow.vue.js";
|
|
5
|
+
import _sfc_main$3 from "../../../../icons/navigation/IconSearch.vue.js";
|
|
6
|
+
import _sfc_main$4 from "../../../../icons/entities/IconInfo.vue.js";
|
|
7
|
+
/* empty css */
|
|
2
8
|
import _export_sfc from "../../../../../../../_virtual/_plugin-vue_export-helper.js";
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
const
|
|
9
|
+
const _hoisted_1 = { class: "pd-thin flex flex-v-center w-100 h-100" };
|
|
10
|
+
const _hoisted_2 = { class: "bg-light w-100 h-100 flex flex-h-center flex-column radius-big pd-medium" };
|
|
11
|
+
const _hoisted_3 = { class: "flex gap-small mn-b-extra" };
|
|
12
|
+
const _hoisted_4 = { class: "pd-t-medium w-max-25r" };
|
|
13
|
+
const _hoisted_5 = { class: "field-wrapper bg-white flex flex-v-center radius-small pd-small gap-small" };
|
|
14
|
+
const _hoisted_6 = { class: "flex gap-medium mn-t-small" };
|
|
15
|
+
const _hoisted_7 = {
|
|
16
|
+
href: "#",
|
|
17
|
+
class: "flex flex-v-center gap-micro p-small t-transp"
|
|
18
|
+
};
|
|
19
|
+
const _sfc_main = {
|
|
20
|
+
__name: "404",
|
|
21
|
+
setup(__props) {
|
|
22
|
+
const router = useRouter();
|
|
23
|
+
const goBack = () => window.history.length > 1 ? router.back() : router.push("/");
|
|
24
|
+
return (_ctx, _cache) => {
|
|
25
|
+
const _component_router_link = resolveComponent("router-link");
|
|
26
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [
|
|
27
|
+
createElementVNode("div", _hoisted_2, [
|
|
28
|
+
_cache[6] || (_cache[6] = createStaticVNode('<div class="flex flex-v-center gap-thin pd-thin radius-big bg-main w-fit mn-b-medium" data-v-4a88f18b><span class="i-medium radius-big bg-grey" data-v-4a88f18b></span><span class="p-small" data-v-4a88f18b>Error 404</span></div><h1 class="mn-b-semi" data-v-4a88f18b>Page not found</h1><p class="p-medium t-transp w-max-35r mn-b-big" style="line-height:1.6;" data-v-4a88f18b> The page you are looking for doesn't exist or has been moved. Please check the URL or navigate back to the home page. </p>', 3)),
|
|
29
|
+
createElementVNode("div", _hoisted_3, [
|
|
30
|
+
createVNode(_component_router_link, {
|
|
31
|
+
to: "/",
|
|
32
|
+
class: "button bg-black t-white pd-regular radius-small flex flex-v-center gap-thin"
|
|
33
|
+
}, {
|
|
34
|
+
default: withCtx(() => [
|
|
35
|
+
createVNode(_sfc_main$1, {
|
|
36
|
+
class: "i-regular",
|
|
37
|
+
fill: "rgb(var(--white))"
|
|
38
|
+
}),
|
|
39
|
+
_cache[0] || (_cache[0] = createElementVNode("span", null, "Go home", -1))
|
|
40
|
+
]),
|
|
41
|
+
_: 1
|
|
42
|
+
}),
|
|
43
|
+
createElementVNode("button", {
|
|
44
|
+
onClick: goBack,
|
|
45
|
+
class: "button bg-white t-black pd-regular radius-small flex flex-v-center gap-thin"
|
|
46
|
+
}, [
|
|
47
|
+
createVNode(_sfc_main$2, { class: "i-regular rotate-180" }),
|
|
48
|
+
_cache[1] || (_cache[1] = createElementVNode("span", null, "Go back", -1))
|
|
49
|
+
])
|
|
50
|
+
]),
|
|
51
|
+
createElementVNode("div", _hoisted_4, [
|
|
52
|
+
_cache[5] || (_cache[5] = createElementVNode("span", { class: "p-micro t-transp t-upper t-500 ls-wide d-block mn-b-small" }, "Search Documentation", -1)),
|
|
53
|
+
createElementVNode("div", _hoisted_5, [
|
|
54
|
+
createVNode(_sfc_main$3, { class: "i-small t-transp" }),
|
|
55
|
+
_cache[2] || (_cache[2] = createElementVNode("input", {
|
|
56
|
+
type: "text",
|
|
57
|
+
placeholder: "e.g. Installation guide...",
|
|
58
|
+
class: "w-100 bd-none"
|
|
59
|
+
}, null, -1))
|
|
60
|
+
]),
|
|
61
|
+
createElementVNode("div", _hoisted_6, [
|
|
62
|
+
createElementVNode("a", _hoisted_7, [
|
|
63
|
+
createVNode(_sfc_main$4, { class: "i-small" }),
|
|
64
|
+
_cache[3] || (_cache[3] = createTextVNode(" Help Center"))
|
|
65
|
+
]),
|
|
66
|
+
_cache[4] || (_cache[4] = createElementVNode("a", {
|
|
67
|
+
href: "#",
|
|
68
|
+
class: "p-small t-transp"
|
|
69
|
+
}, "API Status", -1))
|
|
70
|
+
])
|
|
71
|
+
])
|
|
72
|
+
])
|
|
73
|
+
]);
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
const NotFound = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-4a88f18b"]]);
|
|
9
78
|
export {
|
|
10
79
|
NotFound as default
|
|
11
80
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"404.vue.js","sources":["../../../../../../../../src/modules/core/views/components/pages/404.vue"],"sourcesContent":["<template>\n <div class=\"\">\n 404
|
|
1
|
+
{"version":3,"file":"404.vue.js","sources":["../../../../../../../../src/modules/core/views/components/pages/404.vue"],"sourcesContent":["<script setup>\nimport { useRouter } from 'vue-router'\nimport IconHome from '@martyrs/src/modules/icons/entities/IconHome.vue'\nimport IconArrow from '@martyrs/src/modules/icons/navigation/IconArrow.vue'\nimport IconSearch from '@martyrs/src/modules/icons/navigation/IconSearch.vue'\nimport IconInfo from '@martyrs/src/modules/icons/entities/IconInfo.vue'\n\nconst router = useRouter()\nconst goBack = () => window.history.length > 1 ? router.back() : router.push('/')\n</script>\n\n<template>\n <div class=\"pd-thin flex flex-v-center w-100 h-100 \">\n <div class=\"bg-light w-100 h-100 flex flex-h-center flex-column radius-big pd-medium\">\n\n <div class=\"flex flex-v-center gap-thin pd-thin radius-big bg-main w-fit mn-b-medium\">\n <span class=\"i-medium radius-big bg-grey\"></span>\n <span class=\"p-small\">Error 404</span>\n </div>\n\n <h1 class=\"mn-b-semi\">Page not found</h1>\n\n <p class=\"p-medium t-transp w-max-35r mn-b-big\" style=\"line-height: 1.6;\">\n The page you are looking for doesn't exist or has been moved. Please check the URL or navigate back to the home page.\n </p>\n\n <div class=\"flex gap-small mn-b-extra\">\n <router-link to=\"/\" class=\"button bg-black t-white pd-regular radius-small flex flex-v-center gap-thin\">\n <IconHome class=\"i-regular\" :fill=\"'rgb(var(--white))'\" />\n <span>Go home</span>\n </router-link>\n <button @click=\"goBack\" class=\"button bg-white t-black pd-regular radius-small flex flex-v-center gap-thin\">\n <IconArrow class=\"i-regular rotate-180\" />\n <span>Go back</span>\n </button>\n </div>\n\n <div class=\"pd-t-medium w-max-25r\">\n <span class=\"p-micro t-transp t-upper t-500 ls-wide d-block mn-b-small\">Search Documentation</span>\n <div class=\"field-wrapper bg-white flex flex-v-center radius-small pd-small gap-small\">\n <IconSearch class=\"i-small t-transp\" />\n <input type=\"text\" placeholder=\"e.g. Installation guide...\" class=\"w-100 bd-none\" />\n </div>\n <div class=\"flex gap-medium mn-t-small\">\n <a href=\"#\" class=\"flex flex-v-center gap-micro p-small t-transp\"><IconInfo class=\"i-small\" /> Help Center</a>\n <a href=\"#\" class=\"p-small t-transp\">API Status</a>\n </div>\n </div>\n\n </div>\n </div>\n</template>\n\n<style scoped>\ninput { border: none; outline: none; }\ninput::placeholder { color: rgba(var(--dark), 0.4); }\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAOA,UAAM,SAAS,UAAS;AACxB,UAAM,SAAS,MAAM,OAAO,QAAQ,SAAS,IAAI,OAAO,KAAI,IAAK,OAAO,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -5,8 +5,8 @@ import { useStore } from "../../store/core.store.js";
|
|
|
5
5
|
import { actions, getters } from "../../../../orders/store/shopcart.js";
|
|
6
6
|
import { state } from "../../../../auth/views/store/auth.js";
|
|
7
7
|
import NotificationBadge from "../../../../notifications/components/elements/NotificationBadge.vue.js";
|
|
8
|
-
import _sfc_main$1 from "../../../../../components/Button/Button.
|
|
9
|
-
import Select from "../../../../../components/Select/Select.
|
|
8
|
+
import _sfc_main$1 from "../../../../../components/Button/Button.vue2.js";
|
|
9
|
+
import Select from "../../../../../components/Select/Select.vue.js";
|
|
10
10
|
import _sfc_main$3 from "../../../../icons/entities/IconShopcart.vue.js";
|
|
11
11
|
import _sfc_main$4 from "../../../../icons/entities/IconProfile.vue.js";
|
|
12
12
|
import _sfc_main$2 from "../../../../icons/navigation/IconSearch.vue.js";
|
|
@@ -90,7 +90,7 @@ const _sfc_main = {
|
|
|
90
90
|
__props.location ? (openBlock(), createElementBlock("button", {
|
|
91
91
|
key: 1,
|
|
92
92
|
"aria-label": "button_location",
|
|
93
|
-
class: normalizeClass(["cursor-pointer bg-transparent pd-micro radius-extra uppercase fw-semi br-2px ease-linear
|
|
93
|
+
class: normalizeClass(["cursor-pointer bg-transparent pd-micro radius-extra uppercase fw-semi br-2px ease-linear ws-nowrap", {
|
|
94
94
|
"fill-black br-black t-black hover:bg-black hover:t-white hover:fill-white": __props.theme === "light",
|
|
95
95
|
"fill-white br-white t-white hover:bg-white hover:t-black hover:fill-black": __props.theme === "dark"
|
|
96
96
|
}]),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Header.vue.js","sources":["../../../../../../../../src/modules/core/views/components/partials/Header.vue"],"sourcesContent":["<script setup=\"props\">\n\timport { computed, onMounted, toRefs, ref, inject } from 'vue'\n\n\timport { useRouter,useRoute } from 'vue-router'\n\timport { useI18n } from 'vue-i18n'\n\n\timport { useStore } from '@martyrs/src/modules/core/views/store/core.store.js'\n\timport * as shopcart from '@martyrs/src/modules/orders/store/shopcart.js'\n\timport * as auth from '@martyrs/src/modules/auth/views/store/auth.js'\n\n\tconst store = useStore()\n\t\n\t// Globasls Component\n\n\timport NotificationBadge from '@martyrs/src/modules/notifications/components/elements/NotificationBadge.vue';\n\t// import Navigation from '@martyrs/src/modules/core/views/components/partials/Navigation.vue'\n\t// Martyrs Component\n\timport Button from '@martyrs/src/components/Button/Button.vue'\n\timport Select from '@martyrs/src/components/Select/Select.vue'\n\timport Checkbox from '@martyrs/src/components/Checkbox/Checkbox.vue'\n\t// Icons module\n\timport IconShopcart from '@martyrs/src/modules/icons/entities/IconShopcart.vue'\n\timport IconProfile from '@martyrs/src/modules/icons/entities/IconProfile.vue'\n\timport IconSearch from '@martyrs/src/modules/icons/navigation/IconSearch.vue';\n\t// Props\n\tconst props = defineProps({\n theme: {\n \ttype: String,\n\t default: \"light\"\n },\n logotype: {\n\t type: Object\n\t },\n\t location: {\n\t type: Boolean,\n\t\t default: true\n\t },\n\t theme_switcher: {\n\t type: Boolean,\n\t\t default: true\n\t },\n });\n\t// Accessing state\n\tconst router = useRouter()\n\tconst route = useRoute()\n\t// Localization\n\tconst { t } = useI18n()\n\t// const search = computed(() => store.products.state.search)\n\n\tfunction openLocationPopup() {\n\t store.core.state.isOpenLocationPopup = true;\n\t}\n\t/////////////////////////////\n\t// MOUNTED\n\t/////////////////////////////\n\tonMounted(() => {\n shopcart.actions.setShopcart()\n });\n</script>\n\n<template>\n\t<header \n\t\tid=\"header\" \n\t\tclass=\"\n\t\t\tpd-thin \n\t\t\tgap-micro\n\t\t\tflex-justify-between\n\t\t\tflex-nowrap\n\t\t\tflex\n\t\t\th-4r\n\t\t\tw-100\n\t\t\tz-index-2 \n\t\t\tpos-relative pos-t-0\n\t\t\tbr-b-1px\n\t\t\"\n\t\t:class=\"{\n \t\t't-black br-light': theme === 'light',\n \t\t't-white br-dark': theme === 'dark' \n \t}\"\n\t>\n\t<div class=\"flex-nowrap flex-v-center flex-justify-start flex gap-micro \">\n\t\t<!-- MENU -->\n\t\t<button\n\t\t\taria-label=\"menu\"\n\t\t\t@click=\"() => store.core.state.isOpenSidebar = !store.core.state.isOpenSidebar\"\n\t\t\tclass=\"cursor-pointer mobile-only menu-btn\"\n\t\t\t:class=\"{\n\t\t\t\t'menu-btn_active': store.core.state.isOpenSidebar\n\t\t\t}\"\n\t\t>\n\t <span\n\t \tclass=\"no-events\"\n\t\t :class=\"{\n\t\t 'bg-black': theme === 'light',\n\t\t 'bg-white': theme === 'dark'\n\t\t }\"\n\t\t >\n\t\t <span class=\"menu-btn__before\" :class=\"{ 'bg-black': theme === 'light', 'bg-white': theme === 'dark' }\"></span>\n\t\t <span class=\"menu-btn__after\" :class=\"{ 'bg-black': theme === 'light', 'bg-white': theme === 'dark' }\"></span>\n\t\t </span>\n\t </button>\n\n\t\t<!-- LOGO -->\n\t\t<component\n\t\t\tv-if=\"logotype\"\n\t\t :is=\"logotype\"\n\t\t @click=\"router.push({ path: '/' })\" \n\t\t :theme=\"theme\"\n\t\t class=\"cursor-pointer h-2r\"\n\t\t/>\n\n\t\t<button\n\t\t\tv-if=\"location\"\n\t\t\taria-label=\"button_location\"\n \tclass=\"\n \t\tcursor-pointer\n \t\tbg-transparent \n \t\tpd-micro\n \t\tradius-extra \n \t\tuppercase \n \t\tfw-semi\n \t\t\n \t\tbr-2px \n \t\tease-linear\n \t\
|
|
1
|
+
{"version":3,"file":"Header.vue.js","sources":["../../../../../../../../src/modules/core/views/components/partials/Header.vue"],"sourcesContent":["<script setup=\"props\">\n\timport { computed, onMounted, toRefs, ref, inject } from 'vue'\n\n\timport { useRouter,useRoute } from 'vue-router'\n\timport { useI18n } from 'vue-i18n'\n\n\timport { useStore } from '@martyrs/src/modules/core/views/store/core.store.js'\n\timport * as shopcart from '@martyrs/src/modules/orders/store/shopcart.js'\n\timport * as auth from '@martyrs/src/modules/auth/views/store/auth.js'\n\n\tconst store = useStore()\n\t\n\t// Globasls Component\n\n\timport NotificationBadge from '@martyrs/src/modules/notifications/components/elements/NotificationBadge.vue';\n\t// import Navigation from '@martyrs/src/modules/core/views/components/partials/Navigation.vue'\n\t// Martyrs Component\n\timport Button from '@martyrs/src/components/Button/Button.vue'\n\timport Select from '@martyrs/src/components/Select/Select.vue'\n\timport Checkbox from '@martyrs/src/components/Checkbox/Checkbox.vue'\n\t// Icons module\n\timport IconShopcart from '@martyrs/src/modules/icons/entities/IconShopcart.vue'\n\timport IconProfile from '@martyrs/src/modules/icons/entities/IconProfile.vue'\n\timport IconSearch from '@martyrs/src/modules/icons/navigation/IconSearch.vue';\n\t// Props\n\tconst props = defineProps({\n theme: {\n \ttype: String,\n\t default: \"light\"\n },\n logotype: {\n\t type: Object\n\t },\n\t location: {\n\t type: Boolean,\n\t\t default: true\n\t },\n\t theme_switcher: {\n\t type: Boolean,\n\t\t default: true\n\t },\n });\n\t// Accessing state\n\tconst router = useRouter()\n\tconst route = useRoute()\n\t// Localization\n\tconst { t } = useI18n()\n\t// const search = computed(() => store.products.state.search)\n\n\tfunction openLocationPopup() {\n\t store.core.state.isOpenLocationPopup = true;\n\t}\n\t/////////////////////////////\n\t// MOUNTED\n\t/////////////////////////////\n\tonMounted(() => {\n shopcart.actions.setShopcart()\n });\n</script>\n\n<template>\n\t<header \n\t\tid=\"header\" \n\t\tclass=\"\n\t\t\tpd-thin \n\t\t\tgap-micro\n\t\t\tflex-justify-between\n\t\t\tflex-nowrap\n\t\t\tflex\n\t\t\th-4r\n\t\t\tw-100\n\t\t\tz-index-2 \n\t\t\tpos-relative pos-t-0\n\t\t\tbr-b-1px\n\t\t\"\n\t\t:class=\"{\n \t\t't-black br-light': theme === 'light',\n \t\t't-white br-dark': theme === 'dark' \n \t}\"\n\t>\n\t<div class=\"flex-nowrap flex-v-center flex-justify-start flex gap-micro \">\n\t\t<!-- MENU -->\n\t\t<button\n\t\t\taria-label=\"menu\"\n\t\t\t@click=\"() => store.core.state.isOpenSidebar = !store.core.state.isOpenSidebar\"\n\t\t\tclass=\"cursor-pointer mobile-only menu-btn\"\n\t\t\t:class=\"{\n\t\t\t\t'menu-btn_active': store.core.state.isOpenSidebar\n\t\t\t}\"\n\t\t>\n\t <span\n\t \tclass=\"no-events\"\n\t\t :class=\"{\n\t\t 'bg-black': theme === 'light',\n\t\t 'bg-white': theme === 'dark'\n\t\t }\"\n\t\t >\n\t\t <span class=\"menu-btn__before\" :class=\"{ 'bg-black': theme === 'light', 'bg-white': theme === 'dark' }\"></span>\n\t\t <span class=\"menu-btn__after\" :class=\"{ 'bg-black': theme === 'light', 'bg-white': theme === 'dark' }\"></span>\n\t\t </span>\n\t </button>\n\n\t\t<!-- LOGO -->\n\t\t<component\n\t\t\tv-if=\"logotype\"\n\t\t :is=\"logotype\"\n\t\t @click=\"router.push({ path: '/' })\" \n\t\t :theme=\"theme\"\n\t\t class=\"cursor-pointer h-2r\"\n\t\t/>\n\n\t\t<button\n\t\t\tv-if=\"location\"\n\t\t\taria-label=\"button_location\"\n \tclass=\"\n \t\tcursor-pointer\n \t\tbg-transparent \n \t\tpd-micro\n \t\tradius-extra \n \t\tuppercase \n \t\tfw-semi\n \t\t\n \t\tbr-2px \n \t\tease-linear\n \t\tws-nowrap\n \t\n \t\"\n \t:class=\"{\n \t\t'fill-black br-black t-black hover:bg-black hover:t-white hover:fill-white': theme === 'light',\n \t\t'fill-white br-white t-white hover:bg-white hover:t-black hover:fill-black': theme === 'dark' \n \t}\"\n \t@click=\"openLocationPopup()\"\n >\n \t<svg class=\"i-small\" :fill=\"'inherit'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"50\" height=\"67\" viewBox=\"0 0 50 67\" fill=\"none\">\n\t\t\t <path d=\"M25 0C11.207 0 0 11.207 0 25C0 38.793 20.832 66.668 25 66.668C29.168 66.668 50 38.793 50 25C50 11.207 38.793 0 25 0ZM25 33.332C20.418 33.332 16.668 29.582 16.668 25C16.668 20.418 20.418 16.668 25 16.668C29.582 16.668 33.332 20.418 33.332 25C33.332 29.582 29.582 33.332 25 33.332Z\" :fill=\"'inherit'\"/>\n\t\t\t</svg>\n \t {{store.core.state.position?.country ? store.core.state.position.country : 'World'}}\n </button>\n </div>\n\n \t<slot></slot>\n\n\t<div class=\"flex-justify-end flex-v-center flex-nowrap flex gap-micro\">\n\t\t<Button \n\t\t\tv-if=\"router.hasRoute('Search') && route.meta.header_search\"\n\t\t\taria-label=\"search\"\n\t\t\tclass=\"pd-zero bg-transparent\"\n\t\t\t:class=\"route.meta.header_search_class\"\n\t\t\t:submit=\"() => router.push({name: 'Search'})\"\n\t\t\t:showSucces=\"false\"\n\t\t\t:showLoader=\"false\"\n\t\t>\n\t\t\t<IconSearch \n\t\t\t\tclass=\"i-medium\"\n\t\t\t\t:fill=\"theme === 'light' ? 'rgb(var(--black))' : 'rgb(var(--white))'\" \n\t\t\t/>\n\t\t</Button>\n\t\n\t\t<Button\n\t\t\taria-label=\"shopcart\"\n\t\t\t:submit=\"a => shopcart.actions.toggleShopcart()\" \n\t\t\t:counter=\"shopcart.getters.cartTotalAmount\" \n\t\t\t:showSucces=\"false\"\n\t\t\t:showLoader=\"false\"\n\t\t\tclass=\"pd-zero mn-r-micro\"\n\t\t\t> \n\t\t\t<IconShopcart \n\t\t\t\tclass=\"i-medium\"\n\t\t\t\t:fill=\"theme === 'light' ? 'rgb(var(--black))' : 'rgb(var(--white))'\" \n\t\t\t/>\n\t\t\t<!-- <div class=\"w-max p-small pos-absolute pos-t-100 pos-r-0\">Product Added to Shopcart</div> -->\n\t\t</Button>\n\n\n\t\t<NotificationBadge\n\t\t\tv-if=\"auth.state.user._id\"\n\t\t\t:fill=\"theme === 'light' ? 'rgb(var(--black))' : 'rgb(var(--white))'\" \n\t\t/>\n\n\t\t<Button \n\t\t\taria-label=\"profile\"\n\t\t\tclass=\"pd-zero bg-transparent\"\n\t\t\t:submit=\"\n\t\t\t\tauth.state.access.status === false \n\t\t\t\t? \n\t\t\t\ta => router.push({name: 'Sign In'}) \n\t\t\t\t: \n\t\t\t\ta => router.push({ name: 'User Profile', params: { _id: auth.state.user._id }})\n\t\t\t\"\n\t\t\t:showSucces=\"false\"\n\t\t\t:showLoader=\"false\"\n\t\t>\n\t\t\t<IconProfile \n\t\t\t\tclass=\"i-medium\"\n\t\t\t\t:fill=\"theme === 'light' ? 'rgb(var(--black))' : 'rgb(var(--white))'\" \n\t\t\t/>\n\t\t</Button>\n\n\t\t<Select \n\t\t\tv-if=\"$i18n.availableLocales.length > 1\"\n\t\t\tv-model:select=\"$i18n.locale\"\n\t\t :options=\"$i18n.availableLocales\"\n\t\t :property=\"'value'\"\n class=\"pos-relative flex flex-column gap-small uppercase pd-thin fw-semi radius-thin\"\n :class=\"{\n \t\t'bg-light t-black': theme === 'light',\n \t\t'bg-dark t-white': theme === 'dark' \n \t}\"\n />\n </div>\n</header>\n \n</template>\n\n<style lang=\"scss\">\n.location-button { \n\t&:hover {\n\t\tbox-shadow: inset 0 0 0 2px rgb(var(--main));\n\t}\n}\n\n.menu-btn {\n display: block;\n width: 2rem;\n height: 2rem;\n border-radius: 50%;\n position: relative;\n}\n.menu-btn span,\n.menu-btn__before,\n.menu-btn__after {\n position: absolute;\n top: 50%;\n margin-top: -1px;\n left: 50%;\n margin-left: -10px;\n width: 20px;\n height: 2px;\n}\n.menu-btn__before,\n.menu-btn__after {\n display: block;\n transition: 0.2s;\n}\n.menu-btn__before {\n transform: translateY(-5px);\n}\n.menu-btn__after {\n transform: translateY(5px);\n}\n.menu-btn_active .menu-btn__before {\n transform: rotate(-35deg);\n width: 10px;\n transform-origin: left bottom;\n}\n.menu-btn_active .menu-btn__after {\n transform: rotate(35deg);\n width: 10px;\n transform-origin: left top;\n}\n\n.menu-btn_active span:before {\n transform: rotate(-35deg);\n width: 10px;\n transform-origin: left bottom;\n}\n.menu-btn_active span:after {\n transform: rotate(35deg);\n width: 10px;\n transform-origin: left top;\n}\n\n.menu-block {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.menu-nav {\n background-color: #fff;\n height: 50px;\n \n}\n.menu-nav__link {\n display: inline-block;\n text-decoration: none;\n color: #fff;\n margin-right: 20px;\n}\n.menu-nav__link {\n transition: 0.5s;\n transform-origin: right center;\n transform: translateX(50%);\n opacity: 0;\n}\n.menu-nav__link_active {\n transform: translateX(0%);\n opacity: 1;\n}\n\n</style>"],"names":["shopcart.actions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUC,UAAM,QAAQ,SAAQ;AAiCtB,UAAM,SAAS,UAAS;AACxB,UAAM,QAAQ,SAAQ;AAEtB,UAAM,EAAE,EAAC,IAAK,QAAO;AAGrB,aAAS,oBAAoB;AAC3B,YAAM,KAAK,MAAM,sBAAsB;AAAA,IACzC;AAIA,cAAU,MAAM;AACbA,cAAiB,YAAW;AAAA,IAC9B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -3,7 +3,7 @@ import { useRouter, useRoute } from "vue-router";
|
|
|
3
3
|
import { useI18n } from "vue-i18n";
|
|
4
4
|
import _sfc_main$2 from "../../../../icons/entities/IconShopcart.vue.js";
|
|
5
5
|
import _sfc_main$3 from "../../../../icons/entities/IconProfile.vue.js";
|
|
6
|
-
import _sfc_main$1 from "../../../../../components/Button/Button.
|
|
6
|
+
import _sfc_main$1 from "../../../../../components/Button/Button.vue2.js";
|
|
7
7
|
import { useStore } from "../../store/core.store.js";
|
|
8
8
|
import { getters, actions } from "../../../../orders/store/shopcart.js";
|
|
9
9
|
import { state } from "../../../../auth/views/store/auth.js";
|
|
@@ -118,7 +118,7 @@ const _sfc_main = {
|
|
|
118
118
|
]])
|
|
119
119
|
}, [
|
|
120
120
|
createElementVNode("span", {
|
|
121
|
-
class: normalizeClass(["w-100
|
|
121
|
+
class: normalizeClass(["w-100 ws-nowrap ease-quint-out t-left fw-medium mn-r-thin", { "hidden": !__props.stateSidebar, "visible": __props.stateSidebar }])
|
|
122
122
|
}, " Dark Mode ", 2),
|
|
123
123
|
createElementVNode("span", _hoisted_4, toDisplayString(unref(store).core.state.theme.darkmode ? "🌙" : "☀️"), 1)
|
|
124
124
|
], 2)
|
|
@@ -127,7 +127,7 @@ const _sfc_main = {
|
|
|
127
127
|
};
|
|
128
128
|
}
|
|
129
129
|
};
|
|
130
|
-
const Sidebar = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-
|
|
130
|
+
const Sidebar = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-0780c9a9"]]);
|
|
131
131
|
export {
|
|
132
132
|
Sidebar as default
|
|
133
133
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sidebar.vue.js","sources":["../../../../../../../../src/modules/core/views/components/partials/Sidebar.vue"],"sourcesContent":["<script setup>\nimport { ref, watch } from 'vue'\nimport { useRouter, useRoute } from 'vue-router'\nimport { useGlobalMixins } from \"@martyrs/src/modules/core/views/mixins/mixins.js\"\nimport { useStore } from '@martyrs/src/modules/core/views/store/core.store.js'\n\nconst store = useStore()\n\nconst props = defineProps({\n theme: {\n type: String,\n default: \"light\"\n },\n stateSidebar: {\n type: Boolean,\n default: false\n },\n width: {\n type: String,\n default: 'w-15r'\n },\n widthHidden:{\n type: String,\n default: 'w-3r '\n },\n})\n\nconst emits = defineEmits([\n 'closeSidebar'\n])\n\nconst { isPhone, isTablet } = useGlobalMixins()\nconst router = useRouter()\nconst route = useRoute()\n\n// Отдельный флаг для клика меню на mobile\nconst isManuallyOpened = ref(false)\n\n// Синхронизируем с stateSidebar ТОЛЬКО на mobile\nwatch(() => props.stateSidebar, (newVal) => {\n if (isPhone() || isTablet()) {\n isManuallyOpened.value = newVal\n }\n})\n\nconst toggleSidebar = () => {\n isManuallyOpened.value = !isManuallyOpened.value\n if (!isManuallyOpened.value) {\n emits('closeSidebar')\n }\n}\n\nconst handleMouseEnter = () => {\n if (route.meta?.sidebar_hover && !isPhone() && !isTablet()) {\n store.core.state.isOpenSidebar = true\n }\n}\n\nconst handleMouseLeave = () => {\n if (route.meta?.sidebar_hover && !isPhone() && !isTablet()) {\n store.core.state.isOpenSidebar = false\n }\n}\n\nrouter.beforeEach((to, from) => {\n // На mobile не трогаем state через навигацию\n if (isPhone() || isTablet()) {\n emits('closeSidebar')\n return\n }\n\n\n // Desktop логика\n // Если уходим с профиля И НЕ идем на профиль - закрыть\n if (from.meta?.sidebarCloseOnLeave === true && to.meta?.sidebarOpenOnEnter !== true) {\n store.core.state.isOpenSidebar = false\n }\n\n // Если приходим на профиль - открыть\n if (to.meta?.sidebarOpenOnEnter === true) {\n store.core.state.isOpenSidebar = true\n }\n})\n</script>\n\n<template>\n <aside\n data-sidebar\n class=\"ease-quint-out w-min-0 flex-child-default z-index-2 br-r-1px flex flex-column h-100\"\n :class=\"[\n { 'mobile-opened': isManuallyOpened },\n stateSidebar\n ? `${width} w-min-10 tablet:w-min-100 tablet:w-100 mobile:w-min-100 mobile:w-100`\n : `${widthHidden} mobile:w-0`,\n //\n theme === 'light'\n ? 't-black bg-white br-light'\n : 't-white bg-black br-dark'\n ]\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n >\n <!-- Header slot - shrink-0 -->\n <div class=\"flex-shrink-0\">\n <slot name=\"header\"></slot>\n </div>\n\n <!-- Main scrollable content - flex-1 overflow-y-auto -->\n <div class=\"flex-child-1 o-y-auto\">\n <slot></slot>\n </div>\n\n <!-- Footer slot - shrink-0 -->\n <div class=\"flex-shrink-0\">\n <slot name=\"footer\"></slot>\n </div>\n <div v-if=\"MOBILE_APP\" @click=\"() => toggleSidebar()\" class=\"flex-shrink-0 pos-relative\">\n <div class=\"bg-light radius-medium pd-medium\">\n <p class=\"fw-medium t-black-transp-60\">\n Close Menu\n </p>\n </div>\n </div>\n <div\n class=\"flex-shrink-0 w-100 br-t-1px\"\n :class=\"{ \n 'pd-micro': !stateSidebar, \n 'pd-small': stateSidebar,\n 'br-light': theme === 'light',\n 'br-dark': theme === 'dark'\n }\"\n >\n <button\n @click=\"() => store.core.actions.toggleTheme()\"\n class=\"ease-quint-out flex w-100 flex-center radius-small cursor-pointer flex-nowrap\"\n :class=\"[\n stateSidebar ? 'pd-thin justify-between' : 'w-100 justify-center',\n theme === 'light' ? 'hover:bg-light' : 'hover:bg-dark'\n ]\"\n >\n <span\n class=\"w-100
|
|
1
|
+
{"version":3,"file":"Sidebar.vue.js","sources":["../../../../../../../../src/modules/core/views/components/partials/Sidebar.vue"],"sourcesContent":["<script setup>\nimport { ref, watch } from 'vue'\nimport { useRouter, useRoute } from 'vue-router'\nimport { useGlobalMixins } from \"@martyrs/src/modules/core/views/mixins/mixins.js\"\nimport { useStore } from '@martyrs/src/modules/core/views/store/core.store.js'\n\nconst store = useStore()\n\nconst props = defineProps({\n theme: {\n type: String,\n default: \"light\"\n },\n stateSidebar: {\n type: Boolean,\n default: false\n },\n width: {\n type: String,\n default: 'w-15r'\n },\n widthHidden:{\n type: String,\n default: 'w-3r '\n },\n})\n\nconst emits = defineEmits([\n 'closeSidebar'\n])\n\nconst { isPhone, isTablet } = useGlobalMixins()\nconst router = useRouter()\nconst route = useRoute()\n\n// Отдельный флаг для клика меню на mobile\nconst isManuallyOpened = ref(false)\n\n// Синхронизируем с stateSidebar ТОЛЬКО на mobile\nwatch(() => props.stateSidebar, (newVal) => {\n if (isPhone() || isTablet()) {\n isManuallyOpened.value = newVal\n }\n})\n\nconst toggleSidebar = () => {\n isManuallyOpened.value = !isManuallyOpened.value\n if (!isManuallyOpened.value) {\n emits('closeSidebar')\n }\n}\n\nconst handleMouseEnter = () => {\n if (route.meta?.sidebar_hover && !isPhone() && !isTablet()) {\n store.core.state.isOpenSidebar = true\n }\n}\n\nconst handleMouseLeave = () => {\n if (route.meta?.sidebar_hover && !isPhone() && !isTablet()) {\n store.core.state.isOpenSidebar = false\n }\n}\n\nrouter.beforeEach((to, from) => {\n // На mobile не трогаем state через навигацию\n if (isPhone() || isTablet()) {\n emits('closeSidebar')\n return\n }\n\n\n // Desktop логика\n // Если уходим с профиля И НЕ идем на профиль - закрыть\n if (from.meta?.sidebarCloseOnLeave === true && to.meta?.sidebarOpenOnEnter !== true) {\n store.core.state.isOpenSidebar = false\n }\n\n // Если приходим на профиль - открыть\n if (to.meta?.sidebarOpenOnEnter === true) {\n store.core.state.isOpenSidebar = true\n }\n})\n</script>\n\n<template>\n <aside\n data-sidebar\n class=\"ease-quint-out w-min-0 flex-child-default z-index-2 br-r-1px flex flex-column h-100\"\n :class=\"[\n { 'mobile-opened': isManuallyOpened },\n stateSidebar\n ? `${width} w-min-10 tablet:w-min-100 tablet:w-100 mobile:w-min-100 mobile:w-100`\n : `${widthHidden} mobile:w-0`,\n //\n theme === 'light'\n ? 't-black bg-white br-light'\n : 't-white bg-black br-dark'\n ]\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n >\n <!-- Header slot - shrink-0 -->\n <div class=\"flex-shrink-0\">\n <slot name=\"header\"></slot>\n </div>\n\n <!-- Main scrollable content - flex-1 overflow-y-auto -->\n <div class=\"flex-child-1 o-y-auto\">\n <slot></slot>\n </div>\n\n <!-- Footer slot - shrink-0 -->\n <div class=\"flex-shrink-0\">\n <slot name=\"footer\"></slot>\n </div>\n <div v-if=\"MOBILE_APP\" @click=\"() => toggleSidebar()\" class=\"flex-shrink-0 pos-relative\">\n <div class=\"bg-light radius-medium pd-medium\">\n <p class=\"fw-medium t-black-transp-60\">\n Close Menu\n </p>\n </div>\n </div>\n <div\n class=\"flex-shrink-0 w-100 br-t-1px\"\n :class=\"{ \n 'pd-micro': !stateSidebar, \n 'pd-small': stateSidebar,\n 'br-light': theme === 'light',\n 'br-dark': theme === 'dark'\n }\"\n >\n <button\n @click=\"() => store.core.actions.toggleTheme()\"\n class=\"ease-quint-out flex w-100 flex-center radius-small cursor-pointer flex-nowrap\"\n :class=\"[\n stateSidebar ? 'pd-thin justify-between' : 'w-100 justify-center',\n theme === 'light' ? 'hover:bg-light' : 'hover:bg-dark'\n ]\"\n >\n <span\n class=\"w-100 ws-nowrap ease-quint-out t-left fw-medium mn-r-thin\"\n :class=\"{ 'hidden': !stateSidebar, 'visible': stateSidebar }\"\n >\n Dark Mode\n </span>\n <span class=\"aspect-1x1 flex-child-default w-max-big w-100 flex flex-center \">\n {{ store.core.state.theme.darkmode ? '🌙' : '☀️' }}\n </span>\n </button>\n </div>\n </aside>\n</template>\n\n<style scoped>\n.hidden {\n opacity: 0;\n width: 0;\n display: none;\n}\n.visible {\n opacity: 1;\n display: block;\n}\n\n/* Mobile: ВСЕГДА скрываем, показываем ТОЛЬКО по клику меню */\n@media (max-width: 1024px) {\n aside[data-sidebar] {\n position: absolute !important;\n left: 0 !important;\n transform: translateX(-100%) !important;\n visibility: hidden !important;\n z-index: 1000 !important;\n }\n\n /* Показываем ТОЛЬКО когда manual клик (НЕ от SSR state) */\n aside[data-sidebar].mobile-opened {\n transform: translateX(0) !important;\n visibility: visible !important;\n }\n}\n\n/* Scrollbar styles */\n::-webkit-scrollbar {\n width: 6px;\n}\n::-webkit-scrollbar-track {\n background: transparent;\n}\n::-webkit-scrollbar-thumb {\n background-color: var(--grey-micro);\n border-radius: 3px;\n}\n::-webkit-scrollbar-thumb:hover {\n background-color: var(--grey-small);\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,UAAM,QAAQ,SAAQ;AAEtB,UAAM,QAAQ;AAmBd,UAAM,QAAQ;AAId,UAAM,EAAE,SAAS,SAAQ,IAAK,gBAAe;AAC7C,UAAM,SAAS,UAAS;AACxB,UAAM,QAAQ,SAAQ;AAGtB,UAAM,mBAAmB,IAAI,KAAK;AAGlC,UAAM,MAAM,MAAM,cAAc,CAAC,WAAW;AAC1C,UAAI,QAAO,KAAM,YAAY;AAC3B,yBAAiB,QAAQ;AAAA,MAC3B;AAAA,IACF,CAAC;AAED,UAAM,gBAAgB,MAAM;AAC1B,uBAAiB,QAAQ,CAAC,iBAAiB;AAC3C,UAAI,CAAC,iBAAiB,OAAO;AAC3B,cAAM,cAAc;AAAA,MACtB;AAAA,IACF;AAEA,UAAM,mBAAmB,MAAM;AAC7B,UAAI,MAAM,MAAM,iBAAiB,CAAC,QAAO,KAAM,CAAC,YAAY;AAC1D,cAAM,KAAK,MAAM,gBAAgB;AAAA,MACnC;AAAA,IACF;AAEA,UAAM,mBAAmB,MAAM;AAC7B,UAAI,MAAM,MAAM,iBAAiB,CAAC,QAAO,KAAM,CAAC,YAAY;AAC1D,cAAM,KAAK,MAAM,gBAAgB;AAAA,MACnC;AAAA,IACF;AAEA,WAAO,WAAW,CAAC,IAAI,SAAS;AAE9B,UAAI,QAAO,KAAM,YAAY;AAC3B,cAAM,cAAc;AACpB;AAAA,MACF;AAKA,UAAI,KAAK,MAAM,wBAAwB,QAAQ,GAAG,MAAM,uBAAuB,MAAM;AACnF,cAAM,KAAK,MAAM,gBAAgB;AAAA,MACnC;AAGA,UAAI,GAAG,MAAM,uBAAuB,MAAM;AACxC,cAAM,KAAK,MAAM,gBAAgB;AAAA,MACnC;AAAA,IACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -11,10 +11,10 @@ import _export_sfc from "../../../../../../../_virtual/_plugin-vue_export-helper
|
|
|
11
11
|
import _sfc_main$6 from "./filters/FilterOptions.vue.js";
|
|
12
12
|
import _sfc_main$1 from "../../../../icons/navigation/IconFilter.vue.js";
|
|
13
13
|
/* empty css */
|
|
14
|
-
const _hoisted_1 = { class: "flex o-x-scroll scroll-hide
|
|
14
|
+
const _hoisted_1 = { class: "flex o-x-scroll scroll-hide ws-nowrap gap-thin" };
|
|
15
15
|
const _hoisted_2 = { key: 0 };
|
|
16
16
|
const _hoisted_3 = ["onClick"];
|
|
17
|
-
const _hoisted_4 = { class: "
|
|
17
|
+
const _hoisted_4 = { class: "ws-nowrap" };
|
|
18
18
|
const _hoisted_5 = {
|
|
19
19
|
key: 1,
|
|
20
20
|
class: "mn-l-micro"
|
|
@@ -266,7 +266,7 @@ const _sfc_main = {
|
|
|
266
266
|
};
|
|
267
267
|
}
|
|
268
268
|
};
|
|
269
|
-
const Filters = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-
|
|
269
|
+
const Filters = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-026224ab"]]);
|
|
270
270
|
export {
|
|
271
271
|
Filters as default
|
|
272
272
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Filters.vue2.js","sources":["../../../../../../../../src/modules/core/views/components/sections/Filters.vue"],"sourcesContent":["<template>\n <div class=\"flex o-x-scroll scroll-hide t-nowrap gap-thin\">\n <!-- All Filters Button -->\n <button\n @click=\"showAllFilters = true\"\n class=\"pd-small radius-medium bg-light flex-v-center flex gap-micro cursor-pointer\"\n :class=\"{ 'bg-main': activeFiltersCount > 0 }\"\n >\n <IconFilter class=\"i-regular\" />\n <span class=\"h-1r\"></span>\n <span v-if=\"activeFiltersCount\">{{ activeFiltersCount }}</span>\n </button>\n\n <!-- Individual Filter Buttons -->\n <button\n v-for=\"filter in filters\"\n :key=\"filter.value\"\n @click=\"openFilter(filter.value)\"\n class=\"pd-small radius-medium bg-light cursor-pointer flex-v-center flex gap-micro\"\n :class=\"{ 'selected bg-main': isFilterActive(filter) }\"\n >\n <IconCalendar v-if=\"filter.type === 'date'\" class=\"mn-r-micro i-regular\" />\n <span class=\"t-nowrap\">{{ filter.type === 'date' && getFilterValue(filter) ? formatFilterValue(filter) : filter.title }}</span>\n <span v-if=\"getFilterValue(filter) && filter.type !== 'date'\" class=\"mn-l-micro\">\n {{ formatFilterValue(filter) }}\n </span>\n </button>\n\n <!-- All Filters Popup -->\n <Popup\n :isPopupOpen=\"showAllFilters\"\n @close-popup=\"closeAllFilters\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"w-min-20r bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <FiltersGroup\n :filters=\"filters\"\n v-model:selected=\"tempSelected\"\n :immediate=\"false\"\n :showHeader=\"true\"\n :showApplyButton=\"true\"\n :showResetButton=\"true\"\n @update:selected=\"applyAllFilters\"\n />\n </Popup>\n\n <!-- Individual Filter Popups -->\n <Popup\n v-for=\"filter in filters\"\n :key=\"`popup-${filter.value}`\"\n :isPopupOpen=\"individualPopups[filter.value]\"\n @close-popup=\"cancelFilter(filter.value)\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <h4 class=\"mn-b-medium\">{{ filter.title }}</h4>\n\n <!-- Checkbox Filter -->\n <FilterCheckbox\n v-if=\"filter.type === 'checkbox'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <!-- Range Filter -->\n <FilterRange\n v-else-if=\"filter.type === 'range'\"\n v-model=\"tempSelected[filter.value]\"\n :minPlaceholder=\"filter.minPlaceholder || 'Min'\"\n :maxPlaceholder=\"filter.maxPlaceholder || 'Max'\"\n :label=\"filter.label\"\n />\n\n <!-- Date Filter -->\n <div v-else-if=\"filter.type === 'date'\">\n <div class=\"mn-t-small\">\n <Calendar\n v-model:date=\"tempSelected[filter.value]\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"bg-light radius-small\"\n />\n </div>\n </div>\n\n <!-- Radio/Options Filter -->\n <FilterOptions\n v-else-if=\"filter.type === 'radio'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <div class=\"flex gap-thin mn-t-medium\">\n <button\n @click=\"cancelFilter(filter.value)\"\n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n <button\n @click=\"applyFilter(filter.value)\"\n class=\"bg-main w-100 button flex-child-full\"\n >\n Apply\n </button>\n </div>\n </Popup>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, reactive, watch } from 'vue'\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport FiltersGroup from './filters/FiltersGroup.vue'\nimport FilterCheckbox from './filters/FilterCheckbox.vue'\nimport FilterRange from './filters/FilterRange.vue'\nimport FilterDateRange from './filters/FilterDateRange.vue'\nimport FilterOptions from './filters/FilterOptions.vue'\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue'\nimport IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\nconst filters = defineModel('filters', {\n type: Array,\n required: true\n})\n\nconst selected = defineModel('selected', {\n type: Object,\n default: () => ({})\n})\n\nconst emit = defineEmits(['select'])\n\nconst { formatDate, returnCurrency } = useGlobalMixins()\n\n// State\nconst showAllFilters = ref(false)\nconst individualPopups = reactive({})\nconst tempSelected = reactive({})\nconst tempDateRange = ref(null)\n\n// Initialize popups and temp values\nwatch(filters, (newFilters) => {\n newFilters.forEach(filter => {\n individualPopups[filter.value] = false\n \n if (!tempSelected[filter.value]) {\n if (filter.type === 'checkbox') {\n tempSelected[filter.value] = [...(selected.value[filter.value] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filter.value] = { ...(selected.value[filter.value] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filter.value] = selected.value[filter.value] || null\n } else {\n tempSelected[filter.value] = selected.value[filter.value] || null\n }\n }\n })\n}, { immediate: true, deep: true })\n\n// Sync selected to tempSelected\nwatch(selected, (newSelected) => {\n Object.keys(newSelected).forEach(key => {\n const filter = filters.value.find(f => f.value === key)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[key] = [...(newSelected[key] || [])]\n } else if (filter.type === 'range') {\n tempSelected[key] = { ...(newSelected[key] || { min: '', max: '' }) }\n } else {\n tempSelected[key] = newSelected[key]\n }\n }\n })\n}, { deep: true })\n\n// Computed\nconst activeFiltersCount = computed(() => {\n return Object.entries(selected.value).filter(([key, value]) => {\n if (Array.isArray(value)) return value.length > 0\n if (typeof value === 'object' && value !== null) {\n return value.min || value.max\n }\n return value !== null && value !== undefined\n }).length\n})\n\n// Methods\nconst openFilter = (filterValue) => {\n individualPopups[filterValue] = true\n}\n\nconst isFilterActive = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n if (Array.isArray(value)) return value.length > 0\n if (filter.type === 'range') return value.min || value.max\n return true\n}\n\nconst getFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n \n if (filter.type === 'range') {\n return value.min || value.max\n }\n \n if (filter.type === 'date') {\n return value && value.start && value.end\n }\n \n if (Array.isArray(value)) {\n return value.length > 0\n }\n \n return value\n}\n\nconst formatFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return ''\n \n if (Array.isArray(value)) {\n return `(${value.length})`\n }\n \n if (filter.type === 'range') {\n if (!value.min && !value.max) return ''\n return `${value.min || '0'}-${value.max || '∞'}`\n }\n \n if (filter.type === 'date') {\n if (!value || !value.start || !value.end) return ''\n return `${formatDate(value.start, { dayMonth: true, language: 'en' })} - ${formatDate(value.end, { dayMonth: true, language: 'en' })}`\n }\n \n if (filter.type === 'radio') {\n const option = filter.options.find(o => o.value === value)\n return option ? `(${option.label})` : ''\n }\n \n return ''\n}\n\nconst applyFilter = (filterValue) => {\n selected.value[filterValue] = tempSelected[filterValue]\n individualPopups[filterValue] = false\n emit('select', { filter: filterValue, value: tempSelected[filterValue] })\n}\n\nconst cancelFilter = (filterValue) => {\n const filter = filters.value.find(f => f.value === filterValue)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[filterValue] = [...(selected.value[filterValue] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filterValue] = { ...(selected.value[filterValue] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filterValue] = selected.value[filterValue] || null\n } else {\n tempSelected[filterValue] = selected.value[filterValue] || null\n }\n }\n individualPopups[filterValue] = false\n}\n\nconst applyAllFilters = (newValues) => {\n Object.entries(newValues).forEach(([key, value]) => {\n if (selected.value[key] !== value) {\n selected.value[key] = value\n emit('select', { filter: key, value })\n }\n })\n showAllFilters.value = false\n}\n\nconst closeAllFilters = () => {\n showAllFilters.value = false\n}\n</script>\n\n<style scoped>\n.filters-content {\n max-height: 60vh;\n overflow-y: auto;\n}\n</style>"],"names":["_useModel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Filters.vue2.js","sources":["../../../../../../../../src/modules/core/views/components/sections/Filters.vue"],"sourcesContent":["<template>\n <div class=\"flex o-x-scroll scroll-hide ws-nowrap gap-thin\">\n <!-- All Filters Button -->\n <button\n @click=\"showAllFilters = true\"\n class=\"pd-small radius-medium bg-light flex-v-center flex gap-micro cursor-pointer\"\n :class=\"{ 'bg-main': activeFiltersCount > 0 }\"\n >\n <IconFilter class=\"i-regular\" />\n <span class=\"h-1r\"></span>\n <span v-if=\"activeFiltersCount\">{{ activeFiltersCount }}</span>\n </button>\n\n <!-- Individual Filter Buttons -->\n <button\n v-for=\"filter in filters\"\n :key=\"filter.value\"\n @click=\"openFilter(filter.value)\"\n class=\"pd-small radius-medium bg-light cursor-pointer flex-v-center flex gap-micro\"\n :class=\"{ 'selected bg-main': isFilterActive(filter) }\"\n >\n <IconCalendar v-if=\"filter.type === 'date'\" class=\"mn-r-micro i-regular\" />\n <span class=\"ws-nowrap\">{{ filter.type === 'date' && getFilterValue(filter) ? formatFilterValue(filter) : filter.title }}</span>\n <span v-if=\"getFilterValue(filter) && filter.type !== 'date'\" class=\"mn-l-micro\">\n {{ formatFilterValue(filter) }}\n </span>\n </button>\n\n <!-- All Filters Popup -->\n <Popup\n :isPopupOpen=\"showAllFilters\"\n @close-popup=\"closeAllFilters\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"w-min-20r bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <FiltersGroup\n :filters=\"filters\"\n v-model:selected=\"tempSelected\"\n :immediate=\"false\"\n :showHeader=\"true\"\n :showApplyButton=\"true\"\n :showResetButton=\"true\"\n @update:selected=\"applyAllFilters\"\n />\n </Popup>\n\n <!-- Individual Filter Popups -->\n <Popup\n v-for=\"filter in filters\"\n :key=\"`popup-${filter.value}`\"\n :isPopupOpen=\"individualPopups[filter.value]\"\n @close-popup=\"cancelFilter(filter.value)\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <h4 class=\"mn-b-medium\">{{ filter.title }}</h4>\n\n <!-- Checkbox Filter -->\n <FilterCheckbox\n v-if=\"filter.type === 'checkbox'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <!-- Range Filter -->\n <FilterRange\n v-else-if=\"filter.type === 'range'\"\n v-model=\"tempSelected[filter.value]\"\n :minPlaceholder=\"filter.minPlaceholder || 'Min'\"\n :maxPlaceholder=\"filter.maxPlaceholder || 'Max'\"\n :label=\"filter.label\"\n />\n\n <!-- Date Filter -->\n <div v-else-if=\"filter.type === 'date'\">\n <div class=\"mn-t-small\">\n <Calendar\n v-model:date=\"tempSelected[filter.value]\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"bg-light radius-small\"\n />\n </div>\n </div>\n\n <!-- Radio/Options Filter -->\n <FilterOptions\n v-else-if=\"filter.type === 'radio'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <div class=\"flex gap-thin mn-t-medium\">\n <button\n @click=\"cancelFilter(filter.value)\"\n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n <button\n @click=\"applyFilter(filter.value)\"\n class=\"bg-main w-100 button flex-child-full\"\n >\n Apply\n </button>\n </div>\n </Popup>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, reactive, watch } from 'vue'\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport FiltersGroup from './filters/FiltersGroup.vue'\nimport FilterCheckbox from './filters/FilterCheckbox.vue'\nimport FilterRange from './filters/FilterRange.vue'\nimport FilterDateRange from './filters/FilterDateRange.vue'\nimport FilterOptions from './filters/FilterOptions.vue'\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue'\nimport IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\nconst filters = defineModel('filters', {\n type: Array,\n required: true\n})\n\nconst selected = defineModel('selected', {\n type: Object,\n default: () => ({})\n})\n\nconst emit = defineEmits(['select'])\n\nconst { formatDate, returnCurrency } = useGlobalMixins()\n\n// State\nconst showAllFilters = ref(false)\nconst individualPopups = reactive({})\nconst tempSelected = reactive({})\nconst tempDateRange = ref(null)\n\n// Initialize popups and temp values\nwatch(filters, (newFilters) => {\n newFilters.forEach(filter => {\n individualPopups[filter.value] = false\n \n if (!tempSelected[filter.value]) {\n if (filter.type === 'checkbox') {\n tempSelected[filter.value] = [...(selected.value[filter.value] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filter.value] = { ...(selected.value[filter.value] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filter.value] = selected.value[filter.value] || null\n } else {\n tempSelected[filter.value] = selected.value[filter.value] || null\n }\n }\n })\n}, { immediate: true, deep: true })\n\n// Sync selected to tempSelected\nwatch(selected, (newSelected) => {\n Object.keys(newSelected).forEach(key => {\n const filter = filters.value.find(f => f.value === key)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[key] = [...(newSelected[key] || [])]\n } else if (filter.type === 'range') {\n tempSelected[key] = { ...(newSelected[key] || { min: '', max: '' }) }\n } else {\n tempSelected[key] = newSelected[key]\n }\n }\n })\n}, { deep: true })\n\n// Computed\nconst activeFiltersCount = computed(() => {\n return Object.entries(selected.value).filter(([key, value]) => {\n if (Array.isArray(value)) return value.length > 0\n if (typeof value === 'object' && value !== null) {\n return value.min || value.max\n }\n return value !== null && value !== undefined\n }).length\n})\n\n// Methods\nconst openFilter = (filterValue) => {\n individualPopups[filterValue] = true\n}\n\nconst isFilterActive = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n if (Array.isArray(value)) return value.length > 0\n if (filter.type === 'range') return value.min || value.max\n return true\n}\n\nconst getFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n \n if (filter.type === 'range') {\n return value.min || value.max\n }\n \n if (filter.type === 'date') {\n return value && value.start && value.end\n }\n \n if (Array.isArray(value)) {\n return value.length > 0\n }\n \n return value\n}\n\nconst formatFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return ''\n \n if (Array.isArray(value)) {\n return `(${value.length})`\n }\n \n if (filter.type === 'range') {\n if (!value.min && !value.max) return ''\n return `${value.min || '0'}-${value.max || '∞'}`\n }\n \n if (filter.type === 'date') {\n if (!value || !value.start || !value.end) return ''\n return `${formatDate(value.start, { dayMonth: true, language: 'en' })} - ${formatDate(value.end, { dayMonth: true, language: 'en' })}`\n }\n \n if (filter.type === 'radio') {\n const option = filter.options.find(o => o.value === value)\n return option ? `(${option.label})` : ''\n }\n \n return ''\n}\n\nconst applyFilter = (filterValue) => {\n selected.value[filterValue] = tempSelected[filterValue]\n individualPopups[filterValue] = false\n emit('select', { filter: filterValue, value: tempSelected[filterValue] })\n}\n\nconst cancelFilter = (filterValue) => {\n const filter = filters.value.find(f => f.value === filterValue)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[filterValue] = [...(selected.value[filterValue] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filterValue] = { ...(selected.value[filterValue] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filterValue] = selected.value[filterValue] || null\n } else {\n tempSelected[filterValue] = selected.value[filterValue] || null\n }\n }\n individualPopups[filterValue] = false\n}\n\nconst applyAllFilters = (newValues) => {\n Object.entries(newValues).forEach(([key, value]) => {\n if (selected.value[key] !== value) {\n selected.value[key] = value\n emit('select', { filter: key, value })\n }\n })\n showAllFilters.value = false\n}\n\nconst closeAllFilters = () => {\n showAllFilters.value = false\n}\n</script>\n\n<style scoped>\n.filters-content {\n max-height: 60vh;\n overflow-y: auto;\n}\n</style>"],"names":["_useModel"],"mappings":"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"}
|
|
@@ -49,7 +49,7 @@ const _sfc_main = {
|
|
|
49
49
|
selected: __props.tabs_current,
|
|
50
50
|
"onUpdate:selected": updateTabsCurrent,
|
|
51
51
|
tabs: __props.tabs,
|
|
52
|
-
class: "mn-t-small pd-thin bg-light radius-small w-max
|
|
52
|
+
class: "mn-t-small pd-thin bg-light radius-small w-max ws-nowrap o-scroll p-regular"
|
|
53
53
|
}, null, 8, ["selected", "tabs"])) : createCommentVNode("", true)
|
|
54
54
|
]);
|
|
55
55
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SectionPageTitle.vue.js","sources":["../../../../../../../../src/modules/core/views/components/sections/SectionPageTitle.vue"],"sourcesContent":["<template>\n <div>\n <header class=\"flex-v-center flex-nowrap flex\">\n <h1 class=\"h2 mn-r-auto\">{{ title }}</h1>\n\n <template \n v-for=\"action in actions\" \n v-if=\"actions && actions.length > 0\"\n >\n <router-link\n v-if=\"action.to\"\n :key=\"action.to\"\n :to=\"action.to\"\n :class=\"action.class || 'radius-extra pd-small pd-r-medium pd-l-medium p-regular uppercase fw-medium hover:scale-[1.05] ease cursor-pointer t-white bg-second flex-center flex'\"\n >\n {{ action.label }}\n </router-link>\n\n <button\n v-if=\"action.method\"\n @click=\"action.method\"\n :class=\"action.class || 'radius-extra pd-thin uppercase fw-medium hover:scale-[1.05] ease cursor-pointer t-white bg-second flex-center flex'\"\n >\n {{ action.label }}\n </button>\n </template>\n </header>\n\n <Tab\n v-if=\"tabs\"\n :selected=\"tabs_current\"\n @update:selected=\"updateTabsCurrent\"\n :tabs=\"tabs\"\n class=\"mn-t-small pd-thin bg-light radius-small w-max
|
|
1
|
+
{"version":3,"file":"SectionPageTitle.vue.js","sources":["../../../../../../../../src/modules/core/views/components/sections/SectionPageTitle.vue"],"sourcesContent":["<template>\n <div>\n <header class=\"flex-v-center flex-nowrap flex\">\n <h1 class=\"h2 mn-r-auto\">{{ title }}</h1>\n\n <template \n v-for=\"action in actions\" \n v-if=\"actions && actions.length > 0\"\n >\n <router-link\n v-if=\"action.to\"\n :key=\"action.to\"\n :to=\"action.to\"\n :class=\"action.class || 'radius-extra pd-small pd-r-medium pd-l-medium p-regular uppercase fw-medium hover:scale-[1.05] ease cursor-pointer t-white bg-second flex-center flex'\"\n >\n {{ action.label }}\n </router-link>\n\n <button\n v-if=\"action.method\"\n @click=\"action.method\"\n :class=\"action.class || 'radius-extra pd-thin uppercase fw-medium hover:scale-[1.05] ease cursor-pointer t-white bg-second flex-center flex'\"\n >\n {{ action.label }}\n </button>\n </template>\n </header>\n\n <Tab\n v-if=\"tabs\"\n :selected=\"tabs_current\"\n @update:selected=\"updateTabsCurrent\"\n :tabs=\"tabs\"\n class=\"mn-t-small pd-thin bg-light radius-small w-max ws-nowrap o-scroll p-regular\"\n />\n </div>\n</template>\n\n<script setup>\nimport { ref } from 'vue';\n\nimport Tab from '@martyrs/src/components/Tab/Tab.vue'\n\nconst emits = defineEmits([\n 'update:tabs_current'\n])\n\nconst props = defineProps({\n title: String,\n actions: Array,\n tabs: Array,\n tabs_current: [Object, String]\n});\n\nconst updateTabsCurrent = (newValue) => {\n emits('update:tabs_current', newValue); // Emitting to parent component\n}\n</script>\n\n<style scoped>\n</style>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AA2CA,UAAM,QAAQ;AAWd,UAAM,oBAAoB,CAAC,aAAa;AACtC,YAAM,uBAAuB,QAAQ;AAAA,IACvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.store.js","sources":["../../../../../../../src/modules/core/views/store/core.store.js"],"sourcesContent":["// Vue modules\nimport { Preferences } from '@capacitor/preferences';\nimport { isReactive, reactive } from 'vue';\n\nimport SessionManager from '../classes/session.manager.js';\n\n// AsyncLocalStorage для изоляции SSR store per-request (только Node.js)\nlet asyncLocalStorage = null;\n\nasync function getAsyncLocalStorage() {\n if (!asyncLocalStorage && typeof window === 'undefined') {\n const { AsyncLocalStorage } = await import('async_hooks');\n asyncLocalStorage = new AsyncLocalStorage();\n }\n return asyncLocalStorage;\n}\n\n// ============================================================================\n// GLOBAL FUNCTIONS (используют useStore() для доступа к state)\n// ============================================================================\n\n// Mutations\nexport function setError(error) {\n const state = useStore().core.state;\n state.error.show = true;\n let errorData;\n\n errorData = error;\n\n // Обработка ошибок из fetch API (Store class)\n if (error?.info) errorData = error.info;\n\n // Обработка ошибок из axios\n if (error?.response?.data) errorData = error.response.data;\n\n // Обработка ошибок верификации\n if ((errorData?.error === 'VALIDATION_ERROR' || errorData?.errors) && errorData?.errors) {\n // Собираем все сообщения об ошибках в одну строку\n const errorMessages = [];\n for (const field in errorData.errors) {\n const fieldErrors = errorData.errors[field];\n if (Array.isArray(fieldErrors)) {\n errorMessages.push(...fieldErrors);\n } else if (typeof fieldErrors === 'string') {\n errorMessages.push(fieldErrors);\n }\n }\n state.error.message = errorMessages.join(', ') || errorData.message || 'Validation error';\n } else if (error && errorData.errorCode) {\n // state.error.message = i18n.global.t(`errors.${errorData.errorCode}`);\n state.error.message = errorData.errorCode;\n } else {\n state.error.message = errorData.message || error.message || 'Unknown error';\n }\n\n state.error.show = true;\n\n if (typeof window !== 'undefined' && window.requestAnimationFrame) {\n requestAnimationFrame(() => {\n setTimeout(() => (state.error.show = false), 5000);\n });\n } else {\n setTimeout(() => (state.error.show = false), 5000);\n }\n}\n\nexport function setSnack(data) {\n const state = useStore().core.state;\n\n // Handle different input formats\n let type = 'notification'\n let message = ''\n let duration = 3000\n\n if (typeof data === 'string') {\n message = data\n } else if (data instanceof Error) {\n type = 'error'\n message = data.message\n } else if (data?.response?.data) {\n // Handle API errors\n type = 'error'\n const errorData = data.response.data\n message = errorData.errorCode || errorData.message || 'Unknown error'\n } else if (typeof data === 'object') {\n type = data.type || 'notification'\n message = data.message || ''\n duration = data.duration || 3000\n }\n\n // Update state\n state.snack = {\n show: true,\n type,\n message,\n duration\n }\n\n // Auto-hide\n if (typeof window !== 'undefined' && window.requestAnimationFrame) {\n requestAnimationFrame(() => {\n setTimeout(() => {state.snack.show = false }, duration)\n });\n } else {\n setTimeout(() => {state.snack.show = false }, duration)\n }\n}\n\n// ============================================================================\n// GLOBAL STORE FACTORY\n// ============================================================================\n\n// Фабрика для создания store\nexport function createStore() {\n // State создается для каждого store instance (изоляция SSR)\n const state = reactive({\n loading: false,\n\n isOpenLocationPopup: false,\n isOpenSidebar: false,\n\n position: null,\n search: null,\n\n theme: {\n mode: 'system', // 'light' | 'dark' | 'system'\n },\n\n navigation_bar: {\n name: null,\n actions: null,\n },\n\n error: {\n status: '',\n headers: '',\n data: '',\n show: false,\n name: '',\n message: '',\n },\n snack: {\n show: false,\n type: 'notification',\n message: '',\n duration: 3000\n },\n\n // Session state - данные сессии хранятся здесь\n session: {\n token: null,\n userId: null,\n roles: null,\n accesses: []\n },\n });\n\n // Actions с closure на локальный state\n const actions = {\n setLoading(status) {\n state.loading = status;\n },\n\n // Theme: 'light' | 'dark' | 'system'\n async setTheme(mode) {\n state.theme.mode = mode;\n\n // Cookie/Preferences ТОЛЬКО для явного выбора light/dark\n // system — не сохраняем, пусть работает CSS media query\n if (mode === 'light' || mode === 'dark') {\n if (typeof document !== 'undefined') {\n document.cookie = `theme=${mode}; path=/; max-age=31536000; SameSite=Lax`;\n }\n await Preferences.set({ key: 'theme', value: mode });\n } else {\n // system — удаляем cookie чтобы SSR не фиксировал тему\n if (typeof document !== 'undefined') {\n document.cookie = `theme=; path=/; max-age=0`;\n }\n await Preferences.remove({ key: 'theme' });\n }\n\n const root = document.documentElement;\n\n // Убираем старые атрибуты\n root.classList.remove('dark-theme', 'light-theme');\n root.removeAttribute('data-theme');\n\n if (mode === 'dark') {\n root.classList.add('dark-theme');\n root.setAttribute('data-theme', 'dark');\n root.setAttribute('color-scheme', 'dark');\n } else if (mode === 'light') {\n root.classList.add('light-theme');\n root.setAttribute('data-theme', 'light');\n root.setAttribute('color-scheme', 'light');\n } else {\n // system - без классов, CSS media query сработает\n root.setAttribute('color-scheme', 'light dark');\n }\n\n },\n\n toggleTheme() {\n // Прямое переключение между light и dark\n const isDark = state.theme.mode === 'dark' ||\n (state.theme.mode === 'system' && typeof window !== 'undefined' &&\n window.matchMedia('(prefers-color-scheme: dark)').matches);\n this.setTheme(isDark ? 'light' : 'dark');\n },\n\n add(array, item) {\n const existingItemIndex = array.findIndex(i => i._id === item._id);\n\n if (existingItemIndex === -1) {\n array.push(item);\n } else {\n array[existingItemIndex] = item;\n }\n },\n\n update(array, item) {\n const existingItemIndex = array.findIndex(i => i._id === item._id);\n if (existingItemIndex === -1) {\n // If the item doesn't exist, push it to the array\n array.push(item);\n } else {\n // Update the item in the array without creating a new array\n Object.assign(array[existingItemIndex], item);\n }\n },\n\n delete(array, item) {\n const existingItemIndex = array.findIndex(c => c._id === item._id);\n\n if (existingItemIndex !== -1) {\n array.splice(existingItemIndex, 1);\n }\n },\n\n increment(array, item) {\n console.log(array);\n console.log(item);\n const arrayItem = array.find(i => i._id === item._id);\n\n if (arrayItem) {\n arrayItem.quantity++;\n }\n },\n\n decrement(array, item) {\n const arrayItem = array.find(i => i._id === item._id);\n\n const arrayItemIndex = array.indexOf(arrayItem);\n\n if (arrayItemIndex > -1) {\n arrayItem.quantity--;\n\n if (arrayItem.quantity < 1) array.splice(arrayItemIndex, 1);\n }\n },\n\n reset(array) {\n array = [];\n },\n };\n\n // SessionManager создается внутри createStore для правильной изоляции в SSR\n const sessionManager = new SessionManager(state.session);\n\n const store = reactive({\n modules: [],\n\n // Core module registered by default\n core: { state, actions, session: sessionManager },\n\n addStore(name, storage) {\n this[name] = storage;\n this.modules.push(name);\n },\n\n async getInitialState() {\n const initialState = {};\n for (const [moduleName, moduleStore] of Object.entries(this)) {\n if (moduleName !== 'modules' && moduleName !== 'addStore' && moduleName !== 'getInitialState' && moduleName !== 'setInitialState') {\n if (moduleStore.state) {\n initialState[moduleName] = JSON.parse(JSON.stringify(moduleStore.state));\n }\n }\n }\n return initialState;\n },\n\n async setInitialState(initialState, isHydration = false) {\n const modules = Object.entries(initialState);\n\n for (const [moduleName, moduleState] of modules) {\n if (this[moduleName] && this[moduleName].state) {\n // При гидратации просто заменяем state целиком для скорости\n if (isHydration) {\n Object.assign(this[moduleName].state, moduleState);\n } else {\n mergeReactive(this[moduleName].state, moduleState);\n }\n }\n }\n }\n });\n\n function mergeReactive(target, source) {\n // Оптимизированная версия слияния\n const keys = Object.keys(source);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const sourceValue = source[key];\n\n if (sourceValue !== null && typeof sourceValue === 'object' && !Array.isArray(sourceValue)) {\n if (isReactive(target[key])) {\n mergeReactive(target[key], sourceValue);\n } else {\n target[key] = sourceValue;\n }\n } else {\n target[key] = sourceValue;\n }\n }\n }\n\n return store;\n}\n\n// ============================================================================\n// SSR AND SINGLETON\n// ============================================================================\n\n// Синглтон для клиента\nlet clientStore = null;\n\n// AsyncLocalStorage для SSR (изоляция per-request)\nexport async function setSSRStore(store) {\n if (typeof window === 'undefined') {\n const als = await getAsyncLocalStorage();\n als?.enterWith(store);\n }\n}\n\nexport async function clearSSRStore() {\n if (typeof window === 'undefined') {\n const als = await getAsyncLocalStorage();\n als?.enterWith(null);\n }\n}\n\nexport function useStore() {\n if (typeof window === 'undefined') {\n // SSR: используем store из AsyncLocalStorage (может быть null если не инициализирован)\n const store = asyncLocalStorage?.getStore();\n if (store) {\n return store;\n }\n // Fallback для обратной совместимости\n console.warn('[WARN] SSR store not in AsyncLocalStorage, creating new store instance');\n return createStore();\n }\n // Client: синглтон\n if (!clientStore) {\n clientStore = createStore();\n }\n return clientStore;\n}\n\n// ============================================================================\n// SESSION ACCESSOR\n// ============================================================================\n\n/**\n * Получить текущий экземпляр SessionManager\n * Использовать вместо прямого импорта session для правильной работы с SSR\n */\nexport function useSession() {\n const store = useStore();\n return store.core.session;\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\n// Не экспортируем singleton state/actions - теперь используется useStore()\nexport default useStore();\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"core.store.js","sources":["../../../../../../../src/modules/core/views/store/core.store.js"],"sourcesContent":["// Vue modules\nimport { Preferences } from '@capacitor/preferences';\nimport { isReactive, reactive } from 'vue';\n\nimport SessionManager from '../classes/session.manager.js';\n\n// AsyncLocalStorage для изоляции SSR store per-request (только Node.js)\nlet asyncLocalStorage = null;\n\nasync function getAsyncLocalStorage() {\n if (!asyncLocalStorage && typeof window === 'undefined') {\n const { AsyncLocalStorage } = await import('async_hooks');\n asyncLocalStorage = new AsyncLocalStorage();\n }\n return asyncLocalStorage;\n}\n\n// ============================================================================\n// GLOBAL FUNCTIONS (используют useStore() для доступа к state)\n// ============================================================================\n\n// Mutations\nexport function setError(error) {\n const state = useStore().core.state;\n state.error.show = true;\n let errorData;\n\n errorData = error;\n\n // Обработка ошибок из fetch API (Store class)\n if (error?.info) errorData = error.info;\n\n // Обработка ошибок из axios\n if (error?.response?.data) errorData = error.response.data;\n\n // Обработка ошибок верификации\n if ((errorData?.error === 'VALIDATION_ERROR' || errorData?.errors) && errorData?.errors) {\n // Собираем все сообщения об ошибках в одну строку\n const errorMessages = [];\n for (const field in errorData.errors) {\n const fieldErrors = errorData.errors[field];\n if (Array.isArray(fieldErrors)) {\n errorMessages.push(...fieldErrors);\n } else if (typeof fieldErrors === 'string') {\n errorMessages.push(fieldErrors);\n }\n }\n state.error.message = errorMessages.join(', ') || errorData.message || 'Validation error';\n } else if (error && errorData.errorCode) {\n // state.error.message = i18n.global.t(`errors.${errorData.errorCode}`);\n state.error.message = errorData.errorCode;\n } else {\n state.error.message = errorData.message || error.message || 'Unknown error';\n }\n\n state.error.show = true;\n\n if (typeof window !== 'undefined' && window.requestAnimationFrame) {\n requestAnimationFrame(() => {\n setTimeout(() => (state.error.show = false), 5000);\n });\n } else {\n setTimeout(() => (state.error.show = false), 5000);\n }\n}\n\nexport function setSnack(data) {\n const state = useStore().core.state;\n\n // Handle different input formats\n let type = 'notification'\n let message = ''\n let duration = 3000\n\n if (typeof data === 'string') {\n message = data\n } else if (data instanceof Error) {\n type = 'error'\n message = data.message\n } else if (data?.response?.data) {\n // Handle API errors\n type = 'error'\n const errorData = data.response.data\n message = errorData.errorCode || errorData.message || 'Unknown error'\n } else if (typeof data === 'object') {\n type = data.type || 'notification'\n message = data.message || ''\n duration = data.duration || 3000\n }\n\n // Update state\n state.snack = {\n show: true,\n type,\n message,\n duration\n }\n\n // Auto-hide\n if (typeof window !== 'undefined' && window.requestAnimationFrame) {\n requestAnimationFrame(() => {\n setTimeout(() => {state.snack.show = false }, duration)\n });\n } else {\n setTimeout(() => {state.snack.show = false }, duration)\n }\n}\n\n// ============================================================================\n// GLOBAL STORE FACTORY\n// ============================================================================\n\n// Фабрика для создания store\nexport function createStore() {\n // State создается для каждого store instance (изоляция SSR)\n const state = reactive({\n loading: false,\n notFound: false,\n\n isOpenLocationPopup: false,\n isOpenSidebar: false,\n\n position: null,\n search: null,\n\n theme: {\n mode: 'system', // 'light' | 'dark' | 'system'\n },\n\n navigation_bar: {\n name: null,\n actions: null,\n },\n\n error: {\n status: '',\n headers: '',\n data: '',\n show: false,\n name: '',\n message: '',\n },\n snack: {\n show: false,\n type: 'notification',\n message: '',\n duration: 3000\n },\n\n // Session state - данные сессии хранятся здесь\n session: {\n token: null,\n userId: null,\n roles: null,\n accesses: []\n },\n });\n\n // Actions с closure на локальный state\n const actions = {\n setLoading(status) {\n state.loading = status;\n },\n\n // Theme: 'light' | 'dark' | 'system'\n async setTheme(mode) {\n state.theme.mode = mode;\n\n // Cookie/Preferences ТОЛЬКО для явного выбора light/dark\n // system — не сохраняем, пусть работает CSS media query\n if (mode === 'light' || mode === 'dark') {\n if (typeof document !== 'undefined') {\n document.cookie = `theme=${mode}; path=/; max-age=31536000; SameSite=Lax`;\n }\n await Preferences.set({ key: 'theme', value: mode });\n } else {\n // system — удаляем cookie чтобы SSR не фиксировал тему\n if (typeof document !== 'undefined') {\n document.cookie = `theme=; path=/; max-age=0`;\n }\n await Preferences.remove({ key: 'theme' });\n }\n\n const root = document.documentElement;\n\n // Убираем старые атрибуты\n root.classList.remove('dark-theme', 'light-theme');\n root.removeAttribute('data-theme');\n\n if (mode === 'dark') {\n root.classList.add('dark-theme');\n root.setAttribute('data-theme', 'dark');\n root.setAttribute('color-scheme', 'dark');\n } else if (mode === 'light') {\n root.classList.add('light-theme');\n root.setAttribute('data-theme', 'light');\n root.setAttribute('color-scheme', 'light');\n } else {\n // system - без классов, CSS media query сработает\n root.setAttribute('color-scheme', 'light dark');\n }\n\n },\n\n toggleTheme() {\n // Прямое переключение между light и dark\n const isDark = state.theme.mode === 'dark' ||\n (state.theme.mode === 'system' && typeof window !== 'undefined' &&\n window.matchMedia('(prefers-color-scheme: dark)').matches);\n this.setTheme(isDark ? 'light' : 'dark');\n },\n\n add(array, item) {\n const existingItemIndex = array.findIndex(i => i._id === item._id);\n\n if (existingItemIndex === -1) {\n array.push(item);\n } else {\n array[existingItemIndex] = item;\n }\n },\n\n update(array, item) {\n const existingItemIndex = array.findIndex(i => i._id === item._id);\n if (existingItemIndex === -1) {\n // If the item doesn't exist, push it to the array\n array.push(item);\n } else {\n // Update the item in the array without creating a new array\n Object.assign(array[existingItemIndex], item);\n }\n },\n\n delete(array, item) {\n const existingItemIndex = array.findIndex(c => c._id === item._id);\n\n if (existingItemIndex !== -1) {\n array.splice(existingItemIndex, 1);\n }\n },\n\n increment(array, item) {\n console.log(array);\n console.log(item);\n const arrayItem = array.find(i => i._id === item._id);\n\n if (arrayItem) {\n arrayItem.quantity++;\n }\n },\n\n decrement(array, item) {\n const arrayItem = array.find(i => i._id === item._id);\n\n const arrayItemIndex = array.indexOf(arrayItem);\n\n if (arrayItemIndex > -1) {\n arrayItem.quantity--;\n\n if (arrayItem.quantity < 1) array.splice(arrayItemIndex, 1);\n }\n },\n\n reset(array) {\n array = [];\n },\n };\n\n // SessionManager создается внутри createStore для правильной изоляции в SSR\n const sessionManager = new SessionManager(state.session);\n\n const store = reactive({\n modules: [],\n\n // Core module registered by default\n core: { state, actions, session: sessionManager },\n\n addStore(name, storage) {\n this[name] = storage;\n this.modules.push(name);\n },\n\n async getInitialState() {\n const initialState = {};\n for (const [moduleName, moduleStore] of Object.entries(this)) {\n if (moduleName !== 'modules' && moduleName !== 'addStore' && moduleName !== 'getInitialState' && moduleName !== 'setInitialState') {\n if (moduleStore.state) {\n initialState[moduleName] = JSON.parse(JSON.stringify(moduleStore.state));\n }\n }\n }\n return initialState;\n },\n\n async setInitialState(initialState, isHydration = false) {\n const modules = Object.entries(initialState);\n\n for (const [moduleName, moduleState] of modules) {\n if (this[moduleName] && this[moduleName].state) {\n // При гидратации просто заменяем state целиком для скорости\n if (isHydration) {\n Object.assign(this[moduleName].state, moduleState);\n } else {\n mergeReactive(this[moduleName].state, moduleState);\n }\n }\n }\n }\n });\n\n function mergeReactive(target, source) {\n // Оптимизированная версия слияния\n const keys = Object.keys(source);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const sourceValue = source[key];\n\n if (sourceValue !== null && typeof sourceValue === 'object' && !Array.isArray(sourceValue)) {\n if (isReactive(target[key])) {\n mergeReactive(target[key], sourceValue);\n } else {\n target[key] = sourceValue;\n }\n } else {\n target[key] = sourceValue;\n }\n }\n }\n\n return store;\n}\n\n// ============================================================================\n// SSR AND SINGLETON\n// ============================================================================\n\n// Синглтон для клиента\nlet clientStore = null;\n\n// AsyncLocalStorage для SSR (изоляция per-request)\nexport async function setSSRStore(store) {\n if (typeof window === 'undefined') {\n const als = await getAsyncLocalStorage();\n als?.enterWith(store);\n }\n}\n\nexport async function clearSSRStore() {\n if (typeof window === 'undefined') {\n const als = await getAsyncLocalStorage();\n als?.enterWith(null);\n }\n}\n\nexport function useStore() {\n if (typeof window === 'undefined') {\n // SSR: используем store из AsyncLocalStorage (может быть null если не инициализирован)\n const store = asyncLocalStorage?.getStore();\n if (store) {\n return store;\n }\n // Fallback для обратной совместимости\n console.warn('[WARN] SSR store not in AsyncLocalStorage, creating new store instance');\n return createStore();\n }\n // Client: синглтон\n if (!clientStore) {\n clientStore = createStore();\n }\n return clientStore;\n}\n\n// ============================================================================\n// SESSION ACCESSOR\n// ============================================================================\n\n/**\n * Получить текущий экземпляр SessionManager\n * Использовать вместо прямого импорта session для правильной работы с SSR\n */\nexport function useSession() {\n const store = useStore();\n return store.core.session;\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\n// Не экспортируем singleton state/actions - теперь используется useStore()\nexport default useStore();\n"],"names":[],"mappings":"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"}
|
|
@@ -178,11 +178,12 @@ async function render({ url, cookies, headers, ssrContext, createApp }) {
|
|
|
178
178
|
performance.measure("loading-26-total", "loading-26-start", "loading-28-end");
|
|
179
179
|
const measure26Total = performance.getEntriesByName("loading-26-total")[0];
|
|
180
180
|
console.log(`[LOADING 26] Total SSR render completed in ${measure26Total?.duration?.toFixed(2)}ms`);
|
|
181
|
+
const statusCode = store.core.state.notFound ? 404 : router.currentRoute?.value?.name?.toLowerCase() === "notfound" ? 404 : 200;
|
|
181
182
|
return {
|
|
182
183
|
html,
|
|
183
184
|
meta: payload,
|
|
184
185
|
state: initialState,
|
|
185
|
-
statusCode
|
|
186
|
+
statusCode,
|
|
186
187
|
usedModules: Array.from(ctx.modules || /* @__PURE__ */ new Set())
|
|
187
188
|
// Return used modules
|
|
188
189
|
};
|