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:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user