@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.
- package/dist/_virtual/index.cjs +4 -4
- package/dist/_virtual/index.js +4 -4
- package/dist/_virtual/index2.cjs +4 -4
- package/dist/_virtual/index2.js +4 -4
- package/dist/auth.server.cjs +1 -2
- package/dist/auth.server.js +1 -2
- package/dist/builder.cjs +105 -19
- package/dist/builder.js +107 -20
- package/dist/{main-XJQJFmgj.cjs → main-B1XN9Zjg.cjs} +7 -7
- package/dist/{main-DrpgUZcn.js → main-u7zgfMGL.js} +1850 -1856
- package/dist/martyrs/src/components/Button/Button.vue2.cjs +1 -1
- package/dist/martyrs/src/components/Button/Button.vue2.js +1 -1
- package/dist/martyrs/src/components/Feed/Carousel.vue.cjs +1 -1
- package/dist/martyrs/src/components/Feed/Carousel.vue.js +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.cjs +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
- package/dist/martyrs/src/components/FieldTags/FieldTags.vue.cjs +1 -1
- package/dist/martyrs/src/components/FieldTags/FieldTags.vue.js +1 -1
- package/dist/martyrs/src/components/Loader/{Loader.vue2.cjs → Loader.vue.cjs} +2 -2
- package/dist/martyrs/src/components/Loader/{Loader.vue2.js.map → Loader.vue.cjs.map} +1 -1
- package/dist/martyrs/src/components/Loader/{Loader.vue2.js → Loader.vue.js} +2 -2
- package/dist/martyrs/src/components/Loader/Loader.vue.js.map +1 -0
- package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue2.cjs +1 -1
- package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue2.js +1 -1
- package/dist/martyrs/src/components/Tab/{Tab.vue.cjs → Tab.vue2.cjs} +2 -2
- package/dist/martyrs/src/components/Tab/Tab.vue2.cjs.map +1 -0
- package/dist/martyrs/src/components/Tab/{Tab.vue.js → Tab.vue2.js} +2 -2
- package/dist/martyrs/src/components/Tab/{Tab.vue.cjs.map → Tab.vue2.js.map} +1 -1
- package/dist/martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue.cjs +1 -1
- package/dist/martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/locales/ru.cjs +2 -0
- package/dist/martyrs/src/modules/auth/locales/ru.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/locales/ru.js +2 -0
- package/dist/martyrs/src/modules/auth/locales/ru.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.cjs +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.cjs +1 -1
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +1 -1
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/sections/Feed.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/sections/Feed.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/sections/List.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/sections/List.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.cjs +27 -27
- package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.js +28 -28
- package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.js.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/sections/SectionPageTitle.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/sections/SectionPageTitle.vue.js +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.cjs +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +1 -1
- package/dist/martyrs/src/modules/music/router/music.cjs +1 -1
- package/dist/martyrs/src/modules/music/router/music.js +1 -1
- package/dist/martyrs/src/modules/notifications/components/pages/Notifications.vue.cjs +1 -1
- package/dist/martyrs/src/modules/notifications/components/pages/Notifications.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +2 -2
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +2 -2
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.cjs +1 -1
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/elements/Image360.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/elements/Image360.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs +2 -2
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductRecommmendation.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductRecommmendation.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs +64 -63
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +64 -63
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +1 -1
- package/dist/martyrs.cjs.js +1 -1
- package/dist/martyrs.css +1 -1
- package/dist/martyrs.es.js +1 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.cjs +1 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js +1 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.cjs +1 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js +1 -1
- package/dist/orders.server.cjs +3 -0
- package/dist/orders.server.js +3 -0
- package/dist/products.server.cjs +9 -36
- package/dist/products.server.js +9 -36
- package/dist/style.css +1 -1
- package/dist/{web-C5cmb1FH.js → web--8-wgr6b.js} +1 -1
- package/dist/{web-d40xcY_Y.cjs → web-BS6utuAZ.cjs} +1 -1
- package/package.json +1 -1
- package/src/builder/CLAUDE.MD +405 -0
- package/src/builder/builder.js +3 -0
- package/src/builder/modes/spa.dev.js +35 -15
- package/src/builder/modes/spa.prod.js +5 -6
- package/src/builder/modes/spa.rspack.dev.js +110 -0
- package/src/modules/auth/controllers/services/twofa.service.js +1 -1
- package/src/modules/auth/locales/ru.js +2 -0
- package/src/modules/auth/views/components/pages/EnterCode.vue +2 -2
- package/src/modules/globals/views/components/sections/Filters.vue +26 -17
- package/src/modules/orders/models/application.model.js +3 -0
- package/src/modules/products/components/pages/Products.vue +12 -10
- package/src/modules/products/controllers/configs/products.lookup.config.js +0 -26
- package/src/modules/products/controllers/products.controller.js +3 -7
- package/src/modules/products/controllers/queries/products.queries.js +10 -5
- package/dist/martyrs/src/components/Loader/Loader.vue2.cjs.map +0 -1
- 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
|
|
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
|
|
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
|
-
|
|
194
|
+
<button
|
|
202
195
|
@click="cancelFilter(filter.value)"
|
|
203
|
-
class="
|
|
196
|
+
class="bg-light button flex-child-full"
|
|
204
197
|
>
|
|
205
198
|
Cancel
|
|
206
199
|
</button>
|
|
207
|
-
|
|
200
|
+
<button
|
|
208
201
|
@click="applyFilter(filter.value)"
|
|
209
|
-
class="w-100 button
|
|
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
|
-
|
|
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) => {
|
|
@@ -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
|
-
|
|
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: ['$
|
|
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
|
-
|
|
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;;;;;;;;;;;;;;;;;;"}
|