@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
@@ -19,9 +19,9 @@
19
19
  class="pd-small radius-medium bg-light cursor-pointer flex-v-center flex gap-micro"
20
20
  :class="{ 'selected bg-main': isFilterActive(filter) }"
21
21
  >
22
- <IconCalendar v-if="filter.type === 'date'" class="i-medium" />
23
- <span class="t-nowrap h-1r">{{ filter.title }}</span>
24
- <span v-if="getFilterValue(filter)" class="mn-l-micro">
22
+ <IconCalendar v-if="filter.type === 'date'" class="mn-r-micro i-medium" />
23
+ <span class="t-nowrap">{{ filter.type === 'date' && getFilterValue(filter) ? formatFilterValue(filter) : filter.title }}</span>
24
+ <span v-if="getFilterValue(filter) && filter.type !== 'date'" class="mn-l-micro">
25
25
  {{ formatFilterValue(filter) }}
26
26
  </span>
27
27
  </button>
@@ -100,7 +100,7 @@
100
100
  v-model:date="tempSelected[filter.value]"
101
101
  :allowRange="true"
102
102
  :disablePastDates="true"
103
- class="bg-light radius-small"
103
+ class="bg-light radius-small"
104
104
  />
105
105
  </div>
106
106
  </div>
@@ -180,13 +180,6 @@
180
180
 
181
181
  <!-- Date Filter -->
182
182
  <div v-else-if="filter.type === 'date'">
183
- <div
184
- @click="() => { tempDateRange = tempSelected[filter.value]; tempSelected[filter.value] = tempSelected[filter.value] || null; }"
185
- class="pd-small radius-small bg-light cursor-pointer flex-v-center flex gap-micro"
186
- >
187
- <IconCalendar class="i-small" />
188
- <span>{{ tempSelected[filter.value] ? `${formatDate(tempSelected[filter.value].start, { dayMonth: true, language: 'en' })} - ${formatDate(tempSelected[filter.value].end, { dayMonth: true, language: 'en' })}` : 'Select dates'}}</span>
189
- </div>
190
183
  <div class="mn-t-small">
191
184
  <Calendar
192
185
  v-model:date="tempSelected[filter.value]"
@@ -198,19 +191,20 @@
198
191
  </div>
199
192
 
200
193
  <div class="flex gap-thin mn-t-medium">
201
- <button
194
+ <button
202
195
  @click="cancelFilter(filter.value)"
203
- class="w-100 button bg-light"
196
+ class="bg-light button flex-child-full"
204
197
  >
205
198
  Cancel
206
199
  </button>
207
- <button
200
+ <button
208
201
  @click="applyFilter(filter.value)"
209
- class="w-100 button bg-main"
202
+ class="bg-main w-100 button flex-child-full"
210
203
  >
211
204
  Apply
212
205
  </button>
213
-
206
+
207
+
214
208
  </div>
215
209
  </Popup>
216
210
  </div>
@@ -307,7 +301,22 @@ const isFilterActive = (filter) => {
307
301
  }
308
302
 
309
303
  const getFilterValue = (filter) => {
310
- return selected.value[filter.value]
304
+ const value = selected.value[filter.value]
305
+ if (!value) return false
306
+
307
+ if (filter.type === 'range') {
308
+ return value.min || value.max
309
+ }
310
+
311
+ if (filter.type === 'date') {
312
+ return value && value.start && value.end
313
+ }
314
+
315
+ if (Array.isArray(value)) {
316
+ return value.length > 0
317
+ }
318
+
319
+ return value
311
320
  }
312
321
 
