[bug][editor] Slash-меню не находит команды при вводе в неправильной раскладке (напр. «/сщву» → «code») #283
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема
При наборе slash-команды в неправильной раскладке клавиатуры меню ничего не находит. Пример: физически набираешь
code, но включена русская ЙЦУКЕН → в документ попадает/сщву, и поиск возвращает пустой список (а сам попап схлопывается). Поиск ищет буквальносщву, которого нет ни в одном пункте — это логично, но неудобно: пользователь часто забывает переключить раскладку.Хочется, чтобы поиск находил команду, даже если она набрана в неправильной раскладке (
/сщву→ Code).Причина
Фильтрация пунктов меню — в
getSuggestionItemsвapps/client/src/features/editor/components/slash-menu/menu-items.ts. Запрос приводится к нижнему регистру и матчится тремя способами:Все цели (
title/description/searchTerms) — латиница (кроме единичных русских терминов вродесноска/примечаниеу Footnote). Кириллическийсщвуне совпадает ни с чем.Та же функция вызывается в
slash-command.tsв колбэкеallow()для решения «оставлять ли попап живым». Значит одна правкаgetSuggestionItemsчинит и фильтрацию, и исчезновение попапа —slash-command.tsтрогать не нужно.Предлагаемое решение
Добавить нормализацию раскладки: сопоставить кириллицу ЙЦУКЕН латинице QWERTY по физическому положению клавиш и матчить пункт, если совпал хотя бы один из вариантов запроса — оригинал или перекодированные версии. Делаем двунаправленно (RU→EN и EN→RU): дёшево и заодно чинит зеркальный кейс (
cyjcrfв EN-раскладке →сноска→ находит Footnote). Оригинал всегда среди кандидатов, поэтому легитимные кириллическиеsearchTermsпродолжают работать.Интеграция в
getSuggestionItems— матч и tie-break сортировки перебирают кандидатов:Проверка кейса:
сщву→с→c, щ→o, в→d, у→e=code→ матчит Code.Граничные случаи (учтены, регрессий нет)
fuzzyMatch("", …)и"".includes("")=true).code) → RU→EN не меняет строку; EN→RU даётсщву, который не матчит латиницу, но оригинал матчит. Безвредно.сноска) → оригинал в кандидатах, матч сохраняется.allowSpacesне ломается).Set.Тесты
Новый файл
menu-items.layout.test.ts(по образцуmenu-items.suggestions.test.ts, с тем же стабомcurrentUserвbeforeEach):query: "сщву"→ результат содержит"Code";query: "уфиду"(физическиtable) → содержит"Table";query: "cyjcrf"(физическисноска) → содержит"Footnote"(проверка EN→RU);query: "code"(прав��льная раскладка) → по-прежнему содержит"Code"(нет регрессии);buildLayoutCandidates("сщву")→ включает"code".Область изменений
Одна точка —
getSuggestionItemsвmenu-items.ts. Правка чинит и поиск, и удержание попапа;slash-command.tsне трогаем.