mirror of
https://github.com/n8n-io/n8n.git
synced 2024-11-15 09:04:07 -08:00
dd6a4c956a
* feat: remove vue-fragment (no-changelog)
* feat: partial design-system migration
* feat: migrate info-accordion and info-tip components
* feat: migrate several components to vue 3
* feat: migrated several components
* feat: migrate several components
* feat: migrate several components
* feat: migrate several components
* feat: re-exported all design system components
* fix: fix design for popper components
* fix: editor kind of working, lots of issues to fix
* fix: fix several vue 3 migration issues
* fix: replace @change with @update:modelValue in several places
* fix: fix translation linking
* fix: fix inline-edit input
* fix: fix ndv and dialog design
* fix: update parameter input event bindings
* fix: rename deprecated lifecycle methods
* fix: fix json view mapping
* build: update lock file
* fix(editor): revisit last conflict with master and fix issues
* fix(editor): revisit last conflict with master and fix issues
* fix: fix expression editor bug causing code mirror to no longer be reactive
* fix: fix resource locator bug
* fix: fix vue-agile integration
* fix: remove global import for vue-agile
* fix: replace element-plus buttons with n8n-buttons everywhere
* fix(editor): Fix various element-plus styles (#6571)
* fix(editor): Fix various element-plus styles
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Remove debugging code
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Address PR comments
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix(editor): Fix loading in production mode [Vue 3] (#6578)
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix(editor): First round of e2e tests fixes with Vue 3 (#6579)
* fix(editor): Fix broken smoke and workflow list e2e tests
* ✔️ Fix failing canvas action tests. Updating some selectors used in credentials and workflow tests
* feat: add vue 3 eslint rules and fix issues
* fix: fix tags-dropdown
* fix: fix white-space issues caused by i18n-t
* fix: rename non-generic click events
* fix: fix search in resources list layout
* fix: fix datatable paginator
* fix: fix popper select caret and dropdown size
* fix: add width to action-dropdown
* fix: fix workflow settings icon not being hidden
* fix: refactor newly added code
* fix: fix merge issue
* fix: fix ndv credentials watcher
* fix: fix workflow saving and grabber notch
* fix: fix nodes list panel transition
* fix: fix node title visibility
* fix: fix data unpinning
* fix: fix value access
* fix: show input panel only if trigger panel enabled or not trigger node
* fix: fix tags dropdown and executions status spcing
* fix(editor): Prevent execution list to load back when leaving the route (#6697)
fix(editor): prevent execution list to load back when leaving the route
* fix: fix drawer visibility
* fix: fix expression toggle padding
* fix: fix expressions editor styling
* chore: prepare for testing
* fix: fix styling for el-button without patching
* test: fix unit tests in design-system
* test: fix most unit tests
* fix: remove import cycle.
* fix: fix personalization modal tests
* fix further resource mapper test adjustments
* fix: fix multiple tests and n8n-route attr duplication
* fix: fix source control tets
* fix: fixed remaining unit tests
* fix: fix workflows and credentials e2e tests
* fix: fix localizeNodeNames
* fix: update ndv e2e tests
* fix: fix popper left placement arrow
* fix: fix 5-ndv e2e tests
* fix: fix 6-code-node e2e tests
* fix(editor): Drop click outside directive from NodeCreator (#6716)
* fix(editor): Drop click outside directive from NodeCreator
* fix(editor): make sure mouseup outside is unbound at least before the component is unmounted
* fix: fix 10-settings-log-streaming e2e tests
* fix: fix node redrawing
* fix: fix tooltip buttons styling
* fix: fix varous e2e suites
* fix: fix 15-scheduler-node e2e suite
* fix: fix route watcher
* fix: fixed param name update and credential edit
* feat: update event names
* refactor: Remove deprecated `$data` (#6576)
Co-authored-by: Alex Grozav <alex@grozav.com>
* fix: fix 17-sharing e2e suite
* fix: fix tags dropdown
* fix: fix tags manager
* fix(editor): move :deep selectors to a separate scoped style block
* fix: fix sticky component and inline text edit
* fix: update e2e tests
* fix: remove button override references
* fix(editor): Adjust spacing in templates for Vue 3 (#6744)
* fix(editor): Adjust spacing in templates
* fix: Undo unneeded change
* fix: Undo unneeded change
* fix(editor): Adjust NDV height for Vue 3 (#6742)
fix(editor): Adjust NDV height
* fix(editor): Restore collapsed sidebar items for Vue 3 (#6743)
fix(editor): Restore collapsed sidebar items
* fix: fix linting issues
* fix: fix design-system deps
* fix: post-merge fixes
* fix: update tests
* fix: increase timeout for executionslist tets
* chore: fix linting issue
* fix: fix 14-mapping e2e tests in ci
* fix: re-enable tests
* fix: fix workflow duplication e2e tests after tags update
* fix(editor): Change component prop to be typed
* fix: fix tags dropdown in duplicate wf modal
* fix: fix focus behaviour in tags selector
* fix: fix tag creation
* fix: fix log streaming e2e race condition
* fix(editor): Fix Vue 3 linting issues (#6748)
* fix(editor): Fix Vue 3 linting issues
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix MainSidebar linter issues
* revert pnpm lock
* update pnpm lock file
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: Alex Grozav <alex@grozav.com>
* fix(editor): Some css fixes for vue3 branch (#6749)
* ✨ Fixing filter button height
* ✨ Update input modal button position
* ✨ Updating tags styling
* ✨ Fix event logging settings spacing
* 👕 Fixing lint errors
* fix: fix linting issues
* Revert to `// eslint-disable-next-line @typescript-eslint/no-misused-promises` disabling of mixins init
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix: fix css issue
* fix(editor): Lint fix
* fix(editor): Fix settings initialisation (#6750)
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix: fix initial settings loading
* fix: replace realClick with click force
* fix: fix randomly failing mapping e2e tests
* fix(editor): Fix menu item event handling
* fix: fix resource filters dropdown events (#6752)
* fix: fix resource filters dropdown events
* fix: remove teleported:false
* fix: fix event selection event naming (#6753)
* fix: removed console.log (#6754)
* fix: rever await nextTick changes
* fix: redo linting changes
* fix(editor): Redraw node connections if adding more than one node to canvas (#6755)
* fix(editor): Redraw node connections if adding more than one node to canvas
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Update position before connection two nodes
* Lint fix
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: Alex Grozav <alex@grozav.com>
* fix(editor): Fix `ResourceMapper` unit tests (#6758)
* ✔️ Fix matching columns test
* ✔️ Fix multiple matching columns test
* ✔️ Removing `skip` from the last test
* fix: Allow pasting a big workflow (#6760)
* fix: pasting a big workflow
* chore: update comment
* refactor: move try/catch to function
* refactor: move try/catch to function
* fix(editor): Fix modal layer width
* fix: fix position changes
* fix: undo it.only
* fix: make undo/redo multiple steps more verbose
* fix: Fix value survey styles (#6764)
* fix: fix value survey styles
* fix: lint
* Revert "fix: lint"
72869c431f
* fix: lint
* fix(editor): Fix collapsed sub menu
* fix: Fix drawer animation (#6767)
fix: drawer animation
* fix(editor): Fix source control buttons (#6769)
* fix(editor): Fix App loading & auth (#6768)
* fix(editor): Fix App loading & auth
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Await promises
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Fix eslint error
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: Csaba Tuncsik <csaba@n8n.io>
Co-authored-by: OlegIvaniv <me@olegivaniv.com>
Co-authored-by: Milorad FIlipović <milorad@n8n.io>
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
Co-authored-by: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com>
534 lines
15 KiB
Vue
534 lines
15 KiB
Vue
<template>
|
|
<div class="parameter-input-list-wrapper">
|
|
<div
|
|
v-for="(parameter, index) in filteredParameters"
|
|
:key="parameter.name"
|
|
:class="{ indent }"
|
|
data-test-id="parameter-item"
|
|
>
|
|
<slot v-if="indexToShowSlotAt === index" />
|
|
|
|
<div
|
|
v-if="multipleValues(parameter) === true && parameter.type !== 'fixedCollection'"
|
|
class="parameter-item"
|
|
>
|
|
<multiple-parameter
|
|
:parameter="parameter"
|
|
:values="getParameterValue(nodeValues, parameter.name, path)"
|
|
:nodeValues="nodeValues"
|
|
:path="getPath(parameter.name)"
|
|
:isReadOnly="isReadOnly"
|
|
@valueChanged="valueChanged"
|
|
/>
|
|
</div>
|
|
|
|
<import-parameter
|
|
v-else-if="
|
|
parameter.type === 'curlImport' &&
|
|
nodeTypeName === 'n8n-nodes-base.httpRequest' &&
|
|
nodeTypeVersion >= 3
|
|
"
|
|
:isReadOnly="isReadOnly"
|
|
@valueChanged="valueChanged"
|
|
/>
|
|
|
|
<n8n-notice
|
|
v-else-if="parameter.type === 'notice'"
|
|
class="parameter-item"
|
|
:content="$locale.nodeText().inputLabelDisplayName(parameter, path)"
|
|
@action="onNoticeAction"
|
|
/>
|
|
|
|
<div
|
|
v-else-if="['collection', 'fixedCollection'].includes(parameter.type)"
|
|
class="multi-parameter"
|
|
>
|
|
<div
|
|
class="delete-option clickable"
|
|
:title="$locale.baseText('parameterInputList.delete')"
|
|
v-if="hideDelete !== true && !isReadOnly"
|
|
>
|
|
<font-awesome-icon
|
|
icon="trash"
|
|
class="reset-icon clickable"
|
|
:title="$locale.baseText('parameterInputList.parameterOptions')"
|
|
@click="deleteOption(parameter.name)"
|
|
/>
|
|
</div>
|
|
<n8n-input-label
|
|
:label="$locale.nodeText().inputLabelDisplayName(parameter, path)"
|
|
:tooltipText="$locale.nodeText().inputLabelDescription(parameter, path)"
|
|
size="small"
|
|
:underline="true"
|
|
color="text-dark"
|
|
/>
|
|
<Suspense>
|
|
<collection-parameter
|
|
v-if="parameter.type === 'collection'"
|
|
:parameter="parameter"
|
|
:values="getParameterValue(nodeValues, parameter.name, path)"
|
|
:nodeValues="nodeValues"
|
|
:path="getPath(parameter.name)"
|
|
:isReadOnly="isReadOnly"
|
|
@valueChanged="valueChanged"
|
|
/>
|
|
<fixed-collection-parameter
|
|
v-else-if="parameter.type === 'fixedCollection'"
|
|
:parameter="parameter"
|
|
:values="getParameterValue(nodeValues, parameter.name, path)"
|
|
:nodeValues="nodeValues"
|
|
:path="getPath(parameter.name)"
|
|
:isReadOnly="isReadOnly"
|
|
@valueChanged="valueChanged"
|
|
/>
|
|
</Suspense>
|
|
</div>
|
|
<resource-mapper
|
|
v-else-if="parameter.type === 'resourceMapper'"
|
|
:parameter="parameter"
|
|
:node="node"
|
|
:path="getPath(parameter.name)"
|
|
:dependentParametersValues="getDependentParametersValues(parameter)"
|
|
inputSize="small"
|
|
labelSize="small"
|
|
@valueChanged="valueChanged"
|
|
/>
|
|
<div v-else-if="displayNodeParameter(parameter)" class="parameter-item">
|
|
<div
|
|
class="delete-option clickable"
|
|
:title="$locale.baseText('parameterInputList.delete')"
|
|
v-if="hideDelete !== true && !isReadOnly"
|
|
>
|
|
<font-awesome-icon
|
|
icon="trash"
|
|
class="reset-icon clickable"
|
|
:title="$locale.baseText('parameterInputList.deleteParameter')"
|
|
@click="deleteOption(parameter.name)"
|
|
/>
|
|
</div>
|
|
|
|
<parameter-input-full
|
|
:parameter="parameter"
|
|
:hide-issues="hiddenIssuesInputs.includes(parameter.name)"
|
|
:value="getParameterValue(nodeValues, parameter.name, path)"
|
|
:displayOptions="shouldShowOptions(parameter)"
|
|
:path="getPath(parameter.name)"
|
|
:isReadOnly="isReadOnly"
|
|
:hideLabel="false"
|
|
:nodeValues="nodeValues"
|
|
@update="valueChanged"
|
|
@blur="onParameterBlur(parameter.name)"
|
|
/>
|
|
</div>
|
|
</div>
|
|
<div :class="{ indent }" v-if="filteredParameters.length === 0">
|
|
<slot />
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import { defineAsyncComponent, defineComponent } from 'vue';
|
|
import type { PropType } from 'vue';
|
|
import { mapStores } from 'pinia';
|
|
import type {
|
|
INodeParameters,
|
|
INodeProperties,
|
|
INodeTypeDescription,
|
|
NodeParameterValue,
|
|
} from 'n8n-workflow';
|
|
import { deepCopy } from 'n8n-workflow';
|
|
|
|
import type { INodeUi, IUpdateInformation } from '@/Interface';
|
|
|
|
import MultipleParameter from '@/components/MultipleParameter.vue';
|
|
import { workflowHelpers } from '@/mixins/workflowHelpers';
|
|
import ParameterInputFull from '@/components/ParameterInputFull.vue';
|
|
import ImportParameter from '@/components/ImportParameter.vue';
|
|
import ResourceMapper from '@/components/ResourceMapper/ResourceMapper.vue';
|
|
import { get, set } from 'lodash-es';
|
|
import { useNDVStore } from '@/stores/ndv.store';
|
|
import { useNodeTypesStore } from '@/stores/nodeTypes.store';
|
|
import { isAuthRelatedParameter, getNodeAuthFields, getMainAuthField } from '@/utils';
|
|
import { KEEP_AUTH_IN_NDV_FOR_NODES } from '@/constants';
|
|
|
|
const FixedCollectionParameter = defineAsyncComponent(
|
|
async () => import('./FixedCollectionParameter.vue'),
|
|
);
|
|
const CollectionParameter = defineAsyncComponent(async () => import('./CollectionParameter.vue'));
|
|
|
|
export default defineComponent({
|
|
name: 'ParameterInputList',
|
|
mixins: [workflowHelpers],
|
|
components: {
|
|
MultipleParameter,
|
|
ParameterInputFull,
|
|
FixedCollectionParameter,
|
|
CollectionParameter,
|
|
ImportParameter,
|
|
ResourceMapper,
|
|
},
|
|
props: {
|
|
nodeValues: {
|
|
type: Object as PropType<INodeParameters>,
|
|
required: true,
|
|
},
|
|
parameters: {
|
|
type: Array as PropType<INodeProperties[]>,
|
|
required: true,
|
|
},
|
|
path: {
|
|
type: String,
|
|
default: '',
|
|
},
|
|
hideDelete: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
indent: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
isReadOnly: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
hiddenIssuesInputs: {
|
|
type: Array as PropType<string[]>,
|
|
default: () => [],
|
|
},
|
|
},
|
|
computed: {
|
|
...mapStores(useNodeTypesStore, useNDVStore),
|
|
nodeTypeVersion(): number | null {
|
|
if (this.node) {
|
|
return this.node.typeVersion;
|
|
}
|
|
return null;
|
|
},
|
|
nodeTypeName(): string {
|
|
if (this.node) {
|
|
return this.node.type;
|
|
}
|
|
return '';
|
|
},
|
|
nodeType(): INodeTypeDescription | null {
|
|
if (this.node) {
|
|
return this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);
|
|
}
|
|
return null;
|
|
},
|
|
filteredParameters(): INodeProperties[] {
|
|
return this.parameters.filter((parameter: INodeProperties) =>
|
|
this.displayNodeParameter(parameter),
|
|
);
|
|
},
|
|
filteredParameterNames(): string[] {
|
|
return this.filteredParameters.map((parameter) => parameter.name);
|
|
},
|
|
node(): INodeUi | null {
|
|
return this.ndvStore.activeNode;
|
|
},
|
|
nodeAuthFields(): INodeProperties[] {
|
|
return getNodeAuthFields(this.nodeType);
|
|
},
|
|
indexToShowSlotAt(): number {
|
|
let index = 0;
|
|
// For nodes that use old credentials UI, keep credentials below authentication field in NDV
|
|
// otherwise credentials will use auth filed position since the auth field is moved to credentials modal
|
|
const fieldOffset = KEEP_AUTH_IN_NDV_FOR_NODES.includes(this.nodeType?.name || '') ? 1 : 0;
|
|
const credentialsDependencies = this.getCredentialsDependencies();
|
|
|
|
this.filteredParameters.forEach((prop, propIndex) => {
|
|
if (credentialsDependencies.has(prop.name)) {
|
|
index = propIndex + fieldOffset;
|
|
}
|
|
});
|
|
|
|
return index < this.filteredParameters.length ? index : this.filteredParameters.length - 1;
|
|
},
|
|
mainNodeAuthField(): INodeProperties | null {
|
|
return getMainAuthField(this.nodeType || null);
|
|
},
|
|
},
|
|
methods: {
|
|
onParameterBlur(parameterName: string) {
|
|
this.$emit('parameterBlur', parameterName);
|
|
},
|
|
getCredentialsDependencies() {
|
|
const dependencies = new Set();
|
|
const nodeType = this.nodeTypesStore.getNodeType(
|
|
this.node?.type || '',
|
|
this.node?.typeVersion,
|
|
);
|
|
|
|
// Get names of all fields that credentials rendering depends on (using displayOptions > show)
|
|
if (nodeType && nodeType.credentials) {
|
|
for (const cred of nodeType.credentials) {
|
|
if (cred.displayOptions && cred.displayOptions.show) {
|
|
Object.keys(cred.displayOptions.show).forEach((fieldName) =>
|
|
dependencies.add(fieldName),
|
|
);
|
|
}
|
|
}
|
|
}
|
|
return dependencies;
|
|
},
|
|
multipleValues(parameter: INodeProperties): boolean {
|
|
if (this.getArgument('multipleValues', parameter) === true) {
|
|
return true;
|
|
}
|
|
return false;
|
|
},
|
|
getArgument(
|
|
argumentName: string,
|
|
parameter: INodeProperties,
|
|
): string | string[] | number | boolean | undefined {
|
|
if (parameter.typeOptions === undefined) {
|
|
return undefined;
|
|
}
|
|
|
|
if (parameter.typeOptions[argumentName] === undefined) {
|
|
return undefined;
|
|
}
|
|
|
|
return parameter.typeOptions[argumentName];
|
|
},
|
|
getPath(parameterName: string): string {
|
|
return (this.path ? `${this.path}.` : '') + parameterName;
|
|
},
|
|
deleteOption(optionName: string): void {
|
|
const parameterData = {
|
|
name: this.getPath(optionName),
|
|
value: undefined,
|
|
};
|
|
|
|
// TODO: If there is only one option it should delete the whole one
|
|
|
|
this.$emit('valueChanged', parameterData);
|
|
},
|
|
|
|
mustHideDuringCustomApiCall(parameter: INodeProperties, nodeValues: INodeParameters): boolean {
|
|
if (parameter && parameter.displayOptions && parameter.displayOptions.hide) return true;
|
|
|
|
const MUST_REMAIN_VISIBLE = [
|
|
'authentication',
|
|
'resource',
|
|
'operation',
|
|
...Object.keys(nodeValues),
|
|
];
|
|
|
|
return !MUST_REMAIN_VISIBLE.includes(parameter.name);
|
|
},
|
|
displayNodeParameter(parameter: INodeProperties): boolean {
|
|
if (parameter.type === 'hidden') {
|
|
return false;
|
|
}
|
|
|
|
if (
|
|
this.isCustomApiCallSelected(this.nodeValues) &&
|
|
this.mustHideDuringCustomApiCall(parameter, this.nodeValues)
|
|
) {
|
|
return false;
|
|
}
|
|
|
|
// Hide authentication related fields since it will now be part of credentials modal
|
|
if (
|
|
!KEEP_AUTH_IN_NDV_FOR_NODES.includes(this.node?.type || '') &&
|
|
this.mainNodeAuthField &&
|
|
(parameter.name === this.mainNodeAuthField?.name ||
|
|
this.shouldHideAuthRelatedParameter(parameter))
|
|
) {
|
|
return false;
|
|
}
|
|
|
|
if (parameter.displayOptions === undefined) {
|
|
// If it is not defined no need to do a proper check
|
|
return true;
|
|
}
|
|
|
|
const nodeValues: INodeParameters = {};
|
|
let rawValues = this.nodeValues;
|
|
if (this.path) {
|
|
rawValues = get(this.nodeValues, this.path);
|
|
}
|
|
|
|
// Resolve expressions
|
|
const resolveKeys = Object.keys(rawValues);
|
|
let key: string;
|
|
let i = 0;
|
|
let parameterGotResolved = false;
|
|
do {
|
|
key = resolveKeys.shift() as string;
|
|
if (typeof rawValues[key] === 'string' && rawValues[key].charAt(0) === '=') {
|
|
// Contains an expression that
|
|
if (
|
|
rawValues[key].includes('$parameter') &&
|
|
resolveKeys.some((parameterName) => rawValues[key].includes(parameterName))
|
|
) {
|
|
// Contains probably an expression of a missing parameter so skip
|
|
resolveKeys.push(key);
|
|
continue;
|
|
} else {
|
|
// Contains probably no expression with a missing parameter so resolve
|
|
try {
|
|
nodeValues[key] = this.resolveExpression(
|
|
rawValues[key],
|
|
nodeValues,
|
|
) as NodeParameterValue;
|
|
} catch (e) {
|
|
// If expression is invalid ignore
|
|
nodeValues[key] = '';
|
|
}
|
|
parameterGotResolved = true;
|
|
}
|
|
} else {
|
|
// Does not contain an expression, add directly
|
|
nodeValues[key] = rawValues[key];
|
|
}
|
|
// TODO: Think about how to calculate this best
|
|
if (i++ > 50) {
|
|
// Make sure we do not get caught
|
|
break;
|
|
}
|
|
} while (resolveKeys.length !== 0);
|
|
|
|
if (parameterGotResolved === true) {
|
|
if (this.path) {
|
|
rawValues = deepCopy(this.nodeValues);
|
|
set(rawValues, this.path, nodeValues);
|
|
return this.displayParameter(rawValues, parameter, this.path, this.node);
|
|
} else {
|
|
return this.displayParameter(nodeValues, parameter, '', this.node);
|
|
}
|
|
}
|
|
|
|
return this.displayParameter(this.nodeValues, parameter, this.path, this.node);
|
|
},
|
|
valueChanged(parameterData: IUpdateInformation): void {
|
|
this.$emit('valueChanged', parameterData);
|
|
},
|
|
onNoticeAction(action: string) {
|
|
if (action === 'activate') {
|
|
this.$emit('activate');
|
|
}
|
|
},
|
|
isNodeAuthField(name: string): boolean {
|
|
return this.nodeAuthFields.find((field) => field.name === name) !== undefined;
|
|
},
|
|
shouldHideAuthRelatedParameter(parameter: INodeProperties): boolean {
|
|
// TODO: For now, hide all fields that are used in authentication fields displayOptions
|
|
// Ideally, we should check if any non-auth field depends on it before hiding it but
|
|
// since there is no such case, omitting it to avoid additional computation
|
|
return isAuthRelatedParameter(this.nodeAuthFields, parameter);
|
|
},
|
|
shouldShowOptions(parameter: INodeProperties): boolean {
|
|
return parameter.type !== 'resourceMapper';
|
|
},
|
|
getDependentParametersValues(parameter: INodeProperties): string | null {
|
|
const loadOptionsDependsOn = this.getArgument('loadOptionsDependsOn', parameter) as
|
|
| string[]
|
|
| undefined;
|
|
|
|
if (loadOptionsDependsOn === undefined) {
|
|
return null;
|
|
}
|
|
|
|
// Get the resolved parameter values of the current node
|
|
const currentNodeParameters = this.ndvStore.activeNode?.parameters;
|
|
try {
|
|
const resolvedNodeParameters = this.resolveParameter(currentNodeParameters);
|
|
|
|
const returnValues: string[] = [];
|
|
for (const parameterPath of loadOptionsDependsOn) {
|
|
returnValues.push(get(resolvedNodeParameters, parameterPath) as string);
|
|
}
|
|
|
|
return returnValues.join('|');
|
|
} catch (error) {
|
|
return null;
|
|
}
|
|
},
|
|
},
|
|
watch: {
|
|
filteredParameterNames(newValue, oldValue) {
|
|
if (newValue === undefined) {
|
|
return;
|
|
}
|
|
// After a parameter does not get displayed anymore make sure that its value gets removed
|
|
// Is only needed for the edge-case when a parameter gets displayed depending on another field
|
|
// which contains an expression.
|
|
for (const parameter of oldValue) {
|
|
if (!newValue.includes(parameter)) {
|
|
const parameterData = {
|
|
name: `${this.path}.${parameter}`,
|
|
node: this.ndvStore.activeNode?.name || '',
|
|
value: undefined,
|
|
};
|
|
this.$emit('valueChanged', parameterData);
|
|
}
|
|
}
|
|
},
|
|
},
|
|
});
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
.parameter-input-list-wrapper {
|
|
.delete-option {
|
|
display: none;
|
|
position: absolute;
|
|
z-index: 999;
|
|
color: #f56c6c;
|
|
font-size: var(--font-size-2xs);
|
|
|
|
&:hover {
|
|
color: #ff0000;
|
|
}
|
|
}
|
|
|
|
.indent > div {
|
|
padding-left: var(--spacing-s);
|
|
}
|
|
|
|
.multi-parameter {
|
|
position: relative;
|
|
margin: var(--spacing-xs) 0;
|
|
|
|
.delete-option {
|
|
top: 0;
|
|
left: 0;
|
|
}
|
|
|
|
.parameter-info {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
.parameter-item {
|
|
position: relative;
|
|
margin: var(--spacing-xs) 0;
|
|
|
|
> .delete-option {
|
|
top: var(--spacing-5xs);
|
|
left: 0;
|
|
}
|
|
}
|
|
.parameter-item:hover > .delete-option,
|
|
.multi-parameter:hover > .delete-option {
|
|
display: block;
|
|
}
|
|
|
|
.parameter-notice {
|
|
background-color: var(--color-warning-tint-2);
|
|
color: $custom-font-black;
|
|
margin: 0.3em 0;
|
|
padding: 0.7em;
|
|
|
|
a {
|
|
font-weight: var(--font-weight-bold);
|
|
}
|
|
}
|
|
}
|
|
</style>
|