Files
portal/app/resources/js/composables/useOverlayDismiss.ts
T
Дмитрий f295351504 feat(автоподбор): Конкурентное поле — финальный проход склейки, вскрыть всё, группы дублей, телефоны, отсев рекламных номеров 2ГИС
Шаг 1 «Конкурентное поле» — чекпоинт:
- Финальный проход «Найти и объединить дубли» на поле и предложениях; клиент решает по каждой группе, ничего не склеиваем молча.
- Тихая склейка только по сайту и коду справочника; телефон и людный номер у более чем 4 фирм — на решение клиента.
- Колонка phones jsonb; телефон-дубли видны уже на «Предложениях».
- Sonar даёт только имя и тип, сайт всегда через EXA; вскрываем все карточки без гейта «есть сайт».
- Яндекс-карточки через локальный Playwright параллельно; рубрика из заголовка идёт в описание.
- Фикс рекламных номеров: 2ГИС-парсер разбирает телефоны пообъектно и выкидывает рекламные кнопки с platforms/caption чужих фирм.

Тесты: автоподбор 224/224 unit, 105/105 feature; фронт-спеки зелёные. Времянки app/scripts/diag-*/probe-* в гит не входят.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 17:34:03 +03:00

29 lines
1.2 KiB
TypeScript

import { ref } from 'vue';
/**
* Закрытие модалки по клику на подложку — но НЕ при выделении текста.
*
* Проблема: если начать выделять текст ВНУТРИ окна и отпустить кнопку мыши на
* подложке, обычный `@click.self` считает это кликом по подложке и закрывает окно.
*
* Решение: закрываем только если И mousedown, И mouseup случились на самой
* подложке (target === currentTarget). При выделении mousedown стартует внутри
* окна, поэтому флаг не взводится и окно не закрывается.
*/
export function useOverlayDismiss() {
const downOnSelf = ref(false);
function onOverlayMousedown(e: MouseEvent) {
downOnSelf.value = e.target === e.currentTarget;
}
function onOverlayMouseup(e: MouseEvent, close: () => void) {
if (downOnSelf.value && e.target === e.currentTarget) {
close();
}
downOnSelf.value = false;
}
return { onOverlayMousedown, onOverlayMouseup };
}