@ozdao/martyrs 0.2.563 → 0.2.565
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/abac-BPl9Bmf9.js +1527 -0
- package/dist/builder.js +51 -39
- package/dist/{common.schema-GFSlNJo7.js → common.schema-DswiUXKB.js} +1 -1
- package/dist/community.server.js +48 -9
- package/dist/core.server.js +6 -4
- package/dist/{crud-C7FSTUes.js → crud-q1ye5IhV.js} +7 -7
- package/dist/events.server.js +3 -3
- package/dist/gallery.server.js +2 -2
- package/dist/inventory.server.js +4 -6
- package/dist/{main-CmjWiDVF.js → main-B9o1iBAZ.js} +1279 -1287
- package/dist/marketplace.server.js +1 -1
- package/dist/martyrs/src/components/Button/Button.vue2.js +33 -42
- package/dist/martyrs/src/components/Button/Button.vue2.js.map +1 -1
- package/dist/martyrs/src/components/EditImages/{EditImages.vue.js → EditImages.vue2.js} +2 -2
- package/dist/martyrs/src/components/EditImages/EditImages.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
- package/dist/martyrs/src/components/FieldPhone/FieldPhone.vue.js +1 -1
- package/dist/martyrs/src/components/FieldPhone/FieldPhone.vue.js.map +1 -1
- package/dist/martyrs/src/components/Loader/Loader.vue.js +1 -2
- package/dist/martyrs/src/components/Loader/Loader.vue.js.map +1 -1
- package/dist/martyrs/src/components/Menu/{Menu.vue.js → Menu.vue2.js} +2 -2
- package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Tab/{Tab.vue.js → Tab.vue2.js} +2 -2
- package/dist/martyrs/src/components/Tab/Tab.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Tree/Tree.vue.js +6 -3
- package/dist/martyrs/src/components/Tree/Tree.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/auth.client.js +10 -7
- package/dist/martyrs/src/modules/auth/auth.client.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +12 -12
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/router/auth.router.js +116 -0
- package/dist/martyrs/src/modules/auth/views/router/auth.router.js.map +1 -0
- package/dist/martyrs/src/modules/auth/views/router/users.router.js +180 -0
- package/dist/martyrs/src/modules/auth/views/router/users.router.js.map +1 -0
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js +3 -3
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/locales/en.js +45 -0
- package/dist/martyrs/src/modules/core/locales/en.js.map +1 -1
- package/dist/martyrs/src/modules/core/locales/ru.js +45 -0
- package/dist/martyrs/src/modules/core/locales/ru.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/classes/i18n.manager.js +9 -0
- package/dist/martyrs/src/modules/core/views/classes/i18n.manager.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/{Filters.vue.js → Filters.vue2.js} +2 -2
- package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue2.js.map +1 -0
- package/dist/martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/mixins/mixins.js +1 -2
- package/dist/martyrs/src/modules/core/views/mixins/mixins.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/router/addRoutes.js +6 -1
- package/dist/martyrs/src/modules/core/views/router/addRoutes.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/pages/Marketplace.vue.js +1 -1
- package/dist/martyrs/src/modules/marketplace/views/store/marketplace.js +0 -16
- package/dist/martyrs/src/modules/marketplace/views/store/marketplace.js.map +1 -1
- package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js +4 -4
- package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js.map +1 -1
- package/dist/martyrs/src/modules/notifications/components/pages/Notifications.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/elements/FieldSubscribeNewsletter.vue.js +3 -0
- package/dist/martyrs/src/modules/orders/components/elements/FieldSubscribeNewsletter.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/CardCategory.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/CardCategory.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/CardProduct.vue.js +15 -2
- package/dist/martyrs/src/modules/products/components/blocks/CardProduct.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +9 -6
- 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 +4 -3
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +11 -2
- 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 +2 -2
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +11 -8
- package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +210 -60
- package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js +3 -3
- package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js.map +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +1 -1
- package/dist/martyrs.css +1 -1
- package/dist/martyrs.es.js +1 -1
- package/dist/music.server.js +11 -12
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js +1 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js +1 -1
- package/dist/notifications.server.js +0 -3
- package/dist/orders.server.js +5 -6
- package/dist/organizations.server.js +9 -10
- package/dist/products.server.js +27 -26
- package/dist/{queryProcessor-CBQgZycY.js → queryProcessor-C_5Iipam.js} +4 -1
- package/dist/rents.server.js +2 -3
- package/dist/spots.server.js +1 -1
- package/dist/style.css +38 -23
- package/dist/{web-cNKIl_cL.js → web-BF3ijvEr.js} +1 -1
- package/package.json +1 -1
- package/src/builder/modes/ssr.rspack.dev.js +4 -3
- package/src/builder/rspack/rspack.config.api.js +15 -4
- package/src/builder/rspack/rspack.config.base.js +3 -3
- package/src/builder/rspack/rspack.config.ssr.client.js +28 -28
- package/src/builder/templates/page.js +2 -2
- package/src/components/Button/Button.vue +50 -37
- package/src/components/FieldPhone/FieldPhone.vue +1 -1
- package/src/components/Loader/Loader.vue +1 -1
- package/src/components/Tree/Tree.vue +6 -3
- package/src/modules/PROCESS.md +0 -0
- package/src/modules/TASKS.MD +17 -0
- package/src/modules/auth/auth.client.js +11 -7
- package/src/modules/auth/views/components/pages/SignIn.vue +1 -1
- package/src/modules/auth/views/router/auth.router.js +94 -0
- package/src/modules/auth/views/router/users.router.js +153 -0
- package/src/modules/backoffice/components/partials/Sidebar.vue +7 -7
- package/src/modules/community/community.server.js +8 -0
- package/src/modules/community/policies/blog.policies.js +55 -0
- package/src/modules/community/routes/blog.routes.js +1 -1
- package/src/modules/community/routes/comments.routes.js +1 -1
- package/src/modules/community/routes/reactions.routes.js +1 -4
- package/src/modules/core/controllers/classes/abac/abac.adapter.express.js +206 -124
- package/src/modules/core/controllers/classes/abac/abac.adapter.ws.js +203 -50
- package/src/modules/core/controllers/classes/abac/abac.core.js +127 -36
- package/src/modules/core/controllers/classes/abac/abac.fields.js +144 -179
- package/src/modules/core/controllers/classes/abac/abac.js +201 -10
- package/src/modules/core/controllers/classes/abac/abac.policies.js +147 -57
- package/src/modules/core/controllers/classes/crud/crud.policies.js +5 -5
- package/src/modules/core/controllers/policies/core.policies.js +5 -2
- package/src/modules/core/controllers/utils/queryProcessor.js +4 -1
- package/src/modules/core/core.server.js +1 -0
- package/src/modules/core/locales/en.js +45 -0
- package/src/modules/core/locales/ru.js +45 -0
- package/src/modules/core/models/schemas/common.schema.js +1 -1
- package/src/modules/core/views/classes/i18n.manager.js +13 -0
- package/src/modules/core/views/components/sections/filters/FilterPrice.vue +81 -0
- package/src/modules/core/views/mixins/mixins.js +1 -2
- package/src/modules/core/views/router/addRoutes.js +6 -1
- package/src/modules/events/routes/events.routes.js +1 -1
- package/src/modules/inventory/components/pages/InventoryEdit.vue +3 -3
- package/src/modules/inventory/policies/inventory.policies.js +1 -1
- package/src/modules/inventory/routes/inventory.routes.js +1 -1
- package/src/modules/marketplace/marketplace.router.js +66 -0
- package/src/modules/marketplace/views/components/layouts/Marketplace.vue +363 -0
- package/src/modules/marketplace/views/components/pages/Catalog.vue +73 -0
- package/src/modules/marketplace/views/store/marketplace.js +0 -16
- package/src/modules/music/controllers/stream.controller.js +1 -1
- package/src/modules/music/music.server.js +1 -1
- package/src/modules/music/policies/music.policies.js +3 -2
- package/src/modules/music/router/library.router.js +26 -0
- package/src/modules/music/router/music.router.js +176 -0
- package/src/modules/notifications/components/elements/NotificationBadge.vue +5 -6
- package/src/modules/notifications/notifications.server.js +1 -3
- package/src/modules/orders/components/elements/FieldSubscribeNewsletter.vue +5 -0
- package/src/modules/orders/orders.server.js +0 -1
- package/src/modules/organizations/components/blocks/CardOrganization.vue +2 -2
- package/src/modules/organizations/components/pages/DepartmentEdit.vue +2 -2
- package/src/modules/organizations/components/pages/OrganizationEdit.vue +2 -2
- package/src/modules/organizations/policies/organizations.policies.js +12 -6
- package/src/modules/organizations/routes/organizations.routes.js +1 -3
- package/src/modules/products/components/blocks/CardCategory.vue +1 -1
- package/src/modules/products/components/blocks/CardProduct.vue +16 -2
- package/src/modules/products/components/pages/Categories.vue +9 -6
- package/src/modules/products/components/pages/CategoryEdit.vue +8 -4
- package/src/modules/products/components/pages/Product.vue +11 -5
- package/src/modules/products/components/sections/SectionProduct.vue +11 -7
- package/src/modules/products/controllers/categories.controller.js +32 -27
- package/src/modules/products/routes/categories.routes.js +1 -1
- package/src/modules/rents/controllers/routes/rents.routes.js +1 -1
- package/src/modules/rents/views/components/pages/RentsEdit.vue +208 -49
- package/src/modules/spots/components/pages/Map.vue +2 -2
- package/dist/abac-DYoheWuc.js +0 -1031
- package/dist/core.abac-DUPBnlk6.js +0 -298
- package/dist/core.logger-C3q8A9dl.js +0 -51
- package/dist/martyrs/src/components/EditImages/EditImages.vue.js.map +0 -1
- package/dist/martyrs/src/components/Menu/Menu.vue.js.map +0 -1
- package/dist/martyrs/src/components/Tab/Tab.vue.js.map +0 -1
- package/dist/martyrs/src/modules/auth/auth.router.js +0 -342
- package/dist/martyrs/src/modules/auth/auth.router.js.map +0 -1
- package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue.js.map +0 -1
- package/src/modules/auth/auth.router.js +0 -262
- package/src/modules/core/controllers/classes/abac/v2/abac-core-fixed.js +0 -313
- package/src/modules/core/controllers/classes/abac/v2/abac-express-fixed.js +0 -276
- package/src/modules/core/controllers/classes/abac/v2/abac-fields-fixed.js +0 -425
- package/src/modules/core/controllers/classes/abac/v2/abac-main-fixed.js +0 -295
- package/src/modules/core/controllers/classes/abac/v2/abac-policies-fixed.js +0 -316
- package/src/modules/core/controllers/classes/abac/v2/abac-ws-fixed.js +0 -237
- package/src/modules/core/controllers/classes/core.abac.js +0 -310
- package/src/modules/core/controllers/classes/core.crud.js +0 -89
- package/src/modules/governance/reactcode/eslint.config.js +0 -28
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.js","sources":["../../../../../../src/modules/core/locales/en.js"],"sourcesContent":["// @martyrs/src/modules/core/locales/en.js\nexport default {\n core: {\n errors: {\n USER_NOT_FOUND: 'Such user is not registered',\n USER_ALREADY_REGISTERED: 'Such user is already registered!',\n USER_NOT_REGISTERED_YET: 'This user has not been registered yet!',\n USER_PHONE_OR_PASSWORD_NOT_FOUND: 'User with such phone or password not found!',\n INCORRECT_PASSWORD_ENTERED: 'You entered an incorrect password!',\n INVALID_INVITATION_CODE: 'Incorrect invitation code.',\n MISSING_REQUIRED_PARAMETERS: 'Missing required parameters.',\n ERROR_UPDATING_USER: 'Something wrong when updating user.',\n PASSWORDS_DO_NOT_MATCH: 'The passwords you entered do not match. Please correct the errors and try again.',\n CODE_NOT_SENT: 'Something went wrong and the code was not sent. Please try again.',\n INPUT_ERROR: 'Please enter only a four-digit code.',\n WRONG_CODE: 'You entered an incorrect code. Please try again.',\n POST_URL_ALREADY_IN_USE: 'Failed! Blogpost with this URL is already in use!',\n NAME_CANNOT_BE_EMPTY: 'Error: Name cannot be empty. Please enter a name.',\n // File upload errors\n NO_FILES_UPLOADED: 'No files were uploaded.',\n FILE_PROCESSING_ERROR: 'Error processing files. Please try again.',\n FILES_TOO_LARGE: 'One or more files exceed the size limit.',\n FILES_WRONG_TYPE: 'One or more files have unsupported format.',\n FILES_SIZE_AND_TYPE_ERROR: 'Some files are too large and have unsupported format.',\n PREVIEW_GENERATION_ERROR: 'Error generating file previews.',\n IMAGE_CONVERSION_ERROR: 'Error converting image format.'\n }\n }\n};"],"names":[],"mappings":"AACA,MAAA,KAAe;AAAA,EACb,MAAM;AAAA,IACJ,QAAQ;AAAA,MACN,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,MACzB,kCAAkC;AAAA,MAClC,4BAA4B;AAAA,MAC5B,yBAAyB;AAAA,MACzB,6BAA6B;AAAA,MAC7B,qBAAqB;AAAA,MACrB,wBAAwB;AAAA,MACxB,eAAe;AAAA,MACf,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,yBAAyB;AAAA,MACzB,sBAAsB;AAAA;AAAA,MAEtB,mBAAmB;AAAA,MACnB,uBAAuB;AAAA,MACvB,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,2BAA2B;AAAA,MAC3B,0BAA0B;AAAA,MAC1B,wBAAwB;AAAA,IAC9B;AAAA,EACA;AACA;"}
|
|
1
|
+
{"version":3,"file":"en.js","sources":["../../../../../../src/modules/core/locales/en.js"],"sourcesContent":["// @martyrs/src/modules/core/locales/en.js\nexport default {\n core: {\n errors: {\n USER_NOT_FOUND: 'Such user is not registered',\n USER_ALREADY_REGISTERED: 'Such user is already registered!',\n USER_NOT_REGISTERED_YET: 'This user has not been registered yet!',\n USER_PHONE_OR_PASSWORD_NOT_FOUND: 'User with such phone or password not found!',\n INCORRECT_PASSWORD_ENTERED: 'You entered an incorrect password!',\n INVALID_INVITATION_CODE: 'Incorrect invitation code.',\n MISSING_REQUIRED_PARAMETERS: 'Missing required parameters.',\n ERROR_UPDATING_USER: 'Something wrong when updating user.',\n PASSWORDS_DO_NOT_MATCH: 'The passwords you entered do not match. Please correct the errors and try again.',\n CODE_NOT_SENT: 'Something went wrong and the code was not sent. Please try again.',\n INPUT_ERROR: 'Please enter only a four-digit code.',\n WRONG_CODE: 'You entered an incorrect code. Please try again.',\n POST_URL_ALREADY_IN_USE: 'Failed! Blogpost with this URL is already in use!',\n NAME_CANNOT_BE_EMPTY: 'Error: Name cannot be empty. Please enter a name.',\n // File upload errors\n NO_FILES_UPLOADED: 'No files were uploaded.',\n FILE_PROCESSING_ERROR: 'Error processing files. Please try again.',\n FILES_TOO_LARGE: 'One or more files exceed the size limit.',\n FILES_WRONG_TYPE: 'One or more files have unsupported format.',\n FILES_SIZE_AND_TYPE_ERROR: 'Some files are too large and have unsupported format.',\n PREVIEW_GENERATION_ERROR: 'Error generating file previews.',\n IMAGE_CONVERSION_ERROR: 'Error converting image format.'\n }\n },\n footer: {\n description: 'Get in touch with us',\n phoneNumber: '+1 234 567 890',\n emailAddress: \"info{'@'}example.com\",\n hours_text: 'Mon-Fri: 9:00 AM - 6:00 PM',\n app: 'Download our app',\n subscribe: 'Subscribe to our newsletter',\n subscribe_text: 'Stay updated with the latest news and updates',\n follow: 'Follow us',\n year: '2025',\n heart: '♥',\n copyright: 'All rights reserved',\n ozdao: 'Made by OZ DAO',\n navigationColumns: [\n {\n sections: [\n {\n title: 'Company',\n items: [\n { name: 'About', url: 'about' },\n { name: 'Careers', url: 'careers' },\n { name: 'Contact', url: 'contact' }\n ]\n }\n ]\n },\n {\n sections: [\n {\n title: 'Resources',\n items: [\n { name: 'Blog', url: 'blog' },\n { name: 'Help Center', url: 'help' },\n { name: 'Privacy', url: 'privacy' }\n ]\n }\n ]\n }\n ],\n socialLinks: [\n { name: 'IconInstagram', url: 'https://instagram.com' },\n { name: 'IconFacebook', url: 'https://facebook.com' },\n { name: 'IconLinkedin', url: 'https://linkedin.com' }\n ]\n }\n};"],"names":[],"mappings":"AACA,MAAA,KAAe;AAAA,EACb,MAAM;AAAA,IACJ,QAAQ;AAAA,MACN,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,MACzB,kCAAkC;AAAA,MAClC,4BAA4B;AAAA,MAC5B,yBAAyB;AAAA,MACzB,6BAA6B;AAAA,MAC7B,qBAAqB;AAAA,MACrB,wBAAwB;AAAA,MACxB,eAAe;AAAA,MACf,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,yBAAyB;AAAA,MACzB,sBAAsB;AAAA;AAAA,MAEtB,mBAAmB;AAAA,MACnB,uBAAuB;AAAA,MACvB,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,2BAA2B;AAAA,MAC3B,0BAA0B;AAAA,MAC1B,wBAAwB;AAAA,IAC9B;AAAA,EACA;AAAA,EACE,QAAQ;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,OAAO;AAAA,IACP,mBAAmB;AAAA,MACjB;AAAA,QACE,UAAU;AAAA,UACR;AAAA,YACE,OAAO;AAAA,YACP,OAAO;AAAA,cACL,EAAE,MAAM,SAAS,KAAK,QAAO;AAAA,cAC7B,EAAE,MAAM,WAAW,KAAK,UAAS;AAAA,cACjC,EAAE,MAAM,WAAW,KAAK,UAAS;AAAA,YAC/C;AAAA,UACA;AAAA,QACA;AAAA,MACA;AAAA,MACM;AAAA,QACE,UAAU;AAAA,UACR;AAAA,YACE,OAAO;AAAA,YACP,OAAO;AAAA,cACL,EAAE,MAAM,QAAQ,KAAK,OAAM;AAAA,cAC3B,EAAE,MAAM,eAAe,KAAK,OAAM;AAAA,cAClC,EAAE,MAAM,WAAW,KAAK,UAAS;AAAA,YAC/C;AAAA,UACA;AAAA,QACA;AAAA,MACA;AAAA,IACA;AAAA,IACI,aAAa;AAAA,MACX,EAAE,MAAM,iBAAiB,KAAK,wBAAuB;AAAA,MACrD,EAAE,MAAM,gBAAgB,KAAK,uBAAsB;AAAA,MACnD,EAAE,MAAM,gBAAgB,KAAK,uBAAsB;AAAA,IACzD;AAAA,EACA;AACA;"}
|
|
@@ -16,6 +16,51 @@ const ru = {
|
|
|
16
16
|
POST_URL_ALREADY_IN_USE: "Ошибка! Публикация с этим URL уже используется!",
|
|
17
17
|
NAME_CANNOT_BE_EMPTY: "Ошибка: Название не может быть пустым. Пожалуйста, введите название."
|
|
18
18
|
}
|
|
19
|
+
},
|
|
20
|
+
footer: {
|
|
21
|
+
description: "Свяжитесь с нами",
|
|
22
|
+
phoneNumber: "+1 234 567 890",
|
|
23
|
+
emailAddress: "info{'@'}example.com",
|
|
24
|
+
hours_text: "Пн-Пт: 9:00 - 18:00",
|
|
25
|
+
app: "Скачайте наше приложение",
|
|
26
|
+
subscribe: "Подпишитесь на рассылку",
|
|
27
|
+
subscribe_text: "Будьте в курсе последних новостей и обновлений",
|
|
28
|
+
follow: "Подписывайтесь",
|
|
29
|
+
year: "2025",
|
|
30
|
+
heart: "♥",
|
|
31
|
+
copyright: "Все права защищены",
|
|
32
|
+
ozdao: "Сделано OZ DAO",
|
|
33
|
+
navigationColumns: [
|
|
34
|
+
{
|
|
35
|
+
sections: [
|
|
36
|
+
{
|
|
37
|
+
title: "Компания",
|
|
38
|
+
items: [
|
|
39
|
+
{ name: "О нас", url: "about" },
|
|
40
|
+
{ name: "Карьера", url: "careers" },
|
|
41
|
+
{ name: "Контакты", url: "contact" }
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
sections: [
|
|
48
|
+
{
|
|
49
|
+
title: "Ресурсы",
|
|
50
|
+
items: [
|
|
51
|
+
{ name: "Блог", url: "blog" },
|
|
52
|
+
{ name: "Помощь", url: "help" },
|
|
53
|
+
{ name: "Конфиденциальность", url: "privacy" }
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
socialLinks: [
|
|
60
|
+
{ name: "IconInstagram", url: "https://instagram.com" },
|
|
61
|
+
{ name: "IconFacebook", url: "https://facebook.com" },
|
|
62
|
+
{ name: "IconLinkedin", url: "https://linkedin.com" }
|
|
63
|
+
]
|
|
19
64
|
}
|
|
20
65
|
};
|
|
21
66
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ru.js","sources":["../../../../../../src/modules/core/locales/ru.js"],"sourcesContent":["// @martyrs/src/modules/core/locales/ru.js\nexport default {\n core: {\n errors: {\n USER_NOT_FOUND: 'Такой пользователь не зарегистрирован!',\n USER_ALREADY_REGISTERED: 'Такой пользователь уже зарегистрирован!',\n USER_NOT_REGISTERED_YET: 'Такой пользователь еще не зарегистрирован!',\n USER_PHONE_OR_PASSWORD_NOT_FOUND: 'Пользователь с таким телефоном или паролем не найден!',\n INCORRECT_PASSWORD_ENTERED: 'Вы ввели неверный пароль!',\n INVALID_INVITATION_CODE: 'Неверный код приглашения',\n MISSING_REQUIRED_PARAMETERS: 'Отсутствуют необходимые параметры.',\n ERROR_UPDATING_USER: 'Произошла ошибка при обновлении пользователя.',\n PASSWORDS_DO_NOT_MATCH: 'Введенные вами пароли не совпадают. Исправьте ошибки и попробуйте еще раз.',\n CODE_NOT_SENT: 'Что-то пошло не так и код не был отправлен. Попробуйте еще раз.',\n INPUT_ERROR: 'Вставьте только четырехзначный код.',\n WRONG_CODE: 'Вы ввели неверный код. Попробуйте еще раз.',\n POST_URL_ALREADY_IN_USE: 'Ошибка! Публикация с этим URL уже используется!',\n NAME_CANNOT_BE_EMPTY: 'Ошибка: Название не может быть пустым. Пожалуйста, введите название.',\n }\n }\n};"],"names":[],"mappings":"AACA,MAAA,KAAe;AAAA,EACb,MAAM;AAAA,IACJ,QAAQ;AAAA,MACN,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,MACzB,kCAAkC;AAAA,MAClC,4BAA4B;AAAA,MAC5B,yBAAyB;AAAA,MACzB,6BAA6B;AAAA,MAC7B,qBAAqB;AAAA,MACrB,wBAAwB;AAAA,MACxB,eAAe;AAAA,MACf,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,yBAAyB;AAAA,MACzB,sBAAsB;AAAA,IAC5B;AAAA,EACA;AACA;"}
|
|
1
|
+
{"version":3,"file":"ru.js","sources":["../../../../../../src/modules/core/locales/ru.js"],"sourcesContent":["// @martyrs/src/modules/core/locales/ru.js\nexport default {\n core: {\n errors: {\n USER_NOT_FOUND: 'Такой пользователь не зарегистрирован!',\n USER_ALREADY_REGISTERED: 'Такой пользователь уже зарегистрирован!',\n USER_NOT_REGISTERED_YET: 'Такой пользователь еще не зарегистрирован!',\n USER_PHONE_OR_PASSWORD_NOT_FOUND: 'Пользователь с таким телефоном или паролем не найден!',\n INCORRECT_PASSWORD_ENTERED: 'Вы ввели неверный пароль!',\n INVALID_INVITATION_CODE: 'Неверный код приглашения',\n MISSING_REQUIRED_PARAMETERS: 'Отсутствуют необходимые параметры.',\n ERROR_UPDATING_USER: 'Произошла ошибка при обновлении пользователя.',\n PASSWORDS_DO_NOT_MATCH: 'Введенные вами пароли не совпадают. Исправьте ошибки и попробуйте еще раз.',\n CODE_NOT_SENT: 'Что-то пошло не так и код не был отправлен. Попробуйте еще раз.',\n INPUT_ERROR: 'Вставьте только четырехзначный код.',\n WRONG_CODE: 'Вы ввели неверный код. Попробуйте еще раз.',\n POST_URL_ALREADY_IN_USE: 'Ошибка! Публикация с этим URL уже используется!',\n NAME_CANNOT_BE_EMPTY: 'Ошибка: Название не может быть пустым. Пожалуйста, введите название.',\n }\n },\n footer: {\n description: 'Свяжитесь с нами',\n phoneNumber: '+1 234 567 890',\n emailAddress: \"info{'@'}example.com\",\n hours_text: 'Пн-Пт: 9:00 - 18:00',\n app: 'Скачайте наше приложение',\n subscribe: 'Подпишитесь на рассылку',\n subscribe_text: 'Будьте в курсе последних новостей и обновлений',\n follow: 'Подписывайтесь',\n year: '2025',\n heart: '♥',\n copyright: 'Все права защищены',\n ozdao: 'Сделано OZ DAO',\n navigationColumns: [\n {\n sections: [\n {\n title: 'Компания',\n items: [\n { name: 'О нас', url: 'about' },\n { name: 'Карьера', url: 'careers' },\n { name: 'Контакты', url: 'contact' }\n ]\n }\n ]\n },\n {\n sections: [\n {\n title: 'Ресурсы',\n items: [\n { name: 'Блог', url: 'blog' },\n { name: 'Помощь', url: 'help' },\n { name: 'Конфиденциальность', url: 'privacy' }\n ]\n }\n ]\n }\n ],\n socialLinks: [\n { name: 'IconInstagram', url: 'https://instagram.com' },\n { name: 'IconFacebook', url: 'https://facebook.com' },\n { name: 'IconLinkedin', url: 'https://linkedin.com' }\n ]\n }\n};"],"names":[],"mappings":"AACA,MAAA,KAAe;AAAA,EACb,MAAM;AAAA,IACJ,QAAQ;AAAA,MACN,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,MACzB,kCAAkC;AAAA,MAClC,4BAA4B;AAAA,MAC5B,yBAAyB;AAAA,MACzB,6BAA6B;AAAA,MAC7B,qBAAqB;AAAA,MACrB,wBAAwB;AAAA,MACxB,eAAe;AAAA,MACf,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,yBAAyB;AAAA,MACzB,sBAAsB;AAAA,IAC5B;AAAA,EACA;AAAA,EACE,QAAQ;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,OAAO;AAAA,IACP,mBAAmB;AAAA,MACjB;AAAA,QACE,UAAU;AAAA,UACR;AAAA,YACE,OAAO;AAAA,YACP,OAAO;AAAA,cACL,EAAE,MAAM,SAAS,KAAK,QAAO;AAAA,cAC7B,EAAE,MAAM,WAAW,KAAK,UAAS;AAAA,cACjC,EAAE,MAAM,YAAY,KAAK,UAAS;AAAA,YAChD;AAAA,UACA;AAAA,QACA;AAAA,MACA;AAAA,MACM;AAAA,QACE,UAAU;AAAA,UACR;AAAA,YACE,OAAO;AAAA,YACP,OAAO;AAAA,cACL,EAAE,MAAM,QAAQ,KAAK,OAAM;AAAA,cAC3B,EAAE,MAAM,UAAU,KAAK,OAAM;AAAA,cAC7B,EAAE,MAAM,sBAAsB,KAAK,UAAS;AAAA,YAC1D;AAAA,UACA;AAAA,QACA;AAAA,MACA;AAAA,IACA;AAAA,IACI,aAAa;AAAA,MACX,EAAE,MAAM,iBAAiB,KAAK,wBAAuB;AAAA,MACrD,EAAE,MAAM,gBAAgB,KAAK,uBAAsB;AAAA,MACnD,EAAE,MAAM,gBAAgB,KAAK,uBAAsB;AAAA,IACzD;AAAA,EACA;AACA;"}
|
|
@@ -4,12 +4,21 @@ class I18nManager {
|
|
|
4
4
|
this.moduleLocales = /* @__PURE__ */ new Map();
|
|
5
5
|
this.overrides = /* @__PURE__ */ new Map();
|
|
6
6
|
this.extensions = /* @__PURE__ */ new Map();
|
|
7
|
+
this.i18nInstance = null;
|
|
8
|
+
}
|
|
9
|
+
setI18nInstance(i18n) {
|
|
10
|
+
this.i18nInstance = i18n;
|
|
7
11
|
}
|
|
8
12
|
register(moduleName, locales) {
|
|
9
13
|
if (typeof moduleName !== "string" || !this.isValidLocales(locales)) {
|
|
10
14
|
throw new TypeError("Invalid arguments for register()");
|
|
11
15
|
}
|
|
12
16
|
this.moduleLocales.set(moduleName, locales);
|
|
17
|
+
if (this.i18nInstance) {
|
|
18
|
+
Object.entries(locales).forEach(([locale, messages]) => {
|
|
19
|
+
this.i18nInstance.global.mergeLocaleMessage(locale, messages);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
13
22
|
return this;
|
|
14
23
|
}
|
|
15
24
|
extend(moduleName, locales) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.manager.js","sources":["../../../../../../../src/modules/core/views/classes/i18n.manager.js"],"sourcesContent":["import merge from 'lodash.merge';\n\nclass I18nManager {\n constructor() {\n this.moduleLocales = new Map();\n this.overrides = new Map();\n this.extensions = new Map();\n }\n\n register(moduleName, locales) {\n if (typeof moduleName !== 'string' || !this.isValidLocales(locales)) {\n throw new TypeError('Invalid arguments for register()');\n }\n this.moduleLocales.set(moduleName, locales);\n return this;\n }\n\n extend(moduleName, locales) {\n if (!this.isValidLocales(locales)) throw new TypeError('Invalid locales for extend()');\n const existing = this.extensions.get(moduleName) || {};\n merge(existing, locales);\n this.extensions.set(moduleName, existing);\n return this;\n }\n\n override(moduleName, locales) {\n if (!this.isValidLocales(locales)) throw new TypeError('Invalid locales for override()');\n const existing = this.overrides.get(moduleName) || {};\n merge(existing, locales);\n this.overrides.set(moduleName, existing);\n return this;\n }\n\n getMessages(locale) {\n const result = {};\n\n for (const [, moduleLocales] of this.moduleLocales) {\n if (moduleLocales[locale]) {\n merge(result, moduleLocales[locale]);\n }\n }\n\n for (const [, ext] of this.extensions) {\n if (ext[locale]) {\n merge(result, ext[locale]);\n }\n }\n\n for (const [, override] of this.overrides) {\n if (override[locale]) {\n merge(result, override[locale]);\n }\n }\n\n return result;\n }\n\n getAllMessages() {\n const allLocales = new Set();\n\n for (const moduleLocales of this.moduleLocales.values()) {\n Object.keys(moduleLocales).forEach(locale => allLocales.add(locale));\n }\n\n const messages = {};\n\n for (const locale of allLocales) {\n messages[locale] = this.getMessages(locale);\n }\n\n return messages;\n }\n\n isValidLocales(obj) {\n return this.isObject(obj) && Object.values(obj).every(this.isObject);\n }\n\n isObject(item) {\n return item && typeof item === 'object' && !Array.isArray(item);\n }\n}\n\nexport const i18nManager = new I18nManager();\nexport default I18nManager;\n"],"names":[],"mappings":";AAEA,MAAM,YAAY;AAAA,EAChB,cAAc;AACZ,SAAK,gBAAgB,oBAAI,IAAG;AAC5B,SAAK,YAAY,oBAAI,IAAG;AACxB,SAAK,aAAa,oBAAI,IAAG;AAAA,
|
|
1
|
+
{"version":3,"file":"i18n.manager.js","sources":["../../../../../../../src/modules/core/views/classes/i18n.manager.js"],"sourcesContent":["import merge from 'lodash.merge';\n\nclass I18nManager {\n constructor() {\n this.moduleLocales = new Map();\n this.overrides = new Map();\n this.extensions = new Map();\n this.i18nInstance = null;\n }\n\n setI18nInstance(i18n) {\n this.i18nInstance = i18n;\n }\n\n register(moduleName, locales) {\n if (typeof moduleName !== 'string' || !this.isValidLocales(locales)) {\n throw new TypeError('Invalid arguments for register()');\n }\n this.moduleLocales.set(moduleName, locales);\n\n // Если i18n instance уже создан, добавляем переводы динамически\n if (this.i18nInstance) {\n Object.entries(locales).forEach(([locale, messages]) => {\n this.i18nInstance.global.mergeLocaleMessage(locale, messages);\n });\n }\n\n return this;\n }\n\n extend(moduleName, locales) {\n if (!this.isValidLocales(locales)) throw new TypeError('Invalid locales for extend()');\n const existing = this.extensions.get(moduleName) || {};\n merge(existing, locales);\n this.extensions.set(moduleName, existing);\n return this;\n }\n\n override(moduleName, locales) {\n if (!this.isValidLocales(locales)) throw new TypeError('Invalid locales for override()');\n const existing = this.overrides.get(moduleName) || {};\n merge(existing, locales);\n this.overrides.set(moduleName, existing);\n return this;\n }\n\n getMessages(locale) {\n const result = {};\n\n for (const [, moduleLocales] of this.moduleLocales) {\n if (moduleLocales[locale]) {\n merge(result, moduleLocales[locale]);\n }\n }\n\n for (const [, ext] of this.extensions) {\n if (ext[locale]) {\n merge(result, ext[locale]);\n }\n }\n\n for (const [, override] of this.overrides) {\n if (override[locale]) {\n merge(result, override[locale]);\n }\n }\n\n return result;\n }\n\n getAllMessages() {\n const allLocales = new Set();\n\n for (const moduleLocales of this.moduleLocales.values()) {\n Object.keys(moduleLocales).forEach(locale => allLocales.add(locale));\n }\n\n const messages = {};\n\n for (const locale of allLocales) {\n messages[locale] = this.getMessages(locale);\n }\n\n return messages;\n }\n\n isValidLocales(obj) {\n return this.isObject(obj) && Object.values(obj).every(this.isObject);\n }\n\n isObject(item) {\n return item && typeof item === 'object' && !Array.isArray(item);\n }\n}\n\nexport const i18nManager = new I18nManager();\nexport default I18nManager;\n"],"names":[],"mappings":";AAEA,MAAM,YAAY;AAAA,EAChB,cAAc;AACZ,SAAK,gBAAgB,oBAAI,IAAG;AAC5B,SAAK,YAAY,oBAAI,IAAG;AACxB,SAAK,aAAa,oBAAI,IAAG;AACzB,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,gBAAgB,MAAM;AACpB,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,SAAS,YAAY,SAAS;AAC5B,QAAI,OAAO,eAAe,YAAY,CAAC,KAAK,eAAe,OAAO,GAAG;AACnE,YAAM,IAAI,UAAU,kCAAkC;AAAA,IACxD;AACA,SAAK,cAAc,IAAI,YAAY,OAAO;AAG1C,QAAI,KAAK,cAAc;AACrB,aAAO,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,QAAQ,MAAM;AACtD,aAAK,aAAa,OAAO,mBAAmB,QAAQ,QAAQ;AAAA,MAC9D,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,YAAY,SAAS;AAC1B,QAAI,CAAC,KAAK,eAAe,OAAO,EAAG,OAAM,IAAI,UAAU,8BAA8B;AACrF,UAAM,WAAW,KAAK,WAAW,IAAI,UAAU,KAAK,CAAA;AACpD,UAAM,UAAU,OAAO;AACvB,SAAK,WAAW,IAAI,YAAY,QAAQ;AACxC,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,YAAY,SAAS;AAC5B,QAAI,CAAC,KAAK,eAAe,OAAO,EAAG,OAAM,IAAI,UAAU,gCAAgC;AACvF,UAAM,WAAW,KAAK,UAAU,IAAI,UAAU,KAAK,CAAA;AACnD,UAAM,UAAU,OAAO;AACvB,SAAK,UAAU,IAAI,YAAY,QAAQ;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,QAAQ;AAClB,UAAM,SAAS,CAAA;AAEf,eAAW,CAAA,EAAG,aAAa,KAAK,KAAK,eAAe;AAClD,UAAI,cAAc,MAAM,GAAG;AACzB,cAAM,QAAQ,cAAc,MAAM,CAAC;AAAA,MACrC;AAAA,IACF;AAEA,eAAW,CAAA,EAAG,GAAG,KAAK,KAAK,YAAY;AACrC,UAAI,IAAI,MAAM,GAAG;AACf,cAAM,QAAQ,IAAI,MAAM,CAAC;AAAA,MAC3B;AAAA,IACF;AAEA,eAAW,CAAA,EAAG,QAAQ,KAAK,KAAK,WAAW;AACzC,UAAI,SAAS,MAAM,GAAG;AACpB,cAAM,QAAQ,SAAS,MAAM,CAAC;AAAA,MAChC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,iBAAiB;AACf,UAAM,aAAa,oBAAI,IAAG;AAE1B,eAAW,iBAAiB,KAAK,cAAc,OAAM,GAAI;AACvD,aAAO,KAAK,aAAa,EAAE,QAAQ,YAAU,WAAW,IAAI,MAAM,CAAC;AAAA,IACrE;AAEA,UAAM,WAAW,CAAA;AAEjB,eAAW,UAAU,YAAY;AAC/B,eAAS,MAAM,IAAI,KAAK,YAAY,MAAM;AAAA,IAC5C;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,KAAK;AAClB,WAAO,KAAK,SAAS,GAAG,KAAK,OAAO,OAAO,GAAG,EAAE,MAAM,KAAK,QAAQ;AAAA,EACrE;AAAA,EAEA,SAAS,MAAM;AACb,WAAO,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI;AAAA,EAChE;AACF;AAEY,MAAC,cAAc,IAAI,YAAW;"}
|
package/dist/martyrs/src/modules/core/views/components/sections/{Filters.vue.js → Filters.vue2.js}
RENAMED
|
@@ -10,7 +10,7 @@ import _sfc_main$2 from "../../../../icons/entities/IconCalendar.vue.js";
|
|
|
10
10
|
import _export_sfc from "../../../../../../../_virtual/_plugin-vue_export-helper.js";
|
|
11
11
|
import _sfc_main$6 from "./filters/FilterOptions.vue.js";
|
|
12
12
|
import _sfc_main$1 from "../../../../icons/navigation/IconFilter.vue.js";
|
|
13
|
-
/* empty css
|
|
13
|
+
/* empty css */
|
|
14
14
|
const _hoisted_1 = { class: "flex o-x-scroll scroll-hide t-nowrap gap-thin" };
|
|
15
15
|
const _hoisted_2 = { key: 0 };
|
|
16
16
|
const _hoisted_3 = ["onClick"];
|
|
@@ -270,4 +270,4 @@ const Filters = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-2c
|
|
|
270
270
|
export {
|
|
271
271
|
Filters as default
|
|
272
272
|
};
|
|
273
|
-
//# sourceMappingURL=Filters.
|
|
273
|
+
//# sourceMappingURL=Filters.vue2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Filters.vue2.js","sources":["../../../../../../../../src/modules/core/views/components/sections/Filters.vue"],"sourcesContent":["<template>\n <div class=\"flex o-x-scroll scroll-hide t-nowrap gap-thin\">\n <!-- All Filters Button -->\n <button\n @click=\"showAllFilters = true\"\n class=\"pd-small radius-medium bg-light flex-v-center flex gap-micro cursor-pointer\"\n :class=\"{ 'bg-main': activeFiltersCount > 0 }\"\n >\n <IconFilter class=\"i-regular\" />\n <span class=\"h-1r\"></span>\n <span v-if=\"activeFiltersCount\">{{ activeFiltersCount }}</span>\n </button>\n\n <!-- Individual Filter Buttons -->\n <button\n v-for=\"filter in filters\"\n :key=\"filter.value\"\n @click=\"openFilter(filter.value)\"\n class=\"pd-small radius-medium bg-light cursor-pointer flex-v-center flex gap-micro\"\n :class=\"{ 'selected bg-main': isFilterActive(filter) }\"\n >\n <IconCalendar v-if=\"filter.type === 'date'\" class=\"mn-r-micro i-regular\" />\n <span class=\"t-nowrap\">{{ filter.type === 'date' && getFilterValue(filter) ? formatFilterValue(filter) : filter.title }}</span>\n <span v-if=\"getFilterValue(filter) && filter.type !== 'date'\" class=\"mn-l-micro\">\n {{ formatFilterValue(filter) }}\n </span>\n </button>\n\n <!-- All Filters Popup -->\n <Popup\n :isPopupOpen=\"showAllFilters\"\n @close-popup=\"closeAllFilters\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"w-min-20r bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <FiltersGroup\n :filters=\"filters\"\n v-model:selected=\"tempSelected\"\n :immediate=\"false\"\n :showHeader=\"true\"\n :showApplyButton=\"true\"\n :showResetButton=\"true\"\n @update:selected=\"applyAllFilters\"\n />\n </Popup>\n\n <!-- Individual Filter Popups -->\n <Popup\n v-for=\"filter in filters\"\n :key=\"`popup-${filter.value}`\"\n :isPopupOpen=\"individualPopups[filter.value]\"\n @close-popup=\"cancelFilter(filter.value)\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <h4 class=\"mn-b-medium\">{{ filter.title }}</h4>\n\n <!-- Checkbox Filter -->\n <FilterCheckbox\n v-if=\"filter.type === 'checkbox'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <!-- Range Filter -->\n <FilterRange\n v-else-if=\"filter.type === 'range'\"\n v-model=\"tempSelected[filter.value]\"\n :minPlaceholder=\"filter.minPlaceholder || 'Min'\"\n :maxPlaceholder=\"filter.maxPlaceholder || 'Max'\"\n :label=\"filter.label\"\n />\n\n <!-- Date Filter -->\n <div v-else-if=\"filter.type === 'date'\">\n <div class=\"mn-t-small\">\n <Calendar\n v-model:date=\"tempSelected[filter.value]\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"bg-light radius-small\"\n />\n </div>\n </div>\n\n <!-- Radio/Options Filter -->\n <FilterOptions\n v-else-if=\"filter.type === 'radio'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <div class=\"flex gap-thin mn-t-medium\">\n <button\n @click=\"cancelFilter(filter.value)\"\n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n <button\n @click=\"applyFilter(filter.value)\"\n class=\"bg-main w-100 button flex-child-full\"\n >\n Apply\n </button>\n </div>\n </Popup>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, reactive, watch } from 'vue'\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport FiltersGroup from './filters/FiltersGroup.vue'\nimport FilterCheckbox from './filters/FilterCheckbox.vue'\nimport FilterRange from './filters/FilterRange.vue'\nimport FilterDateRange from './filters/FilterDateRange.vue'\nimport FilterOptions from './filters/FilterOptions.vue'\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue'\nimport IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\nconst filters = defineModel('filters', {\n type: Array,\n required: true\n})\n\nconst selected = defineModel('selected', {\n type: Object,\n default: () => ({})\n})\n\nconst emit = defineEmits(['select'])\n\nconst { formatDate, returnCurrency } = useGlobalMixins()\n\n// State\nconst showAllFilters = ref(false)\nconst individualPopups = reactive({})\nconst tempSelected = reactive({})\nconst tempDateRange = ref(null)\n\n// Initialize popups and temp values\nwatch(filters, (newFilters) => {\n newFilters.forEach(filter => {\n individualPopups[filter.value] = false\n \n if (!tempSelected[filter.value]) {\n if (filter.type === 'checkbox') {\n tempSelected[filter.value] = [...(selected.value[filter.value] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filter.value] = { ...(selected.value[filter.value] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filter.value] = selected.value[filter.value] || null\n } else {\n tempSelected[filter.value] = selected.value[filter.value] || null\n }\n }\n })\n}, { immediate: true, deep: true })\n\n// Sync selected to tempSelected\nwatch(selected, (newSelected) => {\n Object.keys(newSelected).forEach(key => {\n const filter = filters.value.find(f => f.value === key)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[key] = [...(newSelected[key] || [])]\n } else if (filter.type === 'range') {\n tempSelected[key] = { ...(newSelected[key] || { min: '', max: '' }) }\n } else {\n tempSelected[key] = newSelected[key]\n }\n }\n })\n}, { deep: true })\n\n// Computed\nconst activeFiltersCount = computed(() => {\n return Object.entries(selected.value).filter(([key, value]) => {\n if (Array.isArray(value)) return value.length > 0\n if (typeof value === 'object' && value !== null) {\n return value.min || value.max\n }\n return value !== null && value !== undefined\n }).length\n})\n\n// Methods\nconst openFilter = (filterValue) => {\n individualPopups[filterValue] = true\n}\n\nconst isFilterActive = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n if (Array.isArray(value)) return value.length > 0\n if (filter.type === 'range') return value.min || value.max\n return true\n}\n\nconst getFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n \n if (filter.type === 'range') {\n return value.min || value.max\n }\n \n if (filter.type === 'date') {\n return value && value.start && value.end\n }\n \n if (Array.isArray(value)) {\n return value.length > 0\n }\n \n return value\n}\n\nconst formatFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return ''\n \n if (Array.isArray(value)) {\n return `(${value.length})`\n }\n \n if (filter.type === 'range') {\n if (!value.min && !value.max) return ''\n return `${value.min || '0'}-${value.max || '∞'}`\n }\n \n if (filter.type === 'date') {\n if (!value || !value.start || !value.end) return ''\n return `${formatDate(value.start, { dayMonth: true, language: 'en' })} - ${formatDate(value.end, { dayMonth: true, language: 'en' })}`\n }\n \n if (filter.type === 'radio') {\n const option = filter.options.find(o => o.value === value)\n return option ? `(${option.label})` : ''\n }\n \n return ''\n}\n\nconst applyFilter = (filterValue) => {\n selected.value[filterValue] = tempSelected[filterValue]\n individualPopups[filterValue] = false\n emit('select', { filter: filterValue, value: tempSelected[filterValue] })\n}\n\nconst cancelFilter = (filterValue) => {\n const filter = filters.value.find(f => f.value === filterValue)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[filterValue] = [...(selected.value[filterValue] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filterValue] = { ...(selected.value[filterValue] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filterValue] = selected.value[filterValue] || null\n } else {\n tempSelected[filterValue] = selected.value[filterValue] || null\n }\n }\n individualPopups[filterValue] = false\n}\n\nconst applyAllFilters = (newValues) => {\n Object.entries(newValues).forEach(([key, value]) => {\n if (selected.value[key] !== value) {\n selected.value[key] = value\n emit('select', { filter: key, value })\n }\n })\n showAllFilters.value = false\n}\n\nconst closeAllFilters = () => {\n showAllFilters.value = false\n}\n</script>\n\n<style scoped>\n.filters-content {\n max-height: 60vh;\n overflow-y: auto;\n}\n</style>"],"names":["_useModel"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { resolveComponent, createElementBlock, openBlock, createElementVNode, createBlock, createCommentVNode, toDisplayString, Fragment, renderList, normalizeClass, withCtx, createTextVNode } from "vue";
|
|
2
|
-
import _sfc_main$1 from "../../../../../components/Tab/Tab.
|
|
2
|
+
import _sfc_main$1 from "../../../../../components/Tab/Tab.vue2.js";
|
|
3
3
|
const _hoisted_1 = { class: "flex-v-center flex-nowrap flex" };
|
|
4
4
|
const _hoisted_2 = { class: "h2 mn-r-auto" };
|
|
5
5
|
const _hoisted_3 = ["onClick"];
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { useStore } from "../store/core.store.js";
|
|
2
|
-
import { inject } from "vue";
|
|
3
2
|
function useGlobalMixins() {
|
|
4
3
|
const isModuleInstalled = (moduleName) => {
|
|
5
|
-
const store =
|
|
4
|
+
const store = useStore();
|
|
6
5
|
const options = store.core.state.options;
|
|
7
6
|
if (options && typeof options === "object") {
|
|
8
7
|
return Object.prototype.hasOwnProperty.call(options, moduleName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mixins.js","sources":["../../../../../../../src/modules/core/views/mixins/mixins.js"],"sourcesContent":["import { useStore } from '@martyrs/src/modules/core/views/store/core.store.js';\nimport { inject } from 'vue';\n\n// useGlobalMixins.js\nexport function useGlobalMixins() {\n const isModuleInstalled = (moduleName) => {\n const store = inject('store');\n const options = store.core.state.options;\n\n if (options && typeof options === 'object') {\n return Object.prototype.hasOwnProperty.call(options, moduleName);\n }\n\n return false;\n };\n const isAdmin = roles => {\n if (roles) {\n const isAdmin = roles.includes('ROLE_ADMIN') ? roles.includes('ROLE_ADMIN') : false;\n\n if (isAdmin !== true) {\n return false;\n }\n\n return true;\n } else {\n return false;\n }\n };\n\n const hasAccess = (organizationId, rightCategory = null, rightType = null, accesses, roles) => {\n // Если пользователь админ, то сразу даем доступ\n if (isAdmin(roles)) {\n return true;\n }\n\n const accessArray = accesses;\n\n // Проверяем существование записи для организации\n const organizationAccess = accessArray.find(access => access.organization === organizationId);\n\n // Если переданы только organizationId и accesses - проверяем только членство\n if (rightCategory === null && rightType === null) {\n return Boolean(organizationAccess); // если организация найдена - значит член\n }\n\n // Для проверки прав сначала проверяем существование организации\n if (!organizationAccess) {\n return false;\n }\n\n const categoryAccess = organizationAccess.rights[rightCategory];\n if (!categoryAccess) {\n return false;\n }\n return categoryAccess[rightType] === true;\n };\n\n const returnCurrency = () => {\n const store = useStore();\n const currency = store.core.state.options?.currency || '$';\n return currency;\n };\n\n const formatPrice = number => {\n try {\n if (number == null) {\n throw new TypeError('formatPrice: ожидается число, но получено null или undefined');\n }\n\n const currency = returnCurrency();\n const absNumber = Math.abs(number)\n .toFixed(2)\n .replace('.', ',')\n .replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n\n const sign = number < 0 ? '-' : '';\n return `${sign} ${currency}${absNumber}`;\n } catch (err) {\n console.error(err);\n return 'null';\n }\n };\n \n const replaceClasses = (original = '', map = null) => {\n if (map == null && typeof original !== 'string') return '';\n if (typeof map === 'string') {\n const orig = typeof original === 'string' ? original.trim().split(/\\s+/) : [];\n const next = map.trim().split(/\\s+/);\n const replaceSet = new Set(next);\n const replaced = orig.map(cls => (replaceSet.has(cls) ? next.find(c => c !== cls) || cls : cls));\n const extra = next.filter(c => !orig.includes(c));\n return [...new Set([...replaced, ...extra])].join(' ');\n }\n\n if (typeof map === 'object' && map !== null) {\n const orig = typeof original === 'string' ? original.trim().split(/\\s+/) : [];\n return orig.map(cls => map[cls] ?? cls).join(' ');\n }\n\n return typeof original === 'string' ? original.trim() : '';\n };\n \n\n const formatDate = (d, options = {}) => {\n var fixedDate = new Date(d);\n\n // Определяем параметры локализации\n const formatOptions = {\n year: 'numeric',\n month: 'long', // название месяца\n day: '2-digit', // день с ведущим нулем\n hour: '2-digit', // часы с ведущим нулем\n minute: '2-digit', // минуты с ведущим нулем\n hour12: false, // 24-часовой формат времени\n ...options, // дополнительные настройки\n };\n\n // Язык, по умолчанию \"ru\" (русский)\n const locale = options.language || 'ru';\n\n // Используем Intl.DateTimeFormat для локализации\n const dateFormatter = new Intl.DateTimeFormat(locale, formatOptions);\n\n var format = {\n dateOnly: options.dateOnly || false,\n timeOnly: options.timeOnly || false,\n dayMonth: options.dayMonth || false,\n dayTime: options.dayTime || false,\n monthYear: options.monthYear || false,\n yearOnly: options.yearOnly || false,\n custom: options.custom || '',\n monthName: options.monthName || false, // Новый параметр для вывода названия месяца\n language: options.language || 'ru', // Язык, по умолчанию русский\n };\n\n if (format.dateOnly) {\n return dateFormatter.format(fixedDate).split(',')[0]; // Выводим только дату\n } else if (format.timeOnly) {\n return new Intl.DateTimeFormat(locale, {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n }).format(fixedDate); // Выводим только время\n } else if (format.dayMonth) {\n return new Intl.DateTimeFormat(locale, { day: '2-digit', month: 'short' }).format(fixedDate); // день и месяц\n } else if (format.dayTime) {\n return new Intl.DateTimeFormat(locale, {\n day: '2-digit',\n month: 'short',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n }).format(fixedDate); // день и время\n } else if (format.monthYear) {\n return new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' }).format(fixedDate); // месяц и год\n } else if (format.yearOnly) {\n return new Intl.DateTimeFormat(locale, { year: 'numeric' }).format(fixedDate); // только год\n } else if (format.custom) {\n // Для пользовательского формата с подстановкой\n return format.custom\n .replace('yyyy', fixedDate.getFullYear())\n .replace('mm', ('0' + (fixedDate.getMonth() + 1)).slice(-2)) // добавление ведущего нуля\n .replace('dd', ('0' + fixedDate.getDate()).slice(-2)) // добавление ведущего нуля\n .replace('hh', ('0' + fixedDate.getHours()).slice(-2)) // добавление ведущего нуля\n .replace('min', ('0' + fixedDate.getMinutes()).slice(-2)); // добавление ведущего нуля\n }\n\n // Вернуть полную дату в стандартном формате\n return dateFormatter.format(fixedDate);\n };\n\n const formateText = (text, maxLength = 16) => {\n // Return empty string if text is undefined or null\n if (!text) return '';\n\n // If text is shorter than or equal to maxLength, return it as is\n if (text.length <= maxLength) {\n return text;\n }\n\n // Otherwise truncate and add ellipsis\n return text.substring(0, maxLength) + '...';\n };\n\n const normalizeUrlParam = param => {\n if (!param) param = '';\n\n return param\n .toLowerCase()\n .replace(/ /g, '-')\n .replace(/[^a-z0-9-]/g, '');\n };\n\n const joinArrayToUrl = arr => {\n return arr.join('/');\n };\n\n function generateFilters(selectedFilters) {\n const filters = [];\n\n // Process all selected filters\n for (const [key, values] of Object.entries(selectedFilters)) {\n if (values && values.length > 0) {\n // Skip special filters (these are handled separately)\n if (key !== 'prices' && key !== 'delivery' && key !== 'categories') {\n filters.push({\n parameter: key,\n caseSensitive: false,\n values: Array.isArray(values) ? values : [values],\n });\n }\n }\n }\n\n return filters.length > 0 ? JSON.stringify(filters) : undefined;\n }\n\n const getMarketplaceLink = (categories, country, state, city) => {\n let country_normalized = country ? normalizeUrlParam(country) : '';\n let state_normalized = state ? normalizeUrlParam(state) : '';\n let city_normalized = city ? normalizeUrlParam(city) : '';\n\n let base = '/marketplace';\n base += country_normalized ? `/${country_normalized}` : '';\n base += country_normalized && state_normalized ? `/${state_normalized}` : '';\n base += country_normalized && state_normalized && city_normalized ? `/${city_normalized}` : '';\n\n if (categories && categories.length) {\n base += `?categories=${categories.join(',')}`;\n }\n\n return base;\n };\n\n const getSpotsLink = (country, state, city) => {\n let country_normalized = country ? normalizeUrlParam(country) : '';\n let state_normalized = state ? normalizeUrlParam(state) : '';\n let city_normalized = city ? normalizeUrlParam(city) : '';\n\n let base = '/spots';\n base += country_normalized ? `/${country_normalized}` : '';\n base += country_normalized && state_normalized ? `/${state_normalized}` : '';\n base += country_normalized && state_normalized && city_normalized ? `/${city_normalized}` : '';\n\n return base;\n };\n\n const isClientSide = typeof window !== 'undefined' && typeof document !== 'undefined';\n\n const getCssVar = name => {\n if (!isClientSide) return ''; // SSR fallback\n return getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n };\n\n const matchMediaSafe = query => {\n if (!isClientSide) return { matches: false };\n return window.matchMedia(query);\n };\n\n const isMediaMax = varName => {\n const maxWidth = getCssVar(varName);\n return matchMediaSafe(`(max-width: ${maxWidth})`).matches;\n };\n\n const isMediaMin = varName => {\n const minWidth = getCssVar(varName);\n return matchMediaSafe(`(min-width: ${minWidth})`).matches;\n };\n\n const isFlipPhone = () => isMediaMax('--flip-phone-max');\n const isPhone = () => isMediaMax('--phone-landscape-max');\n\n const isTabletPortrait = () => {\n const min = getCssVar('--tablet-portrait-min');\n const max = getCssVar('--tablet-portrait-max');\n return matchMediaSafe(`(min-width: ${min}) and (max-width: ${max})`).matches;\n };\n\n const isTabletLandscape = () => {\n const min = getCssVar('--tablet-landscape-min');\n const max = getCssVar('--tablet-landscape-max');\n return matchMediaSafe(`(min-width: ${min}) and (max-width: ${max})`).matches;\n };\n\n const isTablet = () => isTabletPortrait() || isTabletLandscape();\n\n const isDesktop = () => {\n const min = getCssVar('--desktop-min');\n const max = getCssVar('--desktop-max');\n return matchMediaSafe(`(min-width: ${min}) and (max-width: ${max})`).matches;\n };\n\n const isXLDesktop = () => {\n const min = getCssVar('--xl-desktop-min');\n const max = getCssVar('--xl-desktop-max');\n return matchMediaSafe(`(min-width: ${min}) and (max-width: ${max})`).matches;\n };\n\n const isXXLDesktop = () => isMediaMin('--xxl-desktop-min');\n\n return {\n isModuleInstalled,\n isAdmin,\n hasAccess,\n returnCurrency,\n formatPrice,\n formatDate,\n formateText,\n replaceClasses,\n normalizeUrlParam,\n joinArrayToUrl,\n getMarketplaceLink,\n getSpotsLink,\n generateFilters,\n // Брейкпоинты\n getCssVar,\n isMediaMax,\n isMediaMin,\n isFlipPhone,\n isPhone,\n isTabletPortrait,\n isTabletLandscape,\n isTablet,\n isDesktop,\n isXLDesktop,\n isXXLDesktop,\n };\n}\n\n// Экспорт для глобальной регистрации\nexport const globalMixins = {\n methods: useGlobalMixins(),\n};\n"],"names":["isAdmin"],"mappings":";;AAIO,SAAS,kBAAkB;AAChC,QAAM,oBAAoB,CAAC,eAAe;AACxC,UAAM,QAAQ,OAAO,OAAO;AAC5B,UAAM,UAAU,MAAM,KAAK,MAAM;AAEjC,QAAI,WAAW,OAAO,YAAY,UAAU;AAC1C,aAAO,OAAO,UAAU,eAAe,KAAK,SAAS,UAAU;AAAA,IACjE;AAEA,WAAO;AAAA,EACT;AACA,QAAM,UAAU,WAAS;AACvB,QAAI,OAAO;AACT,YAAMA,WAAU,MAAM,SAAS,YAAY,IAAI,MAAM,SAAS,YAAY,IAAI;AAE9E,UAAIA,aAAY,MAAM;AACpB,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,YAAY,CAAC,gBAAgB,gBAAgB,MAAM,YAAY,MAAM,UAAU,UAAU;AAE7F,QAAI,QAAQ,KAAK,GAAG;AAClB,aAAO;AAAA,IACT;AAEA,UAAM,cAAc;AAGpB,UAAM,qBAAqB,YAAY,KAAK,YAAU,OAAO,iBAAiB,cAAc;AAG5F,QAAI,kBAAkB,QAAQ,cAAc,MAAM;AAChD,aAAO,QAAQ,kBAAkB;AAAA,IACnC;AAGA,QAAI,CAAC,oBAAoB;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,mBAAmB,OAAO,aAAa;AAC9D,QAAI,CAAC,gBAAgB;AACnB,aAAO;AAAA,IACT;AACA,WAAO,eAAe,SAAS,MAAM;AAAA,EACvC;AAEA,QAAM,iBAAiB,MAAM;AAC3B,UAAM,QAAQ,SAAQ;AACtB,UAAM,WAAW,MAAM,KAAK,MAAM,SAAS,YAAY;AACvD,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,YAAU;AAC5B,QAAI;AACF,UAAI,UAAU,MAAM;AAClB,cAAM,IAAI,UAAU,8DAA8D;AAAA,MACpF;AAEA,YAAM,WAAW,eAAc;AAC/B,YAAM,YAAY,KAAK,IAAI,MAAM,EAC9B,QAAQ,CAAC,EACT,QAAQ,KAAK,GAAG,EAChB,QAAQ,yBAAyB,GAAG;AAEvC,YAAM,OAAO,SAAS,IAAI,MAAM;AAChC,aAAO,GAAG,IAAI,IAAI,QAAQ,GAAG,SAAS;AAAA,IACxC,SAAS,KAAK;AACZ,cAAQ,MAAM,GAAG;AACjB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,iBAAiB,CAAC,WAAW,IAAI,MAAM,SAAS;AACpD,QAAI,OAAO,QAAQ,OAAO,aAAa,SAAU,QAAO;AACxD,QAAI,OAAO,QAAQ,UAAU;AAC3B,YAAM,OAAO,OAAO,aAAa,WAAW,SAAS,OAAO,MAAM,KAAK,IAAI,CAAA;AAC3E,YAAM,OAAO,IAAI,KAAI,EAAG,MAAM,KAAK;AACnC,YAAM,aAAa,IAAI,IAAI,IAAI;AAC/B,YAAM,WAAW,KAAK,IAAI,SAAQ,WAAW,IAAI,GAAG,IAAI,KAAK,KAAK,OAAK,MAAM,GAAG,KAAK,MAAM,GAAI;AAC/F,YAAM,QAAQ,KAAK,OAAO,OAAK,CAAC,KAAK,SAAS,CAAC,CAAC;AAChD,aAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,UAAU,GAAG,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG;AAAA,IACvD;AAEA,QAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAC3C,YAAM,OAAO,OAAO,aAAa,WAAW,SAAS,OAAO,MAAM,KAAK,IAAI,CAAA;AAC3E,aAAO,KAAK,IAAI,SAAO,IAAI,GAAG,KAAK,GAAG,EAAE,KAAK,GAAG;AAAA,IAClD;AAEA,WAAO,OAAO,aAAa,WAAW,SAAS,KAAI,IAAK;AAAA,EAC1D;AAGA,QAAM,aAAa,CAAC,GAAG,UAAU,CAAA,MAAO;AACtC,QAAI,YAAY,IAAI,KAAK,CAAC;AAG1B,UAAM,gBAAgB;AAAA,MACpB,MAAM;AAAA,MACN,OAAO;AAAA;AAAA,MACP,KAAK;AAAA;AAAA,MACL,MAAM;AAAA;AAAA,MACN,QAAQ;AAAA;AAAA,MACR,QAAQ;AAAA;AAAA,MACR,GAAG;AAAA;AAAA,IACT;AAGI,UAAM,SAAS,QAAQ,YAAY;AAGnC,UAAM,gBAAgB,IAAI,KAAK,eAAe,QAAQ,aAAa;AAEnE,QAAI,SAAS;AAAA,MACX,UAAU,QAAQ,YAAY;AAAA,MAC9B,UAAU,QAAQ,YAAY;AAAA,MAC9B,UAAU,QAAQ,YAAY;AAAA,MAC9B,SAAS,QAAQ,WAAW;AAAA,MAC5B,WAAW,QAAQ,aAAa;AAAA,MAChC,UAAU,QAAQ,YAAY;AAAA,MAC9B,QAAQ,QAAQ,UAAU;AAAA,MAC1B,WAAW,QAAQ,aAAa;AAAA;AAAA,MAChC,UAAU,QAAQ,YAAY;AAAA;AAAA,IACpC;AAEI,QAAI,OAAO,UAAU;AACnB,aAAO,cAAc,OAAO,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IACrD,WAAW,OAAO,UAAU;AAC1B,aAAO,IAAI,KAAK,eAAe,QAAQ;AAAA,QACrC,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ;AAAA,MAChB,CAAO,EAAE,OAAO,SAAS;AAAA,IACrB,WAAW,OAAO,UAAU;AAC1B,aAAO,IAAI,KAAK,eAAe,QAAQ,EAAE,KAAK,WAAW,OAAO,QAAO,CAAE,EAAE,OAAO,SAAS;AAAA,IAC7F,WAAW,OAAO,SAAS;AACzB,aAAO,IAAI,KAAK,eAAe,QAAQ;AAAA,QACrC,KAAK;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ;AAAA,MAChB,CAAO,EAAE,OAAO,SAAS;AAAA,IACrB,WAAW,OAAO,WAAW;AAC3B,aAAO,IAAI,KAAK,eAAe,QAAQ,EAAE,OAAO,QAAQ,MAAM,UAAS,CAAE,EAAE,OAAO,SAAS;AAAA,IAC7F,WAAW,OAAO,UAAU;AAC1B,aAAO,IAAI,KAAK,eAAe,QAAQ,EAAE,MAAM,WAAW,EAAE,OAAO,SAAS;AAAA,IAC9E,WAAW,OAAO,QAAQ;AAExB,aAAO,OAAO,OACX,QAAQ,QAAQ,UAAU,YAAW,CAAE,EACvC,QAAQ,OAAO,OAAO,UAAU,SAAQ,IAAK,IAAI,MAAM,EAAE,CAAC,EAC1D,QAAQ,OAAO,MAAM,UAAU,WAAW,MAAM,EAAE,CAAC,EACnD,QAAQ,OAAO,MAAM,UAAU,YAAY,MAAM,EAAE,CAAC,EACpD,QAAQ,QAAQ,MAAM,UAAU,cAAc,MAAM,EAAE,CAAC;AAAA,IAC5D;AAGA,WAAO,cAAc,OAAO,SAAS;AAAA,EACvC;AAEA,QAAM,cAAc,CAAC,MAAM,YAAY,OAAO;AAE5C,QAAI,CAAC,KAAM,QAAO;AAGlB,QAAI,KAAK,UAAU,WAAW;AAC5B,aAAO;AAAA,IACT;AAGA,WAAO,KAAK,UAAU,GAAG,SAAS,IAAI;AAAA,EACxC;AAEA,QAAM,oBAAoB,WAAS;AACjC,QAAI,CAAC,MAAO,SAAQ;AAEpB,WAAO,MACJ,YAAW,EACX,QAAQ,MAAM,GAAG,EACjB,QAAQ,eAAe,EAAE;AAAA,EAC9B;AAEA,QAAM,iBAAiB,SAAO;AAC5B,WAAO,IAAI,KAAK,GAAG;AAAA,EACrB;AAEA,WAAS,gBAAgB,iBAAiB;AACxC,UAAM,UAAU,CAAA;AAGhB,eAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,eAAe,GAAG;AAC3D,UAAI,UAAU,OAAO,SAAS,GAAG;AAE/B,YAAI,QAAQ,YAAY,QAAQ,cAAc,QAAQ,cAAc;AAClE,kBAAQ,KAAK;AAAA,YACX,WAAW;AAAA,YACX,eAAe;AAAA,YACf,QAAQ,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAAA,UAC5D,CAAW;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,WAAO,QAAQ,SAAS,IAAI,KAAK,UAAU,OAAO,IAAI;AAAA,EACxD;AAEA,QAAM,qBAAqB,CAAC,YAAY,SAAS,OAAO,SAAS;AAC/D,QAAI,qBAAqB,UAAU,kBAAkB,OAAO,IAAI;AAChE,QAAI,mBAAmB,QAAQ,kBAAkB,KAAK,IAAI;AAC1D,QAAI,kBAAkB,OAAO,kBAAkB,IAAI,IAAI;AAEvD,QAAI,OAAO;AACX,YAAQ,qBAAqB,IAAI,kBAAkB,KAAK;AACxD,YAAQ,sBAAsB,mBAAmB,IAAI,gBAAgB,KAAK;AAC1E,YAAQ,sBAAsB,oBAAoB,kBAAkB,IAAI,eAAe,KAAK;AAE5F,QAAI,cAAc,WAAW,QAAQ;AACnC,cAAQ,eAAe,WAAW,KAAK,GAAG,CAAC;AAAA,IAC7C;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,CAAC,SAAS,OAAO,SAAS;AAC7C,QAAI,qBAAqB,UAAU,kBAAkB,OAAO,IAAI;AAChE,QAAI,mBAAmB,QAAQ,kBAAkB,KAAK,IAAI;AAC1D,QAAI,kBAAkB,OAAO,kBAAkB,IAAI,IAAI;AAEvD,QAAI,OAAO;AACX,YAAQ,qBAAqB,IAAI,kBAAkB,KAAK;AACxD,YAAQ,sBAAsB,mBAAmB,IAAI,gBAAgB,KAAK;AAC1E,YAAQ,sBAAsB,oBAAoB,kBAAkB,IAAI,eAAe,KAAK;AAE5F,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,OAAO,WAAW,eAAe,OAAO,aAAa;AAE1E,QAAM,YAAY,UAAQ;AACxB,QAAI,CAAC,aAAc,QAAO;AAC1B,WAAO,iBAAiB,SAAS,eAAe,EAAE,iBAAiB,IAAI,EAAE,KAAI;AAAA,EAC/E;AAEA,QAAM,iBAAiB,WAAS;AAC9B,QAAI,CAAC,aAAc,QAAO,EAAE,SAAS,MAAK;AAC1C,WAAO,OAAO,WAAW,KAAK;AAAA,EAChC;AAEA,QAAM,aAAa,aAAW;AAC5B,UAAM,WAAW,UAAU,OAAO;AAClC,WAAO,eAAe,eAAe,QAAQ,GAAG,EAAE;AAAA,EACpD;AAEA,QAAM,aAAa,aAAW;AAC5B,UAAM,WAAW,UAAU,OAAO;AAClC,WAAO,eAAe,eAAe,QAAQ,GAAG,EAAE;AAAA,EACpD;AAEA,QAAM,cAAc,MAAM,WAAW,kBAAkB;AACvD,QAAM,UAAU,MAAM,WAAW,uBAAuB;AAExD,QAAM,mBAAmB,MAAM;AAC7B,UAAM,MAAM,UAAU,uBAAuB;AAC7C,UAAM,MAAM,UAAU,uBAAuB;AAC7C,WAAO,eAAe,eAAe,GAAG,qBAAqB,GAAG,GAAG,EAAE;AAAA,EACvE;AAEA,QAAM,oBAAoB,MAAM;AAC9B,UAAM,MAAM,UAAU,wBAAwB;AAC9C,UAAM,MAAM,UAAU,wBAAwB;AAC9C,WAAO,eAAe,eAAe,GAAG,qBAAqB,GAAG,GAAG,EAAE;AAAA,EACvE;AAEA,QAAM,WAAW,MAAM,iBAAgB,KAAM,kBAAiB;AAE9D,QAAM,YAAY,MAAM;AACtB,UAAM,MAAM,UAAU,eAAe;AACrC,UAAM,MAAM,UAAU,eAAe;AACrC,WAAO,eAAe,eAAe,GAAG,qBAAqB,GAAG,GAAG,EAAE;AAAA,EACvE;AAEA,QAAM,cAAc,MAAM;AACxB,UAAM,MAAM,UAAU,kBAAkB;AACxC,UAAM,MAAM,UAAU,kBAAkB;AACxC,WAAO,eAAe,eAAe,GAAG,qBAAqB,GAAG,GAAG,EAAE;AAAA,EACvE;AAEA,QAAM,eAAe,MAAM,WAAW,mBAAmB;AAEzD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA;AAGY,MAAC,eAAe;AAAA,EAC1B,SAAS,gBAAe;AAC1B;"}
|
|
1
|
+
{"version":3,"file":"mixins.js","sources":["../../../../../../../src/modules/core/views/mixins/mixins.js"],"sourcesContent":["import { useStore } from '@martyrs/src/modules/core/views/store/core.store.js';\n\n// useGlobalMixins.js\nexport function useGlobalMixins() {\n const isModuleInstalled = (moduleName) => {\n const store = useStore();\n const options = store.core.state.options;\n\n if (options && typeof options === 'object') {\n return Object.prototype.hasOwnProperty.call(options, moduleName);\n }\n\n return false;\n };\n const isAdmin = roles => {\n if (roles) {\n const isAdmin = roles.includes('ROLE_ADMIN') ? roles.includes('ROLE_ADMIN') : false;\n\n if (isAdmin !== true) {\n return false;\n }\n\n return true;\n } else {\n return false;\n }\n };\n\n const hasAccess = (organizationId, rightCategory = null, rightType = null, accesses, roles) => {\n // Если пользователь админ, то сразу даем доступ\n if (isAdmin(roles)) {\n return true;\n }\n\n const accessArray = accesses;\n\n // Проверяем существование записи для организации\n const organizationAccess = accessArray.find(access => access.organization === organizationId);\n\n // Если переданы только organizationId и accesses - проверяем только членство\n if (rightCategory === null && rightType === null) {\n return Boolean(organizationAccess); // если организация найдена - значит член\n }\n\n // Для проверки прав сначала проверяем существование организации\n if (!organizationAccess) {\n return false;\n }\n\n const categoryAccess = organizationAccess.rights[rightCategory];\n if (!categoryAccess) {\n return false;\n }\n return categoryAccess[rightType] === true;\n };\n\n const returnCurrency = () => {\n const store = useStore();\n const currency = store.core.state.options?.currency || '$';\n return currency;\n };\n\n const formatPrice = number => {\n try {\n if (number == null) {\n throw new TypeError('formatPrice: ожидается число, но получено null или undefined');\n }\n\n const currency = returnCurrency();\n const absNumber = Math.abs(number)\n .toFixed(2)\n .replace('.', ',')\n .replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n\n const sign = number < 0 ? '-' : '';\n return `${sign} ${currency}${absNumber}`;\n } catch (err) {\n console.error(err);\n return 'null';\n }\n };\n \n const replaceClasses = (original = '', map = null) => {\n if (map == null && typeof original !== 'string') return '';\n if (typeof map === 'string') {\n const orig = typeof original === 'string' ? original.trim().split(/\\s+/) : [];\n const next = map.trim().split(/\\s+/);\n const replaceSet = new Set(next);\n const replaced = orig.map(cls => (replaceSet.has(cls) ? next.find(c => c !== cls) || cls : cls));\n const extra = next.filter(c => !orig.includes(c));\n return [...new Set([...replaced, ...extra])].join(' ');\n }\n\n if (typeof map === 'object' && map !== null) {\n const orig = typeof original === 'string' ? original.trim().split(/\\s+/) : [];\n return orig.map(cls => map[cls] ?? cls).join(' ');\n }\n\n return typeof original === 'string' ? original.trim() : '';\n };\n \n\n const formatDate = (d, options = {}) => {\n var fixedDate = new Date(d);\n\n // Определяем параметры локализации\n const formatOptions = {\n year: 'numeric',\n month: 'long', // название месяца\n day: '2-digit', // день с ведущим нулем\n hour: '2-digit', // часы с ведущим нулем\n minute: '2-digit', // минуты с ведущим нулем\n hour12: false, // 24-часовой формат времени\n ...options, // дополнительные настройки\n };\n\n // Язык, по умолчанию \"ru\" (русский)\n const locale = options.language || 'ru';\n\n // Используем Intl.DateTimeFormat для локализации\n const dateFormatter = new Intl.DateTimeFormat(locale, formatOptions);\n\n var format = {\n dateOnly: options.dateOnly || false,\n timeOnly: options.timeOnly || false,\n dayMonth: options.dayMonth || false,\n dayTime: options.dayTime || false,\n monthYear: options.monthYear || false,\n yearOnly: options.yearOnly || false,\n custom: options.custom || '',\n monthName: options.monthName || false, // Новый параметр для вывода названия месяца\n language: options.language || 'ru', // Язык, по умолчанию русский\n };\n\n if (format.dateOnly) {\n return dateFormatter.format(fixedDate).split(',')[0]; // Выводим только дату\n } else if (format.timeOnly) {\n return new Intl.DateTimeFormat(locale, {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n }).format(fixedDate); // Выводим только время\n } else if (format.dayMonth) {\n return new Intl.DateTimeFormat(locale, { day: '2-digit', month: 'short' }).format(fixedDate); // день и месяц\n } else if (format.dayTime) {\n return new Intl.DateTimeFormat(locale, {\n day: '2-digit',\n month: 'short',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n }).format(fixedDate); // день и время\n } else if (format.monthYear) {\n return new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' }).format(fixedDate); // месяц и год\n } else if (format.yearOnly) {\n return new Intl.DateTimeFormat(locale, { year: 'numeric' }).format(fixedDate); // только год\n } else if (format.custom) {\n // Для пользовательского формата с подстановкой\n return format.custom\n .replace('yyyy', fixedDate.getFullYear())\n .replace('mm', ('0' + (fixedDate.getMonth() + 1)).slice(-2)) // добавление ведущего нуля\n .replace('dd', ('0' + fixedDate.getDate()).slice(-2)) // добавление ведущего нуля\n .replace('hh', ('0' + fixedDate.getHours()).slice(-2)) // добавление ведущего нуля\n .replace('min', ('0' + fixedDate.getMinutes()).slice(-2)); // добавление ведущего нуля\n }\n\n // Вернуть полную дату в стандартном формате\n return dateFormatter.format(fixedDate);\n };\n\n const formateText = (text, maxLength = 16) => {\n // Return empty string if text is undefined or null\n if (!text) return '';\n\n // If text is shorter than or equal to maxLength, return it as is\n if (text.length <= maxLength) {\n return text;\n }\n\n // Otherwise truncate and add ellipsis\n return text.substring(0, maxLength) + '...';\n };\n\n const normalizeUrlParam = param => {\n if (!param) param = '';\n\n return param\n .toLowerCase()\n .replace(/ /g, '-')\n .replace(/[^a-z0-9-]/g, '');\n };\n\n const joinArrayToUrl = arr => {\n return arr.join('/');\n };\n\n function generateFilters(selectedFilters) {\n const filters = [];\n\n // Process all selected filters\n for (const [key, values] of Object.entries(selectedFilters)) {\n if (values && values.length > 0) {\n // Skip special filters (these are handled separately)\n if (key !== 'prices' && key !== 'delivery' && key !== 'categories') {\n filters.push({\n parameter: key,\n caseSensitive: false,\n values: Array.isArray(values) ? values : [values],\n });\n }\n }\n }\n\n return filters.length > 0 ? JSON.stringify(filters) : undefined;\n }\n\n const getMarketplaceLink = (categories, country, state, city) => {\n let country_normalized = country ? normalizeUrlParam(country) : '';\n let state_normalized = state ? normalizeUrlParam(state) : '';\n let city_normalized = city ? normalizeUrlParam(city) : '';\n\n let base = '/marketplace';\n base += country_normalized ? `/${country_normalized}` : '';\n base += country_normalized && state_normalized ? `/${state_normalized}` : '';\n base += country_normalized && state_normalized && city_normalized ? `/${city_normalized}` : '';\n\n if (categories && categories.length) {\n base += `?categories=${categories.join(',')}`;\n }\n\n return base;\n };\n\n const getSpotsLink = (country, state, city) => {\n let country_normalized = country ? normalizeUrlParam(country) : '';\n let state_normalized = state ? normalizeUrlParam(state) : '';\n let city_normalized = city ? normalizeUrlParam(city) : '';\n\n let base = '/spots';\n base += country_normalized ? `/${country_normalized}` : '';\n base += country_normalized && state_normalized ? `/${state_normalized}` : '';\n base += country_normalized && state_normalized && city_normalized ? `/${city_normalized}` : '';\n\n return base;\n };\n\n const isClientSide = typeof window !== 'undefined' && typeof document !== 'undefined';\n\n const getCssVar = name => {\n if (!isClientSide) return ''; // SSR fallback\n return getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n };\n\n const matchMediaSafe = query => {\n if (!isClientSide) return { matches: false };\n return window.matchMedia(query);\n };\n\n const isMediaMax = varName => {\n const maxWidth = getCssVar(varName);\n return matchMediaSafe(`(max-width: ${maxWidth})`).matches;\n };\n\n const isMediaMin = varName => {\n const minWidth = getCssVar(varName);\n return matchMediaSafe(`(min-width: ${minWidth})`).matches;\n };\n\n const isFlipPhone = () => isMediaMax('--flip-phone-max');\n const isPhone = () => isMediaMax('--phone-landscape-max');\n\n const isTabletPortrait = () => {\n const min = getCssVar('--tablet-portrait-min');\n const max = getCssVar('--tablet-portrait-max');\n return matchMediaSafe(`(min-width: ${min}) and (max-width: ${max})`).matches;\n };\n\n const isTabletLandscape = () => {\n const min = getCssVar('--tablet-landscape-min');\n const max = getCssVar('--tablet-landscape-max');\n return matchMediaSafe(`(min-width: ${min}) and (max-width: ${max})`).matches;\n };\n\n const isTablet = () => isTabletPortrait() || isTabletLandscape();\n\n const isDesktop = () => {\n const min = getCssVar('--desktop-min');\n const max = getCssVar('--desktop-max');\n return matchMediaSafe(`(min-width: ${min}) and (max-width: ${max})`).matches;\n };\n\n const isXLDesktop = () => {\n const min = getCssVar('--xl-desktop-min');\n const max = getCssVar('--xl-desktop-max');\n return matchMediaSafe(`(min-width: ${min}) and (max-width: ${max})`).matches;\n };\n\n const isXXLDesktop = () => isMediaMin('--xxl-desktop-min');\n\n return {\n isModuleInstalled,\n isAdmin,\n hasAccess,\n returnCurrency,\n formatPrice,\n formatDate,\n formateText,\n replaceClasses,\n normalizeUrlParam,\n joinArrayToUrl,\n getMarketplaceLink,\n getSpotsLink,\n generateFilters,\n // Брейкпоинты\n getCssVar,\n isMediaMax,\n isMediaMin,\n isFlipPhone,\n isPhone,\n isTabletPortrait,\n isTabletLandscape,\n isTablet,\n isDesktop,\n isXLDesktop,\n isXXLDesktop,\n };\n}\n\n// Экспорт для глобальной регистрации\nexport const globalMixins = {\n methods: useGlobalMixins(),\n};\n"],"names":["isAdmin"],"mappings":"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"}
|
|
@@ -51,7 +51,12 @@ function addRoutes(router, config) {
|
|
|
51
51
|
if (!hasRootRoute && filteredRoutes.length > 0) {
|
|
52
52
|
if (emptyRootBehavior.type === "redirect") {
|
|
53
53
|
const redirectTo = emptyRootBehavior.redirectPath || filteredRoutes[0].path;
|
|
54
|
-
finalChildren = [{
|
|
54
|
+
finalChildren = [{
|
|
55
|
+
path: "",
|
|
56
|
+
redirect: redirectTo,
|
|
57
|
+
name: `${routeNamePrefix}${basePath.charAt(0).toUpperCase() + basePath.slice(1)}Root`,
|
|
58
|
+
meta: { ...meta, isAutoRedirect: true }
|
|
59
|
+
}, ...filteredRoutes];
|
|
55
60
|
} else if (emptyRootBehavior.type === "fallback") {
|
|
56
61
|
finalChildren = [
|
|
57
62
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addRoutes.js","sources":["../../../../../../../src/modules/core/views/router/addRoutes.js"],"sourcesContent":["import layoutEmpty from '@martyrs/src/modules/core/views/components/layouts/Empty.vue';\nimport NotFound from '@martyrs/src/modules/core/views/components/pages/404.vue'; // Предполагаемый компонент 404\n\nfunction addRoutes(router, config) {\n const {\n basePath, // Путь для корневого или промежуточного маршрута\n parentName, // Имя существующего родительского маршрута (опционально)\n routes, // Массив маршрутов\n routeNamePrefix = '', // Префикс для имен маршрутов\n filterConfig = {}, // Конфигурация фильтрации\n meta = {}, // Мета-данные для маршрутов\n component = layoutEmpty, // Компонент по умолчанию (layout)\n emptyRootBehavior = {\n // Поведение для пустого корневого маршрута\n type: 'redirect', // 'redirect' или 'fallback'\n fallbackComponent: NotFound, // Компонент для заглушки, если type: 'fallback'\n redirectPath: '/404', // Пользовательский путь для редиректа (опционально)\n },\n } = config;\n\n const { include = [], exclude = [], match } = filterConfig;\n\n // Рекурсивная функция для обработки маршрутов и их вложенных children\n function processRoutes(routesArray, prefix = routeNamePrefix) {\n return routesArray\n .filter(route => {\n if (include.length > 0 && !include.includes(route.name)) return false;\n if (exclude.length > 0 && exclude.includes(route.name)) return false;\n if (match && !match(route)) return false;\n return true;\n })\n .map(route => {\n const processedRoute = {\n ...route,\n name: `${prefix}${route.name}`,\n meta: { ...meta, ...route.meta },\n };\n if (route.children && Array.isArray(route.children)) {\n processedRoute.children = processRoutes(route.children, prefix);\n }\n return processedRoute;\n });\n }\n\n // Обрабатываем маршруты\n const filteredRoutes = processRoutes(routes);\n const hasRootRoute = filteredRoutes.some(route => route.path === '');\n\n // Определяем дочерние маршруты с учётом поведения для пустого корня\n let finalChildren = filteredRoutes;\n if (!hasRootRoute && filteredRoutes.length > 0) {\n if (emptyRootBehavior.type === 'redirect') {\n // Используем пользовательский redirectPath или первый дочерний маршрут\n const redirectTo = emptyRootBehavior.redirectPath || filteredRoutes[0].path;\n finalChildren = [{
|
|
1
|
+
{"version":3,"file":"addRoutes.js","sources":["../../../../../../../src/modules/core/views/router/addRoutes.js"],"sourcesContent":["import layoutEmpty from '@martyrs/src/modules/core/views/components/layouts/Empty.vue';\nimport NotFound from '@martyrs/src/modules/core/views/components/pages/404.vue'; // Предполагаемый компонент 404\n\nfunction addRoutes(router, config) {\n const {\n basePath, // Путь для корневого или промежуточного маршрута\n parentName, // Имя существующего родительского маршрута (опционально)\n routes, // Массив маршрутов\n routeNamePrefix = '', // Префикс для имен маршрутов\n filterConfig = {}, // Конфигурация фильтрации\n meta = {}, // Мета-данные для маршрутов\n component = layoutEmpty, // Компонент по умолчанию (layout)\n emptyRootBehavior = {\n // Поведение для пустого корневого маршрута\n type: 'redirect', // 'redirect' или 'fallback'\n fallbackComponent: NotFound, // Компонент для заглушки, если type: 'fallback'\n redirectPath: '/404', // Пользовательский путь для редиректа (опционально)\n },\n } = config;\n\n const { include = [], exclude = [], match } = filterConfig;\n\n // Рекурсивная функция для обработки маршрутов и их вложенных children\n function processRoutes(routesArray, prefix = routeNamePrefix) {\n return routesArray\n .filter(route => {\n if (include.length > 0 && !include.includes(route.name)) return false;\n if (exclude.length > 0 && exclude.includes(route.name)) return false;\n if (match && !match(route)) return false;\n return true;\n })\n .map(route => {\n const processedRoute = {\n ...route,\n name: `${prefix}${route.name}`,\n meta: { ...meta, ...route.meta },\n };\n if (route.children && Array.isArray(route.children)) {\n processedRoute.children = processRoutes(route.children, prefix);\n }\n return processedRoute;\n });\n }\n\n // Обрабатываем маршруты\n const filteredRoutes = processRoutes(routes);\n const hasRootRoute = filteredRoutes.some(route => route.path === '');\n\n // Определяем дочерние маршруты с учётом поведения для пустого корня\n let finalChildren = filteredRoutes;\n if (!hasRootRoute && filteredRoutes.length > 0) {\n if (emptyRootBehavior.type === 'redirect') {\n // Используем пользовательский redirectPath или первый дочерний маршрут\n const redirectTo = emptyRootBehavior.redirectPath || filteredRoutes[0].path;\n finalChildren = [{\n path: '',\n redirect: redirectTo,\n name: `${routeNamePrefix}${basePath.charAt(0).toUpperCase() + basePath.slice(1)}Root`,\n meta: { ...meta, isAutoRedirect: true }\n }, ...filteredRoutes];\n } else if (emptyRootBehavior.type === 'fallback') {\n finalChildren = [\n {\n path: '',\n component: emptyRootBehavior.fallbackComponent || NotFound,\n meta: { ...meta, isFallback: true },\n },\n ...filteredRoutes,\n ];\n }\n }\n\n if (parentName) {\n const parentRoute = router.getRoutes().find(route => route.name === parentName);\n if (!parentRoute) {\n throw new Error(`Parent route \"${parentName}\" not found`);\n }\n\n if (basePath) {\n const intermediateRoute = {\n path: basePath,\n component,\n name: `${routeNamePrefix}${basePath.charAt(0).toUpperCase() + basePath.slice(1)}Intermediate`,\n meta,\n children: finalChildren,\n };\n router.addRoute(parentName, intermediateRoute);\n } else {\n filteredRoutes.forEach(route => {\n router.addRoute(parentName, route);\n });\n }\n } else if (basePath) {\n const rootRouteName = `${routeNamePrefix}Root`;\n const existingRoute = router.getRoutes().find(route => route.name === rootRouteName);\n if (existingRoute) {\n throw new Error(`Route \"${rootRouteName}\" is already existed`);\n }\n\n const rootRoute = {\n path: basePath,\n component,\n name: rootRouteName,\n meta,\n children: finalChildren,\n };\n router.addRoute(rootRoute);\n } else {\n throw new Error('Need to specify basePath');\n }\n}\n\nexport default addRoutes;\n"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ import "axios";
|
|
|
13
13
|
/* empty css */
|
|
14
14
|
import UploadImage from "../../../../components/UploadImage/UploadImage.vue.js";
|
|
15
15
|
/* empty css */
|
|
16
|
-
/* empty css
|
|
16
|
+
/* empty css */
|
|
17
17
|
import _sfc_main$8 from "../../../../components/Feed/Feed.vue.js";
|
|
18
18
|
import _sfc_main$a from "../../../../components/Button/Button.vue2.js";
|
|
19
19
|
import _sfc_main$7 from "../../../core/views/components/blocks/Card.vue.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { computed, ref, watch, createElementBlock, openBlock, createElementVNode, createCommentVNode, unref, createBlock, createVNode, isRef, withCtx, Fragment, renderList } from "vue";
|
|
2
2
|
import { useRoute, useRouter } from "vue-router";
|
|
3
|
-
import _sfc_main$1 from "../../../../components/Tab/Tab.
|
|
3
|
+
import _sfc_main$1 from "../../../../components/Tab/Tab.vue2.js";
|
|
4
4
|
import _sfc_main$2 from "../../../../components/Feed/Feed.vue.js";
|
|
5
5
|
/* empty css */
|
|
6
6
|
import _sfc_main$3 from "../blocks/CardEvent.vue.js";
|
|
@@ -12,7 +12,7 @@ import { state } from "../../../auth/views/store/auth.js";
|
|
|
12
12
|
import gallery from "../../store/gallery.js";
|
|
13
13
|
import _sfc_main$3 from "../../../core/views/components/blocks/CardHeader.vue.js";
|
|
14
14
|
import _sfc_main$1 from "../../../core/views/components/sections/SectionPageTitle.vue.js";
|
|
15
|
-
import _sfc_main$6 from "../../../../components/EditImages/EditImages.
|
|
15
|
+
import _sfc_main$6 from "../../../../components/EditImages/EditImages.vue2.js";
|
|
16
16
|
import _sfc_main$7 from "../../../../components/FieldTags/BlockTags.vue.js";
|
|
17
17
|
const _hoisted_1 = { class: "cols-1 gap-thin pd-thin" };
|
|
18
18
|
const _hoisted_2 = { class: "pos-relative" };
|
|
@@ -37,7 +37,7 @@ const _hoisted_10 = { class: "h3 mn-r-auto" };
|
|
|
37
37
|
const _sfc_main = {
|
|
38
38
|
__name: "InventoryEdit",
|
|
39
39
|
setup(__props) {
|
|
40
|
-
const
|
|
40
|
+
const store = useStore();
|
|
41
41
|
const route = useRoute();
|
|
42
42
|
const router = useRouter();
|
|
43
43
|
const { formatPrice } = useGlobalMixins();
|
|
@@ -90,7 +90,7 @@ const _sfc_main = {
|
|
|
90
90
|
attributes: variant.attributes || []
|
|
91
91
|
}
|
|
92
92
|
};
|
|
93
|
-
core.actions.add(state.current.positions, position);
|
|
93
|
+
store.core.actions.add(state.current.positions, position);
|
|
94
94
|
closeVariantsPopup();
|
|
95
95
|
}
|
|
96
96
|
onMounted(async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InventoryEdit.vue.js","sources":["../../../../../../../src/modules/inventory/components/pages/InventoryEdit.vue"],"sourcesContent":["<template>\n <div class=\"pd-medium mobile:pd-thin\">\n <header class=\"mn-b-medium gap-small flex-v-center flex-nowrap flex\">\n <h2 class=\"\">Create Inventory Audit</h2>\n </header>\n \n <Popup \n title=\"Add position\" \n @close-popup=\"closeProductsPopup\" \n :isPopupOpen=\"isOpenProductsPopup\"\n class=\"bg-white w-100 w-max-30r radius-medium pd-medium\"\n >\n <Feed\n :search=\"{\n class: 'bg-light radius-small'\n }\"\n :states=\"{\n empty: {\n title: 'No Products Found',\n description: 'Currently, there are no such products available.'\n }\n }\"\n :store=\"{\n read: (options) => products.actions.read(options),\n state: null\n }\"\n :options=\"{\n owner: route.params._id,\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"flex-column flex gap-thin h-max-20r o-scroll\"\n >\n <CardOrderItem\n v-for=\"(product, index) in items\" \n :key=\"`${product._id}_${product.variant || 'no-variant'}_${index}`\"\n :editable=\"false\" \n :productId=\"product._id\"\n :variantId=\"product.variant\"\n :images=\"product.images\"\n :name=\"product.name\"\n :quantity=\"product.quantity || 1\"\n :unit=\"product.unit\"\n :dates=\"product.date\"\n :listing=\"product.listing\"\n :price=\"product.price\"\n @click=\"() => selectProduct(product)\"\n class=\"bg-light pd-small radius-small w-100\"\n />\n </Feed>\n </Popup>\n \n <!-- Popup for selecting variant of the product -->\n <Popup \n title=\"Select variant\" \n @close-popup=\"closeVariantsPopup\" \n :isPopupOpen=\"isVariantsPopupOpen\"\n class=\"bg-white w-100 w-max-30r radius-medium pd-medium\"\n >\n <Feed\n :store=\"variants\"\n :options=\"{\n product: selectedProduct._id,\n }\"\n :skeleton=\"{\n structure: [\n { block: 'text', size: 'small' },\n { block: 'text', size: 'medium' },\n { block: 'text', size: 'small' }\n ]\n }\"\n :states=\"{\n empty: {\n title: 'No variants',\n description: 'Create your first variant'\n }\n }\"\n v-slot=\"{ items }\"\n >\n <div class=\"gap-thin flex flex-column\">\n <div \n v-for=\"(variant, index) in items\" \n :key=\"index\"\n @click=\"addVariantToInventory(variant)\"\n class=\"w-100 cursor-pointer hover-scale-1 bg-light pd-small radius-small flex-v-center flex-nowrap flex gap-thin\"\n >\n <div v-if=\"variant.images && variant.images.length\" class=\"aspect-1x1 h-3r radius-small o-hidden\">\n <img \n :src=\"(FILE_SERVER_URL || '') + variant.images[0]\" \n class=\"w-100 h-100 object-fit-cover\"\n />\n </div>\n <div>\n <p class=\"t-medium\">{{ variant.name || 'Default variant' }}</p>\n <p v-if=\"variant.attributes && variant.attributes.length\" class=\"t-small t-transp\">\n {{ variant.attributes.map(attr => `${attr.name}: ${attr.value}`).join(', ') }}\n </p>\n </div>\n <p class=\"mn-l-auto\">{{ formatPrice(variant.cost) }}</p>\n </div>\n </div>\n </Feed>\n </Popup>\n\n <Block\n class=\"mn-b-thin\"\n >\n <Field\n v-model:field=\"inventory.state.current.comment\"\n placeholder=\"Describe details of the inventory audit\"\n type=\"textarea\"\n class=\"w-100 bg-white radius-small pd-medium\"\n /> \n <div class=\"t-medium mn-t-small mn-b-thin\">Select Storage:</div>\n <Feed\n :states=\"{\n empty: {\n title: 'No Spots Found',\n description: 'Currently, there are no spots available.'\n }\n }\"\n :store=\"{\n read: (options) => spots.actions.read(options),\n state: null\n }\"\n :options=\"{\n user: auth.state.user._id,\n organization: route.params._id,\n limit: 3\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"flex-nowrap flex-column gap-thin flex\"\n >\n <CardSpot\n v-for=\"(spot, index) in items\"\n :key=\"index\"\n :spot=\"spot\"\n :organization=\"route.params._id\"\n :selected=\"inventory.state.current.storage === spot._id\"\n @click=\"() => inventory.state.current.storage = inventory.state.current.storage === spot._id ? null : spot._id\"\n class=\"radius-small h-min-big clickable bg-white\"\n />\n </Feed>\n\n\n </Block>\n\n <Block\n title=\"Positions\"\n :actions=\"[{\n label: '+',\n function: () => openProductsPopup()\n }]\"\n placeholder=\"No positions added yet\"\n class=\"h-100 flex-column flex gap-thin mn-b-thin\"\n >\n <CardPosition\n v-for=\"(position, index) in inventory.state.current.positions\" \n :key=\"position._id || index\" \n :image=\"position.image\"\n :name=\"position.name\"\n :title=\"formatPrice(position.cost * position.quantity)\"\n :title_class=\"[position.cost * position.quantity < 0 ? 't-red' : 't-second']\"\n :subtitle=\"`${formatPrice(position.cost)} × ${Math.abs(position.quantity)}${position.unit} `\"\n >\n <template v-slot:actions>\n <QuantitySelector v-model=\"position.quantity\"/>\n \n <!-- <Dropdown\n :label=\"{ component: IconEllipsis, class: 't-transp i-medium' }\"\n class=\"cursor-pointer aspect-1x1 pd-nano radius-small hover-bg-light\"\n align=\"right\"\n >\n <div class=\"bg-white radius-small\">\n <button @click=\"leftovers.state.current.positions.splice(index, 1)\" class=\"cursor-pointer t-left t-nowrap w-100 pd-small\">\n Delete\n </button>\n </div>\n </Dropdown> -->\n\n </template>\n </CardPosition>\n \n </Block>\n\n <!-- :actions=\"[{\n component: IconEdit,\n handler: () => core.actions.add(leftovers.state.current.positions, position),\n class: 'bg-light'\n },{\n component: IconDelete,\n handler: () => leftovers.state.current.positions.splice(index, 1),\n class: 'bg-red'\n }]\" -->\n\n <Block class=\"\">\n <section class=\"gap-thin flex-v-center flex-nojustify flex\">\n <span class=\"h3 mn-r-auto\">\n In total: {{formatPrice(totalPrice)}}\n </span>\n\n <!-- Save Draft -->\n <Button\n :submit=\"onSaveDraft\"\n class=\"bg-second w-min-5r button\"\n >\n <span>Save Draft</span>\n </Button>\n\n <!-- Publish -->\n <Button\n :submit=\"onPublish\"\n class=\"bg-main w-min-5r button\"\n >\n <span>Publish</span>\n </Button>\n\n <!-- Reset -->\n <Button\n :submit=\"onReset\"\n class=\"t-white w-min-5r bg-second button\"\n >\n <span>Reset</span>\n </Button>\n\n <!-- Delete button removed - only create mode supported -->\n </section>\n </Block>\n </div>\n</template>\n\n\n<script setup>\n import Block from '@martyrs/src/components/Block/Block.vue';\n import Button from \"@martyrs/src/components/Button/Button.vue\";\n import Field from '@martyrs/src/components/Field/Field.vue';\n import Feed from '@martyrs/src/components/Feed/Feed.vue';\n import Select from '@martyrs/src/components/Select/Select.vue';\n import Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue'\n import Popup from '@martyrs/src/components/Popup/Popup.vue';\n\n import CardOrderItem from '@martyrs/src/modules/orders/components/blocks/CardOrderItem.vue';\n import CardSpot from '@martyrs/src/modules/spots/components/blocks/CardSpot.vue'; \n\n import CardPosition from '@martyrs/src/modules/products/components/blocks/CardPosition.vue';\n import QuantitySelector from '@martyrs/src/modules/products/components/elements/QuantitySelector.vue';\n\n import { computed, onMounted, ref, reactive } from 'vue';\n import { useRoute, useRouter } from 'vue-router';\n import { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\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 const core = useStore();\n import * as inventory from '@martyrs/src/modules/inventory/store/inventory.store.js';\n import * as products from '@martyrs/src/modules/products/store/products.js';\n import * as spots from '@martyrs/src/modules/spots/store/spots.js';\n import variants from '@martyrs/src/modules/products/store/variants.store.js';\n\n import IconEdit from '@martyrs/src/modules/icons/navigation/IconEdit.vue';\n import IconDelete from '@martyrs/src/modules/icons/navigation/IconDelete.vue';\n import IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue'\n\n const route = useRoute();\n const router = useRouter();\n const { formatPrice } = useGlobalMixins();\n \n const isOpenProductsPopup = ref(false);\n const isVariantsPopupOpen = ref(false);\n const selectedProduct = ref(null);\n\n const totalPrice = computed(() => {\n return inventory.state.current.positions.reduce((sum, position) => {\n return Number(sum) + Number(position.cost || 0) * Number(position.quantity || 1);\n }, 0);\n });\n\n function openProductsPopup() {\n isOpenProductsPopup.value = true;\n }\n\n function closeProductsPopup() {\n isOpenProductsPopup.value = false;\n }\n \n function closeVariantsPopup() {\n isVariantsPopupOpen.value = false;\n selectedProduct.value = null;\n }\n \n function selectProduct(product) {\n selectedProduct.value = product;\n closeProductsPopup();\n \n // If product has only one variant, add it directly without showing popup\n if (product.variants && product.variants.length === 1) {\n addVariantToInventory(product.variants[0]);\n return;\n }\n \n // If product has multiple variants or no variants defined, show popup\n isVariantsPopupOpen.value = true;\n }\n\n function formatProductName(product, variant) {\n if (!variant || product.variants?.length === 1 && !(variant.attributes?.length))\n return product.name;\n\n const attrs = variant.attributes?.map(a => a.value).filter(Boolean);\n return attrs?.length\n ? `${product.name} / ${attrs.join(' / ')}`\n : `${product.name} / ${variant.name}`;\n }\n\n \n function addVariantToInventory(variant) {\n // Create a position object that includes variant information\n console.log('variant',variant)\n const position = {\n _id: variant._id,\n product: selectedProduct.value._id, \n name: formatProductName(selectedProduct.value, variant),\n image: variant.images?.[0] || selectedProduct.value?.images?.[0] || null,\n cost: variant.cost || variant.price || 0,\n unit: variant.unit || 'pcs',\n quantity: 1,\n variant: {\n _id: variant._id,\n name: variant.name,\n attributes: variant.attributes || []\n }\n };\n // Add position to inventory state\n core.actions.add(inventory.state.current.positions, position);\n closeVariantsPopup();\n }\n\n onMounted(async () => {\n // Reset inventory state for new audit\n inventory.mutations.resetCurrent();\n });\n\n async function onReset() {\n inventory.mutations.resetCurrent();\n return true;\n }\n\n\n function prepareInventoryData(status = 'draft') {\n return {\n storage: inventory.state.current.storage,\n comment: inventory.state.current.comment,\n status: status,\n positions: inventory.state.current.positions.map(pos => ({\n product: pos.product,\n variant: pos.variant?._id,\n storage: inventory.state.current.storage,\n quantity: pos.quantity,\n reason: 'custom',\n comment: `Inventory audit: ${pos.name}`,\n cost: pos.cost\n })),\n owner: {\n type: 'organization',\n target: route.params._id\n },\n creator: {\n type: 'user',\n target: auth.state.user._id\n }\n };\n }\n\n function navigateBack() {\n if (route.meta.context === 'backoffice') {\n router.push({ name: 'BackofficeInventoryList' });\n } else if (route.meta.context === 'organization') {\n router.push({ name: 'OrganizationInventoryList', params: { _id: route.params._id } });\n }\n }\n\n async function onSaveDraft() {\n try {\n const inventoryData = prepareInventoryData('draft');\n await inventory.actions.createInventory(inventoryData);\n navigateBack();\n } catch (error) {\n console.error('Error creating draft inventory:', error);\n }\n }\n\n async function onPublish() {\n try {\n const inventoryData = prepareInventoryData('published');\n await inventory.actions.createInventory(inventoryData);\n navigateBack();\n } catch (error) {\n console.error('Error publishing inventory:', error);\n }\n }\n\n // Remove delete function as we only support creation mode\n</script>"],"names":["inventory.state","inventory.mutations","auth.state","inventory.actions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InventoryEdit.vue.js","sources":["../../../../../../../src/modules/inventory/components/pages/InventoryEdit.vue"],"sourcesContent":["<template>\n <div class=\"pd-medium mobile:pd-thin\">\n <header class=\"mn-b-medium gap-small flex-v-center flex-nowrap flex\">\n <h2 class=\"\">Create Inventory Audit</h2>\n </header>\n \n <Popup \n title=\"Add position\" \n @close-popup=\"closeProductsPopup\" \n :isPopupOpen=\"isOpenProductsPopup\"\n class=\"bg-white w-100 w-max-30r radius-medium pd-medium\"\n >\n <Feed\n :search=\"{\n class: 'bg-light radius-small'\n }\"\n :states=\"{\n empty: {\n title: 'No Products Found',\n description: 'Currently, there are no such products available.'\n }\n }\"\n :store=\"{\n read: (options) => products.actions.read(options),\n state: null\n }\"\n :options=\"{\n owner: route.params._id,\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"flex-column flex gap-thin h-max-20r o-scroll\"\n >\n <CardOrderItem\n v-for=\"(product, index) in items\" \n :key=\"`${product._id}_${product.variant || 'no-variant'}_${index}`\"\n :editable=\"false\" \n :productId=\"product._id\"\n :variantId=\"product.variant\"\n :images=\"product.images\"\n :name=\"product.name\"\n :quantity=\"product.quantity || 1\"\n :unit=\"product.unit\"\n :dates=\"product.date\"\n :listing=\"product.listing\"\n :price=\"product.price\"\n @click=\"() => selectProduct(product)\"\n class=\"bg-light pd-small radius-small w-100\"\n />\n </Feed>\n </Popup>\n \n <!-- Popup for selecting variant of the product -->\n <Popup \n title=\"Select variant\" \n @close-popup=\"closeVariantsPopup\" \n :isPopupOpen=\"isVariantsPopupOpen\"\n class=\"bg-white w-100 w-max-30r radius-medium pd-medium\"\n >\n <Feed\n :store=\"variants\"\n :options=\"{\n product: selectedProduct._id,\n }\"\n :skeleton=\"{\n structure: [\n { block: 'text', size: 'small' },\n { block: 'text', size: 'medium' },\n { block: 'text', size: 'small' }\n ]\n }\"\n :states=\"{\n empty: {\n title: 'No variants',\n description: 'Create your first variant'\n }\n }\"\n v-slot=\"{ items }\"\n >\n <div class=\"gap-thin flex flex-column\">\n <div \n v-for=\"(variant, index) in items\" \n :key=\"index\"\n @click=\"addVariantToInventory(variant)\"\n class=\"w-100 cursor-pointer hover-scale-1 bg-light pd-small radius-small flex-v-center flex-nowrap flex gap-thin\"\n >\n <div v-if=\"variant.images && variant.images.length\" class=\"aspect-1x1 h-3r radius-small o-hidden\">\n <img \n :src=\"(FILE_SERVER_URL || '') + variant.images[0]\" \n class=\"w-100 h-100 object-fit-cover\"\n />\n </div>\n <div>\n <p class=\"t-medium\">{{ variant.name || 'Default variant' }}</p>\n <p v-if=\"variant.attributes && variant.attributes.length\" class=\"t-small t-transp\">\n {{ variant.attributes.map(attr => `${attr.name}: ${attr.value}`).join(', ') }}\n </p>\n </div>\n <p class=\"mn-l-auto\">{{ formatPrice(variant.cost) }}</p>\n </div>\n </div>\n </Feed>\n </Popup>\n\n <Block\n class=\"mn-b-thin\"\n >\n <Field\n v-model:field=\"inventory.state.current.comment\"\n placeholder=\"Describe details of the inventory audit\"\n type=\"textarea\"\n class=\"w-100 bg-white radius-small pd-medium\"\n /> \n <div class=\"t-medium mn-t-small mn-b-thin\">Select Storage:</div>\n <Feed\n :states=\"{\n empty: {\n title: 'No Spots Found',\n description: 'Currently, there are no spots available.'\n }\n }\"\n :store=\"{\n read: (options) => spots.actions.read(options),\n state: null\n }\"\n :options=\"{\n user: auth.state.user._id,\n organization: route.params._id,\n limit: 3\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"flex-nowrap flex-column gap-thin flex\"\n >\n <CardSpot\n v-for=\"(spot, index) in items\"\n :key=\"index\"\n :spot=\"spot\"\n :organization=\"route.params._id\"\n :selected=\"inventory.state.current.storage === spot._id\"\n @click=\"() => inventory.state.current.storage = inventory.state.current.storage === spot._id ? null : spot._id\"\n class=\"radius-small h-min-big clickable bg-white\"\n />\n </Feed>\n\n\n </Block>\n\n <Block\n title=\"Positions\"\n :actions=\"[{\n label: '+',\n function: () => openProductsPopup()\n }]\"\n placeholder=\"No positions added yet\"\n class=\"h-100 flex-column flex gap-thin mn-b-thin\"\n >\n <CardPosition\n v-for=\"(position, index) in inventory.state.current.positions\" \n :key=\"position._id || index\" \n :image=\"position.image\"\n :name=\"position.name\"\n :title=\"formatPrice(position.cost * position.quantity)\"\n :title_class=\"[position.cost * position.quantity < 0 ? 't-red' : 't-second']\"\n :subtitle=\"`${formatPrice(position.cost)} × ${Math.abs(position.quantity)}${position.unit} `\"\n >\n <template v-slot:actions>\n <QuantitySelector v-model=\"position.quantity\"/>\n \n <!-- <Dropdown\n :label=\"{ component: IconEllipsis, class: 't-transp i-medium' }\"\n class=\"cursor-pointer aspect-1x1 pd-nano radius-small hover-bg-light\"\n align=\"right\"\n >\n <div class=\"bg-white radius-small\">\n <button @click=\"leftovers.state.current.positions.splice(index, 1)\" class=\"cursor-pointer t-left t-nowrap w-100 pd-small\">\n Delete\n </button>\n </div>\n </Dropdown> -->\n\n </template>\n </CardPosition>\n \n </Block>\n\n <!-- :actions=\"[{\n component: IconEdit,\n handler: () => store.core.actions.add(leftovers.state.current.positions, position),\n class: 'bg-light'\n },{\n component: IconDelete,\n handler: () => leftovers.state.current.positions.splice(index, 1),\n class: 'bg-red'\n }]\" -->\n\n <Block class=\"\">\n <section class=\"gap-thin flex-v-center flex-nojustify flex\">\n <span class=\"h3 mn-r-auto\">\n In total: {{formatPrice(totalPrice)}}\n </span>\n\n <!-- Save Draft -->\n <Button\n :submit=\"onSaveDraft\"\n class=\"bg-second w-min-5r button\"\n >\n <span>Save Draft</span>\n </Button>\n\n <!-- Publish -->\n <Button\n :submit=\"onPublish\"\n class=\"bg-main w-min-5r button\"\n >\n <span>Publish</span>\n </Button>\n\n <!-- Reset -->\n <Button\n :submit=\"onReset\"\n class=\"t-white w-min-5r bg-second button\"\n >\n <span>Reset</span>\n </Button>\n\n <!-- Delete button removed - only create mode supported -->\n </section>\n </Block>\n </div>\n</template>\n\n\n<script setup>\n import Block from '@martyrs/src/components/Block/Block.vue';\n import Button from \"@martyrs/src/components/Button/Button.vue\";\n import Field from '@martyrs/src/components/Field/Field.vue';\n import Feed from '@martyrs/src/components/Feed/Feed.vue';\n import Select from '@martyrs/src/components/Select/Select.vue';\n import Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue'\n import Popup from '@martyrs/src/components/Popup/Popup.vue';\n\n import CardOrderItem from '@martyrs/src/modules/orders/components/blocks/CardOrderItem.vue';\n import CardSpot from '@martyrs/src/modules/spots/components/blocks/CardSpot.vue'; \n\n import CardPosition from '@martyrs/src/modules/products/components/blocks/CardPosition.vue';\n import QuantitySelector from '@martyrs/src/modules/products/components/elements/QuantitySelector.vue';\n\n import { computed, onMounted, ref, reactive } from 'vue';\n import { useRoute, useRouter } from 'vue-router';\n import { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\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 const store = useStore();\n import * as inventory from '@martyrs/src/modules/inventory/store/inventory.store.js';\n import * as products from '@martyrs/src/modules/products/store/products.js';\n import * as spots from '@martyrs/src/modules/spots/store/spots.js';\n import variants from '@martyrs/src/modules/products/store/variants.store.js';\n\n import IconEdit from '@martyrs/src/modules/icons/navigation/IconEdit.vue';\n import IconDelete from '@martyrs/src/modules/icons/navigation/IconDelete.vue';\n import IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue'\n\n const route = useRoute();\n const router = useRouter();\n const { formatPrice } = useGlobalMixins();\n \n const isOpenProductsPopup = ref(false);\n const isVariantsPopupOpen = ref(false);\n const selectedProduct = ref(null);\n\n const totalPrice = computed(() => {\n return inventory.state.current.positions.reduce((sum, position) => {\n return Number(sum) + Number(position.cost || 0) * Number(position.quantity || 1);\n }, 0);\n });\n\n function openProductsPopup() {\n isOpenProductsPopup.value = true;\n }\n\n function closeProductsPopup() {\n isOpenProductsPopup.value = false;\n }\n \n function closeVariantsPopup() {\n isVariantsPopupOpen.value = false;\n selectedProduct.value = null;\n }\n \n function selectProduct(product) {\n selectedProduct.value = product;\n closeProductsPopup();\n \n // If product has only one variant, add it directly without showing popup\n if (product.variants && product.variants.length === 1) {\n addVariantToInventory(product.variants[0]);\n return;\n }\n \n // If product has multiple variants or no variants defined, show popup\n isVariantsPopupOpen.value = true;\n }\n\n function formatProductName(product, variant) {\n if (!variant || product.variants?.length === 1 && !(variant.attributes?.length))\n return product.name;\n\n const attrs = variant.attributes?.map(a => a.value).filter(Boolean);\n return attrs?.length\n ? `${product.name} / ${attrs.join(' / ')}`\n : `${product.name} / ${variant.name}`;\n }\n\n \n function addVariantToInventory(variant) {\n // Create a position object that includes variant information\n console.log('variant',variant)\n const position = {\n _id: variant._id,\n product: selectedProduct.value._id, \n name: formatProductName(selectedProduct.value, variant),\n image: variant.images?.[0] || selectedProduct.value?.images?.[0] || null,\n cost: variant.cost || variant.price || 0,\n unit: variant.unit || 'pcs',\n quantity: 1,\n variant: {\n _id: variant._id,\n name: variant.name,\n attributes: variant.attributes || []\n }\n };\n // Add position to inventory state\n store.core.actions.add(inventory.state.current.positions, position);\n closeVariantsPopup();\n }\n\n onMounted(async () => {\n // Reset inventory state for new audit\n inventory.mutations.resetCurrent();\n });\n\n async function onReset() {\n inventory.mutations.resetCurrent();\n return true;\n }\n\n\n function prepareInventoryData(status = 'draft') {\n return {\n storage: inventory.state.current.storage,\n comment: inventory.state.current.comment,\n status: status,\n positions: inventory.state.current.positions.map(pos => ({\n product: pos.product,\n variant: pos.variant?._id,\n storage: inventory.state.current.storage,\n quantity: pos.quantity,\n reason: 'custom',\n comment: `Inventory audit: ${pos.name}`,\n cost: pos.cost\n })),\n owner: {\n type: 'organization',\n target: route.params._id\n },\n creator: {\n type: 'user',\n target: auth.state.user._id\n }\n };\n }\n\n function navigateBack() {\n if (route.meta.context === 'backoffice') {\n router.push({ name: 'BackofficeInventoryList' });\n } else if (route.meta.context === 'organization') {\n router.push({ name: 'OrganizationInventoryList', params: { _id: route.params._id } });\n }\n }\n\n async function onSaveDraft() {\n try {\n const inventoryData = prepareInventoryData('draft');\n await inventory.actions.createInventory(inventoryData);\n navigateBack();\n } catch (error) {\n console.error('Error creating draft inventory:', error);\n }\n }\n\n async function onPublish() {\n try {\n const inventoryData = prepareInventoryData('published');\n await inventory.actions.createInventory(inventoryData);\n navigateBack();\n } catch (error) {\n console.error('Error publishing inventory:', error);\n }\n }\n\n // Remove delete function as we only support creation mode\n</script>"],"names":["inventory.state","inventory.mutations","auth.state","inventory.actions"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { ref, watch, createElementBlock, openBlock, createElementVNode, unref, c
|
|
|
2
2
|
import { useRoute, useRouter } from "vue-router";
|
|
3
3
|
import { useI18n } from "vue-i18n";
|
|
4
4
|
import _sfc_main$2 from "../../../../../components/Feed/Feed.vue.js";
|
|
5
|
-
import Filters from "../../../../core/views/components/sections/Filters.
|
|
5
|
+
import Filters from "../../../../core/views/components/sections/Filters.vue2.js";
|
|
6
6
|
import _sfc_main$1 from "../../../../core/views/components/sections/filters/FiltersGroup.vue.js";
|
|
7
7
|
import Field from "../../../../../components/Field/Field.vue.js";
|
|
8
8
|
import _sfc_main$3 from "../../../../organizations/components/blocks/CardOrganization.vue.js";
|
|
@@ -54,22 +54,6 @@ const state = reactive({
|
|
|
54
54
|
{ label: "Crypto", value: "crypto" },
|
|
55
55
|
{ label: "Bank Transfer", value: "bank" }
|
|
56
56
|
]
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
title: "Availability Date",
|
|
60
|
-
value: "availabilityDate",
|
|
61
|
-
type: "date"
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
title: "Rating",
|
|
65
|
-
value: "rating",
|
|
66
|
-
type: "radio",
|
|
67
|
-
options: [
|
|
68
|
-
{ label: "5 stars", value: "5" },
|
|
69
|
-
{ label: "4+ stars", value: "4" },
|
|
70
|
-
{ label: "3+ stars", value: "3" },
|
|
71
|
-
{ label: "Any rating", value: "any" }
|
|
72
|
-
]
|
|
73
57
|
}
|
|
74
58
|
]
|
|
75
59
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marketplace.js","sources":["../../../../../../../src/modules/marketplace/views/store/marketplace.js"],"sourcesContent":["import { reactive, watch } from 'vue';\nimport StoreManager from '@martyrs/src/modules/core/views/classes/store.manager.js';\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\nconst { returnCurrency } = useGlobalMixins();\n\n// State\nconst state = reactive({\n shops: [],\n popular: [],\n pagination: {\n page: 1,\n perPage: 18,\n },\n search: {\n active: false,\n current: '',\n result: [],\n },\n locationOptions: [\n { label: 'All', path: '/marketplace' },\n { label: 'Phuket', path: '/marketplace/thailand/phuket' },\n { label: 'Bangkok', path: '/marketplace/thailand/bangkok' },\n { label: 'Chiang Mai', path: '/marketplace/thailand/chiang-mai' },\n { label: 'Pattaya', path: '/marketplace/thailand/pattaya' },\n ],\n filter: {\n active: false,\n class: 'mobile-only',\n selected: {},\n options: [\n {\n title: 'Price',\n value: 'price',\n type: 'range',\n minPlaceholder: 'From',\n maxPlaceholder: 'To',\n label: returnCurrency()\n },\n {\n title: 'Delivery',\n value: 'delivery',\n type: 'checkbox',\n options: [\n { label: 'Pickup', value: 'pickup' },\n { label: 'Delivery', value: 'courier' },\n { label: 'Mail', value: 'post' },\n ],\n },\n {\n title: 'Payment',\n value: 'payment',\n type: 'checkbox',\n options: [\n { label: 'Cash', value: 'cash' },\n { label: 'Card', value: 'card' },\n { label: 'Crypto', value: 'crypto' },\n { label: 'Bank Transfer', value: 'bank' },\n ],\n },\n
|
|
1
|
+
{"version":3,"file":"marketplace.js","sources":["../../../../../../../src/modules/marketplace/views/store/marketplace.js"],"sourcesContent":["import { reactive, watch } from 'vue';\nimport StoreManager from '@martyrs/src/modules/core/views/classes/store.manager.js';\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\nconst { returnCurrency } = useGlobalMixins();\n\n// State\nconst state = reactive({\n shops: [],\n popular: [],\n pagination: {\n page: 1,\n perPage: 18,\n },\n search: {\n active: false,\n current: '',\n result: [],\n },\n locationOptions: [\n { label: 'All', path: '/marketplace' },\n { label: 'Phuket', path: '/marketplace/thailand/phuket' },\n { label: 'Bangkok', path: '/marketplace/thailand/bangkok' },\n { label: 'Chiang Mai', path: '/marketplace/thailand/chiang-mai' },\n { label: 'Pattaya', path: '/marketplace/thailand/pattaya' },\n ],\n filter: {\n active: false,\n class: 'mobile-only',\n selected: {},\n options: [\n {\n title: 'Price',\n value: 'price',\n type: 'range',\n minPlaceholder: 'From',\n maxPlaceholder: 'To',\n label: returnCurrency()\n },\n {\n title: 'Delivery',\n value: 'delivery',\n type: 'checkbox',\n options: [\n { label: 'Pickup', value: 'pickup' },\n { label: 'Delivery', value: 'courier' },\n { label: 'Mail', value: 'post' },\n ],\n },\n {\n title: 'Payment',\n value: 'payment',\n type: 'checkbox',\n options: [\n { label: 'Cash', value: 'cash' },\n { label: 'Card', value: 'card' },\n { label: 'Crypto', value: 'crypto' },\n { label: 'Bank Transfer', value: 'bank' },\n ],\n },\n ],\n },\n sort: {\n param: 'distance',\n order: 'asc',\n options: [\n {\n label: 'Distance',\n value: 'distance',\n },\n {\n label: 'Popularity',\n value: 'views',\n },\n {\n label: 'Products',\n value: 'numberOfProducts',\n },\n ],\n },\n});\n\n// History\nconst history = [];\nhistory.push(state);\n\n// Watch\nwatch(state, (newState, oldState) => {\n history.push(newState);\n});\n\n// Actions через StoreManager\nconst marketplaceStore = new StoreManager('/api/marketplace');\n\n// Custom action для каталога\nmarketplaceStore.readCatalog = async function(params = {}) {\n console.log('Reading marketplace catalog with params:', params);\n try {\n const result = await this.request('/catalog', { params });\n console.log(`Catalog returned ${result.length || 0} items`);\n\n // Обновляем state.shops если нужно\n if (result && Array.isArray(result)) {\n state.shops = result;\n }\n\n return result;\n } catch (error) {\n console.error('Catalog read failed:', error);\n throw error;\n }\n};\n\n// Module Export\nexport { state, marketplaceStore };\n\nexport default marketplaceStore;\n"],"names":[],"mappings":";;;AAIA,MAAM,EAAE,eAAc,IAAK,gBAAe;AAGrC,MAAC,QAAQ,SAAS;AAAA,EACrB,OAAO,CAAA;AAAA,EACP,SAAS,CAAA;AAAA,EACT,YAAY;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,EACb;AAAA,EACE,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ,CAAA;AAAA,EACZ;AAAA,EACE,iBAAiB;AAAA,IACf,EAAE,OAAO,OAAO,MAAM,eAAc;AAAA,IACpC,EAAE,OAAO,UAAU,MAAM,+BAA8B;AAAA,IACvD,EAAE,OAAO,WAAW,MAAM,gCAA+B;AAAA,IACzD,EAAE,OAAO,cAAc,MAAM,mCAAkC;AAAA,IAC/D,EAAE,OAAO,WAAW,MAAM,gCAA+B;AAAA,EAC7D;AAAA,EACE,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU,CAAA;AAAA,IACV,SAAS;AAAA,MACP;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,QACN,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,QAChB,OAAO,eAAc;AAAA,MAC7B;AAAA,MACM;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,UACP,EAAE,OAAO,UAAU,OAAO,SAAQ;AAAA,UAClC,EAAE,OAAO,YAAY,OAAO,UAAS;AAAA,UACrC,EAAE,OAAO,QAAQ,OAAO,OAAM;AAAA,QACxC;AAAA,MACA;AAAA,MACM;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,UACP,EAAE,OAAO,QAAQ,OAAO,OAAM;AAAA,UAC9B,EAAE,OAAO,QAAQ,OAAO,OAAM;AAAA,UAC9B,EAAE,OAAO,UAAU,OAAO,SAAQ;AAAA,UAClC,EAAE,OAAO,iBAAiB,OAAO,OAAM;AAAA,QACjD;AAAA,MACA;AAAA,IACA;AAAA,EACA;AAAA,EACE,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,MACf;AAAA,MACM;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,MACf;AAAA,MACM;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,MACf;AAAA,IACA;AAAA,EACA;AACA,CAAC;AAOD,MAAM,OAAO,CAAC,UAAU,aAAa;AAErC,CAAC;AAGI,MAAC,mBAAmB,IAAI,aAAa,kBAAkB;AAG5D,iBAAiB,cAAc,eAAe,SAAS,IAAI;AACzD,UAAQ,IAAI,4CAA4C,MAAM;AAC9D,MAAI;AACF,UAAM,SAAS,MAAM,KAAK,QAAQ,YAAY,EAAE,QAAQ;AACxD,YAAQ,IAAI,oBAAoB,OAAO,UAAU,CAAC,QAAQ;AAG1D,QAAI,UAAU,MAAM,QAAQ,MAAM,GAAG;AACnC,YAAM,QAAQ;AAAA,IAChB;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,wBAAwB,KAAK;AAC3C,UAAM;AAAA,EACR;AACF;"}
|