n8n/packages/editor-ui/src/components/ExpressionParameterInput.vue

302 lines
6.7 KiB
Vue
Raw Normal View History

feat(editor): Inline expression editor (#4814) * WIP * :fire: Remove unneeded watch * :zap: Further setup * :zap: Fix import * :zap: Minor tweaks * :fire: Remove logging * :art: Add some styling * :art: More styling changes * :bug: Fix wrong marking of stale data * :art: Prevent fx on dragging * :fire: Remove logging * :zap: Refine draggable target offsets * refactor(editor): Consolidate expression management logic (#4836) * :zap: Extract `ExpressionFunctionIcon` * :zap: Simplify syntax * :zap: Move to mixin * :art: Format * :blue_book: Unify types * :zap: Dedup double brace handler * :zap: Consolidate resolvable highlighter * :art: Format * :zap: Consolidate language pack * :pencil2: Add comment * :zap: Move completions to plugins * :zap: Partially deduplicate themes * refactor(editor): Apply styling feedback to inline expression editor (#4846) * :art: Adjust styling for expression parameter input * :art: Style outputs differently * :zap: Set single line for RLC * :art: Style both openers identically * :bug: Prevent defocus on resize * :zap: Adjust line height * :art: Adjust border with for expression input * :zap: Fix font family for inline output * :zap: Set up telemetry * :zap: Complete telemetry * :zap: Simplify event source * :zap: Set monospaced font for inline output * :art: Hide cursor on schema pill drop * :test_tube: Update snapshots * :zap: Consolidate editor styles * :pencil2: Add tech debt comments * :zap: Improve naming * :zap: Improve inside resolvable detection * :zap: Improve var naming * :fire: Remove outdated comment * :truck: Move constant to data * :pencil2: Clarify comments * :fire: Remove outdated comments * :fire: Remove unneeded try-catch * :fire: Remove unneeded method * :fire: Remove unneeded check * :fire: Remove `openExpression` check * :fire: Remove unused timeout * :fire: Remove commented out sections * :zap: Use Pinia naming convention * :zap: Re-evaluate on change of `ndvInputData` * :bug: Fix handling of `0` in number-type input * :bug: Surface focus and blur for mapping hints * :fire: Remove logging * :pencil2: Reword error * :zap: Change kebab-case to PascalCase * :zap: Refactor state fields for clarity * :zap: Support double bracing on selection * :art: More styling * :zap: Miscellaneous cleanup * :zap: Disregard error on drop * :art: Fix schema pill styling * :art: More `background` to `background-color` fixes * :test_tube: Update snapshots * :art: Replace non-existing var with white * :test_tube: Update snapshot * :package: Integrate `codemirror-lang-n8n-expression` * :art: Fix formatting * :test_tube: Re-update test snapshots * :test_tube: Update selectors for inline editor * :fire: Remove unused test ID * :blue_book: Add type for `currentNodePaneType` * :zap: Refactor mixin to util * :zap: Use `:global` * :fire: Remove comment * :zap: Add watch * :zap: Change import style * :shirt: Fix lint * :zap: Refactor preventing blur on resize * :fire: Remove comment * :test_tube: Re-update snapshots * :art: Prettify * :shirt: Fix lint * :fire: Remove comment Co-authored-by: Mutasem <mutdmour@gmail.com>
2022-12-14 05:43:02 -08:00
<template>
<div :class="$style['expression-parameter-input']" v-click-outside="onBlur" @keydown.tab="onBlur">
feat(editor): Inline expression editor (#4814) * WIP * :fire: Remove unneeded watch * :zap: Further setup * :zap: Fix import * :zap: Minor tweaks * :fire: Remove logging * :art: Add some styling * :art: More styling changes * :bug: Fix wrong marking of stale data * :art: Prevent fx on dragging * :fire: Remove logging * :zap: Refine draggable target offsets * refactor(editor): Consolidate expression management logic (#4836) * :zap: Extract `ExpressionFunctionIcon` * :zap: Simplify syntax * :zap: Move to mixin * :art: Format * :blue_book: Unify types * :zap: Dedup double brace handler * :zap: Consolidate resolvable highlighter * :art: Format * :zap: Consolidate language pack * :pencil2: Add comment * :zap: Move completions to plugins * :zap: Partially deduplicate themes * refactor(editor): Apply styling feedback to inline expression editor (#4846) * :art: Adjust styling for expression parameter input * :art: Style outputs differently * :zap: Set single line for RLC * :art: Style both openers identically * :bug: Prevent defocus on resize * :zap: Adjust line height * :art: Adjust border with for expression input * :zap: Fix font family for inline output * :zap: Set up telemetry * :zap: Complete telemetry * :zap: Simplify event source * :zap: Set monospaced font for inline output * :art: Hide cursor on schema pill drop * :test_tube: Update snapshots * :zap: Consolidate editor styles * :pencil2: Add tech debt comments * :zap: Improve naming * :zap: Improve inside resolvable detection * :zap: Improve var naming * :fire: Remove outdated comment * :truck: Move constant to data * :pencil2: Clarify comments * :fire: Remove outdated comments * :fire: Remove unneeded try-catch * :fire: Remove unneeded method * :fire: Remove unneeded check * :fire: Remove `openExpression` check * :fire: Remove unused timeout * :fire: Remove commented out sections * :zap: Use Pinia naming convention * :zap: Re-evaluate on change of `ndvInputData` * :bug: Fix handling of `0` in number-type input * :bug: Surface focus and blur for mapping hints * :fire: Remove logging * :pencil2: Reword error * :zap: Change kebab-case to PascalCase * :zap: Refactor state fields for clarity * :zap: Support double bracing on selection * :art: More styling * :zap: Miscellaneous cleanup * :zap: Disregard error on drop * :art: Fix schema pill styling * :art: More `background` to `background-color` fixes * :test_tube: Update snapshots * :art: Replace non-existing var with white * :test_tube: Update snapshot * :package: Integrate `codemirror-lang-n8n-expression` * :art: Fix formatting * :test_tube: Re-update test snapshots * :test_tube: Update selectors for inline editor * :fire: Remove unused test ID * :blue_book: Add type for `currentNodePaneType` * :zap: Refactor mixin to util * :zap: Use `:global` * :fire: Remove comment * :zap: Add watch * :zap: Change import style * :shirt: Fix lint * :zap: Refactor preventing blur on resize * :fire: Remove comment * :test_tube: Re-update snapshots * :art: Prettify * :shirt: Fix lint * :fire: Remove comment Co-authored-by: Mutasem <mutdmour@gmail.com>
2022-12-14 05:43:02 -08:00
<div :class="[$style['all-sections'], { [$style['focused']]: isFocused }]">
<div
:class="[
$style['prepend-section'],
'el-input-group__prepend',
{ [$style['squared']]: isForRecordLocator },
]"
>
<ExpressionFunctionIcon />
</div>
<InlineExpressionEditorInput
:value="value"
:isReadOnly="isReadOnly"
:targetItem="hoveringItem"
:isSingleLine="isForRecordLocator"
feat(editor): Completions for extensions in expression editor (#5130) * :fire: Remove test extensions * :construction: Add test description * :blue_book: Expand types * :zap: Export extensions * :zap: Export collection * :zap: Mark all proxies * :pencil2: Rename for clarity * :zap: Export from barrel * :sparkles: Create datatype completions * :zap: Mount datatype completions * :test_tube: Adjust tests * :zap: Add `path` prop * :fire: Remove `()` from completion labels * :zap: Filter out completions for pseudo-proxies * :bug: Fix method error * :zap: Add metrics * :pencil2: Improve naming * :sparkles: Start completion on empty resolvable * :sparkles: Implement completion previews * :zap: Break out completion manager * :zap: Implement in expression editor modal * :pencil2: Improve naming * :zap: Filter out irrelevant completions * :sparkles: Add preview hint * :pencil2: Improve comments * :art: Style preview hint * :zap: Expand `hasNoParams` * :zap: Add spacing for readability * :zap: Add error codes * :pencil2: Add comment * :bug: Fix Esc behavior * :zap: Parse Unicode * :zap: Throw on invalid `DateTime` * :zap: Fix second root completion detection * :zap: Switch message at completable prefix position * :bug: Fix function names for non-dev build * :bug: Fix `json` handling * :fire: Comment out previews * :recycle: Apply feedback * :fire: Remove extensions * :truck: Rename extensions * :zap: Adjust some implementations * :fire: Remove dummy extensions * :bug: Fix object regex * :recycle: Apply feedback * :pencil2: Fix typos * :pencil2: Add `fn is not a function` message * :fire: Remove check * :sparkles: Add `isNotEmpty` for objects * :truck: Rename `global` to `alpha` * :fire: Remove `encrypt` * :zap: Restore `is not a function` error * :zap: Support `week` on `extract()` * :test_tube: Fix tests * :zap: Add validation to some string extensions * :zap: Validate number arrays in some extensions * :test_tube: Fix tests * :pencil2: Improve error message * :rewind: Revert extensions framework changes * :broom: Previews cleanup * :zap: Condense blank completions * :zap: Refactor dollar completions * :zap: Refactor non-dollar completions * :zap: Refactor Luxon completions * :zap: Refactor datatype completions * :zap: Use `DATETIMEUNIT_MAP` * :pencil2: Update test description * :rewind: Revert "Use `DATETIMEUNIT_MAP`" This reverts commit 472a77df5cd789905d162f3c3db02ac767b89b4e. * :test_tube: Add tests * :recycle: Restore generic extensions * :fire: Remove logs * :test_tube: Expand tests * :sparkles: Add `Math` completions * :pencil2: List breaking change * :zap: Add doc tooltips * :bug: Fix node selector regex * :bug: Fix `context` resolution * :bug: Allow dollar completions in args * :zap: Make numeric array methods context-dependent * :pencil: Adjust docs * :bug: Fix selector ref * :zap: Surface error for valid URL * :bug: Disallow whitespace in `isEmail` check * :test_tube: Fix test for `isUrl` * :zap: Add comma validator in `toFloat` * :zap: Add validation to `$jmespath()` * :rewind: Revert valid URL error * :zap: Adjust `$jmespath()` validation * :test_tube: Adjust `isUrl` test * :zap: Remove `{}` and `[]` from compact * :pencil2: Update docs * :truck: Rename `stripTags` to `removeTags` * :zap: Do not inject whitespace inside resolvable * :zap: Make completions aware of `()` * :pencil2: Add note * :zap: Update sorting * :zap: Hide active node name from node selector * :fire: Remove `length()` and its aliases * :zap: Validate non-zero for `chunk` * :pencil2: Reword all error messages * :bug: Fix `$now` and `$today` * :zap: Simplify with `stripExcessParens` * :zap: Fold luxon into datatype * :test_tube: Clean up tests * :fire: Remove tests for removed methods * :shirt: Fix type * :arrow_up: Upgrade lang pack * :rewind: Undo change to `vitest` command * :fire: Remove unused method * :zap: Separate `return` line * :pencil2: Improve description * :test_tube: Expand tests for initial-only completions * :test_tube: Add bracket-aware completions * :zap: Make check for `all()` stricter * :pencil2: Adjust explanatory comments * :fire: Remove unneded copy * :fire: Remove outdated comment * :zap: Make naming consistent * :pencil2: Update comments * :zap: Improve URL scheme check * :pencil2: Add comment * :truck: Move extension * :pencil2: Update `BREAKING-CHANGES.md` * :pencil2: Update upcoming version * :pencil2: Fix grammar * :pencil2: Shorten message * :bug: Fix `Esc` behavior * :bug: Fix `isNumeric` * :sparkles: Support native methods * :test_tube: Skip Pinia tests * :pencil2: Shorten description * :fire: Remove outdated comment * :test_tube: Unskip Pinia tests * :pencil2: Add comments * :test_tube: Expand tests to natives * :pencil2: Add clarifying comments * :zap: Use `setTimeout` to make telemetry non-blocking * :bug: Account for no active node in cred modal * :sparkles: Resolve without workflow * :fire: Remove `Esc` handling on NDV * :zap: Use `isDateTime` * :truck: Move `unique` to next phase This array extension takes optional args. * :zap: Merge export * :test_tube: Fix tests * :rewind: Restore check * :pencil2: Make breaking change description more accurate * :test_tube: Fix e2e tests
2023-02-02 03:35:38 -08:00
:path="path"
feat(editor): Inline expression editor (#4814) * WIP * :fire: Remove unneeded watch * :zap: Further setup * :zap: Fix import * :zap: Minor tweaks * :fire: Remove logging * :art: Add some styling * :art: More styling changes * :bug: Fix wrong marking of stale data * :art: Prevent fx on dragging * :fire: Remove logging * :zap: Refine draggable target offsets * refactor(editor): Consolidate expression management logic (#4836) * :zap: Extract `ExpressionFunctionIcon` * :zap: Simplify syntax * :zap: Move to mixin * :art: Format * :blue_book: Unify types * :zap: Dedup double brace handler * :zap: Consolidate resolvable highlighter * :art: Format * :zap: Consolidate language pack * :pencil2: Add comment * :zap: Move completions to plugins * :zap: Partially deduplicate themes * refactor(editor): Apply styling feedback to inline expression editor (#4846) * :art: Adjust styling for expression parameter input * :art: Style outputs differently * :zap: Set single line for RLC * :art: Style both openers identically * :bug: Prevent defocus on resize * :zap: Adjust line height * :art: Adjust border with for expression input * :zap: Fix font family for inline output * :zap: Set up telemetry * :zap: Complete telemetry * :zap: Simplify event source * :zap: Set monospaced font for inline output * :art: Hide cursor on schema pill drop * :test_tube: Update snapshots * :zap: Consolidate editor styles * :pencil2: Add tech debt comments * :zap: Improve naming * :zap: Improve inside resolvable detection * :zap: Improve var naming * :fire: Remove outdated comment * :truck: Move constant to data * :pencil2: Clarify comments * :fire: Remove outdated comments * :fire: Remove unneeded try-catch * :fire: Remove unneeded method * :fire: Remove unneeded check * :fire: Remove `openExpression` check * :fire: Remove unused timeout * :fire: Remove commented out sections * :zap: Use Pinia naming convention * :zap: Re-evaluate on change of `ndvInputData` * :bug: Fix handling of `0` in number-type input * :bug: Surface focus and blur for mapping hints * :fire: Remove logging * :pencil2: Reword error * :zap: Change kebab-case to PascalCase * :zap: Refactor state fields for clarity * :zap: Support double bracing on selection * :art: More styling * :zap: Miscellaneous cleanup * :zap: Disregard error on drop * :art: Fix schema pill styling * :art: More `background` to `background-color` fixes * :test_tube: Update snapshots * :art: Replace non-existing var with white * :test_tube: Update snapshot * :package: Integrate `codemirror-lang-n8n-expression` * :art: Fix formatting * :test_tube: Re-update test snapshots * :test_tube: Update selectors for inline editor * :fire: Remove unused test ID * :blue_book: Add type for `currentNodePaneType` * :zap: Refactor mixin to util * :zap: Use `:global` * :fire: Remove comment * :zap: Add watch * :zap: Change import style * :shirt: Fix lint * :zap: Refactor preventing blur on resize * :fire: Remove comment * :test_tube: Re-update snapshots * :art: Prettify * :shirt: Fix lint * :fire: Remove comment Co-authored-by: Mutasem <mutdmour@gmail.com>
2022-12-14 05:43:02 -08:00
@focus="onFocus"
@blur="onBlur"
@change="onChange"
ref="inlineInput"
/>
<n8n-icon
v-if="!isDragging"
icon="external-link-alt"
size="xsmall"
:class="$style['expression-editor-modal-opener']"
@click="$emit('modalOpenerClick')"
data-test-id="expander"
/>
</div>
<div :class="isFocused ? $style.dropdown : $style.hidden">
<n8n-text size="small" compact :class="$style.header">
{{ $locale.baseText('parameterInput.resultForItem') }} {{ hoveringItemNumber }}
</n8n-text>
<n8n-text :class="$style.body">
<InlineExpressionEditorOutput
:value="value"
:isReadOnly="isReadOnly"
:segments="segments"
/>
</n8n-text>
<div :class="$style.footer">
<n8n-text size="small" compact>
{{ $locale.baseText('parameterInput.anythingInside') }}
</n8n-text>
<div :class="$style['expression-syntax-example']" v-text="`{{ }}`"></div>
<n8n-text size="small" compact>
{{ $locale.baseText('parameterInput.isJavaScript') }}
</n8n-text>
<n8n-link
:class="$style['learn-more']"
size="small"
underline
theme="text"
:to="expressionsDocsUrl"
>
{{ $locale.baseText('parameterInput.learnMore') }}
</n8n-link>
</div>
</div>
</div>
</template>
<script lang="ts">
import { mapStores } from 'pinia';
import Vue from 'vue';
import { useNDVStore } from '@/stores/ndv';
import { useWorkflowsStore } from '@/stores/workflows';
import InlineExpressionEditorInput from '@/components/InlineExpressionEditor/InlineExpressionEditorInput.vue';
import InlineExpressionEditorOutput from '@/components/InlineExpressionEditor/InlineExpressionEditorOutput.vue';
import ExpressionFunctionIcon from '@/components/ExpressionFunctionIcon.vue';
import { createExpressionTelemetryPayload } from '@/utils/telemetryUtils';
import { EXPRESSIONS_DOCS_URL } from '@/constants';
import type { Segment } from '@/types/expressions';
import type { TargetItem } from '@/Interface';
export default Vue.extend({
name: 'ExpressionParameterInput',
components: {
InlineExpressionEditorInput,
InlineExpressionEditorOutput,
ExpressionFunctionIcon,
},
data() {
return {
isFocused: false,
segments: [] as Segment[],
expressionsDocsUrl: EXPRESSIONS_DOCS_URL,
};
},
props: {
feat(editor): Completions for extensions in expression editor (#5130) * :fire: Remove test extensions * :construction: Add test description * :blue_book: Expand types * :zap: Export extensions * :zap: Export collection * :zap: Mark all proxies * :pencil2: Rename for clarity * :zap: Export from barrel * :sparkles: Create datatype completions * :zap: Mount datatype completions * :test_tube: Adjust tests * :zap: Add `path` prop * :fire: Remove `()` from completion labels * :zap: Filter out completions for pseudo-proxies * :bug: Fix method error * :zap: Add metrics * :pencil2: Improve naming * :sparkles: Start completion on empty resolvable * :sparkles: Implement completion previews * :zap: Break out completion manager * :zap: Implement in expression editor modal * :pencil2: Improve naming * :zap: Filter out irrelevant completions * :sparkles: Add preview hint * :pencil2: Improve comments * :art: Style preview hint * :zap: Expand `hasNoParams` * :zap: Add spacing for readability * :zap: Add error codes * :pencil2: Add comment * :bug: Fix Esc behavior * :zap: Parse Unicode * :zap: Throw on invalid `DateTime` * :zap: Fix second root completion detection * :zap: Switch message at completable prefix position * :bug: Fix function names for non-dev build * :bug: Fix `json` handling * :fire: Comment out previews * :recycle: Apply feedback * :fire: Remove extensions * :truck: Rename extensions * :zap: Adjust some implementations * :fire: Remove dummy extensions * :bug: Fix object regex * :recycle: Apply feedback * :pencil2: Fix typos * :pencil2: Add `fn is not a function` message * :fire: Remove check * :sparkles: Add `isNotEmpty` for objects * :truck: Rename `global` to `alpha` * :fire: Remove `encrypt` * :zap: Restore `is not a function` error * :zap: Support `week` on `extract()` * :test_tube: Fix tests * :zap: Add validation to some string extensions * :zap: Validate number arrays in some extensions * :test_tube: Fix tests * :pencil2: Improve error message * :rewind: Revert extensions framework changes * :broom: Previews cleanup * :zap: Condense blank completions * :zap: Refactor dollar completions * :zap: Refactor non-dollar completions * :zap: Refactor Luxon completions * :zap: Refactor datatype completions * :zap: Use `DATETIMEUNIT_MAP` * :pencil2: Update test description * :rewind: Revert "Use `DATETIMEUNIT_MAP`" This reverts commit 472a77df5cd789905d162f3c3db02ac767b89b4e. * :test_tube: Add tests * :recycle: Restore generic extensions * :fire: Remove logs * :test_tube: Expand tests * :sparkles: Add `Math` completions * :pencil2: List breaking change * :zap: Add doc tooltips * :bug: Fix node selector regex * :bug: Fix `context` resolution * :bug: Allow dollar completions in args * :zap: Make numeric array methods context-dependent * :pencil: Adjust docs * :bug: Fix selector ref * :zap: Surface error for valid URL * :bug: Disallow whitespace in `isEmail` check * :test_tube: Fix test for `isUrl` * :zap: Add comma validator in `toFloat` * :zap: Add validation to `$jmespath()` * :rewind: Revert valid URL error * :zap: Adjust `$jmespath()` validation * :test_tube: Adjust `isUrl` test * :zap: Remove `{}` and `[]` from compact * :pencil2: Update docs * :truck: Rename `stripTags` to `removeTags` * :zap: Do not inject whitespace inside resolvable * :zap: Make completions aware of `()` * :pencil2: Add note * :zap: Update sorting * :zap: Hide active node name from node selector * :fire: Remove `length()` and its aliases * :zap: Validate non-zero for `chunk` * :pencil2: Reword all error messages * :bug: Fix `$now` and `$today` * :zap: Simplify with `stripExcessParens` * :zap: Fold luxon into datatype * :test_tube: Clean up tests * :fire: Remove tests for removed methods * :shirt: Fix type * :arrow_up: Upgrade lang pack * :rewind: Undo change to `vitest` command * :fire: Remove unused method * :zap: Separate `return` line * :pencil2: Improve description * :test_tube: Expand tests for initial-only completions * :test_tube: Add bracket-aware completions * :zap: Make check for `all()` stricter * :pencil2: Adjust explanatory comments * :fire: Remove unneded copy * :fire: Remove outdated comment * :zap: Make naming consistent * :pencil2: Update comments * :zap: Improve URL scheme check * :pencil2: Add comment * :truck: Move extension * :pencil2: Update `BREAKING-CHANGES.md` * :pencil2: Update upcoming version * :pencil2: Fix grammar * :pencil2: Shorten message * :bug: Fix `Esc` behavior * :bug: Fix `isNumeric` * :sparkles: Support native methods * :test_tube: Skip Pinia tests * :pencil2: Shorten description * :fire: Remove outdated comment * :test_tube: Unskip Pinia tests * :pencil2: Add comments * :test_tube: Expand tests to natives * :pencil2: Add clarifying comments * :zap: Use `setTimeout` to make telemetry non-blocking * :bug: Account for no active node in cred modal * :sparkles: Resolve without workflow * :fire: Remove `Esc` handling on NDV * :zap: Use `isDateTime` * :truck: Move `unique` to next phase This array extension takes optional args. * :zap: Merge export * :test_tube: Fix tests * :rewind: Restore check * :pencil2: Make breaking change description more accurate * :test_tube: Fix e2e tests
2023-02-02 03:35:38 -08:00
path: {
type: String,
},
feat(editor): Inline expression editor (#4814) * WIP * :fire: Remove unneeded watch * :zap: Further setup * :zap: Fix import * :zap: Minor tweaks * :fire: Remove logging * :art: Add some styling * :art: More styling changes * :bug: Fix wrong marking of stale data * :art: Prevent fx on dragging * :fire: Remove logging * :zap: Refine draggable target offsets * refactor(editor): Consolidate expression management logic (#4836) * :zap: Extract `ExpressionFunctionIcon` * :zap: Simplify syntax * :zap: Move to mixin * :art: Format * :blue_book: Unify types * :zap: Dedup double brace handler * :zap: Consolidate resolvable highlighter * :art: Format * :zap: Consolidate language pack * :pencil2: Add comment * :zap: Move completions to plugins * :zap: Partially deduplicate themes * refactor(editor): Apply styling feedback to inline expression editor (#4846) * :art: Adjust styling for expression parameter input * :art: Style outputs differently * :zap: Set single line for RLC * :art: Style both openers identically * :bug: Prevent defocus on resize * :zap: Adjust line height * :art: Adjust border with for expression input * :zap: Fix font family for inline output * :zap: Set up telemetry * :zap: Complete telemetry * :zap: Simplify event source * :zap: Set monospaced font for inline output * :art: Hide cursor on schema pill drop * :test_tube: Update snapshots * :zap: Consolidate editor styles * :pencil2: Add tech debt comments * :zap: Improve naming * :zap: Improve inside resolvable detection * :zap: Improve var naming * :fire: Remove outdated comment * :truck: Move constant to data * :pencil2: Clarify comments * :fire: Remove outdated comments * :fire: Remove unneeded try-catch * :fire: Remove unneeded method * :fire: Remove unneeded check * :fire: Remove `openExpression` check * :fire: Remove unused timeout * :fire: Remove commented out sections * :zap: Use Pinia naming convention * :zap: Re-evaluate on change of `ndvInputData` * :bug: Fix handling of `0` in number-type input * :bug: Surface focus and blur for mapping hints * :fire: Remove logging * :pencil2: Reword error * :zap: Change kebab-case to PascalCase * :zap: Refactor state fields for clarity * :zap: Support double bracing on selection * :art: More styling * :zap: Miscellaneous cleanup * :zap: Disregard error on drop * :art: Fix schema pill styling * :art: More `background` to `background-color` fixes * :test_tube: Update snapshots * :art: Replace non-existing var with white * :test_tube: Update snapshot * :package: Integrate `codemirror-lang-n8n-expression` * :art: Fix formatting * :test_tube: Re-update test snapshots * :test_tube: Update selectors for inline editor * :fire: Remove unused test ID * :blue_book: Add type for `currentNodePaneType` * :zap: Refactor mixin to util * :zap: Use `:global` * :fire: Remove comment * :zap: Add watch * :zap: Change import style * :shirt: Fix lint * :zap: Refactor preventing blur on resize * :fire: Remove comment * :test_tube: Re-update snapshots * :art: Prettify * :shirt: Fix lint * :fire: Remove comment Co-authored-by: Mutasem <mutdmour@gmail.com>
2022-12-14 05:43:02 -08:00
value: {
type: String,
},
isReadOnly: {
type: Boolean,
default: false,
},
isForRecordLocator: {
type: Boolean,
default: false,
},
},
computed: {
...mapStores(useNDVStore, useWorkflowsStore),
hoveringItemNumber(): number {
return (this.hoveringItem?.itemIndex ?? 0) + 1;
},
hoveringItem(): TargetItem | null {
if (this.ndvStore.isInputParentOfActiveNode) {
return this.ndvStore.hoveringItem;
}
return null;
feat(editor): Inline expression editor (#4814) * WIP * :fire: Remove unneeded watch * :zap: Further setup * :zap: Fix import * :zap: Minor tweaks * :fire: Remove logging * :art: Add some styling * :art: More styling changes * :bug: Fix wrong marking of stale data * :art: Prevent fx on dragging * :fire: Remove logging * :zap: Refine draggable target offsets * refactor(editor): Consolidate expression management logic (#4836) * :zap: Extract `ExpressionFunctionIcon` * :zap: Simplify syntax * :zap: Move to mixin * :art: Format * :blue_book: Unify types * :zap: Dedup double brace handler * :zap: Consolidate resolvable highlighter * :art: Format * :zap: Consolidate language pack * :pencil2: Add comment * :zap: Move completions to plugins * :zap: Partially deduplicate themes * refactor(editor): Apply styling feedback to inline expression editor (#4846) * :art: Adjust styling for expression parameter input * :art: Style outputs differently * :zap: Set single line for RLC * :art: Style both openers identically * :bug: Prevent defocus on resize * :zap: Adjust line height * :art: Adjust border with for expression input * :zap: Fix font family for inline output * :zap: Set up telemetry * :zap: Complete telemetry * :zap: Simplify event source * :zap: Set monospaced font for inline output * :art: Hide cursor on schema pill drop * :test_tube: Update snapshots * :zap: Consolidate editor styles * :pencil2: Add tech debt comments * :zap: Improve naming * :zap: Improve inside resolvable detection * :zap: Improve var naming * :fire: Remove outdated comment * :truck: Move constant to data * :pencil2: Clarify comments * :fire: Remove outdated comments * :fire: Remove unneeded try-catch * :fire: Remove unneeded method * :fire: Remove unneeded check * :fire: Remove `openExpression` check * :fire: Remove unused timeout * :fire: Remove commented out sections * :zap: Use Pinia naming convention * :zap: Re-evaluate on change of `ndvInputData` * :bug: Fix handling of `0` in number-type input * :bug: Surface focus and blur for mapping hints * :fire: Remove logging * :pencil2: Reword error * :zap: Change kebab-case to PascalCase * :zap: Refactor state fields for clarity * :zap: Support double bracing on selection * :art: More styling * :zap: Miscellaneous cleanup * :zap: Disregard error on drop * :art: Fix schema pill styling * :art: More `background` to `background-color` fixes * :test_tube: Update snapshots * :art: Replace non-existing var with white * :test_tube: Update snapshot * :package: Integrate `codemirror-lang-n8n-expression` * :art: Fix formatting * :test_tube: Re-update test snapshots * :test_tube: Update selectors for inline editor * :fire: Remove unused test ID * :blue_book: Add type for `currentNodePaneType` * :zap: Refactor mixin to util * :zap: Use `:global` * :fire: Remove comment * :zap: Add watch * :zap: Change import style * :shirt: Fix lint * :zap: Refactor preventing blur on resize * :fire: Remove comment * :test_tube: Re-update snapshots * :art: Prettify * :shirt: Fix lint * :fire: Remove comment Co-authored-by: Mutasem <mutdmour@gmail.com>
2022-12-14 05:43:02 -08:00
},
isDragging(): boolean {
return this.ndvStore.isDraggableDragging;
},
},
methods: {
focus() {
const inlineInput = this.$refs.inlineInput as (Vue & HTMLElement) | undefined;
if (inlineInput?.$el) inlineInput.focus();
},
onFocus() {
this.isFocused = true;
this.$emit('focus');
},
onBlur(event: FocusEvent | KeyboardEvent) {
feat(editor): Inline expression editor (#4814) * WIP * :fire: Remove unneeded watch * :zap: Further setup * :zap: Fix import * :zap: Minor tweaks * :fire: Remove logging * :art: Add some styling * :art: More styling changes * :bug: Fix wrong marking of stale data * :art: Prevent fx on dragging * :fire: Remove logging * :zap: Refine draggable target offsets * refactor(editor): Consolidate expression management logic (#4836) * :zap: Extract `ExpressionFunctionIcon` * :zap: Simplify syntax * :zap: Move to mixin * :art: Format * :blue_book: Unify types * :zap: Dedup double brace handler * :zap: Consolidate resolvable highlighter * :art: Format * :zap: Consolidate language pack * :pencil2: Add comment * :zap: Move completions to plugins * :zap: Partially deduplicate themes * refactor(editor): Apply styling feedback to inline expression editor (#4846) * :art: Adjust styling for expression parameter input * :art: Style outputs differently * :zap: Set single line for RLC * :art: Style both openers identically * :bug: Prevent defocus on resize * :zap: Adjust line height * :art: Adjust border with for expression input * :zap: Fix font family for inline output * :zap: Set up telemetry * :zap: Complete telemetry * :zap: Simplify event source * :zap: Set monospaced font for inline output * :art: Hide cursor on schema pill drop * :test_tube: Update snapshots * :zap: Consolidate editor styles * :pencil2: Add tech debt comments * :zap: Improve naming * :zap: Improve inside resolvable detection * :zap: Improve var naming * :fire: Remove outdated comment * :truck: Move constant to data * :pencil2: Clarify comments * :fire: Remove outdated comments * :fire: Remove unneeded try-catch * :fire: Remove unneeded method * :fire: Remove unneeded check * :fire: Remove `openExpression` check * :fire: Remove unused timeout * :fire: Remove commented out sections * :zap: Use Pinia naming convention * :zap: Re-evaluate on change of `ndvInputData` * :bug: Fix handling of `0` in number-type input * :bug: Surface focus and blur for mapping hints * :fire: Remove logging * :pencil2: Reword error * :zap: Change kebab-case to PascalCase * :zap: Refactor state fields for clarity * :zap: Support double bracing on selection * :art: More styling * :zap: Miscellaneous cleanup * :zap: Disregard error on drop * :art: Fix schema pill styling * :art: More `background` to `background-color` fixes * :test_tube: Update snapshots * :art: Replace non-existing var with white * :test_tube: Update snapshot * :package: Integrate `codemirror-lang-n8n-expression` * :art: Fix formatting * :test_tube: Re-update test snapshots * :test_tube: Update selectors for inline editor * :fire: Remove unused test ID * :blue_book: Add type for `currentNodePaneType` * :zap: Refactor mixin to util * :zap: Use `:global` * :fire: Remove comment * :zap: Add watch * :zap: Change import style * :shirt: Fix lint * :zap: Refactor preventing blur on resize * :fire: Remove comment * :test_tube: Re-update snapshots * :art: Prettify * :shirt: Fix lint * :fire: Remove comment Co-authored-by: Mutasem <mutdmour@gmail.com>
2022-12-14 05:43:02 -08:00
if (
event.target instanceof Element &&
Array.from(event.target.classList).some((_class) => _class.includes('resizer'))
) {
return; // prevent blur on resizing
}
if (this.isDragging) return; // prevent blur on dragging
const wasFocused = this.isFocused;
this.isFocused = false;
this.$emit('blur');
if (wasFocused) {
const telemetryPayload = createExpressionTelemetryPayload(
this.segments,
this.value,
this.workflowsStore.workflowId,
this.ndvStore.sessionId,
this.ndvStore.activeNode?.type ?? '',
);
this.$telemetry.track('User closed Expression Editor', telemetryPayload);
}
},
onChange({ value, segments }: { value: string; segments: Segment[] }) {
if (this.isDragging) return;
this.segments = segments;
if (value === '=' + this.value) return; // prevent report on change of target item
this.$emit('valueChanged', value);
},
},
});
</script>
<style lang="scss" module>
.expression-parameter-input {
position: relative;
.all-sections {
height: 30px;
display: flex;
flex-direction: row;
display: inline-table;
width: 100%;
}
.prepend-section {
padding: 0;
padding-top: 2px;
width: 22px;
text-align: center;
}
.squared {
border-radius: 0;
}
}
.expression-editor-modal-opener {
position: absolute;
right: 0;
bottom: 0;
background-color: white;
padding: 3px;
line-height: 9px;
border: var(--border-base);
border-top-left-radius: var(--border-radius-base);
border-bottom-right-radius: var(--border-radius-base);
cursor: pointer;
svg {
width: 9px !important;
height: 9px;
transform: rotate(270deg);
&:hover {
color: var(--color-primary);
}
}
}
.focused > .prepend-section {
border-color: var(--color-secondary);
border-bottom-left-radius: 0;
}
.focused :global(.cm-editor) {
border-color: var(--color-secondary);
}
.focused > .expression-editor-modal-opener {
border-color: var(--color-secondary);
border-bottom-right-radius: 0;
background-color: white;
}
.hidden {
display: none;
}
.dropdown {
display: flex;
flex-direction: column;
position: absolute;
z-index: 2; // cover tooltips
background: white;
border: var(--border-base);
border-top: none;
width: 100%;
box-shadow: 0 2px 6px 0 rgba(#441c17, 0.1);
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
.header,
.body,
.footer {
padding: var(--spacing-3xs);
}
.header {
color: var(--color-text-dark);
font-weight: var(--font-weight-bold);
padding-left: var(--spacing-2xs);
padding-top: var(--spacing-2xs);
}
.body {
padding-top: 0;
padding-left: var(--spacing-2xs);
color: var(--color-text-dark);
}
.footer {
border-top: var(--border-base);
padding: var(--spacing-4xs);
padding-left: var(--spacing-2xs);
padding-top: 0;
line-height: var(--font-line-height-regular);
color: var(--color-text-base);
.expression-syntax-example {
display: inline-block;
font-size: var(--font-size-2xs);
height: var(--font-size-m);
background-color: #f0f0f0;
margin-left: var(--spacing-5xs);
margin-right: var(--spacing-5xs);
}
.learn-more {
line-height: 1;
white-space: nowrap;
}
}
}
</style>