diff --git a/app/resources/js/views/DealsView.vue b/app/resources/js/views/DealsView.vue index 3da60328..31d1cf5b 100644 --- a/app/resources/js/views/DealsView.vue +++ b/app/resources/js/views/DealsView.vue @@ -9,7 +9,7 @@ * * Спека: docs/superpowers/specs/2026-05-17-deals-page-redesign-design.md */ -import { computed, onMounted, reactive, ref, watch } from 'vue'; +import { computed, onBeforeUnmount, onMounted, reactive, ref, watch } from 'vue'; import { useRoute } from 'vue-router'; import type { MockDeal } from '../composables/mockDeals'; import { mapApiDeal } from '../composables/dealsApiMapper'; @@ -103,10 +103,14 @@ async function loadProjects() { } } -// Фильтры (кроме поиска) и perPage → сброс на стр.1 + перезагрузка. +// Фильтры (кроме поиска) и perPage → стр.1 + ОДНА перезагрузка. +// page!==1 → меняем page, перезагрузку делает watch(page); page===1 → грузим напрямую. watch([filterStatus, filterProject, receivedFrom, receivedTo, perPage], () => { - page.value = 1; - void loadDeals(); + if (page.value !== 1) { + page.value = 1; + } else { + void loadDeals(); + } }); watch(page, () => void loadDeals()); @@ -115,11 +119,18 @@ let searchTimer: ReturnType | undefined; watch(searchPhone, () => { if (searchTimer) clearTimeout(searchTimer); searchTimer = setTimeout(() => { - page.value = 1; - void loadDeals(); + if (page.value !== 1) { + page.value = 1; + } else { + void loadDeals(); + } }, 350); }); +onBeforeUnmount(() => { + if (searchTimer) clearTimeout(searchTimer); +}); + function clearFilters() { searchPhone.value = ''; filterStatus.value = null;