fix/projects: косяк 03 — Вся РФ одной галочкой, галочка сразу снимает ошибку регионов

Галочка Вся РФ теперь подтверждает выбор одним кликом и сразу очищает
зависшую ошибку regions, убрана отдельная кнопка Подтверждаю и предупреждение.
Защита от случайной всей РФ сохранена осознанным кликом галочки.
Drawer пусто=вся РФ не трогал. Vitest RED→GREEN на старом коде доказан,
NewProjectDialog specs 16 passed. Проверено глазами на 8000.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-06-24 13:31:10 +03:00
parent f7963bcfb3
commit 977404e262
2 changed files with 28 additions and 36 deletions
@@ -136,38 +136,15 @@
/>
<v-alert
v-if="vsyaRf && !vsyaRfConfirmed"
type="warning"
v-if="vsyaRf"
type="info"
variant="tonal"
density="compact"
class="mt-2"
data-testid="vsya-rf-warning"
>
Вы выбрали всю Россию — проект будет получать лиды по всем регионам (всем субъектам РФ).
Подтвердите, что это намеренно.
<div class="mt-2">
<v-btn
size="small"
color="warning"
variant="flat"
data-testid="confirm-vsya-rf"
@click="confirmVsyaRf"
>
Подтверждаю «Вся РФ»
</v-btn>
<v-btn size="small" variant="text" class="ml-2" @click="cancelVsyaRf"> Отмена </v-btn>
</div>
</v-alert>
<v-chip
v-else-if="vsyaRfConfirmed"
color="success"
size="small"
class="mt-2"
data-testid="vsya-rf-confirmed"
>
Вся РФ — подтверждено
</v-chip>
Проект будет получать лиды по всей России — по всем субъектам страны.
</v-alert>
<v-alert
v-if="requisitesRequired"
@@ -295,21 +272,22 @@ interface OverloadPayloadShape {
const overloadOpen = ref(false);
const overloadPayload = ref<OverloadPayloadShape | null>(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 {
@@ -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();