313
322
  const formatFilterValue = (filter) => {
@@ -25,6 +25,9 @@ export default db => {
25
25
  text: {
26
26
  type: String,
27
27
  },
28
+ data: {
29
+ type: Object,
30
+ },
28
31
  chat: {
29
32
  type: String,
30
33
  },
@@ -4,7 +4,7 @@
4
4
  v-if="route.name !== 'Organization' && !MOBILE_APP"
5
5
  class="pd-medium flex-v-center flex-nowrap flex"
6
6
  >
7
- <h2 class="mn-r-medium">Products</h2>
7
+ <h2 class="mn-r-medium">{{ currentCategory ? currentCategory.name : 'All Products' }}</h2>
8
8
  <button
9
9
  v-if="hasAccess(route.params._id, 'products', 'create', auth.state.accesses, auth.state.access.roles)"
10
10
  @click="$router.push({
@@ -157,6 +157,7 @@
157
157
  </div>
158
158
  </div>
159
159
  </div>
160
+
160
161
  <Feed
161
162
  :search="true"
162
163
  v-model:sort="products.state.sort"
@@ -175,7 +176,7 @@
175
176
  limit: 16,
176
177
  owner: route.name?.includes('Organization') ? route.params._id : null,
177
178
  search: route.query.search,
178
- lookup: ['variants','rents'],
179
+ lookup: ['variants','rents','inventory'],
179
180
  categories: route.params.categoryPath ? `/${route.params.categoryPath}` : null,
180
181
  filters: processedFilters,
181
182
  priceMin: selectedFilters.price?.min,
@@ -230,22 +231,23 @@
230
231
  v-model:date="tempSelectedDates"
231
232
  :allowRange="true"
232
233
  :disablePastDates="true"
233
- class="mn-b-medium bg-light"
234
+ class="mn-b-medium radius-small bg-light"
234
235
  />
235
236
 
236
237
  <div class="flex gap-small">
237
- <button
238
- @click="applyDateFilter"
239
- class="bg-main button flex-child-full"
240
- >
241
- Apply
242
- </button>
243
- <button
238
+ <button
244
239
  @click="showDatePickerPopup = false"
245
240
  class="bg-light button flex-child-full"
246
241
  >
247
242
  Cancel
248
243
  </button>
244
+ <button
245
+ @click="applyDateFilter"
246
+ class="bg-main button w-100 flex-child-full"
247
+ >
248
+ Apply
249
+ </button>
250
+
249
251
  </div>
250
252
  </Popup>
251
253
  </div>
@@ -119,30 +119,4 @@ export default {
119
119
  }
120
120
  }]
121
121
  },
122
- // Лукап для аренд продуктов (статичный без дат)
123
- rents: {
124
- lookup: {
125
- from: 'rents',
126
- localField: '_id',
127
- foreignField: 'product',
128
- as: 'rents',
129
- pipeline: [
130
- {
131
- $match: {
132
- status: { $in: ['confirmed', 'active'] }
133
- }
134
- },
135
- {
136
- $project: {
137
- _id: 1,
138
- product: 1,
139
- startDate: 1,
140
- endDate: 1,
141
- quantity: 1,
142
- status: 1
143
- }
144
- }
145
- ]
146
- }
147
- },
148
122
  };
@@ -36,21 +36,15 @@ const controllerFactory = db => {
36
36
  dateEndType: typeof req.query.dateEnd
37
37
  });
38
38
  }
