@ozdao/martyrs 0.2.510 → 0.2.511

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.
Files changed (179) hide show
  1. package/dist/_virtual/index.cjs +4 -4
  2. package/dist/_virtual/index.js +4 -4
  3. package/dist/_virtual/index2.cjs +4 -4
  4. package/dist/_virtual/index2.js +4 -4
  5. package/dist/auth.server.cjs +1 -2
  6. package/dist/auth.server.js +1 -2
  7. package/dist/builder.cjs +105 -19
  8. package/dist/builder.js +107 -20
  9. package/dist/{main-XJQJFmgj.cjs → main-B1XN9Zjg.cjs} +7 -7
  10. package/dist/{main-DrpgUZcn.js → main-u7zgfMGL.js} +1850 -1856
  11. package/dist/martyrs/src/components/Button/Button.vue2.cjs +1 -1
  12. package/dist/martyrs/src/components/Button/Button.vue2.js +1 -1
  13. package/dist/martyrs/src/components/Feed/Carousel.vue.cjs +1 -1
  14. package/dist/martyrs/src/components/Feed/Carousel.vue.js +1 -1
  15. package/dist/martyrs/src/components/Feed/Feed.vue.cjs +1 -1
  16. package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
  17. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.cjs +1 -1
  18. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.js +1 -1
  19. package/dist/martyrs/src/components/Loader/{Loader.vue2.cjs → Loader.vue.cjs} +2 -2
  20. package/dist/martyrs/src/components/Loader/{Loader.vue2.js.map → Loader.vue.cjs.map} +1 -1
  21. package/dist/martyrs/src/components/Loader/{Loader.vue2.js → Loader.vue.js} +2 -2
  22. package/dist/martyrs/src/components/Loader/Loader.vue.js.map +1 -0
  23. package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue2.cjs +1 -1
  24. package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue2.js +1 -1
  25. package/dist/martyrs/src/components/Tab/{Tab.vue.cjs → Tab.vue2.cjs} +2 -2
  26. package/dist/martyrs/src/components/Tab/Tab.vue2.cjs.map +1 -0
  27. package/dist/martyrs/src/components/Tab/{Tab.vue.js → Tab.vue2.js} +2 -2
  28. package/dist/martyrs/src/components/Tab/{Tab.vue.cjs.map → Tab.vue2.js.map} +1 -1
  29. package/dist/martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue.cjs +1 -1
  30. package/dist/martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue.js +1 -1
  31. package/dist/martyrs/src/modules/auth/locales/ru.cjs +2 -0
  32. package/dist/martyrs/src/modules/auth/locales/ru.cjs.map +1 -1
  33. package/dist/martyrs/src/modules/auth/locales/ru.js +2 -0
  34. package/dist/martyrs/src/modules/auth/locales/ru.js.map +1 -1
  35. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.cjs +2 -2
  36. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.cjs.map +1 -1
  37. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js +2 -2
  38. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js.map +1 -1
  39. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs +1 -1
  40. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
  41. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +1 -1
  42. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
  43. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +1 -1
  44. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +1 -1
  45. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.cjs +1 -1
  46. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.js +1 -1
  47. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.cjs +1 -1
  48. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js +1 -1
  49. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.cjs +1 -1
  50. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
  51. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs +1 -1
  52. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
  53. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs +1 -1
  54. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
  55. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.cjs +1 -1
  56. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +1 -1
  57. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +1 -1
  58. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
  59. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +1 -1
  60. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +1 -1
  61. package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +1 -1
  62. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
  63. package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.cjs +1 -1
  64. package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.js +1 -1
  65. package/dist/martyrs/src/modules/events/components/sections/Feed.vue.cjs +1 -1
  66. package/dist/martyrs/src/modules/events/components/sections/Feed.vue.js +1 -1
  67. package/dist/martyrs/src/modules/events/components/sections/List.vue.cjs +1 -1
  68. package/dist/martyrs/src/modules/events/components/sections/List.vue.js +1 -1
  69. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.cjs +1 -1
  70. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.js +1 -1
  71. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +1 -1
  72. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +1 -1
  73. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.cjs +1 -1
  74. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.js +1 -1
  75. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +1 -1
  76. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +1 -1
  77. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.cjs +27 -27
  78. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.cjs.map +1 -1
  79. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.js +28 -28
  80. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.js.map +1 -1
  81. package/dist/martyrs/src/modules/globals/views/components/sections/SectionPageTitle.vue.cjs +1 -1
  82. package/dist/martyrs/src/modules/globals/views/components/sections/SectionPageTitle.vue.js +1 -1
  83. package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.cjs +1 -1
  84. package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.js +1 -1
  85. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.cjs +1 -1
  86. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
  87. package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs +1 -1
  88. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +1 -1
  89. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs +1 -1
  90. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +1 -1
  91. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs +1 -1
  92. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +1 -1
  93. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs +1 -1
  94. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +1 -1
  95. package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs +1 -1
  96. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +1 -1
  97. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.cjs +1 -1
  98. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +1 -1
  99. package/dist/martyrs/src/modules/music/router/music.cjs +1 -1
  100. package/dist/martyrs/src/modules/music/router/music.js +1 -1
  101. package/dist/martyrs/src/modules/notifications/components/pages/Notifications.vue.cjs +1 -1
  102. package/dist/martyrs/src/modules/notifications/components/pages/Notifications.vue.js +1 -1
  103. package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.cjs +1 -1
  104. package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +1 -1
  105. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +1 -1
  106. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
  107. package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.cjs +1 -1
  108. package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js +1 -1
  109. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +1 -1
  110. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +1 -1
  111. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +2 -2
  112. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +2 -2
  113. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
  114. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
  115. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +1 -1
  116. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +1 -1
  117. package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.cjs +1 -1
  118. package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +1 -1
  119. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +1 -1
  120. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
  121. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +2 -2
  122. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +2 -2
  123. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.cjs +1 -1
  124. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
  125. package/dist/martyrs/src/modules/products/components/elements/Image360.vue.cjs +1 -1
  126. package/dist/martyrs/src/modules/products/components/elements/Image360.vue.js +1 -1
  127. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.cjs +1 -1
  128. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
  129. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +1 -1
  130. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +1 -1
  131. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs +2 -2
  132. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +2 -2
  133. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +1 -1
  134. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
  135. package/dist/martyrs/src/modules/products/components/pages/ProductRecommmendation.vue.cjs +1 -1
  136. package/dist/martyrs/src/modules/products/components/pages/ProductRecommmendation.vue.js +1 -1
  137. package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs +64 -63
  138. package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs.map +1 -1
  139. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +64 -63
  140. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js.map +1 -1
  141. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.cjs +1 -1
  142. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +1 -1
  143. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs +1 -1
  144. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
  145. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs +1 -1
  146. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +1 -1
  147. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +1 -1
  148. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +1 -1
  149. package/dist/martyrs.cjs.js +1 -1
  150. package/dist/martyrs.css +1 -1
  151. package/dist/martyrs.es.js +1 -1
  152. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.cjs +1 -1
  153. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js +1 -1
  154. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.cjs +1 -1
  155. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js +1 -1
  156. package/dist/orders.server.cjs +3 -0
  157. package/dist/orders.server.js +3 -0
  158. package/dist/products.server.cjs +9 -36
  159. package/dist/products.server.js +9 -36
  160. package/dist/style.css +1 -1
  161. package/dist/{web-C5cmb1FH.js → web--8-wgr6b.js} +1 -1
  162. package/dist/{web-d40xcY_Y.cjs → web-BS6utuAZ.cjs} +1 -1
  163. package/package.json +1 -1
  164. package/src/builder/CLAUDE.MD +405 -0
  165. package/src/builder/builder.js +3 -0
  166. package/src/builder/modes/spa.dev.js +35 -15
  167. package/src/builder/modes/spa.prod.js +5 -6
  168. package/src/builder/modes/spa.rspack.dev.js +110 -0
  169. package/src/modules/auth/controllers/services/twofa.service.js +1 -1
  170. package/src/modules/auth/locales/ru.js +2 -0
  171. package/src/modules/auth/views/components/pages/EnterCode.vue +2 -2
  172. package/src/modules/globals/views/components/sections/Filters.vue +26 -17
  173. package/src/modules/orders/models/application.model.js +3 -0
  174. package/src/modules/products/components/pages/Products.vue +12 -10
  175. package/src/modules/products/controllers/configs/products.lookup.config.js +0 -26
  176. package/src/modules/products/controllers/products.controller.js +3 -7
  177. package/src/modules/products/controllers/queries/products.queries.js +10 -5
  178. package/dist/martyrs/src/components/Loader/Loader.vue2.cjs.map +0 -1
  179. package/dist/martyrs/src/components/Tab/Tab.vue.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { ref, computed, watch, onMounted, onUnmounted, createElementBlock, openBlock, createStaticVNode, createVNode, Transition, withCtx, createCommentVNode, withModifiers, createBlock } from "vue";
