From 919ea8d4c0b78f886cc00fe5ae309ec0f646dae1 Mon Sep 17 00:00:00 2001 From: Sameh Khamis Date: Sat, 14 Nov 2026 16:25:32 -0800 Subject: [PATCH] Make the Data Layers finder keep Escape, its category and keyboard users - Escape in the field closes the search alone, focus back on its button, without folding the panel or leaving the cockpit. - The category is the group's key (LayerRows' data-group), so a language change keeps it; a group that goes away clears it. - On and Off follow whether the layer is enabled, not its feed's state. - The filter is a disclosure of two groups of toggle buttons: opening it focuses the chosen option, the arrows, Home and End move, Escape closes it, and it stays inside the panel. - No layers match is translated, the search matches names only, and the rows are filtered once per frame at most. - A voice request to show a layer the finder hides clears the finder. Co-authored-by: Manjunath Paparaju --- src/i18n/locales/ar.json | 3 +- src/i18n/locales/de.json | 3 +- src/i18n/locales/es.json | 3 +- src/i18n/locales/fr.json | 3 +- src/i18n/locales/he.json | 3 +- src/i18n/locales/it.json | 3 +- src/i18n/locales/ja.json | 3 +- src/i18n/locales/pt.json | 3 +- src/i18n/locales/ru.json | 3 +- src/i18n/locales/sv.json | 3 +- src/i18n/locales/uk.json | 3 +- src/i18n/locales/zh-CN.json | 3 +- src/i18n/locales/zh-Hant.json | 3 +- src/ui/cockpitInput.js | 3 + src/ui/layerPanel/LayerRows.vue | 8 +- src/ui/styles/layer-finder.css | 16 +- src/ui/views/panels/LayerFinder.vue | 218 ++++++++++++++++++++-------- src/voice/gevActions.js | 4 + 18 files changed, 207 insertions(+), 81 deletions(-) diff --git a/src/i18n/locales/ar.json b/src/i18n/locales/ar.json index 0f5afd026..5fe57db79 100644 --- a/src/i18n/locales/ar.json +++ b/src/i18n/locales/ar.json @@ -3986,5 +3986,6 @@ "Status": "الحالة", "Search layers…": "ابحث في الطبقات…", "Layer groups": "مجموعات الطبقات", - "Jump to {name}": "الانتقال إلى {name}" + "Jump to {name}": "الانتقال إلى {name}", + "No layers match": "لا توجد طبقات مطابقة" } diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index bb4c85cf4..9964801bb 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -3638,5 +3638,6 @@ "Status": "Status", "Search layers…": "Ebenen suchen…", "Layer groups": "Ebenengruppen", - "Jump to {name}": "Zu {name} springen" + "Jump to {name}": "Zu {name} springen", + "No layers match": "Keine passenden Ebenen" } diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index 65aaeb2c8..cc72601c9 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -3725,5 +3725,6 @@ "Status": "Estado", "Search layers…": "Buscar capas…", "Layer groups": "Grupos de capas", - "Jump to {name}": "Ir a {name}" + "Jump to {name}": "Ir a {name}", + "No layers match": "Ninguna capa coincide" } diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json index 874d6ad4e..0e417867e 100644 --- a/src/i18n/locales/fr.json +++ b/src/i18n/locales/fr.json @@ -3725,5 +3725,6 @@ "Status": "État", "Search layers…": "Rechercher des couches…", "Layer groups": "Groupes de couches", - "Jump to {name}": "Aller à {name}" + "Jump to {name}": "Aller à {name}", + "No layers match": "Aucune couche ne correspond" } diff --git a/src/i18n/locales/he.json b/src/i18n/locales/he.json index 97b99390f..16dbedb45 100644 --- a/src/i18n/locales/he.json +++ b/src/i18n/locales/he.json @@ -3725,5 +3725,6 @@ "Status": "מצב", "Search layers…": "חיפוש שכבות…", "Layer groups": "קבוצות שכבות", - "Jump to {name}": "מעבר אל {name}" + "Jump to {name}": "מעבר אל {name}", + "No layers match": "אין שכבות תואמות" } diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json index 908ee926e..e3fe590e5 100644 --- a/src/i18n/locales/it.json +++ b/src/i18n/locales/it.json @@ -3725,5 +3725,6 @@ "Status": "Stato", "Search layers…": "Cerca livelli…", "Layer groups": "Gruppi di livelli", - "Jump to {name}": "Vai a {name}" + "Jump to {name}": "Vai a {name}", + "No layers match": "Nessun livello corrisponde" } diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index 56cdfaad3..0a7d60ba9 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -3551,5 +3551,6 @@ "Status": "状態", "Search layers…": "レイヤーを検索…", "Layer groups": "レイヤーのグループ", - "Jump to {name}": "{name} へ移動" + "Jump to {name}": "{name} へ移動", + "No layers match": "一致するレイヤーはありません" } diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json index b31f097a3..2e3b0d016 100644 --- a/src/i18n/locales/pt.json +++ b/src/i18n/locales/pt.json @@ -3725,5 +3725,6 @@ "Status": "Estado", "Search layers…": "Pesquisar camadas…", "Layer groups": "Grupos de camadas", - "Jump to {name}": "Ir para {name}" + "Jump to {name}": "Ir para {name}", + "No layers match": "Nenhuma camada corresponde" } diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index f771d1bf5..5553d847e 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -3812,5 +3812,6 @@ "Status": "Состояние", "Search layers…": "Поиск слоёв…", "Layer groups": "Группы слоёв", - "Jump to {name}": "Перейти к «{name}»" + "Jump to {name}": "Перейти к «{name}»", + "No layers match": "Нет подходящих слоёв" } diff --git a/src/i18n/locales/sv.json b/src/i18n/locales/sv.json index 017f32985..05f004f07 100644 --- a/src/i18n/locales/sv.json +++ b/src/i18n/locales/sv.json @@ -3638,5 +3638,6 @@ "Status": "Status", "Search layers…": "Sök lager…", "Layer groups": "Lagergrupper", - "Jump to {name}": "Gå till {name}" + "Jump to {name}": "Gå till {name}", + "No layers match": "Inga lager matchar" } diff --git a/src/i18n/locales/uk.json b/src/i18n/locales/uk.json index 3b765b59a..d841eb0b9 100644 --- a/src/i18n/locales/uk.json +++ b/src/i18n/locales/uk.json @@ -3812,5 +3812,6 @@ "Status": "Стан", "Search layers…": "Пошук шарів…", "Layer groups": "Групи шарів", - "Jump to {name}": "Перейти до «{name}»" + "Jump to {name}": "Перейти до «{name}»", + "No layers match": "Немає відповідних шарів" } diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index 317563a5a..26109d574 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -3551,5 +3551,6 @@ "Status": "状态", "Search layers…": "搜索图层…", "Layer groups": "图层分组", - "Jump to {name}": "跳转到{name}" + "Jump to {name}": "跳转到{name}", + "No layers match": "没有匹配的图层" } diff --git a/src/i18n/locales/zh-Hant.json b/src/i18n/locales/zh-Hant.json index 079a49167..f119fd487 100644 --- a/src/i18n/locales/zh-Hant.json +++ b/src/i18n/locales/zh-Hant.json @@ -3551,5 +3551,6 @@ "Status": "狀態", "Search layers…": "搜尋圖層…", "Layer groups": "圖層分組", - "Jump to {name}": "跳至{name}" + "Jump to {name}": "跳至{name}", + "No layers match": "沒有符合的圖層" } diff --git a/src/ui/cockpitInput.js b/src/ui/cockpitInput.js index 9574068ce..658501195 100644 --- a/src/ui/cockpitInput.js +++ b/src/ui/cockpitInput.js @@ -248,6 +248,9 @@ export function onKeyDown(event) { if (event.target?.closest?.('.cesium-credit-lightbox')) return; // An open Display or Radio popover takes Escape itself. if (this.isUtilityDisclosureOpen?.()) return; + // So do the Data Layers search field and filter menu. + if (event.target?.closest?.('.layer-finder__field, .layer-finder__menu')) + return; if (this.context?.contains(event.target) && !this.contextCollapsed) { event.preventDefault(); event.stopImmediatePropagation(); diff --git a/src/ui/layerPanel/LayerRows.vue b/src/ui/layerPanel/LayerRows.vue index ee0490913..9358ad2b8 100644 --- a/src/ui/layerPanel/LayerRows.vue +++ b/src/ui/layerPanel/LayerRows.vue @@ -22,9 +22,11 @@ defineProps({