39
-
40
- console.log('availability variant', JSON.stringify(...queryProcessorProducts.getAvailabilityFilterStage(req.query.dateStart, req.query.dateEnd), null, 2))
41
-
42
39
  const stages = [
43
40
  ...queryProcessorGlobals.getBasicOptions(req.query),
44
41
  ...queryProcessorGlobals.getSearchOptions(req.query.search, {
45
42
  fields: ['name', 'description']
46
43
  }),
47
- ...queryProcessorGlobals.getFilterDate(req.query.dateStart, req.query.dateEnd, {
48
- start: 'startDate',
49
- end: 'endDate',
50
- }),
51
44
  ...queryProcessorProducts.getCategoriesFilterStage(req.query.categories),
52
45
  ...queryProcessorProducts.getDeliveryFilterStage(req.query.delivery),
53
46
  ...queryProcessorProducts.getAttributeFiltersStage(req.query.filters),
47
+
54
48
  ...queryProcessorGlobals.getLookupStages(requestedLookups, productLookupConfigs),
55
49
 
56
50
  ...queryProcessorProducts.getVariantPriceFilterStage(req.query.priceMin, req.query.priceMax),
@@ -72,9 +66,11 @@ const controllerFactory = db => {
72
66
  ...(requestedLookups.includes('inventory') ? [{ $project: { availability: 0 } }] : [])
73
67
  ].filter(Boolean);
74
68
 
69
+
75
70
  // Выполнение агрегации
76
71
  const products = await Product.aggregate(stages);
77
72
 
73
+
78
74
  // Возвращаем только количество, если запрошено
79
75
  if (req.query.count) {
80
76
  return res.status(200).json({ count: products.length });
@@ -181,6 +181,7 @@ function getAvailabilityFilterStage(dateStart, dateEnd) {
181
181
  return [];
182
182
  }
183
183
 
184
+
184
185
  return [
185
186
  {
186
187
  $lookup: {
@@ -196,7 +197,7 @@ function getAvailabilityFilterStage(dateStart, dateEnd) {
196
197
  $expr: {
197
198
  $and: [
198
199
  { $eq: ['$product', '$$productId'] },
199
- { $in: ['$status', ['confirmed', 'active']] },
200
+ { $in: ['$status', ['pending', 'confirmed', 'active']] },
200
201
  {
201
202
  $or: [
202
203
  {
@@ -226,7 +227,7 @@ function getAvailabilityFilterStage(dateStart, dateEnd) {
226
227
  {
227
228
  $group: {
228
229
  _id: null,
229
- totalRented: { $sum: { $ifNull: ['$quantity', 1] } }
230
+ totalRented: { $sum: { $ifNull: ['$available', 1] } }
230
231
  }
231
232
  }
232
233
  ],
@@ -243,18 +244,22 @@ function getAvailabilityFilterStage(dateStart, dateEnd) {
243
244
  { $ifNull: ['$available', 0] },
244
245
  { $ifNull: [{ $arrayElemAt: ['$rentInfo.totalRented', 0] }, 0] }
245
246
  ]
246
- }
247
+ },
247
248
  }
248
249
  },
249
250
  {
250
251
  $match: {
251
- availableQuantity: { $gt: 0 }
252
+ $or: [
253
+ { availableQuantity: { $gt: 0 } },
254
+ { $and: [{ rentedQuantity: 0 }, { $or: [{ available: { $gt: 0 } }, { available: { $exists: false } }] }] }
255
+ ]
252
256
  }
253
257
  },
254
258
  {
255
259
  $project: {
256
260
  rentInfo: 0,
257
- rentedQuantity: 0
261
+ rentedQuantity: 0,
262
+ availableQuantity: 0
258
263
  }
259
264
  }
260
265
  ];
@@ -1 +0,0 @@
1
- {"version":3,"file":"Loader.vue2.cjs","sources":["../../../../../src/components/Loader/Loader.vue"],"sourcesContent":["<template>\n <div class=\"circular-loader pos-relative z-index-1 w-100 h-100 w-max-2r h-max-2r h-min-1r w-min-1r\" :class=\"{ 'circular-loader-centered': centered }\">\n <svg viewBox=\"25 25 50 50\">\n <circle class=\"circular-loader-fill\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-width=\"4\" stroke-miterlimit=\"10\" />\n <circle class=\"circular-loader-circle\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-width=\"4\" stroke-miterlimit=\"10\" />\n </svg>\n <div v-if=\"progress\" class=\"progress-text\">{{ progress }}</div>\n <div v-if=\"status\" class=\"uppercase t-semi w-m-10r status-text\">{{ status }}</div>\n </div>\n</template>\n\n<script>\nexport default {\n props: {\n progress: {\n type: Number,\n default: null,\n },\n status: {\n type: String,\n default: null,\n },\n centered: {\n type: Boolean,\n default: true, // По умолчанию лоадер центрирован (для обратной совместимости)\n },\n },\n};\n</script>\n\n<style>\n.circular-loader-centered {\n top: calc(50% - 1rem);\n left: calc(50% - 1rem);\n}\n\n.circular-loader svg {\n animation: rotate 2s linear infinite;\n}\n\n.circular-loader-circle {\n stroke-dasharray: 1, 200;\n stroke-dashoffset: 0;\n stroke-linecap: round;\n stroke: rgb(var(--main));\n animation: dash 1.5s ease-in-out infinite;\n}\n\n.circular-loader-fill {\n stroke-linecap: round;\n stroke: rgba(var(--black),0.2);\n}\n\n.progress-text {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 0.8rem;\n color: rgb(var(--main));;\n}\n\n.status-text {\n position: absolute;\n top: 120%;\n left: calc(50% - 5rem);\n font-size: 0.8rem;\n width: 10rem !important;\n text-align: center;\n}\n\n@keyframes rotate {\n 100% {\n transform: rotate(360deg);\n }\n}\n\n@keyframes dash {\n 0% {\n stroke-dasharray: 1, 200;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 89, 200;\n stroke-dashoffset: -35;\n }\n 100% {\n stroke-dasharray: 1, 200;\n stroke-dashoffset: -124;\n }\n}\n</style>"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_createCommentVNode"],"mappings":";;;;;AAYA,MAAK,YAAU;AAAA,EACb,OAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;IAEX,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA;IAEX,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;AAAA;;AAGf;;EA3BA,KAAA;AAAA,EAMyB,OAAM;;;EAN/B,KAAA;AAAA,EAOuB,OAAM;;;0BAN3BA,IAAAA,mBAOM,OAAA;AAAA,IAPD,OADPC,IAAAA,eAAA,CACa,0FAAwF,EAAA,4BAAuC,OAAA,UAAQ,CAAA;AAAA;8BAChJC,IAAAA,mBAGM,OAAA,EAHD,SAAQ,iBAAa;AAAA,MACxBA,IAAAA,mBAAkH,UAAA;AAAA,QAA1G,OAAM;AAAA,QAAuB,IAAG;AAAA,QAAK,IAAG;AAAA,QAAK,GAAE;AAAA,QAAK,MAAK;AAAA,QAAO,gBAAa;AAAA,QAAI,qBAAkB;AAAA;MAC3GA,IAAAA,mBAAoH,UAAA;AAAA,QAA5G,OAAM;AAAA,QAAyB,IAAG;AAAA,QAAK,IAAG;AAAA,QAAK,GAAE;AAAA,QAAK,MAAK;AAAA,QAAO,gBAAa;AAAA,QAAI,qBAAkB;AAAA;;IAEpG,OAAA,6BAAXF,IAAAA,mBAA+D,OAA/D,YAA+DG,IAAAA,gBAAjB,OAAA,QAAQ,GAAA,CAAA,KAN1DC,IAAAA,mBAAA,IAAA,IAAA;AAAA,IAOe,OAAA,2BAAXJ,IAAAA,mBAAkF,OAAlF,YAAkFG,IAAAA,gBAAf,OAAA,MAAM,GAAA,CAAA,KAP7EC,IAAAA,mBAAA,IAAA,IAAA;AAAA;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Tab.vue.js","sources":["../../../../../src/components/Tab/Tab.vue"],"sourcesContent":["<template>\n <div class=\"flex-nowrap flex-v-center flex pos-relative\">\n <button \n v-for=\"(tab, index) in tabs\" \n :key=\"index\" \n @click=\"handleTabClick(index, tab)\" \n class=\"z-index-1 t-center cursor-pointer\"\n :style=\"isSelected(index, tab) ? 'background: rgb(var(--main)) !important' : ''\"\n :class=\"[\n isSelected(index, tab) ? 'bg-main' : '',\n replaceClasses('pd-small pd-r-medium pd-l-medium w-max pd-small radius-small', classTab)\n ]\"\n >\n {{tab.name || tab.label}}\n </button>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from 'vue'\n\nconst emit = defineEmits(['update:selected', 'tab-click']);\n\nconst props = defineProps({\n tabs: Array,\n classTab: String,\n selected: [String, Number],\n modelValue: [String, Number],\n callback: Function\n})\n\nconst selectedTab = ref(0)\n\n// Handle both v-model and selected prop for backward compatibility\nconst updateSelectedIndex = () => {\n if (props.modelValue !== undefined) {\n const selectedIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (selectedIndex !== -1) {\n selectedTab.value = selectedIndex\n }\n } else if (props.selected !== undefined) {\n const selectedIndex = props.tabs.findIndex(tab => tab.value === props.selected)\n if (selectedIndex !== -1) {\n selectedTab.value = selectedIndex\n }\n }\n}\n\n// Initial setup\nupdateSelectedIndex()\n\n// Watch for changes in selected or modelValue props\nwatch(() => props.selected, updateSelectedIndex)\nwatch(() => props.modelValue, updateSelectedIndex)\n\n// Check if tab is selected\nconst isSelected = (index, tab) => {\n if (props.modelValue !== undefined) {\n return tab.value === props.modelValue\n } else if (props.selected !== undefined) {\n return tab.value === props.selected\n }\n return index === selectedTab.value\n}\n\n// Handle tab click\nfunction handleTabClick(index, tab) {\n selectedTab.value = index\n \n // Emit both events for flexibility\n emit('update:selected', tab.value)\n emit('tab-click', { index, tab })\n \n // For v-model support\n if (props.modelValue !== undefined) {\n emit('update:modelValue', tab.value)\n }\n \n // Call callback if provided\n if (props.callback) props.callback(tab)\n}\n</script>\n\n<style lang=\"scss\">\n.tab-selector {\n position: absolute;\n width: 50%;\n height: 100%;\n left: 0;\n top: 0;\n z-index: 0;\n transition: left 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;AAqBA,UAAM,OAAO;AAEb,UAAM,QAAQ;AAQd,UAAM,cAAc,IAAI,CAAC;AAGzB,UAAM,sBAAsB,MAAM;AAChC,UAAI,MAAM,eAAe,QAAW;AAClC,cAAM,gBAAgB,MAAM,KAAK,UAAU,SAAO,IAAI,UAAU,MAAM,UAAU;AAChF,YAAI,kBAAkB,IAAI;AACxB,sBAAY,QAAQ;AAAA,QACtB;AAAA,MACF,WAAW,MAAM,aAAa,QAAW;AACvC,cAAM,gBAAgB,MAAM,KAAK,UAAU,SAAO,IAAI,UAAU,MAAM,QAAQ;AAC9E,YAAI,kBAAkB,IAAI;AACxB,sBAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAGA,wBAAmB;AAGnB,UAAM,MAAM,MAAM,UAAU,mBAAmB;AAC/C,UAAM,MAAM,MAAM,YAAY,mBAAmB;AAGjD,UAAM,aAAa,CAAC,OAAO,QAAQ;AACjC,UAAI,MAAM,eAAe,QAAW;AAClC,eAAO,IAAI,UAAU,MAAM;AAAA,MAC7B,WAAW,MAAM,aAAa,QAAW;AACvC,eAAO,IAAI,UAAU,MAAM;AAAA,MAC7B;AACA,aAAO,UAAU,YAAY;AAAA,IAC/B;AAGA,aAAS,eAAe,OAAO,KAAK;AAClC,kBAAY,QAAQ;AAGpB,WAAK,mBAAmB,IAAI,KAAK;AACjC,WAAK,aAAa,EAAE,OAAO,IAAG,CAAE;AAGhC,UAAI,MAAM,eAAe,QAAW;AAClC,aAAK,qBAAqB,IAAI,KAAK;AAAA,MACrC;AAGA,UAAI,MAAM,SAAU,OAAM,SAAS,GAAG;AAAA,IACxC;;;;;;;;;;;;;;;;;;"}