@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,6 +1,6 @@
|
|
|
1
1
|
import { m as middlewareIndexFactory } from "./index-_Edcmck_.js";
|
|
2
2
|
import { C as CacheNamespaced } from "./core.cache-DALYFDdy.js";
|
|
3
|
-
import { q as queryProcessorCore } from "./queryProcessor-
|
|
3
|
+
import { q as queryProcessorCore } from "./queryProcessor-C_5Iipam.js";
|
|
4
4
|
import { b as getLookupStages } from "./queryProcessorOrganizations-BB11WFpc.js";
|
|
5
5
|
import { Types } from "mongoose";
|
|
6
6
|
import * as googleMapsServicesJs from "@googlemaps/google-maps-services-js";
|
|
@@ -1,22 +1,10 @@
|
|
|
1
|
-
import { ref, createElementBlock, openBlock, normalizeClass, withModifiers,
|
|
1
|
+
import { ref, createElementBlock, openBlock, normalizeClass, withModifiers, createElementVNode, createCommentVNode, renderSlot, createVNode, createBlock, Fragment, createTextVNode, toDisplayString } from "vue";
|
|
2
2
|
import Loader from "../Loader/Loader.vue.js";
|
|
3
3
|
import _sfc_main$1 from "../../modules/icons/navigation/IconCheckmark.vue.js";
|
|
4
4
|
import _sfc_main$2 from "../../modules/icons/navigation/IconCross.vue.js";
|
|
5
5
|
/* empty css */
|
|
6
6
|
const _hoisted_1 = ["disabled"];
|
|
7
7
|
const _hoisted_2 = {
|
|
8
|
-
key: 0,
|
|
9
|
-
class: "button-content"
|
|
10
|
-
};
|
|
11
|
-
const _hoisted_3 = {
|
|
12
|
-
key: 2,
|
|
13
|
-
class: "button-content t-semi t-center w-100 loading t-black"
|
|
14
|
-
};
|
|
15
|
-
const _hoisted_4 = {
|
|
16
|
-
key: 3,
|
|
17
|
-
class: "button-content t-center w-100 error"
|
|
18
|
-
};
|
|
19
|
-
const _hoisted_5 = {
|
|
20
8
|
key: 0,
|
|
21
9
|
class: "button-counter font-second flex flex-center"
|
|
22
10
|
};
|
|
@@ -99,6 +87,7 @@ const _sfc_main = {
|
|
|
99
87
|
}
|
|
100
88
|
if (props.callback) setTimeout(() => props.callback(), props.callbackDelay);
|
|
101
89
|
} catch (err) {
|
|
90
|
+
console.error("=== BUTTON ERROR ===", err);
|
|
102
91
|
emits("error", err);
|
|
103
92
|
button.value.classList.replace("bg-main", "bg-fourth-nano");
|
|
104
93
|
loading.value = false;
|
|
@@ -117,35 +106,37 @@ const _sfc_main = {
|
|
|
117
106
|
ref: button,
|
|
118
107
|
class: normalizeClass(["button", { "button--disabled": loading.value || __props.validation }])
|
|
119
108
|
}, [
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
]),
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
109
|
+
createElementVNode("span", {
|
|
110
|
+
class: normalizeClass(["button-content", { "hidden": loading.value || error.value || finished.value }])
|
|
111
|
+
}, [
|
|
112
|
+
renderSlot(_ctx.$slots, "default")
|
|
113
|
+
], 2),
|
|
114
|
+
createElementVNode("span", {
|
|
115
|
+
class: normalizeClass(["button-loader", { "active": loading.value && __props.showLoader }])
|
|
116
|
+
}, [
|
|
117
|
+
createVNode(Loader, { class: "" })
|
|
118
|
+
], 2),
|
|
119
|
+
createElementVNode("span", {
|
|
120
|
+
class: normalizeClass(["button-success", { "active": finished.value && __props.showSucces }])
|
|
121
|
+
}, [
|
|
122
|
+
__props.text.success ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
|
|
123
|
+
createTextVNode(toDisplayString(__props.text.success), 1)
|
|
124
|
+
], 64)) : (openBlock(), createBlock(_sfc_main$1, {
|
|
125
|
+
key: 1,
|
|
126
|
+
class: "i-regular"
|
|
127
|
+
}))
|
|
128
|
+
], 2),
|
|
129
|
+
createElementVNode("span", {
|
|
130
|
+
class: normalizeClass(["button-error", { "active": error.value }])
|
|
131
|
+
}, [
|
|
132
|
+
__props.text.error ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
|
|
133
|
+
createTextVNode(toDisplayString(__props.text.error), 1)
|
|
134
|
+
], 64)) : (openBlock(), createBlock(_sfc_main$2, {
|
|
135
|
+
key: 1,
|
|
136
|
+
class: "i-regular"
|
|
137
|
+
}))
|
|
138
|
+
], 2),
|
|
139
|
+
__props.counter ? (openBlock(), createElementBlock("div", _hoisted_2, [
|
|
149
140
|
createElementVNode("span", null, toDisplayString(__props.counter), 1)
|
|
150
141
|
])) : createCommentVNode("", true)
|
|
151
142
|
], 10, _hoisted_1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.vue2.js","sources":["../../../../../src/components/Button/Button.vue"],"sourcesContent":["<script setup>\nimport { ref } from 'vue'\n\nimport Loader from '@martyrs/src/components/Loader/Loader.vue'\n\nimport IconCheckmark from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue';\n\nconst props = defineProps({\n submit: {\n type: Function,\n default: async () => { console.log('Button click.') }\n },\n text: {\n type: Object,\n default: () => ({\n success: null,\n error: null\n })\n },\n counter: {\n type: Object\n },\n callback: {\n type: Function,\n default: async () => { console.log('Button callback.') }\n },\n callbackDelay: {\n type: Number,\n default: 750\n },\n showSucces: {\n type: Boolean,\n default: true\n },\n showLoader: {\n type: Boolean,\n default: true\n },\n validation: {\n type: Boolean,\n default: false\n },\n})\n\nconst emits = defineEmits(['error'])\n\nconst button = ref(null)\nconst error = ref(null)\nconst loading = ref(false)\nconst finished = ref(false)\n\nasync function Submit() {\n console.log('click')\n \n button.value.style['pointer-events'] = 'none'\n error.value = null\n loading.value = true\n\n // Функция для сброса состояния кнопки\n const resetButton = () => {\n if (button.value) {\n button.value.style.pointerEvents = 'auto'\n loading.value = false\n finished.value = false\n error.value = null\n }\n }\n\n try {\n await props.submit()\n\n button.value.classList.replace('bg-main', 'bg-second')\n loading.value = false\n\n // Используем функцию сброса состояния кнопки здесь\n if (props.showSucces) { \n finished.value = true\n setTimeout(() => {\n resetButton()\n button.value.classList.replace('bg-second', 'bg-main')\n }, 500)\n } else {\n resetButton()\n button.value.classList.replace('bg-second', 'bg-main')\n }\n\n // Если есть callback, мы также установим таймер для его вызова\n if (props.callback) setTimeout(() => props.callback(), props.callbackDelay)\n\n } catch (err) {\n emits('error', err)\n // Если возникла ошибка, мы изменяем стили и устанавливаем сообщение об ошибке\n button.value.classList.replace('bg-main', 'bg-fourth-nano')\n loading.value = false\n error.value = true\n \n // После задержки снова сбрасываем состояние кнопки\n setTimeout(() => {\n resetButton()\n // Так как класс кнопки был изменен, вернем его в исходное состояние\n button.value.classList.replace('bg-fourth-nano', 'bg-main')\n }, 1330)\n }\n}\n</script>\n\n<template>\n <button \n @click.stop=\"Submit\"\n :disabled=\"validation\"\n ref=\"button\"\n\t\tclass=\"button\"\n :class=\"{ 'button--disabled': loading || validation }\"\n >\n <
|
|
1
|
+
{"version":3,"file":"Button.vue2.js","sources":["../../../../../src/components/Button/Button.vue"],"sourcesContent":["<script setup>\nimport { ref } from 'vue'\n\nimport Loader from '@martyrs/src/components/Loader/Loader.vue'\n\nimport IconCheckmark from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue';\n\nconst props = defineProps({\n submit: {\n type: Function,\n default: async () => { console.log('Button click.') }\n },\n text: {\n type: Object,\n default: () => ({\n success: null,\n error: null\n })\n },\n counter: {\n type: Object\n },\n callback: {\n type: Function,\n default: async () => { console.log('Button callback.') }\n },\n callbackDelay: {\n type: Number,\n default: 750\n },\n showSucces: {\n type: Boolean,\n default: true\n },\n showLoader: {\n type: Boolean,\n default: true\n },\n validation: {\n type: Boolean,\n default: false\n },\n})\n\nconst emits = defineEmits(['error'])\n\nconst button = ref(null)\nconst error = ref(null)\nconst loading = ref(false)\nconst finished = ref(false)\n\nasync function Submit() {\n console.log('click')\n \n button.value.style['pointer-events'] = 'none'\n error.value = null\n loading.value = true\n\n // Функция для сброса состояния кнопки\n const resetButton = () => {\n if (button.value) {\n button.value.style.pointerEvents = 'auto'\n loading.value = false\n finished.value = false\n error.value = null\n }\n }\n\n try {\n await props.submit()\n\n button.value.classList.replace('bg-main', 'bg-second')\n loading.value = false\n\n // Используем функцию сброса состояния кнопки здесь\n if (props.showSucces) { \n finished.value = true\n setTimeout(() => {\n resetButton()\n button.value.classList.replace('bg-second', 'bg-main')\n }, 500)\n } else {\n resetButton()\n button.value.classList.replace('bg-second', 'bg-main')\n }\n\n // Если есть callback, мы также установим таймер для его вызова\n if (props.callback) setTimeout(() => props.callback(), props.callbackDelay)\n\n } catch (err) {\n console.error('=== BUTTON ERROR ===', err)\n emits('error', err)\n // Если возникла ошибка, мы изменяем стили и устанавливаем сообщение об ошибке\n button.value.classList.replace('bg-main', 'bg-fourth-nano')\n loading.value = false\n error.value = true\n \n // После задержки снова сбрасываем состояние кнопки\n setTimeout(() => {\n resetButton()\n // Так как класс кнопки был изменен, вернем его в исходное состояние\n button.value.classList.replace('bg-fourth-nano', 'bg-main')\n }, 1330)\n }\n}\n</script>\n\n<template>\n <button \n @click.stop=\"Submit\"\n :disabled=\"validation\"\n ref=\"button\"\n\t\tclass=\"button\"\n :class=\"{ 'button--disabled': loading || validation }\"\n >\n <span class=\"button-content\" :class=\"{ 'hidden': loading || error || finished }\">\n <slot></slot>\n </span>\n\n <span class=\"button-loader\" :class=\"{ 'active': loading && showLoader }\">\n <Loader class=\"\"/>\n </span>\n\n <span class=\"button-success\" :class=\"{ 'active': finished && showSucces }\">\n <template v-if=\"text.success\">{{ text.success }}</template>\n <IconCheckmark v-else class=\"i-regular\" />\n </span>\n\n <span class=\"button-error\" :class=\"{ 'active': error }\">\n <template v-if=\"text.error\">{{ text.error }}</template>\n <IconCross v-else class=\"i-regular\" />\n </span>\n \n <!-- Counter -->\n <div v-if=\"counter\" class=\"button-counter font-second flex flex-center\">\n <span>{{ counter }}</span>\n </div>\n </button>\n</template>\n\n<style lang=\"scss\">\nbutton[disabled] {\n opacity: 0.75 !important;\n pointer-events: none !important;\n cursor: default !important;\n color: rgba(var(--dark), 0.33) !important;\n background: rgba(var(--light), 1) !important;\n}\n\na.button {\n text-box: trim-both cap alphabetic;\n}\n\n.button {\n position: relative;\n display: flex;\n padding: var(--small);\n border-radius: var(--small);\n text-box: trim-both cap alphabetic;\n transform: scale(1);\n opacity: 1;\n align-items: center;\n justify-content: center;\n color: black;\n text-align: center;\n font-size: 1rem;\n letter-spacing: 5%;\n transition: all 0.33s ease;\n\n &:hover {\n cursor: pointer;\n opacity: 0.9;\n }\n\n &:active {\n transform: scale(0.95);\n }\n\n &-small {\n padding: 0.75rem;\n border-radius: 0.5rem;\n height: fit-content;\n }\n\n .button-counter {\n position: absolute;\n right: -8px;\n bottom: -8px;\n background: yellow;\n height: 16px;\n border-radius: 16px;\n width: 16px;\n font-weight: 500;\n text-align: center;\n line-height: 16px;\n font-size: 10px;\n }\n}\n\n.button-content {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: opacity 0.3s ease;\n}\n\n\n.button-loader {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.3s ease;\n pointer-events: none;\n}\n\n.button-success {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.3s ease;\n pointer-events: none;\n}\n\n.button-error {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.3s ease;\n pointer-events: none;\n}\n\n.active {\n opacity: 1;\n}\n\n.hidden {\n opacity: 0;\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,UAAM,QAAQ;AAqCd,UAAM,QAAQ;AAEd,UAAM,SAAS,IAAI,IAAI;AACvB,UAAM,QAAQ,IAAI,IAAI;AACtB,UAAM,UAAU,IAAI,KAAK;AACzB,UAAM,WAAW,IAAI,KAAK;AAE1B,mBAAe,SAAS;AACtB,cAAQ,IAAI,OAAO;AAEnB,aAAO,MAAM,MAAM,gBAAgB,IAAI;AACvC,YAAM,QAAQ;AACd,cAAQ,QAAQ;AAGhB,YAAM,cAAc,MAAM;AACxB,YAAI,OAAO,OAAO;AAChB,iBAAO,MAAM,MAAM,gBAAgB;AACnC,kBAAQ,QAAQ;AAChB,mBAAS,QAAQ;AACjB,gBAAM,QAAQ;AAAA,QAChB;AAAA,MACF;AAEA,UAAI;AACF,cAAM,MAAM,OAAM;AAElB,eAAO,MAAM,UAAU,QAAQ,WAAW,WAAW;AACrD,gBAAQ,QAAQ;AAGhB,YAAI,MAAM,YAAY;AACpB,mBAAS,QAAQ;AACjB,qBAAW,MAAM;AACf,wBAAW;AACX,mBAAO,MAAM,UAAU,QAAQ,aAAa,SAAS;AAAA,UACvD,GAAG,GAAG;AAAA,QACR,OAAO;AACL,sBAAW;AACX,iBAAO,MAAM,UAAU,QAAQ,aAAa,SAAS;AAAA,QACvD;AAGA,YAAI,MAAM,SAAU,YAAW,MAAM,MAAM,SAAQ,GAAI,MAAM,aAAa;AAAA,MAE5E,SAAS,KAAK;AACZ,gBAAQ,MAAM,wBAAwB,GAAG;AACzC,cAAM,SAAS,GAAG;AAElB,eAAO,MAAM,UAAU,QAAQ,WAAW,gBAAgB;AAC1D,gBAAQ,QAAQ;AAChB,cAAM,QAAQ;AAGd,mBAAW,MAAM;AACf,sBAAW;AAEX,iBAAO,MAAM,UAAU,QAAQ,kBAAkB,SAAS;AAAA,QAC5D,GAAG,IAAI;AAAA,MACT;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -2,7 +2,7 @@ import { ref, watchEffect, createElementBlock, openBlock, createBlock, createCom
|
|
|
2
2
|
import { VueDraggableNext } from "../../../../node_modules/.pnpm/vue-draggable-next@2.2.1_sortablejs@1.15.6_vue@3.5.13_typescript@5.8.3_/node_modules/vue-draggable-next/dist/vue-draggable-next.esm-bundler.js";
|
|
3
3
|
import _sfc_main$2 from "../UploadImageMultiple/UploadImageMultiple.vue.js";
|
|
4
4
|
import _sfc_main$1 from "../../modules/icons/navigation/IconCross.vue.js";
|
|
5
|
-
/* empty css
|
|
5
|
+
/* empty css */
|
|
6
6
|
const _hoisted_1 = { class: "flex-nowrap flex gap-small" };
|
|
7
7
|
const _hoisted_2 = { class: "pos-relative" };
|
|
8
8
|
const _hoisted_3 = ["src"];
|
|
@@ -92,4 +92,4 @@ const _sfc_main = {
|
|
|
92
92
|
export {
|
|
93
93
|
_sfc_main as default
|
|
94
94
|
};
|
|
95
|
-
//# sourceMappingURL=EditImages.
|
|
95
|
+
//# sourceMappingURL=EditImages.vue2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditImages.vue2.js","sources":["../../../../../src/components/EditImages/EditImages.vue"],"sourcesContent":["<template>\n\t<div class=\"flex-nowrap flex gap-small\">\n <VueDraggableNext v-if=\"localImages.length > 0\" class=\"gap-small flex dragArea list-group w-full\" v-model=\"localImages\" @change=\"emitChanges\">\n\t\t\t<div v-for=\"(image, index) in localImages\" class=\"pos-relative\">\n\t\t\t\t<img loading=\"lazy\" class=\"i-extra object-fit-contain bg-black-transp-5 pd-nano radius-small o-hidden\" :src=\"(FILE_SERVER_URL || '') + image\" />\n\t\t\t\t\n <IconCross \n @click=\"deleteImage(index)\" \n class=\"cursor-pointer pos-absolute t-center flex-center flex radius-extra i-medium bg-red pos-t-10-negative pos-r-10-negative pd-micro\"\n />\n\t\t\t</div>\n\t\t</VueDraggableNext>\n <div\n v-if=\"localImages.length > 0\" \n class=\"i-extra uppercase flex-center flex radius-small o-hidden br-solid br-main br-2px pd-small\"\n >\n <UploadImageMultiple \n @update:images=\"onImagesUpdate\"\n text=\"Add\"\n :options=\"{\n showText: false\n }\"\n :uploadPath=\"'photos'\"\n class=\"radius-big\"\n />\n </div>\n\n\n\t\t<UploadImageMultiple \t\n v-if=\"localImages.length < 1\" \n @update:images=\"onImagesUpdate\"\n :uploadPath=\"props.uploadPath\"\n :text=\"props.text\"\n :options=\"props.options\"\n class=\"w-100 pd-medium\"\n />\n\t</div>\t\n</template>\n\n<script setup>\nimport { ref, defineProps, watchEffect } from 'vue';\nimport { VueDraggableNext } from 'vue-draggable-next'\nimport UploadImageMultiple from \"@martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue\";\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue';\n\nconst props = defineProps({\n images: Array,\n text: Object,\n options: Object,\n uploadPath: {\n type: Object,\n default: 'unsorted'\n }\n});\n\nconst emit = defineEmits(['update:images'])\n\nconst localImages = ref([...props.images])\n\nwatchEffect(() => {\n localImages.value = [...props.images]; // Обновление localImages при изменении props.images\n});\n\nconst emitChanges = () => {\n emit('update:images', localImages.value)\n}\n\nconst onImagesUpdate = (newImages) => {\n localImages.value = [...localImages.value, ...newImages]\n emitChanges()\n}\n\nconst deleteImage = (index) => {\n localImages.value.splice(index, 1)\n emitChanges()\n}\n</script>\n\n<style lang=\"scss\">\n// Your styles here\n</style>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,UAAM,QAAQ;AAUd,UAAM,OAAO;AAEb,UAAM,cAAc,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC;AAEzC,gBAAY,MAAM;AAChB,kBAAY,QAAQ,CAAC,GAAG,MAAM,MAAM;AAAA,IACtC,CAAC;AAED,UAAM,cAAc,MAAM;AACxB,WAAK,iBAAiB,YAAY,KAAK;AAAA,IACzC;AAEA,UAAM,iBAAiB,CAAC,cAAc;AACpC,kBAAY,QAAQ,CAAC,GAAG,YAAY,OAAO,GAAG,SAAS;AACvD,kBAAW;AAAA,IACb;AAEA,UAAM,cAAc,CAAC,UAAU;AAC7B,kBAAY,MAAM,OAAO,OAAO,CAAC;AACjC,kBAAW;AAAA,IACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -7,7 +7,7 @@ import _sfc_main$2 from "../Dropdown/Dropdown.vue.js";
|
|
|
7
7
|
import Calendar from "../Calendar/Calendar.vue2.js";
|
|
8
8
|
import _sfc_main$1 from "../../modules/core/views/components/blocks/BlockSearch.vue.js";
|
|
9
9
|
import _sfc_main$5 from "../../modules/core/views/components/blocks/BlockSorting.vue.js";
|
|
10
|
-
import Filters from "../../modules/core/views/components/sections/Filters.
|
|
10
|
+
import Filters from "../../modules/core/views/components/sections/Filters.vue2.js";
|
|
11
11
|
import _sfc_main$4 from "../../modules/core/views/components/elements/ButtonSort.vue.js";
|
|
12
12
|
import _sfc_main$3 from "../../modules/core/views/components/elements/ButtonDate.vue.js";
|
|
13
13
|
/* empty css */
|
|
@@ -259,7 +259,7 @@ const _sfc_main = {
|
|
|
259
259
|
if (!dialCodeInput.value.startsWith("+")) {
|
|
260
260
|
dialCodeInput.value = "+" + dialCodeInput.value.replace(/^\+*/, "");
|
|
261
261
|
}
|
|
262
|
-
dialCodeInput.value = dialCodeInput.value.replace(/[
|
|
262
|
+
dialCodeInput.value = dialCodeInput.value.replace(/[^+\d]/g, "");
|
|
263
263
|
const plusCount = (dialCodeInput.value.match(/\+/g) || []).length;
|
|
264
264
|
if (plusCount > 1) {
|
|
265
265
|
dialCodeInput.value = "+" + dialCodeInput.value.replace(/\+/g, "");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldPhone.vue.js","sources":["../../../../../src/components/FieldPhone/FieldPhone.vue"],"sourcesContent":["<template>\n <div \n :class=\"[\n rootClass, \n classes,\n $attrs.class, \n { 'bg-fourth-nano': validation }, \n { disabled: disabled }\n ]\" \n :style=\"[rootStyle, styles]\" \n ref=\"rootElement\"\n class=\"field-wrapper vue3-reactive-tel-input\"\n >\n <div\n v-click-outside=\"clickedOutside\"\n :class=\"['vti__dropdown', { open: open }]\"\n :style=\"[dropdownStyle]\"\n :tabindex=\"dropdownOptions.tabindex\"\n @keydown.esc=\"reset\"\n class=\"br-solid br-black-transp-10 br-1px radius-thin\"\n >\n <span class=\"flex-nowrap flex flex-v-center p-regular vti__selection\">\n <span v-if=\"dropdownOptions.showFlags\" v-html=\"activeCountryFlag\" class=\"mn-r-nano\" />\n \n <!-- Новый инпут для ввода кода страны -->\n <input\n v-if=\"dropdownOptions.showDialCodeInSelection\"\n v-model=\"dialCodeInput\"\n @input=\"onDialCodeInput\"\n @focus=\"openDropdown\"\n @blur=\"onDialCodeBlur\"\n @keydown=\"keyboardNav\"\n type=\"text\"\n class=\"vti__country-code-input\"\n :placeholder=\"`+${activeCountry?.dialCode || ''}`\"\n :disabled=\"disabled\"\n :size=\"Math.max((dialCodeInput?.length || 0) + 1, 3)\"\n maxlength=\"5\"\n />\n\n </span>\n \n <ul \n ref=\"list\" \n class=\"bs-black radius-small vti__dropdown-list\"\n v-show=\"open\" \n :class=\"dropdownOpenDirection\"\n :style=\"[listStyle]\"\n >\n <li\n v-for=\"(pb, index) in filteredAndSortedCountries\"\n class=\"flex-nowrap flex w-max\"\n :class=\"['vti__dropdown-item', getItemClass(index, pb.iso2)]\"\n :key=\"pb.iso2 + (pb.preferred ? '-preferred' : '')\"\n @click=\"choose(pb)\"\n @mousemove=\"selectedIndex = index\"\n >\n <span v-if=\"dropdownOptions.showFlags\" v-html=\"pb.flag\" class=\"mn-r-thin\"/>\n <strong>{{ pb.name }}</strong>\n <span v-if=\"dropdownOptions.showDialCodeInList\"> +{{ pb.dialCode }} </span>\n </li>\n </ul>\n </div>\n \n <input\n v-model=\"phone\"\n inputmode=\"numeric\" \n pattern=\"\\d*\"\n ref=\"input\"\n :type=\"inputOptions.type\"\n :autocomplete=\"inputOptions.autocomplete\"\n :autofocus=\"inputOptions.autofocus\"\n :class=\"['vti__input', inputOptions.styleClasses, inputClass, Iclasses]\"\n :style=\"[inputStyle, Istyles]\"\n :disabled=\"disabled\"\n :id=\"inputId !== '' ? inputId : inputOptions.id\"\n :maxlength=\"inputOptions.maxlength\"\n :name=\"inputId !== '' ? inputId : inputOptions.name\"\n :placeholder=\"parsedPlaceholder\"\n :readonly=\"inputOptions.readonly\"\n :required=\"inputOptions.required\"\n :tabindex=\"inputOptions.tabindex\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @input=\"onInput\"\n @keyup.enter=\"onEnter\"\n @keyup.space=\"onSpace\"\n />\n <slot></slot>\n </div>\n \n <!-- Validation -->\n <transition name=\"fade\">\n <div v-if=\"validation\" class=\"mn-t-thin mn-b-thin invalid-feedback\">\n * {{validation.message}}\n </div>\n </transition>\n</template>\n\n<script setup>\n import { ref, reactive, watch, computed, onMounted, nextTick } from 'vue';\n import { parsePhoneNumberFromString } from 'libphonenumber-js';\n\n import clickOutside from './click-outside.js';\n import allCountries from './all-countries.js';\n\n let vClickOutside = clickOutside\n\n const props = defineProps({\n modelValue: { type: String, default: '' },\n badClass: { type: [String, Array, Object], default: '' },\n goodClass: { type: [String, Array, Object], default: '' },\n badStyle: { type: [String, Array, Object], default: '' },\n goodStyle: { type: [String, Array, Object], default: '' },\n badInputClass: { type: [String, Array, Object], default: '' },\n goodInputClass: { type: [String, Array, Object], default: '' },\n badInputStyle: { type: [String, Array, Object], default: '' },\n goodInputStyle: { type: [String, Array, Object], default: '' },\n allCountries: { type: Array, default: () => allCountries },\n autoFormat: { type: Boolean, default: true },\n validation: { type: [Boolean, Object], default: false },\n customValidate: { type: [Boolean, RegExp], default: false },\n defaultCountry: { type: String, default: '' },\n disabled: { type: Boolean, default: false },\n autoDefaultCountry: { type: Boolean, default: true },\n ignoredCountries: { type: Array, default: () => [] },\n invalidMsg: { type: String, default: '' },\n mode: { type: String, default: 'auto' },\n onlyCountries: { type: Array, default: () => [] },\n preferredCountries: { type: Array, default: () => [] },\n validCharactersOnly: { type: Boolean, default: false },\n rootClass: { type: [String, Array, Object], default: '' },\n inputClass: { type: [String, Array, Object], default: '' },\n rootStyle: { type: [String, Array, Object], default: '' },\n dropdownStyle: { type: [String, Array, Object], default: '' },\n listStyle: { type: [String, Array, Object], default: '' },\n inputStyle: { type: [String, Array, Object], default: '' },\n inputId: { type: [String, Array, Object], default: '' },\n Placeholder: { type: [String, Object, Function], default: '' },\n dropdownOptions: { \n type: Object, \n default: () => ({\n showDialCodeInList: true,\n showDialCodeInSelection: false,\n showFlags: true,\n tabindex: 0\n })\n },\n inputOptions: { \n type: Object, \n default: () => ({ \n autocomplete: 'on',\n autofocus: false,\n id: '',\n maxlength: 25,\n name: 'telephone',\n placeholder: 'Enter a phone number',\n readonly: false,\n required: false,\n tabindex: 0,\n type: 'tel',\n styleClasses: ''\n })\n },\n });\n\n const emits = defineEmits([\n 'update:modelValue', \n 'change',\n 'validate', \n 'country-changed', \n 'open', \n 'close', \n 'blur', \n 'focus', \n 'enter', \n 'space'\n ]);\n\n // Reactive data\n const phone = ref(props.modelValue || '');\n const activeCountryCode = ref('');\n const dialCodeInput = ref('');\n const dialCodeFilter = ref('');\n const open = ref(false);\n const finishMounted = ref(false);\n const selectedIndex = ref(null);\n const typeToFindInput = ref('');\n const typeToFindTimer = ref(null);\n const dropdownOpenDirection = ref('below');\n const parsedPlaceholder = ref(props.Placeholder !== '' ? props.Placeholder : props.inputOptions.placeholder);\n\n // Element refs\n const rootElement = ref(null);\n const list = ref(null);\n const input = ref(null);\n\n // Lifecycle hooks\n onMounted(() => {\n if (props.modelValue) {\n phone.value = props.modelValue;\n }\n\n cleanInvalidCharacters();\n\n initializeCountry()\n .then(() => {\n if (!phone.value && props.inputOptions?.showDialCode && activeCountryCode.value) {\n phone.value = `+${activeCountryCode.value}`;\n }\n \n // Инициализируем dialCodeInput\n if (activeCountry.value && props.dropdownOptions.showDialCodeInSelection) {\n dialCodeInput.value = `+${activeCountry.value.dialCode}`;\n }\n \n emits('validate', phoneObject.value);\n })\n .catch(console.error)\n .then(() => {\n finishMounted.value = true;\n });\n });\n\n // Computed properties\n const activeCountry = computed(() => {\n return findCountry(activeCountryCode.value);\n });\n\n const activeCountryFlag = computed(() => {\n return activeCountry.value ? activeCountry.value.flag : null;\n });\n\n const parsedMode = computed(() => {\n if (props.mode === 'auto') {\n if (!phone.value || phone.value[0] !== '+') {\n return 'national';\n }\n return 'international';\n }\n if (!['international', 'national'].includes(props.mode)) {\n console.error('Invalid value of prop \"mode\"');\n return 'international';\n }\n return props.mode;\n });\n\n const filteredCountries = computed(() => {\n let countries = props.allCountries;\n\n // Фильтрация по onlyCountries/ignoredCountries\n if (props.onlyCountries && props.onlyCountries.length) {\n countries = countries.filter(({ iso2 }) => \n props.onlyCountries.includes(iso2.toUpperCase())\n );\n } else if (props.ignoredCountries && props.ignoredCountries.length) {\n countries = countries.filter(({ iso2 }) =>\n !props.ignoredCountries.includes(iso2.toUpperCase()) && \n !props.ignoredCountries.includes(iso2.toLowerCase())\n );\n }\n\n // Фильтрация по введенному коду страны\n if (dialCodeFilter.value) {\n const filterValue = dialCodeFilter.value.replace('+', '');\n countries = countries.filter(country => \n country.dialCode.startsWith(filterValue)\n );\n }\n\n return countries;\n });\n\n const filteredAndSortedCountries = computed(() => {\n const preferredCountries = getCountries(props.preferredCountries)\n .filter(country => {\n if (!dialCodeFilter.value) return true;\n const filterValue = dialCodeFilter.value.replace('+', '');\n return country.dialCode.startsWith(filterValue);\n })\n .map(country => ({ ...country, preferred: true }));\n\n return [...preferredCountries, ...filteredCountries.value];\n });\n\n const phoneObject = computed(() => {\n let result = {};\n\n if (phone.value?.[0] === '+') {\n result = parsePhoneNumberFromString(phone.value) || {};\n } else {\n result = parsePhoneNumberFromString(phone.value, activeCountryCode.value) || {};\n }\n\n const { metadata, ...phoneDetails } = result;\n\n let valid = result.isValid?.();\n let formatted = phone.value;\n\n if (valid) {\n formatted = result.format?.(parsedMode.value.toUpperCase(), { nationalPrefix: false });\n }\n\n if (result.country && (props.ignoredCountries.length || props.onlyCountries.length)) {\n if (!findCountry(result.country)) {\n valid = false;\n result = { ...result, country: null };\n }\n }\n\n return {\n ...phoneDetails,\n countryCode: result.country,\n valid,\n country: activeCountry.value,\n formatted,\n };\n });\n\n const classes = computed(() => {\n return phoneObject.value.valid === true ? props.goodClass : \n phoneObject.value.valid === false ? props.badClass : undefined;\n });\n\n const styles = computed(() => {\n return phoneObject.value.valid === true ? props.goodStyle : \n phoneObject.value.valid === false ? props.badStyle : undefined;\n });\n\n const Iclasses = computed(() => {\n return phoneObject.value.valid === true ? props.goodInputClass : \n phoneObject.value.valid === false ? props.badInputClass : undefined;\n });\n\n const Istyles = computed(() => {\n return phoneObject.value.valid === true ? props.goodInputStyle : \n phoneObject.value.valid === false ? props.badInputStyle : undefined;\n });\n\n // Watchers\n watch(activeCountry, (newValue, oldValue) => {\n if (!newValue && oldValue?.iso2) {\n activeCountryCode.value = oldValue.iso2;\n return;\n }\n if (newValue?.iso2) {\n emits('country-changed', newValue);\n resetPlaceholder();\n // Обновляем dialCodeInput при смене страны\n dialCodeInput.value = `+${newValue.dialCode}`;\n }\n });\n\n watch(() => phoneObject.value.countryCode, (newValue) => {\n activeCountryCode.value = newValue;\n });\n\n watch(() => phoneObject.value.valid, () => {\n emits('validate', phoneObject.value);\n });\n\n watch(() => phoneObject.value.formatted, (newValue) => {\n if (!props.autoFormat || props.customValidate) {\n return;\n }\n emitInput(newValue);\n\n nextTick(() => {\n if (newValue && !props.modelValue) {\n phone.value = newValue;\n }\n });\n });\n\n watch(() => props.inputOptions.placeholder, () => {\n resetPlaceholder();\n });\n\n watch(() => props.modelValue, (newValue, oldValue) => {\n if (!testCharacters()) {\n nextTick(() => {\n phone.value = oldValue;\n onInput();\n });\n } else {\n phone.value = newValue;\n }\n });\n\n watch(open, (isDropdownOpened) => {\n if (isDropdownOpened) {\n setDropdownPosition();\n emits('open');\n } else {\n emits('close');\n }\n });\n\n // Methods\n function onDialCodeInput() {\n // Убеждаемся, что символ + всегда есть в начале\n if (!dialCodeInput.value.startsWith('+')) {\n dialCodeInput.value = '+' + dialCodeInput.value.replace(/^\\+*/, '');\n }\n \n // Разрешаем только + и цифры\n dialCodeInput.value = dialCodeInput.value.replace(/[^\\+\\d]/g, '');\n \n // Убеждаемся что + только в начале\n const plusCount = (dialCodeInput.value.match(/\\+/g) || []).length;\n if (plusCount > 1) {\n dialCodeInput.value = '+' + dialCodeInput.value.replace(/\\+/g, '');\n }\n \n dialCodeFilter.value = dialCodeInput.value;\n open.value = true;\n \n // Автовыбор страны если код точно совпадает\n const exactMatch = filteredCountries.value.find(country => \n `+${country.dialCode}` === dialCodeInput.value\n );\n \n if (exactMatch && filteredAndSortedCountries.value.length === 1) {\n choose(exactMatch);\n }\n }\n\n function onDialCodeBlur() {\n setTimeout(() => {\n if (!dialCodeInput.value && activeCountry.value) {\n dialCodeInput.value = `+${activeCountry.value.dialCode}`;\n }\n }, 200);\n }\n\n function openDropdown() {\n if (!props.disabled) {\n open.value = true;\n }\n }\n\n function setCaretPosition(ctrl, pos) {\n if (ctrl.setSelectionRange) {\n ctrl.focus();\n ctrl.setSelectionRange(pos, pos);\n } else if (ctrl.createTextRange) {\n const range = ctrl.createTextRange();\n range.collapse(true);\n range.moveEnd('character', pos);\n range.moveStart('character', pos);\n range.select();\n }\n }\n\n function resetPlaceholder() {\n parsedPlaceholder.value = props.inputOptions.placeholder;\n }\n\n function initializeCountry() {\n return new Promise((resolve) => {\n if (phone.value?.[0] === '+') { \n resolve(); \n return; \n }\n \n if (props.defaultCountry) { \n choose(props.defaultCountry); \n resolve(); \n return; \n }\n \n const fallbackCountry = props.preferredCountries[0] || filteredCountries.value[0];\n \n if (props.autoDefaultCountry) {\n fetch('https://ip2c.org/s')\n .then((response) => response.text())\n .then((response) => {\n const result = (response || '').toString();\n if (!result || result[0] !== '1') {\n throw new Error('unable to fetch the country');\n }\n return result.substr(2, 2);\n })\n .then((res) => { \n choose(res || activeCountryCode.value); \n })\n .catch((error) => { \n console.warn(error); \n choose(fallbackCountry); \n })\n .finally(() => { \n resolve(); \n });\n } else {\n choose(fallbackCountry);\n resolve();\n }\n });\n }\n\n function getCountries(list = []) {\n return list.map((countryCode) => findCountry(countryCode)).filter(Boolean);\n }\n\n function findCountry(iso = '') {\n return filteredCountries.value.find((country) => country.iso2 === iso.toUpperCase());\n }\n\n function getItemClass(index, iso2) {\n const highlighted = selectedIndex.value === index;\n const lastPreferred = index === props.preferredCountries.length - 1;\n const preferred = props.preferredCountries.some((c) => c.toUpperCase() === iso2);\n return { highlighted, 'last-preferred': lastPreferred, preferred };\n }\n\n function choose(country) {\n let parsedCountry = typeof country === 'string' ? findCountry(country) : country;\n if (!parsedCountry) return;\n \n if (phone.value?.[0] === '+' && parsedCountry.iso2 && phoneObject.value.nationalNumber) {\n activeCountryCode.value = parsedCountry.iso2;\n phone.value = parsePhoneNumberFromString(\n phoneObject.value.nationalNumber, \n parsedCountry.iso2\n ).formatInternational();\n } else {\n activeCountryCode.value = parsedCountry.iso2;\n }\n\n dialCodeInput.value = `+${parsedCountry.dialCode}`;\n dialCodeFilter.value = '';\n \n // Закрываем дропдаун\n open.value = false;\n \n // Переводим фокус на основной инпут\n nextTick(() => {\n if (input.value) {\n input.value.focus();\n }\n });\n \n emitInput(phone.value);\n }\n\n function cleanInvalidCharacters() {\n const currentPhone = phone.value;\n\n if (props.validCharactersOnly) {\n const results = phone.value.match(/[()\\-+0-9\\s]*/g);\n phone.value = results.join('');\n }\n\n if (props.customValidate && props.customValidate instanceof RegExp) {\n const results = phone.value.match(props.customValidate);\n phone.value = results ? results.join('') : '';\n }\n\n if (currentPhone !== phone.value) {\n emitInput(phone.value);\n }\n }\n\n function testCharacters() {\n if (props.validCharactersOnly) {\n const result = /^[()\\-+0-9\\s]*$/.test(phone.value);\n if (!result) return false;\n }\n if (props.customValidate) {\n return testCustomValidate();\n }\n return true;\n }\n\n function testCustomValidate() {\n return props.customValidate instanceof RegExp ? props.customValidate.test(phone.value) : false;\n }\n\n function onInput() {\n input.value.setCustomValidity(phoneObject.valid ? '' : props.invalidMsg);\n emitInput(phone.value);\n }\n\n function emitInput(value) {\n emits('update:modelValue', value);\n\n if (phoneObject.value.valid) { \n emits('change', phoneObject.value.number);\n emits('country', phoneObject.value.number);\n } else {\n emits('country', null);\n }\n }\n\n function onBlur() {\n emits('blur');\n }\n\n function onFocus() {\n setCaretPosition(input.value, phone.value.length);\n emits('focus');\n }\n\n function onEnter() {\n emits('enter');\n }\n\n function onSpace() {\n emits('space');\n }\n\n function focus() {\n input.value.focus();\n }\n\n function toggleDropdown() {\n if (props.disabled) return;\n open.value = !open.value;\n }\n\n function clickedOutside() {\n open.value = false;\n dialCodeFilter.value = '';\n }\n\n function keyboardNav(e) {\n if (e.keyCode === 40) { // down arrow\n e.preventDefault();\n open.value = true;\n selectedIndex.value = selectedIndex.value === null ? 0 : \n Math.min(filteredAndSortedCountries.value.length - 1, selectedIndex.value + 1);\n nextTick(() => {\n const selEle = list.value.children[selectedIndex.value];\n if (selEle.offsetTop + selEle.clientHeight > list.value.scrollTop + list.value.clientHeight) {\n list.value.scrollTop = selEle.offsetTop - list.value.clientHeight + selEle.clientHeight;\n }\n });\n } else if (e.keyCode === 38) { // up arrow\n e.preventDefault();\n open.value = true;\n selectedIndex.value = selectedIndex.value === null ? \n filteredAndSortedCountries.value.length - 1 : Math.max(0, selectedIndex.value - 1);\n nextTick(() => {\n const selEle = list.value.children[selectedIndex.value];\n if (selEle.offsetTop < list.value.scrollTop) {\n list.value.scrollTop = selEle.offsetTop;\n }\n });\n } else if (e.keyCode === 13) { // enter key\n e.preventDefault();\n if (selectedIndex.value !== null) {\n choose(filteredAndSortedCountries.value[selectedIndex.value]);\n }\n } else { \n // Поиск по названию страны\n if (e.target.classList.contains('vti__country-code-input')) return;\n \n typeToFindInput.value += e.key;\n clearTimeout(typeToFindTimer);\n typeToFindTimer = setTimeout(() => {\n typeToFindInput.value = '';\n }, 700);\n \n nextTick(() => {\n const typedCountryI = filteredAndSortedCountries.value\n .slice(props.preferredCountries.length)\n .findIndex((c) => c.name.toLowerCase().startsWith(typeToFindInput.value));\n if (typedCountryI >= 0) {\n selectedIndex.value = props.preferredCountries.length + typedCountryI;\n const selEle = list.value.children[selectedIndex.value];\n const needToScroll = selEle.offsetTop < list.value.scrollTop || \n selEle.offsetTop + selEle.clientHeight > list.value.scrollTop + list.value.clientHeight;\n if (needToScroll) {\n list.value.scrollTop = selEle.offsetTop - list.value.clientHeight / 2;\n }\n }\n });\n }\n }\n\n function reset() {\n selectedIndex.value = filteredAndSortedCountries.value\n .map(c => c.iso2).indexOf(activeCountryCode.value);\n open.value = false;\n }\n\n function setDropdownPosition() {\n const spaceBelow = window.innerHeight - rootElement.value.getBoundingClientRect().bottom;\n const hasEnoughSpaceBelow = spaceBelow > 200;\n dropdownOpenDirection.value = hasEnoughSpaceBelow ? 'below' : 'above';\n }\n</script>\n\n<style lang=\"scss\">\n.vue3-reactive-tel-input {\n display: flex;\n}\n\n.vue3-reactive-tel-input.disabled .dropdown,\n.vue3-reactive-tel-input.disabled .selection,\n.vue3-reactive-tel-input.disabled input {\n cursor: no-drop;\n}\n\n.vti__dropdown {\n display: flex;\n flex-direction: column;\n align-content: center;\n justify-content: center;\n position: relative;\n padding: 0.5rem;\n cursor: pointer;\n}\n\n.vti__dropdown.show {\n max-height: 300px;\n overflow: scroll;\n}\n\n.vti__dropdown-list {\n z-index: 1;\n padding: 0;\n margin: 0;\n text-align: left;\n list-style: none;\n max-height: 200px;\n overflow-y: scroll;\n position: absolute;\n left: -1px;\n background-color: #fff;\n width: fit-content;\n}\n\n.vti__dropdown-list.below {\n top: 33px;\n}\n\n.vti__dropdown-list.above {\n top: auto;\n bottom: 100%;\n}\n\n.vti__dropdown-item {\n cursor: pointer;\n padding: 4px 15px;\n}\n\n.vti__dropdown-item.highlighted {\n background-color: #f0f0f0;\n}\n\n.vti__dropdown-item.last-preferred {\n border-bottom: 1px solid #cacaca;\n}\n\n.vti__input {\n color: inherit;\n border: none;\n border-radius: 0 2px 2px 0;\n width: 100%;\n outline: 0;\n padding-left: 7px;\n}\n\n.vti__country-code-input {\n max-width: 70px;\n border: none;\n outline: none;\n background: transparent;\n font-size: inherit;\n color: inherit;\n text-align: center;\n}\n</style>"],"names":["parsePhoneNumberFromString","list"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FieldPhone.vue.js","sources":["../../../../../src/components/FieldPhone/FieldPhone.vue"],"sourcesContent":["<template>\n <div \n :class=\"[\n rootClass, \n classes,\n $attrs.class, \n { 'bg-fourth-nano': validation }, \n { disabled: disabled }\n ]\" \n :style=\"[rootStyle, styles]\" \n ref=\"rootElement\"\n class=\"field-wrapper vue3-reactive-tel-input\"\n >\n <div\n v-click-outside=\"clickedOutside\"\n :class=\"['vti__dropdown', { open: open }]\"\n :style=\"[dropdownStyle]\"\n :tabindex=\"dropdownOptions.tabindex\"\n @keydown.esc=\"reset\"\n class=\"br-solid br-black-transp-10 br-1px radius-thin\"\n >\n <span class=\"flex-nowrap flex flex-v-center p-regular vti__selection\">\n <span v-if=\"dropdownOptions.showFlags\" v-html=\"activeCountryFlag\" class=\"mn-r-nano\" />\n \n <!-- Новый инпут для ввода кода страны -->\n <input\n v-if=\"dropdownOptions.showDialCodeInSelection\"\n v-model=\"dialCodeInput\"\n @input=\"onDialCodeInput\"\n @focus=\"openDropdown\"\n @blur=\"onDialCodeBlur\"\n @keydown=\"keyboardNav\"\n type=\"text\"\n class=\"vti__country-code-input\"\n :placeholder=\"`+${activeCountry?.dialCode || ''}`\"\n :disabled=\"disabled\"\n :size=\"Math.max((dialCodeInput?.length || 0) + 1, 3)\"\n maxlength=\"5\"\n />\n\n </span>\n \n <ul \n ref=\"list\" \n class=\"bs-black radius-small vti__dropdown-list\"\n v-show=\"open\" \n :class=\"dropdownOpenDirection\"\n :style=\"[listStyle]\"\n >\n <li\n v-for=\"(pb, index) in filteredAndSortedCountries\"\n class=\"flex-nowrap flex w-max\"\n :class=\"['vti__dropdown-item', getItemClass(index, pb.iso2)]\"\n :key=\"pb.iso2 + (pb.preferred ? '-preferred' : '')\"\n @click=\"choose(pb)\"\n @mousemove=\"selectedIndex = index\"\n >\n <span v-if=\"dropdownOptions.showFlags\" v-html=\"pb.flag\" class=\"mn-r-thin\"/>\n <strong>{{ pb.name }}</strong>\n <span v-if=\"dropdownOptions.showDialCodeInList\"> +{{ pb.dialCode }} </span>\n </li>\n </ul>\n </div>\n \n <input\n v-model=\"phone\"\n inputmode=\"numeric\" \n pattern=\"\\d*\"\n ref=\"input\"\n :type=\"inputOptions.type\"\n :autocomplete=\"inputOptions.autocomplete\"\n :autofocus=\"inputOptions.autofocus\"\n :class=\"['vti__input', inputOptions.styleClasses, inputClass, Iclasses]\"\n :style=\"[inputStyle, Istyles]\"\n :disabled=\"disabled\"\n :id=\"inputId !== '' ? inputId : inputOptions.id\"\n :maxlength=\"inputOptions.maxlength\"\n :name=\"inputId !== '' ? inputId : inputOptions.name\"\n :placeholder=\"parsedPlaceholder\"\n :readonly=\"inputOptions.readonly\"\n :required=\"inputOptions.required\"\n :tabindex=\"inputOptions.tabindex\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @input=\"onInput\"\n @keyup.enter=\"onEnter\"\n @keyup.space=\"onSpace\"\n />\n <slot></slot>\n </div>\n \n <!-- Validation -->\n <transition name=\"fade\">\n <div v-if=\"validation\" class=\"mn-t-thin mn-b-thin invalid-feedback\">\n * {{validation.message}}\n </div>\n </transition>\n</template>\n\n<script setup>\n import { ref, reactive, watch, computed, onMounted, nextTick } from 'vue';\n import { parsePhoneNumberFromString } from 'libphonenumber-js';\n\n import clickOutside from './click-outside.js';\n import allCountries from './all-countries.js';\n\n let vClickOutside = clickOutside\n\n const props = defineProps({\n modelValue: { type: String, default: '' },\n badClass: { type: [String, Array, Object], default: '' },\n goodClass: { type: [String, Array, Object], default: '' },\n badStyle: { type: [String, Array, Object], default: '' },\n goodStyle: { type: [String, Array, Object], default: '' },\n badInputClass: { type: [String, Array, Object], default: '' },\n goodInputClass: { type: [String, Array, Object], default: '' },\n badInputStyle: { type: [String, Array, Object], default: '' },\n goodInputStyle: { type: [String, Array, Object], default: '' },\n allCountries: { type: Array, default: () => allCountries },\n autoFormat: { type: Boolean, default: true },\n validation: { type: [Boolean, Object], default: false },\n customValidate: { type: [Boolean, RegExp], default: false },\n defaultCountry: { type: String, default: '' },\n disabled: { type: Boolean, default: false },\n autoDefaultCountry: { type: Boolean, default: true },\n ignoredCountries: { type: Array, default: () => [] },\n invalidMsg: { type: String, default: '' },\n mode: { type: String, default: 'auto' },\n onlyCountries: { type: Array, default: () => [] },\n preferredCountries: { type: Array, default: () => [] },\n validCharactersOnly: { type: Boolean, default: false },\n rootClass: { type: [String, Array, Object], default: '' },\n inputClass: { type: [String, Array, Object], default: '' },\n rootStyle: { type: [String, Array, Object], default: '' },\n dropdownStyle: { type: [String, Array, Object], default: '' },\n listStyle: { type: [String, Array, Object], default: '' },\n inputStyle: { type: [String, Array, Object], default: '' },\n inputId: { type: [String, Array, Object], default: '' },\n Placeholder: { type: [String, Object, Function], default: '' },\n dropdownOptions: { \n type: Object, \n default: () => ({\n showDialCodeInList: true,\n showDialCodeInSelection: false,\n showFlags: true,\n tabindex: 0\n })\n },\n inputOptions: { \n type: Object, \n default: () => ({ \n autocomplete: 'on',\n autofocus: false,\n id: '',\n maxlength: 25,\n name: 'telephone',\n placeholder: 'Enter a phone number',\n readonly: false,\n required: false,\n tabindex: 0,\n type: 'tel',\n styleClasses: ''\n })\n },\n });\n\n const emits = defineEmits([\n 'update:modelValue', \n 'change',\n 'validate', \n 'country-changed', \n 'open', \n 'close', \n 'blur', \n 'focus', \n 'enter', \n 'space'\n ]);\n\n // Reactive data\n const phone = ref(props.modelValue || '');\n const activeCountryCode = ref('');\n const dialCodeInput = ref('');\n const dialCodeFilter = ref('');\n const open = ref(false);\n const finishMounted = ref(false);\n const selectedIndex = ref(null);\n const typeToFindInput = ref('');\n const typeToFindTimer = ref(null);\n const dropdownOpenDirection = ref('below');\n const parsedPlaceholder = ref(props.Placeholder !== '' ? props.Placeholder : props.inputOptions.placeholder);\n\n // Element refs\n const rootElement = ref(null);\n const list = ref(null);\n const input = ref(null);\n\n // Lifecycle hooks\n onMounted(() => {\n if (props.modelValue) {\n phone.value = props.modelValue;\n }\n\n cleanInvalidCharacters();\n\n initializeCountry()\n .then(() => {\n if (!phone.value && props.inputOptions?.showDialCode && activeCountryCode.value) {\n phone.value = `+${activeCountryCode.value}`;\n }\n \n // Инициализируем dialCodeInput\n if (activeCountry.value && props.dropdownOptions.showDialCodeInSelection) {\n dialCodeInput.value = `+${activeCountry.value.dialCode}`;\n }\n \n emits('validate', phoneObject.value);\n })\n .catch(console.error)\n .then(() => {\n finishMounted.value = true;\n });\n });\n\n // Computed properties\n const activeCountry = computed(() => {\n return findCountry(activeCountryCode.value);\n });\n\n const activeCountryFlag = computed(() => {\n return activeCountry.value ? activeCountry.value.flag : null;\n });\n\n const parsedMode = computed(() => {\n if (props.mode === 'auto') {\n if (!phone.value || phone.value[0] !== '+') {\n return 'national';\n }\n return 'international';\n }\n if (!['international', 'national'].includes(props.mode)) {\n console.error('Invalid value of prop \"mode\"');\n return 'international';\n }\n return props.mode;\n });\n\n const filteredCountries = computed(() => {\n let countries = props.allCountries;\n\n // Фильтрация по onlyCountries/ignoredCountries\n if (props.onlyCountries && props.onlyCountries.length) {\n countries = countries.filter(({ iso2 }) => \n props.onlyCountries.includes(iso2.toUpperCase())\n );\n } else if (props.ignoredCountries && props.ignoredCountries.length) {\n countries = countries.filter(({ iso2 }) =>\n !props.ignoredCountries.includes(iso2.toUpperCase()) && \n !props.ignoredCountries.includes(iso2.toLowerCase())\n );\n }\n\n // Фильтрация по введенному коду страны\n if (dialCodeFilter.value) {\n const filterValue = dialCodeFilter.value.replace('+', '');\n countries = countries.filter(country => \n country.dialCode.startsWith(filterValue)\n );\n }\n\n return countries;\n });\n\n const filteredAndSortedCountries = computed(() => {\n const preferredCountries = getCountries(props.preferredCountries)\n .filter(country => {\n if (!dialCodeFilter.value) return true;\n const filterValue = dialCodeFilter.value.replace('+', '');\n return country.dialCode.startsWith(filterValue);\n })\n .map(country => ({ ...country, preferred: true }));\n\n return [...preferredCountries, ...filteredCountries.value];\n });\n\n const phoneObject = computed(() => {\n let result = {};\n\n if (phone.value?.[0] === '+') {\n result = parsePhoneNumberFromString(phone.value) || {};\n } else {\n result = parsePhoneNumberFromString(phone.value, activeCountryCode.value) || {};\n }\n\n const { metadata, ...phoneDetails } = result;\n\n let valid = result.isValid?.();\n let formatted = phone.value;\n\n if (valid) {\n formatted = result.format?.(parsedMode.value.toUpperCase(), { nationalPrefix: false });\n }\n\n if (result.country && (props.ignoredCountries.length || props.onlyCountries.length)) {\n if (!findCountry(result.country)) {\n valid = false;\n result = { ...result, country: null };\n }\n }\n\n return {\n ...phoneDetails,\n countryCode: result.country,\n valid,\n country: activeCountry.value,\n formatted,\n };\n });\n\n const classes = computed(() => {\n return phoneObject.value.valid === true ? props.goodClass : \n phoneObject.value.valid === false ? props.badClass : undefined;\n });\n\n const styles = computed(() => {\n return phoneObject.value.valid === true ? props.goodStyle : \n phoneObject.value.valid === false ? props.badStyle : undefined;\n });\n\n const Iclasses = computed(() => {\n return phoneObject.value.valid === true ? props.goodInputClass : \n phoneObject.value.valid === false ? props.badInputClass : undefined;\n });\n\n const Istyles = computed(() => {\n return phoneObject.value.valid === true ? props.goodInputStyle : \n phoneObject.value.valid === false ? props.badInputStyle : undefined;\n });\n\n // Watchers\n watch(activeCountry, (newValue, oldValue) => {\n if (!newValue && oldValue?.iso2) {\n activeCountryCode.value = oldValue.iso2;\n return;\n }\n if (newValue?.iso2) {\n emits('country-changed', newValue);\n resetPlaceholder();\n // Обновляем dialCodeInput при смене страны\n dialCodeInput.value = `+${newValue.dialCode}`;\n }\n });\n\n watch(() => phoneObject.value.countryCode, (newValue) => {\n activeCountryCode.value = newValue;\n });\n\n watch(() => phoneObject.value.valid, () => {\n emits('validate', phoneObject.value);\n });\n\n watch(() => phoneObject.value.formatted, (newValue) => {\n if (!props.autoFormat || props.customValidate) {\n return;\n }\n emitInput(newValue);\n\n nextTick(() => {\n if (newValue && !props.modelValue) {\n phone.value = newValue;\n }\n });\n });\n\n watch(() => props.inputOptions.placeholder, () => {\n resetPlaceholder();\n });\n\n watch(() => props.modelValue, (newValue, oldValue) => {\n if (!testCharacters()) {\n nextTick(() => {\n phone.value = oldValue;\n onInput();\n });\n } else {\n phone.value = newValue;\n }\n });\n\n watch(open, (isDropdownOpened) => {\n if (isDropdownOpened) {\n setDropdownPosition();\n emits('open');\n } else {\n emits('close');\n }\n });\n\n // Methods\n function onDialCodeInput() {\n // Убеждаемся, что символ + всегда есть в начале\n if (!dialCodeInput.value.startsWith('+')) {\n dialCodeInput.value = '+' + dialCodeInput.value.replace(/^\\+*/, '');\n }\n \n // Разрешаем только + и цифры\n dialCodeInput.value = dialCodeInput.value.replace(/[^+\\d]/g, '');\n \n // Убеждаемся что + только в начале\n const plusCount = (dialCodeInput.value.match(/\\+/g) || []).length;\n if (plusCount > 1) {\n dialCodeInput.value = '+' + dialCodeInput.value.replace(/\\+/g, '');\n }\n \n dialCodeFilter.value = dialCodeInput.value;\n open.value = true;\n \n // Автовыбор страны если код точно совпадает\n const exactMatch = filteredCountries.value.find(country => \n `+${country.dialCode}` === dialCodeInput.value\n );\n \n if (exactMatch && filteredAndSortedCountries.value.length === 1) {\n choose(exactMatch);\n }\n }\n\n function onDialCodeBlur() {\n setTimeout(() => {\n if (!dialCodeInput.value && activeCountry.value) {\n dialCodeInput.value = `+${activeCountry.value.dialCode}`;\n }\n }, 200);\n }\n\n function openDropdown() {\n if (!props.disabled) {\n open.value = true;\n }\n }\n\n function setCaretPosition(ctrl, pos) {\n if (ctrl.setSelectionRange) {\n ctrl.focus();\n ctrl.setSelectionRange(pos, pos);\n } else if (ctrl.createTextRange) {\n const range = ctrl.createTextRange();\n range.collapse(true);\n range.moveEnd('character', pos);\n range.moveStart('character', pos);\n range.select();\n }\n }\n\n function resetPlaceholder() {\n parsedPlaceholder.value = props.inputOptions.placeholder;\n }\n\n function initializeCountry() {\n return new Promise((resolve) => {\n if (phone.value?.[0] === '+') { \n resolve(); \n return; \n }\n \n if (props.defaultCountry) { \n choose(props.defaultCountry); \n resolve(); \n return; \n }\n \n const fallbackCountry = props.preferredCountries[0] || filteredCountries.value[0];\n \n if (props.autoDefaultCountry) {\n fetch('https://ip2c.org/s')\n .then((response) => response.text())\n .then((response) => {\n const result = (response || '').toString();\n if (!result || result[0] !== '1') {\n throw new Error('unable to fetch the country');\n }\n return result.substr(2, 2);\n })\n .then((res) => { \n choose(res || activeCountryCode.value); \n })\n .catch((error) => { \n console.warn(error); \n choose(fallbackCountry); \n })\n .finally(() => { \n resolve(); \n });\n } else {\n choose(fallbackCountry);\n resolve();\n }\n });\n }\n\n function getCountries(list = []) {\n return list.map((countryCode) => findCountry(countryCode)).filter(Boolean);\n }\n\n function findCountry(iso = '') {\n return filteredCountries.value.find((country) => country.iso2 === iso.toUpperCase());\n }\n\n function getItemClass(index, iso2) {\n const highlighted = selectedIndex.value === index;\n const lastPreferred = index === props.preferredCountries.length - 1;\n const preferred = props.preferredCountries.some((c) => c.toUpperCase() === iso2);\n return { highlighted, 'last-preferred': lastPreferred, preferred };\n }\n\n function choose(country) {\n let parsedCountry = typeof country === 'string' ? findCountry(country) : country;\n if (!parsedCountry) return;\n \n if (phone.value?.[0] === '+' && parsedCountry.iso2 && phoneObject.value.nationalNumber) {\n activeCountryCode.value = parsedCountry.iso2;\n phone.value = parsePhoneNumberFromString(\n phoneObject.value.nationalNumber, \n parsedCountry.iso2\n ).formatInternational();\n } else {\n activeCountryCode.value = parsedCountry.iso2;\n }\n\n dialCodeInput.value = `+${parsedCountry.dialCode}`;\n dialCodeFilter.value = '';\n \n // Закрываем дропдаун\n open.value = false;\n \n // Переводим фокус на основной инпут\n nextTick(() => {\n if (input.value) {\n input.value.focus();\n }\n });\n \n emitInput(phone.value);\n }\n\n function cleanInvalidCharacters() {\n const currentPhone = phone.value;\n\n if (props.validCharactersOnly) {\n const results = phone.value.match(/[()\\-+0-9\\s]*/g);\n phone.value = results.join('');\n }\n\n if (props.customValidate && props.customValidate instanceof RegExp) {\n const results = phone.value.match(props.customValidate);\n phone.value = results ? results.join('') : '';\n }\n\n if (currentPhone !== phone.value) {\n emitInput(phone.value);\n }\n }\n\n function testCharacters() {\n if (props.validCharactersOnly) {\n const result = /^[()\\-+0-9\\s]*$/.test(phone.value);\n if (!result) return false;\n }\n if (props.customValidate) {\n return testCustomValidate();\n }\n return true;\n }\n\n function testCustomValidate() {\n return props.customValidate instanceof RegExp ? props.customValidate.test(phone.value) : false;\n }\n\n function onInput() {\n input.value.setCustomValidity(phoneObject.valid ? '' : props.invalidMsg);\n emitInput(phone.value);\n }\n\n function emitInput(value) {\n emits('update:modelValue', value);\n\n if (phoneObject.value.valid) { \n emits('change', phoneObject.value.number);\n emits('country', phoneObject.value.number);\n } else {\n emits('country', null);\n }\n }\n\n function onBlur() {\n emits('blur');\n }\n\n function onFocus() {\n setCaretPosition(input.value, phone.value.length);\n emits('focus');\n }\n\n function onEnter() {\n emits('enter');\n }\n\n function onSpace() {\n emits('space');\n }\n\n function focus() {\n input.value.focus();\n }\n\n function toggleDropdown() {\n if (props.disabled) return;\n open.value = !open.value;\n }\n\n function clickedOutside() {\n open.value = false;\n dialCodeFilter.value = '';\n }\n\n function keyboardNav(e) {\n if (e.keyCode === 40) { // down arrow\n e.preventDefault();\n open.value = true;\n selectedIndex.value = selectedIndex.value === null ? 0 : \n Math.min(filteredAndSortedCountries.value.length - 1, selectedIndex.value + 1);\n nextTick(() => {\n const selEle = list.value.children[selectedIndex.value];\n if (selEle.offsetTop + selEle.clientHeight > list.value.scrollTop + list.value.clientHeight) {\n list.value.scrollTop = selEle.offsetTop - list.value.clientHeight + selEle.clientHeight;\n }\n });\n } else if (e.keyCode === 38) { // up arrow\n e.preventDefault();\n open.value = true;\n selectedIndex.value = selectedIndex.value === null ? \n filteredAndSortedCountries.value.length - 1 : Math.max(0, selectedIndex.value - 1);\n nextTick(() => {\n const selEle = list.value.children[selectedIndex.value];\n if (selEle.offsetTop < list.value.scrollTop) {\n list.value.scrollTop = selEle.offsetTop;\n }\n });\n } else if (e.keyCode === 13) { // enter key\n e.preventDefault();\n if (selectedIndex.value !== null) {\n choose(filteredAndSortedCountries.value[selectedIndex.value]);\n }\n } else { \n // Поиск по названию страны\n if (e.target.classList.contains('vti__country-code-input')) return;\n \n typeToFindInput.value += e.key;\n clearTimeout(typeToFindTimer);\n typeToFindTimer = setTimeout(() => {\n typeToFindInput.value = '';\n }, 700);\n \n nextTick(() => {\n const typedCountryI = filteredAndSortedCountries.value\n .slice(props.preferredCountries.length)\n .findIndex((c) => c.name.toLowerCase().startsWith(typeToFindInput.value));\n if (typedCountryI >= 0) {\n selectedIndex.value = props.preferredCountries.length + typedCountryI;\n const selEle = list.value.children[selectedIndex.value];\n const needToScroll = selEle.offsetTop < list.value.scrollTop || \n selEle.offsetTop + selEle.clientHeight > list.value.scrollTop + list.value.clientHeight;\n if (needToScroll) {\n list.value.scrollTop = selEle.offsetTop - list.value.clientHeight / 2;\n }\n }\n });\n }\n }\n\n function reset() {\n selectedIndex.value = filteredAndSortedCountries.value\n .map(c => c.iso2).indexOf(activeCountryCode.value);\n open.value = false;\n }\n\n function setDropdownPosition() {\n const spaceBelow = window.innerHeight - rootElement.value.getBoundingClientRect().bottom;\n const hasEnoughSpaceBelow = spaceBelow > 200;\n dropdownOpenDirection.value = hasEnoughSpaceBelow ? 'below' : 'above';\n }\n</script>\n\n<style lang=\"scss\">\n.vue3-reactive-tel-input {\n display: flex;\n}\n\n.vue3-reactive-tel-input.disabled .dropdown,\n.vue3-reactive-tel-input.disabled .selection,\n.vue3-reactive-tel-input.disabled input {\n cursor: no-drop;\n}\n\n.vti__dropdown {\n display: flex;\n flex-direction: column;\n align-content: center;\n justify-content: center;\n position: relative;\n padding: 0.5rem;\n cursor: pointer;\n}\n\n.vti__dropdown.show {\n max-height: 300px;\n overflow: scroll;\n}\n\n.vti__dropdown-list {\n z-index: 1;\n padding: 0;\n margin: 0;\n text-align: left;\n list-style: none;\n max-height: 200px;\n overflow-y: scroll;\n position: absolute;\n left: -1px;\n background-color: #fff;\n width: fit-content;\n}\n\n.vti__dropdown-list.below {\n top: 33px;\n}\n\n.vti__dropdown-list.above {\n top: auto;\n bottom: 100%;\n}\n\n.vti__dropdown-item {\n cursor: pointer;\n padding: 4px 15px;\n}\n\n.vti__dropdown-item.highlighted {\n background-color: #f0f0f0;\n}\n\n.vti__dropdown-item.last-preferred {\n border-bottom: 1px solid #cacaca;\n}\n\n.vti__input {\n color: inherit;\n border: none;\n border-radius: 0 2px 2px 0;\n width: 100%;\n outline: 0;\n padding-left: 7px;\n}\n\n.vti__country-code-input {\n max-width: 70px;\n border: none;\n outline: none;\n background: transparent;\n font-size: inherit;\n color: inherit;\n text-align: center;\n}\n</style>"],"names":["parsePhoneNumberFromString","list"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Loader.vue.js","sources":["../../../../../src/components/Loader/Loader.vue"],"sourcesContent":["<template>\n <div class=\"circular-loader pos-relative z-index-1 w-100 h-100 w-max-2r h-max-2r\" :class=\"{ 'circular-loader-centered': centered }\">\n <svg viewBox=\"25 25 50 50\">\n <circle class=\"circular-loader-fill\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-width=\"4\" stroke-miterlimit=\"10\" />\n <circle class=\"circular-loader-circle\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-width=\"4\" stroke-miterlimit=\"10\" />\n </svg>\n <div v-if=\"progress\" class=\"progress-text\">{{ progress }}</div>\n <div v-if=\"status\" class=\"uppercase t-semi w-m-10r status-text\">{{ status }}</div>\n </div>\n</template>\n\n<script>\nexport default {\n props: {\n progress: {\n type: Number,\n default: null,\n },\n status: {\n type: String,\n default: null,\n },\n centered: {\n type: Boolean,\n default:
|
|
1
|
+
{"version":3,"file":"Loader.vue.js","sources":["../../../../../src/components/Loader/Loader.vue"],"sourcesContent":["<template>\n <div class=\"circular-loader pos-relative z-index-1 w-100 h-100 w-max-2r h-max-2r\" :class=\"{ 'circular-loader-centered': centered }\">\n <svg viewBox=\"25 25 50 50\">\n <circle class=\"circular-loader-fill\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-width=\"4\" stroke-miterlimit=\"10\" />\n <circle class=\"circular-loader-circle\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-width=\"4\" stroke-miterlimit=\"10\" />\n </svg>\n <div v-if=\"progress\" class=\"progress-text\">{{ progress }}</div>\n <div v-if=\"status\" class=\"uppercase t-semi w-m-10r status-text\">{{ status }}</div>\n </div>\n</template>\n\n<script>\nexport default {\n props: {\n progress: {\n type: Number,\n default: null,\n },\n status: {\n type: String,\n default: null,\n },\n centered: {\n type: Boolean,\n default: false\n },\n },\n};\n</script>\n\n<style>\n.circular-loader-centered {\n top: calc(50% - 1rem);\n left: calc(50% - 1rem);\n}\n\n.circular-loader svg {\n animation: rotate 2s linear infinite;\n}\n\n.circular-loader-circle {\n stroke-dasharray: 1, 200;\n stroke-dashoffset: 0;\n stroke-linecap: round;\n stroke: rgb(var(--main));\n animation: dash 1.5s ease-in-out infinite;\n}\n\n.circular-loader-fill {\n stroke-linecap: round;\n stroke: rgba(var(--black),0.2);\n}\n\n.progress-text {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 0.8rem;\n color: rgb(var(--main));;\n}\n\n.status-text {\n position: absolute;\n top: 120%;\n left: calc(50% - 5rem);\n font-size: 0.8rem;\n width: 10rem !important;\n text-align: center;\n}\n\n@keyframes rotate {\n 100% {\n transform: rotate(360deg);\n }\n}\n\n@keyframes dash {\n 0% {\n stroke-dasharray: 1, 200;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 89, 200;\n stroke-dashoffset: -35;\n }\n 100% {\n stroke-dasharray: 1, 200;\n stroke-dashoffset: -124;\n }\n}\n</style>"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_createCommentVNode"],"mappings":";;;AAYA,MAAK,YAAU;AAAA,EACb,OAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;IAEX,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA;IAEX,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;;AAGf;;EA3BA,KAAA;AAAA,EAMyB,OAAM;;;EAN/B,KAAA;AAAA,EAOuB,OAAM;;;sBAN3BA,mBAOM,OAAA;AAAA,IAPD,OADPC,eAAA,CACa,wEAAsE,EAAA,4BAAuC,OAAA,UAAQ,CAAA;AAAA;8BAC9HC,mBAGM,OAAA,EAHD,SAAQ,iBAAa;AAAA,MACxBA,mBAAkH,UAAA;AAAA,QAA1G,OAAM;AAAA,QAAuB,IAAG;AAAA,QAAK,IAAG;AAAA,QAAK,GAAE;AAAA,QAAK,MAAK;AAAA,QAAO,gBAAa;AAAA,QAAI,qBAAkB;AAAA;MAC3GA,mBAAoH,UAAA;AAAA,QAA5G,OAAM;AAAA,QAAyB,IAAG;AAAA,QAAK,IAAG;AAAA,QAAK,GAAE;AAAA,QAAK,MAAK;AAAA,QAAO,gBAAa;AAAA,QAAI,qBAAkB;AAAA;;IAEpG,OAAA,yBAAXF,mBAA+D,OAA/D,YAA+DG,gBAAjB,OAAA,QAAQ,GAAA,CAAA,KAN1DC,mBAAA,IAAA,IAAA;AAAA,IAOe,OAAA,uBAAXJ,mBAAkF,OAAlF,YAAkFG,gBAAf,OAAA,MAAM,GAAA,CAAA,KAP7EC,mBAAA,IAAA,IAAA;AAAA;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createElementBlock, openBlock, renderSlot } from "vue";
|
|
2
|
-
/* empty css
|
|
2
|
+
/* empty css */
|
|
3
3
|
const _hoisted_1 = { class: "mobile-menu-section pd-r-zero pd-t-thin pd-b-thin pd-medium radius-medium" };
|
|
4
4
|
const _sfc_main = {
|
|
5
5
|
__name: "Menu",
|
|
@@ -14,4 +14,4 @@ const _sfc_main = {
|
|
|
14
14
|
export {
|
|
15
15
|
_sfc_main as default
|
|
16
16
|
};
|
|
17
|
-
//# sourceMappingURL=Menu.
|
|
17
|
+
//# sourceMappingURL=Menu.vue2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Menu.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ref, watch, createElementBlock, openBlock, Fragment, renderList, normalizeStyle, normalizeClass, unref, toDisplayString } from "vue";
|
|
2
2
|
import { useGlobalMixins } from "../../modules/core/views/mixins/mixins.js";
|
|
3
|
-
/* empty css
|
|
3
|
+
/* empty css */
|
|
4
4
|
const _hoisted_1 = { class: "flex-nowrap flex-v-center flex pos-relative" };
|
|
5
5
|
const _hoisted_2 = ["onClick"];
|
|
6
6
|
const _sfc_main = {
|
|
@@ -71,4 +71,4 @@ const _sfc_main = {
|
|
|
71
71
|
export {
|
|
72
72
|
_sfc_main as default
|
|
73
73
|
};
|
|
74
|
-
//# sourceMappingURL=Tab.
|
|
74
|
+
//# sourceMappingURL=Tab.vue2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tab.vue2.js","sources":["../../../../../src/components/Tab/Tab.vue"],"sourcesContent":["<template>\n <div class=\"flex-nowrap flex-v-center flex pos-relative\">\n <button \n v-for=\"(tab, index) in tabs\" \n :key=\"index\" \n @click=\"handleTabClick(index, tab)\" \n class=\"z-index-1 t-center cursor-pointer\"\n :style=\"isSelected(index, tab) ? 'background: rgb(var(--main)) !important' : ''\"\n :class=\"[\n isSelected(index, tab) ? 'bg-main' : '',\n replaceClasses('pd-small pd-r-medium pd-l-medium w-max pd-small radius-small', classTab)\n ]\"\n >\n {{tab.name || tab.label}}\n </button>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from 'vue'\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\nconst { replaceClasses } = useGlobalMixins();\nconst emit = defineEmits(['update:selected', 'tab-click']);\n\nconst props = defineProps({\n tabs: Array,\n classTab: String,\n selected: [String, Number],\n modelValue: [String, Number],\n callback: Function\n})\n\nconst selectedTab = ref(0)\n\n// Handle both v-model and selected prop for backward compatibility\nconst updateSelectedIndex = () => {\n if (props.modelValue !== undefined) {\n const selectedIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (selectedIndex !== -1) {\n selectedTab.value = selectedIndex\n }\n } else if (props.selected !== undefined) {\n const selectedIndex = props.tabs.findIndex(tab => tab.value === props.selected)\n if (selectedIndex !== -1) {\n selectedTab.value = selectedIndex\n }\n }\n}\n\n// Initial setup\nupdateSelectedIndex()\n\n// Watch for changes in selected or modelValue props\nwatch(() => props.selected, updateSelectedIndex)\nwatch(() => props.modelValue, updateSelectedIndex)\n\n// Check if tab is selected\nconst isSelected = (index, tab) => {\n if (props.modelValue !== undefined) {\n return tab.value === props.modelValue\n } else if (props.selected !== undefined) {\n return tab.value === props.selected\n }\n return index === selectedTab.value\n}\n\n// Handle tab click\nfunction handleTabClick(index, tab) {\n selectedTab.value = index\n \n // Emit both events for flexibility\n emit('update:selected', tab.value)\n emit('tab-click', { index, tab })\n \n // For v-model support\n if (props.modelValue !== undefined) {\n emit('update:modelValue', tab.value)\n }\n \n // Call callback if provided\n if (props.callback) props.callback(tab)\n}\n</script>\n\n<style lang=\"scss\">\n.tab-selector {\n position: absolute;\n width: 50%;\n height: 100%;\n left: 0;\n top: 0;\n z-index: 0;\n transition: left 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAsBA,UAAM,EAAE,eAAc,IAAK,gBAAe;AAC1C,UAAM,OAAO;AAEb,UAAM,QAAQ;AAQd,UAAM,cAAc,IAAI,CAAC;AAGzB,UAAM,sBAAsB,MAAM;AAChC,UAAI,MAAM,eAAe,QAAW;AAClC,cAAM,gBAAgB,MAAM,KAAK,UAAU,SAAO,IAAI,UAAU,MAAM,UAAU;AAChF,YAAI,kBAAkB,IAAI;AACxB,sBAAY,QAAQ;AAAA,QACtB;AAAA,MACF,WAAW,MAAM,aAAa,QAAW;AACvC,cAAM,gBAAgB,MAAM,KAAK,UAAU,SAAO,IAAI,UAAU,MAAM,QAAQ;AAC9E,YAAI,kBAAkB,IAAI;AACxB,sBAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAGA,wBAAmB;AAGnB,UAAM,MAAM,MAAM,UAAU,mBAAmB;AAC/C,UAAM,MAAM,MAAM,YAAY,mBAAmB;AAGjD,UAAM,aAAa,CAAC,OAAO,QAAQ;AACjC,UAAI,MAAM,eAAe,QAAW;AAClC,eAAO,IAAI,UAAU,MAAM;AAAA,MAC7B,WAAW,MAAM,aAAa,QAAW;AACvC,eAAO,IAAI,UAAU,MAAM;AAAA,MAC7B;AACA,aAAO,UAAU,YAAY;AAAA,IAC/B;AAGA,aAAS,eAAe,OAAO,KAAK;AAClC,kBAAY,QAAQ;AAGpB,WAAK,mBAAmB,IAAI,KAAK;AACjC,WAAK,aAAa,EAAE,OAAO,IAAG,CAAE;AAGhC,UAAI,MAAM,eAAe,QAAW;AAClC,aAAK,qBAAqB,IAAI,KAAK;AAAA,MACrC;AAGA,UAAI,MAAM,SAAU,OAAM,SAAS,GAAG;AAAA,IACxC;;;;;;;;;;;;;;;;;;"}
|
|
@@ -5,7 +5,8 @@ const _sfc_main = {
|
|
|
5
5
|
props: {
|
|
6
6
|
items: Array,
|
|
7
7
|
state: Array,
|
|
8
|
-
parentId: { type: String, default: null }
|
|
8
|
+
parentId: { type: String, default: null },
|
|
9
|
+
dragndrop: { type: Boolean, default: true }
|
|
9
10
|
},
|
|
10
11
|
emits: ["update"],
|
|
11
12
|
setup(__props, { emit: __emit }) {
|
|
@@ -40,6 +41,7 @@ const _sfc_main = {
|
|
|
40
41
|
}
|
|
41
42
|
return (_ctx, _cache) => {
|
|
42
43
|
return openBlock(), createBlock(unref(VueDraggableNext), mergeProps(dragOptions, {
|
|
44
|
+
disabled: !__props.dragndrop,
|
|
43
45
|
class: "dragArea list-group w-full",
|
|
44
46
|
list: __props.items,
|
|
45
47
|
handle: ".my-handle",
|
|
@@ -56,6 +58,7 @@ const _sfc_main = {
|
|
|
56
58
|
items: item.children,
|
|
57
59
|
state: __props.state,
|
|
58
60
|
"parent-id": item._id,
|
|
61
|
+
dragndrop: __props.dragndrop,
|
|
59
62
|
onUpdate: emitChange,
|
|
60
63
|
class: "pd-l-medium"
|
|
61
64
|
}, {
|
|
@@ -63,12 +66,12 @@ const _sfc_main = {
|
|
|
63
66
|
renderSlot(_ctx.$slots, "default", { item: item2 })
|
|
64
67
|
]),
|
|
65
68
|
_: 2
|
|
66
|
-
}, 1032, ["items", "state", "parent-id"])
|
|
69
|
+
}, 1032, ["items", "state", "parent-id", "dragndrop"])
|
|
67
70
|
]);
|
|
68
71
|
}), 128))
|
|
69
72
|
]),
|
|
70
73
|
_: 3
|
|
71
|
-
}, 16, ["list"]);
|
|
74
|
+
}, 16, ["disabled", "list"]);
|
|
72
75
|
};
|
|
73
76
|
}
|
|
74
77
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tree.vue.js","sources":["../../../../../src/components/Tree/Tree.vue"],"sourcesContent":["<template>\n <VueDraggableNext\n v-bind=\"dragOptions\"
|
|
1
|
+
{"version":3,"file":"Tree.vue.js","sources":["../../../../../src/components/Tree/Tree.vue"],"sourcesContent":["<template>\n <VueDraggableNext\n v-bind=\"dragOptions\"\n :disabled=\"!dragndrop\"\n class=\"dragArea list-group w-full\"\n :list=\"items\"\n :handle=\"'.my-handle'\"\n @change=\"handleChange\"\n >\n <div v-for=\"item in items\" :key=\"item._id\" class=\"mn-t-thin radius-medium mn-b-thin\">\n <slot\n :item=\"item\"\n >\n </slot>\n <Tree\n :items=\"item.children\"\n :state=\"state\"\n :parent-id=\"item._id\"\n :dragndrop=\"dragndrop\"\n @update=\"emitChange\"\n class=\"pd-l-medium\"\n v-slot=\"{ item }\"\n >\n <slot\n :item=\"item\"\n >\n </slot>\n </Tree>\n </div>\n </VueDraggableNext>\n</template>\n\n<script setup>\nimport { VueDraggableNext } from 'vue-draggable-next';\n\nimport Tree from './Tree.vue';\n\nconst props = defineProps({\n items: Array,\n state: Array,\n parentId: { type: String, default: null },\n dragndrop: { type: Boolean, default: true }\n});\n\nconst emits = defineEmits(['update']);\n\nconst dragOptions = {\n animation: 200,\n group: 'category',\n ghostClass: 'ghost'\n};\n\nfunction findCategoryAndUpdateParent(items, targetId, parentId = null) {\n for (const item of items) {\n if (item._id === targetId) {\n item.parent = parentId;\n return item;\n }\n \n if (item.children) {\n const found = findCategoryAndUpdateParent(item.children, targetId, item._id);\n if (found) {\n return found;\n }\n }\n }\n return null;\n}\n\nfunction updateOrders(items, startOrder = 0) {\n let currentOrder = startOrder;\n \n items.forEach(item => {\n item.order = currentOrder++;\n \n if (item.children?.length) {\n currentOrder = updateOrders(item.children, currentOrder);\n }\n });\n \n return currentOrder;\n}\n\nfunction handleChange(event) {\n console.log('event order is', event)\n if (!event.added && !event.moved) return;\n \n let movedItem = null;\n \n if (event.added) {\n // Элемент добавлен с другого уровня\n movedItem = event.added.element;\n // Устанавливаем правильный parent для этого уровня\n movedItem.parent = props.parentId;\n } else if (event.moved) {\n // Элемент перемещен на том же уровне (только изменение порядка)\n movedItem = props.items[event.moved.newIndex];\n // Parent не меняется при перемещении на том же уровне\n }\n \n // Обновляем order для текущего уровня\n props.items.forEach((item, index) => {\n item.order = index;\n });\n \n // Передаем полную информацию об изменении\n emits('update', {\n movedItem: movedItem,\n parentId: props.parentId,\n items: props.items\n });\n}\n\nfunction emitChange(event) {\n emits('update', event);\n}\n</script> "],"names":[],"mappings":";;;;;;;;;;;;AAqCA,UAAM,QAAQ;AAOd,UAAM,QAAQ;AAEd,UAAM,cAAc;AAAA,MAClB,WAAW;AAAA,MACX,OAAO;AAAA,MACP,YAAY;AAAA,IACd;AAiCA,aAAS,aAAa,OAAO;AAC3B,cAAQ,IAAI,kBAAkB,KAAK;AACnC,UAAI,CAAC,MAAM,SAAS,CAAC,MAAM,MAAO;AAElC,UAAI,YAAY;AAEhB,UAAI,MAAM,OAAO;AAEf,oBAAY,MAAM,MAAM;AAExB,kBAAU,SAAS,MAAM;AAAA,MAC3B,WAAW,MAAM,OAAO;AAEtB,oBAAY,MAAM,MAAM,MAAM,MAAM,QAAQ;AAAA,MAE9C;AAGA,YAAM,MAAM,QAAQ,CAAC,MAAM,UAAU;AACnC,aAAK,QAAQ;AAAA,MACf,CAAC;AAGD,YAAM,UAAU;AAAA,QACd;AAAA,QACA,UAAU,MAAM;AAAA,QAChB,OAAO,MAAM;AAAA,MACjB,CAAG;AAAA,IACH;AAEA,aAAS,WAAW,OAAO;AACzB,YAAM,UAAU,KAAK;AAAA,IACvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -2,7 +2,8 @@ import * as auth from "./views/store/auth.js";
|
|
|
2
2
|
import * as twofa from "./views/store/twofa.js";
|
|
3
3
|
import * as users from "./views/store/users.js";
|
|
4
4
|
import addRoutes from "../core/views/router/addRoutes.js";
|
|
5
|
-
import {
|
|
5
|
+
import { getAuthRoutes } from "./views/router/auth.router.js";
|
|
6
|
+
import { getUsersRoutes } from "./views/router/users.router.js";
|
|
6
7
|
import * as auth_validation from "./views/middlewares/auth.validation.js";
|
|
7
8
|
import { i18nManager } from "../core/views/classes/i18n.manager.js";
|
|
8
9
|
import locales from "./locales/index.js";
|
|
@@ -27,10 +28,10 @@ const importsTime = performance.measure("loading-36-imports", "loading-36-stores
|
|
|
27
28
|
console.log(`[LOADING 36] Router/middleware/locales imports completed in ${importsTime.duration.toFixed(2)}ms`);
|
|
28
29
|
function initializeAuth(app, store, router, options = {}) {
|
|
29
30
|
i18nManager.register("auth", locales);
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
});
|
|
31
|
+
const authRoute = getAuthRoutes(options);
|
|
32
|
+
const usersRoute = getUsersRoutes(options);
|
|
33
|
+
addRoutes(router, { ...authRoute.config, parentName: authRoute.parentName });
|
|
34
|
+
addRoutes(router, { ...usersRoute.config, parentName: usersRoute.parentName });
|
|
34
35
|
store.addStore("auth", auth);
|
|
35
36
|
store.addStore("twofa", twofa);
|
|
36
37
|
store.addStore("users", users);
|
|
@@ -45,7 +46,8 @@ const ModuleAuth = {
|
|
|
45
46
|
storeUsers: users
|
|
46
47
|
},
|
|
47
48
|
router: {
|
|
48
|
-
|
|
49
|
+
getAuthRoutes,
|
|
50
|
+
getUsersRoutes
|
|
49
51
|
},
|
|
50
52
|
middlewares: {
|
|
51
53
|
validationAuth: auth_validation
|
|
@@ -69,7 +71,8 @@ export {
|
|
|
69
71
|
default10 as SignUp,
|
|
70
72
|
default12 as SliderFeatures,
|
|
71
73
|
ModuleAuth as default,
|
|
72
|
-
|
|
74
|
+
getAuthRoutes,
|
|
75
|
+
getUsersRoutes,
|
|
73
76
|
initializeAuth as initialize,
|
|
74
77
|
auth as storeAuth,
|
|
75
78
|
twofa as storeTwofa,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.client.js","sources":["../../../../../src/modules/auth/auth.client.js"],"sourcesContent":["// [LOADING 36] Auth module import started\nperformance.mark('loading-36-start');\nconsole.log('[LOADING 36] Auth module import started...');\n\n// Functional imports (needed for initialize function)\nimport * as storeAuth from './views/store/auth.js';\nimport * as storeTwofa from './views/store/twofa.js';\nimport * as storeUsers from './views/store/users.js';\n\nperformance.mark('loading-36-stores-end');\nconst storesTime = performance.measure('loading-36-stores', 'loading-36-start', 'loading-36-stores-end');\nconsole.log(`[LOADING 36] Store imports completed in ${storesTime.duration.toFixed(2)}ms`);\n\n// Router\nimport addRoutes from '@martyrs/src/modules/core/views/router/addRoutes.js';\nimport {
|
|
1
|
+
{"version":3,"file":"auth.client.js","sources":["../../../../../src/modules/auth/auth.client.js"],"sourcesContent":["// [LOADING 36] Auth module import started\nperformance.mark('loading-36-start');\nconsole.log('[LOADING 36] Auth module import started...');\n\n// Functional imports (needed for initialize function)\nimport * as storeAuth from './views/store/auth.js';\nimport * as storeTwofa from './views/store/twofa.js';\nimport * as storeUsers from './views/store/users.js';\n\nperformance.mark('loading-36-stores-end');\nconst storesTime = performance.measure('loading-36-stores', 'loading-36-start', 'loading-36-stores-end');\nconsole.log(`[LOADING 36] Store imports completed in ${storesTime.duration.toFixed(2)}ms`);\n\n// Router\nimport addRoutes from '@martyrs/src/modules/core/views/router/addRoutes.js';\nimport { getAuthRoutes } from './views/router/auth.router.js';\nimport { getUsersRoutes } from './views/router/users.router.js';\n\n// Middlewares\nimport * as validationAuth from '@martyrs/src/modules/auth/views/middlewares/auth.validation.js';\n\nimport { i18nManager } from '@martyrs/src/modules/core/views/classes/i18n.manager.js';\n\nimport locales from './locales/index.js';\n\nperformance.mark('loading-36-imports-end');\nconst importsTime = performance.measure('loading-36-imports', 'loading-36-stores-end', 'loading-36-imports-end');\nconsole.log(`[LOADING 36] Router/middleware/locales imports completed in ${importsTime.duration.toFixed(2)}ms`);\n\n// Component re-exports (enables tree shaking)\nexport { default as Auth } from './views/components/layouts/Auth.vue';\nexport { default as EnterCode } from './views/components/pages/EnterCode.vue';\nexport { default as EnterPassword } from './views/components/pages/EnterPassword.vue';\nexport { default as Invite } from './views/components/pages/Invite.vue';\nexport { default as Profile } from './views/components/pages/Profile.vue';\nexport { default as ProfileEdit } from './views/components/pages/ProfileEdit.vue';\nexport { default as ResetPassword } from './views/components/pages/ResetPassword.vue';\nexport { default as SignIn } from './views/components/pages/SignIn.vue';\nexport { default as SignUp } from './views/components/pages/SignUp.vue';\nexport { default as FeaturedUsers } from './views/components/sections/FeaturedUsers.vue';\nexport { default as SliderFeatures } from './views/components/sections/SliderFeatures.vue';\n\n// Пример функции инициализации для модуля аутентификации\nfunction initializeAuth(app, store, router, options = {}) {\n i18nManager.register('auth', locales);\n\n const authRoute = getAuthRoutes(options);\n const usersRoute = getUsersRoutes(options);\n\n addRoutes(router, { ...authRoute.config, parentName: authRoute.parentName });\n addRoutes(router, { ...usersRoute.config, parentName: usersRoute.parentName });\n\n store.addStore('auth', storeAuth);\n store.addStore('twofa', storeTwofa);\n store.addStore('users', storeUsers);\n\n app.provide('store', store);\n}\n\nconst ModuleAuth = {\n initialize: initializeAuth,\n views: {\n store: {\n storeAuth,\n storeTwofa,\n storeUsers,\n },\n router: {\n getAuthRoutes,\n getUsersRoutes,\n },\n middlewares: {\n validationAuth,\n },\n },\n};\n\n// Functional exports\nexport {\n storeAuth,\n storeTwofa,\n storeUsers,\n getAuthRoutes,\n getUsersRoutes,\n validationAuth,\n initializeAuth as initialize,\n};\n\n// [LOADING 36] Auth module import completed\nperformance.mark('loading-36-end');\nperformance.measure('loading-36-total', 'loading-36-start', 'loading-36-end');\nconst totalTime = performance.getEntriesByName('loading-36-total')[0];\nconsole.log(`[LOADING 36] Auth module fully imported in ${totalTime?.duration?.toFixed(2)}ms`);\n\nexport default ModuleAuth;\n"],"names":["storeAuth","storeTwofa","storeUsers","validationAuth"],"mappings":";;;;;;;;;;;;;;;;;;;;AACA,YAAY,KAAK,kBAAkB;AACnC,QAAQ,IAAI,4CAA4C;AAOxD,YAAY,KAAK,uBAAuB;AACxC,MAAM,aAAa,YAAY,QAAQ,qBAAqB,oBAAoB,uBAAuB;AACvG,QAAQ,IAAI,2CAA2C,WAAW,SAAS,QAAQ,CAAC,CAAC,IAAI;AAczF,YAAY,KAAK,wBAAwB;AACzC,MAAM,cAAc,YAAY,QAAQ,sBAAsB,yBAAyB,wBAAwB;AAC/G,QAAQ,IAAI,+DAA+D,YAAY,SAAS,QAAQ,CAAC,CAAC,IAAI;AAgB9G,SAAS,eAAe,KAAK,OAAO,QAAQ,UAAU,CAAA,GAAI;AACxD,cAAY,SAAS,QAAQ,OAAO;AAEpC,QAAM,YAAY,cAAc,OAAO;AACvC,QAAM,aAAa,eAAe,OAAO;AAEzC,YAAU,QAAQ,EAAE,GAAG,UAAU,QAAQ,YAAY,UAAU,YAAY;AAC3E,YAAU,QAAQ,EAAE,GAAG,WAAW,QAAQ,YAAY,WAAW,YAAY;AAE7E,QAAM,SAAS,QAAQA,IAAS;AAChC,QAAM,SAAS,SAASC,KAAU;AAClC,QAAM,SAAS,SAASC,KAAU;AAElC,MAAI,QAAQ,SAAS,KAAK;AAC5B;AAEK,MAAC,aAAa;AAAA,EACjB,YAAY;AAAA,EACZ,OAAO;AAAA,IACL,OAAO;AAAA,MACX,WAAMF;AAAAA,MACN,YAAMC;AAAAA,MACN,YAAMC;AAAAA,IACN;AAAA,IACI,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,IACN;AAAA,IACI,aAAa;AAAA,MACjB,gBAAMC;AAAAA,IACN;AAAA,EACA;AACA;AAcA,YAAY,KAAK,gBAAgB;AACjC,YAAY,QAAQ,oBAAoB,oBAAoB,gBAAgB;AAC5E,MAAM,YAAY,YAAY,iBAAiB,kBAAkB,EAAE,CAAC;AACpE,QAAQ,IAAI,8CAA8C,WAAW,UAAU,QAAQ,CAAC,CAAC,IAAI;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, createElementBlock, openBlock, createElementVNode, createCommentVNode, createVNode, toDisplayString, unref, createTextVNode, withCtx } from "vue";
|
|
2
|
-
/* empty css
|
|
2
|
+
/* empty css */
|
|
3
3
|
import Field from "../../../../../components/Field/Field.vue.js";
|
|
4
4
|
import _sfc_main$1 from "../../../../../components/Button/Button.vue2.js";
|
|
5
5
|
import { useRoute, useRouter } from "vue-router";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, onMounted, createElementBlock, openBlock, createElementVNode, createVNode, withCtx } from "vue";
|
|
2
|
-
/* empty css
|
|
2
|
+
/* empty css */
|
|
3
3
|
import Field from "../../../../../components/Field/Field.vue.js";
|
|
4
4
|
import _sfc_main$1 from "../../../../../components/Button/Button.vue2.js";
|
|
5
5
|
import { useRoute, useRouter } from "vue-router";
|