@ozdao/martyrs 0.2.561 → 0.2.563

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 (197) hide show
  1. package/dist/{abac-DC2x92Pa.js → abac-DYoheWuc.js} +2 -1
  2. package/dist/{core.logger-VRHh-WUW.js → core.cache-DALYFDdy.js} +10 -59
  3. package/dist/core.logger-C3q8A9dl.js +51 -0
  4. package/dist/core.server.js +1 -1
  5. package/dist/{crud-DFFgLl09.js → crud-C7FSTUes.js} +2 -1
  6. package/dist/inventory.server.js +4 -3
  7. package/dist/{main-DQtUY5ma.js → main-CmjWiDVF.js} +2837 -2548
  8. package/dist/marketplace.server.js +389 -0
  9. package/dist/martyrs/src/components/Button/{Button.vue.js → Button.vue2.js} +3 -3
  10. package/dist/martyrs/src/components/Button/Button.vue2.js.map +1 -0
  11. package/dist/martyrs/src/components/Checkbox/Checkbox.vue.js +1 -1
  12. package/dist/martyrs/src/components/Checkbox/Checkbox.vue.js.map +1 -1
  13. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +1 -1
  14. package/dist/martyrs/src/components/Menu/{Menu.vue2.js → Menu.vue.js} +2 -2
  15. package/dist/martyrs/src/components/Menu/Menu.vue.js.map +1 -0
  16. package/dist/martyrs/src/components/Select/{Select.vue2.js → Select.vue.js} +2 -2
  17. package/dist/martyrs/src/components/Select/Select.vue.js.map +1 -0
  18. package/dist/martyrs/src/components/Spoiler/{Spoiler.vue.js → Spoiler.vue2.js} +2 -2
  19. package/dist/martyrs/src/components/Spoiler/Spoiler.vue2.js.map +1 -0
  20. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
  21. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
  22. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +2 -2
  23. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js +1 -1
  24. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +1 -1
  25. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
  26. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
  27. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
  28. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
  29. package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js +1 -1
  30. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +1 -1
  31. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
  32. package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js +1 -1
  33. package/dist/martyrs/src/modules/core/views/components/blocks/PopupAuth.vue.js +1 -1
  34. package/dist/martyrs/src/modules/core/views/components/blocks/PopupDateSelector.vue.js +1 -1
  35. package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js +3 -6
  36. package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js.map +1 -1
  37. package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js +3 -3
  38. package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js.map +1 -1
  39. package/dist/martyrs/src/modules/core/views/components/partials/Navigation.vue.js +1 -1
  40. package/dist/martyrs/src/modules/core/views/components/partials/NavigationBar.vue.js +1 -1
  41. package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue.js +59 -171
  42. package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue.js.map +1 -1
  43. package/dist/martyrs/src/modules/core/views/components/sections/filters/FilterCheckbox.vue2.js +64 -0
  44. package/dist/martyrs/src/modules/core/views/components/sections/filters/FilterCheckbox.vue2.js.map +1 -0
  45. package/dist/martyrs/src/modules/core/views/components/sections/filters/FilterDateRange.vue2.js +160 -0
  46. package/dist/martyrs/src/modules/core/views/components/sections/filters/FilterDateRange.vue2.js.map +1 -0
  47. package/dist/martyrs/src/modules/core/views/components/sections/filters/FilterOptions.vue.js +46 -0
  48. package/dist/martyrs/src/modules/core/views/components/sections/filters/FilterOptions.vue.js.map +1 -0
  49. package/dist/martyrs/src/modules/core/views/components/sections/filters/FilterRange.vue.js +105 -0
  50. package/dist/martyrs/src/modules/core/views/components/sections/filters/FilterRange.vue.js.map +1 -0
  51. package/dist/martyrs/src/modules/core/views/components/sections/filters/FiltersGroup.vue.js +166 -0
  52. package/dist/martyrs/src/modules/core/views/components/sections/filters/FiltersGroup.vue.js.map +1 -0
  53. package/dist/martyrs/src/modules/core/views/utils/vue-app-renderer.js +4 -0
  54. package/dist/martyrs/src/modules/core/views/utils/vue-app-renderer.js.map +1 -1
  55. package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.js +1 -1
  56. package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.js +1 -1
  57. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +1 -1
  58. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
  59. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +2 -0
  60. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js.map +1 -1
  61. package/dist/martyrs/src/modules/events/components/sections/EditTickets.vue.js +1 -1
  62. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +2 -2
  63. package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +2 -2
  64. package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.js +1 -1
  65. package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.js +1 -1
  66. package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +2 -2
  67. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +2 -2
  68. package/dist/martyrs/src/modules/landing/components/sections/SectionFeatures.vue.js +1 -1
  69. package/dist/martyrs/src/modules/landing/components/sections/SectionFeatures.vue.js.map +1 -1
  70. package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.js +1 -1
  71. package/dist/martyrs/src/modules/marketplace/marketplace.client.js +5 -9
  72. package/dist/martyrs/src/modules/marketplace/marketplace.client.js.map +1 -1
  73. package/dist/martyrs/src/modules/marketplace/views/components/pages/Marketplace.vue.js +242 -0
  74. package/dist/martyrs/src/modules/marketplace/views/components/pages/Marketplace.vue.js.map +1 -0
  75. package/dist/martyrs/src/modules/marketplace/views/router/marketplace.router.js +39 -0
  76. package/dist/martyrs/src/modules/marketplace/views/router/marketplace.router.js.map +1 -0
  77. package/dist/martyrs/src/modules/marketplace/views/store/marketplace.js +65 -2
  78. package/dist/martyrs/src/modules/marketplace/views/store/marketplace.js.map +1 -1
  79. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +1 -1
  80. package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js +1 -1
  81. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +1 -1
  82. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +1 -1
  83. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +2 -2
  84. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +2 -2
  85. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +1 -1
  86. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +1 -1
  87. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +2 -2
  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.js +1 -1
  90. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +1 -1
  91. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +1 -1
  92. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +1 -1
  93. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +1 -1
  94. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +1 -1
  95. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +1 -1
  96. package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +2 -2
  97. package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +2 -2
  98. package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +1 -1
  99. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +2 -2
  100. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +1 -1
  101. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
  102. package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.js +1 -1
  103. package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.js +1 -1
  104. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +2 -0
  105. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js.map +1 -1
  106. package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.js +1 -1
  107. package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js +1 -1
  108. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +4 -4
  109. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js.map +1 -1
  110. package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +1 -1
  111. package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js +1 -1
  112. package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +2 -2
  113. package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +1 -1
  114. package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +1 -1
  115. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
  116. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
  117. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +2 -2
  118. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
  119. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +2 -2
  120. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -1
  121. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
  122. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
  123. package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +1 -1
  124. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
  125. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +4 -2
  126. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js.map +1 -1
  127. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +1 -1
  128. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +2 -2
  129. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +1 -1
  130. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
  131. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +2 -2
  132. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +2 -2
  133. package/dist/martyrs/src/modules/products/components/sections/FilterProducts.vue.js +1 -1
  134. package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js +1 -1
  135. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js +1 -1
  136. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +1 -1
  137. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
  138. package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +2 -2
  139. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
  140. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
  141. package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js +1 -1
  142. package/dist/martyrs/src/modules/spots/components/pages/Spot.vue.js +1 -1
  143. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +2 -2
  144. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +2 -2
  145. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +1 -1
  146. package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +2 -2
  147. package/dist/martyrs.css +1 -1
  148. package/dist/martyrs.es.js +1 -1
  149. package/dist/music.server.js +4 -3
  150. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js +1 -1
  151. package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js +1 -1
  152. package/dist/orders.server.js +2 -2
  153. package/dist/organizations.server.js +10 -215
  154. package/dist/products.server.js +4 -3
  155. package/dist/queryProcessorOrganizations-BB11WFpc.js +221 -0
  156. package/dist/rents.server.js +2 -1
  157. package/dist/style.css +10 -1
  158. package/dist/{web-Cyc6i_pv.js → web-cNKIl_cL.js} +1 -1
  159. package/package.json +1 -1
  160. package/src/components/Button/Button.vue +1 -1
  161. package/src/components/Checkbox/Checkbox.vue +1 -1
  162. package/src/modules/core/views/components/layouts/Client.vue +7 -11
  163. package/src/modules/core/views/components/partials/Header.vue +1 -1
  164. package/src/modules/core/views/components/sections/Filters.vue +47 -161
  165. package/src/modules/core/views/components/sections/filters/FilterCheckbox.vue +12 -31
  166. package/src/modules/core/views/components/sections/filters/FilterDateRange.vue +15 -15
  167. package/src/modules/core/views/components/sections/filters/FilterOptions.vue +12 -43
  168. package/src/modules/core/views/components/sections/filters/FilterRange.vue +59 -36
  169. package/src/modules/core/views/components/sections/filters/FiltersGroup.vue +177 -0
  170. package/src/modules/core/views/utils/vue-app-renderer.js +12 -0
  171. package/src/modules/landing/components/sections/SectionFeatures.vue +1 -1
  172. package/src/modules/marketplace/controllers/marketplace.controller.js +123 -0
  173. package/src/modules/marketplace/controllers/utils/lookupConfigs.js +130 -0
  174. package/src/modules/marketplace/controllers/utils/queryProcessorMarketplace.js +211 -0
  175. package/src/modules/marketplace/marketplace.client.js +3 -10
  176. package/src/modules/marketplace/marketplace.server.js +22 -0
  177. package/src/modules/marketplace/routes/marketplace.routes.js +34 -0
  178. package/src/modules/marketplace/views/components/pages/Marketplace.vue +273 -0
  179. package/src/modules/marketplace/views/router/marketplace.router.js +37 -30
  180. package/src/modules/marketplace/views/store/marketplace.js +74 -3
  181. package/src/modules/organizations/components/blocks/CardOrganization.vue +8 -8
  182. package/src/modules/organizations/controllers/organizations.controller.js +1 -1
  183. package/src/modules/organizations/controllers/utils/queryProcessorOrganizations.js +8 -1
  184. package/dist/martyrs/src/components/Button/Button.vue.js.map +0 -1
  185. package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +0 -1
  186. package/dist/martyrs/src/components/Select/Select.vue2.js.map +0 -1
  187. package/dist/martyrs/src/components/Spoiler/Spoiler.vue.js.map +0 -1
  188. package/dist/martyrs/src/modules/marketplace/marketplace.router.js +0 -63
  189. package/dist/martyrs/src/modules/marketplace/marketplace.router.js.map +0 -1
  190. package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.js +0 -326
  191. package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.js.map +0 -1
  192. package/dist/martyrs/src/modules/marketplace/views/components/pages/Catalog.vue.js +0 -74
  193. package/dist/martyrs/src/modules/marketplace/views/components/pages/Catalog.vue.js.map +0 -1
  194. package/src/modules/core/views/components/sections/filters/FilterPrice.vue +0 -81
  195. package/src/modules/marketplace/marketplace.router.js +0 -66
  196. package/src/modules/marketplace/views/components/layouts/Marketplace.vue +0 -363
  197. package/src/modules/marketplace/views/components/pages/Catalog.vue +0 -73
