From c92c870c7335f4e2af63fa1c6bcfd086b2957ef8 Mon Sep 17 00:00:00 2001 From: Elias Meire Date: Fri, 10 May 2024 14:39:06 +0200 Subject: [PATCH] feat(editor): Autocomplete info box: improve structure and add examples (#9019) Co-authored-by: Giulio Andreini --- cypress/e2e/14-mapping.cy.ts | 1 + .../design-system/src/css/_primitives.scss | 6 +- .../design-system/src/css/_tokens.dark.scss | 4 +- packages/design-system/src/css/_tokens.scss | 5 +- .../src/components/CodeNodeEditor/theme.ts | 2 +- .../InlineExpressionTip.vue | 2 +- .../src/composables/useExpressionEditor.ts | 25 +- .../completions/__tests__/completions.test.ts | 116 +++-- .../codemirror/completions/constants.ts | 183 ++++++- .../completions/datatype.completions.ts | 465 ++++++++---------- .../completions/dollar.completions.ts | 49 +- .../codemirror/completions/infoBoxRenderer.ts | 263 ++++++++++ .../luxon.instance.docs.ts | 9 +- .../codemirror/completions/typeGuards.ts | 5 - .../plugins/codemirror/completions/utils.ts | 13 +- .../src/plugins/codemirror/n8nLang.ts | 3 +- .../src/plugins/i18n/locales/en.json | 4 + .../src/styles/plugins/_codemirror.scss | 211 +++++++- .../src/Extensions/ArrayExtensions.ts | 7 +- .../workflow/src/Extensions/DateExtensions.ts | 4 +- .../src/Extensions/ExpressionExtension.ts | 3 +- .../workflow/src/Extensions/Extensions.ts | 17 +- .../src/Extensions/NumberExtensions.ts | 14 +- .../src/Extensions/StringExtensions.ts | 212 ++++++-- packages/workflow/src/Extensions/index.ts | 8 +- .../src/NativeMethods/Array.methods.ts | 15 + .../src/NativeMethods/Number.methods.ts | 11 +- .../src/NativeMethods/String.methods.ts | 384 +++++++++++++-- packages/workflow/src/index.ts | 8 +- .../NumberExtensions.test.ts | 6 + 30 files changed, 1597 insertions(+), 458 deletions(-) create mode 100644 packages/editor-ui/src/plugins/codemirror/completions/infoBoxRenderer.ts delete mode 100644 packages/editor-ui/src/plugins/codemirror/completions/typeGuards.ts diff --git a/cypress/e2e/14-mapping.cy.ts b/cypress/e2e/14-mapping.cy.ts index bcfeb71ec70a4..f8711db226e73 100644 --- a/cypress/e2e/14-mapping.cy.ts +++ b/cypress/e2e/14-mapping.cy.ts @@ -73,6 +73,7 @@ describe('Data mapping', () => { ndv.actions.mapToParameter('value'); ndv.getters.inlineExpressionEditorInput().should('have.text', '{{ $json.input[0].count }}'); + ndv.getters.inlineExpressionEditorInput().type('{esc}'); ndv.getters.parameterExpressionPreview('value').should('include.text', '0'); ndv.getters.inputTbodyCell(1, 0).realHover(); diff --git a/packages/design-system/src/css/_primitives.scss b/packages/design-system/src/css/_primitives.scss index 77e3a4e30ca4f..fe02c267e3c2a 100644 --- a/packages/design-system/src/css/_primitives.scss +++ b/packages/design-system/src/css/_primitives.scss @@ -9,6 +9,7 @@ --prim-gray-820: hsl(var(--prim-gray-h), 1%, 18%); --prim-gray-800: hsl(var(--prim-gray-h), 1%, 20%); + --prim-gray-780: hsl(var(--prim-gray-h), 1%, 22%); --prim-gray-740: hsl(var(--prim-gray-h), 2%, 26%); --prim-gray-670: hsl(var(--prim-gray-h), 2%, 33%); --prim-gray-540: hsl(var(--prim-gray-h), 4%, 46%); @@ -20,8 +21,9 @@ --prim-gray-70: hsl(var(--prim-gray-h), 32%, 93%); --prim-gray-70-alpha-01: hsla(var(--prim-gray-h), 32%, 93%, 0.1); --prim-gray-40: hsl(var(--prim-gray-h), 40%, 96%); - --prim-gray-30: hsl(var(--prim-gray-h), 40%, 97%); - --prim-gray-10: hsl(var(--prim-gray-h), 47%, 99%); + --prim-gray-30: hsl(var(--prim-gray-h), 43%, 97%); + --prim-gray-25: hsl(var(--prim-gray-h), 50%, 97.5%); + --prim-gray-10: hsl(var(--prim-gray-h), 50%, 99%); --prim-gray-0-alpha-075: hsla(var(--prim-gray-h), 50%, 100%, 0.75); --prim-gray-0-alpha-025: hsla(var(--prim-gray-h), 50%, 100%, 0.25); --prim-gray-0: hsl(var(--prim-gray-h), 50%, 100%); diff --git a/packages/design-system/src/css/_tokens.dark.scss b/packages/design-system/src/css/_tokens.dark.scss index 0c9b00b8d3e1f..3380015000585 100644 --- a/packages/design-system/src/css/_tokens.dark.scss +++ b/packages/design-system/src/css/_tokens.dark.scss @@ -72,7 +72,7 @@ --color-sticky-background-7: var(--prim-gray-740); --color-sticky-border-7: var(--prim-gray-670); - // Expressions and autocomplete + // Expressions, autocomplete, infobox --color-valid-resolvable-foreground: var(--prim-color-alt-a-tint-300); --color-valid-resolvable-background: var(--prim-color-alt-a-alpha-025); --color-invalid-resolvable-foreground: var(--prim-color-alt-c-tint-250); @@ -83,6 +83,8 @@ --color-expression-syntax-example: var(--prim-gray-670); --color-autocomplete-item-selected: var(--prim-color-secondary-tint-200); --color-autocomplete-section-header-border: var(--prim-gray-540); + --color-infobox-background: var(--prim-gray-780); + --color-infobox-examples-border-color: var(--prim-gray-670); // Code --color-code-tags-string: var(--prim-color-alt-f-tint-150); diff --git a/packages/design-system/src/css/_tokens.scss b/packages/design-system/src/css/_tokens.scss index b6998894408b8..ab3797781d3c7 100644 --- a/packages/design-system/src/css/_tokens.scss +++ b/packages/design-system/src/css/_tokens.scss @@ -59,6 +59,7 @@ --color-background-dark: var(--prim-gray-820); --color-background-medium: var(--prim-gray-120); --color-background-base: var(--prim-gray-40); + --color-background-light-base: var(--prim-gray-25); --color-background-light: var(--prim-gray-10); --color-background-xlight: var(--prim-gray-0); @@ -105,7 +106,7 @@ --color-sticky-background-7: var(--prim-gray-10); --color-sticky-border-7: var(--prim-gray-120); - // Expressions and autocomplete + // Expressions, autocomplete, infobox --color-valid-resolvable-foreground: var(--prim-color-alt-a); --color-valid-resolvable-background: var(--prim-color-alt-a-tint-500); --color-invalid-resolvable-foreground: var(--prim-color-alt-c); @@ -116,6 +117,8 @@ --color-expression-syntax-example: var(--prim-gray-40); --color-autocomplete-item-selected: var(--color-secondary); --color-autocomplete-section-header-border: var(--color-foreground-light); + --color-infobox-background: var(--color-background-light-base); + --color-infobox-examples-border-color: var(--color-foreground-light); // Code --color-code-tags-string: var(--prim-color-alt-f); diff --git a/packages/editor-ui/src/components/CodeNodeEditor/theme.ts b/packages/editor-ui/src/components/CodeNodeEditor/theme.ts index a495800f3d341..bb88695526ed4 100644 --- a/packages/editor-ui/src/components/CodeNodeEditor/theme.ts +++ b/packages/editor-ui/src/components/CodeNodeEditor/theme.ts @@ -15,7 +15,7 @@ const BASE_STYLING = { fontFamily: "Menlo, Consolas, 'DejaVu Sans Mono', monospace !important", maxHeight: '400px', tooltip: { - maxWidth: '300px', + maxWidth: '250px', lineHeight: '1.3em', }, diagnosticButton: { diff --git a/packages/editor-ui/src/components/InlineExpressionEditor/InlineExpressionTip.vue b/packages/editor-ui/src/components/InlineExpressionEditor/InlineExpressionTip.vue index a8cbfb18f3f8d..9e0744025c26b 100644 --- a/packages/editor-ui/src/components/InlineExpressionEditor/InlineExpressionTip.vue +++ b/packages/editor-ui/src/components/InlineExpressionEditor/InlineExpressionTip.vue @@ -131,7 +131,7 @@ watchDebounced(