From ec0373f666ed7d5c416fdef44afd8dd748755c9f Mon Sep 17 00:00:00 2001 From: Elias Meire Date: Tue, 28 May 2024 16:58:44 +0200 Subject: [PATCH] feat(editor): Show expression infobox on hover and cursor position (#9507) Co-authored-by: Giulio Andreini --- .../completions/jsonField.completions.ts | 2 - .../ExpressionEditorModalInput.vue | 2 + .../InlineExpressionEditorInput.vue | 9 +- .../src/composables/useExpressionEditor.ts | 18 +- .../completions/__tests__/completions.test.ts | 12 +- .../codemirror/completions/constants.ts | 10 +- .../completions/datatype.completions.ts | 33 +- .../completions/dollar.completions.ts | 29 +- .../codemirror/completions/infoBoxRenderer.ts | 64 ++-- .../plugins/codemirror/completions/utils.ts | 12 + .../codemirror/tooltips/InfoBoxTooltip.ts | 317 ++++++++++++++++++ .../tooltips/__tests__/infoBoxTooltip.test.ts | 152 +++++++++ .../src/plugins/i18n/locales/en.json | 2 +- .../src/styles/plugins/_codemirror.scss | 133 +++++--- 14 files changed, 658 insertions(+), 137 deletions(-) create mode 100644 packages/editor-ui/src/plugins/codemirror/tooltips/InfoBoxTooltip.ts create mode 100644 packages/editor-ui/src/plugins/codemirror/tooltips/__tests__/infoBoxTooltip.test.ts diff --git a/packages/editor-ui/src/components/CodeNodeEditor/completions/jsonField.completions.ts b/packages/editor-ui/src/components/CodeNodeEditor/completions/jsonField.completions.ts index a28c5d2e2..7f2c890ca 100644 --- a/packages/editor-ui/src/components/CodeNodeEditor/completions/jsonField.completions.ts +++ b/packages/editor-ui/src/components/CodeNodeEditor/completions/jsonField.completions.ts @@ -73,7 +73,6 @@ function useJsonFieldCompletions() { * - Complete `$input.item.json[` to `['field']`. */ const inputJsonFieldCompletions = (context: CompletionContext): CompletionResult | null => { - console.log('🚀 ~ inputJsonFieldCompletions ~ context:', context); const patterns = { first: /\$input\.first\(\)\.json(\[|\.).*/, last: /\$input\.last\(\)\.json(\[|\.).*/, @@ -158,7 +157,6 @@ function useJsonFieldCompletions() { if (name === 'all') { const regexMatch = preCursor.text.match(regex); - console.log('🚀 ~ selectorJsonFieldCompletions ~ regexMatch:', regexMatch); if (!regexMatch?.groups?.index) continue; const { index } = regexMatch.groups; diff --git a/packages/editor-ui/src/components/ExpressionEditorModal/ExpressionEditorModalInput.vue b/packages/editor-ui/src/components/ExpressionEditorModal/ExpressionEditorModalInput.vue index 1f9b7b293..84ebd5789 100644 --- a/packages/editor-ui/src/components/ExpressionEditorModal/ExpressionEditorModalInput.vue +++ b/packages/editor-ui/src/components/ExpressionEditorModal/ExpressionEditorModalInput.vue @@ -24,6 +24,7 @@ import { } from '@/plugins/codemirror/keymap'; import type { Segment } from '@/types/expressions'; import { removeExpressionPrefix } from '@/utils/expressions'; +import { infoBoxTooltips } from '@/plugins/codemirror/tooltips/InfoBoxTooltip'; type Props = { modelValue: string; @@ -68,6 +69,7 @@ const extensions = computed(() => [ expressionInputHandler(), EditorView.lineWrapping, EditorView.domEventHandlers({ scroll: forceParse }), + infoBoxTooltips(), ]); const editorValue = ref(removeExpressionPrefix(props.modelValue)); const { diff --git a/packages/editor-ui/src/components/InlineExpressionEditor/InlineExpressionEditorInput.vue b/packages/editor-ui/src/components/InlineExpressionEditor/InlineExpressionEditorInput.vue index 1e547c08a..c6ed0e1e4 100644 --- a/packages/editor-ui/src/components/InlineExpressionEditor/InlineExpressionEditorInput.vue +++ b/packages/editor-ui/src/components/InlineExpressionEditor/InlineExpressionEditorInput.vue @@ -20,6 +20,7 @@ import { removeExpressionPrefix } from '@/utils/expressions'; import { createEventBus, type EventBus } from 'n8n-design-system/utils'; import type { IDataObject } from 'n8n-workflow'; import { inputTheme } from './theme'; +import { infoBoxTooltips } from '@/plugins/codemirror/tooltips/InfoBoxTooltip'; type Props = { modelValue: string; @@ -56,6 +57,7 @@ const extensions = computed(() => [ history(), expressionInputHandler(), EditorView.lineWrapping, + infoBoxTooltips(), ]); const editorValue = ref(removeExpressionPrefix(props.modelValue)); const { @@ -138,7 +140,12 @@ onBeforeUnmount(() => {