@ozdao/martyrs 0.2.581 → 0.2.582
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/martyrs/src/components/Button/Button.vue.js +1 -1
- package/dist/martyrs/src/components/Feed/Carousel.vue.js +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
- package/dist/martyrs/src/components/Loader/{Loader.vue2.js → Loader.vue.js} +2 -2
- package/dist/martyrs/src/components/Loader/Loader.vue.js.map +1 -0
- package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue.js +1 -1
- package/dist/martyrs/src/components/Media/Media.vue.js +1 -1
- package/dist/martyrs/src/components/Menu/{Menu.vue2.js → Menu.vue.js} +2 -2
- package/dist/martyrs/src/components/Menu/Menu.vue.js.map +1 -0
- package/dist/martyrs/src/components/SelectMulti/{SelectMulti.vue.js → SelectMulti.vue2.js} +2 -2
- package/dist/martyrs/src/components/SelectMulti/SelectMulti.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Spoiler/{Spoiler.vue2.js → Spoiler.vue.js} +2 -2
- package/dist/martyrs/src/components/Spoiler/Spoiler.vue.js.map +1 -0
- package/dist/martyrs/src/components/Tab/{Tab.vue2.js → Tab.vue.js} +2 -2
- package/dist/martyrs/src/components/Tab/Tab.vue.js.map +1 -0
- package/dist/martyrs/src/components/UploadImage/UploadImage.vue.js +1 -1
- package/dist/martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/configs/navigation.user.config.js +2 -3
- package/dist/martyrs/src/modules/auth/views/configs/navigation.user.config.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/router/users.router.js +1 -2
- package/dist/martyrs/src/modules/auth/views/router/users.router.js.map +1 -1
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/classes/ws.manager.js +16 -1
- package/dist/martyrs/src/modules/core/views/classes/ws.manager.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/PopupDateSelector.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Navigation.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/utils/vue-app-renderer.js +7 -0
- package/dist/martyrs/src/modules/core/views/utils/vue-app-renderer.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +2 -2
- 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/events/components/sections/Feed.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/sections/List.vue.js +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
- package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.js +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +1 -1
- package/dist/martyrs/src/modules/notifications/components/layouts/NotificationsLayout.vue.js +11 -40
- package/dist/martyrs/src/modules/notifications/components/layouts/NotificationsLayout.vue.js.map +1 -1
- package/dist/martyrs/src/modules/notifications/components/pages/Notifications.vue.js +26 -21
- package/dist/martyrs/src/modules/notifications/components/pages/Notifications.vue.js.map +1 -1
- package/dist/martyrs/src/modules/notifications/components/sections/NotificationPreferences.vue.js +54 -48
- package/dist/martyrs/src/modules/notifications/components/sections/NotificationPreferences.vue.js.map +1 -1
- package/dist/martyrs/src/modules/notifications/components/sections/NotificationsList.vue.js +37 -117
- package/dist/martyrs/src/modules/notifications/components/sections/NotificationsList.vue.js.map +1 -1
- package/dist/martyrs/src/modules/notifications/notifications.client.js +18 -15
- package/dist/martyrs/src/modules/notifications/notifications.client.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +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/CardDepartment.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +2 -2
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/elements/Image360.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +2 -2
- 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/FilterProducts.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Spot.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +1 -1
- package/dist/style.css +1 -188
- package/package.json +1 -1
- package/src/modules/auth/views/components/pages/ProfileEdit.vue +1 -1
- package/src/modules/auth/views/configs/navigation.user.config.js +10 -10
- package/src/modules/auth/views/router/users.router.js +0 -1
- package/src/modules/core/views/classes/ws.manager.js +20 -1
- package/src/modules/core/views/utils/vue-app-renderer.js +9 -3
- package/src/modules/notifications/components/layouts/NotificationsLayout.vue +9 -53
- package/src/modules/notifications/components/pages/Notifications.vue +21 -22
- package/src/modules/notifications/components/sections/NotificationPreferences.vue +41 -180
- package/src/modules/notifications/components/sections/NotificationsList.vue +39 -219
- package/src/modules/notifications/notifications.client.js +17 -16
- package/dist/martyrs/src/components/Loader/Loader.vue2.js.map +0 -1
- package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +0 -1
- package/dist/martyrs/src/components/SelectMulti/SelectMulti.vue.js.map +0 -1
- package/dist/martyrs/src/components/Spoiler/Spoiler.vue2.js.map +0 -1
- package/dist/martyrs/src/components/Tab/Tab.vue2.js.map +0 -1
- package/dist/martyrs/src/modules/auth/views/components/blocks/ProfileCard.vue.js +0 -44
- package/dist/martyrs/src/modules/auth/views/components/blocks/ProfileCard.vue.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, createElementBlock, openBlock, normalizeClass, withModifiers, createElementVNode, createCommentVNode, renderSlot, createVNode, createBlock, Fragment, createTextVNode, toDisplayString } from "vue";
|
|
2
|
-
import Loader from "../Loader/Loader.
|
|
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 */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ref, onMounted, createElementBlock, openBlock, createBlock, createVNode, normalizeClass, unref, withCtx, Fragment, renderList, Transition, renderSlot } from "vue";
|
|
2
2
|
import { useI18n } from "vue-i18n";
|
|
3
3
|
import { useGlobalMixins } from "../../modules/core/views/mixins/mixins.js";
|
|
4
|
-
import Loader from "../Loader/Loader.
|
|
4
|
+
import Loader from "../Loader/Loader.vue.js";
|
|
5
5
|
import _sfc_main$2 from "../Slider/Slider.vue.js";
|
|
6
6
|
import _sfc_main$1 from "../EmptyState/EmptyState.vue.js";
|
|
7
7
|
/* empty css */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { mergeModels, useModel, ref, computed, watch, onMounted, onUnmounted, createElementBlock, openBlock, Fragment, createCommentVNode, createBlock, normalizeClass, withCtx, createVNode, renderList, resolveDynamicComponent, unref, TransitionGroup, renderSlot } from "vue";
|
|
2
2
|
import { useGlobalMixins } from "../../modules/core/views/mixins/mixins.js";
|
|
3
|
-
import Loader from "../Loader/Loader.
|
|
3
|
+
import Loader from "../Loader/Loader.vue.js";
|
|
4
4
|
import Skeleton from "../Skeleton/Skeleton.vue2.js";
|
|
5
5
|
import _sfc_main$6 from "../EmptyState/EmptyState.vue.js";
|
|
6
6
|
import _sfc_main$2 from "../Dropdown/Dropdown.vue.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createElementBlock, openBlock, normalizeClass, createElementVNode, createCommentVNode, toDisplayString } from "vue";
|
|
2
|
-
/* empty css
|
|
2
|
+
/* empty css */
|
|
3
3
|
import _export_sfc from "../../../../_virtual/_plugin-vue_export-helper.js";
|
|
4
4
|
const _sfc_main = {
|
|
5
5
|
props: {
|
|
@@ -57,4 +57,4 @@ const Loader = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]])
|
|
|
57
57
|
export {
|
|
58
58
|
Loader as default
|
|
59
59
|
};
|
|
60
|
-
//# sourceMappingURL=Loader.
|
|
60
|
+
//# sourceMappingURL=Loader.vue.js.map
|
|
@@ -0,0 +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 fw-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,mBAAmF,OAAnF,YAAmFG,gBAAf,OAAA,MAAM,GAAA,CAAA,KAP9EC,mBAAA,IAAA,IAAA;AAAA;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ref, onMounted, watchEffect, createElementBlock, openBlock, createElementVNode, createVNode, Transition, withCtx, createBlock } from "vue";
|
|
2
2
|
import { Loader } from "../../../../node_modules/.pnpm/@googlemaps_js-api-loader@1.16.8/node_modules/@googlemaps/js-api-loader/dist/index.js";
|
|
3
|
-
import Loader$1 from "../Loader/Loader.
|
|
3
|
+
import Loader$1 from "../Loader/Loader.vue.js";
|
|
4
4
|
/* empty css */
|
|
5
5
|
const _hoisted_1 = { class: "pos-relative" };
|
|
6
6
|
const _hoisted_2 = {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, computed, onMounted, onUnmounted, createElementBlock, openBlock, createCommentVNode, mergeProps, createElementVNode, createVNode } from "vue";
|
|
2
|
-
import Loader from "../Loader/Loader.
|
|
2
|
+
import Loader from "../Loader/Loader.vue.js";
|
|
3
3
|
import _sfc_main$1 from "../../modules/icons/entities/IconGallery.vue.js";
|
|
4
4
|
/* empty css */
|
|
5
5
|
import _export_sfc from "../../../../_virtual/_plugin-vue_export-helper.js";
|
|
@@ -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.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Menu.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, computed, watch, onMounted, createElementBlock, openBlock, withKeys, normalizeClass, withModifiers, renderSlot, createElementVNode, createVNode, createCommentVNode, withDirectives, Fragment, renderList, toDisplayString, vShow, Transition, withCtx, normalizeStyle, createTextVNode, nextTick } from "vue";
|
|
2
|
-
/* empty css
|
|
2
|
+
/* empty css */
|
|
3
3
|
const _hoisted_1 = ["tabindex", "onKeydown", "onKeypress", "aria-owns"];
|
|
4
4
|
const _hoisted_2 = { class: "multiselect__tags-wrap" };
|
|
5
5
|
const _hoisted_3 = { class: "multiselect__tag" };
|
|
@@ -622,4 +622,4 @@ const _sfc_main = {
|
|
|
622
622
|
export {
|
|
623
623
|
_sfc_main as default
|
|
624
624
|
};
|
|
625
|
-
//# sourceMappingURL=SelectMulti.
|
|
625
|
+
//# sourceMappingURL=SelectMulti.vue2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectMulti.vue2.js","sources":["../../../../../src/components/SelectMulti/SelectMulti.vue"],"sourcesContent":["<template>\n <div\n ref=\"multiselect\"\n :tabindex=\"searchable ? -1 : tabindex\"\n :class=\"{\n 'multiselect--active': isOpen,\n 'multiselect--disabled': disabled,\n 'multiselect--above': isAbove,\n 'multiselect--has-options-group': hasOptionGroup\n }\"\n @focus=\"activate\"\n @blur=\"searchable ? false : deactivate\"\n @keydown.self.down.prevent=\"pointerForward\"\n @keydown.self.up.prevent=\"pointerBackward\"\n @keypress.enter.tab.stop.self=\"addPointerElement\"\n @keyup.esc=\"deactivate\"\n class=\"multiselect flex flex-v-center\"\n role=\"combobox\"\n :aria-owns=\"`listbox-${id}`\">\n \n <slot name=\"caret\" :toggle>\n <div @mousedown.prevent.stop=\"toggle\" class=\"multiselect__select\"></div>\n </slot>\n \n <slot name=\"clear\" :search />\n \n <div ref=\"tags\" class=\"multiselect__tags\">\n <slot\n name=\"selection\"\n :search\n :remove=\"removeElement\"\n :values=\"visibleValues\"\n :is-open=\"isOpen\">\n <div class=\"multiselect__tags-wrap\" v-show=\"visibleValues.length > 0\">\n <template v-for=\"(option, index) of visibleValues\" :key=\"index\">\n <slot name=\"tag\" :option :search :remove=\"removeElement\">\n <span class=\"multiselect__tag\">\n <span v-text=\"getOptionLabel(option)\" />\n <i \n tabindex=\"1\" \n @keypress.enter.prevent=\"removeElement(option)\"\n @mousedown.prevent=\"removeElement(option)\" \n class=\"multiselect__tag-icon\" />\n </span>\n </slot>\n </template>\n </div>\n <template v-if=\"internalValue?.length > limit\">\n <slot name=\"limit\">\n <strong class=\"multiselect__strong\" v-text=\"limitText(internalValue.length - limit)\" />\n </slot>\n </template>\n </slot>\n <transition name=\"multiselect__loading\">\n <slot name=\"loading\">\n <div v-show=\"loading\" class=\"multiselect__spinner\" />\n </slot>\n </transition>\n <input\n ref=\"searchInput\"\n v-if=\"searchable\"\n :name\n :id\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n :placeholder\n :style=\"inputStyle\"\n :value=\"search\"\n :disabled\n :tabindex\n @input=\"updateSearch($event.target.value)\"\n @focus.prevent=\"activate\"\n @blur.prevent=\"deactivate\"\n @keyup.esc=\"deactivate\"\n @keydown.down.prevent=\"pointerForward\"\n @keydown.up.prevent=\"pointerBackward\"\n @keypress.enter.prevent.stop.self=\"addPointerElement\"\n @keydown.delete.stop=\"removeLastElement\"\n class=\"multiselect__input\"\n :aria-controls=\"`listbox-${id}`\" />\n <span\n v-if=\"isSingleLabelVisible\"\n class=\"multiselect__single\"\n @mousedown.prevent=\"toggle\">\n <slot name=\"singleLabel\" :option=\"singleValue\">\n {{ currentOptionLabel }}\n </slot>\n </span>\n <span\n v-if=\"isPlaceholderVisible\"\n class=\"multiselect__placeholder\"\n @mousedown.prevent=\"toggle\">\n <slot name=\"placeholder\">\n {{ placeholder }}\n </slot>\n </span>\n </div>\n \n <transition name=\"multiselect\">\n <div\n class=\"multiselect__content-wrapper\"\n v-show=\"isOpen\"\n @focus=\"activate\"\n tabindex=\"-1\"\n @mousedown.prevent\n :style=\"{ maxHeight: `${optimizedHeight}px` }\"\n ref=\"list\">\n <ul class=\"multiselect__content\" :style=\"contentStyle\" role=\"listbox\" :id=\"`listbox-${id}`\">\n <slot name=\"beforeList\" />\n <li v-if=\"multiple && max === internalValue.length\">\n <span class=\"multiselect__option\">\n <slot name=\"maxElements\">\n Maximum of {{ max }} options selected. First remove a selected option to select another.\n </slot>\n </span>\n </li>\n <template v-if=\"!max || internalValue.length < max\">\n <li \n class=\"multiselect__element\"\n v-for=\"(option, index) of filteredOptions\"\n :key=\"index\"\n :id=\"`${id}-${index}`\"\n :role=\"!(option?.$isLabel || option?.$isDisabled) ? 'option' : null\">\n <span\n v-if=\"!(option?.$isLabel || option?.$isDisabled)\"\n :class=\"optionHighlight(index, option)\"\n @click.stop=\"select(option)\"\n @mouseenter.self=\"pointerSet(index)\"\n :data-select=\"option?.isTag ? tagPlaceholder : selectLabelText\"\n :data-selected=\"selectedLabelText\"\n :data-deselect=\"deselectLabelText\"\n class=\"multiselect__option\">\n <slot name=\"option\" :option :search :index>\n <span>{{ getOptionLabel(option) }}</span>\n </slot>\n </span>\n <span\n v-if=\"option?.$isLabel || option?.$isDisabled\"\n :data-select=\"groupSelect && selectGroupLabelText\"\n :data-deselect=\"groupSelect && deselectGroupLabelText\"\n :class=\"groupHighlight(index, option)\"\n @mouseenter.self=\"groupSelect && pointerSet(index)\"\n @mousedown.prevent=\"selectGroup(option)\"\n class=\"multiselect__option\">\n <slot name=\"option\" :option :search :index>\n <span>{{ getOptionLabel(option) }}</span>\n </slot>\n </span>\n </li>\n </template>\n <li v-show=\"showNoResults && filteredOptions.length === 0 && search && !loading\">\n <span class=\"multiselect__option\">\n <slot name=\"noResult\" :search>\n No elements found. Consider changing the search query.\n </slot>\n </span>\n </li>\n <li v-show=\"showNoOptions && (options.length === 0 || (hasOptionGroup && filteredOptions.length === 0)) && !search && !loading\">\n <span class=\"multiselect__option\">\n <slot name=\"noOptions\">List is empty.</slot>\n </span>\n </li>\n <slot name=\"afterList\" />\n </ul>\n </div>\n </transition>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, watch, onMounted, nextTick } from 'vue'\n\n// Props\nconst props = defineProps({\n modelValue: { type: null, default: () => [] },\n options: { type: Array, required: true },\n multiple: { type: Boolean, default: false },\n trackBy: String,\n label: String,\n searchable: { type: Boolean, default: true },\n clearOnSelect: { type: Boolean, default: true },\n hideSelected: { type: Boolean, default: false },\n placeholder: { type: String, default: 'Select option' },\n allowEmpty: { type: Boolean, default: true },\n resetAfter: { type: Boolean, default: false },\n closeOnSelect: { type: Boolean, default: true },\n customLabel: {\n type: Function,\n default: (option, label) => {\n if (!option && option !== 0) return ''\n return label ? option[label] : option\n }\n },\n taggable: { type: Boolean, default: false },\n tagPlaceholder: { type: String, default: 'Press enter to create a tag' },\n tagPosition: { type: String, default: 'top' },\n max: { type: [Number, Boolean], default: false },\n id: { default: null },\n optionsLimit: { type: Number, default: 1000 },\n groupValues: String,\n groupLabel: String,\n groupSelect: { type: Boolean, default: false },\n blockKeys: { type: Array, default: () => [] },\n preserveSearch: { type: Boolean, default: false },\n preselectFirst: { type: Boolean, default: false },\n preventAutofocus: { type: Boolean, default: false },\n internalSearch: { type: Boolean, default: true },\n name: { type: String, default: '' },\n selectLabel: { type: String, default: 'Press enter to select' },\n selectGroupLabel: { type: String, default: 'Press enter to select group' },\n selectedLabel: { type: String, default: 'Selected' },\n deselectLabel: { type: String, default: 'Press enter to remove' },\n deselectGroupLabel: { type: String, default: 'Press enter to deselect group' },\n showLabels: { type: Boolean, default: true },\n limit: { type: Number, default: 99999 },\n maxHeight: { type: Number, default: 300 },\n limitText: { type: Function, default: count => `and ${count} more` },\n loading: { type: Boolean, default: false },\n disabled: { type: Boolean, default: false },\n openDirection: { type: String, default: '' },\n showNoOptions: { type: Boolean, default: true },\n showNoResults: { type: Boolean, default: true },\n tabindex: { type: Number, default: 0 },\n showPointer: { type: Boolean, default: true },\n optionHeight: { type: Number, default: 40 }\n})\n\n// Emits\nconst emit = defineEmits(['open', 'search-change', 'close', 'select', 'update:modelValue', 'remove', 'tag'])\n\n// Refs\nconst multiselect = ref(null)\nconst searchInput = ref(null)\nconst list = ref(null)\nconst tags = ref(null)\n\n// State\nconst search = ref('')\nconst isOpen = ref(false)\nconst preferredOpenDirection = ref('below')\nconst optimizedHeight = ref(props.maxHeight)\nconst pointer = ref(0)\nconst pointerDirty = ref(false)\n\n// Helper functions\nconst isEmpty = opt => {\n if (opt === 0) return false\n if (Array.isArray(opt) && opt.length === 0) return true\n return !opt\n}\n\nconst includes = (str, query) => {\n if (str === undefined) str = 'undefined'\n if (str === null) str = 'null'\n if (str === false) str = 'false'\n return str.toString().toLowerCase().indexOf(query.trim()) !== -1\n}\n\nconst filterOptions = (options, search, label, customLabel) => {\n return search \n ? options.filter(option => includes(customLabel(option, label), search))\n .sort((a, b) => customLabel(a, label).length - customLabel(b, label).length)\n : options\n}\n\nconst flattenOptions = (values, label) => options =>\n options.reduce((prev, curr) => {\n if (curr[values]?.length) {\n prev.push({ $groupLabel: curr[label], $isLabel: true })\n return prev.concat(curr[values])\n }\n return prev\n }, [])\n\nconst stripGroups = options => options.filter(option => !option.$isLabel)\n\nconst filterGroups = (search, label, values, groupLabel, customLabel) => groups =>\n groups.map(group => {\n if (!group[values]) {\n console.warn(`Options passed to vue-multiselect do not contain groups, despite the config.`)\n return []\n }\n const groupOptions = filterOptions(group[values], search, label, customLabel)\n return groupOptions.length ? { [groupLabel]: group[groupLabel], [values]: groupOptions } : []\n })\n\nconst flow = (...fns) => x => fns.reduce((v, f) => f(v), x)\n\n// Computed\nconst internalValue = computed(() => {\n const val = props.modelValue\n return val || val === 0 ? (Array.isArray(val) ? val : [val]) : []\n})\n\nconst filteredOptions = computed(() => {\n const searchVal = search.value || ''\n const normalizedSearch = searchVal.toLowerCase().trim()\n let options = props.options.concat()\n\n if (props.internalSearch) {\n options = props.groupValues \n ? filterAndFlat(options, normalizedSearch, props.label)\n : filterOptions(options, normalizedSearch, props.label, props.customLabel)\n } else {\n options = props.groupValues \n ? flattenOptions(props.groupValues, props.groupLabel)(options) \n : options\n }\n\n options = props.hideSelected ? options.filter(o => !isSelected(o)) : options\n\n if (props.taggable && normalizedSearch.length && !isExistingOption(normalizedSearch)) {\n if (props.tagPosition === 'bottom') {\n options.push({ isTag: true, label: searchVal })\n } else {\n options.unshift({ isTag: true, label: searchVal })\n }\n }\n\n return options.slice(0, props.optionsLimit)\n})\n\nconst valueKeys = computed(() => \n props.trackBy ? internalValue.value.map(el => el[props.trackBy]) : internalValue.value\n)\n\nconst optionKeys = computed(() => {\n const options = props.groupValues ? flatAndStrip(props.options) : props.options\n return options.map(el => props.customLabel(el, props.label).toString().toLowerCase())\n})\n\nconst currentOptionLabel = computed(() =>\n props.multiple \n ? (props.searchable ? '' : props.placeholder)\n : internalValue.value.length \n ? getOptionLabel(internalValue.value[0])\n : props.searchable ? '' : props.placeholder\n)\n\nconst hasOptionGroup = computed(() => props.groupValues && props.groupLabel && props.groupSelect)\n\nconst isSingleLabelVisible = computed(() =>\n (singleValue.value || singleValue.value === 0) &&\n (!isOpen.value || !props.searchable) &&\n !visibleValues.value.length\n)\n\nconst isPlaceholderVisible = computed(() =>\n !internalValue.value.length && (!props.searchable || !isOpen.value)\n)\n\nconst visibleValues = computed(() =>\n props.multiple ? internalValue.value.slice(0, props.limit) : []\n)\n\nconst singleValue = computed(() => internalValue.value[0])\n\nconst deselectLabelText = computed(() => props.showLabels ? props.deselectLabel : '')\nconst deselectGroupLabelText = computed(() => props.showLabels ? props.deselectGroupLabel : '')\nconst selectLabelText = computed(() => props.showLabels ? props.selectLabel : '')\nconst selectGroupLabelText = computed(() => props.showLabels ? props.selectGroupLabel : '')\nconst selectedLabelText = computed(() => props.showLabels ? props.selectedLabel : '')\n\nconst inputStyle = computed(() => {\n if (props.searchable || (props.multiple && props.modelValue?.length)) {\n return isOpen.value\n ? { width: '100%' }\n : { width: '0', position: 'absolute', padding: '0' }\n }\n return ''\n})\n\nconst contentStyle = computed(() => \n props.options.length ? { display: 'inline-block' } : { display: 'block' }\n)\n\nconst isAbove = computed(() => {\n if (['above', 'top'].includes(props.openDirection)) return true\n if (['below', 'bottom'].includes(props.openDirection)) return false\n return preferredOpenDirection.value === 'above'\n})\n\nconst pointerPosition = computed(() => pointer.value * props.optionHeight)\nconst visibleElements = computed(() => optimizedHeight.value / props.optionHeight)\n\n// Methods\nconst filterAndFlat = (options, search, label) =>\n flow(\n filterGroups(search, label, props.groupValues, props.groupLabel, props.customLabel),\n flattenOptions(props.groupValues, props.groupLabel)\n )(options)\n\nconst flatAndStrip = options =>\n flow(\n flattenOptions(props.groupValues, props.groupLabel),\n stripGroups\n )(options)\n\nconst updateSearch = query => {\n search.value = query\n}\n\nconst isExistingOption = query => \n props.options ? optionKeys.value.indexOf(query) > -1 : false\n\nconst isSelected = option => {\n const opt = props.trackBy ? option[props.trackBy] : option\n return valueKeys.value.indexOf(opt) > -1\n}\n\nconst isOptionDisabled = option => !!option?.$isDisabled\n\nconst getOptionLabel = option => {\n if (isEmpty(option)) return ''\n if (option.isTag) return option.label\n if (option.$isLabel) return option.$groupLabel\n const label = props.customLabel(option, props.label)\n return isEmpty(label) ? '' : label\n}\n\nconst select = (option, key) => {\n if (option.$isLabel && props.groupSelect) {\n selectGroup(option)\n return\n }\n if (props.blockKeys.indexOf(key) !== -1 || props.disabled || option.$isDisabled || option.$isLabel) return\n if (props.max && props.multiple && internalValue.value.length === props.max) return\n if (key === 'Tab' && !pointerDirty.value) return\n \n if (option.isTag) {\n emit('tag', option.label, props.id)\n search.value = ''\n if (props.closeOnSelect && !props.multiple) deactivate()\n } else {\n if (isSelected(option)) {\n if (key !== 'Tab') removeElement(option)\n return\n }\n\n emit('update:modelValue', props.multiple ? internalValue.value.concat([option]) : option)\n emit('select', option, props.id)\n\n if (props.clearOnSelect) search.value = ''\n }\n \n if (props.closeOnSelect) deactivate()\n}\n\nconst selectGroup = selectedGroup => {\n const group = props.options.find(option => \n option[props.groupLabel] === selectedGroup.$groupLabel\n )\n if (!group) return\n\n if (wholeGroupSelected(group)) {\n emit('remove', group[props.groupValues], props.id)\n const newValue = internalValue.value.filter(option => \n group[props.groupValues].indexOf(option) === -1\n )\n emit('update:modelValue', newValue)\n } else {\n let optionsToAdd = group[props.groupValues].filter(option => \n !(isOptionDisabled(option) || isSelected(option))\n )\n if (props.max) optionsToAdd.splice(props.max - internalValue.value.length)\n \n emit('select', optionsToAdd, props.id)\n emit('update:modelValue', internalValue.value.concat(optionsToAdd))\n }\n\n if (props.closeOnSelect) deactivate()\n}\n\nconst wholeGroupSelected = group =>\n group[props.groupValues].every(option => isSelected(option) || isOptionDisabled(option))\n\nconst wholeGroupDisabled = group =>\n group[props.groupValues].every(isOptionDisabled)\n\nconst removeElement = (option, shouldClose = true) => {\n if (props.disabled || option?.$isDisabled) return\n if (!props.allowEmpty && internalValue.value.length <= 1) {\n deactivate()\n return\n }\n\n const index = typeof option === 'object' \n ? valueKeys.value.indexOf(option[props.trackBy])\n : valueKeys.value.indexOf(option)\n\n const newValue = props.multiple\n ? internalValue.value.slice(0, index).concat(internalValue.value.slice(index + 1))\n : null\n\n emit('update:modelValue', newValue)\n emit('remove', option, props.id)\n\n if (props.closeOnSelect && shouldClose) deactivate()\n}\n\nconst removeLastElement = () => {\n if (props.blockKeys.indexOf('Delete') !== -1) return\n if (search.value.length === 0 && Array.isArray(internalValue.value) && internalValue.value.length) {\n removeElement(internalValue.value[internalValue.value.length - 1], false)\n }\n}\n\nconst activate = () => {\n if (isOpen.value || props.disabled) return\n\n adjustPosition()\n if (props.groupValues && pointer.value === 0 && filteredOptions.value.length) {\n pointer.value = 1\n }\n\n isOpen.value = true\n if (props.searchable) {\n if (!props.preserveSearch) search.value = ''\n if (!props.preventAutofocus) nextTick(() => searchInput.value?.focus())\n } else if (!props.preventAutofocus) {\n multiselect.value?.focus()\n }\n emit('open', props.id)\n}\n\nconst deactivate = () => {\n if (!isOpen.value) return\n\n isOpen.value = false\n if (props.searchable) {\n searchInput.value?.blur()\n } else {\n multiselect.value?.blur()\n }\n if (!props.preserveSearch) search.value = ''\n emit('close', getValue(), props.id)\n}\n\nconst toggle = () => {\n isOpen.value ? deactivate() : activate()\n}\n\nconst adjustPosition = () => {\n if (typeof window === 'undefined') return\n\n const spaceAbove = multiselect.value.getBoundingClientRect().top\n const spaceBelow = window.innerHeight - multiselect.value.getBoundingClientRect().bottom\n const hasEnoughSpaceBelow = spaceBelow > props.maxHeight\n\n if (hasEnoughSpaceBelow || spaceBelow > spaceAbove || ['below', 'bottom'].includes(props.openDirection)) {\n preferredOpenDirection.value = 'below'\n optimizedHeight.value = Math.min(spaceBelow - 40, props.maxHeight)\n } else {\n preferredOpenDirection.value = 'above'\n optimizedHeight.value = Math.min(spaceAbove - 40, props.maxHeight)\n }\n}\n\nconst getValue = () => \n props.multiple ? internalValue.value : internalValue.value.length === 0 ? null : internalValue.value[0]\n\n// Pointer methods\nconst optionHighlight = (index, option) => ({\n 'multiselect__option--highlight': index === pointer.value && props.showPointer,\n 'multiselect__option--selected': isSelected(option)\n})\n\nconst groupHighlight = (index, selectedGroup) => {\n if (!props.groupSelect) {\n return ['multiselect__option--disabled', { 'multiselect__option--group': selectedGroup.$isLabel }]\n }\n const group = props.options.find(option => \n option[props.groupLabel] === selectedGroup.$groupLabel\n )\n return group && !wholeGroupDisabled(group)\n ? ['multiselect__option--group', \n { 'multiselect__option--highlight': index === pointer.value && props.showPointer },\n { 'multiselect__option--group-selected': wholeGroupSelected(group) }]\n : 'multiselect__option--disabled'\n}\n\nconst addPointerElement = ({ key } = 'Enter') => {\n if (filteredOptions.value.length > 0) {\n select(filteredOptions.value[pointer.value], key)\n }\n pointerReset()\n}\n\nconst pointerForward = () => {\n if (pointer.value < filteredOptions.value.length - 1) {\n pointer.value++\n if (list.value.scrollTop <= pointerPosition.value - (visibleElements.value - 1) * props.optionHeight) {\n list.value.scrollTop = pointerPosition.value - (visibleElements.value - 1) * props.optionHeight\n }\n if (filteredOptions.value[pointer.value]?.$isLabel && !props.groupSelect) pointerForward()\n }\n pointerDirty.value = true\n}\n\nconst pointerBackward = () => {\n if (pointer.value > 0) {\n pointer.value--\n if (list.value.scrollTop >= pointerPosition.value) {\n list.value.scrollTop = pointerPosition.value\n }\n if (filteredOptions.value[pointer.value]?.$isLabel && !props.groupSelect) pointerBackward()\n } else {\n if (filteredOptions.value[pointer.value]?.$isLabel && !props.groupSelect) pointerForward()\n }\n pointerDirty.value = true\n}\n\nconst pointerReset = () => {\n if (!props.closeOnSelect) return\n pointer.value = 0\n if (list.value) list.value.scrollTop = 0\n}\n\nconst pointerAdjust = () => {\n if (pointer.value >= filteredOptions.value.length - 1) {\n pointer.value = filteredOptions.value.length ? filteredOptions.value.length - 1 : 0\n }\n if (filteredOptions.value.length > 0 && filteredOptions.value[pointer.value]?.$isLabel && !props.groupSelect) {\n pointerForward()\n }\n}\n\nconst pointerSet = index => {\n pointer.value = index\n pointerDirty.value = true\n}\n\n// Watchers\nwatch(() => internalValue.value, () => {\n if (props.resetAfter && internalValue.value.length) {\n search.value = ''\n emit('update:modelValue', props.multiple ? [] : null)\n }\n}, { deep: true })\n\nwatch(search, () => emit('search-change', search.value))\n\nwatch(filteredOptions, () => pointerAdjust())\n\nwatch(isOpen, () => pointerDirty.value = false)\n\nwatch(pointer, () => {\n searchInput.value?.setAttribute('aria-activedescendant', `${props.id}-${pointer.value}`)\n})\n\n// Lifecycle\nonMounted(() => {\n if (!props.multiple && props.max) {\n console.warn('[Vue-Multiselect warn]: Max prop should not be used when prop Multiple equals false.')\n }\n if (props.preselectFirst && !internalValue.value.length && props.options.length) {\n select(filteredOptions.value[0])\n }\n})\n</script>\n\n<style>\nfieldset[disabled] .multiselect {\n pointer-events: none;\n}\n\n.multiselect__spinner {\n position: absolute;\n right: 1px;\n top: 1px;\n width: 40px;\n height: 38px;\n background: #fff;\n display: block;\n}\n\n.multiselect__spinner::before,\n.multiselect__spinner::after {\n position: absolute;\n content: \"\";\n top: 50%;\n left: 50%;\n margin: -8px 0 0 -8px;\n width: 16px;\n height: 16px;\n border-radius: 100%;\n border-color: #41b883 transparent transparent;\n border-style: solid;\n border-width: 2px;\n box-shadow: 0 0 0 1px transparent;\n}\n\n.multiselect__spinner::before {\n animation: spinning 2.4s cubic-bezier(0.41, 0.26, 0.2, 0.62);\n animation-iteration-count: infinite;\n}\n\n.multiselect__spinner::after {\n animation: spinning 2.4s cubic-bezier(0.51, 0.09, 0.21, 0.8);\n animation-iteration-count: infinite;\n}\n\n.multiselect__loading-enter-active,\n.multiselect__loading-leave-active {\n transition: opacity 0.4s ease-in-out;\n opacity: 1;\n}\n\n.multiselect__loading-enter,\n.multiselect__loading-leave-active {\n opacity: 0;\n}\n\n.multiselect,\n.multiselect__input,\n.multiselect__single {\n font-family: inherit;\n touch-action: manipulation;\n}\n\n.multiselect {\n display: block;\n position: relative;\n width: 100%;\n min-height: 40px;\n}\n\n.multiselect * {\n box-sizing: border-box;\n}\n\n.multiselect:focus {\n outline: none;\n}\n\n.multiselect--disabled {\n background: #ededed;\n pointer-events: none;\n opacity: 0.6;\n}\n\n.multiselect--active {\n z-index: 50;\n}\n\n.multiselect--active:not(.multiselect--above) .multiselect__current,\n.multiselect--active:not(.multiselect--above) .multiselect__input,\n.multiselect--active:not(.multiselect--above) .multiselect__tags {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.multiselect--active .multiselect__select {\n transform: rotateZ(180deg);\n}\n\n.multiselect--above.multiselect--active .multiselect__current,\n.multiselect--above.multiselect--active .multiselect__input,\n.multiselect--above.multiselect--active .multiselect__tags {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.multiselect__input,\n.multiselect__single,\n.multiselect__placeholder {\n position: relative;\n display: inline-block;\n min-height: 20px;\n line-height: 20px;\n border: none;\n width: calc(100%);\n height: inherit;\n box-sizing: border-box;\n vertical-align: top;\n display: flex;\n align-items: center;\n}\n\n.multiselect__input::placeholder {\n color: #35495e;\n}\n\n.multiselect__tag ~ .multiselect__input,\n.multiselect__tag ~ .multiselect__single {\n width: auto;\n}\n\n.multiselect__input:hover,\n.multiselect__single:hover {\n border-color: #cfcfcf;\n}\n\n.multiselect__input:focus,\n.multiselect__single:focus {\n border-color: #a8a8a8;\n outline: none;\n}\n\n.multiselect__tags-wrap {\n display: inline;\n}\n\n.multiselect__tags {\n display: block;\n height: inherit;\n}\n\n.multiselect__tag {\n position: relative;\n display: inline-block;\n padding: 4px 26px 4px 10px;\n border-radius: 5px;\n margin-right: 10px;\n color: #fff;\n line-height: 1;\n background: #41b883;\n margin-bottom: 5px;\n white-space: nowrap;\n overflow: hidden;\n max-width: 100%;\n text-overflow: ellipsis;\n}\n\n.multiselect__tag-icon {\n cursor: pointer;\n margin-left: 7px;\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n font-weight: 700;\n font-style: initial;\n width: 22px;\n text-align: center;\n line-height: 22px;\n transition: all 0.2s ease;\n border-radius: 5px;\n}\n\n.multiselect__tag-icon::after {\n content: \"×\";\n color: #266d4d;\n font-size: 14px;\n}\n\n.multiselect__tag-icon:focus::after,\n.multiselect__tag-icon:hover::after {\n color: white;\n}\n\n.multiselect__current {\n line-height: 16px;\n min-height: 40px;\n box-sizing: border-box;\n display: block;\n overflow: hidden;\n padding: 8px 12px 0;\n padding-right: 30px;\n white-space: nowrap;\n margin: 0;\n text-decoration: none;\n border-radius: 5px;\n border: 1px solid #e8e8e8;\n cursor: pointer;\n}\n\n.multiselect__select {\n line-height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n position: center;\n position: absolute;\n box-sizing: border-box;\n width: 40px;\n height: 38px;\n right: 1px;\n top: calc(50% - 19px);\n padding: 4px 8px;\n margin: 0;\n text-decoration: none;\n text-align: center;\n cursor: pointer;\n transition: transform 0.2s ease;\n}\n\n.multiselect__select::before {\n position: relative;\n color: #999;\n margin-top: 4px;\n border-style: solid;\n border-width: 5px 5px 0 5px;\n border-color: #999 transparent transparent transparent;\n content: \"\";\n}\n\n.multiselect--active .multiselect__placeholder {\n display: none;\n}\n\n.multiselect__content-wrapper {\n position: absolute;\n display: block;\n background: #fff;\n width: 100%;\n max-height: 240px;\n height: min-content;\n overflow: auto;\n left: 0;\n border-top: none;\n border-bottom-left-radius: 5px;\n border-bottom-right-radius: 5px;\n z-index: 50;\n -webkit-overflow-scrolling: touch;\n}\n\n.multiselect__content {\n list-style: none;\n display: inline-block;\n padding: 0;\n margin: 0;\n min-width: 100%;\n vertical-align: top;\n}\n\n.multiselect--above .multiselect__content-wrapper {\n bottom: 100%;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n border-bottom: none;\n border-top: 1px solid #e8e8e8;\n}\n\n.multiselect__content::-webkit-scrollbar {\n display: none;\n}\n\n.multiselect__element {\n display: block;\n}\n\n.multiselect__option {\n display: block;\n padding: 12px;\n min-height: 40px;\n line-height: 16px;\n text-decoration: none;\n text-transform: none;\n vertical-align: middle;\n position: relative;\n cursor: pointer;\n white-space: nowrap;\n}\n\n.multiselect__option::after {\n top: 0;\n right: 0;\n position: absolute;\n line-height: 40px;\n padding-right: 12px;\n padding-left: 20px;\n font-size: 13px;\n}\n\n.multiselect__option--highlight {\n background: rgba(var(--main), 0.1);\n outline: none;\n}\n\n.multiselect__option--highlight::after {\n content: attr(data-select);\n}\n\n.multiselect__option--selected {\n background: #f3f3f3;\n color: #35495e;\n font-weight: bold;\n}\n\n.multiselect__option--selected::after {\n content: attr(data-selected);\n color: silver;\n background: inherit;\n}\n\n.multiselect__option--selected.multiselect__option--highlight {\n background: rgba(var(--red), 0.1);\n}\n\n.multiselect__option--selected.multiselect__option--highlight::after {\n content: attr(data-deselect);\n}\n\n.multiselect--disabled .multiselect__current,\n.multiselect--disabled .multiselect__select {\n background: #ededed;\n color: #a6a6a6;\n}\n\n.multiselect__option--disabled {\n background: #ededed !important;\n color: #a6a6a6 !important;\n cursor: text;\n pointer-events: none;\n}\n\n.multiselect__option--group {\n background: #ededed;\n color: #35495e;\n}\n\n.multiselect__option--group.multiselect__option--highlight {\n background: #35495e;\n color: #fff;\n}\n\n.multiselect__option--group.multiselect__option--highlight::after {\n background: #35495e;\n}\n\n.multiselect__option--disabled.multiselect__option--highlight {\n background: #dedede;\n}\n\n.multiselect__option--group-selected.multiselect__option--highlight {\n background: #ff6a6a;\n color: #fff;\n}\n\n.multiselect__option--group-selected.multiselect__option--highlight::after {\n background: #ff6a6a;\n content: attr(data-deselect);\n color: #fff;\n}\n\n.multiselect-enter-active,\n.multiselect-leave-active {\n transition: all 0.15s ease;\n}\n\n.multiselect-enter,\n.multiselect-leave-active {\n opacity: 0;\n}\n\n.multiselect__strong {\n margin-bottom: 8px;\n line-height: 20px;\n display: inline-block;\n vertical-align: top;\n}\n\n*[dir=\"rtl\"] .multiselect {\n text-align: right;\n}\n\n*[dir=\"rtl\"] .multiselect__select {\n right: auto;\n left: 1px;\n}\n\n*[dir=\"rtl\"] .multiselect__tags {\n padding: 8px 8px 0 40px;\n}\n\n*[dir=\"rtl\"] .multiselect__content {\n text-align: right;\n}\n\n*[dir=\"rtl\"] .multiselect__option::after {\n right: auto;\n left: 0;\n}\n\n*[dir=\"rtl\"] .multiselect__clear {\n right: auto;\n left: 12px;\n}\n\n*[dir=\"rtl\"] .multiselect__spinner {\n right: auto;\n left: 1px;\n}\n\n@keyframes spinning {\n from {\n transform: rotate(0);\n }\n to {\n transform: rotate(2turn);\n }\n}\n</style>"],"names":["search"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, onMounted, createElementBlock, openBlock, createElementVNode, createVNode, renderSlot, Transition, withCtx, withDirectives, vShow } from "vue";
|
|
2
|
-
/* empty css
|
|
2
|
+
/* empty css */
|
|
3
3
|
const _sfc_main = {
|
|
4
4
|
__name: "Spoiler",
|
|
5
5
|
props: {
|
|
@@ -70,4 +70,4 @@ const _sfc_main = {
|
|
|
70
70
|
export {
|
|
71
71
|
_sfc_main as default
|
|
72
72
|
};
|
|
73
|
-
//# sourceMappingURL=Spoiler.
|
|
73
|
+
//# sourceMappingURL=Spoiler.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spoiler.vue.js","sources":["../../../../../src/components/Spoiler/Spoiler.vue"],"sourcesContent":["<template>\n <div>\n <div @click=\"toggleSpoiler\" class=\"flex-v-center flex-nowrap flex\">\n <slot name=\"header\" :isOpen=\"showSpoiler\"></slot>\n </div>\n <transition\n name=\"collapse\"\n @enter=\"onEnter\"\n @after-enter=\"onAfterEnter\"\n @leave=\"onLeave\"\n >\n <div v-show=\"showSpoiler\" class=\"spoiler\" ref=\"spoilerContent\">\n <slot name=\"content\"></slot>\n </div>\n </transition>\n </div>\n</template>\n<script setup>\nimport { ref, onMounted } from 'vue';\n\nconst props = defineProps({\n status: {\n type: Boolean,\n default: false\n }\n});\n\nconst showSpoiler = ref(false);\nconst spoilerContent = ref(null);\n\nonMounted(() => {\n if (props.status) {\n showSpoiler.value = props.status;\n }\n});\n\nconst toggleSpoiler = () => {\n showSpoiler.value = !showSpoiler.value;\n};\n\n// Анимация открытия\nconst onEnter = (el) => {\n el.style.height = '0';\n void el.offsetHeight; // force reflow\n el.style.height = el.scrollHeight + 'px';\n};\n\nconst onAfterEnter = (el) => {\n el.style.height = 'auto';\n};\n\n// Анимация закрытия\nconst onLeave = (el) => {\n el.style.height = el.scrollHeight + 'px';\n void el.offsetHeight; // force reflow\n el.style.height = '0';\n};\n\ndefineExpose({\n showSpoiler\n});\n</script>\n<style lang=\"scss\">\n.spoiler {\n overflow: hidden;\n transition: height 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;AAoBA,UAAM,QAAQ;AAOd,UAAM,cAAc,IAAI,KAAK;AAC7B,UAAM,iBAAiB,IAAI,IAAI;AAE/B,cAAU,MAAM;AACd,UAAI,MAAM,QAAQ;AAChB,oBAAY,QAAQ,MAAM;AAAA,MAC5B;AAAA,IACF,CAAC;AAED,UAAM,gBAAgB,MAAM;AAC1B,kBAAY,QAAQ,CAAC,YAAY;AAAA,IACnC;AAGA,UAAM,UAAU,CAAC,OAAO;AACtB,SAAG,MAAM,SAAS;AAClB,WAAK,GAAG;AACR,SAAG,MAAM,SAAS,GAAG,eAAe;AAAA,IACtC;AAEA,UAAM,eAAe,CAAC,OAAO;AAC3B,SAAG,MAAM,SAAS;AAAA,IACpB;AAGA,UAAM,UAAU,CAAC,OAAO;AACtB,SAAG,MAAM,SAAS,GAAG,eAAe;AACpC,WAAK,GAAG;AACR,SAAG,MAAM,SAAS;AAAA,IACpB;AAEA,aAAa;AAAA,MACX;AAAA,IACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -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.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tab.vue.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;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ref, computed, watch, createElementBlock, openBlock, normalizeClass, createElementVNode, createCommentVNode, withModifiers, createVNode, toDisplayString } from "vue";
|
|
2
2
|
import axios from "axios";
|
|
3
|
-
import Loader from "../Loader/Loader.
|
|
3
|
+
import Loader from "../Loader/Loader.vue.js";
|
|
4
4
|
import _sfc_main$1 from "../../modules/icons/navigation/IconUpload.vue.js";
|
|
5
5
|
import _sfc_main$2 from "../../modules/icons/navigation/IconDelete.vue.js";
|
|
6
6
|
/* empty css */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ref, createElementBlock, openBlock, withModifiers, createVNode, createElementVNode, Transition, withCtx, createBlock, createCommentVNode, toDisplayString } from "vue";
|
|
2
2
|
import axios from "axios";
|
|
3
|
-
import Loader from "../Loader/Loader.
|
|
3
|
+
import Loader from "../Loader/Loader.vue.js";
|
|
4
4
|
import _sfc_main$1 from "../../modules/icons/navigation/IconUpload.vue.js";
|
|
5
5
|
import { useStore } from "../../modules/core/views/store/core.store.js";
|
|
6
6
|
const _hoisted_1 = {
|
|
@@ -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.vue.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.vue.js";
|
|
5
5
|
import { useRoute, useRouter } from "vue-router";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ref, inject, onMounted, resolveComponent, createElementBlock, createCommentVNode, openBlock, createElementVNode, createVNode, createBlock, unref, withCtx, toDisplayString, Fragment, renderList, normalizeClass, resolveDynamicComponent } from "vue";
|
|
2
2
|
/* empty css */
|
|
3
|
-
/* empty css
|
|
3
|
+
/* empty css */
|
|
4
4
|
/* empty css */
|
|
5
5
|
import _sfc_main$1 from "../../../../../components/Dropdown/Dropdown.vue.js";
|
|
6
|
-
import _sfc_main$6 from "../../../../../components/Menu/Menu.
|
|
6
|
+
import _sfc_main$6 from "../../../../../components/Menu/Menu.vue.js";
|
|
7
7
|
import _sfc_main$b from "../../../../../components/Menu/MenuItem.vue.js";
|
|
8
8
|
import _sfc_main$3 from "../../../../organizations/components/elements/ButtonToggleMembership.vue.js";
|
|
9
9
|
import _sfc_main$2 from "../../../../reports/components/sections/FormReport.vue.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ref, watch, createElementBlock, openBlock, createElementVNode, createBlock, createCommentVNode, createVNode, unref, withCtx, Fragment, renderList } from "vue";
|
|
2
2
|
import { useRoute, useRouter } from "vue-router";
|
|
3
|
-
import _sfc_main$1 from "../../../../../components/Tab/Tab.
|
|
3
|
+
import _sfc_main$1 from "../../../../../components/Tab/Tab.vue.js";
|
|
4
4
|
import _sfc_main$2 from "../../../../../components/Feed/Feed.vue.js";
|
|
5
5
|
import _sfc_main$3 from "../../../../community/components/blocks/CardBlogpost.vue.js";
|
|
6
6
|
import { state } from "../../store/auth.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ref, onMounted, provide, resolveComponent, createBlock, openBlock, withCtx, createElementBlock, createVNode } from "vue";
|
|
2
2
|
import _sfc_main$1 from "../../../../../components/Popup/Popup.vue.js";
|
|
3
|
-
import Loader from "../../../../../components/Loader/Loader.
|
|
3
|
+
import Loader from "../../../../../components/Loader/Loader.vue.js";
|
|
4
4
|
import _sfc_main$2 from "./ProfileEditSidebar.vue.js";
|
|
5
5
|
import { useRoute, useRouter } from "vue-router";
|
|
6
6
|
import { state } from "../../store/auth.js";
|
|
@@ -57,7 +57,7 @@ const _sfc_main = {
|
|
|
57
57
|
}, {
|
|
58
58
|
default: withCtx(() => [
|
|
59
59
|
loading.value ? (openBlock(), createElementBlock("div", _hoisted_1, [
|
|
60
|
-
createVNode(Loader)
|
|
60
|
+
createVNode(Loader, { centered: true })
|
|
61
61
|
])) : (openBlock(), createElementBlock("div", _hoisted_2, [
|
|
62
62
|
createVNode(_sfc_main$2, { class: "w-10r mobile:w-100 flex-shrink-0" }),
|
|
63
63
|
createVNode(_component_RouterView, { userData: userData.value }, null, 8, ["userData"])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProfileEdit.vue.js","sources":["../../../../../../../../src/modules/auth/views/components/pages/ProfileEdit.vue"],"sourcesContent":["<template>\n <Popup \n :isPopupOpen=\"isOpen\" \n @close-popup=\"closeProfileEdit()\"\n title=\"Edit Profile\"\n align=\"center center\"\n class=\"w-m-50r h-40r mobile:h-100 h-m-40r bg-white mobile:radius-zero radius-medium pd-medium\"\n >\n <div v-if=\"loading\" class=\"flex-center h-100\">\n <Loader />\n </div>\n \n <div v-else class=\"flex h-min-100 flex-row mobile:flex-column gap-regular\">\n <ProfileEditSidebar class=\"w-10r mobile:w-100 flex-shrink-0\" />\n \n <RouterView :userData=\"userData\" />\n </div>\n </Popup>\n</template>\n\n<script setup>\n import Popup from '@martyrs/src/components/Popup/Popup.vue'\n import Loader from '@martyrs/src/components/Loader/Loader.vue'\n import ProfileEditSidebar from './ProfileEditSidebar.vue'\n \n import { ref, onMounted, provide } from 'vue'\n import { useRoute, useRouter } from 'vue-router'\n \n const route = useRoute()\n const router = useRouter()\n \n import * as auth from '@martyrs/src/modules/auth/views/store/auth.js'\n import * as users from '@martyrs/src/modules/auth/views/store/users.js'\n \n const loading = ref(true)\n const userData = ref(null)\n const isOpen = ref(false)\n\n function closeProfileEdit () {\n isOpen.value = false\n router.push({ \n name: 'User Profile', \n params: { \n _id: auth.state.user._id \n },\n query: { \n afterAuth: 'true' \n }\n })\n }\n \n onMounted(async () => {\n isOpen.value = true\n try {\n const userId = route.params._id || auth.state.user._id\n await users.actions.read({ _id: userId, user: auth.state.user._id })\n userData.value = users.state.current\n } catch (error) {\n console.error('Error loading user data:', error)\n } finally {\n loading.value = false\n }\n })\n \n // Provide user data to nested routes\n provide('userData', userData)\n</script>"],"names":["auth.state","users.actions","users.state"],"mappings":";;;;;;;;;;;;;;;;;;AA4BE,UAAM,QAAQ,SAAQ;AACtB,UAAM,SAAS,UAAS;AAKxB,UAAM,UAAU,IAAI,IAAI;AACxB,UAAM,WAAW,IAAI,IAAI;AACzB,UAAM,SAAS,IAAI,KAAK;AAExB,aAAS,mBAAoB;AAC3B,aAAO,QAAQ;AACf,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,KAAKA,MAAW,KAAK;AAAA,QAC7B;AAAA,QACM,OAAO;AAAA,UACL,WAAW;AAAA,QACnB;AAAA,MACA,CAAK;AAAA,IACH;AAEA,cAAU,YAAY;AACpB,aAAO,QAAQ;AACf,UAAI;AACF,cAAM,SAAS,MAAM,OAAO,OAAOA,MAAW,KAAK;AACnD,cAAMC,QAAc,KAAK,EAAE,KAAK,QAAQ,MAAMD,MAAW,KAAK,IAAG,CAAE;AACnE,iBAAS,QAAQE,QAAY;AAAA,MAC/B,SAAS,OAAO;AACd,gBAAQ,MAAM,4BAA4B,KAAK;AAAA,MACjD,UAAC;AACC,gBAAQ,QAAQ;AAAA,MAClB;AAAA,IACF,CAAC;AAGD,YAAQ,YAAY,QAAQ;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"ProfileEdit.vue.js","sources":["../../../../../../../../src/modules/auth/views/components/pages/ProfileEdit.vue"],"sourcesContent":["<template>\n <Popup \n :isPopupOpen=\"isOpen\" \n @close-popup=\"closeProfileEdit()\"\n title=\"Edit Profile\"\n align=\"center center\"\n class=\"w-m-50r h-40r mobile:h-100 h-m-40r bg-white mobile:radius-zero radius-medium pd-medium\"\n >\n <div v-if=\"loading\" class=\"flex-center h-100\">\n <Loader :centered=\"true\"/>\n </div>\n \n <div v-else class=\"flex h-min-100 flex-row mobile:flex-column gap-regular\">\n <ProfileEditSidebar class=\"w-10r mobile:w-100 flex-shrink-0\" />\n \n <RouterView :userData=\"userData\" />\n </div>\n </Popup>\n</template>\n\n<script setup>\n import Popup from '@martyrs/src/components/Popup/Popup.vue'\n import Loader from '@martyrs/src/components/Loader/Loader.vue'\n import ProfileEditSidebar from './ProfileEditSidebar.vue'\n \n import { ref, onMounted, provide } from 'vue'\n import { useRoute, useRouter } from 'vue-router'\n \n const route = useRoute()\n const router = useRouter()\n \n import * as auth from '@martyrs/src/modules/auth/views/store/auth.js'\n import * as users from '@martyrs/src/modules/auth/views/store/users.js'\n \n const loading = ref(true)\n const userData = ref(null)\n const isOpen = ref(false)\n\n function closeProfileEdit () {\n isOpen.value = false\n router.push({ \n name: 'User Profile', \n params: { \n _id: auth.state.user._id \n },\n query: { \n afterAuth: 'true' \n }\n })\n }\n \n onMounted(async () => {\n isOpen.value = true\n try {\n const userId = route.params._id || auth.state.user._id\n await users.actions.read({ _id: userId, user: auth.state.user._id })\n userData.value = users.state.current\n } catch (error) {\n console.error('Error loading user data:', error)\n } finally {\n loading.value = false\n }\n })\n \n // Provide user data to nested routes\n provide('userData', userData)\n</script>"],"names":["auth.state","users.actions","users.state"],"mappings":";;;;;;;;;;;;;;;;;;AA4BE,UAAM,QAAQ,SAAQ;AACtB,UAAM,SAAS,UAAS;AAKxB,UAAM,UAAU,IAAI,IAAI;AACxB,UAAM,WAAW,IAAI,IAAI;AACzB,UAAM,SAAS,IAAI,KAAK;AAExB,aAAS,mBAAoB;AAC3B,aAAO,QAAQ;AACf,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,KAAKA,MAAW,KAAK;AAAA,QAC7B;AAAA,QACM,OAAO;AAAA,UACL,WAAW;AAAA,QACnB;AAAA,MACA,CAAK;AAAA,IACH;AAEA,cAAU,YAAY;AACpB,aAAO,QAAQ;AACf,UAAI;AACF,cAAM,SAAS,MAAM,OAAO,OAAOA,MAAW,KAAK;AACnD,cAAMC,QAAc,KAAK,EAAE,KAAK,QAAQ,MAAMD,MAAW,KAAK,IAAG,CAAE;AACnE,iBAAS,QAAQE,QAAY;AAAA,MAC/B,SAAS,OAAO;AACd,gBAAQ,MAAM,4BAA4B,KAAK;AAAA,MACjD,UAAC;AACC,gBAAQ,QAAQ;AAAA,MAClB;AAAA,IACF,CAAC;AAGD,YAAQ,YAAY,QAAQ;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, computed, createElementBlock, openBlock, createElementVNode, createCommentVNode, createVNode, toDisplayString, unref, Transition, withCtx, createTextVNode } from "vue";
|
|
2
|
-
import _sfc_main$1 from "../../../../../components/Tab/Tab.
|
|
2
|
+
import _sfc_main$1 from "../../../../../components/Tab/Tab.vue.js";
|
|
3
3
|
import Field from "../../../../../components/Field/Field.vue.js";
|
|
4
4
|
import _sfc_main$2 from "../../../../../components/FieldPhone/FieldPhone.vue.js";
|
|
5
5
|
import _sfc_main$3 from "../../../../../components/Button/Button.vue.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, computed, onMounted, resolveComponent, createElementBlock, openBlock, createElementVNode, createCommentVNode, createVNode, createTextVNode, toDisplayString, unref, withCtx, Transition, withDirectives, vShow } from "vue";
|
|
2
|
-
import _sfc_main$1 from "../../../../../components/Tab/Tab.
|
|
2
|
+
import _sfc_main$1 from "../../../../../components/Tab/Tab.vue.js";
|
|
3
3
|
import Field from "../../../../../components/Field/Field.vue.js";
|
|
4
4
|
import _sfc_main$2 from "../../../../../components/FieldPhone/FieldPhone.vue.js";
|
|
5
5
|
import _sfc_main$3 from "../../../../../components/Button/Button.vue.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, computed, resolveComponent, createElementBlock, openBlock, createElementVNode, createCommentVNode, createVNode, toDisplayString, unref, Transition, withCtx, withDirectives, vShow, createTextVNode } from "vue";
|
|
2
|
-
import _sfc_main$1 from "../../../../../components/Tab/Tab.
|
|
2
|
+
import _sfc_main$1 from "../../../../../components/Tab/Tab.vue.js";
|
|
3
3
|
import Field from "../../../../../components/Field/Field.vue.js";
|
|
4
4
|
import _sfc_main$2 from "../../../../../components/FieldPhone/FieldPhone.vue.js";
|
|
5
5
|
import _sfc_main$3 from "../../../../../components/Button/Button.vue.js";
|
|
@@ -60,13 +60,12 @@ const navigationItems = [
|
|
|
60
60
|
},
|
|
61
61
|
{
|
|
62
62
|
category: "Orders",
|
|
63
|
-
visible: () =>
|
|
63
|
+
visible: (auth, route) => isModuleInstalled("orders") && (auth.user && (auth.user._id === route.params._id || auth.access.roles && (auth.access.roles.includes("ROLE_MODERATOR") || auth.access.roles.includes("ROLE_ADMIN")))),
|
|
64
64
|
items: [
|
|
65
65
|
{
|
|
66
66
|
title: "Orders",
|
|
67
67
|
iconComponent: _sfc_main$6,
|
|
68
|
-
route: (auth, route) => `/users/${route.params._id}/orders
|
|
69
|
-
visible: (auth, route) => isModuleInstalled("orders") && (auth.user && (auth.user._id === route.params._id || auth.access.roles && (auth.access.roles.includes("ROLE_MODERATOR") || auth.access.roles.includes("ROLE_ADMIN"))))
|
|
68
|
+
route: (auth, route) => `/users/${route.params._id}/orders`
|
|
70
69
|
}
|
|
71
70
|
]
|
|
72
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.user.config.js","sources":["../../../../../../../src/modules/auth/views/configs/navigation.user.config.js"],"sourcesContent":["// Import icons\nimport IconHome from '@martyrs/src/modules/icons/entities/IconHome.vue';\nimport IconEvents from '@martyrs/src/modules/icons/entities/IconEvents.vue';\nimport IconGroups from '@martyrs/src/modules/icons/entities/IconGroups.vue';\nimport IconOrders from '@martyrs/src/modules/icons/entities/IconOrders.vue';\nimport IconBell from '@martyrs/src/modules/icons/entities/IconBell.vue';\nimport IconSettings from '@martyrs/src/modules/icons/entities/IconSettings.vue';\nimport IconProfile from '@martyrs/src/modules/icons/entities/IconProfile.vue';\n\n// Import global mixins for access control\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\nconst { isModuleInstalled } = useGlobalMixins();\n\n// User profile navigation configuration\nexport const navigationItems = [\n {\n category: '',\n visible: () => true,\n items: [\n {\n title: 'Dashboard',\n iconComponent: IconHome,\n route: (auth, route) => `/users/${route.params._id}/dashboard`,\n visible: (auth, route) => auth.user && auth.user._id === route.params._id // Only owner\n },\n {\n title: 'Notifications',\n iconComponent: IconBell,\n route: (auth, route) => `/users/${route.params._id}/notifications`,\n visible: (auth, route) => auth.user && auth.user._id === route.params._id\n },\n {\n title: 'Settings',\n iconComponent: IconSettings,\n route: (auth, route) => `/users/${route.params._id}/edit/profile`,\n visible: (auth, route) => auth.user && auth.user._id === route.params._id\n },\n ]\n },\n {\n category: 'Profile',\n visible: () => true,\n items: [\n {\n title: 'Profile',\n iconComponent: IconProfile,\n route: (auth, route) => `/users/${route.params._id}`,\n visible: () => true // Public access\n },\n {\n title: 'Events',\n iconComponent: IconEvents,\n route: (auth, route) => `/users/${route.params._id}/events`,\n visible: () => isModuleInstalled('events')\n },\n {\n title: 'Groups',\n iconComponent: IconGroups,\n route: (auth, route) => `/users/${route.params._id}/organizations`,\n visible: () => isModuleInstalled('organizations')\n },\n ]\n },\n {\n category: 'Orders',\n visible: (
|
|
1
|
+
{"version":3,"file":"navigation.user.config.js","sources":["../../../../../../../src/modules/auth/views/configs/navigation.user.config.js"],"sourcesContent":["// Import icons\nimport IconHome from '@martyrs/src/modules/icons/entities/IconHome.vue';\nimport IconEvents from '@martyrs/src/modules/icons/entities/IconEvents.vue';\nimport IconGroups from '@martyrs/src/modules/icons/entities/IconGroups.vue';\nimport IconOrders from '@martyrs/src/modules/icons/entities/IconOrders.vue';\nimport IconBell from '@martyrs/src/modules/icons/entities/IconBell.vue';\nimport IconSettings from '@martyrs/src/modules/icons/entities/IconSettings.vue';\nimport IconProfile from '@martyrs/src/modules/icons/entities/IconProfile.vue';\n\n// Import global mixins for access control\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\nconst { isModuleInstalled } = useGlobalMixins();\n\n// User profile navigation configuration\nexport const navigationItems = [\n {\n category: '',\n visible: () => true,\n items: [\n {\n title: 'Dashboard',\n iconComponent: IconHome,\n route: (auth, route) => `/users/${route.params._id}/dashboard`,\n visible: (auth, route) => auth.user && auth.user._id === route.params._id // Only owner\n },\n {\n title: 'Notifications',\n iconComponent: IconBell,\n route: (auth, route) => `/users/${route.params._id}/notifications`,\n visible: (auth, route) => auth.user && auth.user._id === route.params._id\n },\n {\n title: 'Settings',\n iconComponent: IconSettings,\n route: (auth, route) => `/users/${route.params._id}/edit/profile`,\n visible: (auth, route) => auth.user && auth.user._id === route.params._id\n },\n ]\n },\n {\n category: 'Profile',\n visible: () => true,\n items: [\n {\n title: 'Profile',\n iconComponent: IconProfile,\n route: (auth, route) => `/users/${route.params._id}`,\n visible: () => true // Public access\n },\n {\n title: 'Events',\n iconComponent: IconEvents,\n route: (auth, route) => `/users/${route.params._id}/events`,\n visible: () => isModuleInstalled('events')\n },\n {\n title: 'Groups',\n iconComponent: IconGroups,\n route: (auth, route) => `/users/${route.params._id}/organizations`,\n visible: () => isModuleInstalled('organizations')\n },\n ]\n },\n {\n category: 'Orders',\n visible: (auth, route) => isModuleInstalled('orders') && (\n auth.user && (\n auth.user._id === route.params._id ||\n (auth.access.roles &&\n (auth.access.roles.includes('ROLE_MODERATOR') ||\n auth.access.roles.includes('ROLE_ADMIN'))\n )\n )\n ),\n items: [\n {\n title: 'Orders',\n iconComponent: IconOrders,\n route: (auth, route) => `/users/${route.params._id}/orders`,\n \n },\n ]\n },\n];\n\nexport default navigationItems;\n"],"names":["IconHome","IconBell","IconSettings","IconProfile","IconEvents","IconGroups","IconOrders"],"mappings":";;;;;;;;AAYA,MAAM,EAAE,kBAAiB,IAAK,gBAAe;AAGjC,MAAC,kBAAkB;AAAA,EAC7B;AAAA,IACE,UAAU;AAAA,IACV,SAAS,MAAM;AAAA,IACf,OAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,QACP,eAAeA;AAAAA,QACf,OAAO,CAAC,MAAM,UAAU,UAAU,MAAM,OAAO,GAAG;AAAA,QAClD,SAAS,CAAC,MAAM,UAAU,KAAK,QAAQ,KAAK,KAAK,QAAQ,MAAM,OAAO;AAAA;AAAA,MAC9E;AAAA,MACM;AAAA,QACE,OAAO;AAAA,QACP,eAAeC;AAAAA,QACf,OAAO,CAAC,MAAM,UAAU,UAAU,MAAM,OAAO,GAAG;AAAA,QAClD,SAAS,CAAC,MAAM,UAAU,KAAK,QAAQ,KAAK,KAAK,QAAQ,MAAM,OAAO;AAAA,MAC9E;AAAA,MACM;AAAA,QACE,OAAO;AAAA,QACP,eAAeC;AAAAA,QACf,OAAO,CAAC,MAAM,UAAU,UAAU,MAAM,OAAO,GAAG;AAAA,QAClD,SAAS,CAAC,MAAM,UAAU,KAAK,QAAQ,KAAK,KAAK,QAAQ,MAAM,OAAO;AAAA,MAC9E;AAAA,IACA;AAAA,EACA;AAAA,EACE;AAAA,IACE,UAAU;AAAA,IACV,SAAS,MAAM;AAAA,IACf,OAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,QACP,eAAeC;AAAAA,QACf,OAAO,CAAC,MAAM,UAAU,UAAU,MAAM,OAAO,GAAG;AAAA,QAClD,SAAS,MAAM;AAAA;AAAA,MACvB;AAAA,MACM;AAAA,QACE,OAAO;AAAA,QACP,eAAeC;AAAAA,QACf,OAAO,CAAC,MAAM,UAAU,UAAU,MAAM,OAAO,GAAG;AAAA,QAClD,SAAS,MAAM,kBAAkB,QAAQ;AAAA,MACjD;AAAA,MACM;AAAA,QACE,OAAO;AAAA,QACP,eAAeC;AAAAA,QACf,OAAO,CAAC,MAAM,UAAU,UAAU,MAAM,OAAO,GAAG;AAAA,QAClD,SAAS,MAAM,kBAAkB,eAAe;AAAA,MACxD;AAAA,IACA;AAAA,EACA;AAAA,EACE;AAAA,IACE,UAAU;AAAA,IACV,SAAS,CAAC,MAAM,UAAU,kBAAkB,QAAQ,MAClD,KAAK,SACH,KAAK,KAAK,QAAQ,MAAM,OAAO,OAC9B,KAAK,OAAO,UACV,KAAK,OAAO,MAAM,SAAS,gBAAgB,KAC1C,KAAK,OAAO,MAAM,SAAS,YAAY;AAAA,IAI/C,OAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,QACP,eAAeC;AAAAA,QACf,OAAO,CAAC,MAAM,UAAU,UAAU,MAAM,OAAO,GAAG;AAAA,MAE1D;AAAA,IACA;AAAA,EACA;AACA;"}
|
|
@@ -3,7 +3,7 @@ import { useGlobalMixins } from "../../../core/views/mixins/mixins.js";
|
|
|
3
3
|
import { requiresAuth } from "../middlewares/auth.validation.js";
|
|
4
4
|
import _sfc_main from "../../../icons/navigation/IconPlus.vue.js";
|
|
5
5
|
import { navigationItems } from "../configs/navigation.user.config.js";
|
|
6
|
-
import
|
|
6
|
+
import "vue";
|
|
7
7
|
import HelpCard from "../../../core/views/components/blocks/HelpCard.vue.js";
|
|
8
8
|
const { isPhone, isTablet } = useGlobalMixins();
|
|
9
9
|
function getUsersRoutes(options = {}) {
|
|
@@ -29,7 +29,6 @@ function getUsersRoutes(options = {}) {
|
|
|
29
29
|
},
|
|
30
30
|
sidebar_hover: false,
|
|
31
31
|
sidebar_navigation_items: navigationItems,
|
|
32
|
-
sidebar_header_component: _sfc_main$1,
|
|
33
32
|
sidebar_footer_component: HelpCard,
|
|
34
33
|
sidebarOpenOnEnter: true,
|
|
35
34
|
sidebarCloseOnLeave: true
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users.router.js","sources":["../../../../../../../src/modules/auth/views/router/users.router.js"],"sourcesContent":["// users.router.js - User profile routes\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\nimport { requiresAuth } from '../middlewares/auth.validation.js';\nimport IconPlus from '@martyrs/src/modules/icons/navigation/IconPlus.vue';\nimport { navigationItems } from '@martyrs/src/modules/auth/views/configs/navigation.user.config.js';\nimport ProfileCard from '@martyrs/src/modules/auth/views/components/blocks/ProfileCard.vue';\nimport HelpCard from '@martyrs/src/modules/core/views/components/blocks/HelpCard.vue';\n\nconst { isPhone, isTablet } = useGlobalMixins();\n\nexport function getUsersRoutes(options = {}) {\n const route = options.route || 'Home';\n\n return {\n parentName: route,\n config: {\n basePath: 'users',\n meta: {\n title: {\n en: 'Users',\n ru: 'Пользователи',\n },\n },\n routes: [\n {\n path: ':_id',\n name: 'User Profile Root',\n meta: {\n title: {\n en: 'Profile',\n ru: 'Профиль',\n },\n sidebar_hover: false,\n sidebar_navigation_items: navigationItems,\n
|
|
1
|
+
{"version":3,"file":"users.router.js","sources":["../../../../../../../src/modules/auth/views/router/users.router.js"],"sourcesContent":["// users.router.js - User profile routes\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\nimport { requiresAuth } from '../middlewares/auth.validation.js';\nimport IconPlus from '@martyrs/src/modules/icons/navigation/IconPlus.vue';\nimport { navigationItems } from '@martyrs/src/modules/auth/views/configs/navigation.user.config.js';\nimport ProfileCard from '@martyrs/src/modules/auth/views/components/blocks/ProfileCard.vue';\nimport HelpCard from '@martyrs/src/modules/core/views/components/blocks/HelpCard.vue';\n\nconst { isPhone, isTablet } = useGlobalMixins();\n\nexport function getUsersRoutes(options = {}) {\n const route = options.route || 'Home';\n\n return {\n parentName: route,\n config: {\n basePath: 'users',\n meta: {\n title: {\n en: 'Users',\n ru: 'Пользователи',\n },\n },\n routes: [\n {\n path: ':_id',\n name: 'User Profile Root',\n meta: {\n title: {\n en: 'Profile',\n ru: 'Профиль',\n },\n sidebar_hover: false,\n sidebar_navigation_items: navigationItems,\n sidebar_footer_component: HelpCard,\n sidebarOpenOnEnter: true,\n sidebarCloseOnLeave: true\n },\n children: [\n {\n path: '',\n name: 'User Profile',\n meta: {\n title: {\n en: 'Profile',\n ru: 'Профиль',\n },\n title_hide: true,\n hideNavigationBar: route => route.params._id === auth.state.user._id,\n },\n component: () => import(/* webpackChunkName: \"profile\" */ '../components/pages/Profile.vue'),\n children: [\n {\n path: 'edit',\n name: 'User Edit Profile',\n beforeEnter: [requiresAuth],\n component: () => import(/* webpackChunkName: \"profile-edit\" */ '../components/pages/ProfileEdit.vue'),\n children: [\n {\n path: 'profile',\n name: 'Profile Edit Profile',\n component: () => import(/* webpackChunkName: \"profile-edit-profile\" */ '../components/pages/ProfileEditProfile.vue')\n },\n {\n path: 'account',\n name: 'Profile Edit Account',\n component: () => import(/* webpackChunkName: \"profile-edit-account\" */ '../components/pages/ProfileEditAccount.vue')\n }\n ]\n }\n ]\n },\n {\n path: 'dashboard',\n name: 'User Dashboard',\n beforeEnter: [\n requiresAuth,\n (to) => {\n if (to.params._id !== auth.state.user._id) {\n return { name: 'User Profile', params: { _id: to.params._id } };\n }\n }\n ],\n meta: {\n title: {\n en: 'Dashboard',\n ru: 'Дашборд',\n },\n },\n component: () => import(/* webpackChunkName: \"profile-dashboard\" */ '../components/pages/UserDashboard.vue'),\n },\n {\n path: 'blogposts',\n name: 'User Posts',\n meta: {\n title: {\n en: 'Posts',\n ru: 'Посты',\n },\n },\n component: () => import(/* webpackChunkName: \"profile\" */ '../components/pages/ProfileBlogposts.vue'),\n },\n {\n path: 'events',\n name: 'User Events',\n meta: {\n title: {\n en: 'Events',\n ru: 'События',\n },\n },\n component: () => import(/* webpackChunkName: \"profile\" */ '@martyrs/src/modules/events/components/pages/EventsBackoffice.vue'),\n },\n {\n path: 'organizations',\n name: 'User Organizations',\n meta: {\n title: {\n en: 'Groups',\n ru: 'Группы',\n },\n actions: [\n {\n component: IconPlus,\n props: {\n fill: 'rgb(var(--main))',\n },\n condition: () => auth.state.user && auth.state.user._id,\n action: router => router.push({ name: 'Create Organization' }),\n },\n ],\n },\n component: () => import(/* webpackChunkName: \"profile\" */ '@martyrs/src/modules/organizations/components/pages/Organizations.vue'),\n },\n {\n path: 'wallet',\n name: 'User Wallet',\n meta: {\n title: {\n en: 'Wallet',\n ru: 'Кошелек',\n },\n },\n component: () => import(/* webpackChunkName: \"profile\" */ '@martyrs/src/modules/wallet/views/components/pages/Wallet.vue'),\n },\n ],\n },\n ],\n }\n };\n}\n"],"names":["route","auth.state","IconPlus"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, onMounted, createElementBlock, openBlock, createElementVNode, Fragment, renderList, unref, createBlock, createCommentVNode, resolveDynamicComponent, toDisplayString } from "vue";
|
|
2
|
-
/* empty css
|
|
2
|
+
/* empty css */
|
|
3
3
|
import _sfc_main$3 from "../../../icons/entities/IconProducts.vue.js";
|
|
4
4
|
import _sfc_main$8 from "../../../icons/entities/IconPayments.vue.js";
|
|
5
5
|
import _sfc_main$7 from "../../../icons/entities/IconEvents.vue.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { computed, ref, onServerPrefetch, onMounted, createElementBlock, openBlock, createVNode, TransitionGroup, withCtx, createCommentVNode, Fragment, renderList, Transition, createBlock } from "vue";
|
|
2
2
|
import { u as useHead } from "../../../../../../node_modules/.pnpm/@unhead_vue@1.11.20_vue@3.5.13_typescript@5.8.3_/node_modules/@unhead/vue/dist/shared/vue.-sixQ7xP.js";
|
|
3
|
-
/* empty css
|
|
3
|
+
/* empty css */
|
|
4
4
|
import _sfc_main$1 from "../../../../components/EmptyState/EmptyState.vue.js";
|
|
5
5
|
import _sfc_main$2 from "../blocks/CardBlogpost.vue.js";
|
|
6
6
|
import SkeletonBlogpost from "../../../icons/skeletons/SkeletonBlogpost.vue.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { reactive } from "vue";
|
|
1
2
|
class WebSocketManager {
|
|
2
3
|
constructor() {
|
|
3
4
|
this.socket = null;
|
|
4
|
-
this.isConnected = false;
|
|
5
5
|
this.reconnectAttempts = 0;
|
|
6
6
|
this.maxReconnectAttempts = 5;
|
|
7
7
|
this.reconnectDelay = 3e3;
|
|
@@ -15,6 +15,21 @@ class WebSocketManager {
|
|
|
15
15
|
this.rpcCallbacks = /* @__PURE__ */ new Map();
|
|
16
16
|
this.rpcTimeout = 3e4;
|
|
17
17
|
this.rpcIdCounter = 0;
|
|
18
|
+
this.state = reactive({
|
|
19
|
+
isConnected: false,
|
|
20
|
+
wasConnected: false
|
|
21
|
+
// был ли когда-либо подключен
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
// Геттер для обратной совместимости
|
|
25
|
+
get isConnected() {
|
|
26
|
+
return this.state.isConnected;
|
|
27
|
+
}
|
|
28
|
+
set isConnected(value) {
|
|
29
|
+
this.state.isConnected = value;
|
|
30
|
+
if (value) {
|
|
31
|
+
this.state.wasConnected = true;
|
|
32
|
+
}
|
|
18
33
|
}
|
|
19
34
|
initialize(options = {}) {
|
|
20
35
|
this.maxReconnectAttempts = options.maxReconnectAttempts || this.maxReconnectAttempts;
|