diff --git a/app/assets/javascripts/issues/constants.js b/app/assets/javascripts/issues/constants.js index 96cd9741f619025f26328e3f2e2991aa5f4b77b8..4f5086fcd7639efed9e92e0a5330c7331a0b6fe1 100644 --- a/app/assets/javascripts/issues/constants.js +++ b/app/assets/javascripts/issues/constants.js @@ -51,3 +51,40 @@ export const issuableTypeText = { [WORK_ITEM_TYPE_VALUE_OBJECTIVE]: __('objective'), [WORK_ITEM_TYPE_VALUE_TASK]: __('task'), }; + +const SHIFT_KEY = 16; +const CTRL_KEY = 17; +const ALT_KEY = 18; +const ESC_KEY = 27; +const LEFT_ARROW_KEY = 37; +const UP_ARROW_KEY = 38; +const RIGHT_ARROW_KEY = 39; +const DOWN_ARROW_KEY = 40; +const WIN_CMD_KEY = 91; +const CONTEXT_MENU_KEY = 93; + +export const NON_INPUT_KEY_EVENTS = [ + { keyCode: SHIFT_KEY, label: 'shift' }, + { keyCode: CTRL_KEY, label: 'control' }, + { keyCode: ALT_KEY, label: 'alt' }, + { keyCode: ESC_KEY, label: 'escape' }, + { keyCode: LEFT_ARROW_KEY, label: 'left' }, + { keyCode: UP_ARROW_KEY, label: 'up' }, + { keyCode: RIGHT_ARROW_KEY, label: 'right' }, + { keyCode: DOWN_ARROW_KEY, label: 'down' }, + { keyCode: WIN_CMD_KEY, label: 'Windows/Command' }, + { keyCode: CONTEXT_MENU_KEY, label: 'ContextMenu' }, +]; + +export const NON_INPUT_KEYS = [ + SHIFT_KEY, + CTRL_KEY, + ALT_KEY, + ESC_KEY, + LEFT_ARROW_KEY, + UP_ARROW_KEY, + RIGHT_ARROW_KEY, + DOWN_ARROW_KEY, + WIN_CMD_KEY, + CONTEXT_MENU_KEY, +]; diff --git a/app/assets/javascripts/issues/create_merge_request_dropdown.js b/app/assets/javascripts/issues/create_merge_request_dropdown.js index 3ef3ff205b9bc5d87bc8f245ffbfa5e85ea7c322..b21955a5773ade2b314fd429a0f1835433cbe843 100644 --- a/app/assets/javascripts/issues/create_merge_request_dropdown.js +++ b/app/assets/javascripts/issues/create_merge_request_dropdown.js @@ -16,6 +16,7 @@ import { humanizeBranchValidationErrors, } from '~/lib/utils/text_utility'; import api from '~/api'; +import { NON_INPUT_KEYS } from './constants'; // Todo: Remove this when fixing issue in input_setter plugin const InputSetter = { ...ISetter }; @@ -378,6 +379,17 @@ export default class CreateMergeRequestDropdown { } onChangeInput(event) { + // If the user was holding a meta key, released a meta key, or released or pressed esc, do nothing. + if ( + event.altKey || + event.ctrlKey || + event.metaKey || + event.shiftKey || + NON_INPUT_KEYS.includes(event.keyCode) + ) { + return undefined; + } + this.disable(); let target; let value; diff --git a/spec/frontend/issues/create_merge_request_dropdown_spec.js b/spec/frontend/issues/create_merge_request_dropdown_spec.js index a925195fc5e20d75e9b30c1c95aebb301f4bcb27..d1dedb4354da64d9df53fd9899eb027783cea78a 100644 --- a/spec/frontend/issues/create_merge_request_dropdown_spec.js +++ b/spec/frontend/issues/create_merge_request_dropdown_spec.js @@ -1,6 +1,7 @@ import MockAdapter from 'axios-mock-adapter'; import { TEST_HOST } from 'helpers/test_constants'; import confidentialState from '~/confidential_merge_request/state'; +import { NON_INPUT_KEY_EVENTS } from '~/issues/constants'; import CreateMergeRequestDropdown from '~/issues/create_merge_request_dropdown'; import axios from '~/lib/utils/axios_utils'; @@ -97,4 +98,28 @@ describe('CreateMergeRequestDropdown', () => { ); }); }); + + describe('onChangeInput', () => { + it('returns early if the user copies the branch name', () => { + const ctrlEvent = { + keyCode: 67, // 'c' key + ctrlKey: true, + }; + expect(dropdown.onChangeInput(ctrlEvent)).toBe(undefined); + const cmdEvent = { + keyCode: 67, // 'c' key + metaKey: true, + }; + expect(dropdown.onChangeInput(cmdEvent)).toBe(undefined); + }); + it.each(NON_INPUT_KEY_EVENTS)( + 'returns early when the user releases $label key', + ({ keyCode }) => { + const event = { + keyCode, + }; + expect(dropdown.onChangeInput(event)).toBe(undefined); + }, + ); + }); });