feat(editor): Filter component + implement in If node (#7490)
New Filter component + implementation in If node (v2) <img width="3283" alt="image" src="https://github.com/n8n-io/n8n/assets/8850410/35c379ef-4b62-4d06-82e7-673d4edcd652"> --------- Co-authored-by: Giulio Andreini <andreini@netseven.it> Co-authored-by: Michael Kret <michael.k@radency.com>
This commit is contained in:
@@ -1,18 +1,19 @@
|
||||
import type {
|
||||
INode,
|
||||
INodeParameters,
|
||||
INodeProperties,
|
||||
INodePropertyCollection,
|
||||
INodePropertyOptions,
|
||||
INodeType,
|
||||
NodeParameterValueType,
|
||||
} from 'n8n-workflow';
|
||||
import get from 'lodash/get';
|
||||
import {
|
||||
NodeOperationError,
|
||||
NodeHelpers,
|
||||
LoggerProxy,
|
||||
WorkflowOperationError,
|
||||
ApplicationError,
|
||||
LoggerProxy,
|
||||
NodeHelpers,
|
||||
NodeOperationError,
|
||||
WorkflowOperationError,
|
||||
executeFilter,
|
||||
isFilterValue,
|
||||
type INode,
|
||||
type INodeParameters,
|
||||
type INodeProperties,
|
||||
type INodePropertyCollection,
|
||||
type INodePropertyOptions,
|
||||
type INodeType,
|
||||
type NodeParameterValueType,
|
||||
} from 'n8n-workflow';
|
||||
|
||||
function findPropertyFromParameterName(
|
||||
@@ -123,6 +124,26 @@ function extractValueRLC(
|
||||
return executeRegexExtractValue(value.value, regex, parameterName, property.displayName);
|
||||
}
|
||||
|
||||
function extractValueFilter(
|
||||
value: NodeParameterValueType | object,
|
||||
property: INodeProperties,
|
||||
parameterName: string,
|
||||
itemIndex: number,
|
||||
): NodeParameterValueType | object {
|
||||
if (!isFilterValue(value)) {
|
||||
return value;
|
||||
}
|
||||
|
||||
if (property.extractValue?.type) {
|
||||
throw new ApplicationError(
|
||||
`Property "${parameterName}" has an invalid extractValue type. Filter parameters only support extractValue: true`,
|
||||
{ extra: { parameter: parameterName } },
|
||||
);
|
||||
}
|
||||
|
||||
return executeFilter(value, { itemIndex });
|
||||
}
|
||||
|
||||
function extractValueOther(
|
||||
value: NodeParameterValueType | object,
|
||||
property: INodeProperties | INodePropertyCollection,
|
||||
@@ -162,6 +183,7 @@ export function extractValue(
|
||||
parameterName: string,
|
||||
node: INode,
|
||||
nodeType: INodeType,
|
||||
itemIndex = 0,
|
||||
): NodeParameterValueType | object {
|
||||
let property: INodePropertyOptions | INodeProperties | INodePropertyCollection;
|
||||
try {
|
||||
@@ -174,10 +196,12 @@ export function extractValue(
|
||||
|
||||
if (property.type === 'resourceLocator') {
|
||||
return extractValueRLC(value, property, parameterName);
|
||||
} else if (property.type === 'filter') {
|
||||
return extractValueFilter(value, property, parameterName, itemIndex);
|
||||
}
|
||||
return extractValueOther(value, property, parameterName);
|
||||
} catch (error) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
||||
throw new NodeOperationError(node, error);
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-assignment
|
||||
throw new NodeOperationError(node, error, { description: get(error, 'description') });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2041,12 +2041,9 @@ const validateResourceMapperValue = (
|
||||
}
|
||||
|
||||
if (schemaEntry?.type) {
|
||||
const validationResult = validateFieldType(
|
||||
key,
|
||||
resolvedValue,
|
||||
schemaEntry.type,
|
||||
schemaEntry.options,
|
||||
);
|
||||
const validationResult = validateFieldType(key, resolvedValue, schemaEntry.type, {
|
||||
valueOptions: schemaEntry.options,
|
||||
});
|
||||
if (!validationResult.valid) {
|
||||
return { ...validationResult, fieldName: key };
|
||||
} else {
|
||||
@@ -2107,12 +2104,9 @@ const validateCollection = (
|
||||
for (const key of Object.keys(value)) {
|
||||
if (!validationMap[key]) continue;
|
||||
|
||||
const fieldValidationResult = validateFieldType(
|
||||
key,
|
||||
value[key],
|
||||
validationMap[key].type,
|
||||
validationMap[key].options,
|
||||
);
|
||||
const fieldValidationResult = validateFieldType(key, value[key], validationMap[key].type, {
|
||||
valueOptions: validationMap[key].options,
|
||||
});
|
||||
|
||||
if (!fieldValidationResult.valid) {
|
||||
throw new ExpressionError(
|
||||
@@ -2270,7 +2264,7 @@ export function getNodeParameter(
|
||||
|
||||
// This is outside the try/catch because it throws errors with proper messages
|
||||
if (options?.extractValue) {
|
||||
returnData = extractValue(returnData, parameterName, node, nodeType);
|
||||
returnData = extractValue(returnData, parameterName, node, nodeType, itemIndex);
|
||||
}
|
||||
|
||||
// Validate parameter value if it has a schema defined(RMC) or validateType defined
|
||||
|
||||
Reference in New Issue
Block a user