31
31
</div >
32
32
<NodeSettingsTabs
33
33
v-if =" node && nodeValid"
34
- v- model =" openPanel"
34
+ : model-value =" openPanel"
35
35
:node-type =" nodeType"
36
36
:push-ref =" pushRef"
37
+ @update:model-value =" onTabSelect"
37
38
/>
38
39
</div >
39
40
<div v-if =" node && !nodeValid" class =" node-is-not-valid" >
126
127
<n8n-notice
127
128
:content ="
128
129
$locale.baseText('nodeSettings.useTheHttpRequestNode', {
129
- interpolate: { nodeTypeDisplayName: nodeType.displayName },
130
+ interpolate: { nodeTypeDisplayName: nodeType? .displayName ?? '' },
130
131
})
131
132
"
132
133
/>
@@ -186,6 +187,7 @@ import type {
186
187
INodeProperties ,
187
188
NodeParameterValue ,
188
189
ConnectionTypes ,
190
+ NodeParameterValueType ,
189
191
} from ' n8n-workflow' ;
190
192
import {
191
193
NodeHelpers ,
@@ -357,16 +359,16 @@ export default defineComponent({
357
359
return [];
358
360
}
359
361
360
- return this .nodeType .properties ;
362
+ return this .nodeType ? .properties ?? [] ;
361
363
},
362
364
outputPanelEditMode(): { enabled: boolean ; value: string } {
363
365
return this .ndvStore .outputPanelEditMode ;
364
366
},
365
367
isCommunityNode(): boolean {
366
- return isCommunityPackageName (this .node ? .type );
368
+ return !! this . node && isCommunityPackageName (this .node .type );
367
369
},
368
370
isTriggerNode(): boolean {
369
- return this .nodeTypesStore .isTriggerNode (this .node ? .type );
371
+ return !! this .node && this . nodeTypesStore .isTriggerNode (this .node .type );
370
372
},
371
373
workflowOwnerName(): string {
372
374
return this .workflowsEEStore .getWorkflowOwnerName (` ${this .workflowsStore .workflowId } ` );
@@ -425,7 +427,7 @@ export default defineComponent({
425
427
return {
426
428
nodeValid: true ,
427
429
nodeColor: null ,
428
- openPanel: ' params' ,
430
+ openPanel: ' params' as ' params ' | ' settings ' ,
429
431
nodeValues: {
430
432
color: ' #ff0000' ,
431
433
alwaysOutputData: false ,
@@ -466,10 +468,10 @@ export default defineComponent({
466
468
importCurlEventBus .off (' setHttpNodeParameters' , this .setHttpNodeParameters );
467
469
},
468
470
methods: {
469
- setHttpNodeParameters(parameters : Record < string , unknown > ) {
471
+ setHttpNodeParameters(parameters : NodeParameterValueType ) {
470
472
try {
471
473
this .valueChanged ({
472
- node: this .node .name ,
474
+ node: this .node ? .name ,
473
475
name: ' parameters' ,
474
476
value: parameters ,
475
477
});
@@ -649,8 +651,10 @@ export default defineComponent({
649
651
// Data is on top level
650
652
if (value === null ) {
651
653
// Property should be deleted
652
- const { [lastNamePart ]: removedNodeValue, ... remainingNodeValues } = this .nodeValues ;
653
- this .nodeValues = remainingNodeValues ;
654
+ if (lastNamePart ) {
655
+ const { [lastNamePart ]: removedNodeValue, ... remainingNodeValues } = this .nodeValues ;
656
+ this .nodeValues = remainingNodeValues ;
657
+ }
654
658
} else {
655
659
// Value should be set
656
660
this .nodeValues = {
@@ -666,17 +670,21 @@ export default defineComponent({
666
670
| INodeParameters
667
671
| INodeParameters [];
668
672
669
- const { [lastNamePart ]: removedNodeValue, ... remainingNodeValues } = tempValue ;
670
- tempValue = remainingNodeValues ;
673
+ if (lastNamePart && ! Array .isArray (tempValue )) {
674
+ const { [lastNamePart ]: removedNodeValue, ... remainingNodeValues } = tempValue ;
675
+ tempValue = remainingNodeValues ;
676
+ }
671
677
672
- if (isArray && (tempValue as INodeParameters []) .length === 0 ) {
678
+ if (isArray && Array . isArray (tempValue ) && tempValue .length === 0 ) {
673
679
// If a value from an array got delete and no values are left
674
680
// delete also the parent
675
681
lastNamePart = nameParts .pop ();
676
682
tempValue = get (this .nodeValues , nameParts .join (' .' )) as INodeParameters ;
677
- const { [lastNamePart ]: removedArrayNodeValue, ... remainingArrayNodeValues } =
678
- tempValue ;
679
- tempValue = remainingArrayNodeValues ;
683
+ if (lastNamePart ) {
684
+ const { [lastNamePart ]: removedArrayNodeValue, ... remainingArrayNodeValues } =
685
+ tempValue ;
686
+ tempValue = remainingArrayNodeValues ;
687
+ }
680
688
}
681
689
} else {
682
690
// Value should be set
@@ -734,6 +742,11 @@ export default defineComponent({
734
742
// Save the node name before we commit the change because
735
743
// we need the old name to rename the node properly
736
744
const nodeNameBefore = parameterData .node || this .node ?.name ;
745
+
746
+ if (! nodeNameBefore ) {
747
+ return ;
748
+ }
749
+
737
750
const node = this .workflowsStore .getNodeByName (nodeNameBefore );
738
751
739
752
if (node === null ) {
@@ -776,44 +789,46 @@ export default defineComponent({
776
789
// we do not edit it directly
777
790
nodeParameters = deepCopy (nodeParameters );
778
791
779
- for (const parameterName of Object .keys (parameterData .value )) {
780
- // @ts-ignore
781
- newValue = parameterData .value [parameterName ];
782
-
783
- // Remove the 'parameters.' from the beginning to just have the
784
- // actual parameter name
785
- const parameterPath = parameterName .split (' .' ).slice (1 ).join (' .' );
786
-
787
- // Check if the path is supposed to change an array and if so get
788
- // the needed data like path and index
789
- const parameterPathArray = parameterPath .match (/ (. * )\[ (\d + )\] $ / );
790
-
791
- // Apply the new value
792
- // @ts-ignore
793
- if (parameterData [parameterName ] === undefined && parameterPathArray !== null ) {
794
- // Delete array item
795
- const path = parameterPathArray [1 ];
796
- const index = parameterPathArray [2 ];
797
- const data = get (nodeParameters , path );
798
-
799
- if (Array .isArray (data )) {
800
- data .splice (parseInt (index , 10 ), 1 );
801
- set (nodeParameters as object , path , data );
802
- }
803
- } else {
804
- if (newValue === undefined ) {
805
- unset (nodeParameters as object , parameterPath );
792
+ if (parameterData .value && typeof parameterData .value === ' object' ) {
793
+ for (const parameterName of Object .keys (parameterData .value )) {
794
+ // @ts-ignore
795
+ newValue = parameterData .value [parameterName ];
796
+
797
+ // Remove the 'parameters.' from the beginning to just have the
798
+ // actual parameter name
799
+ const parameterPath = parameterName .split (' .' ).slice (1 ).join (' .' );
800
+
801
+ // Check if the path is supposed to change an array and if so get
802
+ // the needed data like path and index
803
+ const parameterPathArray = parameterPath .match (/ (. * )\[ (\d + )\] $ / );
804
+
805
+ // Apply the new value
806
+ // @ts-ignore
807
+ if (parameterData [parameterName ] === undefined && parameterPathArray !== null ) {
808
+ // Delete array item
809
+ const path = parameterPathArray [1 ];
810
+ const index = parameterPathArray [2 ];
811
+ const data = get (nodeParameters , path );
812
+
813
+ if (Array .isArray (data )) {
814
+ data .splice (parseInt (index , 10 ), 1 );
815
+ set (nodeParameters as object , path , data );
816
+ }
806
817
} else {
807
- set (nodeParameters as object , parameterPath , newValue );
818
+ if (newValue === undefined ) {
819
+ unset (nodeParameters as object , parameterPath );
820
+ } else {
821
+ set (nodeParameters as object , parameterPath , newValue );
822
+ }
808
823
}
809
- }
810
824
811
- void this .externalHooks .run (' nodeSettings.valueChanged' , {
812
- parameterPath ,
813
- newValue ,
814
- parameters: this .parameters ,
815
- oldNodeParameters ,
816
- });
825
+ void this .externalHooks .run (' nodeSettings.valueChanged' , {
826
+ parameterPath ,
827
+ newValue ,
828
+ parameters: this .parameters ,
829
+ oldNodeParameters ,
830
+ });
831
+ }
817
832
}
818
833
819
834
// Get the parameters with the now new defaults according to the
@@ -1144,6 +1159,9 @@ export default defineComponent({
1144
1159
openSettings() {
1145
1160
this .openPanel = ' settings' ;
1146
1161
},
1162
+ onTabSelect(tab : ' params' | ' settings' ) {
1163
+ this .openPanel = tab ;
1164
+ },
1147
1165
},
1148
1166
});
1149
1167
</script >
0 commit comments