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();