| 150 | // support the arrow keys and various other shortcuts, and this function hides the event-decoding |
| 151 | // complexity. |
| 152 | actionFromKeyEvent(event) { |
| 153 | const key = KeyboardUtils.getKeyChar(event); |
| 154 | // Handle <Enter> on "keypress", and other events on "keydown". This avoids interence with CJK |
| 155 | // translation (see #2915 and #2934). |
| 156 | if ((event.type === "keypress") && (key !== "enter")) return null; |
| 157 | if ((event.type === "keydown") && (key === "enter")) return null; |
| 158 | if (KeyboardUtils.isEscape(event)) { |
| 159 | return "dismiss"; |
| 160 | } else if ( |
| 161 | (key === "up") || |
| 162 | (event.shiftKey && (event.key === "Tab")) || |
| 163 | (event.ctrlKey && ((key === "k") || (key === "p"))) |
| 164 | ) { |
| 165 | return "up"; |
| 166 | } else if ((event.key === "Tab") && !event.shiftKey) { |
| 167 | return "tab"; |
| 168 | } else if ( |
| 169 | (key === "down") || |
| 170 | (event.ctrlKey && ((key === "j") || (key === "n"))) |
| 171 | ) { |
| 172 | return "down"; |
| 173 | } else if (event.ctrlKey && (key === "enter")) { |
| 174 | return "ctrl-enter"; |
| 175 | } else if (event.key === "Enter") { |
| 176 | return "enter"; |
| 177 | } else if ((event.key === "Delete") && event.shiftKey && !event.ctrlKey && !event.altKey) { |
| 178 | return "remove"; |
| 179 | } else if (KeyboardUtils.isBackspace(event)) { |
| 180 | return "delete"; |
| 181 | } |
| 182 | |
| 183 | return null; |
| 184 | } |
| 185 | |
| 186 | async onKeyEvent(event) { |
| 187 | const action = this.actionFromKeyEvent(event); |