feat(n8n Form Page Node): New node (#10390)

Co-authored-by: Giulio Andreini <g.andreini@gmail.com>
Co-authored-by: Shireen Missi <94372015+ShireenMissi@users.noreply.github.com>
This commit is contained in:
Michael Kret
2024-10-17 16:59:53 +03:00
committed by GitHub
parent 86a94b5523
commit 643d66c0ae
39 changed files with 2101 additions and 229 deletions

View File

@@ -5,7 +5,7 @@ import type {
NodeParameterValue,
NodeParameterValueType,
} from 'n8n-workflow';
import { deepCopy } from 'n8n-workflow';
import { deepCopy, ADD_FORM_NOTICE } from 'n8n-workflow';
import { computed, defineAsyncComponent, onErrorCaptured, ref, watch } from 'vue';
import type { IUpdateInformation } from '@/Interface';
@@ -19,7 +19,12 @@ import ParameterInputFull from '@/components/ParameterInputFull.vue';
import ResourceMapper from '@/components/ResourceMapper/ResourceMapper.vue';
import { useNodeHelpers } from '@/composables/useNodeHelpers';
import { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';
import { KEEP_AUTH_IN_NDV_FOR_NODES } from '@/constants';
import {
FORM_NODE_TYPE,
FORM_TRIGGER_NODE_TYPE,
KEEP_AUTH_IN_NDV_FOR_NODES,
WAIT_NODE_TYPE,
} from '@/constants';
import { useNDVStore } from '@/stores/ndv.store';
import { useNodeTypesStore } from '@/stores/nodeTypes.store';
import {
@@ -91,7 +96,20 @@ const nodeType = computed(() => {
});
const filteredParameters = computed(() => {
return props.parameters.filter((parameter: INodeProperties) => displayNodeParameter(parameter));
const parameters = props.parameters.filter((parameter: INodeProperties) =>
displayNodeParameter(parameter),
);
const activeNode = ndvStore.activeNode;
if (activeNode && activeNode.type === FORM_TRIGGER_NODE_TYPE) {
return updateFormTriggerParameters(parameters, activeNode.name);
}
if (activeNode && activeNode.type === WAIT_NODE_TYPE && activeNode.parameters.resume === 'form') {
return updateWaitParameters(parameters, activeNode.name);
}
return parameters;
});
const filteredParameterNames = computed(() => {
@@ -151,6 +169,90 @@ watch(filteredParameterNames, (newValue, oldValue) => {
}
});
function updateFormTriggerParameters(parameters: INodeProperties[], triggerName: string) {
const workflow = workflowHelpers.getCurrentWorkflow();
const connectedNodes = workflow.getChildNodes(triggerName);
const hasFormPage = connectedNodes.some((nodeName) => {
const node = workflow.getNode(nodeName);
return node && node.type === FORM_NODE_TYPE;
});
if (hasFormPage) {
const triggerParameters: INodeProperties[] = [];
for (const parameter of parameters) {
if (parameter.name === 'responseMode') {
triggerParameters.push({
displayName: 'On submission, the user will be taken to the next form node',
name: 'formResponseModeNotice',
type: 'notice',
default: '',
});
continue;
}
if (parameter.name === ADD_FORM_NOTICE) continue;
if (parameter.name === 'options') {
const options = (parameter.options as INodeProperties[]).filter(
(option) => option.name !== 'respondWithOptions',
);
triggerParameters.push({
...parameter,
options,
});
continue;
}
triggerParameters.push(parameter);
}
return triggerParameters;
}
return parameters;
}
function updateWaitParameters(parameters: INodeProperties[], nodeName: string) {
const workflow = workflowHelpers.getCurrentWorkflow();
const parentNodes = workflow.getParentNodes(nodeName);
const formTriggerName = parentNodes.find(
(node) => workflow.nodes[node].type === FORM_TRIGGER_NODE_TYPE,
);
if (!formTriggerName) return parameters;
const connectedNodes = workflow.getChildNodes(formTriggerName);
const hasFormPage = connectedNodes.some((nodeName) => {
const node = workflow.getNode(nodeName);
return node && node.type === FORM_NODE_TYPE;
});
if (hasFormPage) {
const waitNodeParameters: INodeProperties[] = [];
for (const parameter of parameters) {
if (parameter.name === 'options') {
const options = (parameter.options as INodeProperties[]).filter(
(option) => option.name !== 'respondWithOptions' && option.name !== 'webhookSuffix',
);
waitNodeParameters.push({
...parameter,
options,
});
continue;
}
waitNodeParameters.push(parameter);
}
return waitNodeParameters;
}
return parameters;
}
function onParameterBlur(parameterName: string) {
emit('parameterBlur', parameterName);
}