From 3aa3a453721bfa0ced12f8b94c4802a5657f7034 Mon Sep 17 00:00:00 2001 From: kay delaney <45561153+kaydelaney@users.noreply.github.com> Date: Thu, 29 Aug 2019 11:02:48 +0100 Subject: [PATCH] Prometheus: Changes brace-insertion behavior to be less annoying (#18698) * Changes brace-insertion behavior to be less annoying * Removes use of braces plugin * Revert "Removes use of braces plugin" This reverts commit 4cf4a6073bb77ec7ed569c6917db9bbf2b3fd176. --- .../explore/slate-plugins/braces.test.ts | 36 ------------- .../features/explore/slate-plugins/braces.ts | 51 +++++++++---------- 2 files changed, 24 insertions(+), 63 deletions(-) diff --git a/public/app/features/explore/slate-plugins/braces.test.ts b/public/app/features/explore/slate-plugins/braces.test.ts index c9285da9255..d72ea0f3d97 100644 --- a/public/app/features/explore/slate-plugins/braces.test.ts +++ b/public/app/features/explore/slate-plugins/braces.test.ts @@ -19,42 +19,6 @@ describe('braces', () => { expect(Plain.serialize(change.value)).toEqual('()'); }); - it('adds closing braces around a value', () => { - const change = Plain.deserialize('foo').change(); - const event = new window.KeyboardEvent('keydown', { key: '(' }); - handler(event, change); - expect(Plain.serialize(change.value)).toEqual('(foo)'); - }); - - it('adds closing braces around the following value only', () => { - const change = Plain.deserialize('foo bar ugh').change(); - let event; - event = new window.KeyboardEvent('keydown', { key: '(' }); - handler(event, change); - expect(Plain.serialize(change.value)).toEqual('(foo) bar ugh'); - - // Wrap bar - change.move(5); - event = new window.KeyboardEvent('keydown', { key: '(' }); - handler(event, change); - expect(Plain.serialize(change.value)).toEqual('(foo) (bar) ugh'); - - // Create empty parens after (bar) - change.move(4); - event = new window.KeyboardEvent('keydown', { key: '(' }); - handler(event, change); - expect(Plain.serialize(change.value)).toEqual('(foo) (bar)() ugh'); - }); - - it('adds closing braces outside a selector', () => { - const change = Plain.deserialize('sumrate(metric{namespace="dev", cluster="c1"}[2m])').change(); - let event; - change.move(3); - event = new window.KeyboardEvent('keydown', { key: '(' }); - handler(event, change); - expect(Plain.serialize(change.value)).toEqual('sum(rate(metric{namespace="dev", cluster="c1"}[2m]))'); - }); - it('removes closing brace when opening brace is removed', () => { const change = Plain.deserialize('time()').change(); let event; diff --git a/public/app/features/explore/slate-plugins/braces.ts b/public/app/features/explore/slate-plugins/braces.ts index 4fef2212395..ee6227cc309 100644 --- a/public/app/features/explore/slate-plugins/braces.ts +++ b/public/app/features/explore/slate-plugins/braces.ts @@ -1,45 +1,42 @@ +// @ts-ignore +import { Change } from 'slate'; + const BRACES: any = { '[': ']', '{': '}', '(': ')', }; -const NON_SELECTOR_SPACE_REGEXP = / (?![^}]+})/; - export default function BracesPlugin() { return { - onKeyDown(event: any, change: { value?: any; insertText?: any; deleteBackward?: any }) { + onKeyDown(event: KeyboardEvent, change: Change) { const { value } = change; - if (!value.isCollapsed) { - return undefined; - } switch (event.key) { + case '(': case '{': case '[': { event.preventDefault(); - // Insert matching braces - change - .insertText(`${event.key}${BRACES[event.key]}`) - .move(-1) - .focus(); - return true; - } - case '(': { - event.preventDefault(); - const text = value.anchorText.text; - const offset = value.anchorOffset; - const delimiterIndex = text.slice(offset).search(NON_SELECTOR_SPACE_REGEXP); - const length = delimiterIndex > -1 ? delimiterIndex + offset : text.length; - const forward = length - offset; - // Insert matching braces - change - .insertText(event.key) - .move(forward) - .insertText(BRACES[event.key]) - .move(-1 - forward) - .focus(); + const { startOffset, startKey, endOffset, endKey, focusOffset } = value.selection; + const text: string = value.focusText.text; + + // If text is selected, wrap selected text in parens + if (value.isExpanded) { + change + .insertTextByKey(startKey, startOffset, event.key) + .insertTextByKey(endKey, endOffset + 1, BRACES[event.key]) + .moveEnd(-1); + } else if ( + focusOffset === text.length || + text[focusOffset] === ' ' || + Object.values(BRACES).includes(text[focusOffset]) + ) { + change.insertText(`${event.key}${BRACES[event.key]}`).move(-1); + } else { + change.insertText(event.key); + } + return true; }