2
- import Loader from "../../../../components/Loader/Loader.vue2.js";
2
+ import Loader from "../../../../components/Loader/Loader.vue.js";
3
3
  /* empty css */
4
4
  import _export_sfc from "../../../../../../_virtual/_plugin-vue_export-helper.js";
5
5
  const _hoisted_1 = { class: "product-360-viewer" };
@@ -5,7 +5,7 @@ const vueRouter = require("vue-router");
5
5
  const globals = require("../../../globals/views/store/globals.cjs");
6
6
  const auth = require("../../../auth/views/store/auth.cjs");
7
7
  const categories = require("../../store/categories.cjs");
8
- ;/* empty css */
8
+ ;/* empty css */
9
9
  ;/* empty css */
10
10
  const Block = require("../../../../components/Block/Block.vue.cjs");
11
11
  const Feed = require("../../../../components/Feed/Feed.vue.cjs");
@@ -3,7 +3,7 @@ import { useRoute, useRouter } from "vue-router";
3
3
  import { state as state$1 } from "../../../globals/views/store/globals.js";
4
4
  import { state } from "../../../auth/views/store/auth.js";
5
5
  import { state as state$2, actions } from "../../store/categories.js";
6
- /* empty css */
6
+ /* empty css */
7
7
  /* empty css */
8
8
  import _sfc_main$2 from "../../../../components/Block/Block.vue.js";
9
9
  import _sfc_main$3 from "../../../../components/Feed/Feed.vue.js";
@@ -8,7 +8,7 @@ const Select = require("../../../../components/Select/Select.vue.cjs");
8
8
  const UploadImage = require("../../../../components/UploadImage/UploadImage.vue.cjs");
9
9
  const Field = require("../../../../components/Field/Field.vue.cjs");
10
10
  const FieldTags = require("../../../../components/FieldTags/FieldTags.vue.cjs");
11
- ;/* empty css */
11
+ ;/* empty css */
12
12
  ;/* empty css */
13
13
  ;/* empty css */
14
14
  ;/* empty css */
@@ -6,7 +6,7 @@ import Select from "../../../../components/Select/Select.vue.js";
6
6
  import _sfc_main$4 from "../../../../components/UploadImage/UploadImage.vue.js";
7
7
  import Field from "../../../../components/Field/Field.vue.js";
8
8
  import _sfc_main$6 from "../../../../components/FieldTags/FieldTags.vue.js";
9
- /* empty css */
9
+ /* empty css */
10
10
  /* empty css */
11
11
  /* empty css */
12
12
  /* empty css */
@@ -9,10 +9,10 @@ require("../../../globals/views/store/globals.cjs");
9
9
  const products = require("../../store/products.cjs");
10
10
  require("../../store/categories.cjs");
11
11
  const shopcart = require("../../../orders/store/shopcart.cjs");
12
- ;/* empty css */
12
+ ;/* empty css */
13
13
  ;/* empty css */
14
14
  ;/* empty css */
15
- ;/* empty css */
15
+ ;/* empty css */
16
16
  ;/* empty css */
17
17
  const IconEdit = require("../../../icons/navigation/IconEdit.vue.cjs");
18
18
  const IconInfo = require("../../../icons/navigation/IconInfo.vue.cjs");
@@ -7,10 +7,10 @@ import "../../../globals/views/store/globals.js";
7
7
  import { state, actions } from "../../store/products.js";
8
8
  import "../../store/categories.js";
9
9
  import { state as state$2, actions as actions$1 } from "../../../orders/store/shopcart.js";
10
- /* empty css */
10
+ /* empty css */
11
11
  /* empty css */
12
12
  /* empty css */
13
- /* empty css */
13
+ /* empty css */
14
14
  /* empty css */
15
15
  import _sfc_main$1 from "../../../icons/navigation/IconEdit.vue.js";
16
16
  import _sfc_main$4 from "../../../icons/navigation/IconInfo.vue.js";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
3
3
  const vue = require("vue");
4
4
  const vueRouter = require("vue-router");
5
5
  const Block = require("../../../../components/Block/Block.vue.cjs");
6
- const Tab = require("../../../../components/Tab/Tab.vue.cjs");
6
+ const Tab = require("../../../../components/Tab/Tab.vue2.cjs");
7
7
  const Field = require("../../../../components/Field/Field.vue.cjs");
8
8
  const Select = require("../../../../components/Select/Select.vue.cjs");
9
9
  const Button = require("../../../../components/Button/Button.vue2.cjs");
@@ -1,7 +1,7 @@
1
1
  import { ref, onMounted, createElementBlock, createCommentVNode, unref, openBlock, createBlock, createElementVNode, withCtx, createVNode, toDisplayString, createTextVNode, isRef, withModifiers, Fragment, renderList } from "vue";
2
2
  import { useRoute, useRouter } from "vue-router";
3
3
  import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
4
- import _sfc_main$3 from "../../../../components/Tab/Tab.vue.js";
4
+ import _sfc_main$3 from "../../../../components/Tab/Tab.vue2.js";
5
5
  import Field from "../../../../components/Field/Field.vue.js";
6
6
  import Select from "../../../../components/Select/Select.vue.js";
7
7
  import _sfc_main$2 from "../../../../components/Button/Button.vue2.js";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
3
3
  const vue = require("vue");
4
4
  const vueRouter = require("vue-router");
5
5
  const vueI18n = require("vue-i18n");
6
- const Loader = require("../../../../components/Loader/Loader.vue2.cjs");
6
+ const Loader = require("../../../../components/Loader/Loader.vue.cjs");
7
7
  ;/* empty css */
8
8
  const FieldBig = require("../../../../components/FieldBig/FieldBig.vue.cjs");
9
9
  const SectionProduct = require("../sections/SectionProduct.vue.cjs");
@@ -1,7 +1,7 @@
1
1
  import { ref, watchEffect, onMounted, createElementBlock, openBlock, createBlock, createCommentVNode, createVNode, unref, isRef } from "vue";
2
2
  import { useRouter } from "vue-router";
3
3
  import { useI18n } from "vue-i18n";
4
- import Loader from "../../../../components/Loader/Loader.vue2.js";
4
+ import Loader from "../../../../components/Loader/Loader.vue.js";
5
5
  /* empty css */
6
6
  import _sfc_main$1 from "../../../../components/FieldBig/FieldBig.vue.js";
7
7
  import _sfc_main$2 from "../sections/SectionProduct.vue.js";
@@ -2,7 +2,7 @@
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  const vue = require("vue");
4
4
  const vueRouter = require("vue-router");
