From 977404e2625873a35f353b67dffaa49f6bd2ff3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Wed, 24 Jun 2026 13:31:10 +0300 Subject: [PATCH] =?UTF-8?q?fix/projects:=20=D0=BA=D0=BE=D1=81=D1=8F=D0=BA?= =?UTF-8?q?=2003=20=E2=80=94=20=D0=92=D1=81=D1=8F=20=D0=A0=D0=A4=20=D0=BE?= =?UTF-8?q?=D0=B4=D0=BD=D0=BE=D0=B9=20=D0=B3=D0=B0=D0=BB=D0=BE=D1=87=D0=BA?= =?UTF-8?q?=D0=BE=D0=B9,=20=D0=B3=D0=B0=D0=BB=D0=BE=D1=87=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=81=D1=80=D0=B0=D0=B7=D1=83=20=D1=81=D0=BD=D0=B8=D0=BC=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D1=83=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B3=D0=B8=D0=BE=D0=BD=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Галочка Вся РФ теперь подтверждает выбор одним кликом и сразу очищает зависшую ошибку regions, убрана отдельная кнопка Подтверждаю и предупреждение. Защита от случайной всей РФ сохранена осознанным кликом галочки. Drawer пусто=вся РФ не трогал. Vitest RED→GREEN на старом коде доказан, NewProjectDialog specs 16 passed. Проверено глазами на 8000. Co-Authored-By: Claude Opus 4.8 --- .../js/views/projects/NewProjectDialog.vue | 40 +++++-------------- .../Frontend/NewProjectDialog.regions.spec.ts | 24 ++++++++--- 2 files changed, 28 insertions(+), 36 deletions(-) diff --git a/app/resources/js/views/projects/NewProjectDialog.vue b/app/resources/js/views/projects/NewProjectDialog.vue index cdf3bf48..29c24ff2 100644 --- a/app/resources/js/views/projects/NewProjectDialog.vue +++ b/app/resources/js/views/projects/NewProjectDialog.vue @@ -136,38 +136,15 @@ /> - Вы выбрали всю Россию — проект будет получать лиды по всем регионам (всем субъектам РФ). - Подтвердите, что это намеренно. -
- - Подтверждаю «Вся РФ» - - Отмена -
-
- - - Вся РФ — подтверждено - + Проект будет получать лиды по всей России — по всем субъектам страны. + (null); -// Plan 4 Task 4: обязательный выбор региона + явная «Вся РФ» с подтверждением. -// vsyaRf — чекбокс выбран; vsyaRfConfirmed — подтверждён через предупреждение. +// Plan 4 Task 4 + косяк 03: явная «Вся РФ» одной галочкой (защита от случайной +// «всей РФ» сохранена — нужен осознанный клик), без отдельной кнопки подтверждения. +// vsyaRf — чекбокс выбран; vsyaRfConfirmed — true сразу при установке галочки. // На бэке regions=[] (Вся РФ) и «забыл» неотличимы → гейт намеренно UI-only. const vsyaRf = ref(false); const vsyaRfConfirmed = ref(false); function chooseVsyaRf(): void { vsyaRf.value = true; - vsyaRfConfirmed.value = false; + confirmVsyaRf(); } function confirmVsyaRf(): void { vsyaRfConfirmed.value = true; form.regions = []; // Вся РФ → пустой массив субъектов - delete errors.regions; + delete errors.regions; // косяк 03: галочка сразу снимает зависшую ошибку } function cancelVsyaRf(): void { diff --git a/app/tests/Frontend/NewProjectDialog.regions.spec.ts b/app/tests/Frontend/NewProjectDialog.regions.spec.ts index 7375b870..acde6cbe 100644 --- a/app/tests/Frontend/NewProjectDialog.regions.spec.ts +++ b/app/tests/Frontend/NewProjectDialog.regions.spec.ts @@ -48,16 +48,15 @@ describe('NewProjectDialog — required region gate + «Вся РФ» (Plan 4 Ta expect(w.text()).toContain('Выберите регион'); }); - it('«Вся РФ» shows warning, requires confirm, then submits regions=[]', async () => { + it('косяк 03: «Вся РФ» одной галочкой подтверждает и сабмитит regions=[]', async () => { const w = factory(); await flushPromises(); (w.vm as unknown as { chooseVsyaRf: () => void }).chooseVsyaRf(); await w.vm.$nextTick(); - expect(w.text()).toContain('всю Россию'); - - await w.find('[data-testid="confirm-vsya-rf"]').trigger('click'); - await w.vm.$nextTick(); + // Одношаговое подтверждение: галочка сразу подтверждает, без отдельной кнопки. + expect((w.vm as unknown as { vsyaRfConfirmed: boolean }).vsyaRfConfirmed).toBe(true); + expect(w.text()).toContain('по всей России'); const vm = w.vm as unknown as { form: { name: string; signal_identifier: string } }; vm.form.name = 'Проект'; @@ -73,6 +72,21 @@ describe('NewProjectDialog — required region gate + «Вся РФ» (Plan 4 Ta expect(payload.regions).toEqual([]); }); + it('косяк 03: галочка «Вся РФ» сразу снимает зависшую ошибку регионов', async () => { + const w = factory(); + await flushPromises(); + + // сабмит с пустыми регионами → ошибка «Выберите регион…» + await w.find('[data-testid="submit-btn"]').trigger('click'); + await flushPromises(); + expect(w.text()).toContain('Выберите регион'); + + // ставим «Вся РФ» → ошибка исчезает сразу, без отдельного подтверждения + (w.vm as unknown as { chooseVsyaRf: () => void }).chooseVsyaRf(); + await w.vm.$nextTick(); + expect(w.text()).not.toContain('Выберите регион'); + }); + it('region autocomplete has closable-chips so a single region can be removed', async () => { const w = factory(); await flushPromises();