diff --git a/packages/editor-ui/src/store.ts b/packages/editor-ui/src/store.ts index 56619a920b..2e8fadf0bf 100644 --- a/packages/editor-ui/src/store.ts +++ b/packages/editor-ui/src/store.ts @@ -825,13 +825,15 @@ export const store = new Vuex.Store({ }, /** - * Getter for node display names ending with a number: `'S3'`, `'MSG91'`, etc. + * Getter for node default names ending with a number: `'S3'`, `'Magento 2'`, etc. */ - nativelyNumberSuffixedNodeNames: (_, getters): string[] => { - const allNodeTypes: INodeTypeDescription[] = getters.allNodeTypes; + nativelyNumberSuffixedDefaults: (_, getters): string[] => { + const { allNodeTypes } = getters as { + allNodeTypes: Array; + }; return allNodeTypes.reduce((acc, cur) => { - if (/\d$/.test(cur.displayName)) acc.push(cur.displayName); + if (/\d$/.test(cur.defaults.name)) acc.push(cur.defaults.name); return acc; }, []); }, diff --git a/packages/editor-ui/src/views/NodeView.vue b/packages/editor-ui/src/views/NodeView.vue index f1be77bb76..b7c1f293c0 100644 --- a/packages/editor-ui/src/views/NodeView.vue +++ b/packages/editor-ui/src/views/NodeView.vue @@ -270,6 +270,7 @@ export default mixins( defaultLocale (): string { return this.$store.getters.defaultLocale; }, + ...mapGetters(['nativelyNumberSuffixedDefaults']), activeNode (): INodeUi | null { return this.$store.getters.activeNode; }, @@ -1265,7 +1266,11 @@ export default mixins( } // Check if node-name is unique else find one that is - newNodeData.name = CanvasHelpers.getUniqueNodeName(this.$store.getters.allNodes, newNodeData.name); + newNodeData.name = CanvasHelpers.getUniqueNodeName({ + nodes: this.$store.getters.allNodes, + originalName: newNodeData.name, + nativelyNumberSuffixed: this.nativelyNumberSuffixedDefaults, + }); if (nodeTypeData.webhooks && nodeTypeData.webhooks.length) { newNodeData.webhookId = uuidv4(); @@ -1857,7 +1862,11 @@ export default mixins( const newNodeData = JSON.parse(JSON.stringify(this.getNodeDataToSave(node))); // Check if node-name is unique else find one that is - newNodeData.name = CanvasHelpers.getUniqueNodeName(this.$store.getters.allNodes, newNodeData.name); + newNodeData.name = CanvasHelpers.getUniqueNodeName({ + nodes: this.$store.getters.allNodes, + originalName: newNodeData.name, + nativelyNumberSuffixed: this.nativelyNumberSuffixedDefaults, + }); newNodeData.position = CanvasHelpers.getNewNodePosition( this.nodes, @@ -2101,7 +2110,11 @@ export default mixins( return; } // Check if node-name is unique else find one that is - newName = CanvasHelpers.getUniqueNodeName(this.$store.getters.allNodes, newName); + newName = CanvasHelpers.getUniqueNodeName({ + nodes: this.$store.getters.allNodes, + originalName: newName, + nativelyNumberSuffixed: this.nativelyNumberSuffixedDefaults, + }); // Rename the node and update the connections const workflow = this.getWorkflow(undefined, undefined, true); @@ -2320,7 +2333,12 @@ export default mixins( } oldName = node.name; - newName = CanvasHelpers.getUniqueNodeName(this.$store.getters.allNodes, node.name, newNodeNames); + newName = CanvasHelpers.getUniqueNodeName({ + nodes: this.$store.getters.allNodes, + originalName: node.name, + additionalUsedNames: newNodeNames, + nativelyNumberSuffixed: this.nativelyNumberSuffixedDefaults, + }); newNodeNames.push(newName); nodeNameTable[oldName] = newName; diff --git a/packages/editor-ui/src/views/canvasHelpers.ts b/packages/editor-ui/src/views/canvasHelpers.ts index cb160ab8e0..8b3532cfb9 100644 --- a/packages/editor-ui/src/views/canvasHelpers.ts +++ b/packages/editor-ui/src/views/canvasHelpers.ts @@ -597,9 +597,19 @@ export const getZoomToFit = (nodes: INodeUi[]): {offset: XYPosition, zoomLevel: }; }; -export const getUniqueNodeName = (nodes: INodeUi[], originalName: string, additinalUsedNames?: string[]) => { +export const getUniqueNodeName = ({ + nodes, + originalName, + additionalUsedNames, + nativelyNumberSuffixed, +} : { + nodes: INodeUi[], + originalName: string, + additionalUsedNames?: string[], + nativelyNumberSuffixed: string[], +}) => { // Check if node-name is unique else find one that is - additinalUsedNames = additinalUsedNames || []; + additionalUsedNames = additionalUsedNames || []; // Get all the names of the current nodes const nodeNames = nodes.map((node: INodeUi) => { @@ -607,31 +617,42 @@ export const getUniqueNodeName = (nodes: INodeUi[], originalName: string, additi }); // Check first if the current name is already unique - if (!nodeNames.includes(originalName) && !additinalUsedNames.includes(originalName)) { + if (!nodeNames.includes(originalName) && !additionalUsedNames.includes(originalName)) { return originalName; } - const nameMatch = originalName.match(/(.*\D+)(\d*)/); + const found = nativelyNumberSuffixed.find((n) => originalName.startsWith(n)); + let ignore, baseName, nameIndex, uniqueName; let index = 1; - if (nameMatch === null) { - // Name is only a number - index = parseInt(originalName, 10); - baseName = ''; - uniqueName = baseName + index; - } else { - // Name is string or string/number combination - [ignore, baseName, nameIndex] = nameMatch; - if (nameIndex !== '') { + if (found) { + nameIndex = originalName.split(found).pop(); + if (nameIndex) { index = parseInt(nameIndex, 10); } - uniqueName = baseName; + baseName = uniqueName = found; + } else { + const nameMatch = originalName.match(/(.*\D+)(\d*)/); + + if (nameMatch === null) { + // Name is only a number + index = parseInt(originalName, 10); + baseName = ''; + uniqueName = baseName + index; + } else { + // Name is string or string/number combination + [ignore, baseName, nameIndex] = nameMatch; + if (nameIndex !== '') { + index = parseInt(nameIndex, 10); + } + uniqueName = baseName; + } } while ( nodeNames.includes(uniqueName) || - additinalUsedNames.includes(uniqueName) + additionalUsedNames.includes(uniqueName) ) { uniqueName = baseName + (index++); }