5
- ;/* empty css */
5
+ ;/* empty css */
6
6
  const Feed = require("../../../../components/Feed/Feed.vue.cjs");
7
7
  const Spoiler = require("../../../../components/Spoiler/Spoiler.vue2.cjs");
8
8
  const Checkbox = require("../../../../components/Checkbox/Checkbox.vue.cjs");
@@ -27,34 +27,35 @@ const _hoisted_2 = {
27
27
  key: 0,
28
28
  class: "pd-medium flex-v-center flex-nowrap flex"
29
29
  };
30
- const _hoisted_3 = { class: "cols-2-1_3 br-1px br-solid br-light z-index-3 pos-relative" };
31
- const _hoisted_4 = { class: "o-y-scroll br-r br-solid br-light pd-medium z-index-2 desktop-only h-100 pos-relative" };
32
- const _hoisted_5 = { class: "w-100 o-y-scroll h-100" };
33
- const _hoisted_6 = {
30
+ const _hoisted_3 = { class: "mn-r-medium" };
31
+ const _hoisted_4 = { class: "cols-2-1_3 br-1px br-solid br-light z-index-3 pos-relative" };
32
+ const _hoisted_5 = { class: "o-y-scroll br-r br-solid br-light pd-medium z-index-2 desktop-only h-100 pos-relative" };
33
+ const _hoisted_6 = { class: "w-100 o-y-scroll h-100" };
34
+ const _hoisted_7 = {
34
35
  key: 0,
35
36
  class: "mn-b-medium"
36
37
  };
37
- const _hoisted_7 = { class: "mn-b-medium" };
38
- const _hoisted_8 = { class: "gap-micro" };
39
- const _hoisted_9 = ["onClick"];
40
- const _hoisted_10 = { class: "cursor-pointer w-100 flex-v-center flex-nowrap flex" };
41
- const _hoisted_11 = { class: "w-100" };
42
- const _hoisted_12 = { class: "h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra" };
43
- const _hoisted_13 = { class: "mn-t-small" };
44
- const _hoisted_14 = { class: "cursor-pointer w-100 flex-v-center flex-nowrap flex" };
45
- const _hoisted_15 = { class: "h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra" };
46
- const _hoisted_16 = { class: "mn-t-small flex gap-thin" };
47
- const _hoisted_17 = { class: "cursor-pointer w-100 flex-v-center flex-nowrap flex" };
48
- const _hoisted_18 = { class: "h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra" };
49
- const _hoisted_19 = { class: "mn-t-small" };
50
- const _hoisted_20 = { class: "h-1r" };
51
- const _hoisted_21 = { class: "w-100 rows-1 pd-thin pos-relative o-hidden" };
52
- const _hoisted_22 = { class: "mn-b-thin mobile-only w-100 o-y-scroll scroll-hide scroll-snap-type-x-mandatory scroll-pd-regular" };
53
- const _hoisted_23 = { class: "gap-thin flex-nowrap flex" };
54
- const _hoisted_24 = ["onClick"];
55
- const _hoisted_25 = { class: "mn-b-thin mobile-only" };
56
- const _hoisted_26 = { class: "cols-4 pos-relative w-100 rows-1 gap-thin" };
57
- const _hoisted_27 = { class: "flex gap-small" };
38
+ const _hoisted_8 = { class: "mn-b-medium" };
39
+ const _hoisted_9 = { class: "gap-micro" };
40
+ const _hoisted_10 = ["onClick"];
41
+ const _hoisted_11 = { class: "cursor-pointer w-100 flex-v-center flex-nowrap flex" };
42
+ const _hoisted_12 = { class: "w-100" };
43
+ const _hoisted_13 = { class: "h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra" };
44
+ const _hoisted_14 = { class: "mn-t-small" };
45
+ const _hoisted_15 = { class: "cursor-pointer w-100 flex-v-center flex-nowrap flex" };
46
+ const _hoisted_16 = { class: "h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra" };
47
+ const _hoisted_17 = { class: "mn-t-small flex gap-thin" };
48
+ const _hoisted_18 = { class: "cursor-pointer w-100 flex-v-center flex-nowrap flex" };
49
+ const _hoisted_19 = { class: "h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra" };
50
+ const _hoisted_20 = { class: "mn-t-small" };
51
+ const _hoisted_21 = { class: "h-1r" };
52
+ const _hoisted_22 = { class: "w-100 rows-1 pd-thin pos-relative o-hidden" };
53
+ const _hoisted_23 = { class: "mn-b-thin mobile-only w-100 o-y-scroll scroll-hide scroll-snap-type-x-mandatory scroll-pd-regular" };
54
+ const _hoisted_24 = { class: "gap-thin flex-nowrap flex" };
55
+ const _hoisted_25 = ["onClick"];
56
+ const _hoisted_26 = { class: "mn-b-thin mobile-only" };
57
+ const _hoisted_27 = { class: "cols-4 pos-relative w-100 rows-1 gap-thin" };
58
+ const _hoisted_28 = { class: "flex gap-small" };
58
59
  const _sfc_main = {
59
60
  __name: "Products",
60
61
  setup(__props) {
@@ -194,7 +195,7 @@ const _sfc_main = {
194
195
  const _component_router_link = vue.resolveComponent("router-link");
195
196
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
196
197
  vue.unref(route).name !== "Organization" && !_ctx.MOBILE_APP ? (vue.openBlock(), vue.createElementBlock("header", _hoisted_2, [
197
- _cache[10] || (_cache[10] = vue.createElementVNode("h2", { class: "mn-r-medium" }, "Products", -1)),
198
+ vue.createElementVNode("h2", _hoisted_3, vue.toDisplayString(currentCategory.value ? currentCategory.value.name : "All Products"), 1),
198
199
  _ctx.hasAccess(vue.unref(route).params._id, "products", "create", auth.state.accesses, auth.state.access.roles) ? (vue.openBlock(), vue.createElementBlock("button", {
199
200
  key: 0,
200
201
  onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$router.push({
@@ -203,12 +204,12 @@ const _sfc_main = {
203
204
  class: "radius-100 i-big hover-scale-1 cursor-pointer t-white bg-second"
204
205
  }, " + ")) : vue.createCommentVNode("", true)
205
206
  ])) : vue.createCommentVNode("", true),
206
- vue.createElementVNode("div", _hoisted_3, [
207
- vue.createElementVNode("div", _hoisted_4, [
208
- vue.createElementVNode("div", _hoisted_5, [
209
- currentCategories.value.length > 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_6, [
210
- vue.createElementVNode("h4", _hoisted_7, vue.toDisplayString(vue.unref(route).params.categoryPath ? "Subcategories" : "Categories"), 1),
211
- vue.createElementVNode("div", _hoisted_8, [
207
+ vue.createElementVNode("div", _hoisted_4, [
208
+ vue.createElementVNode("div", _hoisted_5, [
209
+ vue.createElementVNode("div", _hoisted_6, [
210
+ currentCategories.value.length > 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_7, [
211
+ vue.createElementVNode("h4", _hoisted_8, vue.toDisplayString(vue.unref(route).params.categoryPath ? "Subcategories" : "Categories"), 1),
212
+ vue.createElementVNode("div", _hoisted_9, [
212
213
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(currentCategories.value, (category) => {
213
214
  return vue.openBlock(), vue.createElementBlock("div", {
214
215
  key: category._id,
@@ -216,11 +217,11 @@ const _sfc_main = {
216
217
  class: "cursor-pointer hover-t-underline mn-b-regular transition-all"
217
218
  }, [
218
219
  vue.createTextVNode(vue.toDisplayString(category.name) + " ", 1),
219
- _cache[11] || (_cache[11] = vue.createElementVNode("br", null, null, -1)),
220
+ _cache[10] || (_cache[10] = vue.createElementVNode("br", null, null, -1)),
220
221
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(category.children, (subcategory) => {
221
222
  return vue.openBlock(), vue.createElementBlock("span", null, vue.toDisplayString(subcategory.name), 1);
222
223
  }), 256))
223
- ], 8, _hoisted_9);
224
+ ], 8, _hoisted_10);
224
225
  }), 128))
225
226
  ])
226
227
  ])) : vue.createCommentVNode("", true),
@@ -231,9 +232,9 @@ const _sfc_main = {
231
232
  status: true
232
233
  }, {
233
234
  header: vue.withCtx(({ isOpen }) => [
234
- vue.createElementVNode("div", _hoisted_10, [
235
- vue.createElementVNode("h4", _hoisted_11, vue.toDisplayString(filter.name), 1),
236
- vue.createElementVNode("div", _hoisted_12, [
235
+ vue.createElementVNode("div", _hoisted_11, [
236
+ vue.createElementVNode("h4", _hoisted_12, vue.toDisplayString(filter.name), 1),
237
+ vue.createElementVNode("div", _hoisted_13, [
237
238
  vue.createVNode(IconChevronBottom.default, {
238
239
  class: vue.normalizeClass([{ "rotate-180 mn-t-micro-negative": isOpen }, "i-regular"]),
239
240
  fill: "rgb(var(--black))"
@@ -242,7 +243,7 @@ const _sfc_main = {
242
243
  ])
243
244
  ]),
244
245
  content: vue.withCtx(() => [
245
- vue.createElementVNode("div", _hoisted_13, [
246
+ vue.createElementVNode("div", _hoisted_14, [
246
247
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(filter.options, (option) => {
247
248
  return vue.openBlock(), vue.createBlock(Checkbox.default, {
248
249
  key: option.text || option,
@@ -264,9 +265,9 @@ const _sfc_main = {
264
265
  status: true
265
266
  }, {
266
267
  header: vue.withCtx(({ isOpen }) => [
267
- vue.createElementVNode("div", _hoisted_14, [
268
- _cache[12] || (_cache[12] = vue.createElementVNode("h4", { class: "w-100" }, " Price", -1)),
269
- vue.createElementVNode("div", _hoisted_15, [
268
+ vue.createElementVNode("div", _hoisted_15, [
269
+ _cache[11] || (_cache[11] = vue.createElementVNode("h4", { class: "w-100" }, " Price", -1)),
270
+ vue.createElementVNode("div", _hoisted_16, [
270
271
  vue.createVNode(IconChevronBottom.default, {
271
272
  class: vue.normalizeClass([{ "rotate-180 mn-t-micro-negative": isOpen }, "i-regular"]),
272
273
  fill: "rgb(var(--black))"
@@ -275,7 +276,7 @@ const _sfc_main = {
275
276
  ])
276
277
  ]),
277
278
  content: vue.withCtx(() => [
278
- vue.createElementVNode("div", _hoisted_16, [
279
+ vue.createElementVNode("div", _hoisted_17, [
279
280
  vue.createVNode(Field.default, {
280
281
  field: selectedFilters.value.price.min,
281
282
  "onUpdate:field": _cache[1] || (_cache[1] = ($event) => selectedFilters.value.price.min = $event),
@@ -301,9 +302,9 @@ const _sfc_main = {
301
302
  status: true
302
303
  }, {
303
304
  header: vue.withCtx(({ isOpen }) => [
304
- vue.createElementVNode("div", _hoisted_17, [
305
- _cache[13] || (_cache[13] = vue.createElementVNode("h4", { class: "w-100" }, "Availability", -1)),
306
- vue.createElementVNode("div", _hoisted_18, [
305
+ vue.createElementVNode("div", _hoisted_18, [
306
+ _cache[12] || (_cache[12] = vue.createElementVNode("h4", { class: "w-100" }, "Availability", -1)),
307
+ vue.createElementVNode("div", _hoisted_19, [
307
308
  vue.createVNode(IconChevronBottom.default, {
308
309
  class: vue.normalizeClass([{ "rotate-180 mn-t-micro-negative": isOpen }, "i-regular"]),
309
310
  fill: "rgb(var(--black))"
@@ -312,7 +313,7 @@ const _sfc_main = {
312
313
  ])
313
314
  ]),
314
315
  content: vue.withCtx(() => [
315
- vue.createElementVNode("div", _hoisted_19, [
316
+ vue.createElementVNode("div", _hoisted_20, [
316
317
  vue.createElementVNode("div", {
317
318
  onClick: _cache[3] || (_cache[3] = () => {
318
319
  tempSelectedDates.value = selectedFilters.value.availability;
@@ -321,7 +322,7 @@ const _sfc_main = {
321
322
  class: vue.normalizeClass([{ "bg-light": selectedFilters.value?.availability }, "pd-small field-wrapper radius-small bg-light cursor-pointer hover-bg-light transition-all flex-v-center flex gap-thin"])
322
323
  }, [
323
324
  vue.createVNode(IconCalendar.default, { class: "i-regular" }),
324
- vue.createElementVNode("span", _hoisted_20, vue.toDisplayString(selectedFilters.value.availability ? `${vue.unref(formatDate)(selectedFilters.value.availability.start, { dayMonth: true, language: "en" })} - ${vue.unref(formatDate)(selectedFilters.value.availability.end, { dayMonth: true, language: "en" })}` : "Select dates"), 1)
325
+ vue.createElementVNode("span", _hoisted_21, vue.toDisplayString(selectedFilters.value.availability ? `${vue.unref(formatDate)(selectedFilters.value.availability.start, { dayMonth: true, language: "en" })} - ${vue.unref(formatDate)(selectedFilters.value.availability.end, { dayMonth: true, language: "en" })}` : "Select dates"), 1)
325
326
  ], 2)
326
327
  ])
327
328
  ]),
@@ -333,16 +334,16 @@ const _sfc_main = {
333
334
  }, " Clear Filters ")
334
335
  ])
335
336
  ]),
336
- vue.createElementVNode("div", _hoisted_21, [
337
+ vue.createElementVNode("div", _hoisted_22, [
337
338
  vue.renderSlot(_ctx.$slots, "default"),
338
- vue.createElementVNode("div", _hoisted_22, [
339
- vue.createElementVNode("div", _hoisted_23, [
339
+ vue.createElementVNode("div", _hoisted_23, [
340
+ vue.createElementVNode("div", _hoisted_24, [
340
341
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(currentCategories.value, (category) => {
341
342
  return vue.openBlock(), vue.createElementBlock("div", {
342
343
  key: category._id,
343
344
  onClick: ($event) => selectCategory(category),
344
345
  class: "flex-child-default bg-light flex t-nowrap pd-medium radius-medium cursor-pointer hover-bg-light transition-all"
345
- }, vue.toDisplayString(category.name), 9, _hoisted_24);
346
+ }, vue.toDisplayString(category.name), 9, _hoisted_25);
346
347
  }), 128))
347
348
  ])
348
349
  ]),
@@ -365,7 +366,7 @@ const _sfc_main = {
365
366
  limit: 16,
366
367
  owner: vue.unref(route).name?.includes("Organization") ? vue.unref(route).params._id : null,
367
368
  search: vue.unref(route).query.search,
368
- lookup: ["variants", "rents"],
369
+ lookup: ["variants", "rents", "inventory"],
369
370
  categories: vue.unref(route).params.categoryPath ? `/${vue.unref(route).params.categoryPath}` : null,
370
371
  filters: processedFilters.value,
371
372
  priceMin: selectedFilters.value.price?.min,
@@ -378,7 +379,7 @@ const _sfc_main = {
378
379
  default: vue.withCtx(({
379
380
  items
380
381
  }) => [
381
- vue.createElementVNode("div", _hoisted_25, [
382
+ vue.createElementVNode("div", _hoisted_26, [
382
383
  vue.createVNode(Filters.default, {
383
384
  filters: availableFilters.value,
384
385
  "onUpdate:filters": _cache[4] || (_cache[4] = ($event) => availableFilters.value = $event),
@@ -387,7 +388,7 @@ const _sfc_main = {
387
388
  class: ""
388
389
  }, null, 8, ["filters", "selected"])
389
390
  ]),
390
- vue.createElementVNode("div", _hoisted_26, [
391
+ vue.createElementVNode("div", _hoisted_27, [
391
392
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(items, (product) => {
392
393
  return vue.openBlock(), vue.createBlock(_component_router_link, {
393
394
  to: vue.unref(route).params._id ? { name: "Organization_Product", params: { _id: vue.unref(route).params._id, product: product._id } } : { name: "Product", params: { product: product._id } },
@@ -419,23 +420,23 @@ const _sfc_main = {
419
420
  style: { "min-width": "350px" }
420
421
  }, {
421
422
  default: vue.withCtx(() => [
422
- _cache[14] || (_cache[14] = vue.createElementVNode("h3", { class: "mn-b-medium" }, "Select Date Range", -1)),
423
+ _cache[13] || (_cache[13] = vue.createElementVNode("h3", { class: "mn-b-medium" }, "Select Date Range", -1)),
423
424
  vue.createVNode(Calendar.default, {
424
425
  date: tempSelectedDates.value,
425
426
  "onUpdate:date": _cache[7] || (_cache[7] = ($event) => tempSelectedDates.value = $event),
426
427
  allowRange: true,
427
428
  disablePastDates: true,
428
- class: "mn-b-medium bg-light"
429
+ class: "mn-b-medium radius-small bg-light"
429
430
  }, null, 8, ["date"]),
430
- vue.createElementVNode("div", _hoisted_27, [
431
- vue.createElementVNode("button", {
432
- onClick: applyDateFilter,
433
- class: "bg-main button flex-child-full"
434
- }, " Apply "),
431
+ vue.createElementVNode("div", _hoisted_28, [
435
432
  vue.createElementVNode("button", {
436
433
  onClick: _cache[8] || (_cache[8] = ($event) => showDatePickerPopup.value = false),
437
434
  class: "bg-light button flex-child-full"
438
- }, " Cancel ")
435
+ }, " Cancel "),
436
+ vue.createElementVNode("button", {
437
+ onClick: applyDateFilter,
438
+ class: "bg-main button w-100 flex-child-full"
439
+ }, " Apply ")
439
440
  ])
440
441
  ]),
441
442
  _: 1
@@ -1 +1 @@
1
- {"version":3,"file":"Products.vue.cjs","sources":["../../../../../../../src/modules/products/components/pages/Products.vue"],"sourcesContent":["<template>\n <div class=\"pos-relative\">\n <header \n v-if=\"route.name !== 'Organization' && !MOBILE_APP\"\n class=\"pd-medium flex-v-center flex-nowrap flex\"\n >\n <h2 class=\"mn-r-medium\">Products</h2>\n <button \n v-if=\"hasAccess(route.params._id, 'products', 'create', auth.state.accesses, auth.state.access.roles)\"\n @click=\"$router.push({\n name: route.params?._id ? 'Organization_ProductAdd' : 'ProductAdd'\n })\" \n class=\"radius-100 i-big hover-scale-1 cursor-pointer t-white bg-second\">\n +\n </button>\n </header>\n\n <div class=\"cols-2-1_3 br-1px br-solid br-light z-index-3 pos-relative\">\n\n <div class=\"o-y-scroll br-r br-solid br-light pd-medium z-index-2 desktop-only h-100 pos-relative\">\n <div class=\"w-100 o-y-scroll h-100\">\n <!-- Категории -->\n <div class=\"mn-b-medium\" v-if=\"currentCategories.length > 0\">\n <h4 class=\"mn-b-medium\">\n {{ route.params.categoryPath ? 'Subcategories' : 'Categories' }}\n </h4>\n <div class=\"gap-micro\">\n <div\n v-for=\"category in currentCategories\"\n :key=\"category._id\"\n @click=\"selectCategory(category)\"\n class=\"cursor-pointer hover-t-underline mn-b-regular transition-all\"\n >\n {{ category.name }}\n <br>\n <span v-for=\"subcategory in category.children\">{{subcategory.name}}</span>\n </div>\n </div>\n </div>\n\n <!-- Фильтры категории -->\n <Spoiler \n v-for=\"filter in categoryFilters\"\n :key=\"filter.name\"\n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\">{{ filter.name }}</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180 mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-regular\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small\">\n <Checkbox \n v-for=\"option in filter.options\"\n :key=\"option.text || option\"\n v-model:radio=\"selectedFilters[filter.name]\"\n :label=\"option.text || option\"\n :value=\"option.text || option\"\n mode=\"checkbox\"\n class=\"mn-b-micro\"\n />\n </div>\n </template>\n </Spoiler>\n \n <!-- Цена за сутки -->\n <Spoiler \n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\"> Price</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180 mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-regular\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small flex gap-thin\">\n <Field\n v-model:field=\"selectedFilters.price.min\"\n placeholder=\"From\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n <Field\n v-model:field=\"selectedFilters.price.max\"\n placeholder=\"To\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n </div>\n </template>\n </Spoiler>\n\n <!-- Доступность -->\n <Spoiler \n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\">Availability</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180 mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-regular\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small\">\n <div \n @click=\"() => { tempSelectedDates = selectedFilters.availability; showDatePickerPopup = true; }\"\n :class=\"{ 'bg-light': selectedFilters?.availability }\"\n class=\"pd-small field-wrapper radius-small bg-light cursor-pointer hover-bg-light transition-all flex-v-center flex gap-thin\"\n >\n <IconCalendar class=\"i-regular\" />\n <span class=\"h-1r\">{{ selectedFilters.availability ? `${formatDate(selectedFilters.availability.start, { dayMonth: true, language: 'en' })} - ${formatDate(selectedFilters.availability.end, { dayMonth: true, language: 'en' })}` : 'Select dates'}}</span>\n </div>\n </div>\n </template>\n </Spoiler>\n\n <!-- Кнопка очистки фильтров -->\n <button \n @click=\"clearAllFilters\"\n class=\"bg-main w-100 button mn-t-medium\"\n >\n Clear Filters\n </button>\n </div>\n </div>\n\n <div class=\"w-100 rows-1 pd-thin pos-relative o-hidden\">\n \n <slot></slot>\n\n <div class=\"mn-b-thin mobile-only w-100 o-y-scroll scroll-hide scroll-snap-type-x-mandatory scroll-pd-regular\">\n <div class=\"gap-thin flex-nowrap flex\">\n <div\n v-for=\"category in currentCategories\"\n :key=\"category._id\"\n @click=\"selectCategory(category)\"\n class=\" flex-child-default bg-light flex t-nowrap pd-medium radius-medium cursor-pointer hover-bg-light transition-all\"\n >\n {{ category.name }}\n </div>\n </div>\n </div>\n <Feed\n :search=\"true\"\n v-model:sort=\"products.state.sort\"\n :showLoadMore=\"false\"\n :states=\"{\n empty: {\n title: 'No Products Found',\n description: 'Currently, there are no products available.'\n }\n }\"\n :store=\"{\n read: (options) => products.actions.read(options),\n state: products.state\n }\"\n :options=\"{\n limit: 16,\n owner: route.name?.includes('Organization') ? route.params._id : null,\n search: route.query.search,\n lookup: ['variants','rents'],\n categories: route.params.categoryPath ? `/${route.params.categoryPath}` : null,\n filters: processedFilters,\n priceMin: selectedFilters.price?.min,\n priceMax: selectedFilters.price?.max,\n dateStart: selectedFilters.availability?.start,\n dateEnd: selectedFilters.availability?.end\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"\"\n \n >\n <div class=\"mn-b-thin mobile-only\">\n <Filters\n v-model:filters=\"availableFilters\"\n v-model:selected=\"selectedFilters\"\n class=\"\"\n />\n </div>\n <div class=\"cols-4 pos-relative w-100 rows-1 gap-thin\">\n <router-link \n v-for=\"product in items\" \n :to=\"route.params._id ? { name: 'Organization_Product', params: { _id: route.params._id, product: product._id } } : { name: 'Product', params: { product: product._id } }\"\n class=\"pos-relative h-100 w-100\"\n >\n <CardProduct\n :key=\"product._id\"\n :product=\"product\"\n :user=\"auth.state.access\"\n :organization=\"route.params._id\"\n :access=\"hasAccess(route.params._id, 'products', 'edit', auth.state.accesses, auth.state.access.roles)\"\n class=\"pos-relative h-100 w-100 bg-light\"\n />\n </router-link>\n </div>\n </Feed>\n\n </div>\n </div>\n \n <!-- Date Picker Popup -->\n <Popup\n :isPopupOpen=\"showDatePickerPopup\"\n @close-popup=\"showDatePickerPopup = false\"\n class=\"pd-medium bg-white radius-medium\"\n style=\"min-width: 350px;\"\n >\n <h3 class=\"mn-b-medium\">Select Date Range</h3>\n \n <Calendar\n v-model:date=\"tempSelectedDates\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"mn-b-medium bg-light\"\n />\n \n <div class=\"flex gap-small\">\n <button \n @click=\"applyDateFilter\"\n class=\"bg-main button flex-child-full\"\n >\n Apply\n </button>\n <button \n @click=\"showDatePickerPopup = false\"\n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n </div>\n </Popup>\n</div>\n\n</template>\n\n\n<script setup=\"props\">\n // Import libs\n import { ref, computed, watch, onMounted, onUnmounted } from 'vue'\n import { useRoute, useRouter } from 'vue-router'\n\n // Import components\n import Tab from '@martyrs/src/components/Tab/Tab.vue'\n import Feed from '@martyrs/src/components/Feed/Feed.vue'\n\n import FilterProducts from '@martyrs/src/modules/products/components/sections/FilterProducts.vue'\n import BlockSearch from '@martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue'\n import BlockFilter from '@martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue'\n import Filters from '@martyrs/src/modules/globals/views/components/sections/Filters.vue'\n import Spoiler from \"@martyrs/src/components/Spoiler/Spoiler.vue\"\n import Field from \"@martyrs/src/components/Field/Field.vue\"\n import Calendar from \"@martyrs/src/components/Calendar/Calendar.vue\"\n import Popup from \"@martyrs/src/components/Popup/Popup.vue\"\n import Checkbox from \"@martyrs/src/components/Checkbox/Checkbox.vue\"\n\n import CardProduct from '@martyrs/src/modules/products/components/blocks/CardProduct.vue'\n\n import IconPlus from '@martyrs/src/modules/icons/navigation/IconPlus.vue'\n import IconChevronBottom from '@martyrs/src/modules/icons/navigation/IconChevronBottom.vue'\n import IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\n\n // Accessing router and store\n import * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\n import * as globals from '@martyrs/src/modules/globals/views/store/globals.js';\n import * as products from '@martyrs/src/modules/products/store/products.js';\n import * as categories from '@martyrs/src/modules/products/store/categories.js';\n import { useGlobalMixins } from '@martyrs/src/modules/globals/views/mixins/mixins.js';\n\n const route = useRoute()\n const router = useRouter()\n const { generateFilters, formatDate } = useGlobalMixins()\n\n // Категории и фильтры\n const currentCategories = ref([]);\n const currentCategory = ref(null);\n const categoryFilters = ref([]);\n // const selectedFilters = ref({});\n\n const availableFilters = ref([\n {\n title: 'Price',\n value: 'price',\n type: 'range',\n minPlaceholder: 'From',\n maxPlaceholder: 'To'\n },\n {\n title: 'Availability',\n value: 'availability',\n type: 'date'\n }\n ])\n\n const selectedFilters = ref({\n price: { min: '', max: '' },\n availability: null\n })\n\n const showDatePickerPopup = ref(false);\n const tempSelectedDates = ref(null);\n\n // Computed property for processed filters\n const processedFilters = computed(() => {\n const filters = [];\n \n // Обрабатываем фильтры категорий\n Object.entries(selectedFilters.value).forEach(([key, value]) => {\n if (key === 'price' || key === 'availability') return; // эти обрабатываются отдельно\n \n if (Array.isArray(value) && value.length > 0) {\n filters.push({\n parameter: key,\n values: value,\n caseSensitive: false\n });\n } else if (value && typeof value === 'string' && value.trim() !== '') {\n filters.push({\n parameter: key,\n values: [value],\n caseSensitive: false\n });\n }\n });\n \n return filters.length > 0 ? JSON.stringify(filters) : '';\n });\n\n\n\n\n const processedLookups = computed(() => {\n const lookups = ['variants'];\n if (selectedFilters.value.availability) {\n lookups.push('rents');\n }\n return lookups;\n });\n\n const loadCategoryData = async () => {\n const categoryPath = route.params.categoryPath;\n \n // Очищаем фильтры категории из предыдущей загрузки\n availableFilters.value = availableFilters.value.filter(f => f.value === 'price' || f.value === 'availability');\n \n try {\n if (categoryPath) {\n // Загружаем категорию и её прямых детей\n const result = await categories.actions.read({ \n url: `/${categoryPath}`,\n depth: 1,\n tree: false\n });\n \n if (result.length > 0) {\n currentCategory.value = result[0];\n currentCategories.value = result[0].children || [];\n categoryFilters.value = result[0].filters || [];\n \n // Добавляем фильтры категории в availableFilters\n (result[0].filters || []).forEach(filter => {\n availableFilters.value.push({\n title: filter.name,\n value: filter.name,\n type: 'checkbox',\n options: (filter.options || []).map(option => ({\n label: typeof option === 'string' ? option : option.text,\n value: typeof option === 'string' ? option : option.text\n }))\n });\n // Инициализируем массив для фильтра\n if (!selectedFilters.value[filter.name]) {\n selectedFilters.value[filter.name] = [];\n }\n });\n }\n } else {\n // Загружаем только корневые категории\n const result = await categories.actions.read({ \n root: true,\n tree: false\n });\n \n currentCategories.value = result;\n categoryFilters.value = [];\n }\n } catch (error) {\n console.error('Error loading categories:', error);\n currentCategories.value = [];\n categoryFilters.value = [];\n }\n };\n\n // Функция для выбора категории\n const selectCategory = (category) => {\n const categoryPath = category.url ? category.url.substring(1) : '';\n \n if (!categoryPath) {\n console.warn('No URL found for category:', category);\n return;\n }\n \n // Переходим к странице категории используя wildcard роут\n if (route.params._id) {\n router.push(`/organizations/${route.params._id}/products/categories/${categoryPath}`);\n } else {\n router.push(`/products/categories/${categoryPath}`);\n }\n };\n\n\n // Функция применения фильтра дат\n const applyDateFilter = () => {\n selectedFilters.value.availability = tempSelectedDates.value;\n showDatePickerPopup.value = false;\n };\n \n // Функция очистки всех фильтров\n const clearAllFilters = () => {\n selectedFilters.value.price = { min: '', max: '' };\n selectedFilters.value.availability = null;\n \n // Очищаем фильтры категорий\n categoryFilters.value.forEach(filter => {\n selectedFilters.value[filter.name] = [];\n });\n };\n\n globals.state.navigation_bar.actions = [{\n component: IconPlus,\n props: {\n fill: \"rgb(var(--main))\" \n },\n condition: () => auth.state.user && auth.state.user._id,\n action: () => route.params._id ? router.push({ name: 'Organization_ProductAdd', params: { _id: route.params._id} }) : router.push({ name: 'ProductAdd' })\n }],\n\n onMounted(async () => {\n await loadCategoryData();\n })\n\n onUnmounted(() => {\n globals.state.navigation_bar.actions = [];\n });\n\n</script>\n\n<style lang=\"scss\">\n\n\n</style>\n"],"names":["useRoute","useRouter","useGlobalMixins","ref","computed","categories.actions","globals.state","IconPlus","auth.state","onMounted","onUnmounted"],"mappings":"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"}
1
+ {"version":3,"file":"Products.vue.cjs","sources":["../../../../../../../src/modules/products/components/pages/Products.vue"],"sourcesContent":["<template>\n <div class=\"pos-relative\">\n <header \n v-if=\"route.name !== 'Organization' && !MOBILE_APP\"\n class=\"pd-medium flex-v-center flex-nowrap flex\"\n >\n <h2 class=\"mn-r-medium\">{{ currentCategory ? currentCategory.name : 'All Products' }}</h2>\n <button \n v-if=\"hasAccess(route.params._id, 'products', 'create', auth.state.accesses, auth.state.access.roles)\"\n @click=\"$router.push({\n name: route.params?._id ? 'Organization_ProductAdd' : 'ProductAdd'\n })\" \n class=\"radius-100 i-big hover-scale-1 cursor-pointer t-white bg-second\">\n +\n </button>\n </header>\n\n <div class=\"cols-2-1_3 br-1px br-solid br-light z-index-3 pos-relative\">\n\n <div class=\"o-y-scroll br-r br-solid br-light pd-medium z-index-2 desktop-only h-100 pos-relative\">\n <div class=\"w-100 o-y-scroll h-100\">\n <!-- Категории -->\n <div class=\"mn-b-medium\" v-if=\"currentCategories.length > 0\">\n <h4 class=\"mn-b-medium\">\n {{ route.params.categoryPath ? 'Subcategories' : 'Categories' }}\n </h4>\n <div class=\"gap-micro\">\n <div\n v-for=\"category in currentCategories\"\n :key=\"category._id\"\n @click=\"selectCategory(category)\"\n class=\"cursor-pointer hover-t-underline mn-b-regular transition-all\"\n >\n {{ category.name }}\n <br>\n <span v-for=\"subcategory in category.children\">{{subcategory.name}}</span>\n </div>\n </div>\n </div>\n\n <!-- Фильтры категории -->\n <Spoiler \n v-for=\"filter in categoryFilters\"\n :key=\"filter.name\"\n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\">{{ filter.name }}</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180 mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-regular\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small\">\n <Checkbox \n v-for=\"option in filter.options\"\n :key=\"option.text || option\"\n v-model:radio=\"selectedFilters[filter.name]\"\n :label=\"option.text || option\"\n :value=\"option.text || option\"\n mode=\"checkbox\"\n class=\"mn-b-micro\"\n />\n </div>\n </template>\n </Spoiler>\n \n <!-- Цена за сутки -->\n <Spoiler \n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\"> Price</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180 mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-regular\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small flex gap-thin\">\n <Field\n v-model:field=\"selectedFilters.price.min\"\n placeholder=\"From\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n <Field\n v-model:field=\"selectedFilters.price.max\"\n placeholder=\"To\"\n type=\"number\"\n :label=\"returnCurrency()\"\n class=\"w-50 bg-light pd-small radius-small\"\n />\n </div>\n </template>\n </Spoiler>\n\n <!-- Доступность -->\n <Spoiler \n class=\"o-hidden mn-b-medium\"\n :status=\"true\"\n >\n <template #header=\"{ isOpen }\">\n <div class=\"cursor-pointer w-100 flex-v-center flex-nowrap flex\">\n <h4 class=\"w-100\">Availability</h4>\n <div class=\"h-2r w-2r flex-child-auto aspect-1x1 flex-center flex bg-light radius-extra\">\n <IconChevronBottom :class=\"{ 'rotate-180 mn-t-micro-negative': isOpen }\" fill=\"rgb(var(--black))\" class=\"i-regular\"/>\n </div>\n </div>\n </template>\n\n <template #content>\n <div class=\"mn-t-small\">\n <div \n @click=\"() => { tempSelectedDates = selectedFilters.availability; showDatePickerPopup = true; }\"\n :class=\"{ 'bg-light': selectedFilters?.availability }\"\n class=\"pd-small field-wrapper radius-small bg-light cursor-pointer hover-bg-light transition-all flex-v-center flex gap-thin\"\n >\n <IconCalendar class=\"i-regular\" />\n <span class=\"h-1r\">{{ selectedFilters.availability ? `${formatDate(selectedFilters.availability.start, { dayMonth: true, language: 'en' })} - ${formatDate(selectedFilters.availability.end, { dayMonth: true, language: 'en' })}` : 'Select dates'}}</span>\n </div>\n </div>\n </template>\n </Spoiler>\n\n <!-- Кнопка очистки фильтров -->\n <button \n @click=\"clearAllFilters\"\n class=\"bg-main w-100 button mn-t-medium\"\n >\n Clear Filters\n </button>\n </div>\n </div>\n\n <div class=\"w-100 rows-1 pd-thin pos-relative o-hidden\">\n \n <slot></slot>\n\n <div class=\"mn-b-thin mobile-only w-100 o-y-scroll scroll-hide scroll-snap-type-x-mandatory scroll-pd-regular\">\n <div class=\"gap-thin flex-nowrap flex\">\n <div\n v-for=\"category in currentCategories\"\n :key=\"category._id\"\n @click=\"selectCategory(category)\"\n class=\" flex-child-default bg-light flex t-nowrap pd-medium radius-medium cursor-pointer hover-bg-light transition-all\"\n >\n {{ category.name }}\n </div>\n </div>\n </div>\n\n <Feed\n :search=\"true\"\n v-model:sort=\"products.state.sort\"\n :showLoadMore=\"false\"\n :states=\"{\n empty: {\n title: 'No Products Found',\n description: 'Currently, there are no products available.'\n }\n }\"\n :store=\"{\n read: (options) => products.actions.read(options),\n state: products.state\n }\"\n :options=\"{\n limit: 16,\n owner: route.name?.includes('Organization') ? route.params._id : null,\n search: route.query.search,\n lookup: ['variants','rents','inventory'],\n categories: route.params.categoryPath ? `/${route.params.categoryPath}` : null,\n filters: processedFilters,\n priceMin: selectedFilters.price?.min,\n priceMax: selectedFilters.price?.max,\n dateStart: selectedFilters.availability?.start,\n dateEnd: selectedFilters.availability?.end\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"\"\n \n >\n <div class=\"mn-b-thin mobile-only\">\n <Filters\n v-model:filters=\"availableFilters\"\n v-model:selected=\"selectedFilters\"\n class=\"\"\n />\n </div>\n <div class=\"cols-4 pos-relative w-100 rows-1 gap-thin\">\n <router-link \n v-for=\"product in items\" \n :to=\"route.params._id ? { name: 'Organization_Product', params: { _id: route.params._id, product: product._id } } : { name: 'Product', params: { product: product._id } }\"\n class=\"pos-relative h-100 w-100\"\n >\n <CardProduct\n :key=\"product._id\"\n :product=\"product\"\n :user=\"auth.state.access\"\n :organization=\"route.params._id\"\n :access=\"hasAccess(route.params._id, 'products', 'edit', auth.state.accesses, auth.state.access.roles)\"\n class=\"pos-relative h-100 w-100 bg-light\"\n />\n </router-link>\n </div>\n </Feed>\n\n </div>\n </div>\n \n <!-- Date Picker Popup -->\n <Popup\n :isPopupOpen=\"showDatePickerPopup\"\n @close-popup=\"showDatePickerPopup = false\"\n class=\"pd-medium bg-white radius-medium\"\n style=\"min-width: 350px;\"\n >\n <h3 class=\"mn-b-medium\">Select Date Range</h3>\n \n <Calendar\n v-model:date=\"tempSelectedDates\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"mn-b-medium radius-small bg-light\"\n />\n \n <div class=\"flex gap-small\">\n <button \n @click=\"showDatePickerPopup = false\"\n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n <button \n @click=\"applyDateFilter\"\n class=\"bg-main button w-100 flex-child-full\"\n >\n Apply\n </button>\n \n </div>\n </Popup>\n</div>\n\n</template>\n\n\n<script setup=\"props\">\n // Import libs\n import { ref, computed, watch, onMounted, onUnmounted } from 'vue'\n import { useRoute, useRouter } from 'vue-router'\n\n // Import components\n import Tab from '@martyrs/src/components/Tab/Tab.vue'\n import Feed from '@martyrs/src/components/Feed/Feed.vue'\n\n import FilterProducts from '@martyrs/src/modules/products/components/sections/FilterProducts.vue'\n import BlockSearch from '@martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue'\n import BlockFilter from '@martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue'\n import Filters from '@martyrs/src/modules/globals/views/components/sections/Filters.vue'\n import Spoiler from \"@martyrs/src/components/Spoiler/Spoiler.vue\"\n import Field from \"@martyrs/src/components/Field/Field.vue\"\n import Calendar from \"@martyrs/src/components/Calendar/Calendar.vue\"\n import Popup from \"@martyrs/src/components/Popup/Popup.vue\"\n import Checkbox from \"@martyrs/src/components/Checkbox/Checkbox.vue\"\n\n import CardProduct from '@martyrs/src/modules/products/components/blocks/CardProduct.vue'\n\n import IconPlus from '@martyrs/src/modules/icons/navigation/IconPlus.vue'\n import IconChevronBottom from '@martyrs/src/modules/icons/navigation/IconChevronBottom.vue'\n import IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\n\n // Accessing router and store\n import * as auth from '@martyrs/src/modules/auth/views/store/auth.js';\n import * as globals from '@martyrs/src/modules/globals/views/store/globals.js';\n import * as products from '@martyrs/src/modules/products/store/products.js';\n import * as categories from '@martyrs/src/modules/products/store/categories.js';\n import { useGlobalMixins } from '@martyrs/src/modules/globals/views/mixins/mixins.js';\n\n const route = useRoute()\n const router = useRouter()\n const { generateFilters, formatDate } = useGlobalMixins()\n\n // Категории и фильтры\n const currentCategories = ref([]);\n const currentCategory = ref(null);\n const categoryFilters = ref([]);\n // const selectedFilters = ref({});\n\n const availableFilters = ref([\n {\n title: 'Price',\n value: 'price',\n type: 'range',\n minPlaceholder: 'From',\n maxPlaceholder: 'To'\n },\n {\n title: 'Availability',\n value: 'availability',\n type: 'date'\n }\n ])\n\n const selectedFilters = ref({\n price: { min: '', max: '' },\n availability: null\n })\n\n const showDatePickerPopup = ref(false);\n const tempSelectedDates = ref(null);\n\n // Computed property for processed filters\n const processedFilters = computed(() => {\n const filters = [];\n \n // Обрабатываем фильтры категорий\n Object.entries(selectedFilters.value).forEach(([key, value]) => {\n if (key === 'price' || key === 'availability') return; // эти обрабатываются отдельно\n \n if (Array.isArray(value) && value.length > 0) {\n filters.push({\n parameter: key,\n values: value,\n caseSensitive: false\n });\n } else if (value && typeof value === 'string' && value.trim() !== '') {\n filters.push({\n parameter: key,\n values: [value],\n caseSensitive: false\n });\n }\n });\n \n return filters.length > 0 ? JSON.stringify(filters) : '';\n });\n\n\n\n\n const processedLookups = computed(() => {\n const lookups = ['variants'];\n if (selectedFilters.value.availability) {\n lookups.push('rents');\n }\n return lookups;\n });\n\n const loadCategoryData = async () => {\n const categoryPath = route.params.categoryPath;\n \n // Очищаем фильтры категории из предыдущей загрузки\n availableFilters.value = availableFilters.value.filter(f => f.value === 'price' || f.value === 'availability');\n \n try {\n if (categoryPath) {\n // Загружаем категорию и её прямых детей\n const result = await categories.actions.read({ \n url: `/${categoryPath}`,\n depth: 1,\n tree: false\n });\n \n if (result.length > 0) {\n currentCategory.value = result[0];\n currentCategories.value = result[0].children || [];\n categoryFilters.value = result[0].filters || [];\n \n // Добавляем фильтры категории в availableFilters\n (result[0].filters || []).forEach(filter => {\n availableFilters.value.push({\n title: filter.name,\n value: filter.name,\n type: 'checkbox',\n options: (filter.options || []).map(option => ({\n label: typeof option === 'string' ? option : option.text,\n value: typeof option === 'string' ? option : option.text\n }))\n });\n // Инициализируем массив для фильтра\n if (!selectedFilters.value[filter.name]) {\n selectedFilters.value[filter.name] = [];\n }\n });\n }\n } else {\n // Загружаем только корневые категории\n const result = await categories.actions.read({ \n root: true,\n tree: false\n });\n \n currentCategories.value = result;\n categoryFilters.value = [];\n }\n } catch (error) {\n console.error('Error loading categories:', error);\n currentCategories.value = [];\n categoryFilters.value = [];\n }\n };\n\n // Функция для выбора категории\n const selectCategory = (category) => {\n const categoryPath = category.url ? category.url.substring(1) : '';\n \n if (!categoryPath) {\n console.warn('No URL found for category:', category);\n return;\n }\n \n // Переходим к странице категории используя wildcard роут\n if (route.params._id) {\n router.push(`/organizations/${route.params._id}/products/categories/${categoryPath}`);\n } else {\n router.push(`/products/categories/${categoryPath}`);\n }\n };\n\n\n // Функция применения фильтра дат\n const applyDateFilter = () => {\n selectedFilters.value.availability = tempSelectedDates.value;\n showDatePickerPopup.value = false;\n };\n \n // Функция очистки всех фильтров\n const clearAllFilters = () => {\n selectedFilters.value.price = { min: '', max: '' };\n selectedFilters.value.availability = null;\n \n // Очищаем фильтры категорий\n categoryFilters.value.forEach(filter => {\n selectedFilters.value[filter.name] = [];\n });\n };\n\n globals.state.navigation_bar.actions = [{\n component: IconPlus,\n props: {\n fill: \"rgb(var(--main))\" \n },\n condition: () => auth.state.user && auth.state.user._id,\n action: () => route.params._id ? router.push({ name: 'Organization_ProductAdd', params: { _id: route.params._id} }) : router.push({ name: 'ProductAdd' })\n }],\n\n onMounted(async () => {\n await loadCategoryData();\n })\n\n onUnmounted(() => {\n globals.state.navigation_bar.actions = [];\n });\n\n</script>\n\n<style lang=\"scss\">\n\n\n</style>\n"],"names":["useRoute","useRouter","useGlobalMixins","ref","computed","categories.actions","globals.state","IconPlus","auth.state","onMounted","onUnmounted"],"mappings":"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"}