@ozdao/martyrs 0.2.585 → 0.2.586
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/auth.server.js +161 -96
- package/dist/{authJwt-J1csaMWA.js → authJwt-DKbMMjw0.js} +33 -0
- package/dist/chats.server.js +2 -2
- package/dist/community.server.js +1 -1
- package/dist/core.server.js +191 -2
- package/dist/{core.websocket-C2FxNmZ1.js → core.websocket-Cl76z2wT.js} +41 -5
- package/dist/{crud-q1ye5IhV.js → crud-DpOXTZep.js} +1 -1
- package/dist/events.server.js +2 -2
- package/dist/files.server.js +1 -1
- package/dist/gallery.server.js +1 -1
- package/dist/index-kvBwwb0w.js +427 -0
- package/dist/inventory.server.js +2 -2
- package/dist/{mailing-DuEFRsa3.js → mailing-DT7nbNjZ.js} +16 -3
- package/dist/{main-xL-jtBkT.js → main-BIf-WirR.js} +863 -865
- package/dist/marketplace.server.js +1 -1
- package/dist/martyrs/dist/{main-xL-jtBkT.js → main-BIf-WirR.js} +192 -38
- package/dist/martyrs/dist/main-BIf-WirR.js.map +1 -0
- package/dist/martyrs/dist/{web-BA6h6Z8P.js → web-O7lXcjg0.js} +2 -2
- package/dist/martyrs/dist/{web-BA6h6Z8P.js.map → web-O7lXcjg0.js.map} +1 -1
- package/dist/martyrs/src/components/Button/{Button.vue2.js → Button.vue.js} +8 -7
- package/dist/martyrs/src/components/Button/Button.vue.js.map +1 -0
- package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
- package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +1 -1
- package/dist/martyrs/src/components/Loader/Loader.vue.js +1 -1
- package/dist/martyrs/src/components/Loader/Loader.vue.js.map +1 -1
- package/dist/martyrs/src/components/Spoiler/{Spoiler.vue2.js → Spoiler.vue.js} +2 -2
- package/dist/martyrs/src/components/Spoiler/Spoiler.vue.js.map +1 -0
- package/dist/martyrs/src/components/Tooltip/Tooltip.vue2.js +17 -22
- package/dist/martyrs/src/components/Tooltip/Tooltip.vue2.js.map +1 -1
- package/dist/martyrs/src/modules/auth/auth.client.js +18 -24
- package/dist/martyrs/src/modules/auth/auth.client.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/blocks/OtpDialog.vue.js +178 -0
- package/dist/martyrs/src/modules/auth/views/components/blocks/OtpDialog.vue.js.map +1 -0
- 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 +53 -45
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js +198 -14
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js.map +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 +70 -29
- package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +86 -30
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/plugins/otp.plugin.js +100 -0
- package/dist/martyrs/src/modules/auth/views/plugins/otp.plugin.js.map +1 -0
- package/dist/martyrs/src/modules/auth/views/router/auth.router.js +2 -31
- package/dist/martyrs/src/modules/auth/views/router/auth.router.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/router/users.router.js +0 -14
- package/dist/martyrs/src/modules/auth/views/router/users.router.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/store/auth.js +1 -56
- package/dist/martyrs/src/modules/auth/views/store/auth.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/store/users.js +5 -1
- package/dist/martyrs/src/modules/auth/views/store/users.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js +0 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/PopupAuth.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/PopupDateSelector.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/elements/OnlineIndicator.vue.js +74 -0
- package/dist/martyrs/src/modules/core/views/components/elements/OnlineIndicator.vue.js.map +1 -0
- package/dist/martyrs/src/modules/core/views/components/layouts/App.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js +63 -47
- package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Navigation.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/NavigationBar.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/{Filters.vue2.js → Filters.vue.js} +2 -2
- package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue.js.map +1 -0
- 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 +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/sections/EditTickets.vue.js +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +1 -1
- 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 +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.js +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/pages/Marketplace.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/blocks/ActionButtons.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
- 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 +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +0 -1
- package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js.map +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 +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +1 -2
- package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/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/organizations/components/blocks/CardDepartment.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -2
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +0 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js.map +1 -1
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +0 -1
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js.map +1 -1
- package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +0 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +0 -1
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/FilterProducts.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js +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 +1 -1
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Spot.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +1 -1
- package/dist/martyrs.css +1 -1
- package/dist/martyrs.es.js +1 -1
- package/dist/music.server.js +1 -1
- package/dist/notifications.server.js +1 -1
- package/dist/orders.server.js +7 -6
- package/dist/organizations.server.js +2 -2
- package/dist/products.server.js +2 -2
- package/dist/profile.schema-C31Lynn3.js +21 -0
- package/dist/rents.server.js +1 -1
- package/dist/sessions.service-COcwjd0f.js +86 -0
- package/dist/style.css +178 -108
- package/dist/{tickets.controller-B7r0mK-5.js → tickets.controller-DdF85W-i.js} +1 -1
- package/dist/visitors.service-B1dhhuSo.js +83 -0
- package/dist/wallet.server.js +2 -2
- package/dist/{web-BA6h6Z8P.js → web-O7lXcjg0.js} +1 -1
- package/package.json +5 -1
- package/src/cli/commands/create.js +106 -0
- package/src/cli/index.js +25 -0
- package/src/cli/templates/app/.env.development.mustache +14 -0
- package/src/cli/templates/app/.env.production.mustache +14 -0
- package/src/cli/templates/app/Dockerfile +36 -0
- package/src/cli/templates/app/babel.config.js +14 -0
- package/src/cli/templates/app/env.js +3 -0
- package/src/cli/templates/app/index.js +46 -0
- package/src/cli/templates/app/mongodb.config.js +18 -0
- package/src/cli/templates/app/package.json.mustache +65 -0
- package/src/cli/templates/app/src/client.js +22 -0
- package/src/cli/templates/app/src/components/pages/Index.vue +11 -0
- package/src/cli/templates/app/src/configs/global.config.js.mustache +40 -0
- package/src/cli/templates/app/src/localization/extensions.js +2 -0
- package/src/cli/templates/app/src/localization/index.js +44 -0
- package/src/cli/templates/app/src/localization/overrides.js +2 -0
- package/src/cli/templates/app/src/localization/translations.js +10 -0
- package/src/cli/templates/app/src/models/index.js +9 -0
- package/src/cli/templates/app/src/router/index.js +48 -0
- package/src/cli/templates/app/src/scss/theme.scss +18 -0
- package/src/cli/templates/app/src/server.js +68 -0
- package/src/cli/templates/app/src/store/index.js +9 -0
- package/src/cli/templates/docker-compose.yaml.mustache +47 -0
- package/src/cli/templates/nginx/Dockerfile +5 -0
- package/src/cli/templates/nginx/default.conf.mustache +55 -0
- package/src/cli/templates/public/favicon/.gitkeep +0 -0
- package/src/cli/templates/start-dev.sh.mustache +131 -0
- package/src/cli/templates/start-prod.sh.mustache +12 -0
- package/src/components/Button/Button.vue +61 -15
- package/src/components/Loader/Loader.vue +1 -1
- package/src/components/Tooltip/Tooltip.vue +31 -23
- package/src/modules/TASKS.MD +30 -1
- package/src/modules/auth/CLAUDE.md +381 -0
- package/src/modules/auth/FIXES.md +0 -38
- package/src/modules/auth/auth.client.js +4 -6
- package/src/modules/auth/auth.server.js +4 -15
- package/src/modules/auth/controllers/middlewares/authJwt.js +59 -17
- package/src/modules/auth/controllers/middlewares/index.js +4 -1
- package/src/modules/auth/controllers/middlewares/otp.middleware.js +166 -0
- package/src/modules/auth/controllers/middlewares/verifySignUp.js +0 -1
- package/src/modules/auth/controllers/middlewares/verifyUser.js +58 -11
- package/src/modules/auth/controllers/routes/auth.routes.js +48 -6
- package/src/modules/auth/controllers/routes/users.routes.js +29 -8
- package/src/modules/auth/controllers/services/auth.service.js +62 -12
- package/src/modules/auth/controllers/services/otp.service.js +109 -0
- package/src/modules/auth/controllers/services/users.service.js +46 -6
- package/src/modules/auth/models/otp.model.js +20 -0
- package/src/modules/auth/views/components/blocks/OtpDialog.vue +168 -0
- package/src/modules/auth/views/components/pages/Profile.vue +18 -13
- package/src/modules/auth/views/components/pages/ProfileEditAccount.vue +199 -45
- package/src/modules/auth/views/components/pages/ResetPassword.vue +170 -132
- package/src/modules/auth/views/components/pages/SignIn.vue +2 -1
- package/src/modules/auth/views/components/pages/SignUp.vue +203 -147
- package/src/modules/auth/views/plugins/otp.plugin.js +104 -0
- package/src/modules/auth/views/router/auth.router.js +1 -24
- package/src/modules/auth/views/router/users.router.js +1 -12
- package/src/modules/auth/views/store/auth.js +0 -68
- package/src/modules/auth/views/store/users.js +6 -2
- package/src/modules/core/controllers/classes/core.websocket.js +57 -6
- package/src/modules/core/controllers/middlewares/visitor.logger.js +49 -0
- package/src/modules/core/controllers/services/requests.service.js +53 -0
- package/src/modules/core/controllers/services/sessions.service.js +98 -0
- package/src/modules/core/controllers/services/visitors.service.js +102 -0
- package/src/modules/core/controllers/utils/mailing.js +16 -3
- package/src/modules/core/core.server.js +45 -3
- package/src/modules/core/models/request.model.js +30 -0
- package/src/modules/core/models/session.model.js +43 -0
- package/src/modules/core/models/visitor.model.js +28 -0
- package/src/modules/core/views/components/elements/OnlineIndicator.vue +115 -0
- package/src/modules/core/views/components/layouts/App.vue +2 -2
- package/src/modules/core/views/components/layouts/Client.vue +443 -477
- package/src/modules/orders/controllers/orders.controller.js +3 -3
- package/src/modules/products/components/pages/Products.vue +1 -1
- package/dist/_virtual/alignment-pattern.js +0 -5
- package/dist/_virtual/alignment-pattern.js.map +0 -1
- package/dist/_virtual/browser.js +0 -8
- package/dist/_virtual/browser.js.map +0 -1
- package/dist/_virtual/browser2.js +0 -5
- package/dist/_virtual/browser2.js.map +0 -1
- package/dist/_virtual/canvas.js +0 -5
- package/dist/_virtual/canvas.js.map +0 -1
- package/dist/_virtual/dijkstra.js +0 -5
- package/dist/_virtual/dijkstra.js.map +0 -1
- package/dist/_virtual/error-correction-code.js +0 -5
- package/dist/_virtual/error-correction-code.js.map +0 -1
- package/dist/_virtual/error-correction-level.js +0 -5
- package/dist/_virtual/error-correction-level.js.map +0 -1
- package/dist/_virtual/finder-pattern.js +0 -5
- package/dist/_virtual/finder-pattern.js.map +0 -1
- package/dist/_virtual/format-info.js +0 -5
- package/dist/_virtual/format-info.js.map +0 -1
- package/dist/_virtual/galois-field.js +0 -5
- package/dist/_virtual/galois-field.js.map +0 -1
- package/dist/_virtual/mask-pattern.js +0 -5
- package/dist/_virtual/mask-pattern.js.map +0 -1
- package/dist/_virtual/mode.js +0 -5
- package/dist/_virtual/mode.js.map +0 -1
- package/dist/_virtual/polynomial.js +0 -5
- package/dist/_virtual/polynomial.js.map +0 -1
- package/dist/_virtual/qrcode.js +0 -5
- package/dist/_virtual/qrcode.js.map +0 -1
- package/dist/_virtual/regex.js +0 -5
- package/dist/_virtual/regex.js.map +0 -1
- package/dist/_virtual/segments.js +0 -5
- package/dist/_virtual/segments.js.map +0 -1
- package/dist/_virtual/svg-tag.js +0 -5
- package/dist/_virtual/svg-tag.js.map +0 -1
- package/dist/_virtual/utils.js +0 -5
- package/dist/_virtual/utils.js.map +0 -1
- package/dist/_virtual/utils2.js +0 -5
- package/dist/_virtual/utils2.js.map +0 -1
- package/dist/_virtual/version-check.js +0 -5
- package/dist/_virtual/version-check.js.map +0 -1
- package/dist/_virtual/version.js +0 -5
- package/dist/_virtual/version.js.map +0 -1
- package/dist/index-_Edcmck_.js +0 -170
- package/dist/martyrs/dist/main-xL-jtBkT.js.map +0 -1
- package/dist/martyrs/node_modules/.pnpm/bignumber.js@9.1.2/node_modules/bignumber.js/bignumber.js +0 -1336
- package/dist/martyrs/node_modules/.pnpm/bignumber.js@9.1.2/node_modules/bignumber.js/bignumber.js.map +0 -1
- package/dist/martyrs/src/components/Button/Button.vue2.js.map +0 -1
- package/dist/martyrs/src/components/Spoiler/Spoiler.vue2.js.map +0 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js +0 -166
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js.map +0 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +0 -118
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js.map +0 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +0 -360
- package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js.map +0 -1
- package/dist/martyrs/src/modules/auth/views/store/twofa.js +0 -40
- package/dist/martyrs/src/modules/auth/views/store/twofa.js.map +0 -1
- package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue2.js.map +0 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CardBalanceReplenished.vue.js +0 -43
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CardBalanceReplenished.vue.js.map +0 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.js +0 -47
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.js.map +0 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CashDeposit.vue.js +0 -29
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CashDeposit.vue.js.map +0 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +0 -89
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js.map +0 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDepositProcessing.vue.js +0 -136
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDepositProcessing.vue.js.map +0 -1
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +0 -238
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js.map +0 -1
- package/dist/martyrs/src/modules/wallet/views/localization/wallet.json.js +0 -9
- package/dist/martyrs/src/modules/wallet/views/localization/wallet.json.js.map +0 -1
- package/dist/martyrs/src/modules/wallet/views/store/wallet.store.js +0 -134
- package/dist/martyrs/src/modules/wallet/views/store/wallet.store.js.map +0 -1
- package/dist/node_modules/.pnpm/dijkstrajs@1.0.3/node_modules/dijkstrajs/dijkstra.js +0 -106
- package/dist/node_modules/.pnpm/dijkstrajs@1.0.3/node_modules/dijkstrajs/dijkstra.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/browser.js +0 -79
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/browser.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/can-promise.js +0 -14
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/can-promise.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alignment-pattern.js +0 -43
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alignment-pattern.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alphanumeric-data.js +0 -85
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alphanumeric-data.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-buffer.js +0 -40
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-buffer.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-matrix.js +0 -34
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-matrix.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/byte-data.js +0 -36
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/byte-data.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-code.js +0 -367
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-code.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-level.js +0 -52
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-level.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/finder-pattern.js +0 -25
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/finder-pattern.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/format-info.js +0 -24
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/format-info.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/galois-field.js +0 -38
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/galois-field.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/kanji-data.js +0 -46
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/kanji-data.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mask-pattern.js +0 -149
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mask-pattern.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mode.js +0 -90
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mode.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/numeric-data.js +0 -41
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/numeric-data.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/polynomial.js +0 -44
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/polynomial.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/qrcode.js +0 -279
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/qrcode.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/reed-solomon-encoder.js +0 -38
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/reed-solomon-encoder.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/regex.js +0 -33
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/regex.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/segments.js +0 -201
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/segments.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js +0 -84
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version-check.js +0 -14
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version-check.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version.js +0 -107
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/canvas.js +0 -61
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/canvas.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/svg-tag.js +0 -64
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/svg-tag.js.map +0 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js +0 -87
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js.map +0 -1
- package/dist/profile.schema-CjLOfG7b.js +0 -92
- package/src/modules/auth/controllers/middlewares/visitor.logger.js +0 -75
- package/src/modules/auth/controllers/routes/twofa.routes.js +0 -8
- package/src/modules/auth/controllers/services/twofa.service.js +0 -30
- package/src/modules/auth/models/request.model.js +0 -14
- package/src/modules/auth/models/visitor.model.js +0 -11
- package/src/modules/auth/views/components/pages/EnterCode.vue +0 -204
- package/src/modules/auth/views/components/pages/EnterPassword.vue +0 -123
- package/src/modules/auth/views/components/sections/ProfileEditCredentials.vue +0 -329
- package/src/modules/auth/views/store/twofa.js +0 -70
- package/src/modules/auth//320/220/320/240/320/245/320/230/320/242/320/225/320/232/320/242/320/243/320/240/320/220.md +0 -445
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Categories.vue.js","sources":["../../../../../../../src/modules/products/components/pages/Categories.vue"],"sourcesContent":["<template>\n <div class=\"pd-thin bg-white\">\n <Block v-if=\"!MOBILE_APP\" \n class=\"radius-medium mn-b-thin mobile:flex-wrap flex-nowrap flex-v-center flex\"\n >\n <h2 class=\"mn-r-auto\">\n Categories\n </h2>\n\n <router-link\n v-if=\"hasAccess(route.params._id, 'products', 'edit', auth.state.accesses, auth.state.access.roles)\"\n :to=\"{\n name: route.meta.context === 'backoffice' ? 'BackofficeCategoryAdd' : 'Organization_CategoryAdd',\n params: {\n _id: $route.params._id\n }\n }\"\n class=\"uppercase fw-medium pd-small radius-medium bg-white nav-link\"\n >\n Add New\n </router-link>\n </Block>\n\n <div class=\"rows-1\">\n <Feed\n :search=\"true\"\n :showLoadMore=\"false\"\n :states=\"{\n empty: {\n title: 'No Products Found',\n description: 'Currently, there are no products available.'\n }\n }\"\n :store=\"{\n read: (options) => categories.actions.read(options),\n state: categories.state\n }\"\n :options=\"{\n owner: route.params._id,\n tree: true,\n limit: 20\n }\"\n v-model:sort=\"sort\"\n v-model:items=\"categories.state.all\"\n v-slot=\"{ \n items \n }\"\n class=\"rows-1 gap-thin\"\n >\n <Tree\n v-if=\"items\"\n :items=\"categories.state.all\"\n :state=\"categories.state.all\"\n :parent-id=\"null\"\n :dragndrop=\"hasAccess(route.params._id, 'products', 'edit', auth.state.accesses, auth.state.access.roles)\"\n @update=\"updateCategoriesOrder\"\n v-slot=\"{ item }\"\n >\n <CardCategory \n :category=\"item\" \n :access=\"hasAccess(route.params._id, 'products', 'edit', auth.state.accesses, auth.state.access.roles)\"\n @delete=\"deleteCategory\" \n />\n </Tree>\n </Feed>\n </div>\n </div>\n</template>\n\n<script setup>\n import { onMounted, onUnmounted, computed, ref,reactive } from 'vue';\n import { useRoute, useRouter } from 'vue-router';\n\n import { useStore } from '@martyrs/src/modules/core/views/store/core.store.js';\n import * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\n import * as categories from '@martyrs/src/modules/products/store/categories.js';\n import { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\n const route = useRoute();\n const router = useRouter();\n const store = useStore();\n const { hasAccess } = useGlobalMixins();\n\n import Button from \"@martyrs/src/components/Button/Button.vue\";\n import Block from '@martyrs/src/components/Block/Block.vue';\n import Feed from '@martyrs/src/components/Feed/Feed.vue'\n import Tree from \"@martyrs/src/components/Tree/Tree.vue\";\n \n import CardCategory from '@martyrs/src/modules/products/components/blocks/CardCategory.vue';\n\n import IconPlus from '@martyrs/src/modules/icons/navigation/IconPlus.vue'\n\n let search = ref(null)\n\n let sort = reactive({\n param: 'order',\n order: 'asc',\n options: [{\n label: 'Order',\n value: 'order'\n },{\n label: 'Name',\n value: 'name'\n },{\n label: 'Date',\n value: 'createdAt'\n }]\n })\n\n store.core.state.navigation_bar.actions = [{\n component: IconPlus,\n props: {\n fill: \"rgb(var(--main))\"\n },\n condition: () => auth.state.user && auth.state.user._id,\n action: () => {\n const routeName = route.meta.context === 'backoffice' ? 'BackofficeCategoryAdd' : 'Organization_CategoryAdd';\n route.params._id ? router.push({ name: routeName, params: { _id: route.params._id} }) : router.push({ name: routeName });\n }\n }],\n\n onUnmounted(() => {\n store.core.state.navigation_bar.actions = [];\n });\n\n onMounted(async () => {\n \n });\n\n // Функция для сбора затронутых категорий при drag-n-drop\n function collectAffectedCategories(eventData) {\n const result = {\n movedCategory: null,\n affectedCategories: []\n };\n \n console.log('collectAffectedCategories - eventData:', eventData);\n \n // Проверяем, что это объект от Tree компонента с полной информацией\n if (eventData && eventData.movedItem) {\n // Если категория переместилась между уровнями\n if (eventData.movedItem._id) {\n result.movedCategory = {\n _id: eventData.movedItem._id,\n newParent: eventData.parentId // Используем parentId из события (null для корня)\n };\n }\n \n // Собираем все категории текущего уровня с их новым порядком\n const items = eventData.items || [];\n console.log('Level items:', items);\n \n items.forEach((item, index) => {\n result.affectedCategories.push({\n _id: item._id,\n order: index\n });\n });\n } else if (eventData && eventData._id) {\n // Fallback для старого формата (простой объект категории)\n result.movedCategory = {\n _id: eventData._id,\n newParent: eventData.parent || null\n };\n \n // Пытаемся найти категории того же уровня\n const parentId = eventData.parent;\n const sameLevel = parentId \n ? categories.state.all.find(c => c._id === parentId)?.children || []\n : categories.state.all;\n \n sameLevel.forEach((item, index) => {\n result.affectedCategories.push({\n _id: item._id,\n order: index\n });\n });\n } else {\n // Если нет данных о перемещении, собираем корневые категории\n console.log('No event data, collecting root level categories');\n categories.state.all.forEach((item, index) => {\n result.affectedCategories.push({\n _id: item._id,\n order: index\n });\n });\n }\n \n console.log('collectAffectedCategories - result:', result);\n \n return result;\n }\n\n // Функция для обновления порядка категорий\n async function updateCategoriesOrder(event) {\n console.log('updateCategoriesOrder called with event:', event);\n \n try {\n const data = collectAffectedCategories(event);\n \n // ОДИН КОНСОЛЬ ЛОГ НА ФРОНТЕНДЕ - ЧТО ОТПРАВЛЯЕМ\n console.log('📤 FRONTEND SENDING:', JSON.stringify(data, null, 2));\n await categories.actions.updateOrder(data);\n console.log('Categories order updated successfully');\n } catch (error) {\n console.error('Error updating categories order:', error);\n throw error;\n }\n }\n\n async function deleteCategory(category) {\n // Запрашиваем подтверждение у пользователя\n const isConfirmed = confirm(`Are you sure you want to delete the category \"${category.name}\"?`);\n \n // Если пользователь подтвердил удаление, продолжаем процесс\n if (isConfirmed) {\n await categories.actions.delete(category._id);\n }\n }\n</script>\n\n<style lang=\"scss\">\n</style>"],"names":["IconPlus","auth.state","categories.state","categories.actions"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Categories.vue.js","sources":["../../../../../../../src/modules/products/components/pages/Categories.vue"],"sourcesContent":["<template>\n <div class=\"pd-thin bg-white\">\n <Block v-if=\"!MOBILE_APP\" \n class=\"radius-medium mn-b-thin mobile:flex-wrap flex-nowrap flex-v-center flex\"\n >\n <h2 class=\"mn-r-auto\">\n Categories\n </h2>\n\n <router-link\n v-if=\"hasAccess(route.params._id, 'products', 'edit', auth.state.accesses, auth.state.access.roles)\"\n :to=\"{\n name: route.meta.context === 'backoffice' ? 'BackofficeCategoryAdd' : 'Organization_CategoryAdd',\n params: {\n _id: $route.params._id\n }\n }\"\n class=\"uppercase fw-medium pd-small radius-medium bg-white nav-link\"\n >\n Add New\n </router-link>\n </Block>\n\n <div class=\"rows-1\">\n <Feed\n :search=\"true\"\n :showLoadMore=\"false\"\n :states=\"{\n empty: {\n title: 'No Products Found',\n description: 'Currently, there are no products available.'\n }\n }\"\n :store=\"{\n read: (options) => categories.actions.read(options),\n state: categories.state\n }\"\n :options=\"{\n owner: route.params._id,\n tree: true,\n limit: 20\n }\"\n v-model:sort=\"sort\"\n v-model:items=\"categories.state.all\"\n v-slot=\"{ \n items \n }\"\n class=\"rows-1 gap-thin\"\n >\n <Tree\n v-if=\"items\"\n :items=\"categories.state.all\"\n :state=\"categories.state.all\"\n :parent-id=\"null\"\n :dragndrop=\"hasAccess(route.params._id, 'products', 'edit', auth.state.accesses, auth.state.access.roles)\"\n @update=\"updateCategoriesOrder\"\n v-slot=\"{ item }\"\n >\n <CardCategory \n :category=\"item\" \n :access=\"hasAccess(route.params._id, 'products', 'edit', auth.state.accesses, auth.state.access.roles)\"\n @delete=\"deleteCategory\" \n />\n </Tree>\n </Feed>\n </div>\n </div>\n</template>\n\n<script setup>\n import { onMounted, onUnmounted, computed, ref,reactive } from 'vue';\n import { useRoute, useRouter } from 'vue-router';\n\n import { useStore } from '@martyrs/src/modules/core/views/store/core.store.js';\n import * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\n import * as categories from '@martyrs/src/modules/products/store/categories.js';\n import { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\n const route = useRoute();\n const router = useRouter();\n const store = useStore();\n const { hasAccess } = useGlobalMixins();\n\n import Button from \"@martyrs/src/components/Button/Button.vue\";\n import Block from '@martyrs/src/components/Block/Block.vue';\n import Feed from '@martyrs/src/components/Feed/Feed.vue'\n import Tree from \"@martyrs/src/components/Tree/Tree.vue\";\n \n import CardCategory from '@martyrs/src/modules/products/components/blocks/CardCategory.vue';\n\n import IconPlus from '@martyrs/src/modules/icons/navigation/IconPlus.vue'\n\n let search = ref(null)\n\n let sort = reactive({\n param: 'order',\n order: 'asc',\n options: [{\n label: 'Order',\n value: 'order'\n },{\n label: 'Name',\n value: 'name'\n },{\n label: 'Date',\n value: 'createdAt'\n }]\n })\n\n store.core.state.navigation_bar.actions = [{\n component: IconPlus,\n props: {\n fill: \"rgb(var(--main))\"\n },\n condition: () => auth.state.user && auth.state.user._id,\n action: () => {\n const routeName = route.meta.context === 'backoffice' ? 'BackofficeCategoryAdd' : 'Organization_CategoryAdd';\n route.params._id ? router.push({ name: routeName, params: { _id: route.params._id} }) : router.push({ name: routeName });\n }\n }],\n\n onUnmounted(() => {\n store.core.state.navigation_bar.actions = [];\n });\n\n onMounted(async () => {\n \n });\n\n // Функция для сбора затронутых категорий при drag-n-drop\n function collectAffectedCategories(eventData) {\n const result = {\n movedCategory: null,\n affectedCategories: []\n };\n \n console.log('collectAffectedCategories - eventData:', eventData);\n \n // Проверяем, что это объект от Tree компонента с полной информацией\n if (eventData && eventData.movedItem) {\n // Если категория переместилась между уровнями\n if (eventData.movedItem._id) {\n result.movedCategory = {\n _id: eventData.movedItem._id,\n newParent: eventData.parentId // Используем parentId из события (null для корня)\n };\n }\n \n // Собираем все категории текущего уровня с их новым порядком\n const items = eventData.items || [];\n console.log('Level items:', items);\n \n items.forEach((item, index) => {\n result.affectedCategories.push({\n _id: item._id,\n order: index\n });\n });\n } else if (eventData && eventData._id) {\n // Fallback для старого формата (простой объект категории)\n result.movedCategory = {\n _id: eventData._id,\n newParent: eventData.parent || null\n };\n \n // Пытаемся найти категории того же уровня\n const parentId = eventData.parent;\n const sameLevel = parentId \n ? categories.state.all.find(c => c._id === parentId)?.children || []\n : categories.state.all;\n \n sameLevel.forEach((item, index) => {\n result.affectedCategories.push({\n _id: item._id,\n order: index\n });\n });\n } else {\n // Если нет данных о перемещении, собираем корневые категории\n console.log('No event data, collecting root level categories');\n categories.state.all.forEach((item, index) => {\n result.affectedCategories.push({\n _id: item._id,\n order: index\n });\n });\n }\n \n console.log('collectAffectedCategories - result:', result);\n \n return result;\n }\n\n // Функция для обновления порядка категорий\n async function updateCategoriesOrder(event) {\n console.log('updateCategoriesOrder called with event:', event);\n \n try {\n const data = collectAffectedCategories(event);\n \n // ОДИН КОНСОЛЬ ЛОГ НА ФРОНТЕНДЕ - ЧТО ОТПРАВЛЯЕМ\n console.log('📤 FRONTEND SENDING:', JSON.stringify(data, null, 2));\n await categories.actions.updateOrder(data);\n console.log('Categories order updated successfully');\n } catch (error) {\n console.error('Error updating categories order:', error);\n throw error;\n }\n }\n\n async function deleteCategory(category) {\n // Запрашиваем подтверждение у пользователя\n const isConfirmed = confirm(`Are you sure you want to delete the category \"${category.name}\"?`);\n \n // Если пользователь подтвердил удаление, продолжаем процесс\n if (isConfirmed) {\n await categories.actions.delete(category._id);\n }\n }\n</script>\n\n<style lang=\"scss\">\n</style>"],"names":["IconPlus","auth.state","categories.state","categories.actions"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ref, onMounted, computed, onUnmounted, createElementBlock, createCommentVNode, openBlock, createBlock, createVNode, withCtx, createElementVNode, toDisplayString, unref, createTextVNode, Fragment, renderList } from "vue";
|
|
2
2
|
import { useRoute, useRouter } from "vue-router";
|
|
3
3
|
import _sfc_main$4 from "../../../icons/navigation/IconDelete.vue.js";
|
|
4
|
-
import _sfc_main$3 from "../../../../components/Button/Button.
|
|
4
|
+
import _sfc_main$3 from "../../../../components/Button/Button.vue.js";
|
|
5
5
|
import Select from "../../../../components/Select/Select.vue.js";
|
|
6
6
|
import UploadImage from "../../../../components/UploadImage/UploadImage.vue.js";
|
|
7
7
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
@@ -15,7 +15,7 @@ import _sfc_main$1 from "../../../icons/navigation/IconCheckmark.vue.js";
|
|
|
15
15
|
/* empty css */
|
|
16
16
|
/* empty css */
|
|
17
17
|
/* empty css */
|
|
18
|
-
/* empty css
|
|
18
|
+
/* empty css */
|
|
19
19
|
/* empty css */
|
|
20
20
|
import _sfc_main$2 from "../../../../components/Block/Block.vue.js";
|
|
21
21
|
import { useStore } from "../../../core/views/store/core.store.js";
|
|
@@ -6,7 +6,6 @@ import { state as state$1 } from "../../../auth/views/store/auth.js";
|
|
|
6
6
|
import { state, actions } from "../../store/products.js";
|
|
7
7
|
import { state as state$2, actions as actions$1 } from "../../../orders/store/shopcart.js";
|
|
8
8
|
/* empty css */
|
|
9
|
-
/* empty css */
|
|
10
9
|
/* empty css */
|
|
11
10
|
/* empty css */
|
|
12
11
|
/* empty css */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Product.vue.js","sources":["../../../../../../../src/modules/products/components/pages/Product.vue"],"sourcesContent":["<template>\n <div v-if=\"products.state.current\" class=\"w-100 mobile:pd-thin pd-small bg-white\">\n <div class=\"cols-2 mobile:cols-1 tablet:cols-1 w-100 gap-regular\">\n\n <ProductImages\n :images=\"currentImages\"\n :product=\"product\"\n />\n\n <div class=\"pos-relative w-100 h-100 flex-column flex-h-center flex\">\n <!-- Edit Button -->\n <router-link\n v-if=\"hasAccess(route.params._id, 'products', 'edit', auth.state.accesses, auth.state.access.roles)\"\n :to=\"editPath\"\n class=\"\n z-index-2\n cursor-pointer \n pos-absolute pos-t-zero pos-r-zero\n radius-extra pd-thin bg-second\n \"\n >\n <IconEdit\n class=\"i-medium\"\n classes=\"fill-white\"\n />\n </router-link>\n\n <h2 class=\"w-100 h1-product mn-b-medium\">{{ product.name }}</h2>\n\n <p v-if=\"product.description\" class=\"w-100 mn-b-medium\" style=\"white-space: pre-line;\">\n {{ product.translations?.length > 1 ? t('description') : product.description }}\n </p>\n \n <!-- Компонент выбора вариантов товара -->\n <ProductConfigurator\n v-if=\"product.variants?.length > 0\"\n :product-variants=\"product.variants\"\n :product-id=\"product._id\"\n :product-name=\"product.name\"\n :discounts=\"product.discounts\"\n :regularPrice=\"100\"\n @variant-selected=\"handleVariantSelected\"\n @add-to-cart=\"handleAddToCart\"\n @update-images=\"handleUpdateImages\"\n />\n\n <div v-if=\"product.included\" class=\"mn-b-small flex-nowrap flex flex-v-center\">\n <IconList class=\"mn-r-micro i-medium\"/>\n <p class=\"fw-medium \">Included</p>\n </div>\n\n <div v-if=\"product.included\" class=\"cols-1 mn-b-medium w-100 \">\n <div\n class=\"w-100 pd-small radius-small flex flex-column gap-small bg-light\"\n >\n <p class=\"fw-medium\" style=\"white-space: pre-line;\" v-html=\"product.included\"></p>\n </div>\n </div>\n\n\n <div v-if=\"product.attributes && product.attributes.length > 0\" class=\"mn-b-small flex-nowrap flex flex-v-center\">\n <IconInfo class=\"mn-r-micro i-medium\"/>\n <p class=\"fw-medium \">Product Details</p>\n </div>\n\n <div class=\"cols-2 mobile:cols-1 mn-b-medium w-100 gap-small\">\n <div\n v-if=\"product.attributes && product.attributes.length > 0\"\n v-for=\"attributes in product.attributes\"\n class=\"w-100 pd-small radius-small bg-light product-attributes\"\n >\n <p class=\"mn-b-thin fw-demi\">{{ attributes.name }}</p>\n <p>{{ attributes.value }}</p>\n </div>\n </div>\n\n <div class=\"mn-b-small flex-nowrap flex flex-v-center\">\n <IconGroups class=\"mn-r-micro i-medium\"/>\n <p class=\"fw-medium \">Provided by</p>\n </div>\n\n <CardOrganization \n v-if=\"product.owner\"\n :organization=\"product.owner.target\"\n :showRating=\"true\"\n :showFollowers=\"false\"\n :showProducts=\"false\"\n class=\"bg-light w-100 o-hidden radius-medium pd-small \"\n />\n </div>\n </div>\n \n <ProductsRecommended \n v-if=\"product.recommended.length > 0\"\n :products=\"product.recommended\"\n class=\" mn-t-big h-max pos-relative\"\n />\n\n <div class=\"h-max mn-t-big pos-relative\">\n <h3 class=\"pd-b-small\">Most Popular</h3>\n <ProductsPopular class=\"mn-r-big-negative mn-l-big-negative\"/>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { computed, ref, onMounted, getCurrentInstance } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport { useI18n } from 'vue-i18n'\nimport { useGlobalMixins } from \"@martyrs/src/modules/core/views/mixins/mixins.js\"\n\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js'\nimport { useStore } from '@martyrs/src/modules/core/views/store/core.store.js'\nimport * as products from '@martyrs/src/modules/products/store/products.js'\nimport * as categories from '@martyrs/src/modules/products/store/categories.js'\nimport * as shopcart from '@martyrs/src/modules/orders/store/shopcart.js'\n\nimport Button from '@martyrs/src/components/Button/Button.vue'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Tab from '@martyrs/src/components/Tab/Tab.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\n\nimport IconEdit from '@martyrs/src/modules/icons/navigation/IconEdit.vue'\nimport IconInfo from '@martyrs/src/modules/icons/navigation/IconInfo.vue'\n\nimport IconShopcartAdd from '@martyrs/src/modules/icons/actions/IconShopcartAdd.vue'\n\nimport IconList from '@martyrs/src/modules/icons/entities/IconList.vue';\nimport IconGroups from '@martyrs/src/modules/icons/entities/IconGroups.vue'\n\nimport ProductImages from '@martyrs/src/modules/products/components/blocks/ProductImages.vue'\nimport ProductConfigurator from '@martyrs/src/modules/products/components/sections/ProductConfigurator.vue'\nimport ProductsRecommended from '@martyrs/src/modules/products/components/sections/ProductsRecommended.vue';\nimport ProductsPopular from '@martyrs/src/modules/products/components/sections/ProductsPopular.vue'\n\nimport CardOrganization from '@martyrs/src/modules/organizations/components/blocks/CardOrganization.vue'\n\nconst route = useRoute()\nconst router = useRouter()\nconst { proxy } = getCurrentInstance()\nconst { returnCurrency, hasAccess } = useGlobalMixins()\n\nconst product = computed(() => products.state.current)\nconst productImages = computed(() => products.state.current.images || [])\n\nconst editPath = computed(() => {\n\tif (route.meta.context === 'backoffice') {\n\t\treturn `/backoffice/products/${product.value._id}/edit`\n\t}\n\tif (route.meta.context === 'organization') {\n\t\treturn `/organizations/${route.params._id}/products/${product.value._id}/edit`\n\t}\n\treturn `/products/${product.value._id}/edit`\n})\n\n// Состояние для отслеживания текущих изображений (товара или варианта)\nconst currentImages = ref([])\n// Выбранный вариант товара\nconst selectedVariant = ref(null)\n\nconst text = {\n en: { addtoorder: 'Add to Cart', fastorder: 'Fast Order', description: 'Description' },\n ru: { addtoorder: 'Добавить в корзину', fastorder: 'Быстрый заказ', description: 'Описание' }\n}\n\nconst { t } = useI18n({ messages: text })\n\nconst emits = defineEmits(['page-loading', 'page-loaded']);\n\nconst recommendation = defineProps({\n recommendation: {\n type: Boolean,\n default: false\n }\n})\n \nproducts.state.current = null\n\nonMounted(async () => {\n emits('page-loading');\n \n await products.actions.read({ _id: route.params.product, lookup: ['variants','recommended','inventory'] })\n \n // Инициализируем текущие изображения изображениями товара\n currentImages.value = [...productImages.value]\n\n if (typeof gtag === 'function') {\n gtag('event', 'view_item', {\n currency: returnCurrency(),\n value: product.value.price || 0,\n items: [{\n item_id: product.value._id,\n item_name: product.value.name,\n price: product.value.price || 0,\n item_category: product.value.category || '',\n item_brand: product.value.owner?.target?.profile.name || ''\n }]\n });\n }\n\n emits('page-loaded');\n})\n\n// Обработчик выбора варианта\nfunction handleVariantSelected(variant) {\n selectedVariant.value = variant\n}\n\n// Обработчик обновления изображений при выборе варианта\nfunction handleUpdateImages(images) {\n if (images && images.length > 0) {\n currentImages.value = [...images]\n } else {\n // Если у варианта нет изображений, возвращаем изображения товара\n currentImages.value = [...productImages.value]\n }\n}\n\n// Функция добавления товара в корзину - теперь требует выбранный вариант\nasync function handleAddToCart({variant, quantity}) {\n console.log('variant is', variant)\n console.log('quantity is', quantity)\n let selectedDates = null\n\n try {\n if (!variant) {\n throw new Error('Variant is required for adding product to cart')\n }\n\n if (!shopcart.state.organization) {\n shopcart.state.organization = product.value.owner.target._id\n }\n \n if (product.value.listing === 'rent') {\n selectedDates = await proxy.$dateSelector(\n product.value._id,\n variant._id,\n quantity,\n variant.price || product.value.price\n );\n \n if (!selectedDates) throw new Error('Date selection cancelled')\n }\n \n // Если организация товара отличается от текущей в корзине\n if (shopcart.state.organization !== product.value.owner.target._id) {\n const result = await proxy.$alert({\n title: 'Replace items in your cart?',\n message: `Your cart has items from another vendor. If you continue, we'll clear it so you can order from this one instead.`,\n actions: [\n { label: 'Cancel', value: false },\n { label: 'Replace', value: true }\n ]\n })\n\n if (!result) throw new Error('Cart replacement cancelled')\n\n shopcart.state.positions = []\n shopcart.state.organization = product.value.owner.target._id\n }\n\n if (typeof gtag === 'function') {\n gtag('event', 'add_to_cart', {\n currency: returnCurrency(),\n value: variant.price || 0,\n items: [{\n item_id: product.value._id,\n item_name: product.value.name,\n price: variant.price || product.value.price || 0,\n quantity: 1,\n item_category: product.value.category || '',\n item_brand: product.value.owner?.target?.profile?.name || ''\n }]\n });\n }\n \n await shopcart.actions.addProductToCart(product.value, variant, product.value.owner.target._id, selectedDates, quantity)\n return true\n } catch (error) {\n console.error('Error while adding product to cart:', error)\n throw error\n }\n}\n</script>"],"names":["products.state","products.actions","shopcart.state","shopcart.actions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Product.vue.js","sources":["../../../../../../../src/modules/products/components/pages/Product.vue"],"sourcesContent":["<template>\n <div v-if=\"products.state.current\" class=\"w-100 mobile:pd-thin pd-small bg-white\">\n <div class=\"cols-2 mobile:cols-1 tablet:cols-1 w-100 gap-regular\">\n\n <ProductImages\n :images=\"currentImages\"\n :product=\"product\"\n />\n\n <div class=\"pos-relative w-100 h-100 flex-column flex-h-center flex\">\n <!-- Edit Button -->\n <router-link\n v-if=\"hasAccess(route.params._id, 'products', 'edit', auth.state.accesses, auth.state.access.roles)\"\n :to=\"editPath\"\n class=\"\n z-index-2\n cursor-pointer \n pos-absolute pos-t-zero pos-r-zero\n radius-extra pd-thin bg-second\n \"\n >\n <IconEdit\n class=\"i-medium\"\n classes=\"fill-white\"\n />\n </router-link>\n\n <h2 class=\"w-100 h1-product mn-b-medium\">{{ product.name }}</h2>\n\n <p v-if=\"product.description\" class=\"w-100 mn-b-medium\" style=\"white-space: pre-line;\">\n {{ product.translations?.length > 1 ? t('description') : product.description }}\n </p>\n \n <!-- Компонент выбора вариантов товара -->\n <ProductConfigurator\n v-if=\"product.variants?.length > 0\"\n :product-variants=\"product.variants\"\n :product-id=\"product._id\"\n :product-name=\"product.name\"\n :discounts=\"product.discounts\"\n :regularPrice=\"100\"\n @variant-selected=\"handleVariantSelected\"\n @add-to-cart=\"handleAddToCart\"\n @update-images=\"handleUpdateImages\"\n />\n\n <div v-if=\"product.included\" class=\"mn-b-small flex-nowrap flex flex-v-center\">\n <IconList class=\"mn-r-micro i-medium\"/>\n <p class=\"fw-medium \">Included</p>\n </div>\n\n <div v-if=\"product.included\" class=\"cols-1 mn-b-medium w-100 \">\n <div\n class=\"w-100 pd-small radius-small flex flex-column gap-small bg-light\"\n >\n <p class=\"fw-medium\" style=\"white-space: pre-line;\" v-html=\"product.included\"></p>\n </div>\n </div>\n\n\n <div v-if=\"product.attributes && product.attributes.length > 0\" class=\"mn-b-small flex-nowrap flex flex-v-center\">\n <IconInfo class=\"mn-r-micro i-medium\"/>\n <p class=\"fw-medium \">Product Details</p>\n </div>\n\n <div class=\"cols-2 mobile:cols-1 mn-b-medium w-100 gap-small\">\n <div\n v-if=\"product.attributes && product.attributes.length > 0\"\n v-for=\"attributes in product.attributes\"\n class=\"w-100 pd-small radius-small bg-light product-attributes\"\n >\n <p class=\"mn-b-thin fw-demi\">{{ attributes.name }}</p>\n <p>{{ attributes.value }}</p>\n </div>\n </div>\n\n <div class=\"mn-b-small flex-nowrap flex flex-v-center\">\n <IconGroups class=\"mn-r-micro i-medium\"/>\n <p class=\"fw-medium \">Provided by</p>\n </div>\n\n <CardOrganization \n v-if=\"product.owner\"\n :organization=\"product.owner.target\"\n :showRating=\"true\"\n :showFollowers=\"false\"\n :showProducts=\"false\"\n class=\"bg-light w-100 o-hidden radius-medium pd-small \"\n />\n </div>\n </div>\n \n <ProductsRecommended \n v-if=\"product.recommended.length > 0\"\n :products=\"product.recommended\"\n class=\" mn-t-big h-max pos-relative\"\n />\n\n <div class=\"h-max mn-t-big pos-relative\">\n <h3 class=\"pd-b-small\">Most Popular</h3>\n <ProductsPopular class=\"mn-r-big-negative mn-l-big-negative\"/>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { computed, ref, onMounted, getCurrentInstance } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport { useI18n } from 'vue-i18n'\nimport { useGlobalMixins } from \"@martyrs/src/modules/core/views/mixins/mixins.js\"\n\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js'\nimport { useStore } from '@martyrs/src/modules/core/views/store/core.store.js'\nimport * as products from '@martyrs/src/modules/products/store/products.js'\nimport * as categories from '@martyrs/src/modules/products/store/categories.js'\nimport * as shopcart from '@martyrs/src/modules/orders/store/shopcart.js'\n\nimport Button from '@martyrs/src/components/Button/Button.vue'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Tab from '@martyrs/src/components/Tab/Tab.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\n\nimport IconEdit from '@martyrs/src/modules/icons/navigation/IconEdit.vue'\nimport IconInfo from '@martyrs/src/modules/icons/navigation/IconInfo.vue'\n\nimport IconShopcartAdd from '@martyrs/src/modules/icons/actions/IconShopcartAdd.vue'\n\nimport IconList from '@martyrs/src/modules/icons/entities/IconList.vue';\nimport IconGroups from '@martyrs/src/modules/icons/entities/IconGroups.vue'\n\nimport ProductImages from '@martyrs/src/modules/products/components/blocks/ProductImages.vue'\nimport ProductConfigurator from '@martyrs/src/modules/products/components/sections/ProductConfigurator.vue'\nimport ProductsRecommended from '@martyrs/src/modules/products/components/sections/ProductsRecommended.vue';\nimport ProductsPopular from '@martyrs/src/modules/products/components/sections/ProductsPopular.vue'\n\nimport CardOrganization from '@martyrs/src/modules/organizations/components/blocks/CardOrganization.vue'\n\nconst route = useRoute()\nconst router = useRouter()\nconst { proxy } = getCurrentInstance()\nconst { returnCurrency, hasAccess } = useGlobalMixins()\n\nconst product = computed(() => products.state.current)\nconst productImages = computed(() => products.state.current.images || [])\n\nconst editPath = computed(() => {\n\tif (route.meta.context === 'backoffice') {\n\t\treturn `/backoffice/products/${product.value._id}/edit`\n\t}\n\tif (route.meta.context === 'organization') {\n\t\treturn `/organizations/${route.params._id}/products/${product.value._id}/edit`\n\t}\n\treturn `/products/${product.value._id}/edit`\n})\n\n// Состояние для отслеживания текущих изображений (товара или варианта)\nconst currentImages = ref([])\n// Выбранный вариант товара\nconst selectedVariant = ref(null)\n\nconst text = {\n en: { addtoorder: 'Add to Cart', fastorder: 'Fast Order', description: 'Description' },\n ru: { addtoorder: 'Добавить в корзину', fastorder: 'Быстрый заказ', description: 'Описание' }\n}\n\nconst { t } = useI18n({ messages: text })\n\nconst emits = defineEmits(['page-loading', 'page-loaded']);\n\nconst recommendation = defineProps({\n recommendation: {\n type: Boolean,\n default: false\n }\n})\n \nproducts.state.current = null\n\nonMounted(async () => {\n emits('page-loading');\n \n await products.actions.read({ _id: route.params.product, lookup: ['variants','recommended','inventory'] })\n \n // Инициализируем текущие изображения изображениями товара\n currentImages.value = [...productImages.value]\n\n if (typeof gtag === 'function') {\n gtag('event', 'view_item', {\n currency: returnCurrency(),\n value: product.value.price || 0,\n items: [{\n item_id: product.value._id,\n item_name: product.value.name,\n price: product.value.price || 0,\n item_category: product.value.category || '',\n item_brand: product.value.owner?.target?.profile.name || ''\n }]\n });\n }\n\n emits('page-loaded');\n})\n\n// Обработчик выбора варианта\nfunction handleVariantSelected(variant) {\n selectedVariant.value = variant\n}\n\n// Обработчик обновления изображений при выборе варианта\nfunction handleUpdateImages(images) {\n if (images && images.length > 0) {\n currentImages.value = [...images]\n } else {\n // Если у варианта нет изображений, возвращаем изображения товара\n currentImages.value = [...productImages.value]\n }\n}\n\n// Функция добавления товара в корзину - теперь требует выбранный вариант\nasync function handleAddToCart({variant, quantity}) {\n console.log('variant is', variant)\n console.log('quantity is', quantity)\n let selectedDates = null\n\n try {\n if (!variant) {\n throw new Error('Variant is required for adding product to cart')\n }\n\n if (!shopcart.state.organization) {\n shopcart.state.organization = product.value.owner.target._id\n }\n \n if (product.value.listing === 'rent') {\n selectedDates = await proxy.$dateSelector(\n product.value._id,\n variant._id,\n quantity,\n variant.price || product.value.price\n );\n \n if (!selectedDates) throw new Error('Date selection cancelled')\n }\n \n // Если организация товара отличается от текущей в корзине\n if (shopcart.state.organization !== product.value.owner.target._id) {\n const result = await proxy.$alert({\n title: 'Replace items in your cart?',\n message: `Your cart has items from another vendor. If you continue, we'll clear it so you can order from this one instead.`,\n actions: [\n { label: 'Cancel', value: false },\n { label: 'Replace', value: true }\n ]\n })\n\n if (!result) throw new Error('Cart replacement cancelled')\n\n shopcart.state.positions = []\n shopcart.state.organization = product.value.owner.target._id\n }\n\n if (typeof gtag === 'function') {\n gtag('event', 'add_to_cart', {\n currency: returnCurrency(),\n value: variant.price || 0,\n items: [{\n item_id: product.value._id,\n item_name: product.value.name,\n price: variant.price || product.value.price || 0,\n quantity: 1,\n item_category: product.value.category || '',\n item_brand: product.value.owner?.target?.profile?.name || ''\n }]\n });\n }\n \n await shopcart.actions.addProductToCart(product.value, variant, product.value.owner.target._id, selectedDates, quantity)\n return true\n } catch (error) {\n console.error('Error while adding product to cart:', error)\n throw error\n }\n}\n</script>"],"names":["products.state","products.actions","shopcart.state","shopcart.actions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyIA,UAAM,QAAQ,SAAQ;AACP,cAAS;AACxB,UAAM,EAAE,MAAK,IAAK,mBAAkB;AACpC,UAAM,EAAE,gBAAgB,UAAS,IAAK,gBAAe;AAErD,UAAM,UAAU,SAAS,MAAMA,MAAe,OAAO;AACrD,UAAM,gBAAgB,SAAS,MAAMA,MAAe,QAAQ,UAAU,CAAA,CAAE;AAExE,UAAM,WAAW,SAAS,MAAM;AAC/B,UAAI,MAAM,KAAK,YAAY,cAAc;AACxC,eAAO,wBAAwB,QAAQ,MAAM,GAAG;AAAA,MACjD;AACA,UAAI,MAAM,KAAK,YAAY,gBAAgB;AAC1C,eAAO,kBAAkB,MAAM,OAAO,GAAG,aAAa,QAAQ,MAAM,GAAG;AAAA,MACxE;AACA,aAAO,aAAa,QAAQ,MAAM,GAAG;AAAA,IACtC,CAAC;AAGD,UAAM,gBAAgB,IAAI,CAAA,CAAE;AAE5B,UAAM,kBAAkB,IAAI,IAAI;AAEhC,UAAM,OAAO;AAAA,MACX,IAAI,EAAE,YAAY,eAAe,WAAW,cAAc,aAAa,cAAa;AAAA,MACpF,IAAI,EAAE,YAAY,sBAAsB,WAAW,iBAAiB,aAAa,WAAU;AAAA,IAC7F;AAEA,UAAM,EAAE,EAAC,IAAK,QAAQ,EAAE,UAAU,KAAI,CAAE;AAExC,UAAM,QAAQ;AASdA,UAAe,UAAU;AAEzB,cAAU,YAAY;AACpB,YAAM,cAAc;AAEpB,YAAMC,QAAiB,KAAK,EAAE,KAAK,MAAM,OAAO,SAAS,QAAQ,CAAC,YAAW,eAAc,WAAW,EAAC,CAAE;AAGzG,oBAAc,QAAQ,CAAC,GAAG,cAAc,KAAK;AAE7C,UAAI,OAAO,SAAS,YAAY;AAC9B,aAAK,SAAS,aAAa;AAAA,UACzB,UAAU,eAAc;AAAA,UACxB,OAAO,QAAQ,MAAM,SAAS;AAAA,UAC9B,OAAO,CAAC;AAAA,YACN,SAAS,QAAQ,MAAM;AAAA,YACvB,WAAW,QAAQ,MAAM;AAAA,YACzB,OAAO,QAAQ,MAAM,SAAS;AAAA,YAC9B,eAAe,QAAQ,MAAM,YAAY;AAAA,YACzC,YAAY,QAAQ,MAAM,OAAO,QAAQ,QAAQ,QAAQ;AAAA,UACjE,CAAO;AAAA,QACP,CAAK;AAAA,MACH;AAEA,YAAM,aAAa;AAAA,IACrB,CAAC;AAGD,aAAS,sBAAsB,SAAS;AACtC,sBAAgB,QAAQ;AAAA,IAC1B;AAGA,aAAS,mBAAmB,QAAQ;AAClC,UAAI,UAAU,OAAO,SAAS,GAAG;AAC/B,sBAAc,QAAQ,CAAC,GAAG,MAAM;AAAA,MAClC,OAAO;AAEL,sBAAc,QAAQ,CAAC,GAAG,cAAc,KAAK;AAAA,MAC/C;AAAA,IACF;AAGA,mBAAe,gBAAgB,EAAC,SAAS,SAAQ,GAAG;AAClD,cAAQ,IAAI,cAAc,OAAO;AAChC,cAAQ,IAAI,eAAe,QAAQ;AACpC,UAAI,gBAAgB;AAEpB,UAAI;AACF,YAAI,CAAC,SAAS;AACZ,gBAAM,IAAI,MAAM,gDAAgD;AAAA,QAClE;AAEA,YAAI,CAACC,QAAe,cAAc;AAChCA,kBAAe,eAAe,QAAQ,MAAM,MAAM,OAAO;AAAA,QAC3D;AAEA,YAAI,QAAQ,MAAM,YAAY,QAAQ;AACpC,0BAAgB,MAAM,MAAM;AAAA,YAC1B,QAAQ,MAAM;AAAA,YACd,QAAQ;AAAA,YACR;AAAA,YACA,QAAQ,SAAS,QAAQ,MAAM;AAAA,UACvC;AAEM,cAAI,CAAC,cAAe,OAAM,IAAI,MAAM,0BAA0B;AAAA,QAChE;AAGA,YAAIA,QAAe,iBAAiB,QAAQ,MAAM,MAAM,OAAO,KAAK;AAClE,gBAAM,SAAS,MAAM,MAAM,OAAO;AAAA,YAChC,OAAO;AAAA,YACP,SAAS;AAAA,YACT,SAAS;AAAA,cACP,EAAE,OAAO,UAAU,OAAO,MAAK;AAAA,cAC/B,EAAE,OAAO,WAAW,OAAO,KAAI;AAAA,YACzC;AAAA,UACA,CAAO;AAED,cAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,4BAA4B;AAEzDA,kBAAe,YAAY,CAAA;AAC3BA,kBAAe,eAAe,QAAQ,MAAM,MAAM,OAAO;AAAA,QAC3D;AAEA,YAAI,OAAO,SAAS,YAAY;AAC9B,eAAK,SAAS,eAAe;AAAA,YAC3B,UAAU,eAAc;AAAA,YACxB,OAAO,QAAQ,SAAS;AAAA,YACxB,OAAO,CAAC;AAAA,cACN,SAAS,QAAQ,MAAM;AAAA,cACvB,WAAW,QAAQ,MAAM;AAAA,cACzB,OAAO,QAAQ,SAAS,QAAQ,MAAM,SAAS;AAAA,cAC/C,UAAU;AAAA,cACV,eAAe,QAAQ,MAAM,YAAY;AAAA,cACzC,YAAY,QAAQ,MAAM,OAAO,QAAQ,SAAS,QAAQ;AAAA,YACpE,CAAS;AAAA,UACT,CAAO;AAAA,QACH;AAEA,cAAMC,UAAiB,iBAAiB,QAAQ,OAAO,SAAS,QAAQ,MAAM,MAAM,OAAO,KAAK,eAAe,QAAQ;AACvH,eAAO;AAAA,MACT,SAAS,OAAO;AACd,gBAAQ,MAAM,uCAAuC,KAAK;AAC1D,cAAM;AAAA,MACR;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -4,7 +4,7 @@ import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
|
|
|
4
4
|
import _sfc_main$3 from "../../../../components/Tab/Tab.vue2.js";
|
|
5
5
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
6
6
|
import Select from "../../../../components/Select/Select.vue.js";
|
|
7
|
-
import _sfc_main$2 from "../../../../components/Button/Button.
|
|
7
|
+
import _sfc_main$2 from "../../../../components/Button/Button.vue.js";
|
|
8
8
|
import _sfc_main$4 from "../../../../components/EditImages/EditImages.vue.js";
|
|
9
9
|
import BlockMultiselect from "../../../core/views/components/blocks/BlockMultiselect.vue.js";
|
|
10
10
|
import _sfc_main$5 from "../../../icons/navigation/IconCross.vue.js";
|
|
@@ -3,13 +3,13 @@ import { useRoute, useRouter } from "vue-router";
|
|
|
3
3
|
import { useGlobalMixins } from "../../../core/views/mixins/mixins.js";
|
|
4
4
|
/* empty css */
|
|
5
5
|
import _sfc_main$5 from "../../../../components/Feed/Feed.vue.js";
|
|
6
|
-
import _sfc_main$2 from "../../../../components/Spoiler/Spoiler.
|
|
6
|
+
import _sfc_main$2 from "../../../../components/Spoiler/Spoiler.vue.js";
|
|
7
7
|
import _sfc_main$3 from "../../../../components/Checkbox/Checkbox.vue.js";
|
|
8
8
|
import "vue-i18n";
|
|
9
9
|
import { actions as actions$1 } from "../../store/categories.js";
|
|
10
10
|
/* empty css */
|
|
11
11
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
12
|
-
import Filters from "../../../core/views/components/sections/Filters.
|
|
12
|
+
import Filters from "../../../core/views/components/sections/Filters.vue.js";
|
|
13
13
|
import Calendar from "../../../../components/Calendar/Calendar.vue2.js";
|
|
14
14
|
import _sfc_main$7 from "../../../../components/Popup/Popup.vue.js";
|
|
15
15
|
import _sfc_main$6 from "../blocks/CardProduct.vue.js";
|
|
@@ -46,7 +46,7 @@ const _hoisted_18 = { class: "cursor-pointer w-100 flex-v-center flex-nowrap fle
|
|
|
46
46
|
const _hoisted_19 = { class: "h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra" };
|
|
47
47
|
const _hoisted_20 = { class: "mn-t-small" };
|
|
48
48
|
const _hoisted_21 = { class: "h-1r" };
|
|
49
|
-
const _hoisted_22 = { class: "w-100
|
|
49
|
+
const _hoisted_22 = { class: "w-100 flex flex-column pd-thin pos-relative o-hidden" };
|
|
50
50
|
const _hoisted_23 = { class: "mn-b-thin mobile-only w-100 o-y-scroll scroll-hide scroll-snap-x-mandatory scroll-pd-regular" };
|
|
51
51
|
const _hoisted_24 = { class: "gap-thin flex-nowrap flex" };
|
|
52
52
|
const _hoisted_25 = ["onClick"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Products.vue.js","sources":["../../../../../../../src/modules/products/components/pages/Products.vue"],"sourcesContent":["<template>\n <div class=\"pos-relative\">\n <header \n v-if=\"route.name !== 'Organization' && !MOBILE_APP\"\n class=\"pd-medium flex-v-center flex-nowrap flex\"\n >\n <h2 class=\"mn-r-medium\">{{ currentCategory ? currentCategory.name : 'All Products' }}</h2>\n <button \n v-if=\"route.params._id && hasAccess(route.params._id, 'products', 'create', auth.state.accesses, auth.state.access.roles)\"\n @click=\"$router.push({\n name: route.params?._id ? 'Organization_ProductAdd' : 'ProductAdd'\n })\" \n class=\"radius-extra i-big hover:scale-[1.05] cursor-pointer t-white bg-second\">\n +\n </button>\n </header>\n\n <div class=\"cols-[1fr_3fr] mobile:cols-1 br-1px br-light z-index-3 pos-relative\">\n\n <div class=\"o-y-scroll br-r-1px br-light pd-medium z-index-2 desktop-only h-100 pos-relative\">\n <div class=\"w-100 o-y-scroll h-100\">\n <!-- Категории -->\n <div class=\"mn-b-medium\" v-if=\"currentCategories.length > 0\">\n <h4 class=\"mn-b-medium\">\n {{ route.params.categoryPath ? 'Subcategories' : 'Categories' }}\n </h4>\n <div class=\"gap-micro\">\n <div\n v-for=\"category in currentCategories\"\n :key=\"category._id\"\n @click=\"selectCategory(category)\"\n class=\"cursor-pointer hover:underline mn-b-regular ease\"\n >\n {{ category.name }}\n <br>\n <span v-for=\"subcategory in category.children\">{{subcategory.name}}</span>\n </div>\n </div>\n </div>\n\n <!-- Фильтры категории -->\n <Spoiler \n v-for=\"filter in categoryFilters\"\n :key=\"filter.name\"\n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\">{{ filter.name }}</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180deg mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-medium\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small\">\n <Checkbox \n v-for=\"option in filter.options\"\n :key=\"option.text || option\"\n v-model:radio=\"selectedFilters[filter.name]\"\n :label=\"option.text || option\"\n :value=\"option.text || option\"\n mode=\"checkbox\"\n class=\"mn-b-micro\"\n />\n </div>\n </template>\n </Spoiler>\n \n <!-- Цена за сутки -->\n <Spoiler \n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\"> Price</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180deg mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-medium\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small flex gap-thin\">\n <Field\n v-model:field=\"selectedFilters.price.min\"\n placeholder=\"From\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n <Field\n v-model:field=\"selectedFilters.price.max\"\n placeholder=\"To\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n </div>\n </template>\n </Spoiler>\n\n <!-- Доступность -->\n <Spoiler \n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\">Availability</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180deg mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-medium\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small\">\n <div \n @click=\"() => { tempSelectedDates = selectedFilters.availability; showDatePickerPopup = true; }\"\n :class=\"{ 'bg-light': selectedFilters?.availability }\"\n class=\"pd-small field-wrapper radius-small bg-light cursor-pointer hover:bg-light ease flex-v-center flex gap-thin\"\n >\n <IconCalendar class=\"i-medium\" />\n <span class=\"h-1r\">{{ selectedFilters.availability ? `${formatDate(selectedFilters.availability.start, { dayMonth: true, language: 'en' })} - ${formatDate(selectedFilters.availability.end, { dayMonth: true, language: 'en' })}` : 'Select dates'}}</span>\n </div>\n </div>\n </template>\n </Spoiler>\n\n <!-- Кнопка очистки фильтров -->\n <button \n @click=\"clearAllFilters\"\n class=\"bg-main w-100 button mn-t-medium\"\n >\n Clear Filters\n </button>\n </div>\n </div>\n\n <div class=\"w-100 rows-1 pd-thin pos-relative o-hidden\">\n \n <slot></slot>\n\n <div class=\"mn-b-thin mobile-only w-100 o-y-scroll scroll-hide scroll-snap-x-mandatory scroll-pd-regular\">\n <div class=\"gap-thin flex-nowrap flex\">\n <div\n v-for=\"category in currentCategories\"\n :key=\"category._id\"\n @click=\"selectCategory(category)\"\n class=\" flex-child-default bg-light flex ws-nowrap pd-medium radius-medium cursor-pointer hover:bg-light ease\"\n >\n {{ category.name }}\n </div>\n </div>\n </div>\n\n <Feed\n :search=\"true\"\n v-model:sort=\"products.state.sort\"\n :showLoadMore=\"false\"\n :states=\"{\n empty: {\n title: 'No Products Found',\n description: 'Currently, there are no products available.'\n }\n }\"\n :store=\"{\n read: (options) => products.actions.read(options),\n state: products.state\n }\"\n :options=\"{\n limit: 16,\n owner: route.name?.includes('Organization') ? route.params._id : null,\n lookup: ['variants','rents','inventory'],\n categories: route.params.categoryPath ? `/${route.params.categoryPath}` : null,\n filters: processedFilters,\n priceMin: selectedFilters.price?.min,\n priceMax: selectedFilters.price?.max,\n dateStart: selectedFilters.availability?.start,\n dateEnd: selectedFilters.availability?.end\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"\"\n \n >\n <div class=\"mn-b-thin mobile-only\">\n <Filters\n v-model:filters=\"availableFilters\"\n v-model:selected=\"selectedFilters\"\n class=\"\"\n />\n </div>\n <div class=\"cols-4 mobile:cols-2 z-index-1 pos-relative w-100 rows-1 gap-thin\">\n <router-link\n v-for=\"product in items\"\n :to=\"route.params._id ? `/organizations/${route.params._id}/products/${product._id}` : `/products/${product._id}`\"\n class=\"pos-relative h-100 w-100\"\n >\n <CardProduct\n :key=\"product._id\"\n :product=\"product\"\n :user=\"auth.state.access\"\n :organization=\"route.params._id\"\n :access=\"hasAccess(route.params._id, 'products', 'edit', auth.state.accesses, auth.state.access.roles)\"\n class=\"pos-relative h-100 w-100 bg-light\"\n />\n </router-link>\n </div>\n </Feed>\n\n </div>\n </div>\n \n <!-- Date Picker Popup -->\n <Popup\n :isPopupOpen=\"showDatePickerPopup\"\n @close-popup=\"showDatePickerPopup = false\"\n class=\"pd-medium bg-white radius-medium\"\n style=\"min-width: 350px;\"\n >\n <h3 class=\"mn-b-medium\">Select Date Range</h3>\n \n <Calendar\n v-model:date=\"tempSelectedDates\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"mn-b-medium radius-small bg-light\"\n />\n \n <div class=\"flex gap-small\">\n <button \n @click=\"showDatePickerPopup = false\"\n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n <button \n @click=\"applyDateFilter\"\n class=\"bg-main button w-100 flex-child-full\"\n >\n Apply\n </button>\n \n </div>\n </Popup>\n</div>\n\n</template>\n\n\n<script setup=\"props\">\n // Import libs\n import { ref, computed, watch, onMounted, onUnmounted } from 'vue'\n import { useRoute, useRouter } from 'vue-router'\n\n // Import components\n import Tab from '@martyrs/src/components/Tab/Tab.vue'\n import Feed from '@martyrs/src/components/Feed/Feed.vue'\n\n import FilterProducts from '@martyrs/src/modules/products/components/sections/FilterProducts.vue'\n import BlockSearch from '@martyrs/src/modules/core/views/components/blocks/BlockSearch.vue'\n import Filters from '@martyrs/src/modules/core/views/components/sections/Filters.vue'\n import Spoiler from \"@martyrs/src/components/Spoiler/Spoiler.vue\"\n import Field from \"@martyrs/src/components/Field/Field.vue\"\n import Calendar from \"@martyrs/src/components/Calendar/Calendar.vue\"\n import Popup from \"@martyrs/src/components/Popup/Popup.vue\"\n import Checkbox from \"@martyrs/src/components/Checkbox/Checkbox.vue\"\n\n import CardProduct from '@martyrs/src/modules/products/components/blocks/CardProduct.vue'\n\n import IconPlus from '@martyrs/src/modules/icons/navigation/IconPlus.vue'\n import IconChevronBottom from '@martyrs/src/modules/icons/navigation/IconChevronBottom.vue'\n import IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\n\n // Accessing router and store\n import * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\n import { useStore } from '@martyrs/src/modules/core/views/store/core.store.js';\n import * as products from '@martyrs/src/modules/products/store/products.js';\n import * as categories from '@martyrs/src/modules/products/store/categories.js';\n import { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\n const emits = defineEmits(['page-loading', 'page-loaded']);\n const route = useRoute()\n const router = useRouter()\n const store = useStore()\n const { generateFilters, formatDate, hasAccess, returnCurrency } = useGlobalMixins()\n\n // Категории и фильтры\n const currentCategories = ref([]);\n const currentCategory = ref(null);\n const categoryFilters = ref([]);\n // const selectedFilters = ref({});\n\n const availableFilters = ref([\n {\n title: 'Price',\n value: 'price',\n type: 'range',\n minPlaceholder: 'From',\n maxPlaceholder: 'To'\n },\n {\n title: 'Availability',\n value: 'availability',\n type: 'date'\n }\n ])\n\n const selectedFilters = ref({\n price: { min: '', max: '' },\n availability: null\n })\n\n const showDatePickerPopup = ref(false);\n const tempSelectedDates = ref(null);\n\n // Computed property for processed filters\n const processedFilters = computed(() => {\n const filters = [];\n \n // Обрабатываем фильтры категорий\n Object.entries(selectedFilters.value).forEach(([key, value]) => {\n if (key === 'price' || key === 'availability') return; // эти обрабатываются отдельно\n \n if (Array.isArray(value) && value.length > 0) {\n filters.push({\n parameter: key,\n values: value,\n caseSensitive: false\n });\n } else if (value && typeof value === 'string' && value.trim() !== '') {\n filters.push({\n parameter: key,\n values: [value],\n caseSensitive: false\n });\n }\n });\n \n return filters.length > 0 ? JSON.stringify(filters) : '';\n });\n\n\n\n\n const processedLookups = computed(() => {\n const lookups = ['variants'];\n if (selectedFilters.value.availability) {\n lookups.push('rents');\n }\n return lookups;\n });\n\n const loadCategoryData = async () => {\n const categoryPath = route.params.categoryPath;\n \n // Очищаем фильтры категории из предыдущей загрузки\n availableFilters.value = availableFilters.value.filter(f => f.value === 'price' || f.value === 'availability');\n \n try {\n if (categoryPath) {\n // Загружаем категорию и её прямых детей\n const result = await categories.actions.read({ \n url: `/${categoryPath}`,\n depth: 1,\n tree: false\n });\n \n if (result.length > 0) {\n currentCategory.value = result[0];\n currentCategories.value = result[0].children || [];\n categoryFilters.value = result[0].filters || [];\n \n // Добавляем фильтры категории в availableFilters\n (result[0].filters || []).forEach(filter => {\n availableFilters.value.push({\n title: filter.name,\n value: filter.name,\n type: 'checkbox',\n options: (filter.options || []).map(option => ({\n label: typeof option === 'string' ? option : option.text,\n value: typeof option === 'string' ? option : option.text\n }))\n });\n // Инициализируем массив для фильтра\n if (!selectedFilters.value[filter.name]) {\n selectedFilters.value[filter.name] = [];\n }\n });\n }\n } else {\n // Загружаем только корневые категории\n const result = await categories.actions.read({ \n root: true,\n tree: false\n });\n \n currentCategories.value = result;\n categoryFilters.value = [];\n }\n } catch (error) {\n console.error('Error loading categories:', error);\n currentCategories.value = [];\n categoryFilters.value = [];\n }\n };\n\n // Функция для выбора категории\n const selectCategory = (category) => {\n const categoryPath = category.url ? category.url.substring(1) : '';\n \n if (!categoryPath) {\n console.warn('No URL found for category:', category);\n return;\n }\n \n // Переходим к странице категории используя wildcard роут\n if (route.params._id) {\n router.push(`/organizations/${route.params._id}/products/categories/${categoryPath}`);\n } else {\n router.push(`/products/categories/${categoryPath}`);\n }\n };\n\n\n // Функция применения фильтра дат\n const applyDateFilter = () => {\n selectedFilters.value.availability = tempSelectedDates.value;\n showDatePickerPopup.value = false;\n };\n \n // Функция очистки всех фильтров\n const clearAllFilters = () => {\n selectedFilters.value.price = { min: '', max: '' };\n selectedFilters.value.availability = null;\n \n // Очищаем фильтры категорий\n categoryFilters.value.forEach(filter => {\n selectedFilters.value[filter.name] = [];\n });\n };\n\n if (route.params?._id) {\n store.core.state.navigation_bar.actions = [{\n component: IconPlus,\n props: {\n fill: \"rgb(var(--main))\"\n },\n condition: () => auth.state.user && auth.state.user._id,\n action: () => route.params._id ? router.push({ name: 'Organization_ProductAdd', params: { _id: route.params._id} }) : router.push({ name: 'ProductAdd' })\n }];\n }\n\n onMounted(async () => {\n emits('page-loading');\n await loadCategoryData();\n emits('page-loaded');\n });\n\n onUnmounted(() => {\n store.core.state.navigation_bar.actions = [];\n });\n\n</script>\n\n<style lang=\"scss\">\n\n\n</style>\n"],"names":["categories.actions","IconPlus","auth.state"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Products.vue.js","sources":["../../../../../../../src/modules/products/components/pages/Products.vue"],"sourcesContent":["<template>\n <div class=\"pos-relative\">\n <header \n v-if=\"route.name !== 'Organization' && !MOBILE_APP\"\n class=\"pd-medium flex-v-center flex-nowrap flex\"\n >\n <h2 class=\"mn-r-medium\">{{ currentCategory ? currentCategory.name : 'All Products' }}</h2>\n <button \n v-if=\"route.params._id && hasAccess(route.params._id, 'products', 'create', auth.state.accesses, auth.state.access.roles)\"\n @click=\"$router.push({\n name: route.params?._id ? 'Organization_ProductAdd' : 'ProductAdd'\n })\" \n class=\"radius-extra i-big hover:scale-[1.05] cursor-pointer t-white bg-second\">\n +\n </button>\n </header>\n\n <div class=\"cols-[1fr_3fr] mobile:cols-1 br-1px br-light z-index-3 pos-relative\">\n\n <div class=\"o-y-scroll br-r-1px br-light pd-medium z-index-2 desktop-only h-100 pos-relative\">\n <div class=\"w-100 o-y-scroll h-100\">\n <!-- Категории -->\n <div class=\"mn-b-medium\" v-if=\"currentCategories.length > 0\">\n <h4 class=\"mn-b-medium\">\n {{ route.params.categoryPath ? 'Subcategories' : 'Categories' }}\n </h4>\n <div class=\"gap-micro\">\n <div\n v-for=\"category in currentCategories\"\n :key=\"category._id\"\n @click=\"selectCategory(category)\"\n class=\"cursor-pointer hover:underline mn-b-regular ease\"\n >\n {{ category.name }}\n <br>\n <span v-for=\"subcategory in category.children\">{{subcategory.name}}</span>\n </div>\n </div>\n </div>\n\n <!-- Фильтры категории -->\n <Spoiler \n v-for=\"filter in categoryFilters\"\n :key=\"filter.name\"\n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\">{{ filter.name }}</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180deg mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-medium\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small\">\n <Checkbox \n v-for=\"option in filter.options\"\n :key=\"option.text || option\"\n v-model:radio=\"selectedFilters[filter.name]\"\n :label=\"option.text || option\"\n :value=\"option.text || option\"\n mode=\"checkbox\"\n class=\"mn-b-micro\"\n />\n </div>\n </template>\n </Spoiler>\n \n <!-- Цена за сутки -->\n <Spoiler \n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\"> Price</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180deg mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-medium\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small flex gap-thin\">\n <Field\n v-model:field=\"selectedFilters.price.min\"\n placeholder=\"From\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n <Field\n v-model:field=\"selectedFilters.price.max\"\n placeholder=\"To\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n </div>\n </template>\n </Spoiler>\n\n <!-- Доступность -->\n <Spoiler \n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\">Availability</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180deg mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-medium\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small\">\n <div \n @click=\"() => { tempSelectedDates = selectedFilters.availability; showDatePickerPopup = true; }\"\n :class=\"{ 'bg-light': selectedFilters?.availability }\"\n class=\"pd-small field-wrapper radius-small bg-light cursor-pointer hover:bg-light ease flex-v-center flex gap-thin\"\n >\n <IconCalendar class=\"i-medium\" />\n <span class=\"h-1r\">{{ selectedFilters.availability ? `${formatDate(selectedFilters.availability.start, { dayMonth: true, language: 'en' })} - ${formatDate(selectedFilters.availability.end, { dayMonth: true, language: 'en' })}` : 'Select dates'}}</span>\n </div>\n </div>\n </template>\n </Spoiler>\n\n <!-- Кнопка очистки фильтров -->\n <button \n @click=\"clearAllFilters\"\n class=\"bg-main w-100 button mn-t-medium\"\n >\n Clear Filters\n </button>\n </div>\n </div>\n\n <div class=\"w-100 flex flex-column pd-thin pos-relative o-hidden\">\n \n <slot></slot>\n\n <div class=\"mn-b-thin mobile-only w-100 o-y-scroll scroll-hide scroll-snap-x-mandatory scroll-pd-regular\">\n <div class=\"gap-thin flex-nowrap flex\">\n <div\n v-for=\"category in currentCategories\"\n :key=\"category._id\"\n @click=\"selectCategory(category)\"\n class=\" flex-child-default bg-light flex ws-nowrap pd-medium radius-medium cursor-pointer hover:bg-light ease\"\n >\n {{ category.name }}\n </div>\n </div>\n </div>\n\n <Feed\n :search=\"true\"\n v-model:sort=\"products.state.sort\"\n :showLoadMore=\"false\"\n :states=\"{\n empty: {\n title: 'No Products Found',\n description: 'Currently, there are no products available.'\n }\n }\"\n :store=\"{\n read: (options) => products.actions.read(options),\n state: products.state\n }\"\n :options=\"{\n limit: 16,\n owner: route.name?.includes('Organization') ? route.params._id : null,\n lookup: ['variants','rents','inventory'],\n categories: route.params.categoryPath ? `/${route.params.categoryPath}` : null,\n filters: processedFilters,\n priceMin: selectedFilters.price?.min,\n priceMax: selectedFilters.price?.max,\n dateStart: selectedFilters.availability?.start,\n dateEnd: selectedFilters.availability?.end\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"\"\n \n >\n <div class=\"mn-b-thin mobile-only\">\n <Filters\n v-model:filters=\"availableFilters\"\n v-model:selected=\"selectedFilters\"\n class=\"\"\n />\n </div>\n <div class=\"cols-4 mobile:cols-2 z-index-1 pos-relative w-100 rows-1 gap-thin\">\n <router-link\n v-for=\"product in items\"\n :to=\"route.params._id ? `/organizations/${route.params._id}/products/${product._id}` : `/products/${product._id}`\"\n class=\"pos-relative h-100 w-100\"\n >\n <CardProduct\n :key=\"product._id\"\n :product=\"product\"\n :user=\"auth.state.access\"\n :organization=\"route.params._id\"\n :access=\"hasAccess(route.params._id, 'products', 'edit', auth.state.accesses, auth.state.access.roles)\"\n class=\"pos-relative h-100 w-100 bg-light\"\n />\n </router-link>\n </div>\n </Feed>\n\n </div>\n </div>\n \n <!-- Date Picker Popup -->\n <Popup\n :isPopupOpen=\"showDatePickerPopup\"\n @close-popup=\"showDatePickerPopup = false\"\n class=\"pd-medium bg-white radius-medium\"\n style=\"min-width: 350px;\"\n >\n <h3 class=\"mn-b-medium\">Select Date Range</h3>\n \n <Calendar\n v-model:date=\"tempSelectedDates\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"mn-b-medium radius-small bg-light\"\n />\n \n <div class=\"flex gap-small\">\n <button \n @click=\"showDatePickerPopup = false\"\n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n <button \n @click=\"applyDateFilter\"\n class=\"bg-main button w-100 flex-child-full\"\n >\n Apply\n </button>\n \n </div>\n </Popup>\n</div>\n\n</template>\n\n\n<script setup=\"props\">\n // Import libs\n import { ref, computed, watch, onMounted, onUnmounted } from 'vue'\n import { useRoute, useRouter } from 'vue-router'\n\n // Import components\n import Tab from '@martyrs/src/components/Tab/Tab.vue'\n import Feed from '@martyrs/src/components/Feed/Feed.vue'\n\n import FilterProducts from '@martyrs/src/modules/products/components/sections/FilterProducts.vue'\n import BlockSearch from '@martyrs/src/modules/core/views/components/blocks/BlockSearch.vue'\n import Filters from '@martyrs/src/modules/core/views/components/sections/Filters.vue'\n import Spoiler from \"@martyrs/src/components/Spoiler/Spoiler.vue\"\n import Field from \"@martyrs/src/components/Field/Field.vue\"\n import Calendar from \"@martyrs/src/components/Calendar/Calendar.vue\"\n import Popup from \"@martyrs/src/components/Popup/Popup.vue\"\n import Checkbox from \"@martyrs/src/components/Checkbox/Checkbox.vue\"\n\n import CardProduct from '@martyrs/src/modules/products/components/blocks/CardProduct.vue'\n\n import IconPlus from '@martyrs/src/modules/icons/navigation/IconPlus.vue'\n import IconChevronBottom from '@martyrs/src/modules/icons/navigation/IconChevronBottom.vue'\n import IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\n\n // Accessing router and store\n import * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\n import { useStore } from '@martyrs/src/modules/core/views/store/core.store.js';\n import * as products from '@martyrs/src/modules/products/store/products.js';\n import * as categories from '@martyrs/src/modules/products/store/categories.js';\n import { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\n const emits = defineEmits(['page-loading', 'page-loaded']);\n const route = useRoute()\n const router = useRouter()\n const store = useStore()\n const { generateFilters, formatDate, hasAccess, returnCurrency } = useGlobalMixins()\n\n // Категории и фильтры\n const currentCategories = ref([]);\n const currentCategory = ref(null);\n const categoryFilters = ref([]);\n // const selectedFilters = ref({});\n\n const availableFilters = ref([\n {\n title: 'Price',\n value: 'price',\n type: 'range',\n minPlaceholder: 'From',\n maxPlaceholder: 'To'\n },\n {\n title: 'Availability',\n value: 'availability',\n type: 'date'\n }\n ])\n\n const selectedFilters = ref({\n price: { min: '', max: '' },\n availability: null\n })\n\n const showDatePickerPopup = ref(false);\n const tempSelectedDates = ref(null);\n\n // Computed property for processed filters\n const processedFilters = computed(() => {\n const filters = [];\n \n // Обрабатываем фильтры категорий\n Object.entries(selectedFilters.value).forEach(([key, value]) => {\n if (key === 'price' || key === 'availability') return; // эти обрабатываются отдельно\n \n if (Array.isArray(value) && value.length > 0) {\n filters.push({\n parameter: key,\n values: value,\n caseSensitive: false\n });\n } else if (value && typeof value === 'string' && value.trim() !== '') {\n filters.push({\n parameter: key,\n values: [value],\n caseSensitive: false\n });\n }\n });\n \n return filters.length > 0 ? JSON.stringify(filters) : '';\n });\n\n\n\n\n const processedLookups = computed(() => {\n const lookups = ['variants'];\n if (selectedFilters.value.availability) {\n lookups.push('rents');\n }\n return lookups;\n });\n\n const loadCategoryData = async () => {\n const categoryPath = route.params.categoryPath;\n \n // Очищаем фильтры категории из предыдущей загрузки\n availableFilters.value = availableFilters.value.filter(f => f.value === 'price' || f.value === 'availability');\n \n try {\n if (categoryPath) {\n // Загружаем категорию и её прямых детей\n const result = await categories.actions.read({ \n url: `/${categoryPath}`,\n depth: 1,\n tree: false\n });\n \n if (result.length > 0) {\n currentCategory.value = result[0];\n currentCategories.value = result[0].children || [];\n categoryFilters.value = result[0].filters || [];\n \n // Добавляем фильтры категории в availableFilters\n (result[0].filters || []).forEach(filter => {\n availableFilters.value.push({\n title: filter.name,\n value: filter.name,\n type: 'checkbox',\n options: (filter.options || []).map(option => ({\n label: typeof option === 'string' ? option : option.text,\n value: typeof option === 'string' ? option : option.text\n }))\n });\n // Инициализируем массив для фильтра\n if (!selectedFilters.value[filter.name]) {\n selectedFilters.value[filter.name] = [];\n }\n });\n }\n } else {\n // Загружаем только корневые категории\n const result = await categories.actions.read({ \n root: true,\n tree: false\n });\n \n currentCategories.value = result;\n categoryFilters.value = [];\n }\n } catch (error) {\n console.error('Error loading categories:', error);\n currentCategories.value = [];\n categoryFilters.value = [];\n }\n };\n\n // Функция для выбора категории\n const selectCategory = (category) => {\n const categoryPath = category.url ? category.url.substring(1) : '';\n \n if (!categoryPath) {\n console.warn('No URL found for category:', category);\n return;\n }\n \n // Переходим к странице категории используя wildcard роут\n if (route.params._id) {\n router.push(`/organizations/${route.params._id}/products/categories/${categoryPath}`);\n } else {\n router.push(`/products/categories/${categoryPath}`);\n }\n };\n\n\n // Функция применения фильтра дат\n const applyDateFilter = () => {\n selectedFilters.value.availability = tempSelectedDates.value;\n showDatePickerPopup.value = false;\n };\n \n // Функция очистки всех фильтров\n const clearAllFilters = () => {\n selectedFilters.value.price = { min: '', max: '' };\n selectedFilters.value.availability = null;\n \n // Очищаем фильтры категорий\n categoryFilters.value.forEach(filter => {\n selectedFilters.value[filter.name] = [];\n });\n };\n\n if (route.params?._id) {\n store.core.state.navigation_bar.actions = [{\n component: IconPlus,\n props: {\n fill: \"rgb(var(--main))\"\n },\n condition: () => auth.state.user && auth.state.user._id,\n action: () => route.params._id ? router.push({ name: 'Organization_ProductAdd', params: { _id: route.params._id} }) : router.push({ name: 'ProductAdd' })\n }];\n }\n\n onMounted(async () => {\n emits('page-loading');\n await loadCategoryData();\n emits('page-loaded');\n });\n\n onUnmounted(() => {\n store.core.state.navigation_bar.actions = [];\n });\n\n</script>\n\n<style lang=\"scss\">\n\n\n</style>\n"],"names":["categories.actions","IconPlus","auth.state"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useModel, ref, reactive, createElementBlock, openBlock, Fragment, createVNode, withCtx, createCommentVNode, renderList, createElementVNode, toDisplayString, createTextVNode } from "vue";
|
|
2
2
|
import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
|
|
3
3
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
4
|
-
import _sfc_main$5 from "../../../../components/Button/Button.
|
|
4
|
+
import _sfc_main$5 from "../../../../components/Button/Button.vue.js";
|
|
5
5
|
import _sfc_main$4 from "../../../../components/Popup/Popup.vue.js";
|
|
6
6
|
import _sfc_main$2 from "../../../icons/navigation/IconEdit.vue.js";
|
|
7
7
|
import _sfc_main$3 from "../../../icons/navigation/IconDelete.vue.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useModel, ref, reactive, createElementBlock, openBlock, Fragment, createVNode, withCtx, createCommentVNode, renderList, createElementVNode, toDisplayString, createTextVNode } from "vue";
|
|
2
2
|
import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
|
|
3
3
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
4
|
-
import _sfc_main$5 from "../../../../components/Button/Button.
|
|
4
|
+
import _sfc_main$5 from "../../../../components/Button/Button.vue.js";
|
|
5
5
|
import _sfc_main$4 from "../../../../components/Popup/Popup.vue.js";
|
|
6
6
|
import Select from "../../../../components/Select/Select.vue.js";
|
|
7
7
|
import _sfc_main$2 from "../../../icons/navigation/IconEdit.vue.js";
|
|
@@ -5,7 +5,7 @@ import variantsStore from "../../store/variants.store.js";
|
|
|
5
5
|
import { state } from "../../store/products.js";
|
|
6
6
|
import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
|
|
7
7
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
8
|
-
import _sfc_main$3 from "../../../../components/Button/Button.
|
|
8
|
+
import _sfc_main$3 from "../../../../components/Button/Button.vue.js";
|
|
9
9
|
import _sfc_main$7 from "../../../../components/Popup/Popup.vue.js";
|
|
10
10
|
import Select from "../../../../components/Select/Select.vue.js";
|
|
11
11
|
import _sfc_main$2 from "../../../../components/Feed/Feed.vue.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, watch, onMounted, createElementBlock, openBlock, createVNode, createElementVNode, withCtx, Fragment, renderList, createBlock, toDisplayString, unref } from "vue";
|
|
2
|
-
import _sfc_main$1 from "../../../../components/Spoiler/Spoiler.
|
|
2
|
+
import _sfc_main$1 from "../../../../components/Spoiler/Spoiler.vue.js";
|
|
3
3
|
import _sfc_main$2 from "../../../../components/Checkbox/Checkbox.vue.js";
|
|
4
4
|
import { useI18n } from "vue-i18n";
|
|
5
5
|
import { useRoute, useRouter } from "vue-router";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ref, computed, createElementBlock, createCommentVNode, openBlock, createVNode, createElementVNode, toDisplayString, withCtx, unref, Fragment } from "vue";
|
|
2
2
|
import { useI18n } from "vue-i18n";
|
|
3
3
|
import _sfc_main$5 from "../../../icons/actions/IconShopcartAdd.vue.js";
|
|
4
|
-
import _sfc_main$4 from "../../../../components/Button/Button.
|
|
4
|
+
import _sfc_main$4 from "../../../../components/Button/Button.vue.js";
|
|
5
5
|
import _sfc_main$1 from "../blocks/ProductVariants.vue.js";
|
|
6
6
|
import ProductDiscounts from "../blocks/ProductDiscounts.vue.js";
|
|
7
7
|
import _sfc_main$3 from "../elements/QuantitySelector.vue.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getCurrentInstance, ref, computed, createElementBlock, openBlock, createElementVNode, Fragment, renderList, createBlock, withCtx, createVNode, withModifiers, toDisplayString } from "vue";
|
|
2
2
|
import { useRouter } from "vue-router";
|
|
3
|
-
import _sfc_main$4 from "../../../../components/Button/Button.
|
|
3
|
+
import _sfc_main$4 from "../../../../components/Button/Button.vue.js";
|
|
4
4
|
import _sfc_main$2 from "../../../../components/Checkbox/Checkbox.vue.js";
|
|
5
5
|
import _sfc_main$1 from "../blocks/CardProduct.vue.js";
|
|
6
6
|
import _sfc_main$3 from "../../../icons/entities/IconProducts.vue.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { computed, ref, createElementBlock, openBlock, createElementVNode, createBlock, createCommentVNode, createVNode, unref, toDisplayString, Transition, withCtx, Fragment, renderList, createTextVNode } from "vue";
|
|
2
|
-
import _sfc_main$4 from "../../../../components/Button/Button.
|
|
2
|
+
import _sfc_main$4 from "../../../../components/Button/Button.vue.js";
|
|
3
3
|
import _sfc_main$3 from "../../../../components/Tab/Tab.vue2.js";
|
|
4
4
|
import _sfc_main$1 from "../../../icons/navigation/IconEdit.vue.js";
|
|
5
5
|
import PlaceholderImage from "../../../icons/placeholders/PlaceholderImage.vue.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { computed, ref, watch, createElementBlock, openBlock, createElementVNode, createVNode, withCtx, createTextVNode } from "vue";
|
|
2
2
|
import dayjs from "../../../../../../../../_virtual/dayjs.min.js";
|
|
3
3
|
import _sfc_main$2 from "../../../../../../components/Tab/Tab.vue2.js";
|
|
4
|
-
import _sfc_main$3 from "../../../../../../components/Button/Button.
|
|
4
|
+
import _sfc_main$3 from "../../../../../../components/Button/Button.vue.js";
|
|
5
5
|
import _sfc_main$4 from "../../../../../../components/Dropdown/Dropdown.vue.js";
|
|
6
6
|
import Calendar from "../../../../../../components/Calendar/Calendar.vue2.js";
|
|
7
7
|
import _sfc_main$1 from "./DateLabel.vue.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ref, computed, onMounted, createElementBlock, openBlock, createElementVNode, createVNode, toDisplayString, unref, withCtx, Fragment, renderList, createBlock, createCommentVNode, createTextVNode } from "vue";
|
|
2
2
|
import _sfc_main$4 from "../../../../../components/Block/Block.vue.js";
|
|
3
|
-
import _sfc_main$5 from "../../../../../components/Button/Button.
|
|
3
|
+
import _sfc_main$5 from "../../../../../components/Button/Button.vue.js";
|
|
4
4
|
import Field from "../../../../../components/Field/Field.vue.js";
|
|
5
5
|
import _sfc_main$2 from "../../../../../components/Feed/Feed.vue.js";
|
|
6
6
|
import _sfc_main$1 from "../../../../../components/Popup/Popup.vue.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { reactive, ref, createElementBlock, openBlock, renderSlot, createVNode, withCtx, createElementVNode, createTextVNode } from "vue";
|
|
2
2
|
import _sfc_main$1 from "../../../../components/Popup/Popup.vue.js";
|
|
3
|
-
import _sfc_main$2 from "../../../../components/Button/Button.
|
|
3
|
+
import _sfc_main$2 from "../../../../components/Button/Button.vue.js";
|
|
4
4
|
import Select from "../../../../components/Select/Select.vue.js";
|
|
5
5
|
import { actions } from "../../store/reports.js";
|
|
6
6
|
const _sfc_main = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ref, onMounted, watch, resolveComponent, createElementBlock, openBlock, createElementVNode, createVNode, unref, createCommentVNode, toDisplayString, withCtx, Transition, createBlock, resolveDynamicComponent } from "vue";
|
|
2
2
|
import { useRoute, useRouter } from "vue-router";
|
|
3
3
|
import { useI18n } from "vue-i18n";
|
|
4
|
-
/* empty css
|
|
4
|
+
/* empty css */
|
|
5
5
|
/* empty css */
|
|
6
6
|
/* empty css */
|
|
7
7
|
/* empty css */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ref, onMounted, createElementBlock, openBlock, createElementVNode, createVNode, withCtx, createTextVNode } from "vue";
|
|
2
2
|
import { useRouter, useRoute } from "vue-router";
|
|
3
3
|
import { Loader } from "../../../../../../node_modules/.pnpm/@googlemaps_js-api-loader@1.16.8/node_modules/@googlemaps/js-api-loader/dist/index.js";
|
|
4
|
-
import _sfc_main$1 from "../../../../components/Button/Button.
|
|
4
|
+
import _sfc_main$1 from "../../../../components/Button/Button.vue.js";
|
|
5
5
|
import { actions, state as state$1 } from "../../../organizations/store/organizations.js";
|
|
6
6
|
import { useStore } from "../../../core/views/store/core.store.js";
|
|
7
7
|
import { state } from "../../../marketplace/views/store/marketplace.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { computed, onMounted, createElementBlock, createCommentVNode, openBlock, createVNode, createElementVNode, unref, withCtx, Fragment, renderList, createBlock, toDisplayString } from "vue";
|
|
2
2
|
import { useRoute, useRouter } from "vue-router";
|
|
3
|
-
import _sfc_main$1 from "../../../../components/Spoiler/Spoiler.
|
|
3
|
+
import _sfc_main$1 from "../../../../components/Spoiler/Spoiler.vue.js";
|
|
4
4
|
import Map from "../../../../components/Map/Map.vue.js";
|
|
5
5
|
import SpotSub from "../blocks/SpotSub.vue.js";
|
|
6
6
|
import _sfc_main$2 from "../../../auth/views/components/blocks/CardUser.vue.js";
|
|
@@ -8,7 +8,7 @@ import Select from "../../../../components/Select/Select.vue.js";
|
|
|
8
8
|
import _sfc_main$3 from "../../../../components/Checkbox/Checkbox.vue.js";
|
|
9
9
|
import _sfc_main$4 from "../../../../components/Address/Address.vue.js";
|
|
10
10
|
import _sfc_main$5 from "../../../../components/LocationMarker/LocationMarker.vue.js";
|
|
11
|
-
import _sfc_main$2 from "../../../../components/Button/Button.
|
|
11
|
+
import _sfc_main$2 from "../../../../components/Button/Button.vue.js";
|
|
12
12
|
/* empty css */
|
|
13
13
|
import WorktimeEdit from "../sections/WorktimeEdit.vue.js";
|
|
14
14
|
import { actions, state } from "../../store/spots.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { mergeModels, useModel, ref, computed, onMounted, createElementBlock, openBlock, createElementVNode, createVNode, toDisplayString, unref, withCtx, createTextVNode, Fragment, renderList, normalizeClass, createCommentVNode, createBlock } from "vue";
|
|
2
2
|
import { useI18n } from "vue-i18n";
|
|
3
|
-
import _sfc_main$1 from "../../../../components/Button/Button.
|
|
3
|
+
import _sfc_main$1 from "../../../../components/Button/Button.vue.js";
|
|
4
4
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
5
5
|
import Select from "../../../../components/Select/Select.vue.js";
|
|
6
6
|
import _sfc_main$3 from "../../../../components/Checkbox/Checkbox.vue.js";
|