Skip to content

Commit

Permalink
Add exists dispalyCondition
Browse files Browse the repository at this point in the history
  • Loading branch information
OlegIvaniv committed Jul 16, 2024
1 parent a406a7a commit 2c38ea9
Show file tree
Hide file tree
Showing 5 changed files with 297 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -54,18 +54,6 @@ export class LmChatOpenAi implements INodeType {
},
properties: [
getConnectionHintNoticeField([NodeConnectionType.AiChain, NodeConnectionType.AiAgent]),
{
displayName:
'When using non OpenAI models, not all models might be chat-compatible or support other features, like tools calling or JSON response format.',
name: 'notice',
type: 'notice',
default: '',
displayOptions: {
hide: {
'/options.baseURL': [{ _cnd: { eq: undefined } }],
},
},
},
{
displayName:
'If using JSON response format, you must include word "json" in the prompt in your chain or agent. Also, make sure to select latest models released post November 2023.',
Expand Down Expand Up @@ -135,6 +123,18 @@ export class LmChatOpenAi implements INodeType {
},
default: 'gpt-3.5-turbo',
},
{
displayName:
'When using non-OpenAI models via "Base URL" override, not all models might be chat-compatible or support other features, like tools calling or JSON response format',
name: 'notice',
type: 'notice',
default: '',
displayOptions: {
show: {
'/options.baseURL': [{ _cnd: { exists: true } }],
},
},
},
{
displayName: 'Options',
name: 'options',
Expand Down
12 changes: 12 additions & 0 deletions packages/@n8n/nodes-langchain/nodes/llms/LMOpenAi/LmOpenAi.node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,18 @@ export class LmOpenAi implements INodeType {
},
},
},
{
displayName:
'When using non OpenAI models via Base URL override, not all models might be chat-compatible or support other features, like tools calling or JSON response format.',
name: 'notice',
type: 'notice',
default: '',
displayOptions: {
show: {
'/options.baseURL': [{ _cnd: { exists: true } }],
},
},
},
{
displayName: 'Options',
name: 'options',
Expand Down
3 changes: 2 additions & 1 deletion packages/workflow/src/Interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1284,7 +1284,8 @@ export type DisplayCondition =
| { _cnd: { startsWith: string } }
| { _cnd: { endsWith: string } }
| { _cnd: { includes: string } }
| { _cnd: { regex: string } };
| { _cnd: { regex: string } }
| { _cnd: { exists: true } };

export interface IDisplayOptions {
hide?: {
Expand Down
7 changes: 3 additions & 4 deletions packages/workflow/src/NodeHelpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -488,13 +488,9 @@ const checkConditions = (

return actualValues.every((propertyValue) => {
if (key === 'eq') {
if (targetValue === null) return isEqual(propertyValue, undefined);

return isEqual(propertyValue, targetValue);
}
if (key === 'not') {
if (targetValue === null) return !isEqual(propertyValue, undefined);

return !isEqual(propertyValue, targetValue);
}
if (key === 'gte') {
Expand Down Expand Up @@ -525,6 +521,9 @@ const checkConditions = (
if (key === 'regex') {
return new RegExp(targetValue as string).test(propertyValue as string);
}
if (key === 'exists') {
return propertyValue !== null && propertyValue !== undefined && propertyValue !== '';
}
return false;
});
}
Expand Down
268 changes: 268 additions & 0 deletions packages/workflow/test/NodeHelpers.conditions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1887,6 +1887,274 @@ describe('NodeHelpers', () => {
},
},
},
{
description:
'simple values with displayOptions "show" using exists condition. No values set.',
input: {
nodePropertiesArray: [
{
name: 'field1',
displayName: 'Field 1',
type: 'string',
default: '',
},
{
name: 'field2',
displayName: 'Field 2',
displayOptions: {
show: {
field1: [{ _cnd: { exists: true } }],
},
},
type: 'string',
default: 'default field2',
},
],
nodeValues: {},
},
output: {
noneDisplayedFalse: {
defaultsFalse: {},
defaultsTrue: {
field1: '',
},
},
noneDisplayedTrue: {
defaultsFalse: {},
defaultsTrue: {
field1: '',
field2: 'default field2',
},
},
},
},
{
description:
'simple values with displayOptions "show" using exists condition. Field1 has a value.',
input: {
nodePropertiesArray: [
{
name: 'field1',
displayName: 'Field 1',
type: 'string',
default: '',
},
{
name: 'field2',
displayName: 'Field 2',
displayOptions: {
show: {
field1: [{ _cnd: { exists: true } }],
},
},
type: 'string',
default: 'default field2',
},
],
nodeValues: {
field1: 'some value',
},
},
output: {
noneDisplayedFalse: {
defaultsFalse: {
field1: 'some value',
},
defaultsTrue: {
field1: 'some value',
field2: 'default field2',
},
},
noneDisplayedTrue: {
defaultsFalse: {
field1: 'some value',
},
defaultsTrue: {
field1: 'some value',
field2: 'default field2',
},
},
},
},
{
description:
'complex type "fixedCollection" with "multipleValues: false" and with displayOptions "show" using exists condition.',
input: {
nodePropertiesArray: [
{
name: 'values',
displayName: 'Values',
type: 'fixedCollection',
default: {},
options: [
{
name: 'data',
displayName: 'Data',
values: [
{
name: 'field1',
displayName: 'Field 1',
type: 'string',
default: '',
},
{
name: 'field2',
displayName: 'Field 2',
type: 'string',
displayOptions: {
show: {
field1: [{ _cnd: { exists: true } }],
},
},
default: 'default field2',
},
],
},
],
},
],
nodeValues: {
values: {
data: {
field1: 'some value',
},
},
},
},
output: {
noneDisplayedFalse: {
defaultsFalse: {
values: {
data: {
field1: 'some value',
},
},
},
defaultsTrue: {
values: {
data: {
field1: 'some value',
field2: 'default field2',
},
},
},
},
noneDisplayedTrue: {
defaultsFalse: {
values: {
data: {
field1: 'some value',
},
},
},
defaultsTrue: {
values: {
data: {
field1: 'some value',
field2: 'default field2',
},
},
},
},
},
},
{
description:
'complex type "collection" with "multipleValues: true" and with displayOptions "show" using exists condition.',
input: {
nodePropertiesArray: [
{
name: 'values',
displayName: 'Values',
type: 'collection',
typeOptions: {
multipleValues: true,
},
default: {},
options: [
{
name: 'field1',
displayName: 'Field 1',
type: 'string',
default: '',
},
{
name: 'field2',
displayName: 'Field 2',
type: 'string',
displayOptions: {
show: {
field1: [{ _cnd: { exists: true } }],
},
},
default: 'default field2',
},
],
},
],
nodeValues: {
values: [
{
field1: 'value1',
},
{
field1: '',
},
{},
],
},
},
output: {
noneDisplayedFalse: {
defaultsFalse: {
values: [
{
field1: 'value1',
},
{
field1: '',
},
{},
],
},
defaultsTrue: {
values: [
{
field1: 'value1',
},
{
field1: '',
},
{},
],
},
},
noneDisplayedTrue: {
defaultsFalse: {
values: [
{
field1: 'value1',
},
{
field1: '',
},
{},
],
},
defaultsTrue: {
values: [
{
field1: 'value1',
},
{
field1: '',
},
{},
],
},
},
},
},
];

for (const testData of tests) {
Expand Down

0 comments on commit 2c38ea9

Please sign in to comment.