@@ -0,0 +1,389 @@
1
+ import { m as middlewareIndexFactory } from "./index-_Edcmck_.js";
2
+ import { C as CacheNamespaced } from "./core.cache-DALYFDdy.js";
3
+ import { q as queryProcessorCore } from "./queryProcessor-CBQgZycY.js";
4
+ import { b as getLookupStages } from "./queryProcessorOrganizations-BB11WFpc.js";
5
+ import { Types } from "mongoose";
6
+ import * as googleMapsServicesJs from "@googlemaps/google-maps-services-js";
7
+ const lookupConfigs = {
8
+ availability: {
9
+ lookup: {
10
+ from: "stockavailabilities",
11
+ localField: "_id",
12
+ foreignField: "storage",
13
+ pipeline: [
14
+ {
15
+ $match: {
16
+ $expr: { $gt: ["$available", 0] }
17
+ }
18
+ },
19
+ {
20
+ $project: {
21
+ _id: 1,
22
+ product: 1,
23
+ variant: 1,
24
+ available: 1,
25
+ quantity: 1
26
+ }
27
+ }
28
+ ],
29
+ as: "availability"
30
+ }
31
+ },
32
+ variants: {
33
+ lookup: {
34
+ from: "variants",
35
+ let: { variantIds: "$availability.variant" },
36
+ pipeline: [
37
+ {
38
+ $match: {
39
+ $expr: {
40
+ $in: ["$_id", "$$variantIds"]
41
+ },
42
+ status: "published"
43
+ }
44
+ },
45
+ {
46
+ $project: {
47
+ _id: 1,
48
+ product: 1,
49
+ name: 1,
50
+ price: 1,
51
+ unit: 1,
52
+ images: 1,
53
+ sku: 1
54
+ }
55
+ }
56
+ ],
57
+ as: "variants"
58
+ }
59
+ },
60
+ products: {
61
+ lookup: {
62
+ from: "products",
63
+ localField: "organization",
64
+ foreignField: "owner.target",
65
+ pipeline: [
66
+ {
67
+ $match: {
68
+ status: "published"
69
+ }
70
+ },
71
+ {
72
+ $lookup: {
73
+ from: "variants",
74
+ localField: "_id",
75
+ foreignField: "product",
76
+ pipeline: [
77
+ {
78
+ $project: {
79
+ _id: 1,
80
+ name: 1,
81
+ price: 1,
82
+ unit: 1,
83
+ images: 1,
84
+ sku: 1
85
+ }
86
+ }
87
+ ],
88
+ as: "variants"
89
+ }
90
+ },
91
+ {
92
+ $project: {
93
+ _id: 1,
94
+ name: 1,
95
+ description: 1,
96
+ images: 1,
97
+ category: 1,
98
+ "owner.target": 1,
99
+ "owner.type": 1,
100
+ variants: 1
101
+ }
102
+ }
103
+ ],
104
+ as: "products"
105
+ }
106
+ },
107
+ organizations: {
108
+ lookup: {
109
+ from: "organizations",
110
+ let: { orgIds: "$products.owner.target" },
111
+ pipeline: [
112
+ {
113
+ $match: {
114
+ $expr: {
115
+ $in: ["$_id", "$$orgIds"]
116
+ }
117
+ }
118
+ },
119
+ {
120
+ $project: {
121
+ _id: 1,
122
+ "profile.name": 1,
123
+ "profile.photo": 1,
124
+ "profile.description": 1,
125
+ "profile.tags": 1,
126
+ rating: 1,
127
+ official: 1
128
+ }
129
+ }
130
+ ],
131
+ as: "organizations"
132
+ }
133
+ }
134
+ };
135
+ const ObjectId = Types.ObjectId;
136
+ const { Client } = googleMapsServicesJs;
137
+ const client = new Client({});
138
+ const getBasicMatchConditions = (query) => {
139
+ const conditions = [];
140
+ if (query.delivery) {
141
+ let deliveryMethods = Array.isArray(query.delivery) ? query.delivery : typeof query.delivery === "string" ? query.delivery.split(",") : [];
142
+ deliveryMethods = deliveryMethods.filter(Boolean).map((m) => m.trim());
143
+ if (deliveryMethods.length > 0) {
144
+ conditions.push({ delivery: { $in: deliveryMethods } });
145
+ }
146
+ }
147
+ if (query.payment) {
148
+ let paymentMethods = Array.isArray(query.payment) ? query.payment : typeof query.payment === "string" ? query.payment.split(",") : [];
149
+ paymentMethods = paymentMethods.filter(Boolean).map((m) => m.trim());
150
+ if (paymentMethods.length > 0) {
151
+ conditions.push({ payment: { $in: paymentMethods } });
152
+ }
153
+ }
154
+ return conditions;
155
+ };
156
+ const getPriceConditions = (priceMin, priceMax) => {
157
+ if (!priceMin && !priceMax) return [];
158
+ const conditions = {};
159
+ if (priceMin !== void 0 && priceMin !== null && priceMin !== "") {
160
+ conditions["products.variants.price"] = { $gte: parseFloat(priceMin) };
161
+ }
162
+ if (priceMax !== void 0 && priceMax !== null && priceMax !== "") {
163
+ if (conditions["products.variants.price"]) {
164
+ conditions["products.variants.price"].$lte = parseFloat(priceMax);
165
+ } else {
166
+ conditions["products.variants.price"] = { $lte: parseFloat(priceMax) };
167
+ }
168
+ }
169
+ return Object.keys(conditions).length > 0 ? [{ $match: conditions }] : [];
170
+ };
171
+ const getCategoryConditions = (categories) => {
172
+ if (!categories || categories.length === 0) return [];
173
+ const categoriesArray = Array.isArray(categories) ? categories : categories.split(",");
174
+ return [
175
+ {
176
+ $match: {
177
+ "products.category": { $in: categoriesArray.map((id) => new ObjectId(id)) }
178
+ }
179
+ }
180
+ ];
181
+ };
182
+ const getContainConditions = (contain) => {
183
+ if (!contain) return [];
184
+ const conditions = contain.map((property) => ({
185
+ [property]: { $exists: true, $not: { $size: 0 } }
186
+ }));
187
+ return conditions.length > 0 ? [{ $match: { $and: conditions } }] : [];
188
+ };
189
+ const hasLocationParams = (query) => query.location || query.address || query.city || query.state || query.country;
190
+ const resolveLocation = async (query) => {
191
+ if (query.location) {
192
+ const parsedLocation = typeof query.location === "string" ? JSON.parse(query.location) : query.location;
193
+ const coordinates = parsedLocation.lng ? [parsedLocation.lng, parsedLocation.lat] : parsedLocation.coordinates;
194
+ return { coordinates: coordinates.map((coord) => parseFloat(coord)) };
195
+ }
196
+ const searchString = [query.address, query.city, query.state, query.country].filter(Boolean).join(", ");
197
+ try {
198
+ const geoResponse = await client.geocode({
199
+ params: {
200
+ address: searchString,
201
+ key: process.env.GOOGLE_MAPS_API_KEY
202
+ }
203
+ });
204
+ if (!geoResponse.data.results?.length) {
205
+ throw new Error("Unable to geocode the provided location.");
206
+ }
207
+ const { lng, lat } = geoResponse.data.results[0].geometry.location;
208
+ return { coordinates: [lng, lat] };
209
+ } catch (err) {
210
+ throw new Error("Error occurred while geocoding.");
211
+ }
212
+ };
213
+ const getRadius = (query) => {
214
+ if (query.locationRadius) return parseFloat(query.locationRadius) / 6378.1;
215
+ if (query.city) return 25 / 6378.1;
216
+ if (query.state) return 50 / 6378.1;
217
+ return null;
218
+ };
219
+ const getDistanceStages = (location) => [
220
+ {
221
+ $addFields: {
222
+ distance: {
223
+ $function: {
224
+ body: `function(spotCoords, userCoords, isMiles) {
225
+ function toRad(x) {
226
+ return x * Math.PI / 180;
227
+ }
228
+ var lon1 = spotCoords[0];
229
+ var lat1 = spotCoords[1];
230
+ var lon2 = userCoords[0];
231
+ var lat2 = userCoords[1];
232
+ var R = 6371;
233
+ if (isMiles) R = 3959;
234
+ var x1 = lat2 - lat1;
235
+ var dLat = toRad(x1);
236
+ var x2 = lon2 - lon1;
237
+ var dLon = toRad(x2);
238
+ var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
239
+ Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) *
240
+ Math.sin(dLon / 2) * Math.sin(dLon / 2);
241
+ var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
242
+ var d = R * c;
243
+ return d;
244
+ }`,
245
+ args: ["$location.coordinates", location.coordinates, false],
246
+ lang: "js"
247
+ }
248
+ }
249
+ }
250
+ }
251
+ ];
252
+ const getSpotsLocationStages = async (query) => {
253
+ if (!hasLocationParams(query)) {
254
+ return { stages: [], userLocation: null };
255
+ }
256
+ const location = await resolveLocation(query);
257
+ const radius = getRadius(query);
258
+ const geoStages = radius ? [
259
+ {
260
+ $match: {
261
+ "location.coordinates": {
262
+ $geoWithin: {
263
+ $centerSphere: [[location.coordinates[0], location.coordinates[1]], radius]
264
+ }
265
+ }
266
+ }
267
+ }
268
+ ] : [];
269
+ return {
270
+ stages: [...geoStages, ...getDistanceStages(location)],
271
+ userLocation: location
272
+ };
273
+ };
274
+ const controllerFactory = (db) => {
275
+ const Spot = db.spot;
276
+ const cache = new CacheNamespaced({ ttlSeconds: 60 * 5 });
277
+ const readCatalog = async (req, res) => {
278
+ console.log("marketplace catalog query", req.query);
279
+ try {
280
+ const cacheKey = JSON.stringify(req.query);
281
+ let cachedResult = await cache.get(cacheKey);
282
+ if (cachedResult) {
283
+ return res.status(200).send(cachedResult);
284
+ }
285
+ const matchConditions = getBasicMatchConditions(req.query);
286
+ const stages = [
287
+ // Базовые фильтры spots (delivery, payment)
288
+ ...matchConditions.length > 0 ? [{ $match: { $and: matchConditions } }] : [],
289
+ // Геопоиск ПЕРВЫМ (если есть location)
290
+ ...req.query.location || req.query.city || req.query.state || req.query.country ? (await getSpotsLocationStages(req.query)).stages : [{ $addFields: { distance: null } }],
291
+ // Lookups (без availability пока)
292
+ ...getLookupStages(["products", "organizations"], lookupConfigs),
293
+ // Фильтр по наличию products
294
+ ...getContainConditions(["products", "organizations"]),
295
+ // Фильтр по ценам
296
+ ...getPriceConditions(req.query.priceMin, req.query.priceMax),
297
+ // Фильтр по категориям
298
+ ...getCategoryConditions(req.query.categories),
299
+ // Group по organization
300
+ {
301
+ $group: {
302
+ _id: { $arrayElemAt: ["$organizations._id", 0] },
303
+ profile: { $first: { $arrayElemAt: ["$organizations.profile", 0] } },
304
+ rating: { $first: { $arrayElemAt: ["$organizations.rating", 0] } },
305
+ official: { $first: { $arrayElemAt: ["$organizations.official", 0] } },
306
+ views: { $first: { $arrayElemAt: ["$organizations.views", 0] } },
307
+ spots: {
308
+ $push: {
309
+ _id: "$_id",
310
+ name: "$profile.name",
311
+ address: "$address",
312
+ location: "$location",
313
+ distance: "$distance",
314
+ delivery: "$delivery",
315
+ payment: "$payment"
316
+ }
317
+ },
318
+ products: { $first: "$products" },
319
+ distance: { $min: "$distance" }
320
+ }
321
+ },
322
+ // Добавляем numberOfProducts
323
+ {
324
+ $addFields: {
325
+ numberOfProducts: { $size: { $ifNull: ["$products", []] } }
326
+ }
327
+ },
328
+ // Финальная структура
329
+ {
330
+ $project: {
331
+ _id: 1,
332
+ profile: 1,
333
+ rating: 1,
334
+ official: 1,
335
+ views: 1,
336
+ spots: 1,
337
+ products: 1,
338
+ distance: 1,
339
+ numberOfProducts: 1
340
+ }
341
+ },
342
+ // Сортировка
343
+ ...queryProcessorCore.getSortingOptions(req.query.sortParam || "distance", req.query.sortOrder),
344
+ // Пагинация
345
+ ...queryProcessorCore.getPaginationOptions(req.query.skip, req.query.limit)
346
+ ].filter(Boolean);
347
+ console.log("Marketplace pipeline:", JSON.stringify(stages, null, 2));
348
+ const catalog = await Spot.aggregate(stages);
349
+ await cache.setWithTags(cacheKey, catalog, ["marketplace_catalog"]);
350
+ res.status(200).send(catalog);
351
+ } catch (err) {
352
+ console.error("Marketplace catalog error:", err);
353
+ res.status(500).send({ message: err.message });
354
+ }
355
+ };
356
+ return {
357
+ readCatalog
358
+ };
359
+ };
360
+ const marketplaceRoutes = (function(app, db) {
361
+ const controller = controllerFactory(db);
362
+ const { authJwt } = middlewareIndexFactory(db);
363
+ app.get(
364
+ "/api/marketplace/catalog",
365
+ [
366
+ authJwt.verifyToken(true)
367
+ // Optional authentication
368
+ ],
369
+ controller.readCatalog
370
+ );
371
+ });
372
+ function initializeMarketplace(app, db, origins, publicPath) {
373
+ if (app) {
374
+ marketplaceRoutes(app, db);
375
+ }
376
+ }
377
+ const routes = {
378
+ marketplaceRoutes
379
+ };
380
+ const initialize = initializeMarketplace;
381
+ const marketplace_server = {
382
+ initialize: initializeMarketplace,
383
+ routes
384
+ };
385
+ export {
386
+ marketplace_server as default,
387
+ initialize,
388
+ routes
389
+ };
@@ -2,7 +2,7 @@ import { ref, createElementBlock, openBlock, normalizeClass, withModifiers, crea
2
2
  import Loader from "../Loader/Loader.vue.js";
3
3
  import _sfc_main$1 from "../../modules/icons/navigation/IconCheckmark.vue.js";
4
4
  import _sfc_main$2 from "../../modules/icons/navigation/IconCross.vue.js";
5
- /* empty css */
5
+ /* empty css */
6
6
  const _hoisted_1 = ["disabled"];
7
7
  const _hoisted_2 = {
8
8
  key: 0,
@@ -18,7 +18,7 @@ const _hoisted_4 = {
18
18
  };
19
19
  const _hoisted_5 = {
20
20
  key: 0,
21
- class: "button-counter flex flex-center"
21
+ class: "button-counter font-second flex flex-center"
22
22
  };
23
23
  const _sfc_main = {
24
24
  __name: "Button",
@@ -155,4 +155,4 @@ const _sfc_main = {
155
155
  export {
156
156
  _sfc_main as default
157
157
  };
158
- //# sourceMappingURL=Button.vue.js.map
158
+ //# sourceMappingURL=Button.vue2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.vue2.js","sources":["../../../../../src/components/Button/Button.vue"],"sourcesContent":["<script setup>\nimport { ref } from 'vue'\n\nimport Loader from '@martyrs/src/components/Loader/Loader.vue'\n\nimport IconCheckmark from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue';\n\nconst props = defineProps({\n submit: {\n type: Function,\n default: async () => { console.log('Button click.') }\n },\n text: {\n type: Object,\n default: () => ({\n success: null,\n error: null\n })\n },\n counter: {\n type: Object\n },\n callback: {\n type: Function,\n default: async () => { console.log('Button callback.') }\n },\n callbackDelay: {\n type: Number,\n default: 750\n },\n showSucces: {\n type: Boolean,\n default: true\n },\n showLoader: {\n type: Boolean,\n default: true\n },\n validation: {\n type: Boolean,\n default: false\n },\n})\n\nconst emits = defineEmits(['error'])\n\nconst button = ref(null)\nconst error = ref(null)\nconst loading = ref(false)\nconst finished = ref(false)\n\nasync function Submit() {\n console.log('click')\n \n button.value.style['pointer-events'] = 'none'\n error.value = null\n loading.value = true\n\n // Функция для сброса состояния кнопки\n const resetButton = () => {\n if (button.value) {\n button.value.style.pointerEvents = 'auto'\n loading.value = false\n finished.value = false\n error.value = null\n }\n }\n\n try {\n await props.submit()\n\n button.value.classList.replace('bg-main', 'bg-second')\n loading.value = false\n\n // Используем функцию сброса состояния кнопки здесь\n if (props.showSucces) { \n finished.value = true\n setTimeout(() => {\n resetButton()\n button.value.classList.replace('bg-second', 'bg-main')\n }, 500)\n } else {\n resetButton()\n button.value.classList.replace('bg-second', 'bg-main')\n }\n\n // Если есть callback, мы также установим таймер для его вызова\n if (props.callback) setTimeout(() => props.callback(), props.callbackDelay)\n\n } catch (err) {\n emits('error', err)\n // Если возникла ошибка, мы изменяем стили и устанавливаем сообщение об ошибке\n button.value.classList.replace('bg-main', 'bg-fourth-nano')\n loading.value = false\n error.value = true\n \n // После задержки снова сбрасываем состояние кнопки\n setTimeout(() => {\n resetButton()\n // Так как класс кнопки был изменен, вернем его в исходное состояние\n button.value.classList.replace('bg-fourth-nano', 'bg-main')\n }, 1330)\n }\n}\n</script>\n\n<template>\n <button \n @click.stop=\"Submit\"\n :disabled=\"validation\"\n ref=\"button\"\n\t\tclass=\"button\"\n :class=\"{ 'button--disabled': loading || validation }\"\n >\n <Transition name=\"content\" mode=\"out-in\">\n <!-- Default slot content -->\n <span v-if=\"!loading && !error && !finished || !showLoader\" class=\"button-content\">\n <slot></slot>\n </span>\n <!-- Loading state -->\n <Loader v-else-if=\"loading && !error && showLoader\" class=\"icon button-content pos-relative pos-t-0 pos-l-0 loading\"/>\n <!-- Success state -->\n <span v-else-if=\"finished && showSucces\" class=\"button-content t-semi t-center w-100 loading t-black\">\n <template v-if=\"text.success\">\n {{ text.success }}\n </template>\n <IconCheckmark v-else class=\"icon\" />\n </span>\n <!-- Error state -->\n <span v-else-if=\"error\" class=\"button-content t-center w-100 error\">\n <template v-if=\"text.error\">\n {{ text.error }}\n </template>\n <IconCross v-else class=\"icon\" />\n </span>\n </Transition>\n \n <!-- Counter -->\n <div v-if=\"counter\" class=\"button-counter font-second flex flex-center\">\n <span>{{ counter }}</span>\n </div>\n </button>\n</template>\n\n<style lang=\"scss\">\nbutton[disabled] {\n opacity: 0.75 !important;\n pointer-events: none !important;\n cursor: default !important;\n color: rgba(var(--dark), 0.33) !important;\n background: rgba(var(--light), 1) !important;\n}\n\na.button {\n text-box: trim-both cap alphabetic;\n}\n\n.button {\n display: flex;\n padding: var(--small);\n border-radius: var(--small);\n text-box: trim-both cap alphabetic;\n transform: scale(1);\n opacity: 1;\n align-items: center;\n justify-content: center;\n color: black;\n text-align: center;\n font-size: 1rem;\n letter-spacing: 5%;\n transition: all 0.33s ease;\n\n &:hover {\n cursor: pointer;\n opacity: 0.9;\n }\n\n &:active {\n transform: scale(0.95);\n }\n\n &-small {\n padding: 0.75rem;\n border-radius: 0.5rem;\n height: fit-content;\n }\n\n .button-counter {\n position: absolute;\n right: -8px;\n bottom: -8px;\n background: yellow;\n height: 16px;\n border-radius: 16px;\n width: 16px;\n font-weight: 500;\n text-align: center;\n line-height: 16px;\n font-size: 10px;\n }\n}\n\n.button-content {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n.icon {\n width: 1rem;\n height: 1rem;\n}\n\n/* Vue Transitions */\n.content-enter-active,\n.content-leave-active {\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.content-enter-from {\n opacity: 0;\n transform: translateY(8px) scale(0.95);\n}\n\n.content-leave-to {\n opacity: 0;\n transform: translateY(-8px) scale(0.95);\n}\n\n.content-enter-to,\n.content-leave-from {\n opacity: 1;\n transform: translateY(0) scale(1);\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,UAAM,QAAQ;AAqCd,UAAM,QAAQ;AAEd,UAAM,SAAS,IAAI,IAAI;AACvB,UAAM,QAAQ,IAAI,IAAI;AACtB,UAAM,UAAU,IAAI,KAAK;AACzB,UAAM,WAAW,IAAI,KAAK;AAE1B,mBAAe,SAAS;AACtB,cAAQ,IAAI,OAAO;AAEnB,aAAO,MAAM,MAAM,gBAAgB,IAAI;AACvC,YAAM,QAAQ;AACd,cAAQ,QAAQ;AAGhB,YAAM,cAAc,MAAM;AACxB,YAAI,OAAO,OAAO;AAChB,iBAAO,MAAM,MAAM,gBAAgB;AACnC,kBAAQ,QAAQ;AAChB,mBAAS,QAAQ;AACjB,gBAAM,QAAQ;AAAA,QAChB;AAAA,MACF;AAEA,UAAI;AACF,cAAM,MAAM,OAAM;AAElB,eAAO,MAAM,UAAU,QAAQ,WAAW,WAAW;AACrD,gBAAQ,QAAQ;AAGhB,YAAI,MAAM,YAAY;AACpB,mBAAS,QAAQ;AACjB,qBAAW,MAAM;AACf,wBAAW;AACX,mBAAO,MAAM,UAAU,QAAQ,aAAa,SAAS;AAAA,UACvD,GAAG,GAAG;AAAA,QACR,OAAO;AACL,sBAAW;AACX,iBAAO,MAAM,UAAU,QAAQ,aAAa,SAAS;AAAA,QACvD;AAGA,YAAI,MAAM,SAAU,YAAW,MAAM,MAAM,SAAQ,GAAI,MAAM,aAAa;AAAA,MAE5E,SAAS,KAAK;AACZ,cAAM,SAAS,GAAG;AAElB,eAAO,MAAM,UAAU,QAAQ,WAAW,gBAAgB;AAC1D,gBAAQ,QAAQ;AAChB,cAAM,QAAQ;AAGd,mBAAW,MAAM;AACf,sBAAW;AAEX,iBAAO,MAAM,UAAU,QAAQ,kBAAkB,SAAS;AAAA,QAC5D,GAAG,IAAI;AAAA,MACT;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { createElementBlock, openBlock, createCommentVNode, createElementVNode, toDisplayString, normalizeClass, createVNode } from "vue";
2
2
  import _sfc_main$1 from "../../modules/icons/navigation/IconCheckmark.vue.js";
3
- const _hoisted_1 = { class: "flex-v-center flex-nowrap flex" };
3
+ const _hoisted_1 = { class: "flex-v-center cursor-pointer flex-nowrap flex" };
4
4
  const _hoisted_2 = {
5
5
  key: 0,
6
6
  class: "mn-r-auto t-transp mn-r-small"
@@ -1 +1 @@
1
- {"version":3,"file":"Checkbox.vue.js","sources":["../../../../../src/components/Checkbox/Checkbox.vue"],"sourcesContent":["<script setup>\n import { ref, watch, computed } from 'vue'\n\n import IconCheckmark from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\n\n const props = defineProps({\n label: String,\n name: String,\n value: String,\n radio: {\n type: [Array, Boolean, Object],\n default: () => []\n },\n theme: {\n type: String,\n default: \"light\"\n },\n mode: {\n type: String,\n default: \"switch\",\n validator: (v) => [\"switch\", \"checkbox\"].includes(v)\n }\n })\n const emit = defineEmits(['update:radio'])\n const updateInputText = (event) => {\n if (Array.isArray(props.radio)) {\n let newRadio = [...props.radio]; // создаем копию массива для иммутабельности\n if (event.target.checked) {\n newRadio.push(props.value);\n } else {\n const index = newRadio.indexOf(props.value);\n if (index !== -1) {\n newRadio.splice(index, 1);\n }\n }\n emit('update:radio', newRadio);\n } else if (typeof props.radio === 'boolean') {\n emit('update:radio', event.target.checked);\n }\n }\n</script>\n<template>\n <label class=\"flex-v-center flex-nowrap flex\">\n <div v-if=\"label\" class=\"mn-r-auto t-transp mn-r-small\">\n <span>{{label}}</span>\n </div>\n <input \n @change=\"updateInputText\"\n class=\"round radiobutton\" \n type=\"checkbox\" \n :name=\"name\" \n :value=\"value\"\n :checked=\"Array.isArray(radio) ? radio.includes(value) : radio\"\n > \n <div \n class=\"cursor-pointer mn-l-thin flex-center field-wrapper\"\n :class=\"{\n 'transition-elastic pd-thin h-2r w-4r radius-extra': mode === 'switch',\n 'w-2r h-2r radius-small': mode === 'checkbox',\n 'bg-dark': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'dark' && mode === 'switch',\n 'br-dark': theme === 'dark' && mode === 'checkbox',\n 'bg-light': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'light' && mode === 'switch',\n 'bg-light': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'light' && mode === 'checkbox','bg-main': (Array.isArray(radio) ? radio.includes(value) : radio) && mode === 'switch',\n 'bg-main br-main': (Array.isArray(radio) ? radio.includes(value) : radio) && mode === 'checkbox',\n }\"\n >\n <!-- Switch toggle circle -->\n <div \n v-if=\"mode === 'switch'\"\n class=\"transition-linear w-1r h-1r radius-extra bg-white\"\n :class=\"{\n 'mn-r-auto': !(Array.isArray(radio) ? radio.includes(value) : radio),\n 'mn-l-auto': Array.isArray(radio) ? radio.includes(value) : radio,\n }\"\n />\n <!-- Checkbox checkmark -->\n <span \n v-else-if=\"mode === 'checkbox' && (Array.isArray(radio) ? radio.includes(value) : radio)\"\n class=\"t-white w-100 h-100 flex flex-center\"\n >\n <IconCheckmark class=\"i-medium\" fill=\"rgb(var(--white))\" />\n </span>\n </div>\n </label>\n</template>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKE,UAAM,QAAQ;AAkBd,UAAM,OAAO;AACb,UAAM,kBAAkB,CAAC,UAAU;AACjC,UAAI,MAAM,QAAQ,MAAM,KAAK,GAAG;AAC9B,YAAI,WAAW,CAAC,GAAG,MAAM,KAAK;AAC9B,YAAI,MAAM,OAAO,SAAS;AACxB,mBAAS,KAAK,MAAM,KAAK;AAAA,QAC3B,OAAO;AACL,gBAAM,QAAQ,SAAS,QAAQ,MAAM,KAAK;AAC1C,cAAI,UAAU,IAAI;AAChB,qBAAS,OAAO,OAAO,CAAC;AAAA,UAC1B;AAAA,QACF;AACA,aAAK,gBAAgB,QAAQ;AAAA,MAC/B,WAAW,OAAO,MAAM,UAAU,WAAW;AAC3C,aAAK,gBAAgB,MAAM,OAAO,OAAO;AAAA,MAC3C;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Checkbox.vue.js","sources":["../../../../../src/components/Checkbox/Checkbox.vue"],"sourcesContent":["<script setup>\n import { ref, watch, computed } from 'vue'\n\n import IconCheckmark from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\n\n const props = defineProps({\n label: String,\n name: String,\n value: String,\n radio: {\n type: [Array, Boolean, Object],\n default: () => []\n },\n theme: {\n type: String,\n default: \"light\"\n },\n mode: {\n type: String,\n default: \"switch\",\n validator: (v) => [\"switch\", \"checkbox\"].includes(v)\n }\n })\n const emit = defineEmits(['update:radio'])\n const updateInputText = (event) => {\n if (Array.isArray(props.radio)) {\n let newRadio = [...props.radio]; // создаем копию массива для иммутабельности\n if (event.target.checked) {\n newRadio.push(props.value);\n } else {\n const index = newRadio.indexOf(props.value);\n if (index !== -1) {\n newRadio.splice(index, 1);\n }\n }\n emit('update:radio', newRadio);\n } else if (typeof props.radio === 'boolean') {\n emit('update:radio', event.target.checked);\n }\n }\n</script>\n<template>\n <label class=\"flex-v-center cursor-pointer flex-nowrap flex\">\n <div v-if=\"label\" class=\"mn-r-auto t-transp mn-r-small\">\n <span>{{label}}</span>\n </div>\n <input \n @change=\"updateInputText\"\n class=\"round radiobutton\" \n type=\"checkbox\" \n :name=\"name\" \n :value=\"value\"\n :checked=\"Array.isArray(radio) ? radio.includes(value) : radio\"\n > \n <div \n class=\"cursor-pointer mn-l-thin flex-center field-wrapper\"\n :class=\"{\n 'transition-elastic pd-thin h-2r w-4r radius-extra': mode === 'switch',\n 'w-2r h-2r radius-small': mode === 'checkbox',\n 'bg-dark': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'dark' && mode === 'switch',\n 'br-dark': theme === 'dark' && mode === 'checkbox',\n 'bg-light': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'light' && mode === 'switch',\n 'bg-light': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'light' && mode === 'checkbox','bg-main': (Array.isArray(radio) ? radio.includes(value) : radio) && mode === 'switch',\n 'bg-main br-main': (Array.isArray(radio) ? radio.includes(value) : radio) && mode === 'checkbox',\n }\"\n >\n <!-- Switch toggle circle -->\n <div \n v-if=\"mode === 'switch'\"\n class=\"transition-linear w-1r h-1r radius-extra bg-white\"\n :class=\"{\n 'mn-r-auto': !(Array.isArray(radio) ? radio.includes(value) : radio),\n 'mn-l-auto': Array.isArray(radio) ? radio.includes(value) : radio,\n }\"\n />\n <!-- Checkbox checkmark -->\n <span \n v-else-if=\"mode === 'checkbox' && (Array.isArray(radio) ? radio.includes(value) : radio)\"\n class=\"t-white w-100 h-100 flex flex-center\"\n >\n <IconCheckmark class=\"i-medium\" fill=\"rgb(var(--white))\" />\n </span>\n </div>\n </label>\n</template>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKE,UAAM,QAAQ;AAkBd,UAAM,OAAO;AACb,UAAM,kBAAkB,CAAC,UAAU;AACjC,UAAI,MAAM,QAAQ,MAAM,KAAK,GAAG;AAC9B,YAAI,WAAW,CAAC,GAAG,MAAM,KAAK;AAC9B,YAAI,MAAM,OAAO,SAAS;AACxB,mBAAS,KAAK,MAAM,KAAK;AAAA,QAC3B,OAAO;AACL,gBAAM,QAAQ,SAAS,QAAQ,MAAM,KAAK;AAC1C,cAAI,UAAU,IAAI;AAChB,qBAAS,OAAO,OAAO,CAAC;AAAA,UAC1B;AAAA,QACF;AACA,aAAK,gBAAgB,QAAQ;AAAA,MAC/B,WAAW,OAAO,MAAM,UAAU,WAAW;AAC3C,aAAK,gBAAgB,MAAM,OAAO,OAAO;AAAA,MAC3C;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { ref, onMounted, watchEffect, createBlock, openBlock, unref, isRef, withCtx, renderSlot, createVNode, createElementBlock, createCommentVNode, toDisplayString } from "vue";
2
2
  import Field from "../Field/Field.vue.js";
3
- import _sfc_main$1 from "../Button/Button.vue.js";
3
+ import _sfc_main$1 from "../Button/Button.vue2.js";
4
4
  import _sfc_main$2 from "../../modules/icons/navigation/IconArrow.vue.js";
5
5
  import { useI18n } from "vue-i18n";
6
6
  const _hoisted_1 = {
@@ -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.vue2.js.map
17
+ //# sourceMappingURL=Menu.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { ref, computed, watch, createElementBlock, openBlock, Fragment, withDirectives, createVNode, normalizeClass, withModifiers, createCommentVNode, createElementVNode, toDisplayString, Transition, withCtx, renderList, vShow, unref, nextTick } from "vue";
2
2
  import clickOutside from "../FieldPhone/click-outside.js";
3
- /* empty css */
3
+ /* empty css */
4
4
  import _export_sfc from "../../../../_virtual/_plugin-vue_export-helper.js";
5
5
  const _hoisted_1 = {
6
6
  key: 0,
@@ -131,4 +131,4 @@ const Select = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-849
131
131
  export {
132
132
  Select as default
133
133
  };
134
- //# sourceMappingURL=Select.vue2.js.map
134
+ //# sourceMappingURL=Select.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Select.vue.js","sources":["../../../../../src/components/Select/Select.vue"],"sourcesContent":["<template>\n <!-- Input Wrapper -->\n <div \n ref=\"fieldWrapper\"\n tabindex=\"0\"\n @click.stop=\"toggleMenu\" \n v-click-outside=\"clickedOutside\" \n :class=\"$attrs.class\" \n class=\"cursor-pointer field-wrapper flex-v-center flex-nowrap flex pos-relative\"\n >\n <!-- Label -->\n <span v-if=\"label\" class=\"t-transp mn-r-small\">{{label}}</span>\n \n <!-- Input -->\n <span>\n {{ optionsSelected ? (optionsSelected.name || optionsSelected[props.value] || optionsSelected) : placeholder }}\n </span>\n <!-- Dropdown menu -->\n <transition mode=\"out-in\" name=\"TransitionTranslateY\">\n <ul \n v-show=\"showMenu\" \n class=\"bs-black pos-absolute pos-t-100 pos-l-0 z-index-5 pd-small radius-small bg-white mn-t-thin w-100\"\n style=\"min-width: max-content;\"\n >\n <li @click.stop=\"selectOption(option)\" v-for=\"option in optionsListed\" class=\"radius-thin hover-bg-light pd-thin text-box-trim\">\n <span v-if=\"option\" class=\"w-100\">\n {{ option.name || option[props.value] || option }}\n </span>\n </li>\n </ul>\n </transition>\n </div>\n <!-- Validation -->\n <transition mode=\"out-in\" name=\"fade\">\n <div v-if=\"validation\" class=\"mn-t-thin invalid-feedback\">\n * {{validation.message}}\n </div>\n </transition>\n</template>\n<script setup>\nimport { ref, computed, watch, nextTick } from 'vue'\nimport clickOutside from '../FieldPhone/click-outside.js';\nlet vClickOutside = clickOutside\nconst emit = defineEmits([\n 'update:select', \n 'focus', \n 'blur'\n])\nconst props = defineProps({\n label: String,\n placeholder: { type: String, default: 'Please select an item' },\n select: [String, Object],\n property: String,\n value: String,\n options: { type: Array, default: () => [] },\n validation: Boolean,\n})\nconst showMenu = ref(false)\nconst fieldWrapper = ref(null)\nconst optionsSelected = ref(\n props.property \n ? findObjectByValue(props.select, props.property, props.options) \n : props.select\n)\nconst optionsListed = computed(() => {\n return props.select \n ? props.options.filter(option => option !== props.select) \n : props.options\n})\nwatch(() => props.select, (newSelect) => {\n optionsSelected.value = \n props.property \n ? findObjectByValue(props.select, props.property, props.options) \n : props.select;\n});\nconst toggleMenu = async () => {\n showMenu.value = !showMenu.value\n \n if (showMenu.value) {\n await nextTick()\n fieldWrapper.value?.focus()\n emit('focus')\n } else {\n emit('blur')\n }\n}\nfunction clickedOutside () {\n showMenu.value = false\n}\nconst selectOption = option => {\n optionsSelected.value = option\n \n toggleMenu()\n if (props.property) { \n emit('update:select', optionsSelected.value[props.property])\n } else {\n emit('update:select', optionsSelected.value)\n }\n}\nfunction findObjectByValue (value, property, objects) {\n for (const object of objects) {\n if (object[property] === value || object === value) {\n return object;\n }\n }\n return null;\n}\n</script>\n<style lang=\"scss\" scoped>\n li {\n list-style-type: none;\n }\n ul li {\n line-height: 2;\n }\n .field-wrapper:focus {\n outline: none;\n }\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,QAAI,gBAAgB;AACpB,UAAM,OAAO;AAKb,UAAM,QAAQ;AASd,UAAM,WAAW,IAAI,KAAK;AAC1B,UAAM,eAAe,IAAI,IAAI;AAC7B,UAAM,kBAAkB;AAAA,MACtB,MAAM,WACJ,kBAAkB,MAAM,QAAQ,MAAM,UAAU,MAAM,OAAO,IAC7D,MAAM;AAAA,IACV;AACA,UAAM,gBAAgB,SAAS,MAAM;AACnC,aAAO,MAAM,SACX,MAAM,QAAQ,OAAO,YAAU,WAAW,MAAM,MAAM,IACtD,MAAM;AAAA,IACV,CAAC;AACD,UAAM,MAAM,MAAM,QAAQ,CAAC,cAAc;AACvC,sBAAgB,QAChB,MAAM,WACJ,kBAAkB,MAAM,QAAQ,MAAM,UAAU,MAAM,OAAO,IAC7D,MAAM;AAAA,IACV,CAAC;AACD,UAAM,aAAa,YAAY;AAC7B,eAAS,QAAQ,CAAC,SAAS;AAE3B,UAAI,SAAS,OAAO;AAClB,cAAM,SAAQ;AACd,qBAAa,OAAO,MAAK;AACzB,aAAK,OAAO;AAAA,MACd,OAAO;AACL,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AACA,aAAS,iBAAkB;AACzB,eAAS,QAAQ;AAAA,IACnB;AACA,UAAM,eAAe,YAAU;AAC7B,sBAAgB,QAAQ;AAExB,iBAAU;AACV,UAAI,MAAM,UAAU;AAClB,aAAK,iBAAiB,gBAAgB,MAAM,MAAM,QAAQ,CAAC;AAAA,MAC7D,OAAO;AACL,aAAK,iBAAiB,gBAAgB,KAAK;AAAA,MAC7C;AAAA,IACF;AACA,aAAS,kBAAmB,OAAO,UAAU,SAAS;AACpD,iBAAW,UAAU,SAAS;AAC5B,YAAI,OAAO,QAAQ,MAAM,SAAS,WAAW,OAAO;AAClD,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -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.vue.js.map
73
+ //# sourceMappingURL=Spoiler.vue2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spoiler.vue2.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,7 +1,7 @@
1
1
  import { ref, createElementBlock, openBlock, createElementVNode, createCommentVNode, createVNode, toDisplayString, unref, createTextVNode, withCtx } from "vue";
2
2
  /* empty css */
3
3
  import Field from "../../../../../components/Field/Field.vue.js";
4
- import _sfc_main$1 from "../../../../../components/Button/Button.vue.js";
4
+ import _sfc_main$1 from "../../../../../components/Button/Button.vue2.js";
5
5
  import { useRoute, useRouter } from "vue-router";
6
6
  import { useI18n } from "vue-i18n";
7
7
  import { state, actions } from "../../store/auth.js";
@@ -1,7 +1,7 @@
1
1
  import { ref, onMounted, createElementBlock, openBlock, createElementVNode, createVNode, withCtx } from "vue";
2
2
  /* empty css */
3
3
  import Field from "../../../../../components/Field/Field.vue.js";
4
- import _sfc_main$1 from "../../../../../components/Button/Button.vue.js";
4
+ import _sfc_main$1 from "../../../../../components/Button/Button.vue2.js";
5
5
  import { useRoute, useRouter } from "vue-router";
6
6
  import { state, actions } from "../../store/auth.js";
7
7
  import invitesStore from "../../../../organizations/store/invites.store.js";
@@ -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
3
  /* empty css */
4
- /* empty css */
4
+ /* empty css */
5
5
  import _sfc_main$1 from "../../../../../components/Dropdown/Dropdown.vue.js";
6
- import _sfc_main$6 from "../../../../../components/Menu/Menu.vue2.js";
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 { createElementBlock, openBlock, createVNode, createElementVNode, unref, withCtx, createTextVNode } from "vue";
2
2
  import _sfc_main$2 from "../../../../../components/Checkbox/Checkbox.vue.js";
3
- import _sfc_main$3 from "../../../../../components/Button/Button.vue.js";
3
+ import _sfc_main$3 from "../../../../../components/Button/Button.vue2.js";
4
4
  import _sfc_main$1 from "../sections/ProfileEditCredentials.vue.js";
5
5
  import { useRouter } from "vue-router";
6
6
  import { actions as actions$1 } from "../../store/auth.js";
@@ -1,6 +1,6 @@
1
1
  import { createElementBlock, openBlock, createElementVNode, createVNode, toDisplayString, withCtx, createTextVNode } from "vue";
2
2
  import Field from "../../../../../components/Field/Field.vue.js";
3
- import _sfc_main$1 from "../../../../../components/Button/Button.vue.js";
3
+ import _sfc_main$1 from "../../../../../components/Button/Button.vue2.js";
4
4
  import UploadImage from "../../../../../components/UploadImage/UploadImage.vue.js";
5
5
  import { useRouter } from "vue-router";
6
6
  import { state, actions } from "../../store/users.js";
@@ -2,7 +2,7 @@ import { ref, computed, createElementBlock, openBlock, createElementVNode, creat
2
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
- import _sfc_main$3 from "../../../../../components/Button/Button.vue.js";
5
+ import _sfc_main$3 from "../../../../../components/Button/Button.vue2.js";
6
6
  import { useRoute, useRouter } from "vue-router";
7
7
  import { useI18n } from "vue-i18n";
8
8
  import { useStore } from "../../../../core/views/store/core.store.js";
@@ -2,7 +2,7 @@ import { ref, computed, onMounted, resolveComponent, createElementBlock, openBlo
2
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
- import _sfc_main$3 from "../../../../../components/Button/Button.vue.js";
5
+ import _sfc_main$3 from "../../../../../components/Button/Button.vue2.js";
6
6
  import { useRoute, useRouter } from "vue-router";
7
7
  import { useI18n } from "vue-i18n";
8
8
  import { useStore } from "../../../../core/views/store/core.store.js";
@@ -2,7 +2,7 @@ import { ref, computed, resolveComponent, createElementBlock, openBlock, createE
2
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
- import _sfc_main$3 from "../../../../../components/Button/Button.vue.js";
5
+ import _sfc_main$3 from "../../../../../components/Button/Button.vue2.js";
6
6
  import { useRoute, useRouter } from "vue-router";
7
7
  import { useI18n } from "vue-i18n";
8
8
  import { useStore } from "../../../../core/views/store/core.store.js";
@@ -1,6 +1,6 @@
1
1
  import { ref, onMounted, createElementBlock, createCommentVNode, openBlock, createElementVNode, createBlock, createVNode, withCtx, createTextVNode } from "vue";
2
2
  import Field from "../../../../../components/Field/Field.vue.js";
3
- import _sfc_main$1 from "../../../../../components/Button/Button.vue.js";
3
+ import _sfc_main$1 from "../../../../../components/Button/Button.vue2.js";
4
4
  import { useRoute, useRouter } from "vue-router";
5
5
  import { actions, state } from "../../store/users.js";
6
6
  import { sendCode, state as state$1 } from "../../store/twofa.js";
@@ -1,6 +1,6 @@
1
1
  import { ref, resolveComponent, createElementBlock, openBlock, createElementVNode, createCommentVNode, createVNode, unref, createBlock, normalizeClass, createTextVNode, withCtx, Transition, resolveDynamicComponent, Fragment, renderList } from "vue";
2
2
  import { useRoute, useRouter } from "vue-router";
3
- import Select from "../../../../components/Select/Select.vue2.js";
3
+ import Select from "../../../../components/Select/Select.vue.js";
4
4
  import _sfc_main$5 from "../../../../components/Feed/Feed.vue.js";
5
5
  import _sfc_main$6 from "../../../organizations/components/blocks/CardOrganization.vue.js";
6
6
  import _sfc_main$1 from "../../../icons/entities/IconFeatured.vue.js";