f295351504
Шаг 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>
29 lines
1.2 KiB
TypeScript
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 };
|
|
}
|