@elyra/canvas 13.41.2 → 13.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/canvas-controller-40365e79.js +2 -0
- package/dist/canvas-controller-40365e79.js.map +1 -0
- package/dist/canvas-controller-6e8175f3.js +2 -0
- package/dist/canvas-controller-6e8175f3.js.map +1 -0
- package/dist/{common-canvas-f6aa2d68.js → common-canvas-60e6c495.js} +2 -2
- package/dist/common-canvas-60e6c495.js.map +1 -0
- package/dist/{common-canvas-76637856.js → common-canvas-c6a5094d.js} +2 -2
- package/dist/common-canvas-c6a5094d.js.map +1 -0
- package/dist/common-canvas.es.js +1 -1
- package/dist/common-canvas.js +1 -1
- package/dist/common-properties-2010da23.js +2 -0
- package/dist/common-properties-2010da23.js.map +1 -0
- package/dist/common-properties-abcfd713.js +2 -0
- package/dist/common-properties-abcfd713.js.map +1 -0
- package/dist/lib/canvas-controller.es.js +1 -1
- package/dist/lib/canvas-controller.js +1 -1
- package/dist/lib/canvas.es.js +1 -1
- package/dist/lib/canvas.js +1 -1
- package/dist/lib/properties.es.js +1 -1
- package/dist/lib/properties.js +1 -1
- package/package.json +2 -2
- package/src/command-actions/arrangeLayoutAction.js +4 -0
- package/src/common-canvas/svg-canvas-renderer.js +38 -1
- package/src/common-properties/components/wide-flyout/wide-flyout.jsx +10 -6
- package/src/object-model/api-pipeline.js +4 -0
- package/src/object-model/redux/reducers/canvasinfo.js +1 -0
- package/src/object-model/redux/reducers/comments.js +4 -0
- package/stats.html +1 -1
- package/types/common-properties.d.ts +1 -1
- package/dist/canvas-controller-73f1a168.js +0 -2
- package/dist/canvas-controller-73f1a168.js.map +0 -1
- package/dist/canvas-controller-8093b1c5.js +0 -2
- package/dist/canvas-controller-8093b1c5.js.map +0 -1
- package/dist/common-canvas-76637856.js.map +0 -1
- package/dist/common-canvas-f6aa2d68.js.map +0 -1
- package/dist/common-properties-2c1ae93f.js +0 -2
- package/dist/common-properties-2c1ae93f.js.map +0 -1
- package/dist/common-properties-44874063.js +0 -2
- package/dist/common-properties-44874063.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common-canvas-c6a5094d.js","sources":["../src/palette/palette-flyout-utils.js","../src/palette/palette-content-list-item-btn.jsx","../assets/images/supernode.svg","../assets/images/supernode_ext.svg","../src/palette/palette-content-list-item.jsx","../src/palette/palette-content-list.jsx","../src/palette/palette-flyout-content-category.jsx","../src/palette/palette-flyout-content-search.jsx","../src/palette/palette-flyout-content-filtered-list.jsx","../src/palette/palette-flyout-content.jsx","../src/palette/palette-flyout.jsx","../src/palette/palette.jsx","../src/palette/palette-dialog-topbar.jsx","../src/palette/palette-dialog-content-category.jsx","../src/palette/palette-dialog-content-categories.jsx","../src/palette/palette-dialog-content-grid-node.jsx","../src/palette/palette-dialog-content-grid.jsx","../src/palette/palette-dialog-content.jsx","../src/palette/palette-dialog-under.jsx","../src/palette/palette-dialog.jsx","../src/common-canvas/cc-tooltip.jsx","../src/common-canvas/cc-context-menu.jsx","../node_modules/lodash/findLastIndex.js","../src/common-canvas/cc-context-toolbar.jsx","../src/common-canvas/cc-text-toolbar.jsx","../src/common-canvas/cc-state-tag.jsx","../node_modules/d3-selection/src/namespaces.js","../node_modules/d3-selection/src/namespace.js","../node_modules/d3-selection/src/creator.js","../node_modules/d3-selection/src/selector.js","../node_modules/d3-selection/src/array.js","../node_modules/d3-selection/src/selectorAll.js","../node_modules/d3-selection/src/matcher.js","../node_modules/d3-selection/src/selection/selectChild.js","../node_modules/d3-selection/src/selection/selectChildren.js","../node_modules/d3-selection/src/selection/sparse.js","../node_modules/d3-selection/src/selection/enter.js","../node_modules/d3-selection/src/selection/data.js","../node_modules/d3-selection/src/selection/sort.js","../node_modules/d3-selection/src/selection/attr.js","../node_modules/d3-selection/src/window.js","../node_modules/d3-selection/src/selection/style.js","../node_modules/d3-selection/src/selection/property.js","../node_modules/d3-selection/src/selection/classed.js","../node_modules/d3-selection/src/selection/text.js","../node_modules/d3-selection/src/selection/html.js","../node_modules/d3-selection/src/selection/raise.js","../node_modules/d3-selection/src/selection/lower.js","../node_modules/d3-selection/src/selection/insert.js","../node_modules/d3-selection/src/selection/remove.js","../node_modules/d3-selection/src/selection/clone.js","../node_modules/d3-selection/src/selection/on.js","../node_modules/d3-selection/src/selection/dispatch.js","../node_modules/d3-selection/src/selection/index.js","../node_modules/d3-selection/src/select.js","../node_modules/d3-selection/src/selection/select.js","../node_modules/d3-selection/src/selection/selectAll.js","../node_modules/d3-selection/src/selection/filter.js","../node_modules/d3-selection/src/constant.js","../node_modules/d3-selection/src/selection/exit.js","../node_modules/d3-selection/src/selection/join.js","../node_modules/d3-selection/src/selection/merge.js","../node_modules/d3-selection/src/selection/order.js","../node_modules/d3-selection/src/selection/call.js","../node_modules/d3-selection/src/selection/nodes.js","../node_modules/d3-selection/src/selection/node.js","../node_modules/d3-selection/src/selection/size.js","../node_modules/d3-selection/src/selection/empty.js","../node_modules/d3-selection/src/selection/each.js","../node_modules/d3-selection/src/selection/append.js","../node_modules/d3-selection/src/selection/datum.js","../node_modules/d3-selection/src/selection/iterator.js","../node_modules/d3-selection/src/local.js","../node_modules/d3-selection/src/sourceEvent.js","../node_modules/d3-selection/src/pointer.js","../node_modules/d3-selection/src/create.js","../node_modules/d3-selection/src/pointers.js","../node_modules/d3-selection/src/selectAll.js","../node_modules/lodash/forOwn.js","../node_modules/lodash/_basePropertyOf.js","../node_modules/lodash/escape.js","../node_modules/lodash/_escapeHtmlChar.js","../node_modules/d3-fetch/src/blob.js","../node_modules/d3-fetch/src/buffer.js","../node_modules/d3-dsv/src/dsv.js","../node_modules/d3-dsv/src/csv.js","../node_modules/d3-dsv/src/tsv.js","../node_modules/d3-fetch/src/text.js","../node_modules/d3-fetch/src/dsv.js","../node_modules/d3-fetch/src/json.js","../node_modules/d3-fetch/src/xml.js","../node_modules/d3-fetch/src/image.js","../src/common-canvas/svg-canvas-utils-display.js","../src/common-canvas/svg-canvas-utils-nodes.js","../src/common-canvas/svg-canvas-utils-comments.js","../src/common-canvas/svg-canvas-utils-links.js","../src/common-canvas/svg-canvas-utils-decs.js","../node_modules/react-dom/client.js","../src/common-canvas/svg-canvas-utils-external.js","../node_modules/lodash/_unescapeHtmlChar.js","../node_modules/lodash/unescape.js","../src/common-canvas/svg-canvas-utils-markdown.js","../src/common-canvas/svg-canvas-utils-textarea.js","../node_modules/d3-dispatch/src/dispatch.js","../node_modules/d3-drag/src/noevent.js","../node_modules/d3-drag/src/nodrag.js","../node_modules/d3-drag/src/constant.js","../node_modules/d3-drag/src/event.js","../node_modules/d3-drag/src/drag.js","../src/common-canvas/svg-canvas-utils-drag-objects.js","../src/common-canvas/svg-canvas-utils-drag-link.js","../node_modules/d3-ease/src/quad.js","../node_modules/d3-ease/src/cubic.js","../node_modules/d3-ease/src/poly.js","../node_modules/d3-ease/src/sin.js","../node_modules/d3-ease/src/math.js","../node_modules/d3-ease/src/exp.js","../node_modules/d3-ease/src/circle.js","../node_modules/d3-ease/src/bounce.js","../node_modules/d3-ease/src/back.js","../node_modules/d3-ease/src/elastic.js","../node_modules/d3-ease/src/linear.js","../src/common-canvas/svg-canvas-utils-drag-new-link.js","../src/common-canvas/svg-canvas-utils-drag-det-link.js","../node_modules/d3-color/src/define.js","../node_modules/d3-color/src/color.js","../node_modules/d3-interpolate/src/constant.js","../node_modules/d3-interpolate/src/color.js","../node_modules/d3-interpolate/src/rgb.js","../node_modules/d3-interpolate/src/number.js","../node_modules/d3-interpolate/src/string.js","../node_modules/d3-interpolate/src/transform/decompose.js","../node_modules/d3-interpolate/src/transform/parse.js","../node_modules/d3-interpolate/src/transform/index.js","../node_modules/d3-interpolate/src/zoom.js","../node_modules/d3-timer/src/timer.js","../node_modules/d3-timer/src/timeout.js","../node_modules/d3-transition/src/transition/schedule.js","../node_modules/d3-transition/src/interrupt.js","../node_modules/d3-transition/src/transition/tween.js","../node_modules/d3-transition/src/transition/interpolate.js","../node_modules/d3-transition/src/transition/attr.js","../node_modules/d3-transition/src/transition/attrTween.js","../node_modules/d3-transition/src/transition/delay.js","../node_modules/d3-transition/src/transition/duration.js","../node_modules/d3-transition/src/transition/selection.js","../node_modules/d3-transition/src/transition/style.js","../node_modules/d3-transition/src/transition/index.js","../node_modules/d3-transition/src/transition/select.js","../node_modules/d3-transition/src/transition/selectAll.js","../node_modules/d3-transition/src/transition/filter.js","../node_modules/d3-transition/src/transition/merge.js","../node_modules/d3-transition/src/transition/transition.js","../node_modules/d3-transition/src/transition/on.js","../node_modules/d3-transition/src/transition/styleTween.js","../node_modules/d3-transition/src/transition/text.js","../node_modules/d3-transition/src/transition/textTween.js","../node_modules/d3-transition/src/transition/remove.js","../node_modules/d3-transition/src/transition/ease.js","../node_modules/d3-transition/src/transition/easeVarying.js","../node_modules/d3-transition/src/transition/end.js","../node_modules/d3-transition/src/selection/transition.js","../node_modules/d3-transition/src/selection/index.js","../node_modules/d3-transition/src/selection/interrupt.js","../src/common-canvas/d3-zoom-extension/src/constant.js","../src/common-canvas/d3-zoom-extension/src/event.js","../src/common-canvas/d3-zoom-extension/src/transform.js","../src/common-canvas/d3-zoom-extension/src/noevent.js","../src/common-canvas/d3-zoom-extension/src/zoom.js","../src/common-canvas/svg-canvas-utils-zoom.js","../src/common-canvas/svg-canvas-utils-accessibility.js","../src/common-canvas/svg-canvas-pipeline.js","../src/common-canvas/svg-canvas-renderer.js","../src/common-canvas/svg-canvas-d3.js","../src/common-canvas/cc-contents.jsx","../src/notification-panel/notification-panel.jsx","../src/common-canvas/cc-toolbar.jsx","../src/common-canvas/cc-left-flyout.jsx","../src/common-canvas/cc-right-flyout.jsx","../src/common-canvas/cc-top-panel.jsx","../src/common-canvas/cc-center-panel.jsx","../src/common-canvas/cc-bottom-panel.jsx","../src/common-canvas/cc-panels.jsx","../src/common-canvas/common-canvas.jsx"],"sourcesContent":["/*\n * Copyright 2017-2023 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { has } from \"lodash\";\n\n// The entry point to this utils file.\n// Returns a filtered, ranked array of nodeTypeInfo objects for the nodeTypes\n// in the categories passed in and the searchString passed in.\nexport function getFilteredNodeTypeInfos(categories, searchString) {\n\tconst filteredNodeTypeInfos = [];\n\tconst lowercaseFilteredKeyword = searchString.toLowerCase();\n\tconst filterStrings = lowercaseFilteredKeyword.split(\" \").filter((kw) => kw !== \"\");\n\tfor (let idx = 0; idx < categories.length; idx++) {\n\t\tfilteredNodeTypeInfos.push(...getFilteredNodeTypeInfosByCategory(categories[idx], filterStrings));\n\t}\n\tconst rankedFilteredNodeTypeInfos =\n\t\tfilteredNodeTypeInfos.sort((e1, e2) => ((e1.occurrenceInfo.ranking <= e2.occurrenceInfo.ranking) ? 1 : -1));\n\n\treturn rankedFilteredNodeTypeInfos;\n}\n\n// Returns a filtered, ranked array of nodeTypeInfo objects for the nodeTypes\n// in the category passed in and the searchString passed in.\nfunction getFilteredNodeTypeInfosByCategory(category, filterStrings) {\n\tvar filteredNodeTypeInfos = [];\n\tif (category.node_types) {\n\t\tfor (const nodeType of category.node_types) {\n\t\t\tconst occurrenceInfo = getOccurrences(nodeType, category, filterStrings);\n\t\t\tif (occurrenceInfo) {\n\t\t\t\tfilteredNodeTypeInfos.push({ nodeType, category, occurrenceInfo });\n\t\t\t}\n\t\t}\n\t}\n\treturn filteredNodeTypeInfos;\n}\n\n// Returns an object containing the label and description occurrences of the\n// stings in the filterString array passed in based on the nodeType and category\n// passed in. The returned object also contains a ranking which can be used\n// to rank the object returned against other objects returned from this method.\nfunction getOccurrences(nodeType, category, filterStrings) {\n\tif (filterStrings.length > 0) {\n\n\t\tconst { catLabelOccurrences, catLabelHitCounts } = getCategoryLabelInfo(category, filterStrings);\n\t\tconst { nodeLabelOccurrences, nodeLabelHitCounts } = getNodeLabelInfo(nodeType, filterStrings);\n\t\tconst { nodeDescOccurrences, nodeDescHitCounts } = getNodeDescInfo(nodeType, filterStrings);\n\n\t\tif (catLabelOccurrences.length > 0 || nodeLabelOccurrences.length > 0 || nodeDescOccurrences.length > 0) {\n\t\t\tconst ranking = calcRanking(catLabelHitCounts, nodeLabelHitCounts, nodeDescHitCounts, filterStrings.length);\n\t\t\treturn { catLabelOccurrences, nodeLabelOccurrences, nodeDescOccurrences, ranking };\n\t\t}\n\t}\n\treturn null;\n}\n\n// Returns the occurrences and hit counts info for the label of the category\n// passed in based on the filterStrings.\nfunction getCategoryLabelInfo(category, filterStrings) {\n\tconst catLabel = has(category, \"label\") && category.label\n\t\t? category.label.toLowerCase()\n\t\t: \"\";\n\tconst { occurrences, hitCounts } = wordOccurrences(catLabel, filterStrings);\n\treturn { catLabelOccurrences: occurrences, catLabelHitCounts: hitCounts };\n}\n\n// Returns the occurrences and hit counts info for the label of the node\n// passed in based on the filterStrings.\nfunction getNodeLabelInfo(nodeType, filterStrings) {\n\tconst nodeLabel = has(nodeType, \"app_data.ui_data.label\") && nodeType.app_data.ui_data.label\n\t\t? nodeType.app_data.ui_data.label.toLowerCase()\n\t\t: \"\";\n\tconst { occurrences, hitCounts } = wordOccurrences(nodeLabel, filterStrings);\n\treturn { nodeLabelOccurrences: occurrences, nodeLabelHitCounts: hitCounts };\n}\n\n// Returns the occurrences and hit counts info for the description of the node\n// passed in based on the filterStrings.\nfunction getNodeDescInfo(nodeType, filterStrings) {\n\tconst desc = has(nodeType, \"app_data.ui_data.description\") && nodeType.app_data.ui_data.description\n\t\t? nodeType.app_data.ui_data.description.toLowerCase()\n\t\t: \"\";\n\tconst { occurrences, hitCounts } = wordOccurrences(desc, filterStrings);\n\treturn { nodeDescOccurrences: occurrences, nodeDescHitCounts: hitCounts };\n}\n\n// Calculates a ranking value for the node type info object being processed,\n// based on the various hit count arrays passed in. Each hit count array has\n// one element for each filter string entered by the user. Each element\n// contains either a 1 or 0 to indicate a hit on that filter string or not.\n// Ranking is based on:\n// * The number of hits across the 3 areas (category label, node label, description)\n// * Whether or not multiple filter strings (if more than one is provided)\n// appear in any of the areas.\nfunction calcRanking(catLabelHitCounts, nodeLabelHitCounts, descHitCounts, filterStringsLength) {\n\tlet ranking = 0;\n\tlet multiStringHits = 0;\n\n\tfor (let i = 0; i < filterStringsLength; i++) {\n\t\tranking += catLabelHitCounts[i] + (10 * nodeLabelHitCounts[i]) + descHitCounts[i]; // Give extra weight to node label hit\n\n\t\tif (catLabelHitCounts[i] + nodeLabelHitCounts[i] + descHitCounts[i] > 0) {\n\t\t\tmultiStringHits++;\n\t\t}\n\t}\n\n\treturn ranking + (multiStringHits * 50);\n}\n\n// Returns an object containing an array of occurrences and hit counts for the\n// main string passed in after being searched by the strings in the\n// filterStrings array passed in.\nfunction wordOccurrences(mainString, filterStrings) {\n\tlet occurrences = [];\n\tconst hitCounts = [];\n\tfilterStrings.forEach((s) => {\n\t\tif (s) {\n\t\t\tconst newOccurrences = wordOccurrencesByString(mainString, s);\n\t\t\toccurrences = joinOccurrences(occurrences, newOccurrences, mainString);\n\t\t\thitCounts.push(newOccurrences.length > 0 ? 1 : 0);\n\t\t}\n\t});\n\treturn { occurrences, hitCounts };\n}\n\n// Returns an array of occurrences where the occurrences from the two arrays\n// passed in are joined together where they overlap so that the returned\n// array has no overlapping occurrences.\nfunction joinOccurrences(occurrences, newOccurrences) {\n\tif (occurrences.length === 0) {\n\t\treturn newOccurrences;\n\t}\n\tif (newOccurrences.length === 0) {\n\t\treturn occurrences;\n\t}\n\n\tconst addOccurrences = [];\n\tnewOccurrences.forEach((newOcc) => {\n\t\tlet handled = false;\n\t\toccurrences.forEach((occ) => {\n\t\t\t// String abdefghijklmno\n\t\t\t// Occurrence <-->\n\t\t\t// New occurrence <------->\n\t\t\t// Result <------->\n\t\t\t// and also:\n\t\t\t// Occurrence <-->\n\t\t\t// New occurrence <-->\n\t\t\t// Result <-->\n\t\t\tif (newOcc.start <= occ.start && newOcc.end >= occ.end) {\n\t\t\t\tocc.start = newOcc.start;\n\t\t\t\tocc.end = newOcc.end;\n\t\t\t\thandled = true;\n\n\t\t\t// String abdefghijklmno\n\t\t\t// Occurrence <-->\n\t\t\t// New occurrence <--->\n\t\t\t// Result <----->\n\t\t\t} else if (newOcc.start >= occ.start && newOcc.start < occ.end) {\n\t\t\t\tif (newOcc.end >= occ.end) {\n\t\t\t\t\tocc.end = newOcc.end;\n\t\t\t\t}\n\t\t\t\thandled = true;\n\n\t\t\t// String abdefghijklmno\n\t\t\t// Occurrence <-->\n\t\t\t// New occurrence <--->\n\t\t\t// Result <----->\n\t\t\t} else if (newOcc.end > occ.start && newOcc.end <= occ.end) {\n\t\t\t\tif (newOcc.start < occ.start) {\n\t\t\t\t\tocc.start = newOcc.start;\n\t\t\t\t}\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t});\n\t\t// Occurrence <-->\n\t\t// New occurrence <-->\n\t\t// Result <--> <-->\n\t\tif (!handled) {\n\t\t\taddOccurrences.push(newOcc);\n\t\t}\n\t});\n\n\tlet outOccurrences = occurrences.concat(addOccurrences);\n\toutOccurrences = outOccurrences.sort((occ1, occ2) => ((occ1.start < occ2.start) ? -1 : 1));\n\treturn outOccurrences;\n}\n\n// Returns up to a maximum of 20 occurrences of the searchString in the mainString.\n// 20 is an arbitrary number chosen to improve search performance since it is\n// considered unlikely a user will care about anything more than 20 hits on a\n// string (which would most likely be in a description string).\nfunction wordOccurrencesByString(mainString, searchString) {\n\tconst occurrences = [];\n\tlet start = 0;\n\tlet index = 0;\n\tlet count = 0;\n\n\twhile (index > -1 && count < 20) {\n\t\tindex = mainString.indexOf(searchString, start);\n\t\tif (index > -1) {\n\t\t\toccurrences.push({ start: index, end: index + searchString.length });\n\t\t\tstart = index + searchString.length;\n\t\t\tcount++;\n\t\t}\n\t}\n\treturn occurrences;\n}\n\n// If we need to support a locale specific search we can uncomment the code\n// below and use localeIndexOf in-place of <string>.indexOf() in the code above.\n\n// function localeIndexOf(mainString, searchString, fromIndex) {\n// \tlet index = -1;\n// \tif (searchString.length <= mainString.length - fromIndex) {\n// \t\tfor (let i = fromIndex; i < mainString.length; i++) {\n// \t\t\tif (localStartsWith(mainString.substring(i), searchString)) {\n// \t\t\t\tindex = i;\n// \t\t\t\tbreak;\n// \t\t\t}\n// \t\t}\n// \t}\n// \treturn index;\n// }\n//\n// function localStartsWith(mainString, compString) {\n// \tif (compString.length > mainString.length) {\n// \t\treturn false;\n// \t}\n//\n// \tlet state = true;\n// \tfor (let i = 0; i < compString.length && state === true; i++) {\n// \t\tif (!localeEquals(mainString[i], compString[i])) {\n// \t\t\tstate = false;\n// \t\t}\n// \t}\n// \treturn state;\n// }\n//\n// function localeEquals(c1, c2) {\n// \treturn c1.localeCompare(c2) === 0;\n// }\n","/*\n * Copyright 2024 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { injectIntl } from \"react-intl\";\nimport defaultMessages from \"../../locales/palette/locales/en.json\";\n\nclass PaletteContentListItemBtn extends React.Component {\n\n\trender() {\n\t\tconst less =\n\t\t\tthis.props.intl.formatMessage({ id: this.props.id, defaultMessage: defaultMessages[this.props.id] });\n\t\treturn (\n\t\t\t<div key=\"l_btn\" className = \"palette-list-item-desc-button\" onClick={this.props.onClick}>\n\t\t\t\t{less}\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nPaletteContentListItemBtn.propTypes = {\n\tintl: PropTypes.object.isRequired,\n\tid: PropTypes.string.isRequired,\n\tonClick: PropTypes.func.isRequired\n};\n\nexport default injectIntl(PaletteContentListItemBtn);\n","export default \"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2064%2060%22%3E%20%3Cpath%20d%3D%22M32%2C42a1.61%2C1.61%2C0%2C0%2C1-.8-.2L9.28%2C30.15l1.6-2.94L32%2C38.47%2C53.12%2C27.21l1.6%2C2.94L32.8%2C41.84A1.71%2C1.71%2C0%2C0%2C1%2C32%2C42Z%22%2F%3E%20%3Cpath%20d%3D%22M32%2C52.05a1.72%2C1.72%2C0%2C0%2C1-.8-.2L9.28%2C40.17l1.6-2.94L32%2C48.48%2C53.12%2C37.23l1.6%2C2.94L32.8%2C51.85A1.72%2C1.72%2C0%2C0%2C1%2C32%2C52.05Z%22%2F%3E%20%3Cpath%20d%3D%22M32%2C32a1.72%2C1.72%2C0%2C0%2C1-.8-.2L9.28%2C20.14a1.66%2C1.66%2C0%2C0%2C1%2C0-2.94L31.2%2C5.52a1.68%2C1.68%2C0%2C0%2C1%2C1.6%2C0L54.72%2C17.2a1.66%2C1.66%2C0%2C0%2C1%2C.69%2C2.26%2C1.74%2C1.74%2C0%2C0%2C1-.69.68L32.8%2C31.82A1.72%2C1.72%2C0%2C0%2C1%2C32%2C32ZM13.64%2C18.67%2C32%2C28.46l18.36-9.79L32%2C8.88Z%22%2F%3E%20%3Crect%20x%3D%225.02%22%20y%3D%221.98%22%20width%3D%2253.96%22%20height%3D%2253.41%22%20fill%3D%22none%22%2F%3E%3C%2Fsvg%3E\"","export default \"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2064%2060%22%3E%20%3Cpolygon%20points%3D%2217.28%204.63%2026.88%2014.07%2024.74%2015.87%2018.94%2010.35%2018.94%2026.29%2015.78%2026.29%2015.78%2010.35%209.97%2016.12%207.91%2014.04%2017.28%204.63%22%2F%3E%20%3Cpath%20d%3D%22M32.39%2C6.36l.2.1%2C20.35%2C11a2.7%2C2.7%2C0%2C0%2C1%2C1.11%2C1.11%2C2.74%2C2.74%2C0%2C0%2C1-.89%2C3.59l-.22.13L33%2C33a2.66%2C2.66%2C0%2C0%2C1-2.51%2C0l-6-3.13a1.83%2C1.83%2C0%2C1%2C1%2C1.69-3.25l5.57%2C2.89%2C18-9.69L30.85%2C9.68A1.83%2C1.83%2C0%2C0%2C1%2C30%2C7.39l.09-.19A1.83%2C1.83%2C0%2C0%2C1%2C32.39%2C6.36Z%22%2F%3E%20%3Cpath%20d%3D%22M53%2C28.53l1.62%2C3L32.52%2C43.43a1.59%2C1.59%2C0%2C0%2C1-.8.21%2C1.66%2C1.66%2C0%2C0%2C1-.81-.21L8.8%2C31.53l1.61-3L31.72%2C40Z%22%2F%3E%20%3Cpath%20d%3D%22M53%2C38.74l1.62%2C3L32.52%2C53.64a1.69%2C1.69%2C0%2C0%2C1-.8.2%2C1.76%2C1.76%2C0%2C0%2C1-.81-.2L8.8%2C41.73l1.61-3L31.72%2C50.21Z%22%2F%3E%3C%2Fsvg%3E\"","/*\n * Copyright 2017-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { get, has } from \"lodash\";\nimport KeyboardUtils from \"../common-canvas/keyboard-utils.js\";\nimport PaletteContentListItemBtn from \"./palette-content-list-item-btn.jsx\";\nimport Icon from \"../icons/icon.jsx\";\nimport SVG from \"react-inlinesvg\";\nimport { CANVAS_CARBON_ICONS, DND_DATA_TEXT, TIP_TYPE_PALETTE_ITEM,\n\tUSE_DEFAULT_ICON, USE_DEFAULT_EXT_ICON }\n\tfrom \"../common-canvas/constants/canvas-constants.js\";\n\nimport SUPERNODE_ICON from \"../../assets/images/supernode.svg\";\nimport SUPERNODE_EXT_ICON from \"../../assets/images/supernode_ext.svg\";\n\nclass PaletteContentListItem extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t\tshowFullDescription: false\n\t\t};\n\n\t\tthis.ghostData = null;\n\n\t\tthis.showFullDescription = this.showFullDescription.bind(this);\n\t\tthis.showShortDescription = this.showShortDescription.bind(this);\n\n\t\tthis.onDragStart = this.onDragStart.bind(this);\n\t\tthis.onDragEnd = this.onDragEnd.bind(this);\n\t\tthis.onClick = this.onClick.bind(this);\n\t\tthis.onDoubleClick = this.onDoubleClick.bind(this);\n\t\tthis.onMouseOver = this.onMouseOver.bind(this);\n\t\tthis.onMouseLeave = this.onMouseLeave.bind(this);\n\t\tthis.onMouseDown = this.onMouseDown.bind(this);\n\t\tthis.onKeyDown = this.onKeyDown.bind(this);\n\t}\n\n\tonMouseDown() {\n\t\t// Make sure the tip doesn't appear when starting to drag a node.\n\t\tthis.props.canvasController.closeTip();\n\n\t\t// Sets the focus index on the parent palette-content-list so\n\t\t// future key presses that move focus will work correctly.\n\t\tif (this.props.setFocusIndex) {\n\t\t\tthis.props.setFocusIndex();\n\t\t}\n\n\t\t// Prepare the ghost image on mouse down because asynchronous loading of\n\t\t// SVG files will be too slow if this is done in onDragStart.\n\t\tthis.ghostData = this.props.canvasController.getGhostNode(this.props.nodeTypeInfo.nodeType);\n\t}\n\n\tonDragStart(ev) {\n\t\tthis.props.canvasController.closeTip();\n\n\t\t// We cannot use the dataTransfer object for the nodeTemplate because\n\t\t// the dataTransfer data is not available during dragOver events so we set\n\t\t// the nodeTemplate into the canvas controller.\n\t\tthis.props.canvasController.nodeTemplateDragStart(this.ghostData.nodeTemplate);\n\n\t\t// On firefox, the drag will not start unless something is written to\n\t\t// the dataTransfer object so just write an empty string\n\t\tev.dataTransfer.setData(DND_DATA_TEXT, \"\");\n\n\t\tif (this.ghostData) {\n\t\t\tev.dataTransfer.setDragImage(this.ghostData.element, this.ghostData.centerX, this.ghostData.centerY);\n\t\t}\n\t}\n\n\tonKeyDown(evt) {\n\t\tif (KeyboardUtils.createAutoNode(evt)) {\n\t\t\tthis.createAutoNode(true);\n\t\t\tevt.stopPropagation(); // Stop key event propagating and closing the category.\n\n\t\t} else if (KeyboardUtils.createAutoNodeNoLink(evt)) {\n\t\t\tthis.createAutoNode(false); // false indicates no links are required\n\n\t\t} else if (KeyboardUtils.nextNodeInCategory(evt) && this.props.nextNodeInCategory) {\n\t\t\tthis.props.nextNodeInCategory(evt);\n\n\t\t} else if (KeyboardUtils.previousNodeInCategory(evt) && this.props.previousNodeInCategory) {\n\t\t\tthis.props.previousNodeInCategory(evt);\n\n\t\t} else if (KeyboardUtils.tabFocusOutOfPalette(evt) && this.props.tabOut) {\n\t\t\tthis.props.tabOut(evt);\n\t\t}\n\t}\n\n\t// This is needed in-case the drag ends somewhere other than the canvas area.\n\tonDragEnd() {\n\t\tthis.props.canvasController.nodeTemplateDragEnd();\n\t}\n\n\tonDoubleClick() {\n\t\tif (!this.props.allowClickToAdd) {\n\t\t\tthis.createAutoNode(true);\n\t\t}\n\t}\n\n\tonClick(evt) {\n\t\tif (this.props.allowClickToAdd) {\n\t\t\tthis.createAutoNode(true);\n\t\t}\n\t\t// Prevent click going to toolbar when palette is embedded in a node.\n\t\tevt.stopPropagation();\n\t}\n\n\tonMouseOver(evt) {\n\t\tif (!this.props.isDisplaySearchResult && evt.buttons === 0) {\n\t\t\tthis.displayTip();\n\t\t}\n\t}\n\n\tonMouseLeave() {\n\t\tthis.props.canvasController.closeTip();\n\t}\n\n\tgetHighlightedCategoryLabel() {\n\t\treturn this.getHighlightedText(\n\t\t\tthis.props.nodeTypeInfo.category.label,\n\t\t\tthis.props.nodeTypeInfo.occurrenceInfo.catLabelOccurrences);\n\t}\n\n\tgetHighlightedLabel(labelText) {\n\t\treturn this.getHighlightedText(\n\t\t\tlabelText,\n\t\t\tthis.props.nodeTypeInfo.occurrenceInfo.nodeLabelOccurrences);\n\t}\n\n\tgetHighlightedDesc() {\n\t\tconst DISPLAY_LEN = 150; // Max number of characters for a description.\n\t\tlet desc = this.props.nodeTypeInfo.nodeType.app_data.ui_data.description;\n\t\tlet nodeDescOccurrences = this.props.nodeTypeInfo.occurrenceInfo.nodeDescOccurrences;\n\t\tlet isLongDescription = false;\n\n\t\tif (desc.length > DISPLAY_LEN) {\n\t\t\tisLongDescription = true;\n\t\t\tif (!this.state.showFullDescription) {\n\t\t\t\tconst { abbrDesc, occurrences } = this.getAbbreviatedDescription(desc, nodeDescOccurrences, DISPLAY_LEN);\n\t\t\t\tdesc = abbrDesc;\n\t\t\t\tnodeDescOccurrences = occurrences;\n\t\t\t}\n\t\t}\n\n\t\tconst elements = this.getHighlightedText(desc, nodeDescOccurrences);\n\n\t\t// If it's a long description, we need to add either the 'Show more' or\n\t\t// 'Show less' button depending on whether the full description is shown or not.\n\t\tif (isLongDescription) {\n\t\t\tif (this.state.showFullDescription) {\n\t\t\t\telements.push(\n\t\t\t\t\t<PaletteContentListItemBtn id={\"palette.flyout.search.less\"} onClick={this.showShortDescription} />\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telements.push(\n\t\t\t\t\t<PaletteContentListItemBtn id={\"palette.flyout.search.more\"} onClick={this.showFullDescription} />\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn elements;\n\t}\n\n\t// Returns an abbreviated description, constrained to the displayLen passed in,\n\t// based on the full description passed in. The function makes sure the first\n\t// occurrence of text to be highlighted is displayed with the abbreviated\n\t// text. There are three possibilities:\n\t// 1. The first occurrence is within the first displayLen number of characters\n\t// meaning we end the abbreviated text with \" ...\"\n\t// 2. The first occurrence is somewhere in the middle of the text in which\n\t// the abbreviated description is prefixed with \"... \" and suffixed with \" ...\"\n\t// 3. The first occurrence is within displayLen number of characters of the end\n\t// of the description in which case we prefix the description with \"... \"\n\t// This function also adjusts the occurrences of highlighted text in the\n\t// description to account for any text that has been removed from the\n\t// beginning of the description.\n\tgetAbbreviatedDescription(desc, nodeDescOccurrences, displayLen) {\n\t\t// Not all descriptions will have occurrences. If not, just abbreviate and return.\n\t\tif (nodeDescOccurrences.length === 0) {\n\t\t\tconst abbr = desc.substring(0, displayLen) + \" ...\";\n\t\t\treturn { abbrDesc: abbr, occurrences: nodeDescOccurrences };\n\t\t}\n\n\t\tconst firstOccurrenceStart = nodeDescOccurrences[0].start;\n\t\tconst remainder = desc.length - firstOccurrenceStart;\n\t\tlet abbrDesc = \"\";\n\t\tlet offset = 0;\n\n\t\tif (firstOccurrenceStart < displayLen) {\n\t\t\toffset = 0;\n\t\t\tabbrDesc = desc.substring(offset, displayLen) + \" ...\";\n\n\t\t} else if (remainder > displayLen) {\n\t\t\toffset = firstOccurrenceStart;\n\t\t\tabbrDesc = \"... \" + desc.substring(offset, firstOccurrenceStart + displayLen) + \" ...\";\n\t\t\toffset -= 4; // Subtract 4 for the \"... \" string\n\n\t\t} else {\n\t\t\toffset = desc.length - displayLen;\n\t\t\tabbrDesc = \"... \" + desc.substring(offset, desc.length);\n\t\t\toffset -= 4; // Subtract 4 for the \"... \" string\n\t\t}\n\n\t\tconst occurrences = nodeDescOccurrences.map((occ) => ({ start: occ.start - offset, end: occ.end - offset }));\n\n\t\treturn { abbrDesc, occurrences };\n\t}\n\n\t// Returns an array of highlighted and non-highlighted text based on the\n\t// textToHighlight passed in and the occurrences array which contains elements\n\t// that indicate where text should be highlighted.\n\tgetHighlightedText(textToHighlight, occurrences) {\n\t\tif (!occurrences || occurrences.length === 0) {\n\t\t\treturn [<span key=\"o\">{textToHighlight}</span>];\n\t\t}\n\n\t\tconst highlightedElements = [];\n\t\tlet index = 0;\n\t\tlet text = \"\";\n\t\toccurrences.forEach((occ, i) => {\n\t\t\ttext = textToHighlight.substring(index, occ.start);\n\t\t\thighlightedElements.push(<span key={\"s\" + i}>{text}</span>);\n\n\t\t\ttext = textToHighlight.substring(occ.start, occ.end);\n\t\t\thighlightedElements.push(<mark key={\"m\" + i}>{text}</mark>);\n\n\t\t\tindex = occ.end;\n\n\t\t\tif (i === occurrences.length - 1 &&\n\t\t\t\t\tocc.end < textToHighlight.length) {\n\t\t\t\ttext = textToHighlight.substring(occ.end);\n\t\t\t\thighlightedElements.push(<span key={\"f\" + i}>{text}</span>);\n\t\t\t}\n\t\t});\n\n\t\treturn highlightedElements;\n\t}\n\n\t// Returns the class to be applied to the main div for this palette\n\t// item depending on whether we are displaying search results (or not)\n\t// and if there is a special palette class specified (or not).\n\tgetMainDivClass() {\n\t\tconst paletteClass = this.props.nodeTypeInfo?.nodeType?.app_data?.ui_data?.palette_class_name;\n\n\t\tlet mainDivClass = this.props.isDisplaySearchResult\n\t\t\t? \"palette-list-item search-result\"\n\t\t\t: \"palette-list-item\";\n\n\t\tmainDivClass += (paletteClass ? \" \" + paletteClass : \"\");\n\n\t\tmainDivClass += !this.props.isPaletteWide ? \" palette-narrow\" : \"\";\n\n\t\treturn mainDivClass;\n\t}\n\n\tshowFullDescription() {\n\t\tthis.setState({ showFullDescription: true });\n\t}\n\n\tshowShortDescription() {\n\t\tthis.setState({ showFullDescription: false });\n\t}\n\n\t// Sets the focus on this palette (node) item and displays\n\t// a tooltip. This is called by the parent palette-content-list\n\t// when the user moves focus to a new node using the keyboard, so\n\t// we always show a tip for the keyboard user.\n\tfocus() {\n\t\tthis.itemRef.current.focus();\n\t\tthis.displayTip();\n\t}\n\n\t// Display a tip for this palette (node) item.\n\tdisplayTip() {\n\t\tthis.props.canvasController.closeTip();\n\n\t\tconst nodeTemplate = this.props.nodeTypeInfo.category.empty_text\n\t\t\t? { app_data: { ui_data: { label: this.props.nodeTypeInfo.category.empty_text } } }\n\t\t\t: this.props.nodeTypeInfo.nodeType;\n\n\t\tthis.props.canvasController.openTip({\n\t\t\tid: \"paletteTip_\" + this.props.nodeTypeInfo.nodeType.op,\n\t\t\ttype: TIP_TYPE_PALETTE_ITEM,\n\t\t\ttargetObj: this.itemRef.current,\n\t\t\tnodeTemplate: nodeTemplate,\n\t\t\tcategory: this.props.nodeTypeInfo.category\n\t\t});\n\t}\n\n\t// Returns true if this item is disabled and should not be draggable or double-clicked\n\t// from the palette.\n\tisItemDisabled() {\n\t\tconst disabled = this.props.nodeTypeInfo.nodeType?.app_data?.ui_data?.palette_disabled;\n\t\treturn !this.props.isEditingEnabled || disabled;\n\t}\n\n\t// Converts the palette node from its pipeline flow format to the internal API\n\t// format and calls canvas controller to automatically add the node to the\n\t// canvas. If addLink is true a link will be added between to the new node\n\t// from the adjacent node.\n\tcreateAutoNode(addLink) {\n\t\tif (this.props.createAutoNode && !this.isItemDisabled()) {\n\t\t\tthis.props.createAutoNode(this.props.nodeTypeInfo.nodeType, addLink);\n\t\t}\n\t}\n\n\trender() {\n\t\tlet itemText = null;\n\t\tlet labelText = get(this.props, \"nodeTypeInfo.nodeType.app_data.ui_data.label\", \"\");\n\t\tlet draggable = this.isItemDisabled() ? \"false\" : \"true\";\n\t\tlet icon = null;\n\t\tconst ariaDisabled = this.isItemDisabled();\n\n\t\tif (has(this.props.nodeTypeInfo.nodeType, \"app_data.ui_data.image\")) {\n\t\t\tlet image = this.props.nodeTypeInfo.nodeType.app_data.ui_data.palette_image\n\t\t\t\t? this.props.nodeTypeInfo.nodeType.app_data.ui_data.palette_image\n\t\t\t\t: this.props.nodeTypeInfo.nodeType.app_data.ui_data.image;\n\n\t\t\tif (image === USE_DEFAULT_ICON) {\n\t\t\t\timage = SUPERNODE_ICON;\n\t\t\t} else if (image === USE_DEFAULT_EXT_ICON) {\n\t\t\t\timage = SUPERNODE_EXT_ICON;\n\t\t\t}\n\n\t\t\tif (typeof image === \"object\" && React.isValidElement(image)) {\n\t\t\t\ticon = image;\n\t\t\t} else if (typeof image === \"string\") {\n\t\t\t\ticon = image.endsWith(\".svg\")\n\t\t\t\t\t? <SVG src={image} className=\"palette-list-item-icon\" draggable=\"false\" aria-hidden=\"true\" />\n\t\t\t\t\t: <img src={image} className=\"palette-list-item-icon\" draggable=\"false\" alt={\"\"} />;\n\t\t\t}\n\t\t}\n\n\t\tif (labelText) {\n\t\t\tif (this.props.isPaletteWide || !icon) {\n\t\t\t\titemText = this.props.isDisplaySearchResult\n\t\t\t\t\t? this.getHighlightedLabel(labelText)\n\t\t\t\t\t: (<span>{labelText}</span>);\n\n\t\t\t// For the narrow palette, we 'display' a label with zero font-size\n\t\t\t// so the screen reader will read the label but it will not be visible.\n\t\t\t} else if (!this.props.isPaletteWide) {\n\t\t\t\titemText = (<span>{labelText}</span>);\n\t\t\t}\n\t\t}\n\n\t\tconst ranking = this.props.isShowRanking && this.props.isDisplaySearchResult && has(this.props.nodeTypeInfo, \"occurrenceInfo.ranking\")\n\t\t\t? (<span>{this.props.nodeTypeInfo.occurrenceInfo.ranking}</span>)\n\t\t\t: null;\n\n\t\t// Special case for when there are no nodes in the category so we show\n\t\t// a dummy node to include the empty text from the category.\n\t\tif (this.props.nodeTypeInfo.category.node_types.length === 0 && this.props.nodeTypeInfo.category.empty_text) {\n\t\t\tlabelText = this.props.nodeTypeInfo.category.empty_text;\n\t\t\tif (this.props.isPaletteWide) {\n\t\t\t\titemText = (<span>{labelText}</span>);\n\t\t\t}\n\t\t\tdraggable = \"false\";\n\t\t\ticon = (<Icon type={CANVAS_CARBON_ICONS.WARNING_UNFILLED} className=\"palette-list-item-icon-warning\" draggable=\"false\" />);\n\t\t}\n\n\t\tconst mainDivClass = this.getMainDivClass();\n\n\t\tconst categoryLabel = this.props.isDisplaySearchResult\n\t\t\t? (<div className={\"palette-list-item-category-label\"}>{this.getHighlightedCategoryLabel()}</div>)\n\t\t\t: null;\n\n\t\tconst description = this.props.isDisplaySearchResult &&\n\t\t\t\tthis.props?.nodeTypeInfo?.nodeType?.app_data?.ui_data?.description\n\t\t\t? (<div className={\"palette-list-item-description\"}>{this.getHighlightedDesc()}</div>)\n\t\t\t: null;\n\n\t\tconst nodeLabel = itemText\n\t\t\t? <div className=\"palette-list-item-text-div\">{itemText}</div>\n\t\t\t: null;\n\n\t\tthis.itemRef = React.createRef();\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={this.itemRef}\n\t\t\t\tdata-id={this.props.nodeTypeInfo.nodeType.op}\n\t\t\t\ttabIndex={this.props.tabIndex}\n\t\t\t\trole={\"button\"}\n\t\t\t\taria-disabled={ariaDisabled}\n\t\t\t\tdraggable={draggable}\n\t\t\t\tclassName={mainDivClass}\n\t\t\t\tonMouseOver={this.onMouseOver}\n\t\t\t\tonMouseLeave={this.onMouseLeave}\n\t\t\t\tonKeyDown={this.props.isEditingEnabled ? this.onKeyDown : null}\n\t\t\t\tonMouseDown={this.props.isEditingEnabled ? this.onMouseDown : null}\n\t\t\t\tonDragStart={this.props.isEditingEnabled ? this.onDragStart : null}\n\t\t\t\tonDragEnd={this.props.isEditingEnabled ? this.onDragEnd : null}\n\t\t\t\tonClick={this.props.isEditingEnabled ? this.onClick : null}\n\t\t\t\tonDoubleClick={this.props.isEditingEnabled ? this.onDoubleClick : null}\n\t\t\t>\n\t\t\t\t{categoryLabel}\n\t\t\t\t<div className=\"palette-list-item-icon-and-text\">\n\t\t\t\t\t{icon}\n\t\t\t\t\t{nodeLabel}\n\t\t\t\t\t{ranking}\n\t\t\t\t</div>\n\t\t\t\t{description}\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nPaletteContentListItem.propTypes = {\n\tnodeTypeInfo: PropTypes.object.isRequired,\n\tisDisplaySearchResult: PropTypes.bool.isRequired,\n\tcanvasController: PropTypes.object.isRequired,\n\ttabIndex: PropTypes.number.isRequired,\n\tnextNodeInCategory: PropTypes.func,\n\tpreviousNodeInCategory: PropTypes.func,\n\tsetFocusIndex: PropTypes.func,\n\tallowClickToAdd: PropTypes.bool,\n\tisEditingEnabled: PropTypes.bool.isRequired,\n\tisPaletteWide: PropTypes.bool,\n\tisShowRanking: PropTypes.bool,\n\tcreateAutoNode: PropTypes.func,\n\ttabOut: PropTypes.func\n};\n\nexport default PaletteContentListItem;\n","/*\n * Copyright 2017-2023 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport PaletteContentListItem from \"./palette-content-list-item.jsx\";\nimport CanvasUtils from \"../common-canvas/common-canvas-utils.js\";\n\nclass PaletteContentList extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.currentFocusIndex = 0;\n\t\tthis.contentItemRefs = [];\n\n\t\tthis.nextNodeInCategory = this.nextNodeInCategory.bind(this);\n\t\tthis.previousNodeInCategory = this.previousNodeInCategory.bind(this);\n\t}\n\n\t// Sets focus on the fist node in the list. This is called using a ref\n\t// from the parent category.\n\tsetFirstNode() {\n\t\tthis.currentFocusIndex = 0;\n\t\tthis.contentItemRefs[this.currentFocusIndex].current.focus();\n\t}\n\n\tsetFocusIndex(idx) {\n\t\tthis.currentFocusIndex = idx;\n\t}\n\n\tnextNodeInCategory(evt) {\n\t\tthis.currentFocusIndex++;\n\t\tif (this.currentFocusIndex > this.contentItemRefs.length - 1) {\n\t\t\tthis.currentFocusIndex = 0;\n\t\t}\n\t\tthis.contentItemRefs[this.currentFocusIndex].current.focus();\n\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t}\n\n\tpreviousNodeInCategory(evt) {\n\t\tthis.currentFocusIndex--;\n\t\tif (this.currentFocusIndex < 0) {\n\t\t\tthis.currentFocusIndex = this.contentItemRefs.length - 1;\n\t\t}\n\t\tthis.contentItemRefs[this.currentFocusIndex].current.focus();\n\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t}\n\n\trender() {\n\t\tconst contentItems = [];\n\t\tthis.contentItemRefs = [];\n\n\t\tif (this.props.category && this.props.category.node_types &&\n\t\t\t\tthis.props.category.node_types.length === 0 && this.props.category.empty_text) {\n\t\t\tcontentItems.push(\n\t\t\t\t<div key={\"item_empty\"}>\n\t\t\t\t\t<PaletteContentListItem\n\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\tnodeTypeInfo={{ nodeType: {}, category: this.props.category }}\n\t\t\t\t\t\tisDisplaySearchResult={false}\n\t\t\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\t\t\tallowClickToAdd={this.props.allowClickToAdd}\n\t\t\t\t\t\tisPaletteWide={this.props.isPaletteWide}\n\t\t\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t} else {\n\t\t\tfor (var idx = 0; idx < this.props.nodeTypeInfos.length; idx++) {\n\t\t\t\tvar itemKey = \"item_\" + idx;\n\n\t\t\t\tconst ref = React.createRef();\n\t\t\t\tthis.contentItemRefs.push(ref);\n\n\t\t\t\tcontentItems.push(\n\t\t\t\t\t<PaletteContentListItem\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tkey={itemKey}\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\tnodeTypeInfo={this.props.nodeTypeInfos[idx]}\n\t\t\t\t\t\tisDisplaySearchResult={false}\n\t\t\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\t\t\tisPaletteWide={this.props.isPaletteWide}\n\t\t\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t\t\t\tnextNodeInCategory={this.nextNodeInCategory}\n\t\t\t\t\t\tpreviousNodeInCategory={this.previousNodeInCategory}\n\t\t\t\t\t\tsetFocusIndex={this.setFocusIndex.bind(this, idx)}\n\t\t\t\t\t\tallowClickToAdd={this.props.allowClickToAdd}\n\t\t\t\t\t\tcreateAutoNode={this.props.createAutoNode}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn (\n\t\t\t<div width=\"100%\" draggable=\"false\" className=\"palette-content-list palette-scroll\">\n\t\t\t\t{contentItems}\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nPaletteContentList.propTypes = {\n\tcategory: PropTypes.object.isRequired,\n\tnodeTypeInfos: PropTypes.array.isRequired,\n\tcanvasController: PropTypes.object.isRequired,\n\tisPaletteWide: PropTypes.bool,\n\tisEditingEnabled: PropTypes.bool.isRequired,\n\tallowClickToAdd: PropTypes.bool,\n\tcreateAutoNode: PropTypes.func\n};\n\nexport default PaletteContentList;\n","/*\n * Copyright 2017-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { AccordionItem, InlineLoading } from \"@carbon/react\";\nimport { get } from \"lodash\";\nimport SVG from \"react-inlinesvg\";\nimport { TIP_TYPE_PALETTE_CATEGORY } from \"../common-canvas/constants/canvas-constants.js\";\nimport CanvasUtils from \"../common-canvas/common-canvas-utils.js\";\nimport KeyboardUtils from \"../common-canvas/keyboard-utils.js\";\nimport PaletteContentList from \"./palette-content-list.jsx\";\n\nclass PaletteFlyoutContentCategory extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.onMouseOver = this.onMouseOver.bind(this);\n\t\tthis.onMouseLeave = this.onMouseLeave.bind(this);\n\t\tthis.onFocus = this.onFocus.bind(this);\n\t\tthis.onKeyDownCategory = this.onKeyDownCategory.bind(this);\n\t\tthis.onHeadingClick = this.onHeadingClick.bind(this);\n\t\tthis.getTitleObj = this.getTitleObj.bind(this);\n\t}\n\n\tonMouseOver(evt) {\n\t\tthis.displayTip(evt);\n\t}\n\n\tonMouseLeave() {\n\t\tthis.props.canvasController.closeTip();\n\t}\n\n\tonFocus(evt) {\n\t\tthis.displayTip(evt);\n\t}\n\n\tonKeyDownCategory(evt) {\n\t\tif (KeyboardUtils.openCategory(evt)) {\n\t\t\tthis.onHeadingClick();\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\n\t\t} else if (this.props.category.is_open &&\n\t\t\t\t\tKeyboardUtils.fromCategoryToFirstNode(evt)) {\n\t\t\tthis.pclRef.current.setFirstNode();\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\n\t\t} else if (KeyboardUtils.tabFocusOutOfPalette(evt) &&\n\t\t\t\t\tthis.props.tabOut) {\n\t\t\tthis.props.tabOut(evt);\n\t\t}\n\t}\n\n\t// Handles a click on the category heading area. This is called from the Accordion\n\t// Item when:\n\t// * the user clicks on a header AND\n\t// * when the user presses the appropriate keyboard shortcut\n\t// Additionally, it's called from onKeyDownCategory when the user presses space\n\t// or return.\n\tonHeadingClick() {\n\t\tif (this.props.category.is_open) {\n\t\t\tthis.props.canvasController.closePaletteCategory(this.props.category.id);\n\t\t} else {\n\t\t\tthis.props.canvasController.openPaletteCategory(this.props.category.id);\n\t\t}\n\t}\n\n\tgetInlineLoadingRenderCategory() {\n\t\t// TODO - This loading functionality should be replaced with a skeleton\n\t\t// graphic to indicate the category is loading instead of using the\n\t\t// InlineLoading component.\n\n\t\tlet description = \"\";\n\t\tif (this.props.isPaletteWide) {\n\t\t\tdescription = this.props.category.loading_text;\n\t\t}\n\n\t\t// We do not specify an iconDescription below because doing so overrides\n\t\t// the icon label which causes a problem with the accessibility checker.\n\t\tconst titleLoadingObj = (\n\t\t\t<div className=\"palette-flyout-category\">\n\t\t\t\t<div className=\"palette-flyout-category-item-loading\">\n\t\t\t\t\t<InlineLoading\n\t\t\t\t\t\tdescription={ description }\n\t\t\t\t\t\tonSuccess={function noRefCheck() {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tstatus=\"active\"\n\t\t\t\t\t\tsuccessDelay={1500}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\n\t\tconst content = (\n\t\t\t<AccordionItem className=\"palette-loading-category\" title={titleLoadingObj} />\n\t\t);\n\t\treturn content;\n\t}\n\n\t// Returns the category object for a regular category.\n\tgetRenderCategory() {\n\t\tconst titleObj = this.getTitleObj();\n\t\tconst content = this.getContent();\n\t\treturn (\n\t\t\t<AccordionItem\n\t\t\t\ttitle={titleObj}\n\t\t\t\topen={this.props.category.is_open}\n\t\t\t\tonKeyDown={this.onKeyDownCategory}\n\t\t\t\tonFocus={this.onFocus}\n\t\t\t\tonHeadingClick={this.onHeadingClick}\n\t\t\t>\n\t\t\t\t{content}\n\t\t\t</AccordionItem>\n\t\t);\n\t}\n\n\t// Returns the title object for the category consisting of the image and text.\n\tgetTitleObj() {\n\t\tconst itemImage = this.getItemImage();\n\t\tconst itemText = this.getItemText();\n\t\tthis.catRef = React.createRef();\n\n\t\treturn (\n\t\t\t<div className=\"palette-flyout-category\"\n\t\t\t\tref={this.catRef}\n\t\t\t\tdata-id={get(this.props.category, \"id\", \"\")}\n\t\t\t\tvalue={this.props.category.label}\n\t\t\t\tonMouseOver={this.onMouseOver}\n\t\t\t\tonMouseLeave={this.onMouseLeave}\n\t\t\t>\n\t\t\t\t<div className=\"palette-flyout-category-item\" tabIndex={-1}>\n\t\t\t\t\t{itemImage}\n\t\t\t\t\t{itemText}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Returns a <span> for displaying the category label.\n\tgetItemText() {\n\t\tlet itemText = null;\n\n\t\tif (this.props.isPaletteWide) {\n\t\t\tconst className = this.props.category.image ? \"palette-flyout-category-text\" : \"palette-flyout-category-text-no-image\";\n\t\t\titemText = (\n\t\t\t\t<span className={className}>\n\t\t\t\t\t{this.props.category.label}\n\t\t\t\t</span>\n\t\t\t);\n\n\t\t// With narrow palette, if there's no image just display first 3 letters\n\t\t} else if (!this.props.category.image &&\n\t\t\t\t\tthis.props.category.label &&\n\t\t\t\t\tthis.props.category.label.length > 0) {\n\t\t\titemText = (\n\t\t\t\t<span className=\"palette-flyout-category-text-abbr\">\n\t\t\t\t\t{this.props.category.label.substr(0, 3)}\n\t\t\t\t</span>\n\t\t\t);\n\n\t\t// For a narrow palette we 'display' a label with zero font size\n\t\t// so the screen reader will read it out but it won't be visible.\n\t\t} else {\n\t\t\titemText = (\n\t\t\t\t<span className=\"palette-flyout-category-text-zero-size\" >\n\t\t\t\t\t{this.props.category.label}\n\t\t\t\t</span>\n\t\t\t);\n\t\t}\n\t\treturn itemText;\n\t}\n\n\t// Returns the image for the category\n\tgetItemImage() {\n\t\tlet itemImage = null;\n\t\tif (this.props.category.image && this.props.category.image !== \"\") {\n\t\t\tif (typeof this.props.category.image === \"object\" && React.isValidElement(this.props.category.image)) {\n\t\t\t\titemImage = this.props.category.image;\n\n\t\t\t} else if (this.props.category.image.endsWith(\".svg\")) {\n\t\t\t\titemImage = (\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<SVG src={this.props.category.image} className=\"palette-flyout-category-item-icon\" draggable=\"false\" aria-hidden=\"true\" />\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\titemImage = (\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<img src={this.props.category.image} className=\"palette-flyout-category-item-icon\" draggable=\"false\" alt={this.props.category.label} />\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn itemImage;\n\t}\n\n\t// Returns the content object for the AccordionItem. This is only set to\n\t// something if the category is open (that is: this.props.category.is_open\n\t// is true). We remove the nodes from the DOM, when the category\n\t// is closed, because this helps inline SVG icons on the canvas, that\n\t// reference elements in the <defs> element, to appear correctly.\n\tgetContent() {\n\t\tif (this.props.category.is_open) {\n\t\t\tconst nodeTypeInfos = this.props.category.node_types.map((nt) => ({ nodeType: nt, category: this.props.category }));\n\t\t\tthis.pclRef = React.createRef();\n\t\t\treturn (\n\t\t\t\t<PaletteContentList\n\t\t\t\t\tref={this.pclRef}\n\t\t\t\t\tkey={this.props.category.id + \"-nodes\"}\n\t\t\t\t\tcategory={this.props.category}\n\t\t\t\t\tnodeTypeInfos={nodeTypeInfos}\n\t\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\t\tallowClickToAdd={this.props.allowClickToAdd}\n\t\t\t\t\tisPaletteWide={this.props.isPaletteWide}\n\t\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t\t\tcreateAutoNode={this.props.createAutoNode}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\t\treturn null;\n\t}\n\n\tdisplayTip() {\n\t\tthis.props.canvasController.closeTip();\n\t\tthis.props.canvasController.openTip({\n\t\t\tid: \"paletteTip_\" + this.props.category.id,\n\t\t\ttype: TIP_TYPE_PALETTE_CATEGORY,\n\t\t\ttargetObj: this.catRef.current,\n\t\t\tcategory: this.props.category\n\t\t});\n\n\t}\n\n\trender() {\n\t\treturn this.props.category.loading_text\n\t\t\t? this.getInlineLoadingRenderCategory()\n\t\t\t: this.getRenderCategory();\n\t}\n}\n\nPaletteFlyoutContentCategory.propTypes = {\n\tcategory: PropTypes.object.isRequired,\n\tcanvasController: PropTypes.object.isRequired,\n\tallowClickToAdd: PropTypes.bool,\n\tisPaletteWide: PropTypes.bool,\n\tisEditingEnabled: PropTypes.bool.isRequired,\n\tcreateAutoNode: PropTypes.func,\n\ttabOut: PropTypes.func\n};\n\nexport default PaletteFlyoutContentCategory;\n","/*\n * Copyright 2017-2023 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport { injectIntl } from \"react-intl\";\nimport PropTypes from \"prop-types\";\nimport defaultMessages from \"../../locales/palette/locales/en.json\";\nimport { Search } from \"@carbon/react\";\n\nclass PaletteFlyoutContentSearch extends React.Component {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.state = {\n\t\t\tsearchString: \"\"\n\t\t};\n\t\tthis.searchOnClick = this.searchOnClick.bind(this);\n\t\tthis.handleSearchStringChange = this.handleSearchStringChange.bind(this);\n\t}\n\n\thandleSearchStringChange(evt) {\n\t\tconst value = evt.target.value || \"\";\n\t\tthis.setState({ searchString: value },\n\t\t\t() => this.props.handleSearchStringChange(value)\n\t\t);\n\t}\n\n\tsearchOnClick() {\n\t\tif (!this.props.isPaletteWide) {\n\t\t\tthis.props.canvasController.openPalette();\n\t\t}\n\t}\n\n\trender() {\n\t\tconst placeHolder = this.props.intl.formatMessage({ id: \"palette.flyout.search.placeholder\", defaultMessage: defaultMessages[\"palette.flyout.search.placeholder\"] });\n\n\t\treturn (\n\t\t\t// palette-flyout-search id added for hopscotch tours\n\t\t\t<div className=\"palette-flyout-search-container\" id=\"palette-flyout-search\">\n\t\t\t\t<Search\n\t\t\t\t\tclassName=\"palette-flyout-search\"\n\t\t\t\t\tplaceholder={placeHolder}\n\t\t\t\t\tonChange={this.handleSearchStringChange}\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tvalue={this.state.searchString}\n\t\t\t\t\tlabelText={placeHolder}\n\t\t\t\t\tonClick={this.searchOnClick}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nPaletteFlyoutContentSearch.propTypes = {\n\tintl: PropTypes.object.isRequired,\n\thandleSearchStringChange: PropTypes.func.isRequired,\n\tisPaletteWide: PropTypes.bool,\n\tcanvasController: PropTypes.object.isRequired\n};\n\nexport default injectIntl(PaletteFlyoutContentSearch);\n","/*\n * Copyright 2017-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { injectIntl } from \"react-intl\";\nimport KeyboardUtils from \"../common-canvas/keyboard-utils.js\";\nimport defaultMessages from \"../../locales/palette/locales/en.json\";\nimport PaletteContentListItem from \"./palette-content-list-item.jsx\";\n\nclass PaletteFlyoutContentFilteredList extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t};\n\n\t\tthis.onKeyDownResults = this.onKeyDownResults.bind(this);\n\t}\n\n\tonKeyDownResults(evt) {\n\t\tif (KeyboardUtils.tabFocusOutOfPalette(evt)) {\n\t\t\tthis.props.tabOutOfOfPalette(evt);\n\t\t}\n\t}\n\n\tgetNoResultsDiv() {\n\t\tconst noResultsFound = this.props.intl.formatMessage({ id: \"palette.flyout.search.noresults\", defaultMessage: defaultMessages[\"palette.flyout.search.noresults\"] });\n\t\tconst adjustSearch = this.props.intl.formatMessage({ id: \"palette.flyout.search.adjustsearch\", defaultMessage: defaultMessages[\"palette.flyout.search.adjustsearch\"] });\n\t\treturn (\n\t\t\t<div tabIndex={0} onKeyDown={this.onKeyDownResults}>\n\t\t\t\t<div className=\"palette-no-results-title\">{noResultsFound}</div>\n\t\t\t\t<br />\n\t\t\t\t<div className=\"palette-no-results-desc\">{adjustSearch}</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tgetContentListDiv() {\n\t\tconst contentItems = [];\n\n\t\tfor (var idx = 0; idx < this.props.nodeTypeInfos.length; idx++) {\n\t\t\tvar itemKey = \"item_\" + idx;\n\t\t\tconst isLastEntry = idx === this.props.nodeTypeInfos.length - 1;\n\t\t\tconst isShowingAllResults = !this.props.isNodeTypeInfosArrayTruncated;\n\n\t\t\tcontentItems.push(\n\t\t\t\t<div key={itemKey}>\n\t\t\t\t\t<PaletteContentListItem\n\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\tnodeTypeInfo={this.props.nodeTypeInfos[idx]}\n\t\t\t\t\t\tisDisplaySearchResult\n\t\t\t\t\t\tisShowRanking={this.props.isShowRanking}\n\t\t\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\t\t\tisPaletteWide={this.props.isPaletteWide}\n\t\t\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t\t\t\tallowClickToAdd={this.props.allowClickToAdd}\n\t\t\t\t\t\tcreateAutoNode={this.props.createAutoNode}\n\t\t\t\t\t\ttabOut={isLastEntry && isShowingAllResults ? this.props.tabOutOfOfPalette : null}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\tif (this.props.isNodeTypeInfosArrayTruncated) {\n\t\t\tconst resultsRestricted =\n\t\t\t\tthis.props.intl.formatMessage({\n\t\t\t\t\tid: \"palette.flyout.search.resultsrestricted\",\n\t\t\t\t\tdefaultMessage: defaultMessages[\"palette.flyout.search.resultsrestricted\"]\n\t\t\t\t});\n\t\t\tcontentItems.push(\n\t\t\t\t<div key=\"restrict-item\" className=\"palette-flyout-restrict-item\" tabIndex={0} onKeyDown={this.onKeyDownResults}>\n\t\t\t\t\t{resultsRestricted}\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<div width=\"100%\" draggable=\"false\" className=\"palette-scroll\">\n\t\t\t\t{contentItems}\n\t\t\t</div>\n\t\t);\n\t}\n\n\trender() {\n\t\treturn this.props.nodeTypeInfos.length === 0\n\t\t\t? this.getNoResultsDiv()\n\t\t\t: this.getContentListDiv();\n\t}\n}\n\nPaletteFlyoutContentFilteredList.propTypes = {\n\tintl: PropTypes.object.isRequired,\n\tnodeTypeInfos: PropTypes.array.isRequired,\n\tcanvasController: PropTypes.object.isRequired,\n\tallowClickToAdd: PropTypes.bool,\n\tisPaletteWide: PropTypes.bool.isRequired,\n\tisEditingEnabled: PropTypes.bool.isRequired,\n\tisNodeTypeInfosArrayTruncated: PropTypes.bool,\n\tisShowRanking: PropTypes.bool,\n\tcreateAutoNode: PropTypes.func,\n\ttabOutOfOfPalette: PropTypes.func\n};\n\nexport default injectIntl(PaletteFlyoutContentFilteredList);\n","/*\n * Copyright 2017-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { debounce } from \"lodash\";\nimport { getFilteredNodeTypeInfos } from \"./palette-flyout-utils.js\";\nimport PaletteFlyoutContentCategory from \"./palette-flyout-content-category.jsx\";\nimport PaletteFlyoutContentSearch from \"./palette-flyout-content-search.jsx\";\nimport PaletteFlyoutContentFilteredList from \"./palette-flyout-content-filtered-list.jsx\";\nimport Logger from \"../logging/canvas-logger.js\";\nimport { Accordion } from \"@carbon/react\";\n\n\nconst logger = new Logger(\"PaletteFlyoutContent\");\n\nclass PaletteFlyoutContent extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\t// Note: searchString below is a copy of searchString in\n\t\t// palette-flyout-content-search this duplication is necessary to allow\n\t\t// the debounce function to work. When a key is pressed, the searchString in\n\t\t// palette-flyout-content-search is updated causing its text to be rendered.\n\t\t// The handleSearchStringChange() in this class is then called that handles\n\t\t// debounce and after the debounce unwinds it sets searchString in this\n\t\t// class which causes the filtered result set to be calculated and displayed.\n\t\tthis.state = {\n\t\t\tsearchString: \"\"\n\t\t};\n\n\t\tthis.categories = [];\n\n\t\tthis.getUniqueCategories = this.getUniqueCategories.bind(this);\n\t\tthis.setSearchString = this.setSearchString.bind(this);\n\t\tthis.handleSearchStringChange = this.handleSearchStringChange.bind(this);\n\t\tthis.setSearchStringThrottled = debounce(this.setSearchString, 200);\n\t}\n\n\t/*\n\t* Returns a unique set of categories in case category labels\n\t* are duplicated in the categories list.\n\t*/\n\tgetUniqueCategories(categories) {\n\t\tvar out = [];\n\t\tif (categories) {\n\t\t\tfor (const category of categories) {\n\t\t\t\tif (out.indexOf(category.label) === -1) {\n\t\t\t\t\tout.push(category);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\tgetContentDivs(categories) {\n\t\tconst contentDivs = [];\n\t\tfor (let idx = 0; idx < categories.length; idx++) {\n\t\t\tconst category = categories[idx];\n\n\t\t\tcontentDivs.push(\n\t\t\t\t<div key={category.label + \"-container\"}>\n\t\t\t\t\t<PaletteFlyoutContentCategory\n\t\t\t\t\t\tkey={category.id}\n\t\t\t\t\t\tcategory={category}\n\t\t\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\t\t\tallowClickToAdd={this.props.allowClickToAdd}\n\t\t\t\t\t\tisPaletteWide={this.props.isPaletteWide}\n\t\t\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t\t\t\tcreateAutoNode={this.props.createAutoNode}\n\t\t\t\t\t\ttabOut={idx === categories.length - 1 ? this.props.tabOutOfOfPalette : null}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\treturn <Accordion>{contentDivs}</Accordion>;\n\t}\n\n\tgetFilteredContentDivs(categories) {\n\t\tlogger.logStartTimer(\"getFilteredNodeTypeInfos\");\n\t\tlet filteredNodeTypeInfos = getFilteredNodeTypeInfos(this.categories, this.state.searchString);\n\t\tlogger.logEndTimer(\"getFilteredNodeTypeInfos\");\n\n\t\tlet isNodeTypeInfosArrayTruncated = false;\n\n\t\tif (filteredNodeTypeInfos.length > 10) {\n\t\t\tfilteredNodeTypeInfos = filteredNodeTypeInfos.slice(0, 10);\n\t\t\tisNodeTypeInfosArrayTruncated = true;\n\t\t}\n\n\t\tconst content = (\n\t\t\t<PaletteFlyoutContentFilteredList\n\t\t\t\tkey={\"filtered-nodes\"}\n\t\t\t\tnodeTypeInfos={filteredNodeTypeInfos}\n\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\tallowClickToAdd={this.props.allowClickToAdd}\n\t\t\t\tisPaletteWide={this.props.isPaletteWide}\n\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t\t// isShowRanking // Uncomment this to show ranking for debugging ranking algorithm\n\t\t\t\tisNodeTypeInfosArrayTruncated={isNodeTypeInfosArrayTruncated}\n\t\t\t\tcreateAutoNode={this.props.createAutoNode}\n\t\t\t\ttabOutOfOfPalette={this.props.tabOutOfOfPalette}\n\t\t\t/>);\n\n\t\treturn [content];\n\t}\n\n\tsetSearchString() {\n\t\tthis.setState({ searchString: this.ss });\n\t}\n\n\thandleSearchStringChange(s) {\n\t\tthis.ss = s;\n\t\tthis.setSearchStringThrottled();\n\n\t\t// If the user tabs to the search entry area and types some\n\t\t// text, and the palette is not in wide state, open it.\n\t\tif (!this.props.isPaletteWide) {\n\t\t\tthis.props.canvasController.openPalette();\n\t\t}\n\t}\n\n\trender() {\n\t\tthis.categories = this.getUniqueCategories(this.props.paletteJSON.categories);\n\t\tconst contentDivs = this.props.isPaletteWide && this.state.searchString\n\t\t\t? this.getFilteredContentDivs(this.categories)\n\t\t\t: this.getContentDivs(this.categories);\n\n\t\tconst contentCategories = (\n\t\t\t<div className=\"palette-flyout-categories\" tabIndex={\"-1\"}>\n\t\t\t\t{contentDivs}\n\t\t\t</div>\n\t\t);\n\n\t\tconst contentSearch = (\n\t\t\t<PaletteFlyoutContentSearch\n\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\thandleSearchStringChange={this.handleSearchStringChange}\n\t\t\t\tisPaletteWide={this.props.isPaletteWide}\n\t\t\t/>\n\t\t);\n\n\t\tconst paletteHeader = this.props.paletteHeader && !this.state.searchString && this.props.isPaletteWide\n\t\t\t? this.props.paletteHeader\n\t\t\t: null;\n\n\t\tlet className = \"palette-flyout-content\";\n\t\tclassName += paletteHeader ? \" with-palette-header\" : \"\";\n\n\t\treturn (\n\t\t\t<div className={className}>\n\t\t\t\t{contentSearch}\n\t\t\t\t{paletteHeader}\n\t\t\t\t{contentCategories}\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nPaletteFlyoutContent.propTypes = {\n\tcanvasController: PropTypes.object.isRequired,\n\tpaletteJSON: PropTypes.object.isRequired,\n\tpaletteHeader: PropTypes.object,\n\tallowClickToAdd: PropTypes.bool,\n\tisEditingEnabled: PropTypes.bool.isRequired,\n\tisPaletteWide: PropTypes.bool,\n\tcreateAutoNode: PropTypes.func,\n\ttabOutOfOfPalette: PropTypes.func\n};\n\nexport default PaletteFlyoutContent;\n","/*\n * Copyright 2017-2026 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport { injectIntl } from \"react-intl\";\nimport PropTypes from \"prop-types\";\nimport defaultMessages from \"../../locales/palette/locales/en.json\";\nimport PaletteFlyoutContent from \"./palette-flyout-content.jsx\";\n\nclass PaletteFlyout extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.paletteNodes = [];\n\t}\n\n\trender() {\n\t\tlet className = \"palette-flyout-div\";\n\n\t\tif (this.props.isPaletteWide) {\n\t\t\tclassName += \" palette-flyout-div-open\";\n\t\t} else {\n\t\t\tclassName += \" palette-flyout-div-narrow\";\n\t\t}\n\n\t\tconst label = this.props.intl.formatMessage(\n\t\t\t{ id: \"palette.flyout.label\", defaultMessage: defaultMessages[\"palette.flyout.label\"] }\n\t\t);\n\t\treturn (\n\t\t\t<div role=\"region\" aria-label={label} className=\"palette-nav\">\n\t\t\t\t<div className={className}>\n\t\t\t\t\t<PaletteFlyoutContent\n\t\t\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\t\t\tpaletteJSON={this.props.paletteJSON}\n\t\t\t\t\t\tpaletteHeader={this.props.paletteHeader}\n\t\t\t\t\t\tallowClickToAdd={this.props.allowClickToAdd}\n\t\t\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t\t\t\tisPaletteWide={this.props.isPaletteWide}\n\t\t\t\t\t\tcreateAutoNode={this.props.createAutoNode}\n\t\t\t\t\t\ttabOutOfOfPalette={this.props.tabOutOfOfPalette}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nPaletteFlyout.propTypes = {\n\tintl: PropTypes.object.isRequired,\n\tcanvasController: PropTypes.object.isRequired,\n\tpaletteJSON: PropTypes.object.isRequired,\n\tpaletteHeader: PropTypes.object,\n\tallowClickToAdd: PropTypes.bool,\n\tisEditingEnabled: PropTypes.bool.isRequired,\n\tisPaletteWide: PropTypes.bool,\n\tcreateAutoNode: PropTypes.func,\n\ttabOutOfOfPalette: PropTypes.func\n};\n\nexport default injectIntl(PaletteFlyout);\n","/*\n * Copyright 2017-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\n\nimport PaletteFlyout from \"../palette/palette-flyout.jsx\";\nimport Logger from \"../logging/canvas-logger.js\";\n\nimport { PALETTE_LAYOUT_FLYOUT, PALETTE_LAYOUT_NONE }\n\tfrom \"../common-canvas/constants/canvas-constants\";\n\nclass Palette extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.logger = new Logger(\"Palette\");\n\n\t\tthis.createAutoNode = this.createAutoNode.bind(this);\n\t}\n\n\t// Process the createAutoNode action performed on a palette node. This\n\t// might be called if:\n\t// * the node is double-clicked\n\t// * the node is single-clicked with the allowClickToAdd property set to true\n\t// * the user performs a keyboard shortcut to activate the node\n\t// If the caller provided us with a createAutoNode function we call it but\n\t// otherwise we call the canvasController's createAutoNode function.\n\tcreateAutoNode(nodeType, addLink) {\n\t\tconst nodeTemplate = this.props.canvasController.convertNodeTemplate(nodeType);\n\n\t\tif (this.props.createAutoNode) {\n\t\t\tthis.props.createAutoNode(nodeTemplate, addLink);\n\n\t\t} else if (this.props.canvasController.createAutoNode) {\n\t\t\tthis.props.canvasController.createAutoNode(nodeTemplate, addLink);\n\t\t}\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\treturn (\n\t\t\t<PaletteFlyout\n\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\tpaletteJSON={this.props.paletteJSON}\n\t\t\t\tpaletteHeader={this.props.paletteHeader}\n\t\t\t\tallowClickToAdd={this.props.allowClickToAdd}\n\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t\tisPaletteWide={this.props.isPaletteWide}\n\t\t\t\tcreateAutoNode={this.createAutoNode}\n\t\t\t\ttabOutOfOfPalette={this.props.tabOutOfOfPalette}\n\t\t\t/>\n\t\t);\n\t}\n}\n\nPalette.propTypes = {\n\t// Provided by common-canvas\n\tcanvasController: PropTypes.object.isRequired,\n\tcreateAutoNode: PropTypes.func, // Optional callback\n\ttabOutOfOfPalette: PropTypes.func, // Optional callback\n\n\t// Provided by redux\n\tpaletteJSON: PropTypes.object,\n\tpaletteHeader: PropTypes.object,\n\tallowClickToAdd: PropTypes.bool,\n\tisEditingEnabled: PropTypes.bool,\n\tisPaletteWide: PropTypes.bool\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\tpaletteJSON: state.palette.content,\n\tisEditingEnabled: state.canvasconfig.enableEditingActions,\n\tpaletteHeader: state.canvasconfig.enablePaletteHeader,\n\tallowClickToAdd: state.canvasconfig.enableSingleClickAddFromPalette,\n\tisPaletteWide: state.canvasconfig.enablePaletteLayout === PALETTE_LAYOUT_NONE ||\n\t\t(state.canvasconfig.enablePaletteLayout === PALETTE_LAYOUT_FLYOUT &&\n\t\t\tstate.palette.isOpen)\n});\n\nexport default connect(mapStateToProps)(Palette);\n","/*\n * Copyright 2017-2026 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\n\nimport { CloseOutline, Grid, List } from \"@carbon/react/icons\";\n\nimport Toolbar from \"../toolbar\";\n\nclass PaletteDialogTopbar extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t};\n\n\t\tthis.mouseDown = this.mouseDown.bind(this);\n\t\tthis.doubleClick = this.doubleClick.bind(this);\n\t\tthis.toolbarActionHandler = this.toolbarActionHandler.bind(this);\n\t}\n\n\tmouseDown(mouseDownEvent) {\n\t\tthis.props.mouseDownMethod(mouseDownEvent);\n\t}\n\n\tdoubleClick(doubleClickEvent) {\n\t\tthis.props.windowMaximizeMethod(doubleClickEvent);\n\t}\n\n\ttoolbarActionHandler(action) {\n\t\tif (action === \"close\") {\n\t\t\tthis.props.canvasController.closePalette();\n\n\t\t} else if (action === \"grid\") {\n\t\t\tthis.props.showGridMethod(true);\n\n\t\t} else if (action === \"list\") {\n\t\t\tthis.props.showGridMethod(false);\n\t\t}\n\t}\n\n\trender() {\n\t\tconst labelUtil = this.props.canvasController.labelUtil;\n\t\tconst gridLabel = labelUtil.getLabel(\"palette.dialog.grid\");\n\t\tconst listLabel = labelUtil.getLabel(\"palette.dialog.list\");\n\t\tconst closeLabel = labelUtil.getLabel(\"palette.dialog.close\");\n\n\t\tconst config = {\n\t\t\tleftBar: [\n\t\t\t\t{ action: \"grid\", label: gridLabel, iconEnabled: (<Grid />), enable: true, isSelected: this.props.showGrid },\n\t\t\t\t{ action: \"list\", label: listLabel, iconEnabled: (<List />), enable: true, isSelected: !this.props.showGrid },\n\t\t\t\t{ divider: true }\n\t\t\t],\n\t\t\trightBar: [\n\t\t\t\t{ divider: true },\n\t\t\t\t{ action: \"close\", label: closeLabel, iconEnabled: (<CloseOutline />), enable: true }\n\t\t\t]\n\t\t};\n\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName=\"palette-dialog-topbar\"\n\t\t\t\tonMouseDown={this.mouseDown}\n\t\t\t\tonDoubleClick={this.doubleClick}\n\t\t\t>\n\t\t\t\t<Toolbar\n\t\t\t\t\tinstanceId = {0}\n\t\t\t\t\tconfig={config}\n\t\t\t\t\ttoolbarActionHandler={this.toolbarActionHandler}\n\t\t\t\t\tadditionalText={{\n\t\t\t\t\t\toverflowMenuLabel: this.props.canvasController.labelUtil.getLabel(\"toolbar.overflowMenu\"),\n\t\t\t\t\t\tariaLabel: this.props.canvasController.labelUtil?.getLabel(\"toolbar.paletteDialogToolbarLabel\")\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nPaletteDialogTopbar.propTypes = {\n\tshowGridMethod: PropTypes.func.isRequired,\n\twindowMaximizeMethod: PropTypes.func.isRequired,\n\tshowGrid: PropTypes.bool.isRequired,\n\tmouseDownMethod: PropTypes.func.isRequired,\n\tcanvasController: PropTypes.object.isRequired\n};\n\nexport default PaletteDialogTopbar;\n","/*\n * Copyright 2017-2023 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\n\nclass PaletteDialogContentCategory extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t};\n\n\t\tthis.categorySelected = this.categorySelected.bind(this);\n\t}\n\n\n\tcategorySelected(catSelEvent) {\n\t\tthis.props.categorySelectedMethod(catSelEvent);\n\t}\n\n\trender() {\n\t\tvar style = \"palette-dialog-category\";\n\n\t\tif (this.props.selectedCategory === this.props.category.label) {\n\t\t\tstyle = \"palette-dialog-category-selected\";\n\t\t}\n\n\t\treturn (\n\t\t\t<div data-id={this.props.category.id} className={style} onClick={this.categorySelected}>\n\t\t\t\t{this.props.category.label}\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nPaletteDialogContentCategory.propTypes = {\n\tcategory: PropTypes.object.isRequired,\n\tselectedCategory: PropTypes.string.isRequired,\n\tcategorySelectedMethod: PropTypes.func.isRequired\n};\n\nexport default PaletteDialogContentCategory;\n","/*\n * Copyright 2017-2023 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport PaletteDialogContentCategory from \"./palette-dialog-content-category.jsx\";\n\nclass PaletteDialogContentCategories extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t};\n\t}\n\n\trender() {\n\t\tvar catDivs = [];\n\n\t\tfor (var idx = 0; idx < this.props.categories.length; idx++) {\n\t\t\tcatDivs.push(\n\t\t\t\t<PaletteDialogContentCategory\n\t\t\t\t\tkey={this.props.categories[idx].label}\n\t\t\t\t\tcategory={this.props.categories[idx]}\n\t\t\t\t\tselectedCategory={this.props.selectedCategory}\n\t\t\t\t\tcategorySelectedMethod={this.props.categorySelectedMethod}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<div className=\"palette-dialog-categories palette-scroll\">\n\t\t\t\t{catDivs}\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nPaletteDialogContentCategories.propTypes = {\n\tcategories: PropTypes.array.isRequired,\n\tselectedCategory: PropTypes.string.isRequired,\n\tcategorySelectedMethod: PropTypes.func.isRequired\n};\n\nexport default PaletteDialogContentCategories;\n","/*\n * Copyright 2017-2026 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { has } from \"lodash\";\nimport Icon from \"../icons/icon.jsx\";\nimport SVG from \"react-inlinesvg\";\nimport { CANVAS_CARBON_ICONS, DND_DATA_TEXT, TIP_TYPE_PALETTE_ITEM,\n\tUSE_DEFAULT_ICON, USE_DEFAULT_EXT_ICON }\n\tfrom \"../common-canvas/constants/canvas-constants.js\";\n\nimport SUPERNODE_ICON from \"../../assets/images/supernode.svg\";\nimport SUPERNODE_EXT_ICON from \"../../assets/images/supernode_ext.svg\";\n\nclass PaletteDialogContentGridNode extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t};\n\n\t\tthis.ghostData = null;\n\n\t\tthis.onDragStart = this.onDragStart.bind(this);\n\t\tthis.onDragEnd = this.onDragEnd.bind(this);\n\t\tthis.onClick = this.onClick.bind(this);\n\t\tthis.onDoubleClick = this.onDoubleClick.bind(this);\n\t\tthis.onMouseOver = this.onMouseOver.bind(this);\n\t\tthis.onMouseLeave = this.onMouseLeave.bind(this);\n\t\tthis.onMouseDown = this.onMouseDown.bind(this);\n\t}\n\n\tonMouseDown() {\n\t\t// Make sure the tip doesn't appear when starting to drag a node.\n\t\tthis.props.canvasController.closeTip();\n\n\t\t// Prepare the ghost image on mouse down because asynchronous loading of\n\t\t// SVG files will be too slow if this is done in onDragStart.\n\t\tthis.ghostData = this.props.canvasController.getGhostNode(this.props.nodeTemplate);\n\t}\n\n\tonDragStart(ev) {\n\t\t// We cannot use the dataTransfer object for the nodeTemplate because\n\t\t// the dataTransfer data is not available during dragOver events so we set\n\t\t// the nodeTemplate into the canvas controller.\n\t\tthis.props.canvasController.nodeTemplateDragStart(this.ghostData.nodeTemplate);\n\n\t\t// On firefox, the drag will not start unless something is written to\n\t\t// the dataTransfer object so just write an empty string\n\t\tev.dataTransfer.setData(DND_DATA_TEXT, \"\");\n\n\t\tif (this.ghostData) {\n\t\t\tev.dataTransfer.setDragImage(this.ghostData.element, this.ghostData.centerX, this.ghostData.centerY);\n\t\t}\n\t}\n\n\t// This is needed in-case the drag ends somewhere other than the canvas area.\n\tonDragEnd() {\n\t\tthis.props.canvasController.nodeTemplateDragEnd();\n\t}\n\n\tonClick() {\n\t\tif (this.props.allowClickToAdd) {\n\t\t\tthis.createAutoNode();\n\t\t}\n\t}\n\n\tonDoubleClick() {\n\t\tthis.createAutoNode();\n\t}\n\n\tonMouseOver(ev) {\n\t\tif (ev.buttons === 0) {\n\t\t\tconst nodeTemplate = this.props.category.empty_text\n\t\t\t\t? { app_data: { ui_data: { label: this.props.category.empty_text } } }\n\t\t\t\t: this.props.nodeTemplate;\n\n\t\t\tthis.props.canvasController.openTip({\n\t\t\t\tid: \"paletteTip_\" + this.props.nodeTemplate.op,\n\t\t\t\ttype: TIP_TYPE_PALETTE_ITEM,\n\t\t\t\ttargetObj: ev.currentTarget,\n\t\t\t\tnodeTemplate: nodeTemplate,\n\t\t\t\tcategory: this.props.category\n\t\t\t});\n\t\t}\n\t}\n\n\tonMouseLeave() {\n\t\tthis.props.canvasController.closeTip();\n\t}\n\n\tcreateAutoNode() {\n\t\tif (this.props.canvasController.createAutoNode) {\n\t\t\tconst nodeTemplate = this.props.canvasController.convertNodeTemplate(this.props.nodeTemplate);\n\t\t\tthis.props.canvasController.createAutoNode(nodeTemplate);\n\t\t}\n\t}\n\n\trender() {\n\t\tlet label = \"\";\n\t\tif (has(this.props.nodeTemplate, \"app_data.ui_data.label\")) {\n\t\t\tlabel = this.props.nodeTemplate.app_data.ui_data.label;\n\t\t}\n\n\t\tlet icon = <div className=\"node-icon\" />;\n\n\t\tif (has(this.props.nodeTemplate, \"app_data.ui_data.image\")) {\n\t\t\tlet image = this.props.nodeTemplate.app_data.ui_data.image;\n\n\t\t\tif (image === USE_DEFAULT_ICON) {\n\t\t\t\timage = SUPERNODE_ICON;\n\t\t\t} else if (image === USE_DEFAULT_EXT_ICON) {\n\t\t\t\timage = SUPERNODE_EXT_ICON;\n\t\t\t}\n\n\t\t\tif (typeof image === \"object\" && React.isValidElement(image)) {\n\t\t\t\ticon = image;\n\n\t\t\t} else if (typeof image === \"string\") {\n\t\t\t\ticon = image.endsWith(\".svg\")\n\t\t\t\t\t? <SVG src={image} className=\"node-icon\" aria-label={label} />\n\t\t\t\t\t: <img src={image} className=\"node-icon\" alt={label} />;\n\t\t\t}\n\t\t}\n\n\t\tlet draggable = this.props.isEditingEnabled ? \"true\" : \"false\";\n\t\tlet txtClassName = \"palette-dialog-grid-node-text\";\n\n\t\t// Special case for when there are no nodes in the category so we show\n\t\t// a dummy node to include the empty text from the category.\n\t\tif (this.props.category && this.props.category.node_types.length === 0 && this.props.category.empty_text) {\n\t\t\tlabel = this.props.category.empty_text;\n\t\t\tdraggable = \"false\";\n\t\t\ttxtClassName = \"palette-dialog-grid-node-text-warning\";\n\t\t\ticon = (<Icon type={CANVAS_CARBON_ICONS.WARNING_UNFILLED} className=\"palette-dialog-grid-node-icon-warning\" draggable=\"false\" />);\n\t\t}\n\n\t\treturn (\n\t\t\t<div id={this.props.nodeTemplate.id}\n\t\t\t\tdata-id={this.props.nodeTemplate.op}\n\t\t\t\tdraggable={draggable}\n\t\t\t\tonMouseOver={this.onMouseOver}\n\t\t\t\tonMouseLeave={this.onMouseLeave}\n\t\t\t\tonMouseDown={this.props.isEditingEnabled ? this.onMouseDown : null}\n\t\t\t\tonDragStart={this.props.isEditingEnabled ? this.onDragStart : null}\n\t\t\t\tonDragEnd={this.props.isEditingEnabled ? this.onDragEnd : null}\n\t\t\t\tonClick={this.props.isEditingEnabled ? this.onClick : null}\n\t\t\t\tonDoubleClick={this.props.isEditingEnabled ? this.onDoubleClick : null}\n\t\t\t\tclassName=\"palette-dialog-grid-node-outer\"\n\t\t\t>\n\t\t\t\t<div className=\"palette-dialog-grid-node-inner\">\n\t\t\t\t\t<div className=\"palette-dialog-grid-node-icon\">\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className={ txtClassName }>\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nPaletteDialogContentGridNode.propTypes = {\n\tcategory: PropTypes.object.isRequired,\n\tnodeTemplate: PropTypes.object.isRequired,\n\tcanvasController: PropTypes.object.isRequired,\n\tallowClickToAdd: PropTypes.bool,\n\tisEditingEnabled: PropTypes.bool.isRequired\n};\n\nexport default PaletteDialogContentGridNode;\n","/*\n * Copyright 2017-2023 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport PaletteDialogContentGridNode from \"./palette-dialog-content-grid-node.jsx\";\n\n\nclass PaletteDialogContentGrid extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t};\n\t}\n\n\trender() {\n\t\tvar gridNodes = [];\n\n\t\tif (this.props.category && this.props.category.node_types &&\n\t\t\t\tthis.props.category.node_types.length === 0 && this.props.category.empty_text) {\n\t\t\tgridNodes.push(\n\t\t\t\t<PaletteDialogContentGridNode key={\"pal_grid_node_empty\"}\n\t\t\t\t\tcategory={this.props.category}\n\t\t\t\t\tnodeTemplate={ {} }\n\t\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t\t\tallowClickToAdd={this.props.allowClickToAdd}\n\t\t\t\t/>\n\t\t\t);\n\t\t} else {\n\t\t\tfor (var idx = 0; idx < this.props.nodeTypes.length; idx++) {\n\t\t\t\tgridNodes.push(\n\t\t\t\t\t<PaletteDialogContentGridNode key={\"pal_grid_node_\" + idx}\n\t\t\t\t\t\tcategory={this.props.category}\n\t\t\t\t\t\tnodeTemplate={this.props.nodeTypes[idx]}\n\t\t\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t\t\t\tallowClickToAdd={this.props.allowClickToAdd}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn (\n\t\t\t<div width=\"100%\" className=\"palette-scroll\">\n\t\t\t\t{gridNodes}\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nPaletteDialogContentGrid.propTypes = {\n\tcategory: PropTypes.object.isRequired,\n\tnodeTypes: PropTypes.array.isRequired,\n\tisEditingEnabled: PropTypes.bool.isRequired,\n\tallowClickToAdd: PropTypes.bool,\n\tcanvasController: PropTypes.object.isRequired\n};\n\nexport default PaletteDialogContentGrid;\n","/*\n * Copyright 2017-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport PaletteDialogContentCategories from \"./palette-dialog-content-categories.jsx\";\nimport PaletteDialogContentGrid from \"./palette-dialog-content-grid.jsx\";\nimport PaletteContentList from \"./palette-content-list.jsx\";\n\nclass PaletteDialogContent extends React.Component {\n\tstatic getDerivedStateFromProps(nextProps, prevState) {\n\t\t// We get the paletteJSON after the initial render so set the\n\t\t// default selected category when it is received.\n\t\tif (nextProps.paletteJSON &&\n\t\t\t\tnextProps.paletteJSON.categories &&\n\t\t\t\tnextProps.paletteJSON.categories.length > 0 &&\n\t\t\t\tprevState.selectedCategory === \"\") {\n\t\t\treturn ({ selectedCategory: nextProps.paletteJSON.categories[0].label });\n\t\t}\n\t\treturn ({});\n\t}\n\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t\tselectedCategory: \"\"\n\t\t};\n\n\t\tthis.categorySelected = this.categorySelected.bind(this);\n\t\tthis.getUniqueCategories = this.getUniqueCategories.bind(this);\n\t\tthis.getSelectedCategory = this.getSelectedCategory.bind(this);\n\t}\n\n\tgetUniqueCategories(categories) {\n\t\tvar out = [];\n\n\t\tif (categories) {\n\t\t\tfor (var idx = 0; idx < categories.length; idx++) {\n\t\t\t\tif (out.indexOf(categories[idx].label) === -1) {\n\t\t\t\t\tout.push(categories[idx]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\tgetSelectedCategory(categories) {\n\t\tvar out = {};\n\n\t\tif (categories) {\n\t\t\tfor (var idx = 0; idx < categories.length; idx++) {\n\t\t\t\tif (categories[idx].label === this.state.selectedCategory) {\n\t\t\t\t\tout = categories[idx];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\tcategorySelected(catSelEvent) {\n\t\tthis.setState({ selectedCategory: catSelEvent.target.firstChild.data });\n\t}\n\n\trender() {\n\t\tconst cats = this.getUniqueCategories(this.props.paletteJSON.categories);\n\t\tconst category = this.getSelectedCategory(this.props.paletteJSON.categories);\n\t\tconst nodeTypes = category && category.node_types ? category.node_types : [];\n\t\tconst nodeTypeInfos = nodeTypes.map((nt) =>\t({ nodeType: nt, category: category }));\n\t\tconst content = this.props.showGrid\n\t\t\t? (\n\t\t\t\t<PaletteDialogContentGrid\n\t\t\t\t\tcategory={category}\n\t\t\t\t\tnodeTypes={nodeTypes}\n\t\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t\t\tallowClickToAdd={this.props.allowClickToAdd}\n\t\t\t\t/>)\n\t\t\t: (\n\t\t\t\t<PaletteContentList\n\t\t\t\t\tcategory={category}\n\t\t\t\t\tnodeTypeInfos={nodeTypeInfos}\n\t\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\t\tisPaletteWide\n\t\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t\t\tallowClickToAdd={this.props.allowClickToAdd}\n\t\t\t\t/>);\n\t\treturn (\n\t\t\t<div className=\"palette-dialog-content\">\n\t\t\t\t<PaletteDialogContentCategories categories={cats}\n\t\t\t\t\tselectedCategory={this.state.selectedCategory}\n\t\t\t\t\tcategorySelectedMethod={this.categorySelected}\n\t\t\t\t/>\n\t\t\t\t{content}\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nPaletteDialogContent.propTypes = {\n\tpaletteJSON: PropTypes.object.isRequired,\n\tshowGrid: PropTypes.bool.isRequired,\n\tcanvasController: PropTypes.object.isRequired,\n\tallowClickToAdd: PropTypes.bool,\n\tisEditingEnabled: PropTypes.bool.isRequired\n};\n\nexport default PaletteDialogContent;\n","/*\n * Copyright 2017-2026 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport { injectIntl } from \"react-intl\";\nimport PropTypes from \"prop-types\";\nimport defaultMessages from \"../../locales/palette/locales/en.json\";\nimport PaletteDialogTopbar from \"./palette-dialog-topbar.jsx\";\nimport PaletteDialogContent from \"./palette-dialog-content.jsx\";\n\nclass PaletteDialog extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t\txPos: 100,\n\t\t\tyPos: 100,\n\t\t\tshowGrid: true\n\t\t};\n\n\t\tthis.showGrid = this.showGrid.bind(this);\n\t\tthis.mouseDownOnTopBar = this.mouseDownOnTopBar.bind(this);\n\t\tthis.mouseDownOnPalette = this.mouseDownOnPalette.bind(this);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseUp = this.mouseUp.bind(this);\n\t\tthis.windowResize = this.windowResize.bind(this);\n\t\tthis.windowMaximize = this.windowMaximize.bind(this);\n\t\tthis.getPaletteDiv = this.getPaletteDiv.bind(this);\n\t\tthis.resizePalette = this.resizePalette.bind(this);\n\t\tthis.movePalette = this.movePalette.bind(this);\n\t\tthis.setResizingCursors = this.setResizingCursors.bind(this);\n\t\tthis.setSizingHoverEdge = this.setSizingHoverEdge.bind(this);\n\t\tthis.snapToWidth = this.snapToWidth.bind(this);\n\t\tthis.snapToHeight = this.snapToHeight.bind(this);\n\t\tthis.removePx = this.removePx.bind(this);\n\n\t\t// These variables are used when dragging the palette.\n\t\tthis.dragging = false;\n\t\tthis.dragOffsetY = 0;\n\t\tthis.dragOffsetX = 0;\n\n\t\t// verticalSizingAction and verticalSizingHover can be set to top or bottom\n\t\tthis.verticalSizingAction = \"\";\n\t\tthis.verticalSizingHover = \"\";\n\n\t\t// horizontalSizingAction and horizontalSizingHover can be set to left or right\n\t\tthis.horizontalSizingAction = \"\";\n\t\tthis.horizontalSizingHover = \"\";\n\n\t\t// These variables store the palette dimensions\n\t\tthis.savedWidth = 0;\n\t\tthis.savedLeft = 0;\n\t\tthis.savedHeight = 0;\n\t\tthis.savedTop = 0;\n\n\t\t// hoverZoneSize is the number of pixels around the palette where the\n\t\t// sizing cursor will appear (which allows the user to size the window).\n\t\tthis.hoverZoneSize = 3;\n\t\tthis.totalHoverZoneSize = this.hoverZoneSize * 2;\n\n\t\t// Need to control resizing of palette with snap to grid.\n\t\tthis.adjustedWidth = 137; // default width - (default content node grid width)\n\t\tthis.adjustedHeight = 51; // default height - (default content node grid height) + padding to avoid scroll bar\n\t\tthis.adjustedScrollBarWidth = 15;\n\n\t\t// Boolean to remember whether we are maximized or not. This gets set to\n\t\t// false when doing a manual resize of the palette.\n\t\tthis.isMaximized = false;\n\n\t\t// Array of nodes for the palette\n\t\tthis.paletteNodes = [];\n\n\t\t// Reference to the palette div\n\t\tthis.dialogPaletteDivRef = React.createRef();\n\n\t\t// Correction for palette cursor position\n\t\t// Used in both hover zone detection and mouseMove vertical resize at bottom of paletteDiv\n\t\tthis.hackPaletteOffset = 46;\n\t\tthis.hackPaletteTopOffset = this.hackPaletteOffset + 4;\n\n\t\twindow.addEventListener(\"mousemove\", this.mouseMove, false);\n\t\twindow.addEventListener(\"mouseup\", this.mouseUp, false);\n\t\twindow.addEventListener(\"resize\", this.windowResize, false);\n\t}\n\n\tcomponentDidUpdate() {\n\t\t// After the palette has rendered ensure the palette is visible in\n\t\t// whatever size the canvas happens to be. This can be done by doing\n\t\t// the same activity as we perform when the browser window is sized.\n\t\tthis.windowResize();\n\t}\n\n\tcomponentWillUnmount() {\n\t\twindow.removeEventListener(\"mousemove\", this.mouseMove);\n\t\twindow.removeEventListener(\"mouseup\", this.mouseUp);\n\t\twindow.removeEventListener(\"resize\", this.windowResize);\n\t}\n\n\t// Adjusts the mouse position from the event so it is NOT outside the\n\t// canvas when doing a bottom sizing operation.\n\tgetAdjustedMousePositionBottom(ev, canvasDiv) {\n\t\tlet eventClientY = ev.clientY;\n\n\t\tif (eventClientY > canvasDiv.offsetTop + canvasDiv.offsetHeight - this.hoverZoneSize) {\n\t\t\teventClientY = canvasDiv.offsetTop + canvasDiv.offsetHeight - this.hoverZoneSize;\n\t\t}\n\t\treturn eventClientY;\n\t}\n\n\t// Adjusts the mouse position from the event so it is NOT outside the\n\t// canvas when doing a left sizing operation.\n\tgetAdjustedMousePositionLeft(ev, canvasDiv) {\n\t\tlet eventClientX = ev.clientX;\n\n\t\tif (eventClientX < canvasDiv.offsetLeft + this.hoverZoneSize) {\n\t\t\teventClientX = canvasDiv.offsetLeft + this.hoverZoneSize;\n\t\t}\n\t\treturn eventClientX;\n\t}\n\n\t// Adjusts the mouse position from the event so it is NOT outside the\n\t// canvas when doing a right sizing operation.\n\tgetAdjustedMousePositionRight(ev, canvasDiv) {\n\t\tlet eventClientX = ev.clientX;\n\n\t\tif (eventClientX > canvasDiv.offsetLeft + canvasDiv.offsetWidth - this.hoverZoneSize) {\n\t\t\teventClientX = canvasDiv.offsetLeft + canvasDiv.offsetWidth - this.hoverZoneSize;\n\t\t}\n\t\treturn eventClientX;\n\t}\n\n\t// Adjusts the mouse position from the event so it is NOT outside the\n\t// canvas when doing a top sizing operation.\n\tgetAdjustedMousePositionTop(ev, canvasDiv) {\n\t\tlet eventClientY = ev.clientY;\n\n\t\tif (eventClientY < canvasDiv.offsetTop + this.hoverZoneSize) {\n\t\t\teventClientY = canvasDiv.offsetTop + this.hoverZoneSize;\n\t\t}\n\t\treturn eventClientY;\n\t}\n\n\tgetPaletteDiv() {\n\t\treturn this.dialogPaletteDivRef?.current;\n\t}\n\n\tgetStyleProperty(classOrId, property) {\n\t\tconst firstChar = classOrId.charAt(0);\n\t\tconst remaining = classOrId.substring(1);\n\t\tconst elem = (firstChar === \"#\") ? document.getElementById(remaining) : document.getElementsByClassName(remaining)[0];\n\t\treturn window.getComputedStyle(elem, null).getPropertyValue(property);\n\t}\n\n\tsetResizingCursors(ev) {\n\t\tconst paletteDiv = this.getPaletteDiv();\n\n\t\tthis.setSizingHoverEdge(ev, paletteDiv);\n\n\t\tif (this.verticalSizingHover === \"top\") {\n\t\t\tif (this.horizontalSizingHover === \"left\") {\n\t\t\t\tpaletteDiv.style.cursor = \"nwse-resize\";\n\t\t\t} else if (this.horizontalSizingHover === \"right\") {\n\t\t\t\tpaletteDiv.style.cursor = \"nesw-resize\";\n\t\t\t} else {\n\t\t\t\tpaletteDiv.style.cursor = \"ns-resize\";\n\t\t\t}\n\t\t} else if (this.verticalSizingHover === \"bottom\") {\n\t\t\tif (this.horizontalSizingHover === \"left\") {\n\t\t\t\tpaletteDiv.style.cursor = \"nesw-resize\";\n\t\t\t} else if (this.horizontalSizingHover === \"right\") {\n\t\t\t\tpaletteDiv.style.cursor = \"nwse-resize\";\n\t\t\t} else {\n\t\t\t\tpaletteDiv.style.cursor = \"ns-resize\";\n\t\t\t}\n\t\t} else if (this.horizontalSizingHover === \"left\" ||\n\t\t\t\t\t\t\tthis.horizontalSizingHover === \"right\") {\n\t\t\tpaletteDiv.style.cursor = \"ew-resize\";\n\n\t\t} else {\n\t\t\tpaletteDiv.style.cursor = \"default\";\n\t\t}\n\t}\n\n\t// Sets the size of the content div, and the divs inside content div, so\n\t// they adopt the same height as the palette.\n\tsetContentDivHeight(paletteDiv, newHeight) {\n\t\tconst topbarHeight = this.removePx(this.getStyleProperty(\".palette-dialog-topbar\", \"height\"));\n\t\tconst newContentHeight = (newHeight - topbarHeight - this.totalHoverZoneSize) + \"px\";\n\t\tconst contentDiv = paletteDiv.childNodes[1];\n\t\tcontentDiv.style.height = newContentHeight;\n\t\tcontentDiv.childNodes[0].style.height = newContentHeight;\n\t\tcontentDiv.childNodes[1].style.height = newContentHeight;\n\t}\n\n\tsetSizingHoverEdge(ev, paletteDiv) {\n\t\tif (ev.clientX > paletteDiv.offsetLeft &&\n\t\t\t\tev.clientX < paletteDiv.offsetLeft + (this.totalHoverZoneSize)) {\n\t\t\tthis.horizontalSizingHover = \"left\";\n\n\t\t} else if (ev.clientX < paletteDiv.offsetLeft + paletteDiv.offsetWidth &&\n\t\t\t\t\tev.clientX > paletteDiv.offsetLeft + paletteDiv.offsetWidth - this.totalHoverZoneSize) {\n\t\t\tthis.horizontalSizingHover = \"right\";\n\n\t\t} else {\n\t\t\tthis.horizontalSizingHover = \"\";\n\t\t\tthis.horizontalSizingAction = \"\";\n\t\t}\n\n\t\tif (ev.clientY > paletteDiv.offsetTop + this.hackPaletteTopOffset &&\n\t\t\t\tev.clientY < paletteDiv.offsetTop + this.hackPaletteTopOffset + this.totalHoverZoneSize) {\n\t\t\tthis.verticalSizingHover = \"top\";\n\n\t\t} else if (ev.clientY < paletteDiv.offsetTop + paletteDiv.offsetHeight + this.hackPaletteOffset &&\n\t\t\t\tev.clientY > paletteDiv.offsetTop + paletteDiv.offsetHeight +\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.hackPaletteOffset - this.totalHoverZoneSize) {\n\t\t\tthis.verticalSizingHover = \"bottom\";\n\n\t\t} else {\n\t\t\tthis.verticalSizingHover = \"\";\n\t\t\tthis.verticalSizingAction = \"\";\n\t\t}\n\t}\n\n\tmouseDownOnTopBar(ev) {\n\t\tthis.dragging = true;\n\t\tconst paletteDiv = this.getPaletteDiv();\n\t\tthis.dragOffsetX = ev.clientX - paletteDiv.offsetLeft;\n\t\tthis.dragOffsetY = ev.clientY - paletteDiv.offsetTop;\n\t}\n\n\tmouseDownOnPalette(ev) {\n\t\tconst paletteDiv = this.getPaletteDiv();\n\n\t\tif (this.verticalSizingHover !== \"\" ||\n\t\t\t\tthis.horizontalSizingHover !== \"\") {\n\t\t\tthis.verticalSizingAction = this.verticalSizingHover;\n\t\t\tthis.horizontalSizingAction = this.horizontalSizingHover;\n\t\t\tthis.savedWidth = paletteDiv.offsetWidth;\n\t\t\tthis.savedLeft = paletteDiv.offsetLeft;\n\t\t\tthis.savedHeight = paletteDiv.offsetHeight;\n\t\t\tthis.savedTop = paletteDiv.offsetTop;\n\t\t}\n\t}\n\n\tmouseMove(ev) {\n\t\t// First, see if we are doing a sizing action (i.e. the user has\n\t\t// done mouse down when in sizing hover zone) and take appropriate\n\t\t// sizing action.\n\t\tif (this.verticalSizingAction !== \"\" ||\n\t\t\t\tthis.horizontalSizingAction !== \"\") {\n\t\t\tthis.resizePalette(ev);\n\n\t\t\t// Now, if no sizing behavior is going on we handle topbar drag\n\t\t\t// behavior (after the sizing behaviors) so sizing takes\n\t\t\t// precedence over dragging the window.\n\t\t} else if (this.dragging === true) {\n\t\t\tthis.movePalette(ev);\n\n\t\t\t// Finally, if no sizing or dragging is going on, we look to see if\n\t\t\t// the user is hovering the pointer near the palette edges so we can\n\t\t\t// display an appropriate sizing cursor.\n\t\t} else {\n\t\t\tthis.setResizingCursors(ev);\n\t\t}\n\t}\n\n\tmouseUp() {\n\t\tconst paletteDiv = this.getPaletteDiv();\n\n\t\t// snap to grid adjustment to width\n\t\tif (this.state.showGrid && this.horizontalSizingAction !== \"\") {\n\t\t\tlet newWidth = this.removePx(paletteDiv.style.width);\n\t\t\tif (newWidth !== \"\") {\n\t\t\t\tnewWidth = this.snapToWidth(newWidth);\n\t\t\t}\n\t\t\tpaletteDiv.style.width = newWidth + \"px\";\n\n\t\t\t// adjust the width if the content enters a scrolling situation\n\t\t\tconst scrollDiv = paletteDiv.childNodes[1].childNodes[1];\n\t\t\tif (scrollDiv.clientHeight < scrollDiv.scrollHeight) {\n\t\t\t\tpaletteDiv.style.width = (newWidth + this.adjustedScrollBarWidth) + \"px\";\n\t\t\t}\n\t\t}\n\n\t\t// snap to grid adjustment to height\n\t\tif (this.verticalSizingAction !== \"\") {\n\t\t\tconst oldHeight = this.removePx(paletteDiv.style.height);\n\t\t\tif (oldHeight !== \"\") {\n\t\t\t\tconst newHeight = this.snapToHeight(oldHeight);\n\t\t\t\tpaletteDiv.style.height = newHeight + \"px\";\n\t\t\t\tthis.setContentDivHeight(paletteDiv, newHeight);\n\t\t\t}\n\t\t}\n\n\t\tthis.dragging = false;\n\t\tthis.verticalSizingAction = \"\";\n\t\tthis.horizontalSizingAction = \"\";\n\t\tthis.verticalSizingHover = \"\";\n\t\tthis.horizontalSizingHover = \"\";\n\t}\n\n\tmovePalette(ev) {\n\t\tconst paletteDiv = this.getPaletteDiv();\n\t\tconst canvasDiv = document.getElementById(this.props.containingDivId);\n\n\t\tlet newLeft = ev.clientX - this.dragOffsetX;\n\t\tlet newTop = ev.clientY - this.dragOffsetY;\n\n\t\tif (newLeft < canvasDiv.offsetLeft + this.hoverZoneSize) {\n\t\t\tnewLeft = canvasDiv.offsetLeft + this.hoverZoneSize;\n\t\t}\n\t\tif (newTop < canvasDiv.offsetTop + this.hoverZoneSize) {\n\t\t\tnewTop = canvasDiv.offsetTop + this.hoverZoneSize;\n\t\t}\n\t\tif (newLeft + paletteDiv.offsetWidth > canvasDiv.offsetLeft + canvasDiv.offsetWidth) {\n\t\t\tnewLeft = canvasDiv.offsetLeft + canvasDiv.offsetWidth - paletteDiv.offsetWidth - this.hoverZoneSize;\n\t\t}\n\t\tif (newTop + paletteDiv.offsetHeight > canvasDiv.offsetTop + canvasDiv.offsetHeight) {\n\t\t\tnewTop = canvasDiv.offsetTop + canvasDiv.offsetHeight - paletteDiv.offsetHeight - this.hoverZoneSize;\n\t\t}\n\n\t\tpaletteDiv.style.left = newLeft + \"px\";\n\t\tpaletteDiv.style.top = newTop + \"px\";\n\t}\n\n\tremovePx(styleDimension) {\n\t\treturn parseInt(styleDimension.substring(0, styleDimension.indexOf(\"px\")), 10);\n\t}\n\n\tresizePalette(ev) {\n\t\tconst paletteDiv = this.getPaletteDiv();\n\t\tconst canvasDiv = document.getElementById(this.props.containingDivId);\n\n\t\t// When manually resizing, set isMaximized to false in case the user\n\t\t// is resizing a maximized window.\n\t\tthis.isMaximized = false;\n\n\t\tconst minWidth = this.removePx(this.getStyleProperty(\".palette-dialog-grid-node-outer\", \"width\")) +\n\t\t\t\t\t\t\t\t\t\t\tthis.removePx(this.getStyleProperty(\".palette-dialog-categories\", \"min-width\")) +\n\t\t\t\t\t\t\t\t\t\t\t(2 * this.hoverZoneSize);\n\t\tconst minHeight = this.removePx(this.getStyleProperty(\".palette-dialog-grid-node-outer\", \"height\")) +\n\t\t\t\t\t\t\t\t\t\t\tthis.removePx(this.getStyleProperty(\".palette-dialog-topbar\", \"height\")) +\n\t\t\t\t\t\t\t\t\t\t\t(2 * this.hoverZoneSize);\n\n\t\tif (this.horizontalSizingAction === \"left\") {\n\t\t\tconst eventClientX = this.getAdjustedMousePositionLeft(ev, canvasDiv);\n\t\t\tconst newWidth = this.savedWidth - (eventClientX - this.savedLeft);\n\n\t\t\tif (newWidth <= minWidth) {\n\t\t\t\tpaletteDiv.style.width = minWidth + \"px\";\n\t\t\t} else {\n\t\t\t\tpaletteDiv.style.width = newWidth + \"px\";\n\t\t\t\tpaletteDiv.style.left = eventClientX + \"px\";\n\t\t\t}\n\t\t}\n\n\t\tif (this.horizontalSizingAction === \"right\") {\n\t\t\tconst eventClientX = this.getAdjustedMousePositionRight(ev, canvasDiv);\n\t\t\tlet newWidth = (eventClientX - this.savedLeft);\n\n\t\t\tif (newWidth <= minWidth) {\n\t\t\t\tnewWidth = minWidth;\n\t\t\t}\n\t\t\tpaletteDiv.style.width = newWidth + \"px\";\n\t\t}\n\n\t\tif (this.verticalSizingAction === \"top\") {\n\t\t\tconst eventClientY = this.getAdjustedMousePositionTop(ev, canvasDiv);\n\t\t\tconst newHeight = this.savedHeight - (eventClientY - this.savedTop);\n\n\t\t\tif (newHeight <= minHeight) {\n\t\t\t\tpaletteDiv.style.height = minHeight + \"px\";\n\t\t\t\tthis.setContentDivHeight(paletteDiv, this.minHeight);\n\t\t\t} else {\n\t\t\t\tpaletteDiv.style.height = newHeight + \"px\";\n\t\t\t\tpaletteDiv.style.top = (eventClientY - this.dragOffsetY) + \"px\";\n\t\t\t\tthis.setContentDivHeight(paletteDiv, newHeight);\n\t\t\t}\n\t\t}\n\n\t\tif (this.verticalSizingAction === \"bottom\") {\n\t\t\tconst eventClientY = this.getAdjustedMousePositionBottom(ev, canvasDiv);\n\t\t\tlet newHeight = eventClientY - this.savedTop - this.hackPaletteOffset;\n\n\t\t\tif (newHeight <= minHeight) {\n\t\t\t\tnewHeight = minHeight;\n\t\t\t}\n\t\t\tpaletteDiv.style.height = newHeight + \"px\";\n\t\t\tthis.setContentDivHeight(paletteDiv, newHeight);\n\t\t}\n\t}\n\n\t// Calculate snap to grid width\n\tsnapToWidth(newWidth) {\n\t\tconst gridNodeWidth = this.removePx(this.getStyleProperty(\".palette-dialog-grid-node-outer\", \"width\"));\n\t\tconst snapWidth = Math.round((newWidth - this.adjustedWidth) / gridNodeWidth) * gridNodeWidth;\n\t\treturn (snapWidth + this.adjustedWidth);\n\t}\n\n\t// Calculate snap to grid height\n\tsnapToHeight(newHeight) {\n\t\tconst gridHeight = this.state.showGrid ? this.removePx(this.getStyleProperty(\".palette-dialog-grid-node-outer\", \"height\"))\n\t\t\t: this.removePx(this.getStyleProperty(\".palette-list-item\", \"height\"));\n\t\tconst snapHeight = Math.round((newHeight - this.adjustedHeight) / gridHeight) * gridHeight;\n\t\treturn (snapHeight + this.adjustedHeight);\n\t}\n\n\t// Called when the browser window is resized.We need to make sure the\n\t// palette stays inside the canvas and is a size that allows it to fit\n\t// into the canvas.\n\twindowResize() {\n\t\tconst paletteDiv = this.getPaletteDiv();\n\t\tconst canvasDiv = document.getElementById(this.props.containingDivId);\n\n\t\tif (canvasDiv) {\n\t\t\tif (this.isMaximized) {\n\t\t\t\t// Handle horizontal page sizing\n\t\t\t\tconst newLeft = canvasDiv.offsetLeft + this.hoverZoneSize;\n\t\t\t\tpaletteDiv.style.left = newLeft + \"px\";\n\n\t\t\t\tconst newWidth = canvasDiv.offsetWidth - this.totalHoverZoneSize;\n\t\t\t\tpaletteDiv.style.width = newWidth + \"px\";\n\n\t\t\t\t// Handle vertical page sizing\n\t\t\t\tconst newTop = canvasDiv.offsetTop + this.hoverZoneSize;\n\t\t\t\tpaletteDiv.style.top = newTop + \"px\";\n\n\t\t\t\tconst newHeight = canvasDiv.offsetHeight - this.totalHoverZoneSize;\n\t\t\t\tpaletteDiv.style.height = newHeight + \"px\";\n\t\t\t\tthis.setContentDivHeight(paletteDiv, newHeight);\n\n\t\t\t} else {\n\t\t\t\t// Handle horizontal page sizing\n\t\t\t\tif (paletteDiv.offsetLeft + paletteDiv.offsetWidth + this.hoverZoneSize >\n\t\t\t\t\t\t\t\t\t\tcanvasDiv.offsetLeft + canvasDiv.offsetWidth) {\n\t\t\t\t\tconst newLeft = canvasDiv.offsetLeft + canvasDiv.offsetWidth -\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpaletteDiv.offsetWidth - this.hoverZoneSize;\n\t\t\t\t\tpaletteDiv.style.left = newLeft + \"px\";\n\t\t\t\t}\n\n\t\t\t\tconst newWidth = canvasDiv.offsetWidth - this.totalHoverZoneSize;\n\t\t\t\tif (newWidth < paletteDiv.offsetWidth) {\n\t\t\t\t\tpaletteDiv.style.width = newWidth + \"px\";\n\t\t\t\t\tpaletteDiv.style.left = (canvasDiv.offsetLeft + canvasDiv.offsetWidth -\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpaletteDiv.offsetWidth - this.hoverZoneSize) + \"px\";\n\t\t\t\t}\n\n\t\t\t\t// Handle vertical page sizing\n\t\t\t\tif (paletteDiv.offsetTop + paletteDiv.offsetHeight + this.hoverZoneSize >\n\t\t\t\t\t\t\t\t\t\tcanvasDiv.offsetTop + canvasDiv.offsetHeight) {\n\t\t\t\t\tconst newTop = canvasDiv.offsetTop + canvasDiv.offsetHeight -\n\t\t\t\t\t\t\t\t\t\t\t\tpaletteDiv.offsetHeight - this.hoverZoneSize;\n\t\t\t\t\tpaletteDiv.style.top = newTop + \"px\";\n\t\t\t\t}\n\n\t\t\t\tconst newHeight = canvasDiv.offsetHeight - this.totalHoverZoneSize;\n\t\t\t\tif (newHeight < paletteDiv.offsetHeight) {\n\t\t\t\t\tpaletteDiv.style.height = newHeight + \"px\";\n\t\t\t\t\tpaletteDiv.style.top = (canvasDiv.offsetTop + canvasDiv.offsetHeight -\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpaletteDiv.offsetHeight - this.hoverZoneSize) + \"px\";\n\t\t\t\t\tthis.setContentDivHeight(paletteDiv, newHeight);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Called when the user double clicks the title bar.\n\twindowMaximize() {\n\t\tconst paletteDiv = this.getPaletteDiv();\n\t\tconst canvasDiv = document.getElementById(this.props.containingDivId);\n\n\t\tif (canvasDiv) {\n\t\t\tif (this.isMaximized) {\n\t\t\t\t// Restore the previous window size and position\n\t\t\t\tpaletteDiv.style.width = this.savedWidth + \"px\";\n\t\t\t\tpaletteDiv.style.left = this.savedLeft + \"px\";\n\t\t\t\tpaletteDiv.style.height = this.savedHeight + \"px\";\n\t\t\t\tpaletteDiv.style.top = this.savedTop + \"px\";\n\t\t\t\tthis.setContentDivHeight(paletteDiv, this.savedHeight);\n\n\t\t\t\tthis.isMaximized = false;\n\n\t\t\t\t// After the palette has restored, ensure it is visible in\n\t\t\t\t// whatever size the canvas happens to be. This can be done by doing\n\t\t\t\t// the same activity as we perform when the browser window is sized.\n\t\t\t\t// Make sure to call this after setting the isMaximized flag because\n\t\t\t\t// windowResize() looks at that flag for its resize behavior.\n\t\t\t\tthis.windowResize();\n\n\t\t\t} else {\n\t\t\t\t// Save the existing size and position and maximize the palette.\n\t\t\t\tthis.savedWidth = paletteDiv.offsetWidth;\n\t\t\t\tthis.savedLeft = paletteDiv.offsetLeft;\n\t\t\t\tthis.savedHeight = paletteDiv.offsetHeight;\n\t\t\t\tthis.savedTop = paletteDiv.offsetTop;\n\n\t\t\t\t// Handle horizontal palette sizing\n\t\t\t\t// A padding of 1 is needed to make it look better (I think) because of rounding errors\n\t\t\t\tconst newWidth = canvasDiv.offsetWidth - this.totalHoverZoneSize + 1;\n\t\t\t\tpaletteDiv.style.width = newWidth + \"px\";\n\t\t\t\tpaletteDiv.style.left = (canvasDiv.offsetLeft + this.hoverZoneSize) + \"px\";\n\n\t\t\t\t// Handle vertical palette sizing\n\t\t\t\t// A padding of 1 is needed to make it look better (I think) because of rounding errors\n\t\t\t\tconst newHeight = canvasDiv.offsetHeight - this.totalHoverZoneSize + 1;\n\t\t\t\tpaletteDiv.style.height = newHeight + \"px\";\n\t\t\t\tpaletteDiv.style.top = (canvasDiv.offsetTop + this.hoverZoneSize) + \"px\";\n\t\t\t\tthis.setContentDivHeight(paletteDiv, newHeight);\n\n\t\t\t\tthis.isMaximized = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tshowGrid(state) {\n\t\tthis.setState({ showGrid: state });\n\t}\n\n\trender() {\n\t\tconst label = this.props.intl.formatMessage(\n\t\t\t{ id: \"palette.dialog.label\", defaultMessage: defaultMessages[\"palette.dialog.label\"] }\n\t\t);\n\t\treturn (\n\t\t\t<div role=\"region\" aria-label={label} >\n\t\t\t\t<div ref={this.dialogPaletteDivRef} className=\"palette-dialog-div\"\n\t\t\t\t\tonMouseDown={this.mouseDownOnPalette}\n\t\t\t\t>\n\t\t\t\t\t<PaletteDialogTopbar mouseDownMethod={this.mouseDownOnTopBar}\n\t\t\t\t\t\tshowGridMethod={this.showGrid}\n\t\t\t\t\t\twindowMaximizeMethod={this.windowMaximize}\n\t\t\t\t\t\tshowGrid={this.state.showGrid}\n\t\t\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\t\t/>\n\t\t\t\t\t<PaletteDialogContent paletteJSON={this.props.paletteJSON}\n\t\t\t\t\t\tshowGrid={this.state.showGrid}\n\t\t\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t\t\t\tallowClickToAdd={this.props.allowClickToAdd}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nPaletteDialog.propTypes = {\n\t// From injectIntl\n\tintl: PropTypes.object.isRequired,\n\n\t// Provided by PaletteDialog\n\tcanvasController: PropTypes.object.isRequired,\n\tcontainingDivId: PropTypes.string.isRequired,\n\tpaletteJSON: PropTypes.object,\n\tallowClickToAdd: PropTypes.bool,\n\tisEditingEnabled: PropTypes.bool\n};\n\nexport default (injectIntl(PaletteDialog));\n","/*\n * Copyright 2017-2024 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport { connect } from \"react-redux\";\nimport { injectIntl } from \"react-intl\";\nimport PropTypes from \"prop-types\";\nimport PaletteDialogUnder from \"../palette/palette-dialog-under.jsx\";\nimport Logger from \"../logging/canvas-logger.js\";\n\nclass PaletteDialog extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.logger = new Logger(\"PaletteDialog\");\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\treturn (\n\t\t\t<PaletteDialogUnder\n\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\tpaletteJSON={this.props.paletteJSON}\n\t\t\t\tcontainingDivId={this.props.containingDivId}\n\t\t\t\tallowClickToAdd={this.props.allowClickToAdd}\n\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t/>);\n\t}\n}\n\nPaletteDialog.propTypes = {\n\t// From injectIntl\n\tintl: PropTypes.object.isRequired,\n\n\t// Provided by common-canvas\n\tcanvasController: PropTypes.object.isRequired,\n\tcontainingDivId: PropTypes.string.isRequired,\n\n\t// Provided by redux\n\tpaletteJSON: PropTypes.object,\n\tallowClickToAdd: PropTypes.bool,\n\tisEditingEnabled: PropTypes.bool\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\tpaletteJSON: state.palette.content,\n\tallowClickToAdd: state.canvasconfig.enableSingleClickAddFromPalette,\n\tisEditingEnabled: state.canvasconfig.enableEditingActions\n});\n\nexport default connect(mapStateToProps)(injectIntl(PaletteDialog));\n","/*\n * Copyright 2017-2023 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport { connect } from \"react-redux\";\nimport PropTypes from \"prop-types\";\nimport Tooltip from \"../tooltip/tooltip.jsx\";\nimport Icon from \"../icons/icon.jsx\";\nimport { isEmpty } from \"lodash\";\nimport { TIP_TYPE_PALETTE_ITEM, TIP_TYPE_PALETTE_CATEGORY, TIP_TYPE_DEC,\n\tTIP_TYPE_NODE, TIP_TYPE_PORT, TIP_TYPE_LINK, TIP_TYPE_STATE_TAG,\n\tERROR, WARNING } from \"../common-canvas/constants/canvas-constants.js\";\n\nclass CommonCanvasTooltip extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.state = {};\n\n\t\tthis.handleClick = this.handleClick.bind(this);\n\t}\n\n\tcomponentDidMount() {\n\t\tdocument.addEventListener(\"mousedown\", this.handleClick, true);\n\t}\n\n\tcomponentWillUnmount() {\n\t\tdocument.removeEventListener(\"mousedown\", this.handleClick, true);\n\t}\n\n\thandleClick(e) {\n\t\tthis.props.canvasController.closeTip();\n\t}\n\n\trender() {\n\t\tlet content = null;\n\t\tlet direction = null;\n\t\tswitch (this.props.type) {\n\t\tcase TIP_TYPE_PALETTE_ITEM:\n\t\tcase TIP_TYPE_PALETTE_CATEGORY:\n\t\t\tdirection = \"right\";\n\t\t\tbreak;\n\t\tcase TIP_TYPE_NODE:\n\t\tcase TIP_TYPE_PORT:\n\t\tcase TIP_TYPE_DEC:\n\t\tcase TIP_TYPE_LINK:\n\t\tcase TIP_TYPE_STATE_TAG:\n\t\tdefault:\n\t\t\tdirection = \"bottom\";\n\t\t}\n\n\t\tif (this.props.customContent) {\n\t\t\tcontent = this.props.customContent;\n\t\t} else {\n\t\t\tswitch (this.props.type) {\n\t\t\tcase TIP_TYPE_PALETTE_ITEM:\n\t\t\t\tcontent = (\n\t\t\t\t\t<div className=\"tip-palette-item\">\n\t\t\t\t\t\t<div className=\"tip-palette-category\">{this.props.category.label}</div>\n\t\t\t\t\t\t<div className=\"tip-palette-label\">{this.props.nodeTemplate.app_data.ui_data.label}</div>\n\t\t\t\t\t\t{this.props.nodeTemplate.app_data.ui_data.description\n\t\t\t\t\t\t\t? (<div className=\"tip-palette-desc\">{this.props.nodeTemplate.app_data.ui_data.description}</div>)\n\t\t\t\t\t\t\t: (\"\")\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase TIP_TYPE_PALETTE_CATEGORY:\n\t\t\t\tcontent = (\n\t\t\t\t\t<div className=\"tip-palette-item\">\n\t\t\t\t\t\t<div className=\"tip-palette-label\">{this.props.category.label}</div>\n\t\t\t\t\t\t{this.props.category.description\n\t\t\t\t\t\t\t? (<div className=\"tip-palette-desc\">{this.props.category.description}</div>)\n\t\t\t\t\t\t\t: (\"\")\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase TIP_TYPE_NODE:\n\t\t\t\t{\n\t\t\t\t\tlet icon = null;\n\t\t\t\t\tif (this.props.canvasController.getObjectModel().hasErrorMessage(this.props.node)) {\n\t\t\t\t\t\ticon = (<Icon type={ERROR} className=\"tip-node-status error\" />);\n\t\t\t\t\t} else if (this.props.canvasController.getObjectModel().hasWarningMessage(this.props.node)) {\n\t\t\t\t\t\ticon = (<Icon type={WARNING} className=\"tip-node-status warning\" />);\n\t\t\t\t\t}\n\t\t\t\t\tconst nodeType = this.props.canvasController.getObjectModel().getPaletteNode(this.props.node.op);\n\t\t\t\t\tlet nodeLabel = this.props.node.label;\n\t\t\t\t\tconst nodeTypeLabel = nodeType && nodeType.app_data && nodeType.app_data.ui_data ? nodeType.app_data.ui_data.label : nodeLabel;\n\t\t\t\t\tif (nodeLabel !== nodeTypeLabel) {\n\t\t\t\t\t\tnodeLabel += ` (${nodeTypeLabel})`;\n\t\t\t\t\t}\n\n\t\t\t\t\t// If there's nothing to display just give up. This will prevent us\n\t\t\t\t\t// displaying an empty tooltip.\n\t\t\t\t\tif (!icon && !nodeLabel && !nodeTypeLabel && !this.props.node.description) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tcontent = (\n\t\t\t\t\t\t<div className=\"tip-node\">\n\t\t\t\t\t\t\t{icon}\n\t\t\t\t\t\t\t<div className=\"tip-node-label\">{nodeLabel}</div>\n\t\t\t\t\t\t\t{this.props.node.description\n\t\t\t\t\t\t\t\t? (<div className=\"tip-node-desc\">{this.props.node.description}</div>)\n\t\t\t\t\t\t\t\t: (\"\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase TIP_TYPE_PORT:\n\t\t\t\tcontent = isEmpty(this.props.port.label) ? null : (\n\t\t\t\t\t<div className=\"tip-port\">{this.props.port.label}</div>\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase TIP_TYPE_DEC:\n\t\t\t\tcontent = isEmpty(this.props.decoration.tooltip) ? null : (\n\t\t\t\t\t<div className=\"tip-decoration\">{this.props.decoration.tooltip}</div>\n\t\t\t\t);\n\t\t\t\tbreak;\n\n\t\t\tcase TIP_TYPE_LINK:\n\t\t\t\tbreak;\n\n\t\t\tcase TIP_TYPE_STATE_TAG:\n\t\t\t\tcontent = isEmpty(this.props.stateTagText) ? null : (\n\t\t\t\t\t<div className=\"tip-state-tag\">{this.props.stateTagText}</div>\n\t\t\t\t);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tcontent = null;\n\t\t\t}\n\t\t}\n\n\t\treturn (content !== null) ? (<Tooltip\n\t\t\ttip={content}\n\t\t\tdirection={direction}\n\t\t\tid={this.props.id}\n\t\t\ttargetObj={this.props.targetObj}\n\t\t\tmousePos={this.props.mousePos}\n\t\t\tclassName={[TIP_TYPE_NODE, TIP_TYPE_PORT, TIP_TYPE_DEC, TIP_TYPE_LINK].includes(this.props.type) ? \"definition-tooltip\" : null}\n\t\t/>) : null;\n\t}\n}\n\nCommonCanvasTooltip.propTypes = {\n\t// canvasController provided by common-canvas.jsx\n\tcanvasController: PropTypes.object.isRequired,\n\t// The rest provided by redux\n\tid: PropTypes.string,\n\ttype: PropTypes.oneOf([TIP_TYPE_PALETTE_CATEGORY, TIP_TYPE_PALETTE_ITEM, TIP_TYPE_NODE, TIP_TYPE_PORT, TIP_TYPE_DEC, TIP_TYPE_LINK, TIP_TYPE_STATE_TAG]),\n\ttargetObj: PropTypes.object,\n\tmousePos: PropTypes.object,\n\tcustomContent: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),\n\tnode: PropTypes.object,\n\tport: PropTypes.object,\n\tdecoration: PropTypes.object,\n\tnodeTemplate: PropTypes.object,\n\tcategory: PropTypes.object,\n\tstateTagText: PropTypes.string\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\tid: state.tooltip.id,\n\ttype: state.tooltip.type,\n\ttargetObj: state.tooltip.targetObj,\n\tmousePos: state.tooltip.mousePos,\n\tcustomContent: state.tooltip.customContent,\n\tnode: state.tooltip.node,\n\tport: state.tooltip.port,\n\tdecoration: state.tooltip.decoration,\n\tnodeTemplate: state.tooltip.nodeTemplate,\n\tcategory: state.tooltip.category,\n\tstateTagText: state.tooltip.stateTagText\n});\n\nexport default connect(mapStateToProps)(CommonCanvasTooltip);\n","/*\n * Copyright 2017-2023 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport ContextMenuWrapper from \"../context-menu/context-menu-wrapper.jsx\";\nimport Logger from \"../logging/canvas-logger.js\";\n\nclass CommonCanvasContextMenu extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.logger = new Logger(\"CC-Context-Menu\");\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\tlet contextMenu = null;\n\t\tif (this.props.showContextMenu) {\n\t\t\tcontextMenu = (\n\t\t\t\t<ContextMenuWrapper\n\t\t\t\t\tcontainingDivId={this.props.containingDivId}\n\t\t\t\t\tcontextMenuDef={this.props.contextMenuDef}\n\t\t\t\t\tcontextMenuActionHandler={this.props.canvasController.contextMenuActionHandler}\n\t\t\t\t\tcontextMenuPos={this.props.contextMenuPos}\n\t\t\t\t\tcloseContextMenu={this.props.canvasController.closeContextMenu}\n\t\t\t\t\tstopPropagation\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\t\treturn contextMenu;\n\t}\n}\n\nCommonCanvasContextMenu.propTypes = {\n\t// Provided by CommonCanvas\n\tcanvasController: PropTypes.object.isRequired,\n\tcontainingDivId: PropTypes.string.isRequired,\n\n\t// Provided by redux\n\tcontextMenuDef: PropTypes.array.isRequired,\n\tcontextMenuPos: PropTypes.object.isRequired,\n\tshowContextMenu: PropTypes.bool.isRequired\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\tcontextMenuDef: state.contextmenu.menuDef,\n\tcontextMenuPos: state.contextmenu.source.cmPos || { x: 0, y: 0 },\n\tshowContextMenu: state.contextmenu.isOpen\n});\n\nexport default connect(mapStateToProps)(CommonCanvasContextMenu);\n","var baseFindIndex = require('./_baseFindIndex'),\n baseIteratee = require('./_baseIteratee'),\n toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * This method is like `_.findIndex` except that it iterates over elements\n * of `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n * // => 2\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n * // => 0\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastIndex(users, ['active', false]);\n * // => 2\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastIndex(users, 'active');\n * // => 0\n */\nfunction findLastIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length - 1;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = fromIndex < 0\n ? nativeMax(length + index, 0)\n : nativeMin(index, length - 1);\n }\n return baseFindIndex(array, baseIteratee(predicate, 3), index, true);\n}\n\nmodule.exports = findLastIndex;\n","/*\n * Copyright 2023-2026 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport { findLastIndex } from \"lodash\";\nimport Toolbar from \"../toolbar/toolbar.jsx\";\nimport Logger from \"../logging/canvas-logger.js\";\nimport ColorPicker from \"../color-picker\";\nimport { CAUSE_KEYBOARD } from \"./constants/canvas-constants.js\";\n\nconst CM_TOOLBAR_GAP = 2;\nconst CM_ICON_SIZE = 32; // Icon size for small size toolbar\nconst CM_ICON_PAD = 2;\nconst DIVIDER_SIZE = 1;\nconst ICON_SIZE_PLUS_GAP = CM_ICON_SIZE + CM_TOOLBAR_GAP;\nconst PADDING = 2;\n\nclass CommonCanvasContextToolbar extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.logger = new Logger(\"CC-Context-Toolbar\");\n\t\tthis.onMouseEnter = this.onMouseEnter.bind(this);\n\t\tthis.onMouseLeave = this.onMouseLeave.bind(this);\n\t\tthis.toolbarActionHandler = this.toolbarActionHandler.bind(this);\n\t\tthis.colorClicked = this.colorClicked.bind(this);\n\t\tthis.closeContextToolbar = this.closeContextToolbar.bind(this);\n\t}\n\n\tonMouseLeave(evt) {\n\t\tthis.props.canvasController.setMouseInContextToolbar(false);\n\t\tsetTimeout(() => this.props.canvasController.closeContextToolbar(), 200);\n\t}\n\n\tonMouseEnter(evt) {\n\t\tthis.props.canvasController.setMouseInContextToolbar(true);\n\t}\n\n\tgetToolbarConfig({ toolbarItems, overflowMenuItems }) {\n\t\tconst leftBar = [];\n\t\ttoolbarItems.forEach((item) => leftBar.push(this.getMenuItem(item)));\n\t\toverflowMenuItems.forEach((item) => leftBar.push(this.getMenuItem(item)));\n\t\treturn {\n\t\t\tleftBar: leftBar,\n\t\t\trightBar: []\n\t\t};\n\t}\n\n\tgetMenuItem(menuItem) {\n\t\tif (menuItem.divider) {\n\t\t\treturn { divider: true };\n\t\t}\n\t\tconst subPanelInfo = this.getSubPanelInfo(menuItem);\n\t\tconst subMenu = !subPanelInfo.subPanel && menuItem.menu ? this.getSubMenu(menuItem) : null;\n\n\t\treturn {\n\t\t\taction: menuItem.action,\n\t\t\tlabel: menuItem.label,\n\t\t\tsubMenu: subMenu,\n\t\t\tsubPanel: subPanelInfo.subPanel,\n\t\t\tsubPanelData: subPanelInfo.subPanelData,\n\t\t\tenable: this.getEnable(menuItem),\n\t\t\ticonEnabled: menuItem.icon\n\t\t};\n\t}\n\n\tgetSubPanelInfo(menuItem) {\n\t\tif (menuItem.action === \"colorBackground\") {\n\t\t\treturn { subPanel: ColorPicker, subPanelData: { clickActionHandler: (color, evt) => this.colorClicked(color, evt) } };\n\t\t}\n\t\treturn {};\n\t}\n\n\tgetSubMenu(menuItem) {\n\t\tif (typeof menuItem.menu === \"object\") {\n\t\t\treturn menuItem.menu.map((option) => {\n\t\t\t\tif (option.divider) {\n\t\t\t\t\treturn { divider: true };\n\t\t\t\t}\n\t\t\t\treturn { action: option.action, label: option.label, enable: this.getEnable(option), iconEnabled: option.icon };\n\t\t\t});\n\t\t}\n\t\treturn null;\n\t}\n\n\tgetEnable(menuItem) {\n\t\tif (typeof menuItem.enable === \"undefined\") {\n\t\t\treturn true;\n\t\t}\n\t\treturn menuItem.enable;\n\t}\n\n\t// Returns the width of the context toolbar.\n\tgetContextToolbarWidth(toolbarItems, overflowMenuItems) {\n\t\tconst dividers = toolbarItems.filter((i) => i.divider);\n\t\tconst dividersCount = dividers.length;\n\t\tconst dividersWidth = dividersCount * DIVIDER_SIZE;\n\n\t\t// If there is at least one overflow item, we will need an overflow\n\t\t// icon which will increase the toolbar items by one.\n\t\tconst overflowItemCount = overflowMenuItems.length > 0 ? 1 : 0;\n\t\tconst buttonsCount = toolbarItems.length + overflowItemCount - dividersCount;\n\t\tconst buttonsWidth = (buttonsCount * (CM_ICON_SIZE + CM_ICON_PAD));\n\n\t\t// If we have some overflow menu items, we reduce the width by five pixels\n\t\t// which forces the overflow menu and the overflow icon to be shown. We\n\t\t// use 5 pixels because this is how many are needed to make the toolbar\n\t\t// work correctly with different browser magnifications.\n\t\tconst reduction = overflowMenuItems.length > 0 ? 5 : 0;\n\t\treturn buttonsWidth + dividersWidth - reduction;\n\t}\n\n\t// Removes leading and trailing dividers from the items array and any\n\t// remaining places where there are consecutive dividers are reduced to a\n\t// single divider. These unnecessary dividers may occur because the app's\n\t// contextMenuHandler may return an array which result in these being left\n\t// in the overflowItems array.\n\tremoveUnnecessaryDividers(items) {\n\t\tconst start = items.findIndex((item) => !item.divider);\n\t\tconst end = findLastIndex(items, (item) => !item.divider);\n\t\tconst trimmedItems = items.slice(start, end + 1);\n\n\t\tconst outItems = [];\n\t\tlet previousDivider = false;\n\n\t\ttrimmedItems.forEach((item) => {\n\t\t\tif (item.divider) {\n\t\t\t\tif (!previousDivider) {\n\t\t\t\t\toutItems.push(item);\n\t\t\t\t}\n\t\t\t\tpreviousDivider = true;\n\t\t\t} else {\n\t\t\t\toutItems.push(item);\n\t\t\t\tpreviousDivider = false;\n\t\t\t}\n\t\t});\n\t\treturn outItems;\n\t}\n\n\ttoolbarActionHandler(action, evt, editParam) {\n\t\tthis.closeContextToolbar();\n\t\tthis.props.canvasController.contextMenuActionHandler(action, evt, editParam);\n\t}\n\n\tcloseContextToolbar() {\n\t\tthis.props.canvasController.setMouseInContextToolbar(false);\n\t\tthis.props.canvasController.setMouseInObject(null);\n\t\tthis.props.canvasController.closeContextToolbar(CAUSE_KEYBOARD);\n\t}\n\n\tcolorClicked(color, evt) {\n\t\tthis.toolbarActionHandler(\"colorSelectedObjects\", evt, { color });\n\t}\n\n\tshouldCenterJustifyToolbar() {\n\t\tconst objType = this.props.contextSource.type;\n\t\treturn (\n\t\t\tobjType === \"link\" ||\n\t\t\tobjType === \"canvas\" ||\n\t\t\tobjType === \"input_port\" ||\n\t\t\tobjType === \"output_port\" ||\n\t\t\tobjType === \"node\" &&\n\t\t\t\tthis.props.contextSource.targetObject.layout.contextToolbarPosition === \"topCenter\" &&\n\t\t\t\t!this.props.contextSource.targetObject.is_expanded);\n\t}\n\n\t// Returns adjusted x, y coordinates for the context menu to ensure it appears\n\t// fully within the containing div (viewport).\n\tadjustPosToFit(x, y, width, height) {\n\t\tconst containingDiv = document.getElementById(this.props.containingDivId);\n\t\tconst divRect = containingDiv\n\t\t\t? containingDiv.getBoundingClientRect()\n\t\t\t: { top: -1000, bottom: 1000, left: -1000, right: 1000 }; // To enable Jest tests.\n\n\t\tconst rect = {\n\t\t\tleft: 0,\n\t\t\tright: divRect.right - divRect.left,\n\t\t\ttop: 0,\n\t\t\tbottom: divRect.bottom - divRect.top\n\t\t};\n\n\t\tlet newX = x;\n\t\tlet newY = y;\n\n\t\tconst rightOver = (x + width) - rect.right;\n\t\tconst leftOver = rect.left - x;\n\t\tconst bottomOver = (y + height) - rect.bottom;\n\t\tconst topOver = rect.top - y;\n\n\t\tif (rightOver > 0) {\n\t\t\tnewX -= rightOver + PADDING;\n\n\t\t} else if (leftOver > 0) {\n\t\t\tnewX += leftOver + PADDING;\n\t\t}\n\n\t\tif (bottomOver > 0) {\n\t\t\tnewY -= bottomOver + PADDING;\n\n\t\t} else if (topOver > 0) {\n\t\t\tnewY += topOver + PADDING;\n\t\t}\n\n\t\treturn { x: newX, y: newY };\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\tlet contextToolbar = null;\n\n\t\tif (this.props.showContextMenu) {\n\t\t\tconst toolbarItems = this.props.contextMenuDef.filter((cmItem) => cmItem.toolbarItem);\n\t\t\tlet overflowMenuItems = this.props.contextMenuDef.filter((cmItem) => !cmItem.toolbarItem);\n\t\t\toverflowMenuItems = this.removeUnnecessaryDividers(overflowMenuItems);\n\t\t\tconst toolbarConfig = this.getToolbarConfig({ toolbarItems, overflowMenuItems });\n\t\t\tconst toolbarWidth = this.getContextToolbarWidth(toolbarItems, overflowMenuItems);\n\n\t\t\t// Note: cmPos is already adjusted as a starting point for the context\n\t\t\t// toolbar position by a calculation in svg-canvas-renderer.js.\n\t\t\tconst pos = this.props.contextSource.cmPos || { x: 0, y: 0 };\n\t\t\tlet x = this.shouldCenterJustifyToolbar()\n\t\t\t\t? pos.x - (toolbarWidth / 2)\n\t\t\t\t: pos.x - toolbarWidth;\n\t\t\tlet y = pos.y - ICON_SIZE_PLUS_GAP;\n\n\t\t\t// Make sure the context toolbar is fully inside the viewport.\n\t\t\t({ x, y } = this.adjustPosToFit(x, y, toolbarWidth, ICON_SIZE_PLUS_GAP));\n\n\t\t\t// Only set initial focus if context toolbar was opened via keyboard\n\t\t\tconst setInitialFocus = this.props.contextSource.cause === CAUSE_KEYBOARD;\n\n\t\t\tcontextToolbar = (\n\t\t\t\t<div\n\t\t\t\t\tclassName={\"context-toolbar floating-toolbar\"}\n\t\t\t\t\tstyle={{ left: x, top: y, width: toolbarWidth }}\n\t\t\t\t\tonMouseEnter={this.onMouseEnter}\n\t\t\t\t\tonMouseLeave={this.onMouseLeave}\n\t\t\t\t>\n\t\t\t\t\t<Toolbar\n\t\t\t\t\t\tconfig={toolbarConfig}\n\t\t\t\t\t\tinstanceId={this.props.canvasController.getInstanceId()}\n\t\t\t\t\t\tcontainingDivId={this.props.containingDivId}\n\t\t\t\t\t\ttoolbarActionHandler={this.toolbarActionHandler}\n\t\t\t\t\t\ttooltipDirection={\"top\"}\n\t\t\t\t\t\tsetInitialFocus={setInitialFocus}\n\t\t\t\t\t\tcloseToolbarOnEsc\n\t\t\t\t\t\tcloseToolbar={this.closeContextToolbar}\n\t\t\t\t\t\tsize={\"sm\"}\n\t\t\t\t\t\tadditionalText={{\n\t\t\t\t\t\t\toverflowMenuLabel: this.props.canvasController.labelUtil.getLabel(\"toolbar.overflowMenu\"),\n\t\t\t\t\t\t\tariaLabel: this.props.canvasController.labelUtil.getLabel(\"toolbar.contextToolbarLabel\")\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn contextToolbar;\n\t}\n}\n\nCommonCanvasContextToolbar.propTypes = {\n\t// Provided by CommonCanvas\n\tcanvasController: PropTypes.object.isRequired,\n\tcontainingDivId: PropTypes.string.isRequired,\n\n\t// Provided by redux\n\tcontextMenuDef: PropTypes.array.isRequired,\n\tcontextSource: PropTypes.object.isRequired,\n\tshowContextMenu: PropTypes.bool.isRequired\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\tcontextMenuDef: state.contextmenu.menuDef,\n\tcontextSource: state.contextmenu.source,\n\tshowContextMenu: state.contextmenu.isOpen\n});\n\nexport default connect(mapStateToProps)(CommonCanvasContextToolbar);\n","/*\n * Copyright 2017-2026 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport { injectIntl } from \"react-intl\";\nimport defaultMessages from \"../../locales/common-canvas/locales/en.json\";\nimport defaultToolbarMessages from \"../../locales/toolbar/locales/en.json\";\nimport Toolbar from \"../toolbar/toolbar.jsx\";\nimport CanvasUtils from \"../common-canvas/common-canvas-utils.js\";\nimport KeyboardUtils from \"./keyboard-utils.js\";\nimport Logger from \"../logging/canvas-logger.js\";\nimport ColorPicker from \"../color-picker\";\nimport {\n\tAlignBoxTopCenter, AlignBoxMiddleCenter, AlignBoxBottomCenter,\n\tCode, ColorPalette, Link, ListBulleted, ListNumbered, SquareOutline,\n\tTextAlignCenter, TextAlignLeft, TextAlignRight, TextColor, TextFont, TextIndentMore,\n\tTextBold, TextItalic, TextUnderline, TextScale, TextStrikethrough\n} from \"@carbon/react/icons\";\nimport {\n\tMARKDOWN, WYSIWYG\n} from \"./constants/canvas-constants.js\";\n\nclass CommonCanvasTextToolbar extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.getLabel = this.getLabel.bind(this);\n\t\tthis.onKeyDown = this.onKeyDown.bind(this);\n\n\t\tthis.logger = new Logger(\"CC-Text-Toolbar\");\n\t}\n\n\tonKeyDown(evt) {\n\t\tif (KeyboardUtils.returnToTextEditing(evt)) {\n\t\t\tthis.props.canvasController.focusOnTextEntryElement(evt);\n\t\t\tevt.stopPropagation();\n\t\t\tevt.preventDefault();\n\t\t}\n\t}\n\n\tgetLabel(labelId, substituteObj) {\n\t\tconst defaultMessage = defaultMessages[labelId] ? defaultMessages[labelId] : defaultToolbarMessages[labelId];\n\t\treturn this.props.intl.formatMessage({ id: labelId, defaultMessage: defaultMessage }, substituteObj);\n\t}\n\n\tgetJsxLabel(key, shortcutSuffix, shortcutSuffix2) {\n\t\tconst osKey = CanvasUtils.isMacintosh() ? \"⌘\" : \"Ctrl\";\n\t\tconst shortCut = shortcutSuffix ? (osKey + \" + \" + shortcutSuffix) : null;\n\t\tconst shortCut2 = shortcutSuffix2 ? (osKey + \" + \" + shortcutSuffix2) : null;\n\t\treturn (\n\t\t\t<div>\n\t\t\t\t{this.getLabel(key)}<br />{shortCut}<br />{shortCut2}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tgetMarkdownToolbar() {\n\t\tconst boldLabel = this.getJsxLabel(\"texttoolbar.boldAction\", \"b\");\n\t\tconst italicsLabel = this.getJsxLabel(\"texttoolbar.italicsAction\", \"i\");\n\t\tconst strikethroughLabel = this.getJsxLabel(\"texttoolbar.strikethroughAction\", \"shift + x\");\n\t\tconst headerLabel = this.getJsxLabel(\"texttoolbar.headerAction\", \"1\", \"2\");\n\t\tconst codeLabel = this.getJsxLabel(\"texttoolbar.codeAction\", \"e\");\n\t\tconst linkLabel = this.getJsxLabel(\"texttoolbar.linkAction\", \"k\");\n\t\tconst quoteLabel = this.getJsxLabel(\"texttoolbar.quoteAction\", \"shift + I\");\n\t\tconst numberedListLabel = this.getJsxLabel(\"texttoolbar.numberedListAction\", \"shift + 7\");\n\t\tconst bulletedListLabel = this.getJsxLabel(\"texttoolbar.bulletedListAction\", \"shift + 8\");\n\n\t\tconst headerOptions = [\n\t\t\t{ action: \"title\", label: this.getLabel(\"texttoolbar.titleAction\"), enable: true },\n\t\t\t{ action: \"header\", label: this.getLabel(\"texttoolbar.headerAction\"), enable: true },\n\t\t\t{ action: \"subheader\", label: this.getLabel(\"texttoolbar.subheaderAction\"), enable: true },\n\t\t\t{ action: \"body\", label: this.getLabel(\"texttoolbar.bodyAction\"), enable: true }\n\t\t];\n\n\t\treturn {\n\t\t\tleftBar: [\n\t\t\t\t{ action: \"headerStyle\", tooltip: headerLabel, enable: true, subMenu: headerOptions, closeSubAreaOnClick: true, iconEnabled: (<TextScale size={32} />) },\n\t\t\t\t{ divider: true },\n\t\t\t\t{ action: \"bold\", label: boldLabel, enable: true, iconEnabled: (<TextBold size={32} />) },\n\t\t\t\t{ action: \"italics\", label: italicsLabel, enable: true, iconEnabled: (<TextItalic size={32} />) },\n\t\t\t\t{ action: \"strikethrough\", label: strikethroughLabel, enable: true, iconEnabled: (<TextStrikethrough size={32} />) },\n\t\t\t\t{ divider: true },\n\t\t\t\t{ action: \"code\", label: codeLabel, enable: true, iconEnabled: (<Code size={32} />) },\n\t\t\t\t{ divider: true },\n\t\t\t\t{ action: \"link\", label: linkLabel, enable: true, iconEnabled: (<Link size={32} />) },\n\t\t\t\t{ divider: true },\n\t\t\t\t{ action: \"quote\", label: quoteLabel, enable: true, iconEnabled: (<TextIndentMore size={32} />) },\n\t\t\t\t{ divider: true },\n\t\t\t\t{ action: \"numberedList\", label: numberedListLabel, enable: true, iconEnabled: (<ListNumbered size={32} />) },\n\t\t\t\t{ action: \"bulletedList\", label: bulletedListLabel, enable: true, iconEnabled: (<ListBulleted size={32} />) }\n\t\t\t]\n\t\t};\n\t}\n\n\tgetWysiwygToolbar() {\n\t\tconst boldLabel = this.getLabel(\"texttoolbar.boldAction\");\n\t\tconst italicsLabel = this.getLabel(\"texttoolbar.italicsAction\");\n\t\tconst underlineLabel = this.getLabel(\"texttoolbar.underline\");\n\t\tconst strikethroughLabel = this.getLabel(\"texttoolbar.strikethroughAction\");\n\n\t\t// Set up array for sub-menus. isSelected is set to true for any default option.\n\t\tconst subMenuFont = [\n\t\t\t{ action: \"font-ibm-plex-sans\", label: this.getLabel(\"texttoolbar.fontIBMPlexSans\"), enable: true, isSelected: true },\n\t\t\t{ action: \"font-ibm-plex-serif\", label: this.getLabel(\"texttoolbar.fontIBMPlexSerif\"), enable: true },\n\t\t\t{ action: \"font-ibm-plex-sans-condensed\", label: this.getLabel(\"texttoolbar.fontIBMPlexSansCon\"), enable: true },\n\t\t\t{ action: \"font-ibm-plex-mono\", label: this.getLabel(\"texttoolbar.fontIBMPlexMono\"), enable: true },\n\t\t\t{ action: \"font-arial\", label: this.getLabel(\"texttoolbar.fontArial\"), enable: true },\n\t\t\t{ action: \"font-comic-sans-ms\", label: this.getLabel(\"texttoolbar.fontComicSansMS\"), enable: true },\n\t\t\t{ action: \"font-gill-sans\", label: this.getLabel(\"texttoolbar.fontGillSans\"), enable: true },\n\t\t\t{ action: \"font-helvetica-neue\", label: this.getLabel(\"texttoolbar.fontHelveticaNeue\"), enable: true },\n\t\t\t{ action: \"font-times-new-roman\", label: this.getLabel(\"texttoolbar.fontTimesNewRoman\"), enable: true },\n\t\t\t{ action: \"font-verdana\", label: this.getLabel(\"texttoolbar.fontVerdana\"), enable: true }\n\t\t];\n\n\t\tconst subMenuTextSize = [\n\t\t\t{ action: \"text-size-10\", label: \"10\", enable: true },\n\t\t\t{ action: \"text-size-11\", label: \"11\", enable: true },\n\t\t\t{ action: \"text-size-12\", label: \"12\", enable: true, isSelected: true },\n\t\t\t{ action: \"text-size-14\", label: \"14\", enable: true },\n\t\t\t{ action: \"text-size-18\", label: \"18\", enable: true },\n\t\t\t{ action: \"text-size-24\", label: \"24\", enable: true },\n\t\t\t{ action: \"text-size-30\", label: \"30\", enable: true },\n\t\t\t{ action: \"text-size-36\", label: \"36\", enable: true },\n\t\t\t{ action: \"text-size-48\", label: \"48\", enable: true },\n\t\t\t{ action: \"text-size-60\", label: \"60\", enable: true },\n\t\t\t{ action: \"text-size-72\", label: \"72\", enable: true },\n\t\t\t{ action: \"text-size-96\", label: \"96\", enable: true }\n\t\t];\n\n\t\tconst subMenuAlignHorizontal = [\n\t\t\t{ action: \"align-left\", label: this.getLabel(\"texttoolbar.alignHorizLeft\"), enable: true, iconEnabled: (<TextAlignLeft size={32} />), isSelected: true },\n\t\t\t{ action: \"align-center\", label: this.getLabel(\"texttoolbar.alignHorizCenter\"), enable: true, iconEnabled: (<TextAlignCenter size={32} />) },\n\t\t\t{ action: \"align-right\", label: this.getLabel(\"texttoolbar.alignHorizRight\"), enable: true, iconEnabled: (<TextAlignRight size={32} />) }\n\t\t];\n\n\t\tconst subMenuAlignVertical = [\n\t\t\t{ action: \"align-top\", label: this.getLabel(\"texttoolbar.alignVertTop\"), enable: true, iconEnabled: (<AlignBoxTopCenter size={32} />), isSelected: true },\n\t\t\t{ action: \"align-middle\", label: this.getLabel(\"texttoolbar.alignVertMiddle\"), enable: true, iconEnabled: (<AlignBoxMiddleCenter size={32} />) },\n\t\t\t{ action: \"align-bottom\", label: this.getLabel(\"texttoolbar.alignVertBottom\"), enable: true, iconEnabled: (<AlignBoxBottomCenter size={32} />) }\n\t\t];\n\n\t\tconst subMenuOutline = [\n\t\t\t{ action: \"outline-none\", label: this.getLabel(\"texttoolbar.outlineNone\"), enable: true },\n\t\t\t{ action: \"outline-solid\", label: this.getLabel(\"texttoolbar.outlineSolid\"), enable: true, isSelected: true }\n\t\t];\n\n\t\t// In the arrays above the default option has its isSelected field set to true. We\n\t\t// now override the isSelected field, if necessary, for all menus, based on whether\n\t\t// the corresponding format has been set in the formats array. So if, for example, the\n\t\t// font is set to 'Comic Sans' the element for that font in subMenuFont will have its\n\t\t// isSelected field set to true and the element for the default font or previously\n\t\t// selected font will have its isSelected field set to false.\n\t\tthis.setSelectedMenuElement(\"fontType\", this.props.formats, subMenuFont);\n\t\tthis.setSelectedMenuElement(\"textSize\", this.props.formats, subMenuTextSize);\n\t\tthis.setSelectedMenuElement(\"alignHorizontally\", this.props.formats, subMenuAlignHorizontal);\n\t\tthis.setSelectedMenuElement(\"alignVertically\", this.props.formats, subMenuAlignVertical);\n\t\tthis.setSelectedMenuElement(\"outlineStyle\", this.props.formats, subMenuOutline);\n\n\t\t// Get current values (or defaults) for text and background color.\n\t\tconst selectedTextColor = (this.getFormatValue(\"textColor\", this.props.formats) || \"#000000\");\n\t\tconst selectedBackgroundColor = (this.getFormatValue(\"backgroundColor\", this.props.formats) || \"#FFFFFF\");\n\n\t\t// Get the current values (or defaults) for bold/italics/underline/strikethrough attributes\n\t\tconst boldSelected = (Boolean)(this.getFormatType(\"bold\", this.props.formats));\n\t\tconst italicsSelected = (Boolean)(this.getFormatType(\"italics\", this.props.formats));\n\t\tconst textDec = this.getFormatValue(\"textDecoration\", this.props.formats);\n\t\tconst underlineSelected = textDec?.includes(\"underline\");\n\t\tconst strikethroughSelected = textDec?.includes(\"strikethrough\");\n\n\t\treturn {\n\t\t\tleftBar: [\n\t\t\t\t{ action: \"submenu-font\",\n\t\t\t\t\tlabel: this.getLabel(\"texttoolbar.fontAction\"),\n\t\t\t\t\ticonEnabled: (<TextFont size={32} />),\n\t\t\t\t\tenable: true,\n\t\t\t\t\tsubMenu: subMenuFont,\n\t\t\t\t\tcloseSubAreaOnClick: true\n\t\t\t\t},\n\t\t\t\t{ action: \"submenu-text-size\",\n\t\t\t\t\tlabel: this.getLabel(\"texttoolbar.textSize\"),\n\t\t\t\t\ticonEnabled: (<TextScale size={32} />),\n\t\t\t\t\tenable: true,\n\t\t\t\t\tsubMenu: subMenuTextSize,\n\t\t\t\t\tcloseSubAreaOnClick: true\n\t\t\t\t},\n\t\t\t\t{ action: \"bold\", label: boldLabel, enable: true, iconEnabled: (<TextBold size={32} />), isSelected: boldSelected },\n\t\t\t\t{ action: \"italics\", label: italicsLabel, enable: true, iconEnabled: (<TextItalic size={32} />), isSelected: italicsSelected },\n\t\t\t\t{ action: \"underline\", label: underlineLabel, enable: true, iconEnabled: (<TextUnderline size={32} />), isSelected: underlineSelected },\n\t\t\t\t{ action: \"strikethrough\", label: strikethroughLabel, enable: true, iconEnabled: (<TextStrikethrough size={32} />), isSelected: strikethroughSelected },\n\t\t\t\t{ divider: true },\n\t\t\t\t{ action: \"submenu-text-color\",\n\t\t\t\t\tlabel: this.getLabel(\"texttoolbar.colorText\"),\n\t\t\t\t\ticonEnabled: (<TextColor size={32} />),\n\t\t\t\t\tenable: true,\n\t\t\t\t\tsubPanel: ColorPicker,\n\t\t\t\t\tsubPanelData: {\n\t\t\t\t\t\ttype: WYSIWYG,\n\t\t\t\t\t\tselectedColor: selectedTextColor,\n\t\t\t\t\t\tclickActionHandler: (color, evt) => this.props.actionHandler(\"text-color\", evt, color)\n\t\t\t\t\t},\n\t\t\t\t\tcloseSubAreaOnClick: true\n\t\t\t\t},\n\t\t\t\t{ action: \"submenu-align-horiz\",\n\t\t\t\t\tlabel: this.getLabel(\"texttoolbar.alignHoriz\"),\n\t\t\t\t\ticonEnabled: (<TextAlignCenter size={32} />),\n\t\t\t\t\tenable: true,\n\t\t\t\t\tsubMenu: subMenuAlignHorizontal,\n\t\t\t\t\tcloseSubAreaOnClick: true\n\t\t\t\t},\n\t\t\t\t{ action: \"submenu-align-vert\",\n\t\t\t\t\tlabel: this.getLabel(\"texttoolbar.alignVert\"),\n\t\t\t\t\ticonEnabled: (<AlignBoxMiddleCenter size={32} />),\n\t\t\t\t\tenable: true,\n\t\t\t\t\tsubMenu: subMenuAlignVertical,\n\t\t\t\t\tcloseSubAreaOnClick: true\n\t\t\t\t},\n\t\t\t\t{ action: \"submenu-background-color\",\n\t\t\t\t\tlabel: this.getLabel(\"texttoolbar.colorBackground\"),\n\t\t\t\t\ticonEnabled: (<ColorPalette size={32} />),\n\t\t\t\t\tenable: true,\n\t\t\t\t\tsubPanel: ColorPicker,\n\t\t\t\t\tsubPanelData: {\n\t\t\t\t\t\ttype: WYSIWYG,\n\t\t\t\t\t\tselectedColor: selectedBackgroundColor,\n\t\t\t\t\t\tclickActionHandler: (color, evt) => this.props.actionHandler(\"background-color\", evt, color)\n\t\t\t\t\t},\n\t\t\t\t\tcloseSubAreaOnClick: true\n\t\t\t\t},\n\t\t\t\t{ action: \"sub-menu-outline\",\n\t\t\t\t\tlabel: this.getLabel(\"texttoolbar.outline\"),\n\t\t\t\t\ticonEnabled: (<SquareOutline size={32} />),\n\t\t\t\t\tenable: true,\n\t\t\t\t\tsubMenu: subMenuOutline,\n\t\t\t\t\tcloseSubAreaOnClick: true\n\t\t\t\t}\n\t\t\t]\n\t\t};\n\t}\n\n\t// Sets the isSelected field to true of the element in the menu\n\t// passed in corresponding to the currently specified value for that menu\n\t// in the formats array,\n\tsetSelectedMenuElement(type, formats, menu) {\n\t\tconst value = this.getFormatValue(type, formats);\n\t\tif (value) {\n\t\t\tmenu.forEach((me) => (me.isSelected = (me.action === value)));\n\t\t}\n\t}\n\n\t// Returns the value for the format type passed in from the array of\n\t// formats passed in.\n\tgetFormatValue(type, formats) {\n\t\tconst format = this.getFormatType(type, formats);\n\t\treturn format?.value;\n\t}\n\n\t// Returns the format for the type passed in from the array of\n\t// formats passed in.\n\tgetFormatType(type, formats) {\n\t\tif (formats) {\n\t\t\treturn formats.find((f) => f.type === type);\n\t\t}\n\t\treturn null;\n\t}\n\n\tgetTextToolbarConfig() {\n\t\tif (this.props.contentType === MARKDOWN) {\n\t\t\treturn this.getMarkdownToolbar();\n\n\t\t} else if (this.props.contentType === WYSIWYG) {\n\t\t\treturn this.getWysiwygToolbar();\n\t\t}\n\n\t\treturn { leftBar: [] };\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\tlet textToolbar = null;\n\n\t\tif (this.props.isOpen) {\n\t\t\ttextToolbar = (\n\t\t\t\t<div\n\t\t\t\t\tclassName={\"text-toolbar floating-toolbar\"}\n\t\t\t\t\tstyle={{ left: this.props.pos_x, top: this.props.pos_y }}\n\t\t\t\t\tonBlur={this.props.blurHandler}\n\t\t\t\t\tonKeyDown={this.onKeyDown}\n\t\t\t\t>\n\t\t\t\t\t<Toolbar\n\t\t\t\t\t\tconfig={this.getTextToolbarConfig()}\n\t\t\t\t\t\tinstanceId={this.props.canvasController.getInstanceId()}\n\t\t\t\t\t\tcontainingDivId={this.props.containingDivId}\n\t\t\t\t\t\ttoolbarActionHandler={this.props.actionHandler}\n\t\t\t\t\t\ttooltipDirection={\"top\"}\n\t\t\t\t\t\tsize={\"sm\"}\n\t\t\t\t\t\tadditionalText={{\n\t\t\t\t\t\t\toverflowMenuLabel: this.getLabel(\"toolbar.overflowMenu\"),\n\t\t\t\t\t\t\tariaLabel: this.getLabel(\"toolbar.textToolbarLabel\")\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn textToolbar;\n\t}\n}\n\nCommonCanvasTextToolbar.propTypes = {\n\t// Provided by CommonCanvas\n\tintl: PropTypes.object.isRequired,\n\tcanvasController: PropTypes.object.isRequired,\n\tcontainingDivId: PropTypes.string,\n\n\t// Provided by redux\n\tisOpen: PropTypes.bool.isRequired,\n\tpos_x: PropTypes.number,\n\tpos_y: PropTypes.number,\n\tformats: PropTypes.array,\n\tcontentType: PropTypes.oneOf([MARKDOWN, WYSIWYG]),\n\tactionHandler: PropTypes.func,\n\tblurHandler: PropTypes.func\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\tisOpen: state.texttoolbar.isOpen,\n\tpos_x: state.texttoolbar.pos_x,\n\tpos_y: state.texttoolbar.pos_y,\n\tformats: state.texttoolbar.formats,\n\tcontentType: state.texttoolbar.contentType,\n\tactionHandler: state.texttoolbar.actionHandler,\n\tblurHandler: state.texttoolbar.blurHandler\n});\n\nexport default connect(mapStateToProps)(injectIntl(CommonCanvasTextToolbar));\n","/*\n * Copyright 2017-2023 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport Logger from \"../logging/canvas-logger.js\";\nimport defaultMessages from \"../../locales/common-canvas/locales/en.json\";\nimport { injectIntl } from \"react-intl\";\nimport { Locked, EditOff } from \"@carbon/react/icons\";\nimport { STATE_TAG_LOCKED, STATE_TAG_READ_ONLY, TIP_TYPE_STATE_TAG }\n\tfrom \"../common-canvas/constants/canvas-constants.js\";\n\nclass CommonCanvasStateTag extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.logger = new Logger(\"CC-StateTag\");\n\n\t\tthis.onMouseOver = this.onMouseOver.bind(this);\n\t\tthis.onMouseLeave = this.onMouseLeave.bind(this);\n\t}\n\n\tonMouseOver(ev) {\n\t\tlet tipText;\n\n\t\tif (this.props.stateTagType === STATE_TAG_LOCKED) {\n\t\t\ttipText = this.getLabel(\"canvas.stateTagTipLocked\");\n\n\t\t} else if (this.props.stateTagType === STATE_TAG_READ_ONLY) {\n\t\t\ttipText = this.getLabel(\"canvas.stateTagTipReadOnly\");\n\t\t}\n\n\t\tthis.props.canvasController.openTip({\n\t\t\tid: \"stateTagTip\",\n\t\t\ttype: TIP_TYPE_STATE_TAG,\n\t\t\tstateTagType: this.props.stateTagType,\n\t\t\tstateTagText: tipText,\n\t\t\ttargetObj: ev.currentTarget\n\t\t});\n\t}\n\n\tonMouseLeave() {\n\t\tthis.props.canvasController.closeTip();\n\t}\n\n\tgetLabel(labelId) {\n\t\treturn this.props.intl.formatMessage({ id: labelId, defaultMessage: defaultMessages[labelId] });\n\t}\n\n\tgetStateTag(label, icon) {\n\t\treturn (\n\t\t\t<div className={\"state-tag\"}\n\t\t\t\tonMouseOver={this.onMouseOver}\n\t\t\t\tonMouseLeave={this.onMouseLeave}\n\t\t\t>\n\t\t\t\t{icon}\n\t\t\t\t<span>{label}</span>\n\t\t\t</div>\n\t\t);\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\tlet stateTag = null;\n\n\t\tif (this.props.stateTagType === STATE_TAG_LOCKED) {\n\t\t\tconst label = this.getLabel(\"canvas.stateTagLocked\");\n\t\t\tstateTag = this.getStateTag(label, (<Locked />));\n\n\t\t} else if (this.props.stateTagType === STATE_TAG_READ_ONLY) {\n\t\t\tconst label = this.getLabel(\"canvas.stateTagReadOnly\");\n\t\t\tstateTag = this.getStateTag(label, (<EditOff />));\n\t\t}\n\n\t\treturn stateTag;\n\t}\n}\n\nCommonCanvasStateTag.propTypes = {\n\t// Provided by CommonCanvas\n\tintl: PropTypes.object.isRequired,\n\tstateTagType: PropTypes.string,\n\tcanvasController: PropTypes.object\n};\n\nexport default injectIntl(CommonCanvasStateTag);\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n","import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n","function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n","// Given something array like (or null), returns something that is strictly an\n// array. This is used to ensure that array-like objects passed to d3.selectAll\n// or selection.selectAll are converted into proper arrays when creating a\n// selection; we don’t ever want to create a selection backed by a live\n// HTMLCollection or NodeList. However, note that selection.selectAll will use a\n// static NodeList as a group, since it safely derived from querySelectorAll.\nexport default function array(x) {\n return x == null ? [] : Array.isArray(x) ? x : Array.from(x);\n}\n","function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n","export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n","import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return Array.from(this.children);\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","export default function(update) {\n return new Array(update.length);\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n\n// Given some data, this returns an array-like view of it: an object that\n// exposes a length property and allows numeric indexing. Note that unlike\n// selectAll, this isn’t worried about “live” collections because the resulting\n// array will only be used briefly while data is being bound. (It is possible to\n// cause the data to change while iterating by using a key function, but please\n// don’t; we’d rather avoid a gratuitous copy.)\nfunction arraylike(data) {\n return typeof data === \"object\" && \"length\" in data\n ? data // Array, TypedArray, NodeList, array-like\n : Array.from(data); // Map, Set, iterable, string, or anything else\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n","import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n","function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n","function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n","function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n","function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n","function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n","import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n","function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n","function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n","import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n","import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n","import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n","import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n return array(select.apply(this, arguments));\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n","import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n if (typeof onenter === \"function\") {\n enter = onenter(enter);\n if (enter) enter = enter.selection();\n } else {\n enter = enter.append(onenter + \"\");\n }\n if (onupdate != null) {\n update = onupdate(update);\n if (update) update = update.selection();\n }\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(context) {\n var selection = context.selection ? context.selection() : context;\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n","export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n","export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n","export default function() {\n return Array.from(this);\n}\n","export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n","export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n","export default function() {\n return !this.node();\n}\n","export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n","import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n","export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n","export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n","var nextId = 0;\n\nexport default function local() {\n return new Local;\n}\n\nfunction Local() {\n this._ = \"@\" + (++nextId).toString(36);\n}\n\nLocal.prototype = local.prototype = {\n constructor: Local,\n get: function(node) {\n var id = this._;\n while (!(id in node)) if (!(node = node.parentNode)) return;\n return node[id];\n },\n set: function(node, value) {\n return node[this._] = value;\n },\n remove: function(node) {\n return this._ in node && delete node[this._];\n },\n toString: function() {\n return this._;\n }\n};\n","export default function(event) {\n let sourceEvent;\n while (sourceEvent = event.sourceEvent) event = sourceEvent;\n return event;\n}\n","import sourceEvent from \"./sourceEvent.js\";\n\nexport default function(event, node) {\n event = sourceEvent(event);\n if (node === undefined) node = event.currentTarget;\n if (node) {\n var svg = node.ownerSVGElement || node;\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n point.x = event.clientX, point.y = event.clientY;\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n }\n if (node.getBoundingClientRect) {\n var rect = node.getBoundingClientRect();\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n }\n }\n return [event.pageX, event.pageY];\n}\n","import creator from \"./creator.js\";\nimport select from \"./select.js\";\n\nexport default function(name) {\n return select(creator(name).call(document.documentElement));\n}\n","import pointer from \"./pointer.js\";\nimport sourceEvent from \"./sourceEvent.js\";\n\nexport default function(events, node) {\n if (events.target) { // i.e., instanceof Event, not TouchList or iterable\n events = sourceEvent(events);\n if (node === undefined) node = events.currentTarget;\n events = events.touches || [events];\n }\n return Array.from(events, event => pointer(event, node));\n}\n","import array from \"./array.js\";\nimport {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([document.querySelectorAll(selector)], [document.documentElement])\n : new Selection([array(selector)], root);\n}\n","var baseForOwn = require('./_baseForOwn'),\n castFunction = require('./_castFunction');\n\n/**\n * Iterates over own enumerable string keyed properties of an object and\n * invokes `iteratee` for each property. The iteratee is invoked with three\n * arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwnRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forOwn(object, iteratee) {\n return object && baseForOwn(object, castFunction(iteratee));\n}\n\nmodule.exports = forOwn;\n","/**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyOf(object) {\n return function(key) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = basePropertyOf;\n","var escapeHtmlChar = require('./_escapeHtmlChar'),\n toString = require('./toString');\n\n/** Used to match HTML entities and HTML characters. */\nvar reUnescapedHtml = /[&<>\"']/g,\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n/**\n * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n * corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional\n * characters use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the \">\" character is escaped for symmetry, characters like\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n * unless they're part of a tag or unquoted attribute value. See\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under \"semi-related fun fact\") for more details.\n *\n * When working with HTML you should always\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n * XSS vectors.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('fred, barney, & pebbles');\n * // => 'fred, barney, & pebbles'\n */\nfunction escape(string) {\n string = toString(string);\n return (string && reHasUnescapedHtml.test(string))\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\n : string;\n}\n\nmodule.exports = escape;\n","var basePropertyOf = require('./_basePropertyOf');\n\n/** Used to map characters to HTML entities. */\nvar htmlEscapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n};\n\n/**\n * Used by `_.escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\nvar escapeHtmlChar = basePropertyOf(htmlEscapes);\n\nmodule.exports = escapeHtmlChar;\n","function responseBlob(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.blob();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseBlob);\n}\n","function responseArrayBuffer(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.arrayBuffer();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseArrayBuffer);\n}\n","var EOL = {},\n EOF = {},\n QUOTE = 34,\n NEWLINE = 10,\n RETURN = 13;\n\nfunction objectConverter(columns) {\n return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n return JSON.stringify(name) + \": d[\" + i + \"] || \\\"\\\"\";\n }).join(\",\") + \"}\");\n}\n\nfunction customConverter(columns, f) {\n var object = objectConverter(columns);\n return function(row, i) {\n return f(object(row), i, columns);\n };\n}\n\n// Compute unique columns in order of discovery.\nfunction inferColumns(rows) {\n var columnSet = Object.create(null),\n columns = [];\n\n rows.forEach(function(row) {\n for (var column in row) {\n if (!(column in columnSet)) {\n columns.push(columnSet[column] = column);\n }\n }\n });\n\n return columns;\n}\n\nfunction pad(value, width) {\n var s = value + \"\", length = s.length;\n return length < width ? new Array(width - length + 1).join(0) + s : s;\n}\n\nfunction formatYear(year) {\n return year < 0 ? \"-\" + pad(-year, 6)\n : year > 9999 ? \"+\" + pad(year, 6)\n : pad(year, 4);\n}\n\nfunction formatDate(date) {\n var hours = date.getUTCHours(),\n minutes = date.getUTCMinutes(),\n seconds = date.getUTCSeconds(),\n milliseconds = date.getUTCMilliseconds();\n return isNaN(date) ? \"Invalid Date\"\n : formatYear(date.getUTCFullYear(), 4) + \"-\" + pad(date.getUTCMonth() + 1, 2) + \"-\" + pad(date.getUTCDate(), 2)\n + (milliseconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \".\" + pad(milliseconds, 3) + \"Z\"\n : seconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \"Z\"\n : minutes || hours ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \"Z\"\n : \"\");\n}\n\nexport default function(delimiter) {\n var reFormat = new RegExp(\"[\\\"\" + delimiter + \"\\n\\r]\"),\n DELIMITER = delimiter.charCodeAt(0);\n\n function parse(text, f) {\n var convert, columns, rows = parseRows(text, function(row, i) {\n if (convert) return convert(row, i - 1);\n columns = row, convert = f ? customConverter(row, f) : objectConverter(row);\n });\n rows.columns = columns || [];\n return rows;\n }\n\n function parseRows(text, f) {\n var rows = [], // output rows\n N = text.length,\n I = 0, // current character index\n n = 0, // current line number\n t, // current token\n eof = N <= 0, // current token followed by EOF?\n eol = false; // current token followed by EOL?\n\n // Strip the trailing newline.\n if (text.charCodeAt(N - 1) === NEWLINE) --N;\n if (text.charCodeAt(N - 1) === RETURN) --N;\n\n function token() {\n if (eof) return EOF;\n if (eol) return eol = false, EOL;\n\n // Unescape quotes.\n var i, j = I, c;\n if (text.charCodeAt(j) === QUOTE) {\n while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);\n if ((i = I) >= N) eof = true;\n else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n return text.slice(j + 1, i - 1).replace(/\"\"/g, \"\\\"\");\n }\n\n // Find next delimiter or newline.\n while (I < N) {\n if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n else if (c !== DELIMITER) continue;\n return text.slice(j, i);\n }\n\n // Return last token before EOF.\n return eof = true, text.slice(j, N);\n }\n\n while ((t = token()) !== EOF) {\n var row = [];\n while (t !== EOL && t !== EOF) row.push(t), t = token();\n if (f && (row = f(row, n++)) == null) continue;\n rows.push(row);\n }\n\n return rows;\n }\n\n function preformatBody(rows, columns) {\n return rows.map(function(row) {\n return columns.map(function(column) {\n return formatValue(row[column]);\n }).join(delimiter);\n });\n }\n\n function format(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join(\"\\n\");\n }\n\n function formatBody(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return preformatBody(rows, columns).join(\"\\n\");\n }\n\n function formatRows(rows) {\n return rows.map(formatRow).join(\"\\n\");\n }\n\n function formatRow(row) {\n return row.map(formatValue).join(delimiter);\n }\n\n function formatValue(value) {\n return value == null ? \"\"\n : value instanceof Date ? formatDate(value)\n : reFormat.test(value += \"\") ? \"\\\"\" + value.replace(/\"/g, \"\\\"\\\"\") + \"\\\"\"\n : value;\n }\n\n return {\n parse: parse,\n parseRows: parseRows,\n format: format,\n formatBody: formatBody,\n formatRows: formatRows,\n formatRow: formatRow,\n formatValue: formatValue\n };\n}\n","import dsv from \"./dsv.js\";\n\nvar csv = dsv(\",\");\n\nexport var csvParse = csv.parse;\nexport var csvParseRows = csv.parseRows;\nexport var csvFormat = csv.format;\nexport var csvFormatBody = csv.formatBody;\nexport var csvFormatRows = csv.formatRows;\nexport var csvFormatRow = csv.formatRow;\nexport var csvFormatValue = csv.formatValue;\n","import dsv from \"./dsv.js\";\n\nvar tsv = dsv(\"\\t\");\n\nexport var tsvParse = tsv.parse;\nexport var tsvParseRows = tsv.parseRows;\nexport var tsvFormat = tsv.format;\nexport var tsvFormatBody = tsv.formatBody;\nexport var tsvFormatRows = tsv.formatRows;\nexport var tsvFormatRow = tsv.formatRow;\nexport var tsvFormatValue = tsv.formatValue;\n","function responseText(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.text();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseText);\n}\n","import {csvParse, dsvFormat, tsvParse} from \"d3-dsv\";\nimport text from \"./text.js\";\n\nfunction dsvParse(parse) {\n return function(input, init, row) {\n if (arguments.length === 2 && typeof init === \"function\") row = init, init = undefined;\n return text(input, init).then(function(response) {\n return parse(response, row);\n });\n };\n}\n\nexport default function dsv(delimiter, input, init, row) {\n if (arguments.length === 3 && typeof init === \"function\") row = init, init = undefined;\n var format = dsvFormat(delimiter);\n return text(input, init).then(function(response) {\n return format.parse(response, row);\n });\n}\n\nexport var csv = dsvParse(csvParse);\nexport var tsv = dsvParse(tsvParse);\n","function responseJson(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n if (response.status === 204 || response.status === 205) return;\n return response.json();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseJson);\n}\n","import text from \"./text.js\";\n\nfunction parser(type) {\n return (input, init) => text(input, init)\n .then(text => (new DOMParser).parseFromString(text, type));\n}\n\nexport default parser(\"application/xml\");\n\nexport var html = parser(\"text/html\");\n\nexport var svg = parser(\"image/svg+xml\");\n","export default function(input, init) {\n return new Promise(function(resolve, reject) {\n var image = new Image;\n for (var key in init) image[key] = init[key];\n image.onerror = reject;\n image.onload = function() { resolve(image); };\n image.src = input;\n });\n}\n","/*\n * Copyright 2017-2023 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport default class SvgCanvasDisplay {\n\tconstructor(canvasController, isSubflow, pipelineId, breadcrumbs) {\n\t\tthis.canvasController = canvasController;\n\t\tthis.isSubflow = isSubflow;\n\t\tthis.pipelineId = pipelineId;\n\t\tthis.breadcrumbs = breadcrumbs;\n\t}\n\n\tisDisplayingCurrentPipeline() {\n\t\tconst currentBreadcrumb = this.breadcrumbs[this.breadcrumbs.length - 1];\n\t\treturn currentBreadcrumb.pipelineId === this.pipelineId;\n\t}\n\n\tsetDisplayState() {\n\t\tif (this.breadcrumbs.length > 1 &&\n\t\t\t\tthis.isDisplayingCurrentPipeline()) {\n\t\t\tthis.displayState = \"sub-flow-full-page\";\n\n\t\t} else if (this.isSubflow) {\n\t\t\tthis.displayState = \"sub-flow-in-place\";\n\n\t\t} else {\n\t\t\tthis.displayState = \"primary-flow-full-page\";\n\t\t}\n\t}\n\n\tgetDisplayStateMsg() {\n\t\treturn \"Display state set to \" + this.displayState;\n\t}\n\n\tisDisplayingPrimaryFlowFullPage() {\n\t\treturn this.displayState === \"primary-flow-full-page\";\n\t}\n\n\tisDisplayingSubFlow() {\n\t\treturn this.displayState === \"sub-flow-in-place\" || this.displayState === \"sub-flow-full-page\";\n\t}\n\n\tisDisplayingSubFlowInPlace() {\n\t\treturn this.displayState === \"sub-flow-in-place\";\n\t}\n\n\tisDisplayingSubFlowFullPage() {\n\t\treturn this.displayState === \"sub-flow-full-page\";\n\t}\n\n\tisDisplayingFullPage() {\n\t\treturn this.displayState === \"primary-flow-full-page\" || this.displayState === \"sub-flow-full-page\";\n\t}\n}\n","/*\n * Copyright 2017-2026 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport CanvasUtils from \"./common-canvas-utils.js\";\nimport { ERROR, WARNING, NODE_ERROR_ICON, NODE_WARNING_ICON,\n\tTEXT_AREA_BORDER_ADJUSTMENT } from \"./constants/canvas-constants\";\n\n// Map defining the display order of node child elements\n// Lower numbers are rendered first (appear behind higher numbers)\nconst NODE_ELEMENT_ORDER = new Map([\n\t[\"d3-focus-path\", 1],\n\t[\"d3-node-sizing\", 2],\n\t[\"d3-node-selection-highlight\", 3],\n\t[\"d3-node-body-outline\", 4],\n\t[\"d3-foreign-object-external-node\", 5],\n\t[\"d3-node-image\", 6],\n\t[\"d3-foreign-object-node-label\", 7],\n\t[\"d3-node-ellipsis-group\", 8],\n\t[\"d3-node-super-expand-icon-group\", 9],\n\t[\"d3-node-port-input\", 10],\n\t[\"d3-node-port-output\", 10], // Ports have same priority\n\t[\"d3-svg-canvas-underlay\", 11], // Supernode contents\n\t[\"d3-node-error-marker\", 12],\n\t[\"d3-node-dec-group\", 13]\n]);\n\nconst DEFAULT_ELEMENT_INDEX = 999;\nexport default class SvgCanvasNodes {\n\tconstructor(canvasLayout) {\n\t\tthis.canvasLayout = canvasLayout;\n\t}\n\n\t// Returns the element before which a new node element should be inserted to\n\t// maintain the correct display order. The order is:\n\t// 1. focus outline, 2. sizing area, 3. selection highlighting, 4. node body,\n\t// 5. foreign object for React object, 6. node image, 7. node label,\n\t// 8. ellipsis icon, 9. supernode expansion icon, 10. ports, 11. supernode contents,\n\t// 12. error marker, 13. decorations\n\tgetBeforeElement(nodeGrp, newElementClass) {\n\t\tif (!nodeGrp?.children) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst newElementIndex = NODE_ELEMENT_ORDER.get(newElementClass) ?? DEFAULT_ELEMENT_INDEX;\n\n\t\t// Find the first child element that should come after the new element\n\t\treturn this.getNextChildElement(nodeGrp, newElementIndex);\n\t}\n\n\t// Get the next child, if one exists, in the nodeGrp's children after\n\t// the one at newElementIndex\n\tgetNextChildElement(nodeGrp, newElementIndex) {\n\t\tconst childrenArray = Array.from(nodeGrp.children);\n\t\tconst found = childrenArray.find((child) =>\n\t\t\tthis.shouldChildComeAfter(child, newElementIndex));\n\n\t\treturn found ?? null;\n\t}\n\n\t// Returns true if the child element should come after an element with the given order\n\tshouldChildComeAfter(child, targetOrder) {\n\t\tconst classList = child.classList;\n\t\tfor (const className of classList) {\n\t\t\tconst order = NODE_ELEMENT_ORDER.get(className);\n\t\t\tif (typeof order !== \"undefined\" && order > targetOrder) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tisPointInNodeBoundary(pos, node) {\n\t\treturn pos.x >= node.x_pos &&\n\t\t\tpos.x <= node.x_pos + node.width &&\n\t\t\tpos.y >= node.y_pos &&\n\t\t\tpos.y <= node.y_pos + node.height;\n\t}\n\n\tgetNodeLabelClass(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn \"d3-node-label d3-label-single-line \" + this.getMessageLabelClass(node.messages);\n\t\t}\n\t\tconst lineTypeClass = node.layout.labelSingleLine ? \" d3-label-single-line\" : \" d3-label-multi-line\";\n\t\tconst justificationClass = node.layout.labelAlign === \"center\" ? \" d3-label-center\" : \"\";\n\t\treturn \"d3-node-label \" + this.getMessageLabelClass(node.messages) + lineTypeClass + justificationClass;\n\t}\n\n\tgetNodeLabelTextAreaClass(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn \"d3-node-label-entry d3-label-single-line\";\n\t\t}\n\t\tconst lineTypeClass = node.layout.labelSingleLine ? \" d3-label-single-line\" : \" d3-label-multi-line\";\n\t\tconst justificationClass = node.layout.labelAlign === \"center\" ? \" d3-label-center\" : \"\";\n\t\treturn \"d3-node-label-entry\" + lineTypeClass + justificationClass;\n\t}\n\n\tgetErrorMarkerIcon(data) {\n\t\tconst messageLevel = this.getMessageLevel(data.messages);\n\t\tlet iconPath = \"\";\n\t\tswitch (messageLevel) {\n\t\tcase ERROR:\n\t\t\ticonPath = NODE_ERROR_ICON;\n\t\t\tbreak;\n\t\tcase WARNING:\n\t\t\ticonPath = NODE_WARNING_ICON;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\treturn iconPath;\n\t}\n\n\tgetMessageLevel(messages) {\n\t\tlet messageLevel = \"\";\n\t\tif (messages && messages.length > 0) {\n\t\t\tfor (const message of messages) {\n\t\t\t\tif (message.type === ERROR) {\n\t\t\t\t\treturn message.type;\n\t\t\t\t} else if (message.type === WARNING) {\n\t\t\t\t\tmessageLevel = message.type;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn messageLevel;\n\t}\n\n\tgetMessageLabelClass(messages) {\n\t\tconst messageLevel = this.getMessageLevel(messages);\n\t\tlet labelClass = \"\";\n\t\tswitch (messageLevel) {\n\t\tcase ERROR:\n\t\t\tlabelClass = \"d3-node-error-label\";\n\t\t\tbreak;\n\t\tcase WARNING:\n\t\t\tlabelClass = \"d3-node-warning-label\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\treturn labelClass;\n\t}\n\n\tgetErrorMarkerClass(messages) {\n\t\tconst messageLevel = this.getMessageLevel(messages);\n\t\tlet labelClass = \"d3-error-circle-off\";\n\t\tswitch (messageLevel) {\n\t\tcase ERROR:\n\t\t\tlabelClass = \"d3-error-circle\";\n\t\t\tbreak;\n\t\tcase WARNING:\n\t\t\tlabelClass = \"d3-warning-circle\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\treturn labelClass;\n\t}\n\n\t// Returns the absolute x coordinate of the center of the node. If node is\n\t// an expanded supernode, its expanded width is in the 'width' field.\n\tgetNodeCenterPosX(node) {\n\t\treturn node.x_pos + (node.width / 2);\n\t}\n\n\t// Returns the absolute y coordinate of the center of the node. If node is\n\t// an expanded supernode, its expanded height is in the 'height' field.\n\tgetNodeCenterPosY(node) {\n\t\treturn node.y_pos + (node.height / 2);\n\t}\n\n\t// Returns the absolute x coordinate of the center of the node image\n\tgetNodeImageCenterPosX(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn node.x_pos + this.canvasLayout.supernodeImagePosX + (this.canvasLayout.supernodeImageWidth / 2);\n\t\t}\n\t\treturn node.x_pos +\n\t\t\tthis.getElementPosX(node.width, node.layout.imagePosX, node.layout.imagePosition) +\n\t\t\t(node.layout.imageWidth / 2);\n\t}\n\n\t// Returns the absolute y coordinate of the center of the node image\n\tgetNodeImageCenterPosY(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn node.y_pos + this.canvasLayout.supernodeImagePosY + (this.canvasLayout.supernodeImageHeight / 2);\n\t\t}\n\t\treturn node.y_pos +\n\t\t\tthis.getElementPosY(node.height, node.layout.imagePosY, node.layout.imagePosition) +\n\t\t\t(node.layout.imageHeight / 2);\n\t}\n\n\tgetNodeImagePosX(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn this.canvasLayout.supernodeImagePosX;\n\t\t}\n\t\treturn this.getElementPosX(node.width, node.layout.imagePosX, node.layout.imagePosition);\n\t}\n\n\tgetNodeImagePosY(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn this.canvasLayout.supernodeImagePosY;\n\t\t}\n\t\treturn this.getElementPosY(node.height, node.layout.imagePosY, node.layout.imagePosition);\n\t}\n\n\tgetNodeImageWidth(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn this.canvasLayout.supernodeImageWidth;\n\t\t}\n\t\treturn node.layout.imageWidth;\n\t}\n\n\tgetNodeImageHeight(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn this.canvasLayout.supernodeImageHeight;\n\t\t}\n\t\treturn node.layout.imageHeight;\n\t}\n\n\tgetNodeLabelPosX(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn this.canvasLayout.supernodeLabelPosX;\n\t\t}\n\t\tconst x = this.getElementPosX(node.width, node.layout.labelPosX, node.layout.labelPosition);\n\t\treturn node.layout.labelAlign === \"center\" ? x - (node.layout.labelWidth / 2) : x;\n\t}\n\n\tgetNodeLabelPosY(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn this.canvasLayout.supernodeLabelPosY;\n\t\t}\n\t\treturn this.getElementPosY(node.height, node.layout.labelPosY, node.layout.labelPosition);\n\t}\n\n\tgetNodeLabelWidth(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn node.width - this.canvasLayout.supernodeLabelPosX + this.canvasLayout.supernodeErrorPosX;\n\t\t}\n\t\treturn node.layout.labelWidth;\n\t}\n\n\tgetNodeLabelHeight(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn this.canvasLayout.supernodeLabelHeight;\n\t\t}\n\t\treturn node.layout.labelHeight;\n\t}\n\n\tgetNodeLabelEditIconTranslate(node, spanObj, zoomScale, fullLabelOnHover) {\n\t\treturn `translate(${this.getNodeLabelEditIconPosX(node, spanObj, zoomScale, fullLabelOnHover)}, ${this.getNodeLabelEditIconPosY(node)})`;\n\t}\n\n\tgetNodeLabelEditIconPosX(node, spanObj, zoomScale, fullLabelOnHover) {\n\t\tconst labelWidth = fullLabelOnHover ? this.getNodeLabelHoverWidth(node) : this.getNodeLabelWidth(node);\n\t\tconst posX = fullLabelOnHover ? this.getNodeLabelHoverPosX(node) : this.getNodeLabelPosX(node);\n\t\tconst spanWidth = spanObj.getBoundingClientRect().width;\n\n\t\tif (node.layout.labelAlign === \"center\" && !CanvasUtils.isExpandedSupernode(node)) {\n\t\t\tconst halfLabelWidth = labelWidth / 2;\n\t\t\tconst xCenterPosition = posX + halfLabelWidth;\n\t\t\tconst xOffsetFromCenter = Math.min(halfLabelWidth, ((spanWidth / zoomScale) / 2));\n\t\t\treturn xCenterPosition + xOffsetFromCenter;\n\t\t}\n\t\tconst xOffsetFromStart = Math.min(labelWidth, (spanWidth / zoomScale));\n\t\treturn this.getNodeLabelPosX(node) + xOffsetFromStart;\n\t}\n\n\tgetNodeLabelEditIconPosY(node) {\n\t\treturn this.getNodeLabelPosY(node);\n\t}\n\n\tgetNodeLabelHoverPosX(node) {\n\t\tif (node.layout.labelSingleLine &&\n\t\t\t\tnode.layout.labelAlign === \"center\") {\n\t\t\treturn this.getNodeLabelPosX(node) - 250;\n\t\t}\n\t\treturn this.getNodeLabelPosX(node);\n\t}\n\n\tgetNodeLabelHoverWidth(node) {\n\t\tif (node.layout.labelSingleLine) {\n\t\t\tif (node.layout.labelAlign === \"center\") {\n\t\t\t\treturn node.layout.labelWidth + 500;\n\t\t\t}\n\t\t\treturn node.layout.labelWidth + 40;\n\t\t}\n\t\treturn node.layout.labelWidth;\n\t}\n\n\tgetNodeLabelHoverHeight(node, spanObj, zoomScale) {\n\t\tif (node.layout.labelSingleLine) {\n\t\t\treturn node.layout.labelHeight;\n\t\t}\n\t\tconst calcHeight = spanObj.getBoundingClientRect().height / zoomScale;\n\t\treturn Math.max(calcHeight, node.layout.labelHeight);\n\t}\n\n\tgetNodeLabelTextAreaWidth(node) {\n\t\treturn this.getNodeLabelWidth(node) + (2 * TEXT_AREA_BORDER_ADJUSTMENT);\n\t}\n\n\tgetNodeLabelTextAreaHeight(node) {\n\t\treturn this.getNodeLabelHeight(node) + (2 * TEXT_AREA_BORDER_ADJUSTMENT);\n\t}\n\n\tgetNodeLabelTextAreaPosX(node) {\n\t\treturn this.getNodeLabelPosX(node) - TEXT_AREA_BORDER_ADJUSTMENT;\n\t}\n\n\tgetNodeLabelTextAreaPosY(node) {\n\t\treturn this.getNodeLabelPosY(node) - TEXT_AREA_BORDER_ADJUSTMENT;\n\t}\n\n\tgetNodeEllipsisTranslate(node) {\n\t\treturn `translate(${this.getNodeEllipsisPosX(node)}, ${this.getNodeEllipsisPosY(node)})`;\n\t}\n\n\tgetNodeEllipsisWidth(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn this.canvasLayout.supernodeEllipsisWidth;\n\t\t}\n\t\treturn node.layout.ellipsisWidth;\n\t}\n\n\tgetNodeEllipsisHeight(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn this.canvasLayout.supernodeEllipsisHeight;\n\t\t}\n\t\treturn node.layout.ellipsisHeight;\n\t}\n\n\tgetNodeEllipsisIconWidth(node) {\n\t\treturn this.getNodeEllipsisWidth(node) - (2 * node.layout.ellipsisHoverAreaPadding);\n\t}\n\n\tgetNodeEllipsisIconHeight(node) {\n\t\treturn this.getNodeEllipsisHeight(node) - (2 * node.layout.ellipsisHoverAreaPadding);\n\t}\n\n\tgetNodeEllipsisPosX(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn node.width + this.canvasLayout.supernodeEllipsisPosX;\n\t\t}\n\n\t\treturn this.getElementPosX(node.width, node.layout.ellipsisPosX, node.layout.ellipsisPosition);\n\t}\n\n\tgetNodeEllipsisPosY(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn this.canvasLayout.supernodeEllipsisPosY;\n\t\t}\n\n\t\treturn this.getElementPosY(node.height, node.layout.ellipsisPosY, node.layout.ellipsisPosition);\n\t}\n\n\tgetNodeExpansionIconTranslate(node) {\n\t\tconst posX = node.width + this.canvasLayout.supernodeExpansionIconPosX;\n\t\treturn `translate(${posX}, ${this.canvasLayout.supernodeExpansionIconPosY})`;\n\t}\n\n\tgetNodeErrorPosX(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn node.width + this.canvasLayout.supernodeErrorPosX;\n\t\t}\n\t\treturn this.getElementPosX(node.width, node.layout.errorXPos, node.layout.errorPosition);\n\t}\n\n\tgetNodeErrorPosY(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn this.canvasLayout.supernodeErrorPosY;\n\t\t}\n\t\treturn this.getElementPosY(node.height, node.layout.errorYPos, node.layout.errorPosition);\n\t}\n\n\tgetNodeErrorWidth(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn this.canvasLayout.supernodeErrorWidth;\n\t\t}\n\t\treturn node.layout.errorWidth;\n\t}\n\n\tgetNodeErrorHeight(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn this.canvasLayout.supernodeErrorHeight;\n\t\t}\n\t\treturn node.layout.errorHeight;\n\t}\n\n\tgetNodePortPosX(posInfo, node) {\n\t\treturn this.getElementPosX(node.width, posInfo.x_pos, posInfo.pos);\n\t}\n\n\tgetNodePortPosY(posInfo, node) {\n\t\treturn this.getElementPosY(node.height, posInfo.y_pos, posInfo.pos);\n\t}\n\n\tgetElementPosX(width, xOffset = 0, position = \"topLeft\") {\n\t\tlet x = 0;\n\n\t\tif (position.endsWith(\"Center\")) {\n\t\t\tx += (width / 2);\n\t\t} else if (position.endsWith(\"Right\")) {\n\t\t\tx += width;\n\t\t}\n\t\treturn x + Number(xOffset);\n\t}\n\n\tgetElementPosY(height, yOffset = 0, position = \"topLeft\") {\n\t\tlet y = 0;\n\n\t\tif (position.startsWith(\"middle\")) {\n\t\t\ty += (height / 2);\n\t\t} else if (position.startsWith(\"bottom\")) {\n\t\t\ty += height;\n\t\t}\n\t\treturn y + Number(yOffset);\n\t}\n\n\t// Returns the X offset for the port which references the nodeId passed in\n\t// based on the precalculated X coordinate of the port.\n\tgetSupernodePortXOffset(nodeId, ports) {\n\t\tif (ports) {\n\t\t\tconst supernodePort = ports.find((port) => port.subflow_node_ref === nodeId);\n\t\t\treturn supernodePort.cx - this.canvasLayout.supernodeSVGAreaPadding;\n\t\t}\n\t\treturn 0;\n\t}\n\n\t// Returns the Y offset for the port which references the nodeId passed in\n\t// based on the pre-calculated Y coordinate of the port.\n\tgetSupernodePortYOffset(nodeId, ports) {\n\t\tif (ports) {\n\t\t\tconst supernodePort = ports.find((port) => port.subflow_node_ref === nodeId);\n\t\t\treturn supernodePort.cy;\n\t\t}\n\t\treturn 0;\n\t}\n}\n","/*\n * Copyright 2017-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint brace-style: \"off\" */\n\nexport default class SvgCanvasUtilsComments {\n\t// Returns the absolute x coordinate of the center of the comment\n\tgetCommentCenterPosX(com) {\n\t\treturn com.x_pos + (com.width / 2);\n\t}\n\n\t// Returns the absolute y coordinate of the center of the comment\n\tgetCommentCenterPosY(com) {\n\t\treturn com.y_pos + (com.height / 2);\n\t}\n\n\t// Converts the HTML string passed in to a new HTML string containing and\n\t// necessary <mark> tags for the text to be highlighted specified by the\n\t// search string passed in.\n\tinsertCommentHighlight(htmlString, searchStr) {\n\t\t// Parse the HTML string.\n\t\tconst parser = new DOMParser();\n\t\tconst doc = parser.parseFromString(htmlString, \"text/html\");\n\n\t\t// Get the raw text from the body element.\n\t\tconst bodies = doc.getElementsByTagName(\"body\");\n\t\tconst body = bodies[0];\n\t\tconst innerText = body?.innerText || \"\";\n\n\t\t// Search for all matches of the search string.\n\t\tconst regex = new RegExp(searchStr, \"gi\");\n\t\tconst matches = innerText.matchAll(regex);\n\n\t\t// If any matches of the search string were found, insert the <mark> tags\n\t\tif (matches) {\n\t\t\tfor (const match of matches) {\n\t\t\t\tconst elementInfos = [];\n\t\t\t\tthis.searchForElementInfos(body, match.index, match.index + searchStr.length, 0, elementInfos);\n\t\t\t\tthis.insertMarkElements(elementInfos);\n\t\t\t}\n\t\t\treturn body.outerHTML;\n\t\t}\n\n\t\treturn htmlString;\n\t}\n\n\t// Searches the element passed in for any child nodes that coincide with the\n\t// start and end position of the search string. runStart is the starting position\n\t// within the original string of the element being processed. Results are returned\n\t// in an array of element infos that have the following form:\n\t// { splitStart, splitEnd, node }\n\t// where splitStart and splitEnd are the beginning and ending position of the\n\t// highlighted text and node is a text node in the DOM.\n\tsearchForElementInfos(element, searchStart, searchEnd, runStart, elementInfos) {\n\t\tlet textStart = runStart;\n\t\tlet textEnd = runStart;\n\n\t\tfor (const node of element.childNodes) {\n\t\t\tif (node.nodeType === Node.TEXT_NODE) {\n\t\t\t\tconst textLen = node?.textContent?.length;\n\t\t\t\ttextEnd = textStart + textLen;\n\n\t\t\t\tif (textStart < searchEnd && textEnd > searchStart) {\n\t\t\t\t\t// Calculate split positions **within** the text node.\n\t\t\t\t\tconst splitStart = (searchStart > textStart) ? searchStart - textStart : 0;\n\t\t\t\t\tconst splitEnd = (searchEnd < textEnd) ? searchEnd - textStart : textLen;\n\n\t\t\t\t\telementInfos.push({ splitStart, splitEnd, node });\n\t\t\t\t}\n\n\t\t\t} else if (node.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\ttextStart = this.searchForElementInfos(node, searchStart, searchEnd, textEnd, elementInfos);\n\t\t\t\ttextEnd = textStart;\n\t\t\t}\n\t\t}\n\t\treturn textEnd;\n\t}\n\n\t// Modifies each text node in the element infos array by adding <mark> and </mark>\n\t// around the text to be highlighted and modifies the DOM objects appropriately.\n\tinsertMarkElements(elementInfos) {\n\t\tfor (let i = 0; i < elementInfos.length; i++) {\n\t\t\tconst elementInfo = elementInfos[i];\n\t\t\tconst node = elementInfo.node;\n\t\t\tconst parentElement = node.parentElement;\n\t\t\tconst textContent = node.textContent;\n\n\t\t\tconst markElement = document.createElement(\"mark\");\n\n\t\t\t// Search string and text content the same.\n\t\t\t// Split: ▼ ▼\n\t\t\t// Text content: tttttttttt\n\t\t\t// Mark: xxxxxxxxxx\n\t\t\tif (elementInfo.splitStart === 0 &&\n\t\t\t\telementInfo.splitEnd === textContent.length)\n\t\t\t{\n\t\t\t\tconst node1 = document.createTextNode(textContent.slice(0, elementInfo.splitEnd));\n\t\t\t\tmarkElement.appendChild(node1);\n\n\t\t\t\tparentElement.replaceChild(markElement, node);\n\n\t\t\t// Search string at end of text content.\n\t\t\t// Split: ▼ ▼\n\t\t\t// Text content: tttttttttt\n\t\t\t// Mark: xxxxxx\n\t\t\t} else if (elementInfo.splitStart > 0 &&\n\t\t\t\telementInfo.splitEnd === textContent.length)\n\t\t\t{\n\t\t\t\tconst node1 = document.createTextNode(textContent.slice(0, elementInfo.splitStart));\n\t\t\t\tconst node2 = document.createTextNode(textContent.slice(elementInfo.splitStart));\n\t\t\t\tmarkElement.appendChild(node2);\n\n\t\t\t\tparentElement.insertBefore(node1, node);\n\t\t\t\tparentElement.replaceChild(markElement, node);\n\n\t\t\t// Search string at start of text content.\n\t\t\t// Split: ▼ ▼\n\t\t\t// Text content: tttttttttt\n\t\t\t// Mark: xxxxxx\n\t\t\t} else if (elementInfo.splitStart === 0 &&\n\t\t\t\telementInfo.splitEnd < textContent.length)\n\t\t\t{\n\t\t\t\tconst node1 = document.createTextNode(textContent.slice(0, elementInfo.splitEnd));\n\t\t\t\tconst node2 = document.createTextNode(textContent.slice(elementInfo.splitEnd));\n\t\t\t\tmarkElement.appendChild(node1);\n\n\t\t\t\tparentElement.insertBefore(markElement, node);\n\t\t\t\tparentElement.replaceChild(node2, node);\n\n\t\t\t// Search string within text content.\n\t\t\t// Split: ▼ ▼\n\t\t\t// Text content: tttttttttt\n\t\t\t// Mark: xxxxxx\n\t\t\t} else {\n\t\t\t\tconst node1 = document.createTextNode(textContent.slice(0, elementInfo.splitStart));\n\t\t\t\tconst node2 = document.createTextNode(textContent.slice(elementInfo.splitStart, elementInfo.splitEnd));\n\t\t\t\tconst node3 = document.createTextNode(textContent.slice(elementInfo.splitEnd));\n\t\t\t\tmarkElement.appendChild(node2);\n\n\t\t\t\tparentElement.insertBefore(node1, node);\n\t\t\t\tparentElement.insertBefore(markElement, node);\n\t\t\t\tparentElement.replaceChild(node3, node);\n\t\t\t}\n\t\t}\n\t}\n}\n","/*\n * Copyright 2017-2024 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint no-lonely-if: \"off\" */\n/* eslint no-else-return: \"off\" */\n\nimport CanvasUtils from \"./common-canvas-utils.js\";\nimport { ASSOC_RIGHT_SIDE_CURVE, ASSOCIATION_LINK, COMMENT_LINK, NODE_LINK,\n\tASSOC_VAR_CURVE_LEFT, ASSOC_VAR_CURVE_RIGHT, ASSOC_VAR_DOUBLE_BACK_LEFT, ASSOC_VAR_DOUBLE_BACK_RIGHT,\n\tLINK_TYPE_ELBOW, LINK_TYPE_STRAIGHT, LINK_TYPE_PARALLAX,\n\tLINK_METHOD_FREEFORM,\n\tNORTH, SOUTH, EAST, WEST }\n\tfrom \"./constants/canvas-constants\";\n\nconst CLOCKWISE = false;\nconst ANTI_CLOCKWISE = true;\n\nexport default class SvgCanvasLinks {\n\tconstructor(config, canvasLayout, nodeUtils, commentUtils) {\n\t\tthis.canvasLayout = canvasLayout;\n\t\tthis.config = config;\n\t\tthis.nodeUtils = nodeUtils;\n\t\tthis.commentUtils = commentUtils;\n\t}\n\n\t// Returns an object containing the x and y coordinates of the start position\n\t// of a straight line which extends from the source comment passed in to the\n\t// end position which is an x, y coordinate.\n\tgetNewStraightCommentLinkStartPos(srcComment, endPos) {\n\t\treturn CanvasUtils.getOuterCoord(\n\t\t\tsrcComment.x_pos,\n\t\t\tsrcComment.y_pos,\n\t\t\tsrcComment.width,\n\t\t\tsrcComment.height,\n\t\t\tthis.canvasLayout.linkGap,\n\t\t\tthis.commentUtils.getCommentCenterPosX(srcComment),\n\t\t\tthis.commentUtils.getCommentCenterPosY(srcComment),\n\t\t\tendPos.x,\n\t\t\tendPos.y);\n\t}\n\n\t// Returns an object containing the x and y coordinates of the start position\n\t// of a freeform line which extends from the node passed in to the\n\t// end position which is also an x, y coordinate. If an originInfo object is\n\t// passed in we use it to offset the origin position for the line.\n\tgetNewFreeformNodeLinkStartPos(node, endPos, originInfo) {\n\t\tlet originX;\n\t\tlet originY;\n\n\t\tif (node.layout.drawNodeLinkLineFromTo === \"image_center\" && !CanvasUtils.isExpanded(node)) {\n\t\t\toriginX = this.nodeUtils.getNodeImageCenterPosX(node);\n\t\t\toriginY = this.nodeUtils.getNodeImageCenterPosY(node);\n\t\t} else {\n\t\t\tif (originInfo) {\n\t\t\t\t({ x: originX, y: originY } = this.getCenterOffset(node, originInfo, false));\n\t\t\t} else {\n\t\t\t\toriginX = this.nodeUtils.getNodeCenterPosX(node);\n\t\t\t\toriginY = this.nodeUtils.getNodeCenterPosY(node);\n\t\t\t}\n\t\t}\n\n\t\treturn CanvasUtils.getOuterCoord(\n\t\t\tnode.x_pos,\n\t\t\tnode.y_pos,\n\t\t\tnode.width,\n\t\t\tnode.height,\n\t\t\tthis.canvasLayout.linkGap,\n\t\t\toriginX,\n\t\t\toriginY,\n\t\t\tendPos.x,\n\t\t\tendPos.y);\n\t}\n\n\tgetLinkCoords(link, srcObj, srcPortId, trgNode, trgPortId, assocLinkVariation) {\n\t\tlet coords = null;\n\t\tif (link.type === NODE_LINK) {\n\t\t\tif (this.canvasLayout.linkMethod === LINK_METHOD_FREEFORM) {\n\t\t\t\tcoords = this.getNodeLinkCoordsForFreeform(srcObj, trgNode, link);\n\t\t\t} else {\n\t\t\t\tcoords = this.getNodeLinkCoordsForPortsConnection(srcObj, srcPortId, trgNode, trgPortId);\n\t\t\t}\n\t\t} else if (link.type === ASSOCIATION_LINK) {\n\t\t\tif (this.config.enableAssocLinkType === ASSOC_RIGHT_SIDE_CURVE) {\n\t\t\t\tcoords = this.getAssociationCurveLinkCoords(srcObj, trgNode, assocLinkVariation);\n\t\t\t} else {\n\t\t\t\tcoords = this.getAssociationLinkCoords(srcObj, trgNode);\n\t\t\t}\n\t\t} else {\n\t\t\tcoords = this.getCommentLinkCoords(srcObj, trgNode);\n\t\t}\n\t\treturn coords;\n\t}\n\n\tgetNodeLinkCoordsForFreeform(srcNode, trgNode, link) {\n\t\tconst selfRefLink = srcNode.id === trgNode.id;\n\t\tlet srcCenterX;\n\t\tlet srcCenterY;\n\t\tlet trgCenterX;\n\t\tlet trgCenterY;\n\n\t\tif (srcNode.layout.drawNodeLinkLineFromTo === \"image_center\" &&\n\t\t\t\tthis.canvasLayout.linkType === LINK_TYPE_STRAIGHT &&\n\t\t\t\t!CanvasUtils.isExpanded(srcNode)) {\n\t\t\tsrcCenterX = this.nodeUtils.getNodeImageCenterPosX(srcNode);\n\t\t\tsrcCenterY = this.nodeUtils.getNodeImageCenterPosY(srcNode);\n\t\t} else {\n\t\t\tif (link && link.srcFreeformInfo) {\n\t\t\t\t({ x: srcCenterX, y: srcCenterY } = this.getCenterOffset(srcNode, link.srcFreeformInfo, selfRefLink));\n\t\t\t} else {\n\t\t\t\tsrcCenterX = this.nodeUtils.getNodeCenterPosX(srcNode);\n\t\t\t\tsrcCenterY = this.nodeUtils.getNodeCenterPosY(srcNode);\n\t\t\t}\n\t\t}\n\n\t\tif (trgNode.layout.drawNodeLinkLineFromTo === \"image_center\" &&\n\t\t\t\tthis.canvasLayout.linkType === LINK_TYPE_STRAIGHT &&\n\t\t\t\t!CanvasUtils.isExpanded(trgNode)) {\n\t\t\ttrgCenterX = this.nodeUtils.getNodeImageCenterPosX(trgNode);\n\t\t\ttrgCenterY = this.nodeUtils.getNodeImageCenterPosY(trgNode);\n\t\t} else {\n\t\t\tif (link && link.trgFreeformInfo) {\n\t\t\t\t({ x: trgCenterX, y: trgCenterY } = this.getCenterOffset(trgNode, link.trgFreeformInfo, selfRefLink));\n\t\t\t} else {\n\t\t\t\ttrgCenterX = this.nodeUtils.getNodeCenterPosX(trgNode);\n\t\t\t\ttrgCenterY = this.nodeUtils.getNodeCenterPosY(trgNode);\n\t\t\t}\n\t\t}\n\n\t\tif (this.canvasLayout.linkType === LINK_TYPE_STRAIGHT && !selfRefLink) {\n\t\t\tconst startPos = CanvasUtils.getOuterCoord(\n\t\t\t\tsrcNode.x_pos,\n\t\t\t\tsrcNode.y_pos,\n\t\t\t\tsrcNode.width,\n\t\t\t\tsrcNode.height,\n\t\t\t\tthis.canvasLayout.linkGap,\n\t\t\t\tsrcCenterX, // OriginX\n\t\t\t\tsrcCenterY, // OriginY\n\t\t\t\ttrgCenterX, // EndX\n\t\t\t\ttrgCenterY); // EndY\n\n\t\t\tconst endPos = CanvasUtils.getOuterCoord(\n\t\t\t\ttrgNode.x_pos,\n\t\t\t\ttrgNode.y_pos,\n\t\t\t\ttrgNode.width,\n\t\t\t\ttrgNode.height,\n\t\t\t\tthis.canvasLayout.linkGap,\n\t\t\t\ttrgCenterX, // OriginX\n\t\t\t\ttrgCenterY, // OriginY\n\t\t\t\tsrcCenterX, // EndX\n\t\t\t\tsrcCenterY); // EndY\n\n\t\t\treturn {\n\t\t\t\toriginX: startPos.originX, originY: startPos.originY,\n\t\t\t\tx1: startPos.x, y1: startPos.y,\n\t\t\t\tx2: endPos.x, y2: endPos.y,\n\t\t\t\tsrcDir: startPos.dir,\n\t\t\t\ttrgDir: endPos.dir\n\t\t\t};\n\t\t} else {\n\t\t\tlet x1;\n\t\t\tlet y1;\n\t\t\tlet x2;\n\t\t\tlet y2;\n\t\t\tif (link.srcFreeformInfo.dir === EAST) {\n\t\t\t\tx1 = srcCenterX + this.canvasLayout.linkGap;\n\t\t\t\ty1 = srcCenterY;\n\t\t\t} else if (link.srcFreeformInfo.dir === WEST) {\n\t\t\t\tx1 = srcCenterX - this.canvasLayout.linkGap;\n\t\t\t\ty1 = srcCenterY;\n\t\t\t} else if (link.srcFreeformInfo.dir === SOUTH) {\n\t\t\t\tx1 = srcCenterX;\n\t\t\t\ty1 = srcCenterY + this.canvasLayout.linkGap;\n\t\t\t} else if (link.srcFreeformInfo.dir === NORTH) {\n\t\t\t\tx1 = srcCenterX;\n\t\t\t\ty1 = srcCenterY - this.canvasLayout.linkGap;\n\t\t\t}\n\t\t\tif (link.trgFreeformInfo.dir === EAST) {\n\t\t\t\tx2 = trgCenterX + this.canvasLayout.linkGap;\n\t\t\t\ty2 = trgCenterY;\n\t\t\t} else if (link.trgFreeformInfo.dir === WEST) {\n\t\t\t\tx2 = trgCenterX - this.canvasLayout.linkGap;\n\t\t\t\ty2 = trgCenterY;\n\t\t\t} else if (link.trgFreeformInfo.dir === SOUTH) {\n\t\t\t\tx2 = trgCenterX;\n\t\t\t\ty2 = trgCenterY + this.canvasLayout.linkGap;\n\t\t\t} else if (link.trgFreeformInfo.dir === NORTH) {\n\t\t\t\tx2 = trgCenterX;\n\t\t\t\ty2 = trgCenterY - this.canvasLayout.linkGap;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\toriginX: 0, originY: 0,\n\t\t\t\tx1: x1, y1: y1,\n\t\t\t\tx2: x2, y2: y2,\n\t\t\t\tsrcDir: link.srcFreeformInfo.dir,\n\t\t\t\ttrgDir: link.trgFreeformInfo.dir\n\t\t\t};\n\t\t}\n\t}\n\n\t// Returns the \"center\" position for a node to/from which a freeform\n\t// link will be drawn using the originInfo provided. The previously\n\t// calculated originInfo object indicates how many links are going\n\t// to or from the node on a particular side of the node: top (NORTH),\n\t// bottom (SOUTH), left (WEST) or right (EAST).\n\tgetCenterOffset(node, originInfo, selfRefLink) {\n\t\tconst parts = originInfo.len + 1;\n\t\tconst index = originInfo.idx + 1;\n\n\t\tlet x = 0;\n\t\tlet y = 0;\n\n\t\tif (originInfo.dir === NORTH ||\n\t\t\t\toriginInfo.dir === SOUTH) {\n\t\t\tx = node.x_pos + ((node.width / parts) * index);\n\t\t\ty = this.getYPosForCenterOffset(node, originInfo.dir, selfRefLink);\n\n\t\t} else if (originInfo.dir === EAST ||\n\t\t\t\t\toriginInfo.dir === WEST) {\n\t\t\tx = this.getXPosForCenterOffset(node, originInfo.dir, selfRefLink);\n\t\t\ty = node.y_pos + ((node.height / parts) * index);\n\t\t}\n\n\t\treturn { x, y };\n\t}\n\n\t// Returns the vertical \"center\" position for node to/from which\n\t// a link will be drawn. This is different for Straight links\n\t// than other types of freeform links. This is because Straight\n\t// links are drawn directly towards the center of the node whereas\n\t// other freeform link type (Elbow, Curve, Parallax) are drawn to the\n\t// edges of the node.\n\tgetYPosForCenterOffset(node, dir, selfRefLink) {\n\t\tif (this.canvasLayout.linkType === LINK_TYPE_STRAIGHT && !selfRefLink) {\n\t\t\treturn this.nodeUtils.getNodeCenterPosY(node);\n\t\t} else if (dir === SOUTH) {\n\t\t\treturn node.y_pos + node.height;\n\t\t}\n\t\treturn node.y_pos;\n\t}\n\n\t// Returns the horizontal \"center\" position for node to/from which\n\t// a link will be drawn. This is different for Straight links\n\t// than other types of freeform links. This is because Straight\n\t// links are drawn directly towards the center of the node whereas\n\t// other freeform link type (Elbow, Curve, Parallax) are drawn to the\n\t// edges of the node.\n\tgetXPosForCenterOffset(node, dir, selfRefLink) {\n\t\tif (this.canvasLayout.linkType === LINK_TYPE_STRAIGHT && !selfRefLink) {\n\t\t\treturn this.nodeUtils.getNodeCenterPosX(node);\n\t\t} else if (dir === EAST) {\n\t\t\treturn node.x_pos + node.width;\n\t\t}\n\t\treturn node.x_pos;\n\t}\n\n\tgetNodeLinkCoordsForPortsConnection(srcNode, srcPortId, trgNode, trgPortId) {\n\t\tlet srcX;\n\t\tlet srcY;\n\t\tlet trgX;\n\t\tlet trgY;\n\t\tlet srcDir;\n\t\tlet trgDir;\n\n\t\tif (srcNode.outputs && srcNode.outputs.length > 0) {\n\t\t\tconst srcPort = srcNode.outputs.find((output) => output.id === srcPortId);\n\t\t\tsrcX = srcPort.cx;\n\t\t\tsrcY = srcPort.cy;\n\t\t\tsrcDir = srcPort.dir;\n\n\t\t} else {\n\t\t\tsrcX = this.nodeUtils.getNodePortPosX(srcNode.layout.outputPortPositions[0], srcNode);\n\t\t\tsrcY = this.nodeUtils.getNodePortPosY(srcNode.layout.outputPortPositions[0], srcNode);\n\t\t\tsrcDir = CanvasUtils.getPortDir(srcX, srcY, srcNode);\n\t\t}\n\n\t\tif (trgNode.inputs && trgNode.inputs.length > 0) {\n\t\t\tconst trgPort = trgNode.inputs.find((input) => input.id === trgPortId);\n\t\t\ttrgX = trgPort.cx;\n\t\t\ttrgY = trgPort.cy;\n\t\t\ttrgDir = trgPort.dir;\n\n\t\t} else {\n\t\t\ttrgX = this.nodeUtils.getNodePortPosX(trgNode.layout.inputPortPositions[0], trgNode);\n\t\t\ttrgY = this.nodeUtils.getNodePortPosY(trgNode.layout.inputPortPositions[0], trgNode);\n\t\t\ttrgDir = CanvasUtils.getPortDir(srcX, srcY, srcNode);\n\t\t}\n\n\t\treturn {\n\t\t\tx1: srcNode.x_pos + srcX,\n\t\t\ty1: srcNode.y_pos + srcY,\n\t\t\tx2: trgNode.x_pos + trgX,\n\t\t\ty2: trgNode.y_pos + trgY,\n\t\t\tsrcDir: srcDir,\n\t\t\ttrgDir: trgDir\n\t\t};\n\t}\n\n\tgetAssociationCurveLinkCoords(srcNode, trgNode, assocLinkVariation) {\n\t\tlet srcX = 0;\n\t\tlet trgX = 0;\n\n\t\tif (assocLinkVariation === ASSOC_VAR_CURVE_RIGHT) {\n\t\t\tsrcX = srcNode.width;\n\t\t\ttrgX = 0;\n\n\t\t} else if (assocLinkVariation === ASSOC_VAR_CURVE_LEFT) {\n\t\t\tsrcX = 0;\n\t\t\ttrgX = trgNode.width;\n\n\t\t} else if (assocLinkVariation === ASSOC_VAR_DOUBLE_BACK_LEFT) {\n\t\t\tsrcX = 0;\n\t\t\ttrgX = 0;\n\n\t\t} else {\n\t\t\tsrcX = srcNode.width;\n\t\t\ttrgX = trgNode.width;\n\t\t}\n\n\t\treturn {\n\t\t\tx1: srcNode.x_pos + srcX,\n\t\t\ty1: srcNode.y_pos + this.nodeUtils.getNodePortPosY(srcNode.layout.outputPortPositions[0], srcNode),\n\t\t\tx2: trgNode.x_pos + trgX,\n\t\t\ty2: trgNode.y_pos + this.nodeUtils.getNodePortPosY(trgNode.layout.inputPortPositions[0], trgNode)\n\t\t};\n\t}\n\n\tgetCommentLinkCoords(srcComment, trgNode) {\n\t\tconst srcCenterX = this.commentUtils.getCommentCenterPosX(srcComment);\n\t\tconst srcCenterY = this.commentUtils.getCommentCenterPosY(srcComment);\n\t\tlet trgCenterX;\n\t\tlet trgCenterY;\n\n\t\tif (trgNode.layout.drawCommentLinkLineTo === \"image_center\") {\n\t\t\ttrgCenterX = this.nodeUtils.getNodeImageCenterPosX(trgNode);\n\t\t\ttrgCenterY = this.nodeUtils.getNodeImageCenterPosY(trgNode);\n\t\t} else {\n\t\t\ttrgCenterX = this.nodeUtils.getNodeCenterPosX(trgNode);\n\t\t\ttrgCenterY = this.nodeUtils.getNodeCenterPosY(trgNode);\n\t\t}\n\n\t\tconst startPos = CanvasUtils.getOuterCoord(\n\t\t\tsrcComment.x_pos,\n\t\t\tsrcComment.y_pos,\n\t\t\tsrcComment.width,\n\t\t\tsrcComment.height,\n\t\t\tthis.canvasLayout.linkGap,\n\t\t\tsrcCenterX,\n\t\t\tsrcCenterY,\n\t\t\ttrgCenterX,\n\t\t\ttrgCenterY);\n\n\t\tconst endPos = CanvasUtils.getOuterCoord(\n\t\t\ttrgNode.x_pos,\n\t\t\ttrgNode.y_pos,\n\t\t\ttrgNode.width,\n\t\t\ttrgNode.height,\n\t\t\tthis.canvasLayout.linkGap,\n\t\t\ttrgCenterX,\n\t\t\ttrgCenterY,\n\t\t\tsrcCenterX,\n\t\t\tsrcCenterY);\n\n\t\treturn { x1: startPos.x, y1: startPos.y, x2: endPos.x, y2: endPos.y };\n\t}\n\n\tgetAssociationLinkCoords(srcNode, trgNode) {\n\t\tconst srcCenterX = this.nodeUtils.getNodeCenterPosX(srcNode);\n\t\tconst srcCenterY = this.nodeUtils.getNodeCenterPosY(srcNode);\n\n\t\tconst trgCenterX = this.nodeUtils.getNodeCenterPosX(trgNode);\n\t\tconst trgCenterY = this.nodeUtils.getNodeCenterPosY(trgNode);\n\n\t\tconst startPos = CanvasUtils.getOuterCoord(\n\t\t\tsrcNode.x_pos,\n\t\t\tsrcNode.y_pos,\n\t\t\tsrcNode.width,\n\t\t\tsrcNode.height,\n\t\t\tthis.canvasLayout.linkGap,\n\t\t\tsrcCenterX, // OriginX\n\t\t\tsrcCenterY, // OriginY\n\t\t\ttrgCenterX, // EndX\n\t\t\ttrgCenterY); // EndY\n\n\t\tconst endPos = CanvasUtils.getOuterCoord(\n\t\t\ttrgNode.x_pos,\n\t\t\ttrgNode.y_pos,\n\t\t\ttrgNode.width,\n\t\t\ttrgNode.height,\n\t\t\tthis.canvasLayout.linkGap,\n\t\t\ttrgCenterX, // OriginX\n\t\t\ttrgCenterY, // OriginY\n\t\t\tsrcCenterX, // EndX\n\t\t\tsrcCenterY); // EndY\n\n\t\treturn {\n\t\t\toriginX: startPos.originX, originY: startPos.originY,\n\t\t\tx1: startPos.x, y1: startPos.y,\n\t\t\tx2: endPos.x, y2: endPos.y,\n\t\t\tsrcDir: startPos.dir,\n\t\t\ttrgDir: endPos.dir\n\t\t};\n\t}\n\n\t// Returns the lineArray passed in with connection path info added to it.\n\taddConnectionPaths(links) {\n\t\tlinks.forEach((link) => {\n\t\t\t// Only necessary to get the path info, if the start and end coords of\n\t\t\t// the link have changed.\n\t\t\tif (link.coordsUpdated) {\n\t\t\t\tlink.pathInfo = this.getConnectorPathInfo(link);\n\t\t\t}\n\t\t});\n\t\treturn links;\n\t}\n\n\t// Returns an SVG path string for the link (described by the line passed in)\n\t// based on the connection and link type in the layout info.\n\tgetConnectorPathInfo(link, drawingNewLinkMinInitialLine) {\n\t\tconst minInitialLine = this.getMinInitialLine(link, drawingNewLinkMinInitialLine);\n\n\t\tif (link.type === NODE_LINK) {\n\t\t\tif (this.canvasLayout.linkMethod === LINK_METHOD_FREEFORM &&\n\t\t\t\t\tthis.canvasLayout.linkType === LINK_TYPE_STRAIGHT) {\n\t\t\t\treturn this.getStraightPath(link, minInitialLine);\n\t\t\t}\n\t\t\treturn this.getNodeLinkPathInfo(link, minInitialLine);\n\n\t\t} else if (link.type === ASSOCIATION_LINK &&\n\t\t\t\t\t\t\t\tthis.config.enableAssocLinkType === ASSOC_RIGHT_SIDE_CURVE) {\n\t\t\treturn this.getAssociationCurvePath(link, minInitialLine);\n\t\t}\n\n\t\treturn this.getStraightPath(link, minInitialLine);\n\t}\n\n\t// Returns the minInitialLine layout variable that will be either zero for a\n\t// comment link or from the link-data object (if the size has been\n\t// pre-calculated for elbow style connections) or from the source node\n\t// object (data.src) if we are drawing an existing connection or from\n\t// this.drawingNewLinkData.minInitialLine if we are dynamically drawing\n\t// a new link.\n\tgetMinInitialLine(link, drawingNewLinkMinInitialLine) {\n\t\tlet minInitialLine;\n\t\tif (link.type === COMMENT_LINK) {\n\t\t\tminInitialLine = 0;\n\t\t} else if (link.minInitialLineForElbow) {\n\t\t\tminInitialLine = link.minInitialLineForElbow;\n\t\t} else if (link.srcObj && link.srcObj.layout) {\n\t\t\tminInitialLine = link.srcObj.layout.minInitialLine;\n\t\t} else if (drawingNewLinkMinInitialLine) {\n\t\t\tminInitialLine = drawingNewLinkMinInitialLine;\n\t\t} else {\n\t\t\tminInitialLine = 30;\n\t\t}\n\t\treturn minInitialLine;\n\t}\n\n\t// Returns the path info, for the link passed in, which describes either a\n\t// Elbow, Curve, Parallax or Straight connector line. This method can be called\n\t// either for drawing a connection line between nodes or for a new link line\n\t// being drawn out from a source node towards a target node. It is used for\n\t// drawing links between specific ports on the source and target nodes or\n\t// freeform links drawn from points on the boundaries of the source and\n\t// target nodes. This method handles links drawn from any direction at\n\t// the source end (\"n\", \"s\", \"e\" or \"w\") to any direction at the target\n\t// end (\"n\", \"s\", \"e\" or \"w\").\n\t// It does this by rotating any link which has a source end of \"n\", \"s\" or \"w\"\n\t// so that the link line is calculated as if it has a source end of \"e\". This\n\t// entails rotating the coordinates for the boundaries of the source and target\n\t// nodes as well as the target direction for the link. After the link elements\n\t// have been created, this method rotates then back again to their original\n\t// orientation.\n\t// The pathInfo returned contains:\n\t// path - an SVG path string describing the Elbow/Curve/Parallax/Straight line\n\t// centerPoint - the center point of the line used for decoration placement\n\tgetNodeLinkPathInfo(inLink, minInitialLine) {\n\t\tlet topSrc;\n\t\tlet topTrg;\n\t\tlet bottomSrc;\n\t\tlet bottomTrg;\n\t\tlet link = inLink;\n\n\t\t// When drawing a link from node to node we will have src and trg nodes.\n\t\tif (link.srcObj && link.trgNode) {\n\t\t\t// Rotate anti-clockwise by 90 degrees\n\t\t\tif (link.srcDir === SOUTH) {\n\t\t\t\ttopSrc = -(link.srcObj.x_pos + link.srcObj.width);\n\t\t\t\tbottomSrc = -(link.srcObj.x_pos);\n\t\t\t\ttopTrg = -(link.trgNode.x_pos + link.trgNode.width);\n\t\t\t\tbottomTrg = -(link.trgNode.x_pos);\n\n\t\t\t// Rotate clockwise by 90 degrees\n\t\t\t} else if (link.srcDir === NORTH) {\n\t\t\t\ttopSrc = link.srcObj.x_pos;\n\t\t\t\tbottomSrc = link.srcObj.x_pos + link.srcObj.width;\n\t\t\t\ttopTrg = link.trgNode.x_pos;\n\t\t\t\tbottomTrg = link.trgNode.x_pos + link.trgNode.width;\n\n\t\t\t// Rotate by 180 degrees\n\t\t\t} else if (link.srcDir === WEST) {\n\t\t\t\ttopSrc = -(link.srcObj.y_pos + link.srcObj.height);\n\t\t\t\tbottomSrc = -(link.srcObj.y_pos);\n\t\t\t\ttopTrg = -(link.trgNode.y_pos + link.trgNode.height);\n\t\t\t\tbottomTrg = -(link.trgNode.y_pos);\n\n\t\t\t// Don't rotate\n\t\t\t} else {\n\t\t\t\ttopSrc = link.srcObj.y_pos;\n\t\t\t\tbottomSrc = link.srcObj.y_pos + link.srcObj.height;\n\t\t\t\ttopTrg = link.trgNode.y_pos;\n\t\t\t\tbottomTrg = link.trgNode.y_pos + link.trgNode.height;\n\t\t\t}\n\t\t// When dragging out a new link we will not have src nor trg nodes so we\n\t\t// make a best guess at the node dimensions.\n\t\t} else {\n\t\t\t// Rotate anti-clockwise by 90 degrees\n\t\t\tif (link.srcDir === SOUTH) {\n\t\t\t\ttopSrc = -link.x1;\n\t\t\t\ttopTrg = -link.x2;\n\t\t\t\tbottomSrc = -link.x1;\n\t\t\t\tbottomTrg = -link.x2;\n\n\t\t\t// Rotate clockwise by 90 degrees\n\t\t\t} else if (link.srcDir === NORTH) {\n\t\t\t\ttopSrc = link.x1;\n\t\t\t\ttopTrg = link.x2;\n\t\t\t\tbottomSrc = link.x1;\n\t\t\t\tbottomTrg = link.x2;\n\n\t\t\t// Rotate by 180 degrees\n\t\t\t} else if (link.srcDir === WEST) {\n\t\t\t\ttopSrc = -link.y1;\n\t\t\t\ttopTrg = -link.y2;\n\t\t\t\tbottomSrc = -link.y1;\n\t\t\t\tbottomTrg = -link.y2;\n\n\t\t\t// Don't rotate\n\t\t\t} else {\n\t\t\t\ttopSrc = link.y1;\n\t\t\t\ttopTrg = link.y2;\n\t\t\t\tbottomSrc = link.y1;\n\t\t\t\tbottomTrg = link.y2;\n\t\t\t}\n\t\t}\n\n\t\t// Rotate the input data for TB and BT link configurations to be Left->Right\n\t\tif (link.srcDir === SOUTH) {\n\t\t\tlink = this.rotateData90Degrees(link, ANTI_CLOCKWISE);\n\n\t\t} else if (link.srcDir === NORTH) {\n\t\t\tlink = this.rotateData90Degrees(link, CLOCKWISE);\n\n\t\t} else if (link.srcDir === WEST) {\n\t\t\t// Rotate by 180 degrees\n\t\t\tlink = this.rotateData90Degrees(link, CLOCKWISE);\n\t\t\tlink = this.rotateData90Degrees(link, CLOCKWISE);\n\t\t}\n\n\t\tlink.trgDir = this.getRotatedTrgDir(link);\n\t\tconst saveSrcDir = link.srcDir;\n\t\tlink.srcDir = EAST;\n\n\t\tconst pathInfo = this.getPathInfo({ link, minInitialLine, topSrc, topTrg, bottomSrc, bottomTrg });\n\n\t\t// Restore source direction.\n\t\tlink.srcDir = saveSrcDir;\n\n\t\t// For TB and BT link directions rotate the path elements from Left-Right\n\t\t// back to the appropriate orientation.\n\t\tif (link.srcDir === SOUTH) {\n\t\t\tpathInfo.elements = this.rotateElements90Degrees(pathInfo.elements, CLOCKWISE);\n\t\t\tpathInfo.centerPoint = this.rotatePoint90Degrees(pathInfo.centerPoint.x, pathInfo.centerPoint.y, CLOCKWISE);\n\n\t\t} else if (link.srcDir === NORTH) {\n\t\t\tpathInfo.elements = this.rotateElements90Degrees(pathInfo.elements, ANTI_CLOCKWISE);\n\t\t\tpathInfo.centerPoint = this.rotatePoint90Degrees(pathInfo.centerPoint.x, pathInfo.centerPoint.y, ANTI_CLOCKWISE);\n\n\t\t} else if (link.srcDir === WEST) {\n\t\t\t// Rotate back by 180 degrees\n\t\t\tpathInfo.elements = this.rotateElements90Degrees(pathInfo.elements, ANTI_CLOCKWISE);\n\t\t\tpathInfo.elements = this.rotateElements90Degrees(pathInfo.elements, ANTI_CLOCKWISE);\n\t\t\tpathInfo.centerPoint = this.rotatePoint90Degrees(pathInfo.centerPoint.x, pathInfo.centerPoint.y, ANTI_CLOCKWISE);\n\t\t\tpathInfo.centerPoint = this.rotatePoint90Degrees(pathInfo.centerPoint.x, pathInfo.centerPoint.y, ANTI_CLOCKWISE);\n\t\t}\n\n\t\tpathInfo.path = this.createPath(pathInfo.elements);\n\n\t\treturn pathInfo;\n\t}\n\n\t// Returns a new data object based on the data object passed in with its\n\t// x1,y1 and x2,y2 coordinates rotated 90 degrees in the clockwise direction\n\t// or 90 degrees in the anti-clockwise direction if the antiClockwise\n\t// parameter is set to true.\n\trotateData90Degrees(data, antiClockwise) {\n\t\tconst newPoint1 = this.rotatePoint90Degrees(data.x1, data.y1, antiClockwise);\n\t\tconst newPoint2 = this.rotatePoint90Degrees(data.x2, data.y2, antiClockwise);\n\t\treturn { ...data, x1: newPoint1.x, y1: newPoint1.y, x2: newPoint2.x, y2: newPoint2.y };\n\t}\n\n\t// Returns the array of path elements passed in rotated by 90 degrees in the\n\t// clockwise direction or 90 degrees in the anti-clockwise direction if the\n\t// antiClockwise parameter is set to true.\n\trotateElements90Degrees(elements, antiClockwise) {\n\t\tlet newPoint;\n\t\telements.forEach((el) => {\n\t\t\tnewPoint = this.rotatePoint90Degrees(el.x, el.y, antiClockwise);\n\t\t\tel.x = newPoint.x;\n\t\t\tel.y = newPoint.y;\n\t\t\tif (el.p === \"Q\" || el.p === \"C\") {\n\t\t\t\tnewPoint = this.rotatePoint90Degrees(el.x2, el.y2, antiClockwise);\n\t\t\t\tel.x2 = newPoint.x;\n\t\t\t\tel.y2 = newPoint.y;\n\t\t\t\tif (el.p === \"C\") {\n\t\t\t\t\tnewPoint = this.rotatePoint90Degrees(el.x3, el.y3, antiClockwise);\n\t\t\t\t\tel.x3 = newPoint.x;\n\t\t\t\t\tel.y3 = newPoint.y;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn elements;\n\t}\n\n\t// Returns an object containing x and y coordinate passed in rotated by 90\n\t// degrees in the clockwise direction or by 90 degrees anti-clockwise if the\n\t// antiClockwise parameter is set to true.\n\t// https://math.stackexchange.com/questions/1330161/how-to-rotate-points-through-90-degree\n\trotatePoint90Degrees(x, y, antiClockwise) {\n\t\tif (antiClockwise) {\n\t\t\treturn { x: y, y: -x };\n\t\t}\n\t\treturn { x: -y, y: x };\n\t}\n\n\t// Returns a target direction which is rotated by an appropriate amount\n\t// based on the source direction. This allows us to create a link as if it\n\t// was drawn from an EAST direction port.\n\tgetRotatedTrgDir(link) {\n\t\t// Rotate anti-clockwise by 90 degrees\n\t\tif (link.srcDir === SOUTH) {\n\t\t\tswitch (link.trgDir) {\n\t\t\tcase SOUTH:\n\t\t\t\treturn EAST;\n\t\t\tcase NORTH:\n\t\t\t\treturn WEST;\n\t\t\tcase WEST:\n\t\t\t\treturn SOUTH;\n\t\t\tdefault:\n\t\t\tcase EAST:\n\t\t\t\treturn NORTH;\n\t\t\t}\n\n\t\t// Rotate clockwise by 90 degrees\n\t\t} else if (link.srcDir === NORTH) {\n\t\t\tswitch (link.trgDir) {\n\t\t\tcase SOUTH:\n\t\t\t\treturn WEST;\n\t\t\tcase NORTH:\n\t\t\t\treturn EAST;\n\t\t\tcase WEST:\n\t\t\t\treturn NORTH;\n\t\t\tdefault:\n\t\t\tcase EAST:\n\t\t\t\treturn SOUTH;\n\t\t\t}\n\n\t\t// Rotate 180 degrees\n\t\t} else if (link.srcDir === WEST) {\n\t\t\tswitch (link.trgDir) {\n\t\t\tcase SOUTH:\n\t\t\t\treturn NORTH;\n\t\t\tcase NORTH:\n\t\t\t\treturn SOUTH;\n\t\t\tcase WEST:\n\t\t\t\treturn EAST;\n\t\t\tdefault:\n\t\t\tcase EAST:\n\t\t\t\treturn WEST;\n\t\t\t}\n\t\t}\n\n\t\t// If link.srcDir is \"e\", don't rotate, keep target\n\t\t// dir as-is.\n\t\treturn link.trgDir;\n\t}\n\n\t// Returns an object containing the path string, center position and angle\n\t// for the line object passed in which describes a simple straight connector\n\t// line from source to target.\n\tgetStraightPath(link, minInitialLine) {\n\t\t// Self-referencing link.\n\t\tif (link.srcNodeId && link.trgNodeId && link.srcNodeId === link.trgNodeId) {\n\t\t\treturn this.selfRefLinkPath(link, minInitialLine);\n\t\t}\n\n\t\t// If the link has a centerDragPos, the link line will be in two parts.\n\t\tif (link.centerDragPos && link.centerDragPos !== \"revertLink\") {\n\t\t\treturn this.getStraightPathForCenterDrag(link);\n\t\t}\n\n\t\tconst path = \"M \" + link.x1 + \" \" + link.y1 + \" L \" + link.x2 + \" \" + link.y2;\n\t\tconst xDiff = link.x2 - link.x1;\n\t\tconst yDiff = link.y2 - link.y1;\n\t\tconst centerPoint = {\n\t\t\tx: link.x1 + (xDiff / 2),\n\t\t\ty: link.y1 + (yDiff / 2)\n\t\t};\n\n\t\tconst angle = CanvasUtils.calculateAngle(link.x1, link.y1, link.x2, link.y2);\n\n\t\treturn { path, centerPoint, angle };\n\t}\n\n\t// Returns a pathInfo object for a straight link line that is being dragged (from\n\t// near its center) towards a node to create two links into and out of the node.\n\t// The link path is therefore split into two parts.\n\tgetStraightPathForCenterDrag(link) {\n\t\tconst path = \"M \" + link.x1 + \" \" + link.y1 + \" L \" + link.centerDragPos.x + \" \" +\n\t\t\t\tlink.centerDragPos.y + \" \" + link.x2 + \" \" + link.y2;\n\n\t\tconst centerPoint = { x: link.centerDragPos.x, y: link.centerDragPos.y };\n\t\tconst angle = CanvasUtils.calculateAngle(link.centerDragPos.x, link.centerDragPos.y, link.x2, link.y2);\n\n\t\treturn { path, centerPoint, angle };\n\t}\n\n\t// Returns path info for a self-referencing\n\t// straight link.\n\tselfRefLinkPath(link, minInitialLine) {\n\t\tconst topInc = link.y2 - minInitialLine;\n\t\tconst rightInc = link.x1 + minInitialLine;\n\n\t\tconst path = \"M \" + link.x1 + \" \" + link.y1 +\n\t\t\t\" L \" +\n\t\t\trightInc + \" \" + link.y1 + \" \" +\n\t\t\trightInc + \" \" + topInc + \" \" +\n\t\t\tlink.x2 + \" \" + topInc + \" \" +\n\t\t\tlink.x2 + \" \" + link.y2;\n\n\t\tconst centerPoint = {\n\t\t\tx: link.x2 + ((rightInc - link.x2) / 2),\n\t\t\ty: topInc\n\t\t};\n\n\t\tconst angle = 180;\n\t\treturn { path, centerPoint, angle };\n\t}\n\n\n\tgetAssociationCurvePath(data, minInitialLine) {\n\t\tif (data.assocLinkVariation === ASSOC_VAR_CURVE_LEFT) {\n\t\t\treturn this.getCurveLeftPath(data, minInitialLine);\n\n\t\t} else if (data.assocLinkVariation === ASSOC_VAR_DOUBLE_BACK_LEFT) {\n\t\t\treturn this.getDoubleBackLeft(data, minInitialLine);\n\n\t\t} else if (data.assocLinkVariation === ASSOC_VAR_DOUBLE_BACK_RIGHT) {\n\t\t\treturn this.getDoubleBackRight(data, minInitialLine);\n\n\t\t}\n\t\treturn this.getCurveRightPath(data, minInitialLine);\n\t}\n\n\tgetCurveLeftPath(data, minInitialLine) {\n\t\tconst corner1X = data.x1 - ((data.x1 - data.x2) / 2);\n\t\treturn this.getCurveOutPath(data, minInitialLine, corner1X);\n\t}\n\n\tgetCurveRightPath(data, minInitialLine) {\n\t\tconst corner1X = data.x1 + ((data.x2 - data.x1) / 2);\n\t\treturn this.getCurveOutPath(data, minInitialLine, corner1X);\n\t}\n\n\tgetCurveOutPath(data, minInitialLine, corner1X) {\n\t\tconst corner1Y = data.y1;\n\t\tconst corner2X = corner1X;\n\t\tconst corner2Y = data.y2;\n\t\tconst path = \"M \" + data.x1 + \" \" + data.y1 +\n\t\t\t\" C \" + corner1X + \" \" + corner1Y + \" \" + corner2X + \" \" + corner2Y + \" \" + data.x2 + \" \" + data.y2;\n\t\tconst centerPoint = { x: corner1X, y: corner1Y + ((corner2Y - corner1Y) / 2) };\n\t\treturn { path, centerPoint };\n\t}\n\n\tgetDoubleBackLeft(data, minInitialLine) {\n\t\tconst corner1X = Math.min(data.x1, data.x2) - minInitialLine - 100;\n\t\treturn this.getDoubleBack(data, minInitialLine, corner1X);\n\t}\n\n\tgetDoubleBackRight(data, minInitialLine) {\n\t\tconst corner1X = Math.max(data.x1, data.x2) + minInitialLine + 100;\n\t\treturn this.getDoubleBack(data, minInitialLine, corner1X);\n\t}\n\n\tgetDoubleBack(data, minInitialLine, corner1X) {\n\t\tconst corner1Y = data.y1;\n\t\tconst corner2X = corner1X;\n\t\tconst corner2Y = data.y2;\n\t\tconst path = \"M \" + data.x1 + \" \" + data.y1 +\n\t\t\t\" C \" + corner1X + \" \" + corner1Y + \" \" +\n\t\t\tcorner2X + \" \" + corner2Y + \" \" + data.x2 + \" \" + data.y2;\n\t\tconst centerPointX = CanvasUtils.getCenterPointCubicBezier(data.x1, corner1X, corner2X, data.x2);\n\t\tconst centerPointY = CanvasUtils.getCenterPointCubicBezier(data.y1, corner1Y, corner2Y, data.y2);\n\t\tconst centerPoint = { x: centerPointX, y: centerPointY };\n\t\treturn { path, centerPoint };\n\t}\n\n\t// Returns a pathInfo object describing an elbow connection line based on the\n\t// data object and minInitialLine passed in. The output object contains the\n\t// following fields:\n\t// elements - an array of path elements describing the line\n\t// centerPoint - an object with x, y coordinates for the center of the line\n\t// used for decoration placement.\n\tgetPathInfo(data) {\n\t\t// The minimum size of the line entering the target port. When\n\t\t// dynamically drawing a new connection we will not have a target node\n\t\t// so use a fixed value for this.\n\t\tdata.minFinalLine = data.link.trgNode ? data.link.trgNode.layout.minFinalLine : 30;\n\n\t\tswitch (data.link.trgDir) {\n\t\tcase NORTH:\n\t\t\treturn this.getPathInfoEN(data);\n\t\tcase SOUTH:\n\t\t\treturn this.getPathInfoES(data);\n\t\tcase EAST:\n\t\t\treturn this.getPathInfoEE(data);\n\t\tcase WEST:\n\t\tdefault:\n\t\t\treturn this.getPathInfoEW(data);\n\t\t}\n\t}\n\n\t// Returns an object describing the elements and center point for\n\t// a link line running from an East source port to West target port.\n\tgetPathInfoEW(data) {\n\t\tconst pad = this.canvasLayout.wrapAroundNodePadding;\n\t\tconst xDiff = data.link.x2 - data.link.x1;\n\n\t\tif (xDiff > data.minInitialLine + data.minFinalLine ||\n\t\t\t(xDiff > 0 && data.topSrc - pad < data.bottomTrg && data.bottomSrc + pad > data.topTrg)) {\n\n\t\t\tconst corner1 = {};\n\t\t\tconst corner2 = {};\n\n\t\t\tcorner1.x = data.link.x1 + data.minInitialLine;\n\t\t\tcorner1.y = data.link.y1;\n\t\t\tcorner2.x = corner1.x;\n\t\t\tcorner2.y = data.link.y2;\n\n\t\t\tif (xDiff > 0) {\n\t\t\t\tconst minXDiff = (2 * data.minInitialLine) - xDiff;\n\t\t\t\tif (minXDiff > 0) {\n\t\t\t\t\tcorner1.x = data.link.x1 + data.minInitialLine - (minXDiff / 2);\n\t\t\t\t\tcorner2.x = corner1.x;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.get3PartLink(data, corner1, corner2);\n\n\t\t} else {\n\t\t\tconst corner1 = {};\n\t\t\tconst corner2 = {};\n\t\t\tconst corner3 = {};\n\t\t\tconst corner4 = {};\n\n\t\t\tconst midY = this.calculateMidY(data.link, data.topSrc, data.bottomSrc, data.topTrg, data.bottomTrg);\n\n\t\t\tcorner1.x = data.link.x1 + data.minInitialLine;\n\t\t\tcorner1.y = data.link.y1;\n\t\t\tcorner2.x = corner1.x;\n\t\t\tcorner2.y = midY;\n\t\t\tcorner3.x = data.link.x2 - data.minFinalLine;\n\t\t\tcorner3.y = corner2.y;\n\t\t\tcorner4.x = corner3.x;\n\t\t\tcorner4.y = data.link.y2;\n\n\t\t\treturn this.get5PartLink(data, corner1, corner2, corner3, corner4);\n\t\t}\n\t}\n\n\t// Returns an object describing the elements and center point for\n\t// a link line running from an East source port to East target port.\n\tgetPathInfoEE(data) {\n\t\tconst pad = this.canvasLayout.wrapAroundNodePadding;\n\n\t\tif (data.topTrg - pad < data.link.y1 && data.bottomTrg + pad > data.link.y1) {\n\t\t\tconst corner1 = {};\n\t\t\tconst corner2 = {};\n\t\t\tconst corner3 = {};\n\t\t\tconst corner4 = {};\n\n\t\t\tcorner1.x = data.link.x1 + data.minInitialLine;\n\t\t\tcorner1.y = data.link.y1;\n\t\t\tcorner2.x = corner1.x;\n\t\t\tcorner2.y = data.link.x1 >= data.link.x2 ? data.link.y1 + ((data.link.y2 - data.link.y1) / 2) : (data.topTrg - pad);\n\t\t\tcorner3.x = data.link.x2 + data.minFinalLine;\n\t\t\tcorner3.y = corner2.y;\n\t\t\tcorner4.x = corner3.x;\n\t\t\tcorner4.y = data.link.y2;\n\n\t\t\tif (data.link.x2 < data.link.x1) {\n\t\t\t\tcorner2.y = data.topSrc - pad;\n\t\t\t\tcorner3.y = corner2.y;\n\t\t\t}\n\n\t\t\treturn this.get5PartLink(data, corner1, corner2, corner3, corner4);\n\n\t\t} else {\n\t\t\tconst corner1 = {};\n\t\t\tconst corner2 = {};\n\n\t\t\tcorner1.x = Math.max(data.link.x1 + data.minInitialLine, data.link.x2 + data.minFinalLine);\n\t\t\tcorner1.y = data.link.y1;\n\t\t\tcorner2.x = corner1.x;\n\t\t\tcorner2.y = data.link.y2;\n\n\t\t\treturn this.get3PartLink(data, corner1, corner2);\n\t\t}\n\t}\n\n\t// Returns an object describing the elements and center point for\n\t// a link line running from an East source port to North target port.\n\tgetPathInfoEN(data) {\n\t\tif (data.link.y2 > data.link.y1 + data.minFinalLine &&\n\t\t\tdata.link.x2 > data.link.x1 + data.minInitialLine) {\n\t\t\tconst corner1 = {};\n\n\t\t\tcorner1.x = data.link.x2;\n\t\t\tcorner1.y = data.link.y1;\n\n\t\t\treturn this.get2PartLink(data, corner1);\n\t\t} else {\n\t\t\tconst corner1 = {};\n\t\t\tconst corner2 = {};\n\t\t\tconst corner3 = {};\n\n\t\t\tlet midY = data.link.y2 - data.minFinalLine;\n\n\t\t\tif (data.link.x2 < data.link.x1) {\n\t\t\t\tif (data.topTrg > data.bottomSrc + data.minFinalLine + this.canvasLayout.wrapAroundNodePadding) {\n\t\t\t\t\tmidY = data.topTrg - data.minFinalLine;\n\n\t\t\t\t} else if (data.topTrg > data.topSrc) {\n\t\t\t\t\tmidY = data.topSrc - this.canvasLayout.wrapAroundNodePadding;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcorner1.x = data.link.x1 + data.minInitialLine;\n\t\t\tcorner1.y = data.link.y1;\n\t\t\tcorner2.x = corner1.x;\n\t\t\tcorner2.y = midY;\n\t\t\tcorner3.x = data.link.x2;\n\t\t\tcorner3.y = corner2.y;\n\n\t\t\treturn this.get4PartLink(data, corner1, corner2, corner3);\n\t\t}\n\t}\n\n\t// Returns an object describing the elements and center point for\n\t// a link line running from an East source port to South target port.\n\tgetPathInfoES(data) {\n\t\tif (data.link.y1 > data.link.y2 + data.minFinalLine &&\n\t\t\tdata.link.x2 > data.link.x1) {\n\t\t\tconst corner1 = {};\n\n\t\t\tcorner1.x = data.link.x2;\n\t\t\tcorner1.y = data.link.y1;\n\n\t\t\treturn this.get2PartLink(data, corner1);\n\t\t} else {\n\t\t\tconst corner1 = {};\n\t\t\tconst corner2 = {};\n\t\t\tconst corner3 = {};\n\n\t\t\tlet midY = data.link.y2 + data.minFinalLine;\n\n\t\t\tif (data.link.x2 < data.link.x1) {\n\t\t\t\tif (data.bottomTrg < data.topSrc - data.minFinalLine - this.canvasLayout.wrapAroundNodePadding) {\n\t\t\t\t\tmidY = data.bottomTrg + data.minFinalLine;\n\n\t\t\t\t} else if (data.bottomTrg < data.bottomSrc) {\n\t\t\t\t\tmidY = data.bottomSrc + this.canvasLayout.wrapAroundNodePadding;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcorner1.x = data.link.x1 + data.minInitialLine;\n\t\t\tcorner1.y = data.link.y1;\n\t\t\tcorner2.x = corner1.x;\n\t\t\tcorner2.y = midY;\n\t\t\tcorner3.x = data.link.x2;\n\t\t\tcorner3.y = corner2.y;\n\n\t\t\treturn this.get4PartLink(data, corner1, corner2, corner3);\n\t\t}\n\t}\n\n\t// Returns a Y coordinate for the horizontal line that joins the source and\n\t// target nodes (to be connected either with a curve or elbow line style) when\n\t// the target node is to the left of the source node. This is either the\n\t// center point between the source and target nodes, if there is room to draw\n\t// the line between them, or it is the coordinate of a wrap-around line to be\n\t// drawn around the outside of the source and target nodes. The direction of\n\t// the wrap around line is chosen based on which is the shortest route from\n\t// the source port to the target port.\n\tcalculateMidY(data, topSrc, bottomSrc, topTrg, bottomTrg) {\n\t\tlet midY;\n\n\t\tif (topTrg >= bottomSrc + this.canvasLayout.wrapAroundNodePadding) {\n\t\t\tmidY = bottomSrc + ((topTrg - bottomSrc) / 2);\n\n\t\t} else if (bottomTrg <= topSrc - this.canvasLayout.wrapAroundNodePadding) {\n\t\t\tmidY = bottomTrg + ((topSrc - bottomTrg) / 2);\n\n\t\t} else {\n\t\t\tconst maxBottom = Math.max(bottomSrc, bottomTrg);\n\t\t\tconst srcBottomInc = maxBottom - data.y1;\n\t\t\tconst trgBottomInc = maxBottom - data.y2;\n\n\t\t\tconst minTop = Math.min(topSrc, topTrg);\n\t\t\tconst srcTopInc = data.y1 - minTop;\n\t\t\tconst trgTopInc = data.y2 - minTop;\n\n\t\t\t// Set the mid-point based in the shortest distance from the source port\n\t\t\t// on the source node to the target port on the target node.\n\t\t\tif (srcBottomInc + trgBottomInc > srcTopInc + trgTopInc) {\n\t\t\t\tmidY = minTop - this.canvasLayout.wrapAroundSpacing;\n\t\t\t} else {\n\t\t\t\tmidY = maxBottom + this.canvasLayout.wrapAroundSpacing;\n\t\t\t}\n\t\t}\n\n\t\treturn midY;\n\t}\n\n\tget2PartLink(data, corner1) {\n\t\tswitch (this.canvasLayout.linkType) {\n\t\tcase LINK_TYPE_ELBOW:\n\t\t\treturn this.get2PartElbow(data, corner1);\n\t\tcase LINK_TYPE_STRAIGHT:\n\t\t\treturn this.get2PartStraight(data, corner1);\n\t\tcase LINK_TYPE_PARALLAX:\n\t\t\treturn this.get2PartParallax(data, corner1);\n\t\tdefault:\n\t\t\treturn this.get2PartCurve(data, corner1);\n\t\t}\n\t}\n\n\tget3PartLink(data, corner1, corner2) {\n\t\tswitch (this.canvasLayout.linkType) {\n\t\tcase LINK_TYPE_ELBOW:\n\t\t\treturn this.get3PartElbow(data, corner1, corner2);\n\t\tcase LINK_TYPE_STRAIGHT:\n\t\t\treturn this.get3PartStraight(data, corner1, corner2);\n\t\tcase LINK_TYPE_PARALLAX:\n\t\t\treturn this.get3PartParallax(data, corner1, corner2);\n\t\tdefault:\n\t\t\treturn this.get3PartCurve(data, corner1, corner2);\n\t\t}\n\t}\n\n\tget4PartLink(data, corner1, corner2, corner3) {\n\t\tswitch (this.canvasLayout.linkType) {\n\t\tcase LINK_TYPE_ELBOW:\n\t\t\treturn this.get4PartElbow(data, corner1, corner2, corner3);\n\t\tcase LINK_TYPE_STRAIGHT:\n\t\t\treturn this.get4PartStraight(data, corner1, corner2, corner3);\n\t\tcase LINK_TYPE_PARALLAX:\n\t\t\treturn this.get4PartParallax(data, corner1, corner2, corner3);\n\t\tdefault:\n\t\t\treturn this.get4PartCurve(data, corner1, corner2, corner3);\n\t\t}\n\t}\n\n\tget5PartLink(data, corner1, corner2, corner3, corner4) {\n\t\tswitch (this.canvasLayout.linkType) {\n\t\tcase LINK_TYPE_ELBOW:\n\t\t\treturn this.get5PartElbow(data, corner1, corner2, corner3, corner4);\n\t\tcase LINK_TYPE_STRAIGHT:\n\t\t\treturn this.get5PartStraight(data, corner1, corner2, corner3, corner4);\n\t\tcase LINK_TYPE_PARALLAX:\n\t\t\treturn this.get5PartParallax(data, corner1, corner2, corner3, corner4);\n\t\tdefault:\n\t\t\treturn this.get5PartCurve(data, corner1, corner2, corner3, corner4);\n\t\t}\n\t}\n\n\tget2PartElbow(data, corner1) {\n\t\tconst elbowSizeY = data.link.y2 < corner1.y\n\t\t\t? -this.canvasLayout.elbowSize\n\t\t\t: this.canvasLayout.elbowSize;\n\n\t\tconst elements = [\n\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t{ p: \"L\", x: corner1.x - this.canvasLayout.elbowSize, y: corner1.y },\n\t\t\t{ p: \"Q\", x: corner1.x, y: corner1.y, x2: corner1.x, y2: (corner1.y + elbowSizeY) },\n\t\t\t{ p: \"L\", x: data.link.x2, y: data.link.y2 }\n\t\t];\n\n\t\t// Centerpoint is used to position decorations and context toolbars\n\t\tconst centerPoint = {\n\t\t\tx: data.link.x1 + ((data.link.x2 - data.link.x1) / 2),\n\t\t\ty: data.link.y1\n\t\t};\n\n\t\treturn { elements, centerPoint };\n\t}\n\n\tget3PartElbow(data, corner1, corner2) {\n\t\tconst c1ElbowSizeX = this.canvasLayout.elbowSize;\n\t\tconst c1ElbowSizeY = this.adjustElbowSize(corner2.y, corner1.y);\n\t\tconst c2ElbowSizeX = data.link.x2 > corner2.x ? this.canvasLayout.elbowSize : -this.canvasLayout.elbowSize;\n\n\t\tconst elements = [\n\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t{ p: \"L\", x: (corner1.x - c1ElbowSizeX), y: corner1.y },\n\t\t\t{ p: \"Q\", x: corner1.x, y: corner1.y, x2: corner1.x, y2: (corner1.y + c1ElbowSizeY) },\n\t\t\t{ p: \"L\", x: corner2.x, y: (corner2.y - c1ElbowSizeY) },\n\t\t\t{ p: \"Q\", x: corner2.x, y: corner2.y, x2: (corner2.x + c2ElbowSizeX), y2: corner2.y },\n\t\t\t{ p: \"L\", x: data.link.x2, y: data.link.y2 }\n\t\t];\n\n\t\t// Centerpoint is used to position decorations and context toolbars\n\t\tconst centerPoint = {\n\t\t\tx: corner1.x,\n\t\t\ty: data.link.y1 + ((data.link.y2 - data.link.y1) / 2)\n\t\t};\n\n\t\treturn { elements, centerPoint };\n\t}\n\n\tget4PartElbow(data, corner1, corner2, corner3) {\n\t\tconst c1ElbowSizeX = this.canvasLayout.elbowSize;\n\t\tconst c1ElbowSizeY = this.adjustElbowSize(corner2.y, corner1.y);\n\t\tconst c2ElbowSizeX = this.adjustElbowSize(corner1.x, corner3.x);\n\t\tconst c3ElbowSizeY = corner3.y > data.link.y2 ? this.canvasLayout.elbowSize : -this.canvasLayout.elbowSize;\n\n\t\tconst elements = [\n\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t{ p: \"L\", x: (corner1.x - c1ElbowSizeX), y: corner1.y },\n\t\t\t{ p: \"Q\", x: corner1.x, y: corner1.y, x2: corner1.x, y2: (corner1.y + c1ElbowSizeY) },\n\t\t\t{ p: \"L\", x: corner2.x, y: (corner2.y - c1ElbowSizeY) },\n\t\t\t{ p: \"Q\", x: corner2.x, y: corner2.y, x2: (corner2.x - c2ElbowSizeX), y2: corner2.y },\n\t\t\t{ p: \"L\", x: (corner3.x + c2ElbowSizeX), y: corner3.y },\n\t\t\t{ p: \"Q\", x: corner3.x, y: corner3.y, x2: corner3.x, y2: corner3.y - c3ElbowSizeY },\n\t\t\t{ p: \"L\", x: data.link.x2, y: data.link.y2 }\n\t\t];\n\n\t\t// Centerpoint is used to position decorations and context toolbars\n\t\tconst centerPoint = {\n\t\t\tx: corner2.x + ((corner3.x - corner2.x) / 2),\n\t\t\ty: corner2.y\n\t\t};\n\n\t\treturn { elements, centerPoint };\n\t}\n\n\tget5PartElbow(data, corner1, corner2, corner3, corner4) {\n\t\tconst c1ElbowSizeX = this.canvasLayout.elbowSize;\n\t\tconst c1ElbowSizeY = this.adjustElbowSize(corner2.y, corner1.y);\n\t\tconst c2ElbowSizeX = this.adjustElbowSize(corner1.x, corner3.x);\n\t\tconst c3ElbowSizeY = this.adjustElbowSize(corner3.y, corner4.y);\n\t\tconst c4ElbowSizeX = data.link.x2 < corner4.x ? -this.canvasLayout.elbowSize : this.canvasLayout.elbowSize;\n\n\t\tconst elements = [\n\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t{ p: \"L\", x: (corner1.x - c1ElbowSizeX), y: corner1.y },\n\t\t\t{ p: \"Q\", x: corner1.x, y: corner1.y, x2: corner1.x, y2: (corner1.y + c1ElbowSizeY) },\n\t\t\t{ p: \"L\", x: corner2.x, y: (corner2.y - c1ElbowSizeY) },\n\t\t\t{ p: \"Q\", x: corner2.x, y: corner2.y, x2: (corner2.x - c2ElbowSizeX), y2: corner2.y },\n\t\t\t{ p: \"L\", x: (corner3.x + c2ElbowSizeX), y: corner3.y },\n\t\t\t{ p: \"Q\", x: corner3.x, y: corner3.y, x2: corner3.x, y2: corner3.y - c3ElbowSizeY },\n\t\t\t{ p: \"L\", x: corner4.x, y: corner4.y + c3ElbowSizeY },\n\t\t\t{ p: \"Q\", x: corner4.x, y: corner4.y, x2: (corner4.x + c4ElbowSizeX), y2: corner4.y },\n\t\t\t{ p: \"L\", x: data.link.x2, y: data.link.y2 }\n\t\t];\n\n\t\t// Centerpoint is used to position decorations and context toolbars\n\t\tconst centerPoint = {\n\t\t\tx: corner2.x + ((corner3.x - corner2.x) / 2),\n\t\t\ty: corner2.y\n\t\t};\n\n\t\treturn { elements, centerPoint };\n\t}\n\n\tadjustElbowSize(val1, val2) {\n\t\tlet elbowSize = this.canvasLayout.elbowSize;\n\t\tconst diff = val2 - val1;\n\n\t\t// Reduce the size of the elbow when y position of src and trg are close\n\t\tif (diff < (2 * this.canvasLayout.elbowSize) &&\n\t\t\tdiff > -(2 * this.canvasLayout.elbowSize)) {\n\t\t\telbowSize = Math.abs(diff) / 2;\n\t\t}\n\n\t\t// Switch the sign of the elbow size.\n\t\telbowSize = diff > 0 ? -elbowSize : elbowSize;\n\n\t\treturn elbowSize;\n\t}\n\n\tget2PartParallax(data, corner1) {\n\t\tconst yInc = data.link.y2 > data.link.y1 ? -data.minFinalLine : data.minFinalLine;\n\t\tconst corner0 = {};\n\t\tconst corner2 = {};\n\t\tcorner0.x = data.link.x1 + data.minInitialLine;\n\t\tcorner0.y = corner1.y;\n\t\tcorner2.x = corner1.x;\n\t\tcorner2.y = data.link.y2 + yInc;\n\n\t\tconst elements = [\n\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t{ p: \"L\", x: corner0.x, y: corner1.y },\n\t\t\t{ p: \"L\", x: corner2.x, y: corner2.y },\n\t\t\t{ p: \"L\", x: data.link.x2, y: data.link.y2 }\n\t\t];\n\n\t\t// Centerpoint is used to position decorations and context toolbars\n\t\tconst midX = corner0.x + ((corner1.x - corner0.x) / 2);\n\t\tconst midY = corner0.y + ((corner2.y - corner0.y) / 2);\n\t\tconst centerPoint = { x: midX, y: midY };\n\n\t\treturn { elements, centerPoint };\n\t}\n\n\tget3PartParallax(data, corner1, corner2) {\n\t\tlet elements;\n\n\t\t// Centerpoint is used to position decorations and context toolbars\n\t\tlet centerPoint = { x: 0, y: 0 };\n\n\t\tif (data.link.x2 > corner2.x) {\n\t\t\tconst corner2a = {};\n\t\t\tcorner2a.x = data.link.x2 - Math.min(data.minFinalLine, data.link.x2 - corner1.x);\n\t\t\tcorner2a.y = data.link.y2;\n\t\t\telements = [\n\t\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t\t{ p: \"L\", x: corner1.x, y: corner1.y },\n\t\t\t\t{ p: \"L\", x: corner2a.x, y: corner2a.y },\n\t\t\t\t{ p: \"L\", x: data.link.x2, y: data.link.y2 }\n\t\t\t];\n\n\t\t\tcenterPoint = {\n\t\t\t\tx: corner1.x + ((corner2a.x - corner1.x) / 2),\n\t\t\t\ty: corner1.y + ((corner2a.y - corner1.y) / 2)\n\t\t\t};\n\n\t\t} else if (data.link.x2 < data.link.x1 + data.minInitialLine) {\n\t\t\telements = [\n\t\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t\t{ p: \"L\", x: corner1.x, y: corner1.y },\n\t\t\t\t{ p: \"L\", x: Math.max(corner2.x, data.link.x2), y: data.link.y2 },\n\t\t\t\t{ p: \"L\", x: data.link.x2, y: data.link.y2 }\n\t\t\t];\n\n\t\t\tcenterPoint = {\n\t\t\t\tx: data.link.x2 + ((corner2.x - data.link.x2) / 2),\n\t\t\t\ty: corner2.y\n\t\t\t};\n\n\t\t} else {\n\t\t\telements = [\n\t\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t\t{ p: \"L\", x: corner1.x, y: corner1.y },\n\t\t\t\t{ p: \"L\", x: data.link.x2 + data.minFinalLine, y: data.link.y2 },\n\t\t\t\t{ p: \"L\", x: data.link.x2, y: data.link.y2 }\n\t\t\t];\n\t\t\tcenterPoint = {\n\t\t\t\tx: corner1.x,\n\t\t\t\ty: corner1.y + ((data.link.y2 - corner1.y) / 2)\n\t\t\t};\n\t\t}\n\n\t\treturn { elements, centerPoint };\n\t}\n\n\tget4PartParallax(data, corner1, corner2, corner3) {\n\t\tconst elements = [\n\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t{ p: \"L\", x: (corner1.x), y: corner1.y },\n\t\t\t{ p: \"L\", x: corner2.x, y: corner2.y },\n\t\t\t{ p: \"L\", x: corner3.x, y: corner3.y },\n\t\t\t{ p: \"L\", x: data.link.x2, y: data.link.y2 }\n\t\t];\n\n\t\t// Centerpoint is used to position decorations and context toolbars\n\t\tconst centerPoint = {\n\t\t\tx: corner3.x + ((corner2.x - corner3.x) / 2),\n\t\t\ty: corner2.y\n\t\t};\n\n\t\treturn { elements, centerPoint };\n\t}\n\n\tget5PartParallax(data, corner1, corner2, corner3, corner4) {\n\t\tconst elements = [\n\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t{ p: \"L\", x: corner1.x, y: corner1.y },\n\t\t\t{ p: \"L\", x: corner2.x, y: corner2.y },\n\t\t\t{ p: \"L\", x: corner3.x, y: corner3.y },\n\t\t\t{ p: \"L\", x: corner4.x, y: corner4.y },\n\t\t\t{ p: \"L\", x: data.link.x2, y: data.link.y2 }\n\t\t];\n\n\t\t// Centerpoint is used to position decorations and context toolbars\n\t\tconst centerPoint = {\n\t\t\tx: corner3.x + ((corner2.x - corner3.x) / 2),\n\t\t\ty: corner2.y\n\t\t};\n\n\t\treturn { elements, centerPoint };\n\t}\n\n\tget2PartStraight(data, corner1) {\n\t\tconst elements = [\n\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t{ p: \"L\", x: data.link.x2, y: data.link.y2 }\n\t\t];\n\n\t\t// Centerpoint is used to position decorations and context toolbars\n\t\tconst centerPoint = {\n\t\t\tx: data.link.x1 + ((data.link.x2 - data.link.x1) / 2),\n\t\t\ty: data.link.y1 + ((data.link.y2 - data.link.y1) / 2)\n\t\t};\n\n\t\treturn { elements, centerPoint };\n\t}\n\n\tget3PartStraight(data, corner1, corner2) {\n\t\tlet elements;\n\t\tlet centerPoint = { x: 0, y: 0 };\n\t\tif (corner2.x < data.link.x2) {\n\t\t\telements = [\n\t\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t\t{ p: \"L\", x: data.link.x2, y: data.link.y2 }\n\t\t\t];\n\n\t\t\tcenterPoint = {\n\t\t\t\tx: data.link.x1 + ((data.link.x2 - data.link.x1) / 2),\n\t\t\t\ty: data.link.y1 + ((data.link.y2 - data.link.y1) / 2)\n\t\t\t};\n\n\t\t} else if (data.link.x2 < data.link.x1) {\n\t\t\telements = [\n\t\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t\t{ p: \"L\", x: corner1.x, y: corner2.y },\n\t\t\t\t{ p: \"L\", x: data.link.x2, y: data.link.y2 }\n\t\t\t];\n\n\t\t\tcenterPoint = {\n\t\t\t\tx: data.link.x2 + ((corner2.x - data.link.x2) / 2),\n\t\t\t\ty: corner2.y\n\t\t\t};\n\n\t\t} else {\n\t\t\telements = [\n\t\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t\t{ p: \"L\", x: corner1.x + data.minFinalLine, y: corner1.y },\n\t\t\t\t{ p: \"L\", x: data.link.x2, y: data.link.y2 }\n\t\t\t];\n\n\t\t\tcenterPoint = {\n\t\t\t\tx: data.link.x1 + ((corner1.x - data.link.x1) / 2),\n\t\t\t\ty: data.link.y1\n\t\t\t};\n\t\t}\n\n\t\treturn { elements, centerPoint };\n\t}\n\n\tget4PartStraight(data, corner1, corner2, corner3) {\n\t\tconst elements = [\n\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t{ p: \"L\", x: data.link.x1 + data.minInitialLine, y: corner2.y },\n\t\t\t{ p: \"L\", x: data.link.x2, y: corner2.y },\n\t\t\t{ p: \"L\", x: data.link.x2, y: data.link.y2 }\n\t\t];\n\n\t\t// Centerpoint is used to position decorations and context toolbars\n\t\tconst centerPoint = {\n\t\t\tx: corner3.x + ((corner2.x - corner3.x) / 2),\n\t\t\ty: corner2.y\n\t\t};\n\n\t\treturn { elements, centerPoint };\n\t}\n\n\tget5PartStraight(data, corner1, corner2, corner3, corner4) {\n\t\tconst xInc = corner4.x > data.link.x2 ? data.minFinalLine : -data.minFinalLine;\n\n\t\tconst elements = [\n\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t{ p: \"L\", x: corner1.x, y: corner2.y },\n\t\t\t{ p: \"L\", x: data.link.x2 + xInc, y: corner2.y },\n\t\t\t{ p: \"L\", x: data.link.x2 + xInc, y: data.link.y2 },\n\t\t\t{ p: \"L\", x: data.link.x2, y: data.link.y2 }\n\t\t];\n\n\t\t// Centerpoint is used to position decorations and context toolbars\n\t\tconst centerPoint = {\n\t\t\tx: corner3.x + ((corner2.x - corner3.x) / 2),\n\t\t\ty: corner2.y // data.link.y1 + ((corner2.y - data.link.y1) / 2)\n\t\t};\n\n\t\treturn { elements, centerPoint };\n\t}\n\n\tget2PartCurve(data, corner1) {\n\t\tconst elements = [\n\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t{ p: \"Q\", x: corner1.x, y: corner1.y, x2: data.link.x2, y2: data.link.y2 },\n\t\t];\n\n\t\t// Centerpoint is used to position decorations and context toolbars\n\t\tconst centerPoint = {\n\t\t\tx: CanvasUtils.getCenterPointQuadBezier(data.link.x1, corner1.x, data.link.x2),\n\t\t\ty: CanvasUtils.getCenterPointQuadBezier(data.link.y1, corner1.y, data.link.y2)\n\t\t};\n\n\t\treturn { elements, centerPoint };\n\t}\n\n\tget3PartCurve(data, corner1, corner2) {\n\t\tlet elements;\n\t\t// Centerpoint is used to position decorations and context toolbars\n\t\tlet centerPoint;\n\n\t\tif (corner1.x > data.link.x2) {\n\t\t\telements = [\n\t\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t\t{ p: \"C\", x: corner1.x + 80, y: corner1.y, x2: corner2.x + 20, y2: corner2.y, x3: data.link.x2, y3: data.link.y2 }\n\t\t\t];\n\n\t\t\tcenterPoint = {\n\t\t\t\tx: CanvasUtils.getCenterPointCubicBezier(data.link.x1, corner1.x + 80, corner2.x, data.link.x2),\n\t\t\t\ty: CanvasUtils.getCenterPointCubicBezier(data.link.y1, corner1.y, corner2.y, data.link.y2),\n\t\t\t};\n\n\t\t} else {\n\t\t\tconst corner1a = {};\n\t\t\tcorner1a.x = data.link.x1 + ((data.link.x2 - data.link.x1) / 2);\n\n\t\t\telements = [\n\t\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t\t{ p: \"C\", x: corner1a.x, y: corner1.y, x2: corner1a.x, y2: corner2.y, x3: data.link.x2, y3: data.link.y2 }\n\t\t\t];\n\n\t\t\tcenterPoint = {\n\t\t\t\tx: corner1a.x,\n\t\t\t\ty: corner1.y + ((corner2.y - corner1.y) / 2),\n\t\t\t};\n\t\t}\n\n\t\treturn { elements, centerPoint };\n\t}\n\n\tget4PartCurve(data, corner1, corner2, corner3) {\n\t\tconst xDiff = data.link.x2 - corner1.x;\n\t\tconst xSeparation = Math.min(200, Math.abs(xDiff));\n\t\tconst xInc = xDiff > 0 ? -xSeparation / 2 : xSeparation / 2;\n\n\t\tconst corner1a = {};\n\t\tconst corner2a = {};\n\t\tconst corner2b = {};\n\t\tcorner1a.x = corner1.x;\n\t\tcorner1a.y = corner1.y + ((corner2.y - corner1.y) / 2);\n\t\tcorner2a.x = corner2.x - xInc;\n\t\tcorner2a.y = corner2.y;\n\t\tcorner2b.x = corner3.x + xInc;\n\t\tcorner2b.y = corner2.y;\n\n\t\tconst elements = [\n\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t{ p: \"Q\", x: corner1.x, y: corner1.y, x2: corner1a.x, y2: corner1a.y },\n\t\t\t{ p: \"Q\", x: corner2.x, y: corner2.y, x2: corner2a.x, y2: corner2a.y },\n\t\t\t{ p: \"L\", x: corner2b.x, y: corner2b.y },\n\t\t\t{ p: \"Q\", x: corner3.x, y: corner3.y, x2: data.link.x2, y2: data.link.y2 },\n\t\t];\n\n\t\t// Centerpoint is used to position decorations and context toolbars\n\t\tconst centerPoint = corner2a;\n\n\t\treturn { elements, centerPoint };\n\t}\n\n\tget5PartCurve(data, corner1, corner2, corner3, corner4) {\n\t\tconst xDiff = corner4.x - corner1.x;\n\t\tconst xSeparation = Math.min(200, Math.abs(xDiff));\n\t\tconst xInc = xDiff > 0 ? -xSeparation / 2 : xSeparation / 2;\n\n\t\tconst corner1a = {};\n\t\tconst corner2a = {};\n\t\tconst corner2b = {};\n\t\tconst corner3a = {};\n\t\tcorner1a.x = corner1.x;\n\t\tcorner1a.y = corner1.y + ((corner2.y - corner1.y) / 2);\n\t\tcorner2a.x = corner2.x - xInc;\n\t\tcorner2a.y = corner2.y;\n\t\tcorner2b.x = corner3.x + xInc;\n\t\tcorner2b.y = corner2.y;\n\t\tcorner3a.x = corner3.x;\n\t\tcorner3a.y = data.link.y2 - ((data.link.y2 - corner3.y) / 2);\n\n\t\tconst elements = [\n\t\t\t{ p: \"M\", x: data.link.x1, y: data.link.y1 },\n\t\t\t{ p: \"Q\", x: corner1.x, y: corner1.y, x2: corner1a.x, y2: corner1a.y },\n\t\t\t{ p: \"Q\", x: corner2.x, y: corner2.y, x2: corner2a.x, y2: corner2a.y },\n\t\t\t{ p: \"L\", x: corner2b.x, y: corner2b.y },\n\t\t\t{ p: \"Q\", x: corner3.x, y: corner3.y, x2: corner3a.x, y2: corner3a.y },\n\t\t\t{ p: \"Q\", x: corner4.x, y: corner4.y, x2: data.link.x2, y2: data.link.y2 }\n\t\t];\n\n\t\t// Centerpoint is used to position decorations and context toolbars\n\t\tconst centerPoint = corner2a;\n\n\t\treturn { elements, centerPoint };\n\t}\n\n\t// Returns an SVG path string from the array of path elements passed in.\n\tcreatePath(elements) {\n\t\tconst count = elements.length - 1;\n\t\tlet path = \"\";\n\t\telements.forEach((el, i) => {\n\t\t\tif (el.p === \"M\") {\n\t\t\t\tpath += \"M \" + el.x + \" \" + el.y;\n\t\t\t} else if (el.p === \"L\") {\n\t\t\t\tpath += \"L \" + el.x + \" \" + el.y;\n\t\t\t} else if (el.p === \"T\") {\n\t\t\t\tpath += \"T \" + el.x + \" \" + el.y;\n\t\t\t} else if (el.p === \"Q\") {\n\t\t\t\tpath += \"Q \" + el.x + \" \" + el.y + \" \" + el.x2 + \" \" + el.y2;\n\t\t\t} else if (el.p === \"C\") {\n\t\t\t\tpath += \"C \" + el.x + \" \" + el.y + \" \" + el.x2 + \" \" + el.y2 + \" \" + el.x3 + \" \" + el.y3;\n\t\t\t}\n\t\t\tif (i < count) {\n\t\t\t\tpath += \" \";\n\t\t\t}\n\t\t});\n\t\treturn path;\n\t}\n}\n","/*\n * Copyright 2017-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { has } from \"lodash\";\nimport CanvasUtils from \"./common-canvas-utils.js\";\nimport {\n\tDEC_LINK, TEXT_AREA_BORDER_ADJUSTMENT,\n\tFLOW_IN, FLOW_OUT,\n} from \"./constants/canvas-constants\";\n\n\nexport default class SvgCanvasDecs {\n\tconstructor(canvasLayout) {\n\t\tthis.canvasLayout = canvasLayout;\n\t}\n\n\tgetDec(id, decorations) {\n\t\tif (decorations) {\n\t\t\tconst dec = decorations.find((nd) => nd.id === id);\n\t\t\treturn dec;\n\t\t}\n\t\treturn null;\n\t}\n\n\tgetDecLabelClass(dec, objType) {\n\t\tconst lineTypeClass = dec.label_single_line ? \" d3-label-single-line\" : \" d3-label-multi-line\";\n\t\tconst justificationClass = dec.label_align === \"center\" ? \" d3-label-center\" : \"\";\n\t\treturn this.getDecClass(dec, `d3-${objType}-dec-label`) + lineTypeClass + justificationClass;\n\t}\n\n\tgetDecLabelTextAreaClass(dec) {\n\t\tconst lineTypeClass = dec.label_single_line ? \" d3-label-single-line\" : \" d3-label-multi-line-entry\";\n\t\tconst justificationClass = dec.label_align === \"center\" ? \" d3-label-center\" : \"\";\n\t\treturn \"d3-dec-label-entry\" + lineTypeClass + justificationClass;\n\t}\n\n\tgetDecTransform(dec, d, objType) {\n\t\tconst rotate = this.getDecRotateTransform(dec, d, objType);\n\t\treturn `translate(${this.getDecPosX(dec, d, objType)}, ${this.getDecPosY(dec, d, objType)})` + rotate;\n\t}\n\n\n\t// Returns a rotate transform for a decoration, if the decoration is applied to\n\t// a link, and the link's rotate property is set to true, or empty sting otherwise.\n\tgetDecRotateTransform(dec, d, objType) {\n\t\tif (objType === \"link\" && dec.rotate) {\n\t\t\tconst angle = (dec.position === \"source\")\n\t\t\t\t? CanvasUtils.getLinkEndAngle(d, FLOW_OUT, this.canvasLayout)\n\t\t\t\t: CanvasUtils.getLinkEndAngle(d, FLOW_IN, this.canvasLayout);\n\n\t\t\treturn ` rotate(${angle})`;\n\t\t}\n\t\treturn \"\";\n\t}\n\n\tgetDecPosX(dec, data, objType) {\n\t\tif (objType === DEC_LINK) {\n\t\t\treturn this.getLinkDecPosX(dec, data, objType);\n\t\t}\n\t\treturn this.getNodeDecPosX(dec, data);\n\t}\n\n\tgetNodeDecPosX(dec, node) {\n\t\tconst position = dec.position || \"topLeft\";\n\t\tlet x = 0;\n\t\tif (position === \"topLeft\" || position === \"middleLeft\" || position === \"bottomLeft\") {\n\t\t\tx = typeof dec.x_pos !== \"undefined\" ? Number(dec.x_pos) : node.layout.decoratorLeftX;\n\t\t} else if (position === \"topCenter\" || position === \"middleCenter\" || position === \"bottomCenter\") {\n\t\t\tx = (node.width / 2) + (typeof dec.x_pos !== \"undefined\" ? Number(dec.x_pos) : node.layout.decoratorCenterX);\n\t\t} else if (position === \"topRight\" || position === \"middleRight\" || position === \"bottomRight\") {\n\t\t\tx = node.width + (typeof dec.x_pos !== \"undefined\" ? Number(dec.x_pos) : node.layout.decoratorRightX);\n\t\t}\n\t\treturn x;\n\t}\n\n\tgetLinkDecPosX(dec, link, objType) {\n\t\tconst position = dec.position || \"middle\";\n\t\tlet x = 0;\n\t\tif (position === \"middle\") {\n\t\t\tx = link.pathInfo.centerPoint ? link.pathInfo.centerPoint.x : link.x1 + ((link.x2 - link.x1) / 2);\n\t\t} else if (position === \"source\") {\n\t\t\tx = link.pathInfo.sourcePoint ? link.pathInfo.sourcePoint.x : link.x1;\n\t\t} else if (position === \"target\") {\n\t\t\tx = link.pathInfo.targetPoint ? link.pathInfo.targetPoint.x : link.x2;\n\t\t}\n\t\tx = typeof dec.x_pos !== \"undefined\" ? x + Number(dec.x_pos) : x;\n\n\t\t// 'angle' will only be available when displaying straight link lines so\n\t\t// distance field is only applicable with straight lines.\n\t\t// 'angle' may be 0 so use has to check that it is not undefined.\n\t\tif (dec.distance && has(link, \"pathInfo.angle\")) {\n\t\t\tconst angleInRadians = link.pathInfo.angle * (Math.PI / 180);\n\t\t\tx += Math.cos(angleInRadians) * dec.distance;\n\t\t}\n\n\t\t// Subtract half the width for center aligned labels.\n\t\tif (dec.label_align === \"center\") {\n\t\t\tx -= this.getDecWidth(dec, link, objType) / 2;\n\t\t}\n\t\treturn x;\n\t}\n\n\tgetDecPosY(dec, data, objType) {\n\t\tif (objType === DEC_LINK) {\n\t\t\treturn this.getLinkDecPosY(dec, data);\n\t\t}\n\t\treturn this.getNodeDecPosY(dec, data);\n\t}\n\n\tgetNodeDecPosY(dec, node) {\n\t\tconst position = dec.position || \"topLeft\";\n\t\tlet y = 0;\n\t\tif (position === \"topLeft\" || position === \"topCenter\" || position === \"topRight\") {\n\t\t\ty = typeof dec.y_pos !== \"undefined\" ? Number(dec.y_pos) : node.layout.decoratorTopY;\n\t\t} else if (position === \"middleLeft\" || position === \"middleCenter\" || position === \"middleRight\") {\n\t\t\ty = (node.height / 2) + (typeof dec.y_pos !== \"undefined\" ? Number(dec.y_pos) : node.layout.decoratorMiddleY);\n\t\t} else if (position === \"bottomLeft\" || position === \"bottomCenter\" || position === \"bottomRight\") {\n\t\t\ty = node.height + (typeof dec.y_pos !== \"undefined\" ? Number(dec.y_pos) : node.layout.decoratorBottomY);\n\t\t}\n\t\treturn y;\n\t}\n\n\tgetLinkDecPosY(dec, link) {\n\t\tconst position = dec.position || \"middle\";\n\t\tlet y = 0;\n\t\tif (position === \"middle\") {\n\t\t\ty = link.pathInfo.centerPoint ? link.pathInfo.centerPoint.y : link.y1 + ((link.y2 - link.y1) / 2);\n\t\t} else if (position === \"source\") {\n\t\t\ty = link.pathInfo.sourcePoint ? link.pathInfo.sourcePoint.y : link.y1;\n\t\t} else if (position === \"target\") {\n\t\t\ty = link.pathInfo.targetPoint ? link.pathInfo.targetPoint.y : link.y2;\n\t\t}\n\t\ty = typeof dec.y_pos !== \"undefined\" ? y + Number(dec.y_pos) : y;\n\n\t\t// 'angle' will only be available when displaying straight link lines so\n\t\t// distance field is only applicable with straight lines.\n\t\t// 'angle' may be 0 so use has to check that it is not undefined.\n\t\tif (dec.distance && has(link, \"pathInfo.angle\")) {\n\t\t\tconst angleInRadians = link.pathInfo.angle * (Math.PI / 180);\n\t\t\ty += Math.sin(angleInRadians) * dec.distance;\n\t\t}\n\n\t\treturn y;\n\t}\n\n\tgetDecPadding(dec, obj, objType) {\n\t\t// If outline is set to false we don't pad the decorator image.\n\t\tif (dec.outline === false) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (objType === DEC_LINK) {\n\t\t\treturn this.canvasLayout.linkDecoratorPadding;\n\t\t}\n\t\treturn obj.layout.decoratorPadding;\n\t}\n\n\tgetDecWidth(dec, obj, objType) {\n\t\tif (typeof dec.width !== \"undefined\") {\n\t\t\treturn Number(dec.width);\n\t\t} else if (objType === DEC_LINK) {\n\t\t\treturn this.canvasLayout.linkDecoratorWidth;\n\t\t}\n\t\treturn obj.layout.decoratorWidth;\n\t}\n\n\tgetDecHeight(dec, obj, objType) {\n\t\tif (typeof dec.height !== \"undefined\") {\n\t\t\treturn Number(dec.height);\n\t\t} else if (objType === DEC_LINK) {\n\t\t\treturn this.canvasLayout.linkDecoratorHeight;\n\t\t}\n\t\treturn obj.layout.decoratorHeight;\n\t}\n\n\tgetDecClass(dec, inClassName) {\n\t\tlet className = inClassName;\n\t\tif (dec && dec.class_name) {\n\t\t\tclassName += \" \" + dec.class_name;\n\t\t}\n\t\treturn className;\n\t}\n\n\tgetDecImage(dec) {\n\t\tif (dec) {\n\t\t\treturn dec.image;\n\t\t}\n\t\treturn \"\";\n\t}\n\n\tgetDecLabelEditIconTranslate(dec, obj, objType, spanObj, zoomScale) {\n\t\treturn `translate(${this.getDecLabelEditIconPosX(dec, obj, objType, spanObj, zoomScale)}, ${this.getDecLabelEditIconPosY(dec)})`;\n\t}\n\n\tgetDecLabelEditIconPosX(dec, obj, objType, spanObj, zoomScale) {\n\t\tconst minWidth = Math.min(spanObj.getBoundingClientRect().width, this.getDecLabelWidth(dec, obj, objType));\n\t\tif (dec.label_align === \"center\") {\n\t\t\tconst halfWid = this.getDecLabelWidth(dec, obj, objType) / 2;\n\t\t\treturn halfWid + (minWidth / 2) / zoomScale;\n\t\t}\n\t\treturn minWidth / zoomScale;\n\t}\n\n\tgetDecLabelEditIconPosY(dec) {\n\t\treturn 0;\n\t}\n\n\tgetDecLabelWidth(dec, obj, objType) {\n\t\tif (typeof dec.width !== \"undefined\") {\n\t\t\treturn Number(dec.width);\n\t\t} else if (objType === DEC_LINK) {\n\t\t\treturn this.canvasLayout.linkDecoratorLabelWidth;\n\t\t}\n\t\treturn obj.layout.decoratorLabelWidth;\n\t}\n\n\tgetDecLabelHeight(dec, obj, objType) {\n\t\tif (typeof dec.height !== \"undefined\") {\n\t\t\treturn Number(dec.height);\n\t\t} else if (objType === DEC_LINK) {\n\t\t\treturn this.canvasLayout.linkDecoratorLabelHeight;\n\t\t}\n\t\treturn obj.layout.decoratorLabelHeight;\n\t}\n\n\tgetDecLabelTextAreaWidth(dec, obj, objType) {\n\t\treturn this.getDecLabelWidth(dec, obj, objType) + (2 * TEXT_AREA_BORDER_ADJUSTMENT);\n\t}\n\n\tgetDecLabelTextAreaHeight(dec, obj, objType) {\n\t\treturn this.getDecLabelHeight(dec, obj, objType) + (2 * TEXT_AREA_BORDER_ADJUSTMENT);\n\t}\n\n\tgetDecLabelTextAreaPosX() {\n\t\treturn -TEXT_AREA_BORDER_ADJUSTMENT;\n\t}\n\n\tgetDecLabelTextAreaPosY() {\n\t\treturn -(TEXT_AREA_BORDER_ADJUSTMENT - 1);\n\t}\n}\n","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","/*\n * Copyright 2023-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport ReactDOM from \"react-dom\";\n\nimport Logger from \"../logging/canvas-logger.js\";\nimport CanvasUtils from \"./common-canvas-utils.js\";\n\nexport default class SvgCanvasExternal {\n\tconstructor(renderer) {\n\t\tthis.logger = new Logger(\"SVGCanvasExternal\");\n\t\tthis.ren = renderer;\n\t}\n\n\tisValidJsxElement(el) {\n\t\treturn React.isValidElement(el);\n\t}\n\n\tisReact18OrHigher() {\n\t\treturn Number(React.version.split(\".\")[0]) >= 18;\n\t}\n\n\taddNodeExternalObject(node, i, foreignObjects, pipeline) {\n\t\tconst jsx = (\n\t\t\t<node.layout.nodeExternalObject\n\t\t\t\tnodeData={node}\n\t\t\t\tpipelineData={pipeline}\n\t\t\t\tcanvasController={this.ren.canvasController}\n\t\t\t\texternalUtils={this}\n\t\t\t/>\n\t\t);\n\t\tthis.renderExternalObject(jsx, foreignObjects[i]);\n\t}\n\n\taddNodeImageExternalObject(image, i, foreignObjects) {\n\t\tthis.renderExternalObject(image, foreignObjects[i]);\n\t}\n\n\taddDecExternalObject(dec, i, foreignObjects) {\n\t\tthis.renderExternalObject(dec.jsx, foreignObjects[i]);\n\t}\n\n\taddJsxExternalObject(jsx, i, foreignObjects) {\n\t\tthis.renderExternalObject(jsx, foreignObjects[i]);\n\t}\n\n\trenderExternalObject(jsx, container) {\n\t\t// createRoot only available in React v18\n\t\tif (this.isReact18OrHigher()) {\n\t\t\tif (!container.ccExtRoot) {\n\t\t\t\tcontainer.ccExtRoot = createRoot(container);\n\t\t\t}\n\t\t\tcontainer.ccExtRoot.render(jsx);\n\n\t\t// Prior to React v18 we use ReactDOM.render\n\t\t} else {\n\t\t\t// eslint-disable-next-line react/no-deprecated\n\t\t\tReactDOM.render(jsx, container);\n\t\t}\n\t}\n\n\tremoveExternalObject(obj, i, foreignObjects) {\n\t\t// createRoot only available in React v18\n\t\tif (this.isReact18OrHigher()) {\n\t\t\tconst container = foreignObjects[i];\n\t\t\tif (!container.ccExtRoot) {\n\t\t\t\tcontainer.ccExtRoot = createRoot(container);\n\t\t\t}\n\t\t\t// Unmount in Timeout to stop this warning from appearing:\n\t\t\t// \"Warning: Attempted to synchronously unmount a root while\n\t\t\t// React was already rendering.\"\n\t\t\tsetTimeout(() => {\n\t\t\t\tcontainer.ccExtRoot.unmount();\n\t\t\t\tcontainer.ccExtRoot = null;\n\t\t\t});\n\n\t\t// Prior to React v18 we use ReactDOM.unmountComponentAtNode\n\t\t} else {\n\t\t\t// eslint-disable-next-line react/no-deprecated\n\t\t\tReactDOM.unmountComponentAtNode(foreignObjects[i]);\n\t\t}\n\t}\n\n\tgetActiveNodes() {\n\t\treturn this.ren.activePipeline.getNodes();\n\t}\n\n\tgetActiveNode(nodeId) {\n\t\treturn this.ren.activePipeline.getNode(nodeId);\n\t}\n\n\tsetPortPositions(info) {\n\t\tconst node = this.ren.activePipeline.getNode(info.nodeId);\n\t\tconst k = this.ren.zoomUtils.getZoomScale();\n\n\t\tif (info.inputPositions) {\n\t\t\tinfo.inputPositions.forEach((inputPos) => {\n\t\t\t\tconst inp = node.inputs.find((input) => input.id === inputPos.id);\n\t\t\t\tinp.cx = inputPos.cx / k;\n\t\t\t\tinp.cy = inputPos.cy / k;\n\t\t\t\tinp.dir = CanvasUtils.getPortDir(inp.cx, inp.cy, node);\n\t\t\t});\n\t\t}\n\t\tif (info.outputPositions) {\n\t\t\tinfo.outputPositions.forEach((outputPos) => {\n\t\t\t\tconst out = node.outputs.find((output) => output.id === outputPos.id);\n\t\t\t\tout.cx = outputPos.cx / k;\n\t\t\t\tout.cy = outputPos.cy / k;\n\t\t\t\tout.dir = CanvasUtils.getPortDir(out.cx, out.cy, node);\n\t\t\t});\n\t\t}\n\t\tthis.ren.displayMovedLinks();\n\t}\n\n\tsetNodesProperties(newProps) {\n\t\tif (newProps) {\n\t\t\tnewProps.forEach((np) => {\n\t\t\t\tconst node = this.ren.activePipeline.getNode(np.id);\n\t\t\t\tif (np.height) {\n\t\t\t\t\tnode.height = np.height;\n\t\t\t\t}\n\t\t\t\tif (np.width) {\n\t\t\t\t\tnode.width = np.width;\n\t\t\t\t}\n\t\t\t\tif (np.x_pos) {\n\t\t\t\t\tnode.x_pos = np.x_pos;\n\t\t\t\t}\n\t\t\t\tif (np.y_pos) {\n\t\t\t\t\tnode.y_pos = np.y_pos;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.ren.displayNodes();\n\t\t}\n\t}\n\n\traiseNodeToTopById(nodeId) {\n\t\tthis.ren.raiseNodeToTopById(nodeId);\n\t}\n}\n","var basePropertyOf = require('./_basePropertyOf');\n\n/** Used to map HTML entities to characters. */\nvar htmlUnescapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\"\n};\n\n/**\n * Used by `_.unescape` to convert HTML entities to characters.\n *\n * @private\n * @param {string} chr The matched character to unescape.\n * @returns {string} Returns the unescaped character.\n */\nvar unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\nmodule.exports = unescapeHtmlChar;\n","var toString = require('./toString'),\n unescapeHtmlChar = require('./_unescapeHtmlChar');\n\n/** Used to match HTML entities and HTML characters. */\nvar reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n reHasEscapedHtml = RegExp(reEscapedHtml.source);\n\n/**\n * The inverse of `_.escape`; this method converts the HTML entities\n * `&`, `<`, `>`, `"`, and `'` in `string` to\n * their corresponding characters.\n *\n * **Note:** No other HTML entities are unescaped. To unescape additional\n * HTML entities use a third-party library like [_he_](https://mths.be/he).\n *\n * @static\n * @memberOf _\n * @since 0.6.0\n * @category String\n * @param {string} [string=''] The string to unescape.\n * @returns {string} Returns the unescaped string.\n * @example\n *\n * _.unescape('fred, barney, & pebbles');\n * // => 'fred, barney, & pebbles'\n */\nfunction unescape(string) {\n string = toString(string);\n return (string && reHasEscapedHtml.test(string))\n ? string.replace(reEscapedHtml, unescapeHtmlChar)\n : string;\n}\n\nmodule.exports = unescape;\n","/*\n * Copyright 2017-2023 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport default class SvgCanvasUtilsComments {\n\n\t// Processes the action passed in and returns an object containing:\n\t// newText - new text based on the input text passed in with markdown\n\t// characters added based on the selected part of the text\n\t// newStart - a new starting point for selection highlighting\n\t// newEnd - a new ending point for selection highlighting\n\tstatic processMarkdownAction(action, text, inStart, inEnd) {\n\t\tlet start = inStart;\n\t\tlet end = inEnd;\n\t\tlet mdObj = null;\n\n\t\tif (start === end) {\n\t\t\tstart = this.findFirstSpace(text, start);\n\t\t\tend = this.findLastSpace(text, end);\n\n\t\t} else if (this.allWhiteSpace(text, start, end)) {\n\t\t\tstart = end;\n\n\t\t} else {\n\t\t\tstart = this.findFirstNonSpace(text, start, end);\n\t\t\tend = this.findLastNonSpace(text, start, end);\n\t\t}\n\n\t\tswitch (action) {\n\t\tcase \"title\":\n\t\tcase \"header\":\n\t\tcase \"subheader\":\n\t\tcase \"body\":\n\t\tcase \"increaseHashes\":\n\t\tcase \"decreaseHashes\": {\n\t\t\tmdObj = this.processHeaderCommand(text, start, end, action);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"bold\": {\n\t\t\tmdObj = this.processWrapCommand(text, start, end, \"**\");\n\t\t\tbreak;\n\t\t}\n\t\tcase \"italics\": {\n\t\t\tmdObj = this.processWrapCommand(text, start, end, \"_\");\n\t\t\tbreak;\n\t\t}\n\t\tcase \"strikethrough\": {\n\t\t\tmdObj = this.processWrapCommand(text, start, end, \"~~\");\n\t\t\tbreak;\n\t\t}\n\t\tcase \"code\": {\n\t\t\tmdObj = this.processCodeCommand(text, start, end);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"link\": {\n\t\t\tmdObj = this.processLinkCommand(text, start, end);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"quote\":\n\t\tcase \"numberedList\":\n\t\tcase \"bulletedList\": {\n\t\t\tmdObj = this.processMultiLineCommand(text, start, end, action);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"return\": {\n\t\t\tmdObj = this.processReturnCommand(text, start, end, inStart, inEnd);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tbreak;\n\t\t}\n\t\t}\n\t\treturn mdObj;\n\t}\n\n\tstatic findFirstSpace(text, start) {\n\t\tconst spacePos = text.lastIndexOf(\" \", start - 1) + 1;\n\t\tconst newLinePos = text.lastIndexOf(\"\\n\", start - 1) + 1;\n\t\treturn Math.max(spacePos, newLinePos, 0);\n\t}\n\n\tstatic findLastSpace(text, end) {\n\t\tlet spacePos = text.indexOf(\" \", end);\n\t\tlet newLinePos = text.indexOf(\"\\n\", end);\n\t\tspacePos = spacePos === -1 ? text.length : spacePos;\n\t\tnewLinePos = newLinePos === -1 ? text.length : newLinePos;\n\t\treturn Math.min(spacePos, newLinePos, text.length);\n\t}\n\n\tstatic allWhiteSpace(text, start, end) {\n\t\treturn text.slice(start, end).trim().length === 0;\n\t}\n\n\tstatic findFirstNonSpace(text, start, end) {\n\t\tlet newStart = start;\n\t\twhile ((text[newStart] === \" \" || text[newStart] === \"\\n\") && newStart <= end) {\n\t\t\tnewStart++;\n\t\t}\n\t\treturn newStart;\n\t}\n\n\tstatic findLastNonSpace(text, start, end) {\n\t\tlet newEnd = end;\n\t\twhile ((text[newEnd - 1] === \" \" || text[newEnd - 1] === \"\\n\") && newEnd >= start) {\n\t\t\tnewEnd--;\n\t\t}\n\t\treturn newEnd;\n\t}\n\n\tstatic processHeaderCommand(text, inStart, inEnd, action) {\n\t\tconst start = this.findPrecedingNewLine(text, inStart);\n\t\tconst end = this.findSucceedingNewLine(text, inEnd);\n\n\t\tconst startText = text.slice(0, start);\n\t\tconst selectedText = text.slice(start, end);\n\t\tconst endText = text.slice(end);\n\n\t\tlet newStart = start;\n\t\tlet newEnd = end;\n\t\tlet newText = \"\";\n\t\tlet tempText = selectedText;\n\n\t\t// Remove all hashes if any from the line.\n\t\tconst hashCount = this.getHashCount(selectedText);\n\t\tif (hashCount > 0) {\n\t\t\tconst firstSpace = selectedText.indexOf(\" \");\n\t\t\ttempText = selectedText.slice(firstSpace + 1);\n\t\t\tnewText = startText + tempText + endText;\n\t\t\tnewEnd -= firstSpace + 1;\n\t\t}\n\n\t\t// Add as many hashes as appropriate for the action.\n\t\tconst headerSyntax = this.getHeaderSyntax(action, hashCount);\n\t\tif (headerSyntax) {\n\t\t\tnewText = startText + headerSyntax + tempText + endText;\n\t\t\tnewStart += headerSyntax.length;\n\t\t\tnewEnd += headerSyntax.length;\n\t\t}\n\t\treturn { newText, newStart, newEnd };\n\t}\n\n\tstatic getHeaderSyntax(action, hashCount) {\n\t\tswitch (action) {\n\t\tcase \"title\": return \"# \";\n\t\tcase \"header\": return \"## \";\n\t\tcase \"subheader\": return \"### \";\n\t\tcase \"body\": return false;\n\t\tcase \"increaseHashes\": {\n\t\t\tif (hashCount === 0) {\n\t\t\t\treturn \"# \";\n\t\t\t} else if (hashCount === 1) {\n\t\t\t\treturn \"## \";\n\t\t\t} else if (hashCount === 2) {\n\t\t\t\treturn \"### \";\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tcase \"decreaseHashes\": {\n\t\t\tif (hashCount === 0) {\n\t\t\t\treturn \"### \";\n\t\t\t} else if (hashCount === 1) {\n\t\t\t\treturn false;\n\t\t\t} else if (hashCount === 2) {\n\t\t\t\treturn \"# \";\n\t\t\t} else if (hashCount === 3) {\n\t\t\t\treturn \"## \";\n\t\t\t}\n\t\t\treturn \"### \";\n\t\t}\n\t\tdefault:\n\t\t}\n\t\treturn false;\n\t}\n\n\tstatic getHashCount(text) {\n\t\tif (text.startsWith(\"# \")) {\n\t\t\treturn 1;\n\t\t} else if (text.startsWith(\"## \")) {\n\t\t\treturn 2;\n\t\t} else if (text.startsWith(\"### \")) {\n\t\t\treturn 3;\n\t\t} else if (text.startsWith(\"#### \")) {\n\t\t\treturn 4;\n\t\t} else if (text.startsWith(\"##### \")) {\n\t\t\treturn 5;\n\t\t} else if (text.startsWith(\"###### \")) {\n\t\t\treturn 6;\n\t\t}\n\t\treturn 0;\n\t}\n\n\tstatic processWrapCommand(text, start, end, chars) {\n\t\tlet newText = \"\";\n\t\tlet newStart = start;\n\t\tlet newEnd = end;\n\n\t\tconst startText = text.slice(0, start);\n\t\tconst selectedText = text.slice(start, end);\n\t\tconst endText = text.slice(end);\n\t\tconst charsCount = chars.length;\n\n\t\tif (startText.endsWith(chars) && endText.startsWith(chars)) {\n\t\t\tnewText = startText.slice(0, startText.length - charsCount) +\n\t\t\t\tselectedText +\n\t\t\t\tendText.slice(charsCount);\n\t\t\tnewStart = start - charsCount;\n\t\t\tnewEnd = end - charsCount;\n\n\t\t} else if (selectedText.startsWith(chars) && selectedText.endsWith(chars)) {\n\t\t\tnewText = startText +\n\t\t\t\tselectedText\n\t\t\t\t\t.slice(0, selectedText.length - charsCount) // Remove ending chars\n\t\t\t\t\t.slice(charsCount) + // Remove beginning chars\n\t\t\t\tendText;\n\t\t\tnewStart = start;\n\t\t\tnewEnd = end - (2 * charsCount);\n\n\t\t} else {\n\t\t\tnewText = startText + chars + selectedText + chars + endText;\n\t\t\tnewStart = start + charsCount;\n\t\t\tnewEnd = end + charsCount;\n\t\t}\n\n\t\treturn { newText, newStart, newEnd };\n\t}\n\n\tstatic processCodeCommand(text, start, end) {\n\t\tconst selText = text.slice(start, end);\n\t\tif (selText.indexOf(\"\\n\") > -1) {\n\t\t\treturn this.processTripleBackTicks(text, start, end);\n\t\t}\n\n\t\treturn this.processWrapCommand(text, start, end, \"`\");\n\t}\n\n\tstatic processTripleBackTicks(text, inStart, inEnd) {\n\t\tconst start = this.findPrecedingNewLine(text, inStart);\n\t\tconst end = this.findSucceedingNewLine(text, inEnd);\n\n\t\tconst startText = text.slice(0, start);\n\t\tconst selectedText = text.slice(start, end);\n\t\tconst endText = text.slice(end);\n\n\t\tlet newStart = start;\n\t\tlet newEnd = end;\n\t\tlet newText = \"\";\n\n\t\tif (startText.endsWith(\"```\\n\") && endText.startsWith(\"\\n```\")) {\n\t\t\tnewText = startText.slice(0, start - 4) + selectedText + endText.slice(4);\n\t\t\tnewStart -= 4;\n\t\t\tnewEnd -= 4;\n\n\t\t} else {\n\t\t\tnewText = startText + \"```\\n\" + selectedText + \"\\n```\" + endText;\n\t\t\tnewStart += 4;\n\t\t\tnewEnd += 4;\n\t\t}\n\n\t\treturn { newText, newStart, newEnd };\n\t}\n\n\tstatic processLinkCommand(text, start, end) {\n\t\tlet newText = \"\";\n\t\tlet newStart = start;\n\t\tlet newEnd = end;\n\n\t\tconst startText = text.slice(0, start);\n\t\tconst selectedText = text.slice(start, end);\n\t\tconst endText = text.slice(end);\n\n\t\tif (startText.endsWith(\"[\") && endText.startsWith(\"](url)\")) {\n\t\t\tnewText = startText.slice(0, startText.length - 1) + selectedText + endText.slice(6);\n\t\t\tnewStart = start - 1;\n\t\t\tnewEnd = end - 1;\n\n\t\t} else if (selectedText === \"[](url)\") {\n\t\t\tnewText = startText + endText;\n\t\t\tnewStart = start;\n\t\t\tnewEnd = newStart;\n\n\t\t} else if (start === end) {\n\t\t\tnewText = startText + \"[](url)\" + endText;\n\t\t\tnewStart = start + 1;\n\t\t\tnewEnd = start + 1;\n\n\t\t} else {\n\t\t\tnewText = startText + \"[\" + selectedText + \"](url)\" + endText;\n\t\t\tnewStart = start + 1;\n\t\t\tnewEnd = end + 1;\n\t\t}\n\n\t\treturn { newText, newStart, newEnd };\n\t}\n\n\tstatic processMultiLineCommand(text, start, end, action) {\n\t\tif (this.isMultiLineMarkdown(text, start, end, action)) {\n\t\t\treturn this.removeMultiLineMarkdown(text, start, end, action);\n\t\t}\n\t\treturn this.addMultiLineMarkdown(text, start, end, action);\n\t}\n\n\tstatic isMultiLineMarkdown(text, inStart, inEnd, action) {\n\t\tconst start = this.findPrecedingNewLine(text, inStart);\n\t\tconst end = this.findSucceedingNewLine(text, inEnd);\n\t\tconst selectedText = text.slice(start, end);\n\n\t\tconst lines = selectedText.split(\"\\n\");\n\t\treturn lines.every((line) => this.isMultiLineItem(line, action));\n\t}\n\n\tstatic isMultiLineItem(text, action) {\n\t\tswitch (action) {\n\t\tcase \"quote\":\n\t\t\treturn text.startsWith(\"> \");\n\t\tcase \"bulletedList\":\n\t\t\treturn text.startsWith(\"* \");\n\t\tcase \"numberedList\": {\n\t\t\tconst number = this.getPrefixNumber(text);\n\t\t\treturn (!isNaN(number) && number > 0);\n\t\t}\n\t\tdefault:\n\t\t}\n\t\treturn false;\n\t}\n\n\tstatic getPrefixNumber(text) {\n\t\tconst firstSpace = text.indexOf(\". \");\n\t\tconst firstText = text.slice(0, firstSpace);\n\t\treturn Number(firstText);\n\t}\n\n\tstatic removeMultiLineMarkdown(text, inStart, inEnd, action) {\n\t\tconst start = this.findPrecedingNewLine(text, inStart);\n\t\tconst end = this.findSucceedingNewLine(text, inEnd);\n\n\t\tconst startText = text.slice(0, start);\n\t\tconst selectedText = text.slice(start, end);\n\t\tconst endText = text.slice(end);\n\n\t\tconst newStart = start;\n\t\tlet newEnd = end;\n\t\tlet newText = startText;\n\n\t\tconst lines = selectedText.split(\"\\n\");\n\t\tlines.forEach((line, i) => {\n\t\t\tconst newLine = this.removeListPrefix(line, action);\n\t\t\tnewEnd -= (line.length - newLine.length);\n\t\t\tnewText += newLine;\n\t\t\tif (i < lines.length - 1) {\n\t\t\t\tnewText += \"\\n\";\n\t\t\t}\n\t\t});\n\t\tnewText += endText;\n\n\t\treturn { newText, newStart, newEnd };\n\t}\n\n\tstatic removeListPrefix(text, action) {\n\t\tswitch (action) {\n\t\tcase \"quote\":\n\t\t\treturn text.slice(2); // Remove 2 characters: \"> \"\n\t\tcase \"bulletedList\":\n\t\t\treturn text.slice(2); // Remove 2 characters: \"* \"\n\t\tcase \"numberedList\": {\n\t\t\tconst firstSpace = text.indexOf(\". \"); // Remove characters: \"5. \" or \"10. \"\n\t\t\treturn text.slice(firstSpace + 2);\n\t\t}\n\t\tdefault:\n\t\t}\n\t\treturn \"\";\n\t}\n\n\tstatic addMultiLineMarkdown(text, inStart, inEnd, action) {\n\t\tconst start = this.findPrecedingNewLine(text, inStart);\n\t\tconst end = this.findSucceedingNewLine(text, inEnd);\n\n\t\tconst startText = text.slice(0, start);\n\t\tconst selectedText = text.slice(start, end);\n\t\tconst endText = text.slice(end);\n\n\t\tlet newStart = start;\n\t\tlet newEnd = end;\n\t\tlet newText = startText;\n\n\t\tif (selectedText === \"\") {\n\t\t\tconst itemText = this.getListPrefix(action, 1);\n\t\t\tnewText = startText + itemText + endText;\n\t\t\tnewStart = start + itemText.length;\n\t\t\tnewEnd = newStart;\n\n\t\t} else {\n\t\t\tconst lines = selectedText.split(\"\\n\");\n\t\t\tlines.forEach((line, i) => {\n\t\t\t\tconst newLine = this.getListPrefix(action, i + 1, line);\n\t\t\t\tnewEnd += (newLine.length - line.length);\n\t\t\t\tnewText += newLine;\n\n\t\t\t\tif (i === lines.length - 1) {\n\t\t\t\t\tif (!newText.endsWith(\"\\n\") && endText && !endText.startsWith(\"\\n\\n\")) {\n\t\t\t\t\t\tnewText += \"\\n\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tnewText += \"\\n\";\n\t\t\t\t}\n\t\t\t});\n\t\t\tnewText += endText;\n\t\t}\n\n\t\treturn { newText, newStart, newEnd };\n\t}\n\n\tstatic getListPrefix(action, i, suffixText = \"\") {\n\t\tswitch (action) {\n\t\tcase \"quote\":\n\t\t\treturn \"> \" + suffixText;\n\t\tcase \"bulletedList\":\n\t\t\treturn \"* \" + suffixText;\n\t\tcase \"numberedList\":\n\t\t\treturn i + \". \" + suffixText;\n\t\tdefault:\n\t\t}\n\t\treturn null;\n\t}\n\n\tstatic findPrecedingNewLine(text, start) {\n\t\tlet preStart = start;\n\t\twhile (preStart > 0 && text[preStart - 1] !== \"\\n\") {\n\t\t\tpreStart--;\n\t\t}\n\t\treturn preStart;\n\t}\n\n\tstatic findSucceedingNewLine(text, end) {\n\t\tlet sucEnd = end;\n\t\twhile (sucEnd < text.length && text[sucEnd] !== \"\\n\") {\n\t\t\tsucEnd++;\n\t\t}\n\t\treturn sucEnd;\n\t}\n\n\tstatic processReturnCommand(text, inStart, inEnd, originalStart, originalEnd) {\n\t\tconst start = this.findPrecedingNewLine(text, inStart);\n\t\tconst end = this.findSucceedingNewLine(text, inEnd);\n\n\t\tconst startText = text.slice(0, start);\n\t\tconst selectedText = text.slice(start, end);\n\t\tconst endText = text.slice(end);\n\n\t\t// If cursor is at the beginning of the line we just let it insert the\n\t\t// newline by default, if not we insert a new multi-line element.\n\t\tif (!this.isCursorAtBeginningOfLine(start, originalStart, originalEnd)) {\n\t\t\tif (this.isMultiLineItem(selectedText, \"quote\")) {\n\t\t\t\treturn this.insertMultiLineItem(\">\", startText, selectedText, endText, end);\n\n\t\t\t} else if (this.isMultiLineItem(selectedText, \"bulletedList\")) {\n\t\t\t\treturn this.insertMultiLineItem(\"*\", startText, selectedText, endText, end);\n\n\t\t\t} else if (this.isMultiLineItem(selectedText, \"numberedList\")) {\n\t\t\t\tconst number = this.getPrefixNumber(selectedText) + 1; // Increment for next multi-line item\n\t\t\t\tconst newEndText = this.renumberEndText(endText, number);\n\t\t\t\treturn this.insertMultiLineItem(number + \".\", startText, selectedText, newEndText, end);\n\t\t\t}\n\t\t}\n\n\t\treturn null; // Return null is there is nothing to do so key processing is ignored.\n\t}\n\n\tstatic isCursorAtBeginningOfLine(start, originalStart, originalEnd) {\n\t\treturn (originalStart === originalEnd && originalStart === start);\n\t}\n\n\tstatic insertMultiLineItem(char, startText, selectedText, endText, end) {\n\t\tconst newText = startText + selectedText + \"\\n\" + char + \" \" + endText;\n\t\tconst newStart = end + 2 + char.length; // Add 2 for newline and space plus length of the char.\n\t\tconst newEnd = newStart;\n\t\treturn { newText, newStart, newEnd };\n\t}\n\n\tstatic renumberEndText(text, startIndex) {\n\t\tconst lines = text.split(\"\\n\");\n\t\tlet newText = \"\";\n\t\tlet finished = false;\n\n\t\tlines.forEach((line, i) => {\n\t\t\tif (this.isMultiLineItem(line, \"numberedList\") && finished === false) {\n\t\t\t\tnewText += this.renumberLine(line, startIndex + i);\n\t\t\t} else {\n\t\t\t\tnewText += line;\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tfinished = true; // As soon as we hit a line without a number we finished renumbering\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn newText;\n\t}\n\n\tstatic renumberLine(text, number) {\n\t\tconst firstSpace = text.indexOf(\". \");\n\t\treturn number + \". \" + text.slice(firstSpace + 2);\n\t}\n}\n","/*\n * Copyright 2017-2024 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* eslint no-invalid-this: \"off\" */\n/* eslint no-lonely-if: \"off\" */\n\nimport * as d3Selection from \"d3-selection\";\nconst d3 = Object.assign({}, d3Selection);\n\nimport { cloneDeep, isMatch, unescape as unescapeText } from \"lodash\";\n\nimport Logger from \"../logging/canvas-logger.js\";\nimport CanvasUtils from \"./common-canvas-utils.js\";\nimport KeyboardUtils from \"./keyboard-utils.js\";\nimport SvgCanvasMarkdown from \"./svg-canvas-utils-markdown.js\";\nimport {\n\tMARKDOWN, WYSIWYG\n} from \"./constants/canvas-constants.js\";\n\nconst BACKSPACE_KEY = 8;\nconst LEFT_ARROW_KEY = 37;\nconst UP_ARROW_KEY = 38;\nconst RIGHT_ARROW_KEY = 39;\nconst DOWN_ARROW_KEY = 40;\nconst DELETE_KEY = 46;\nconst A_KEY = 65;\n\nconst SCROLL_PADDING_COMMENT = 2;\nconst SCROLL_PADDING_LABEL = 12;\n\nconst WHITE = \"#FFFFFF\";\nconst BLACK = \"#000000\";\n\nexport default class SvgCanvasTextArea {\n\n\tconstructor(config, dispUtils, nodeUtils, decUtils, canvasController,\n\t\tcanvasDiv, activePipeline, removeTempCursorOverlay,\n\t\tdisplayCommentsCallback, displayLinksCallback, getCommentToolbarPosCallback,\n\t\taddCanvasZoomBehavior, removeCanvasZoomBehavior) {\n\n\t\tthis.config = config;\n\t\tthis.dispUtils = dispUtils;\n\t\tthis.nodeUtils = nodeUtils;\n\t\tthis.decUtils = decUtils;\n\t\tthis.canvasController = canvasController;\n\t\tthis.canvasDiv = canvasDiv;\n\t\tthis.activePipeline = activePipeline;\n\t\tthis.removeTempCursorOverlay = removeTempCursorOverlay;\n\t\tthis.displayCommentsCallback = displayCommentsCallback;\n\t\tthis.displayLinksCallback = displayLinksCallback;\n\t\tthis.getCommentToolbarPosCallback = getCommentToolbarPosCallback;\n\t\tthis.addCanvasZoomBehavior = addCanvasZoomBehavior;\n\t\tthis.removeCanvasZoomBehavior = removeCanvasZoomBehavior;\n\n\t\tthis.logger = new Logger(\"SvgCanvasTextArea\");\n\n\t\t// Allows us to track the editing of text (either comments or node labels)\n\t\tthis.editingText = false;\n\t\tthis.editingTextId = \"\";\n\n\t\t// Keeps track of when text is in the process of being added.\n\t\tthis.addingTextToTextArea = false;\n\n\t\t// Keeps track of textarea height.\n\t\tthis.textAreaHeight = null;\n\t}\n\n\tisEditingText() {\n\t\treturn this.editingText;\n\t}\n\n\tgetEditingTextId() {\n\t\treturn this.editingTextId;\n\t}\n\n\tdisplayCommentTextArea(d, parentDomObj) {\n\t\tthis.editingTextData = {\n\t\t\tid: d.id,\n\t\t\ttext: d.content,\n\t\t\tsingleLine: false,\n\t\t\tmaxCharacters: null,\n\t\t\tallowReturnKey: true,\n\t\t\ttextCanBeEmpty: true,\n\t\t\txPos: 0,\n\t\t\tyPos: 0,\n\t\t\twidth: d.width,\n\t\t\theight: d.height,\n\t\t\tautoSize: d.autoSize, // TODO - read from comment layout when canvas layout is refactored.\n\t\t\tcontentType: d.contentType,\n\t\t\tformats: d.formats,\n\t\t\tnewFormats: cloneDeep(d.formats),\n\t\t\tparentDomObj: parentDomObj,\n\t\t\tkeyboardInputCallback: d.contentType !== WYSIWYG && this.config.enableMarkdownInComments\n\t\t\t\t? this.commentKeyboardHandler.bind(this)\n\t\t\t\t: null,\n\t\t\tautoSizeCallback: this.autoSizeComment.bind(this),\n\t\t\tsaveTextChangesCallback: this.saveCommentChanges.bind(this),\n\t\t\tcloseTextAreaCallback: this.closeCommentTextArea.bind(this)\n\t\t};\n\n\t\tthis.displayEditableComment(this.editingTextData);\n\n\t\tif (this.dispUtils.isDisplayingFullPage()) {\n\t\t\tconst pos = this.getCommentToolbarPosCallback(d);\n\t\t\tif (d.contentType === WYSIWYG) {\n\t\t\t\tthis.canvasController.openTextToolbar(\n\t\t\t\t\tpos.x, pos.y,\n\t\t\t\t\tthis.editingTextData.newFormats,\n\t\t\t\t\tWYSIWYG,\n\t\t\t\t\tthis.wysiwygActionHandler.bind(this),\n\t\t\t\t\tthis.blurInTextToolbar.bind(this)\n\t\t\t\t);\n\n\t\t\t} else if (this.config.enableMarkdownInComments) {\n\t\t\t\tthis.canvasController.openTextToolbar(\n\t\t\t\t\tpos.x, pos.y,\n\t\t\t\t\tnull,\n\t\t\t\t\tMARKDOWN,\n\t\t\t\t\tthis.markdownActionHandler.bind(this),\n\t\t\t\t\tthis.blurInTextToolbar.bind(this)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Handles markdown actions initiated through the keyboard.\n\tcommentKeyboardHandler(d3Event) {\n\t\tconst action = this.getMarkdownAction(d3Event);\n\t\tif (action) {\n\t\t\tif (action !== \"return\") {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t}\n\t\t\tthis.markdownActionHandler(action, d3Event);\n\t\t}\n\t}\n\n\t// Called when the blur event occurs for the text toolbar.\n\tblurInTextToolbar(evt) {\n\t\t// When Cypress tests are running a call to focus() in addTextToTextArea()\n\t\t// can cause an incorrect blur event to be generated for the text toolbar\n\t\t// (where relatedTarget is null). This flag therefore allows us to avoid\n\t\t// that blur event that occurs while addTextToTextArea() is executing.\n\t\tif (this.addingTextToTextArea) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there is a relatedTarget and it is set to one of the elements for the\n\t\t// textarea, texttoolbar, etc we ignore the blur event.\n\t\tif (evt.relatedTarget &&\n\t\t\t\t(CanvasUtils.getParentElementWithClass(evt.relatedTarget, \"d3-comment-text-entry\") ||\n\t\t\t\tCanvasUtils.getParentElementWithClass(evt.relatedTarget, \"text-toolbar\") ||\n\t\t\t\tCanvasUtils.getParentElementWithClass(evt.relatedTarget, \"cds--overflow-menu-options__btn\"))) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If the blur event is occurring for an object outside of the textarea and\n\t\t// text toolbar we save the current text and close the textarea.\n\t\tthis.completeEditing(evt);\n\t}\n\n\t// Returns a markdown action to the comment text being edited, based\n\t// on keyboard input. Returns the same commands as the toolbar buttons.\n\tgetMarkdownAction(d3Event) {\n\t\tif (KeyboardUtils.boldCommand(d3Event)) {\n\t\t\treturn \"bold\";\n\t\t} else if (KeyboardUtils.italicsCommand(d3Event)) {\n\t\t\treturn \"italics\";\n\t\t} else if (KeyboardUtils.strikethroughCommand(d3Event)) {\n\t\t\treturn \"strikethrough\";\n\t\t} else if (KeyboardUtils.numberedListCommand(d3Event)) {\n\t\t\treturn \"numberedList\";\n\t\t} else if (KeyboardUtils.bulletedListCommand(d3Event)) {\n\t\t\treturn \"bulletedList\";\n\t\t} else if (KeyboardUtils.codeCommand(d3Event)) {\n\t\t\treturn \"code\";\n\t\t} else if (KeyboardUtils.linkCommand(d3Event)) {\n\t\t\treturn \"link\";\n\t\t} else if (KeyboardUtils.quoteCommand(d3Event)) {\n\t\t\treturn \"quote\";\n\t\t} else if (KeyboardUtils.incHashesCommand(d3Event)) {\n\t\t\treturn \"increaseHashes\";\n\t\t} else if (KeyboardUtils.decHashesCommand(d3Event)) {\n\t\t\treturn \"decreaseHashes\";\n\t\t} else if (KeyboardUtils.returnCommand(d3Event)) {\n\t\t\treturn \"return\";\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Handles any actions requested on the comment text to add markdown\n\t// characters to the text. evt can be either a d3Event object from D3 when\n\t// this method is called from keyboard entry in the textarea or it can be\n\t// a synthetic event object from React when called from the text toolbar.\n\tmarkdownActionHandler(action, evt) {\n\t\tthis.logger.log(\"markdownActionHandler - action = \" + action);\n\n\t\tconst textDiv = this.canvasDiv.selectAll(\".d3-comment-text-entry\")\n\t\t\t.node();\n\n\t\tconst pos = CanvasUtils.getSelectionPositions(textDiv);\n\n\t\tlet text = textDiv.innerText;\n\n\t\t// Using innerText adds a newline char to end of the text even\n\t\t// though one doesn't exist - so remove it.\n\t\tif (text.endsWith(\"\\n\")) {\n\t\t\ttext = text.slice(0, text.length - 1);\n\t\t}\n\n\t\tif (text) { // In Firefox, text can sometimes be null when adding newlines.\n\t\t\tconst mdObj = SvgCanvasMarkdown.processMarkdownAction(action, text, pos.start, pos.end);\n\t\t\tif (mdObj) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tthis.addTextToTextArea(mdObj, textDiv);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Handles any actions requested on the comment text to apply WYSIWYG\n\t// actions to the <div>. Actions can have an 'extra' parameter which\n\t// contains additional info. For example, \"background-color\" action\n\t// will have an extra parameter containing the color as a hex value.\n\twysiwygActionHandler(action, evt, editParam) {\n\t\tthis.logger.log(\"wysiwygActionHandler - action = \" + action + \" editParam = \" + editParam);\n\n\t\tif (!this.editingTextData.newFormats) {\n\t\t\tthis.editingTextData.newFormats = [];\n\t\t}\n\n\t\tif (action === \"align-left\" || action === \"align-center\" || action === \"align-right\") {\n\t\t\tthis.addReplaceFormat(\"alignHorizontally\", action);\n\n\t\t} else if (action === \"align-top\" || action === \"align-middle\" || action === \"align-bottom\") {\n\t\t\tthis.addReplaceFormat(\"alignVertically\", action);\n\n\t\t} else if (action === \"underline\" || action === \"strikethrough\") {\n\t\t\tthis.addAdditionalFormat(\"textDecoration\", action);\n\n\t\t} else if (action === \"text-color\") {\n\t\t\tthis.addReplaceFormat(\"textColor\", editParam);\n\n\t\t} else if (action === \"background-color\") {\n\t\t\tthis.addReplaceFormat(\"backgroundColor\", editParam);\n\t\t\tthis.setTextColorAppropriately(editParam);\n\n\t\t} else if (action.startsWith(\"text-size\")) {\n\t\t\tthis.addReplaceFormat(\"textSize\", action);\n\n\t\t} else if (action.startsWith(\"font\")) {\n\t\t\tthis.addReplaceFormat(\"fontType\", action);\n\n\t\t} else if (action.startsWith(\"outline\")) {\n\t\t\tthis.addReplaceFormat(\"outlineStyle\", action);\n\n\t\t} else if (action === \"bold\" || action === \"italics\") {\n\t\t\tthis.toggleFormat(action);\n\t\t}\n\t\tthis.canvasController.updateTextToolbarFormats(this.editingTextData.newFormats);\n\t}\n\n\t// Sets the text color appropriately for the background color passed in.\n\t// If a text color has not yet been specified, or a text color has been\n\t// specified and it is either black or white, sets an appropriate\n\t// text color (either black or white) based on the darkness of the background.\n\tsetTextColorAppropriately(backgroundColor) {\n\t\tconst textColorFormat = this.hasFormat(\"textColor\");\n\n\t\tif (!textColorFormat ||\n\t\t\t\ttextColorFormat.value === WHITE ||\n\t\t\t\ttextColorFormat.value === BLACK) {\n\t\t\tconst isDark = CanvasUtils.isDarkColor(backgroundColor);\n\t\t\tthis.addReplaceFormat(\"textColor\", (isDark ? WHITE : BLACK));\n\t\t}\n\t}\n\n\ttoggleFormat(type) {\n\t\tif (this.hasFormat(type)) {\n\t\t\tthis.removeFormat(type);\n\t\t} else {\n\t\t\tthis.addFormat(type);\n\t\t}\n\t}\n\n\thasFormat(type) {\n\t\treturn this.editingTextData.newFormats?.find((f) => f.type === type);\n\t}\n\n\taddReplaceFormat(type, action) {\n\t\tlet format = this.hasFormat(type);\n\t\tif (format) {\n\t\t\tformat.value = action;\n\t\t} else {\n\t\t\tformat = { type: type, value: action };\n\t\t\tthis.editingTextData.newFormats.push(format);\n\t\t}\n\n\t\tconst { field, value } = CanvasUtils.convertFormat(format);\n\n\t\tif (field && value) {\n\t\t\tthis.setWysiwygStyle(field, value);\n\t\t}\n\t}\n\n\taddAdditionalFormat(type, action) {\n\t\tlet format = this.hasFormat(type);\n\t\tif (format) {\n\t\t\tif (format.value.includes(action)) {\n\t\t\t\tformat.value = format.value.replace(action, \"\").trim();\n\t\t\t\tif (!format.value) {\n\t\t\t\t\tthis.removeFormat(type);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tformat.value += \" \" + action;\n\t\t\t}\n\t\t} else {\n\t\t\tformat = { type: type, value: action };\n\t\t\tthis.editingTextData.newFormats.push(format);\n\t\t}\n\n\t\tconst { field, value } = CanvasUtils.convertFormat(format);\n\n\t\tif (field && value) {\n\t\t\tthis.setWysiwygStyle(field, value);\n\t\t}\n\t}\n\n\taddFormat(type) {\n\t\tconst format = { type: type };\n\t\tthis.editingTextData.newFormats.push(format);\n\n\t\tconst { field, value } = CanvasUtils.convertFormat(format);\n\n\t\tif (field && value) {\n\t\t\tthis.setWysiwygStyle(field, value);\n\t\t}\n\t}\n\n\tremoveFormat(type) {\n\t\tthis.editingTextData.newFormats =\n\t\t\tthis.editingTextData.newFormats?.filter((f) => f.type !== type);\n\n\t\tconst { field } = CanvasUtils.convertFormat({ type });\n\n\t\tif (field) {\n\t\t\tthis.setWysiwygStyle(field, null);\n\t\t}\n\t}\n\n\tsetWysiwygStyle(field, value) {\n\t\tif (field === \"background-color\" && value === \"transparent\") {\n\t\t\td3.select(this.editingTextData.parentDomObj).selectAll(\".d3-comment-text\")\n\t\t\t\t.style(\"background-color\", \"transparent\");\n\t\t}\n\t\tconst commentEntry = this.foreignObjectComment.selectAll(\".d3-comment-text-entry\");\n\t\tcommentEntry.style(field, value);\n\t\tconst commentEntryElement = commentEntry.node();\n\t\tcommentEntryElement.focus();\n\t}\n\n\tfocusOnTextEntryElement(evt) {\n\t\tconst commentEntry = this.foreignObjectComment.selectAll(\".d3-comment-text-entry\");\n\t\tconst commentEntryElement = commentEntry.node();\n\t\tcommentEntryElement.focus();\n\t}\n\n\t// Replaces the text in the currently displayed <div> with the text\n\t// passed in. We use execCommand because this adds the inserted text to the\n\t// textarea's undo/redo stack whereas setting the text directly into the\n\t// textarea control does not.\n\taddTextToTextArea(mdObj, commentEntryElement) {\n\t\tthis.addingTextToTextArea = true;\n\t\tconst newText = unescapeText(mdObj.newText);\n\n\t\tcommentEntryElement.focus();\n\t\tCanvasUtils.selectNodeContents(commentEntryElement);\n\n\t\tdocument.execCommand(\"insertText\", false, newText);\n\t\tCanvasUtils.selectNodeRange(commentEntryElement, mdObj.newStart, mdObj.newEnd);\n\n\t\tthis.addingTextToTextArea = false;\n\t}\n\n\tautoSizeComment(textArea, data) {\n\t\tthis.logger.log(\"autoSizeComment - textAreaHt = \" + this.textAreaHeight + \" scroll ht = \" + textArea.scrollHeight);\n\n\t\tif (data.autoSize) {\n\t\t\tconst pad = this.foreignObjectLabel ? SCROLL_PADDING_LABEL : SCROLL_PADDING_COMMENT;\n\t\t\tconst scrollHeight = textArea.scrollHeight + pad;\n\n\t\t\tif (this.textAreaHeight < scrollHeight) {\n\t\t\t\tthis.textAreaHeight = scrollHeight;\n\t\t\t\tif (this.foreignObjectLabel) {\n\t\t\t\t\tthis.foreignObjectLabel.style(\"height\", this.textAreaHeight + \"px\");\n\n\t\t\t\t} else if (this.foreignObjectComment) {\n\t\t\t\t\tthis.foreignObjectComment.style(\"height\", this.textAreaHeight + \"px\");\n\t\t\t\t}\n\t\t\t\tthis.activePipeline.getComment(data.id).height = this.textAreaHeight;\n\t\t\t\tthis.displayCommentsCallback();\n\t\t\t\tthis.displayLinksCallback();\n\t\t\t}\n\t\t} else {\n\t\t\tif (this.commentHasScrollableText(data.parentDomObj)) {\n\t\t\t\tthis.removeCanvasZoomBehavior();\n\t\t\t} else {\n\t\t\t\tthis.addCanvasZoomBehavior();\n\t\t\t}\n\t\t}\n\t}\n\n\t// Returns true if the scroll <div>, in the foreignObject used for text entry,\n\t// has contents that are bigger than what the scroll <div> can accommodate.\n\tcommentHasScrollableText(element) {\n\t\tconst scrollDiv = element.getElementsByClassName(\"d3-comment-text-entry-scroll\");\n\n\t\tif (scrollDiv[0].clientHeight < scrollDiv[0].scrollHeight) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tsaveCommentChanges(taData, newText, newHeight) {\n\t\tconst comment = this.activePipeline.getComment(taData.id);\n\t\tconst data = {\n\t\t\teditType: \"editComment\",\n\t\t\teditSource: \"canvas\",\n\t\t\tid: comment.id,\n\t\t\tcontent: newText,\n\t\t\twidth: comment.width,\n\t\t\theight: newHeight,\n\t\t\tx_pos: comment.x_pos,\n\t\t\ty_pos: comment.y_pos,\n\t\t\tcontentType: taData.contentType,\n\t\t\tformats: taData.newFormats,\n\t\t\tpipelineId: this.activePipeline.id\n\t\t};\n\t\tthis.canvasController.editActionHandler(data);\n\t}\n\n\tcloseCommentTextArea() {\n\t\tthis.canvasController.closeTextToolbar();\n\t}\n\n\tdisplayNodeLabelTextArea(node, parentDomObj) {\n\t\t// Save the current style for the display <div> and set the style so the\n\t\t// <div> is hidden while the text area is displayed on top of it. This\n\t\t// prevents the <div> from protruding below the text area.\n\t\tthis.displayDiv = d3.select(parentDomObj).selectAll(\".d3-foreign-object-node-label div\");\n\t\tthis.displayDivStyle = this.displayDiv.attr(\"style\");\n\t\tthis.displayDiv.attr(\"style\", \"display:none;\");\n\n\t\tthis.editingTextData = {\n\t\t\tid: node.id,\n\t\t\ttext: node.label,\n\t\t\tsingleLine: node.layout.labelSingleLine,\n\t\t\tmaxCharacters: node.layout.labelMaxCharacters,\n\t\t\tallowReturnKey: node.layout.labelAllowReturnKey,\n\t\t\ttextCanBeEmpty: false,\n\t\t\txPos: this.nodeUtils.getNodeLabelTextAreaPosX(node),\n\t\t\tyPos: this.nodeUtils.getNodeLabelTextAreaPosY(node),\n\t\t\twidth: this.nodeUtils.getNodeLabelTextAreaWidth(node),\n\t\t\theight: this.nodeUtils.getNodeLabelTextAreaHeight(node),\n\t\t\tautoSize: true,\n\t\t\tclassName: this.nodeUtils.getNodeLabelTextAreaClass(node),\n\t\t\tparentDomObj: parentDomObj,\n\t\t\tautoSizeCallback: this.autoSizeMultiLineLabel.bind(this),\n\t\t\tsaveTextChangesCallback: this.saveNodeLabelChanges.bind(this),\n\t\t\tcloseTextAreaCallback: this.closeEntryTextArea.bind(this)\n\t\t};\n\t\tthis.displayEditableLabel(this.editingTextData);\n\t}\n\n\t// Increases the size of the editable multi-line text area for a label based\n\t// on the characters entered, and also ensures the maximum number of\n\t// characters for the label, if one is provided, is not exceeded.\n\t// This callback works for editable multi-line node labels and also\n\t// editable multi-line text decorations for either nodes or links.\n\tautoSizeMultiLineLabel(textArea, data) {\n\t\tthis.logger.log(\"autoSizeNodeLabel - textAreaHt = \" + this.textAreaHeight + \" scroll ht = \" + textArea.scrollHeight);\n\n\t\t// Restrict max characters in case text was pasted in to the text area.\n\t\tif (data.maxCharacters &&\n\t\t\t\ttextArea.value.length > data.maxCharacters) {\n\t\t\ttextArea.value = textArea.value.substring(0, data.maxCharacters);\n\t\t}\n\t\t// Temporarily set the height to zero so the scrollHeight will get set to\n\t\t// the full height of the text in the textarea. This allows us to close up\n\t\t// the text area when the lines of text reduce.\n\t\tif (this.foreignObjectLabel) {\n\t\t\tthis.foreignObjectLabel.style(\"height\", 0);\n\t\t\tconst scrollHeight = textArea.scrollHeight + SCROLL_PADDING_LABEL;\n\t\t\tthis.textAreaHeight = scrollHeight;\n\t\t\tthis.foreignObjectLabel.style(\"height\", this.textAreaHeight + \"px\");\n\t\t}\n\t}\n\n\tsaveNodeLabelChanges(taData, newText) {\n\t\tconst data = {\n\t\t\teditType: \"setNodeLabel\",\n\t\t\teditSource: \"canvas\",\n\t\t\tnodeId: taData.id,\n\t\t\tlabel: newText,\n\t\t\tpipelineId: this.activePipeline.id\n\t\t};\n\t\tthis.canvasController.editActionHandler(data);\n\t}\n\n\t// Called when the node label or decoration label text area is closing.\n\t// Resets the inline style of the <div>, that displays the text, back\n\t// to what is was before it was hidden when the entry text area opened.\n\tcloseEntryTextArea() {\n\t\tthis.displayDiv.attr(\"style\", this.displayDivStyle);\n\t}\n\n\t// Displays a <textarea> for editable a text decoration on either a node\n\t// or link.\n\tdisplayDecLabelTextArea(dec, obj, objType, parentDomObj) {\n\t\t// Save the current style for the display <div> and set the style so the\n\t\t// <div> is hidden while the text area is displayed on top of it. This\n\t\t// prevents the <div> from protruding below the text area.\n\t\tthis.displayDiv = d3.select(parentDomObj).selectAll(\".d3-foreign-object-dec-label div\");\n\t\tthis.displayDivStyle = this.displayDiv.attr(\"style\");\n\t\tthis.displayDiv.attr(\"style\", \"display:none;\");\n\n\t\tthis.editingTextData = {\n\t\t\tid: dec.id,\n\t\t\ttext: dec.label,\n\t\t\tsingleLine: dec.label_single_line || false,\n\t\t\tmaxCharacters: dec.label_max_characters || null,\n\t\t\tallowReturnKey: dec.label_allow_return_key || false,\n\t\t\ttextCanBeEmpty: false,\n\t\t\txPos: this.decUtils.getDecLabelTextAreaPosX(),\n\t\t\tyPos: this.decUtils.getDecLabelTextAreaPosY(),\n\t\t\twidth: this.decUtils.getDecLabelTextAreaWidth(dec, obj, objType),\n\t\t\theight: this.decUtils.getDecLabelTextAreaHeight(dec, obj, objType),\n\t\t\tautoSize: true,\n\t\t\tclassName: this.decUtils.getDecLabelTextAreaClass(dec),\n\t\t\tparentDomObj: parentDomObj,\n\t\t\tobjId: obj.id,\n\t\t\tobjType: objType,\n\t\t\tautoSizeCallback: this.autoSizeMultiLineLabel.bind(this),\n\t\t\tsaveTextChangesCallback: this.saveDecLabelChanges.bind(this),\n\t\t\tcloseTextAreaCallback: this.closeEntryTextArea.bind(this)\n\t\t};\n\t\tthis.displayEditableLabel(this.editingTextData);\n\t}\n\n\t// Handles saved changes to editable text decorations.\n\tsaveDecLabelChanges(taData, newText) {\n\t\tconst data = {\n\t\t\teditType: \"editDecorationLabel\",\n\t\t\teditSource: \"canvas\",\n\t\t\tdecId: taData.id,\n\t\t\tobjId: taData.objId,\n\t\t\tobjType: taData.objType,\n\t\t\tlabel: newText,\n\t\t\tpipelineId: this.activePipeline.id\n\t\t};\n\t\tthis.canvasController.editActionHandler(data);\n\t}\n\n\t// Displays a <textarea> to allow text entry and editing for: node labels; or\n\t// text decorations on either a node or link.\n\t// Eventually, it is possible that we could remove the <textarea> approach\n\t// and just use the <div> approach used in displayEditableComment.\n\tdisplayEditableLabel(data) {\n\t\tthis.textAreaHeight = data.height; // Save for comparison during auto-resize\n\t\tthis.editingText = true;\n\t\tthis.editingTextId = data.id;\n\n\t\tthis.foreignObjectLabel = d3.select(data.parentDomObj)\n\t\t\t.append(\"foreignObject\")\n\t\t\t.attr(\"class\", \"d3-foreign-object-text-entry\")\n\t\t\t.attr(\"width\", data.width)\n\t\t\t.attr(\"height\", data.height)\n\t\t\t.attr(\"x\", data.xPos)\n\t\t\t.attr(\"y\", data.yPos);\n\n\t\tconst textArea = this.foreignObjectLabel\n\t\t\t.append(\"xhtml:textarea\")\n\t\t\t.attr(\"class\", data.className)\n\t\t\t.text(unescapeText(data.text))\n\t\t\t.call(this.attachTextEntryListeners.bind(this));\n\n\t\ttextArea.node().focus();\n\n\t\t// Set the cursor to the end of the text.\n\t\ttextArea.node().setSelectionRange(data.text.length, data.text.length);\n\t}\n\n\t// Complete the text editing.\n\tcompleteEditing(evt) {\n\t\t// Close the temp cursor overlay in case it is open, due to a click\n\t\t// in the comment sizing area.\n\t\tthis.removeTempCursorOverlay();\n\n\t\tif (this.foreignObjectLabel) {\n\t\t\tconst commentEntry = this.foreignObjectLabel.selectAll(\"textarea\");\n\t\t\tconst commentEntryElement = commentEntry.node();\n\t\t\tthis.textContentSaved = true;\n\t\t\tthis.saveAndCloseTextArea(this.editingTextData, commentEntryElement, evt);\n\n\t\t} else if (this.foreignObjectComment) {\n\t\t\tconst commentEntry = this.foreignObjectComment.selectAll(\".d3-comment-text-entry\");\n\t\t\tconst commentEntryElement = commentEntry.node();\n\t\t\tthis.textContentSaved = true;\n\t\t\tthis.saveAndCloseTextArea(this.editingTextData, commentEntryElement, evt);\n\t\t}\n\t}\n\n\tsaveAndCloseTextArea(data, element, d3Event) {\n\t\tconst newValue = this.foreignObjectComment ? element.innerText : element.value;\n\n\t\t// If there is no text for the label and textCanBeEmpty is false\n\t\t// just return, so label returns to what it was before editing started.\n\t\tif (!newValue && !data.textCanBeEmpty) {\n\t\t\tthis.closeTextArea(data);\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\treturn;\n\t\t}\n\t\t// We close the text area before saving the changes therefore, cache\n\t\t// the text value since it will be unavailable after the text area closes.\n\t\tconst newText = newValue;\n\t\tthis.closeTextArea(data);\n\t\tif (data.text !== newText || this.textAreaHeight !== data.height ||\n\t\t\t\t!this.areFormatsTheSame(data.formats, data.newFormats)) {\n\t\t\tdata.saveTextChangesCallback(data, newText, this.textAreaHeight);\n\t\t} else {\n\t\t\td3.select(data.parentDomObj).selectAll(\".d3-comment-text\")\n\t\t\t\t.style(\"display\", \"table-cell\");\n\t\t\tthis.canvasController.restoreFocus();\n\t\t}\n\t}\n\n\t// Returns true if the two formats arrays passed in are the same.\n\tareFormatsTheSame(f1, f2) {\n\t\tif (!f1 && !f2) {\n\t\t\treturn true;\n\t\t}\n\t\tif ((f1 && !f2) || (!f1 && f2)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (f1.length !== f2.length) {\n\t\t\treturn false;\n\t\t}\n\t\tconst remainder = f1.filter((f1Obj) => this.formatArrayIncludes(f1Obj, f2));\n\n\t\tif (remainder.length !== f1.length) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Returns true if object f1Obj is one of the elements of f2Array\n\tformatArrayIncludes(f1Obj, f2Array) {\n\t\treturn f2Array.find((f2Obj) =>\n\t\t\tisMatch(f1Obj, f2Obj) && isMatch(f1Obj, f1Obj));\n\t}\n\n\t// Resets the height of the text display area to its original height.\n\t// When the user enters multiple lines of text into a comment, the\n\t// underlying display area for the comment grows because the selection\n\t// highlighting (based on the display area) around the comment needs to\n\t// also increase in height. If the user then presses ESC, to cancel their\n\t// text entry, we need to reset the height of the text display area\n\t// to its original height. This is only necessary to do for comments and\n\t// not for node labels or decoration labels, because only comments show\n\t// selection highlighting.\n\tresetHeightOfTextDisplay(data) {\n\t\tconst com = this.activePipeline.getComment(data.id);\n\t\tif (com) {\n\t\t\tcom.height = data.height;\n\t\t\tthis.displayCommentsCallback();\n\t\t\tthis.displayLinksCallback();\n\t\t}\n\t}\n\n\t// Closes the text area and resets the flags.\n\tcloseTextArea(data) {\n\t\tif (data.closeTextAreaCallback) {\n\t\t\tdata.closeTextAreaCallback(data.id);\n\t\t}\n\t\tif (this.foreignObjectLabel) {\n\t\t\tthis.foreignObjectLabel.remove();\n\t\t\tthis.foreignObjectLabel = null;\n\n\t\t} else if (this.foreignObjectComment) {\n\t\t\t// Ensure hidden foreign object used for display is visible again\n\t\t\td3.select(this.editingTextData.parentDomObj)\n\t\t\t\t.selectAll(\".d3-foreign-object-comment-text\")\n\t\t\t\t.style(\"display\", null);\n\t\t\t// Tidy up\n\t\t\tthis.foreignObjectComment.remove();\n\t\t\tthis.foreignObjectComment = null;\n\t\t}\n\t\tthis.editingText = false;\n\t\tthis.editingTextId = \"\";\n\t}\n\n\t// Returns true if one of the keys that are allowed in the text area, when\n\t// checking for maximum characters, has been pressed.\n\ttextAreaAllowedKeys(d3Event) {\n\t\treturn d3Event.keyCode === DELETE_KEY ||\n\t\t\td3Event.keyCode === BACKSPACE_KEY ||\n\t\t\td3Event.keyCode === LEFT_ARROW_KEY ||\n\t\t\td3Event.keyCode === RIGHT_ARROW_KEY ||\n\t\t\td3Event.keyCode === UP_ARROW_KEY ||\n\t\t\td3Event.keyCode === DOWN_ARROW_KEY ||\n\t\t\t(d3Event.keyCode === A_KEY && KeyboardUtils.isMetaKey(d3Event));\n\t}\n\n\t// Displays a <div> to allow text entry and editing of (regular or WYSIWYG)\n\t// comments. This is different to the way other text entry (node labels,\n\t// text decorations) is handled because the <div>, that is contained within a\n\t// parent <div>, is styled so the text can be aligned at the top, middle and\n\t// bottom of the parent.\n\tdisplayEditableComment(data) {\n\t\tthis.textAreaHeight = data.height; // Save for comparison during auto-resize\n\t\tthis.editingText = true;\n\t\tthis.editingTextId = data.id;\n\n\t\t// This hides the foreign object used for displaying the comment. This\n\t\t// is necessary because, if the user changes the comment's background color\n\t\t// to transparent, the underlying display comment would be visible and\n\t\t// differences between it and the comment entry control would show as a\n\t\t// ugly display.\n\t\t// This change will be reversed when the canvas refreshes, when text\n\t\t// editing is complete or, when editing ends with nothing saved.\n\t\td3.select(data.parentDomObj).selectAll(\".d3-foreign-object-comment-text\")\n\t\t\t.style(\"display\", \"none\");\n\n\t\tthis.foreignObjectComment = d3.select(data.parentDomObj)\n\t\t\t.append(\"foreignObject\")\n\t\t\t.attr(\"class\", \"d3-foreign-object-comment-text-entry\")\n\t\t\t.attr(\"width\", data.width)\n\t\t\t.attr(\"height\", data.height)\n\t\t\t.attr(\"x\", data.xPos)\n\t\t\t.attr(\"y\", data.yPos);\n\n\t\tthis.foreignObjectComment\n\t\t\t.append(\"xhtml:div\") // Provide a namespace when div is inside foreignObject\n\t\t\t.attr(\"class\", \"d3-comment-text-entry-scroll\")\n\t\t\t.on(\"mousedown\", (d3Event) => {\n\t\t\t\t// This is triggered when the user 'mousedown's on the scrollbar. In this\n\t\t\t\t// case, prevent propagation otherwise it causes a 'blur' event and ends\n\t\t\t\t// the edit mode.\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t})\n\t\t\t.each((d, i, commentTexts) => {\n\t\t\t\tconst commentElement = d3.select(commentTexts[i]);\n\t\t\t\tCanvasUtils.applyOutlineStyle(commentElement, d.formats); // Only apply outlineStyle format here\n\t\t\t})\n\n\t\t\t.append(\"xhtml:div\") // Provide a namespace when div is inside foreignObject\n\t\t\t.attr(\"class\", \"d3-comment-text-entry-outer\")\n\n\t\t\t.append(\"xhtml:div\") // Provide a namespace when div is inside foreignObject\n\t\t\t.attr(\"class\", \"d3-comment-text-entry\")\n\t\t\t.attr(\"contentEditable\", this.getContentEditableValue())\n\t\t\t.each((d, i, commentTexts) => {\n\t\t\t\tconst commentElement = d3.select(commentTexts[i]);\n\t\t\t\tCanvasUtils.applyNonOutlineStyle(commentElement, d.formats); // Apply all formats except outlineStyle\n\t\t\t})\n\t\t\t.text(unescapeText(data.text))\n\t\t\t.call(this.attachTextEntryListeners.bind(this));\n\n\t\t// Get the text <div> element.\n\t\tconst textDiv = this.canvasDiv.selectAll(\".d3-comment-text-entry\")\n\t\t\t.node();\n\n\t\t// We set the focus on the innermost <div> even though the focus\n\t\t// highlighting is displayed for the foreign object. This allows\n\t\t// key strokes to go to the <div>.\n\t\ttextDiv.focus();\n\n\t\t// Set the cursor to the end of the text.\n\t\tif (textDiv.childNodes.length > 0) {\n\t\t\tthis.setCursor(textDiv.childNodes[0], data.text?.length || 0);\n\t\t}\n\t\t// Scroll to the bottom of the text\n\t\ttextDiv.scrollIntoView({ behavior: \"instant\", block: \"end\" });\n\t}\n\n\t// Returns a value for the contentEditable field on a <div>. The\n\t// value \"plaintext-only\" prevents rich text being pasted into the <div>.\n\t// Crappy Firefox doesn't accept that value and doesn't even treat\n\t// the string as truthy, meaning we have to actually return a boolean true!!\n\tgetContentEditableValue() {\n\t\treturn navigator.userAgent.includes(\"Firefox\") ? true : \"plaintext-only\";\n\t}\n\n\t// Sets the cursor position in the editable <div>\n\tsetCursor(el, pos, posEnd) {\n\t\tvar range = document.createRange();\n\t\tvar sel = window.getSelection();\n\n\t\trange.setStart(el, pos);\n\n\t\tif (posEnd) {\n\t\t\trange.setEnd(el, posEnd);\n\t\t} else {\n\t\t\trange.collapse(true);\n\t\t}\n\n\t\tsel.removeAllRanges();\n\t\tsel.addRange(range);\n\t}\n\n\t// Attaches a common set of event listeners to the <textarea> (used for entry of\n\t// node label and text decorations) OR to the editable <div> used for entry of\n\t// regular or WYSIWYG comments. The behavior of the listeners is the same in this\n\t// code but lower level functions may behave differently depending on what element\n\t// <textarea> or <div> is used for text entry.\n\tattachTextEntryListeners(textEntrySel) {\n\t\tconst data = this.editingTextData;\n\n\t\ttextEntrySel\n\t\t\t.on(\"keydown\", (d3Event) => {\n\t\t\t\t// If user hits return/enter\n\t\t\t\tif (KeyboardUtils.returnCommand(d3Event)) {\n\t\t\t\t\tif (data.allowReturnKey === \"save\" || KeyboardUtils.completeTextEntry(d3Event)) {\n\t\t\t\t\t\tthis.textContentSaved = true;\n\t\t\t\t\t\tthis.saveAndCloseTextArea(data, d3Event.target, d3Event);\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t// Don't accept return key press when text is all on one line or\n\t\t\t\t\t// if application doesn't want line feeds inserted in the label.\n\t\t\t\t\t} else if (data.singleLine || !data.allowReturnKey) {\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If user presses ESC key revert back to original text by\n\t\t\t\t// closing the text entry area and resetting the underlying\n\t\t\t\t// text display area height.\n\t\t\t\tif (KeyboardUtils.cancelTextEntry(d3Event)) {\n\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\tthis.textAreaEscKeyPressed = true;\n\t\t\t\t\tthis.closeTextArea(data);\n\t\t\t\t\tthis.resetHeightOfTextDisplay(data);\n\t\t\t\t\tthis.canvasController.restoreFocus();\n\t\t\t\t}\n\t\t\t\t// Prevent user entering more than any allowed maximum for characters.\n\t\t\t\tif (data.maxCharacters &&\n\t\t\t\t\t\td3Event.target.value.length >= data.maxCharacters &&\n\t\t\t\t\t\t!this.textAreaAllowedKeys(d3Event)) {\n\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t}\n\t\t\t\t// Call any specific keyboard handler for the type of\n\t\t\t\t// text being edited.\n\t\t\t\tif (data.keyboardInputCallback) {\n\t\t\t\t\tdata.keyboardInputCallback(d3Event);\n\t\t\t\t}\n\t\t\t\t// Prevent events propagating to the link which might alter\n\t\t\t\t// the focus to the link.\n\t\t\t\td3Event.stopPropagation();\n\t\t\t})\n\t\t\t.on(\"keyup\", (d3Event) => {\n\t\t\t\tdata.autoSizeCallback(d3Event.target, data);\n\t\t\t})\n\t\t\t.on(\"paste\", (d3Event) => {\n\t\t\t\tthis.logger.log(\"Text area - Paste - Scroll Ht = \" + d3Event.target.scrollHeight);\n\t\t\t\t// Allow some time for pasted text (from context menu) to be\n\t\t\t\t// loaded into the text area. Otherwise the text is not there\n\t\t\t\t// and the auto size does not increase the height correctly.\n\t\t\t\tsetTimeout(data.autoSizeCallback, 500, d3Event.target, data);\n\t\t\t})\n\t\t\t.on(\"blur\", (d3Event, d) => {\n\t\t\t\tthis.logger.log(\"Text area - blur\");\n\n\t\t\t\t// If the esc key was pressed to cause the blur event just return\n\t\t\t\t// so label returns to what it was before editing started.\n\t\t\t\tif (this.textAreaEscKeyPressed) {\n\t\t\t\t\tthis.textAreaEscKeyPressed = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// If the text label has been saved by the user hitting the return key\n\t\t\t\t// we just return since there's nothing further to do.\n\t\t\t\tif (this.textContentSaved) {\n\t\t\t\t\tthis.textContentSaved = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// If the user clicked on an element in the text toolbar to cause the\n\t\t\t\t// blur event, just return.\n\t\t\t\tif (d3Event.relatedTarget && CanvasUtils.getParentElementWithClass(d3Event.relatedTarget, \"text-toolbar\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.saveAndCloseTextArea(data, d3Event.target, d3Event);\n\t\t\t})\n\t\t\t.on(\"focus\", (d3Event, d) => {\n\t\t\t\tthis.logger.log(\"Text area - focus\");\n\t\t\t\tdata.autoSizeCallback(d3Event.target, data);\n\t\t\t\t// Focus only happens when the text area is being displayed. So here, we\n\t\t\t\t// re-initialize data.height to any new textAreaHeight set in autoSizeCallback.\n\t\t\t\t// This prevents an initial height change causing an edit action to be generated\n\t\t\t\t// if the text area is immediately closed without the user altering it.\n\t\t\t\tdata.height = this.textAreaHeight;\n\t\t\t})\n\t\t\t.on(\"mousedown mouseenter mouseleave click dblclick contextmenu\", (d3Event, d) => {\n\t\t\t\td3Event.stopPropagation(); // Allow default behavior to show system context menu\n\t\t\t});\n\t}\n}\n","var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n","// These are typically used in conjunction with noevent to ensure that we can\n// preventDefault on the event.\nexport const nonpassive = {passive: false};\nexport const nonpassivecapture = {capture: true, passive: false};\n\nexport function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n","import {select} from \"d3-selection\";\nimport noevent, {nonpassivecapture} from \"./noevent.js\";\n\nexport default function(view) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", noevent, nonpassivecapture);\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", noevent, nonpassivecapture);\n } else {\n root.__noselect = root.style.MozUserSelect;\n root.style.MozUserSelect = \"none\";\n }\n}\n\nexport function yesdrag(view, noclick) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", null);\n if (noclick) {\n selection.on(\"click.drag\", noevent, nonpassivecapture);\n setTimeout(function() { selection.on(\"click.drag\", null); }, 0);\n }\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", null);\n } else {\n root.style.MozUserSelect = root.__noselect;\n delete root.__noselect;\n }\n}\n","export default x => () => x;\n","export default function DragEvent(type, {\n sourceEvent,\n subject,\n target,\n identifier,\n active,\n x, y, dx, dy,\n dispatch\n}) {\n Object.defineProperties(this, {\n type: {value: type, enumerable: true, configurable: true},\n sourceEvent: {value: sourceEvent, enumerable: true, configurable: true},\n subject: {value: subject, enumerable: true, configurable: true},\n target: {value: target, enumerable: true, configurable: true},\n identifier: {value: identifier, enumerable: true, configurable: true},\n active: {value: active, enumerable: true, configurable: true},\n x: {value: x, enumerable: true, configurable: true},\n y: {value: y, enumerable: true, configurable: true},\n dx: {value: dx, enumerable: true, configurable: true},\n dy: {value: dy, enumerable: true, configurable: true},\n _: {value: dispatch}\n });\n}\n\nDragEvent.prototype.on = function() {\n var value = this._.on.apply(this._, arguments);\n return value === this._ ? this : value;\n};\n","import {dispatch} from \"d3-dispatch\";\nimport {select, pointer} from \"d3-selection\";\nimport nodrag, {yesdrag} from \"./nodrag.js\";\nimport noevent, {nonpassive, nonpassivecapture, nopropagation} from \"./noevent.js\";\nimport constant from \"./constant.js\";\nimport DragEvent from \"./event.js\";\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter(event) {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultContainer() {\n return this.parentNode;\n}\n\nfunction defaultSubject(event, d) {\n return d == null ? {x: event.x, y: event.y} : d;\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\nexport default function() {\n var filter = defaultFilter,\n container = defaultContainer,\n subject = defaultSubject,\n touchable = defaultTouchable,\n gestures = {},\n listeners = dispatch(\"start\", \"drag\", \"end\"),\n active = 0,\n mousedownx,\n mousedowny,\n mousemoving,\n touchending,\n clickDistance2 = 0;\n\n function drag(selection) {\n selection\n .on(\"mousedown.drag\", mousedowned)\n .filter(touchable)\n .on(\"touchstart.drag\", touchstarted)\n .on(\"touchmove.drag\", touchmoved, nonpassive)\n .on(\"touchend.drag touchcancel.drag\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n function mousedowned(event, d) {\n if (touchending || !filter.call(this, event, d)) return;\n var gesture = beforestart(this, container.call(this, event, d), event, d, \"mouse\");\n if (!gesture) return;\n select(event.view)\n .on(\"mousemove.drag\", mousemoved, nonpassivecapture)\n .on(\"mouseup.drag\", mouseupped, nonpassivecapture);\n nodrag(event.view);\n nopropagation(event);\n mousemoving = false;\n mousedownx = event.clientX;\n mousedowny = event.clientY;\n gesture(\"start\", event);\n }\n\n function mousemoved(event) {\n noevent(event);\n if (!mousemoving) {\n var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;\n mousemoving = dx * dx + dy * dy > clickDistance2;\n }\n gestures.mouse(\"drag\", event);\n }\n\n function mouseupped(event) {\n select(event.view).on(\"mousemove.drag mouseup.drag\", null);\n yesdrag(event.view, mousemoving);\n noevent(event);\n gestures.mouse(\"end\", event);\n }\n\n function touchstarted(event, d) {\n if (!filter.call(this, event, d)) return;\n var touches = event.changedTouches,\n c = container.call(this, event, d),\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) {\n nopropagation(event);\n gesture(\"start\", event, touches[i]);\n }\n }\n }\n\n function touchmoved(event) {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n noevent(event);\n gesture(\"drag\", event, touches[i]);\n }\n }\n }\n\n function touchended(event) {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n nopropagation(event);\n gesture(\"end\", event, touches[i]);\n }\n }\n }\n\n function beforestart(that, container, event, d, identifier, touch) {\n var dispatch = listeners.copy(),\n p = pointer(touch || event, container), dx, dy,\n s;\n\n if ((s = subject.call(that, new DragEvent(\"beforestart\", {\n sourceEvent: event,\n target: drag,\n identifier,\n active,\n x: p[0],\n y: p[1],\n dx: 0,\n dy: 0,\n dispatch\n }), d)) == null) return;\n\n dx = s.x - p[0] || 0;\n dy = s.y - p[1] || 0;\n\n return function gesture(type, event, touch) {\n var p0 = p, n;\n switch (type) {\n case \"start\": gestures[identifier] = gesture, n = active++; break;\n case \"end\": delete gestures[identifier], --active; // falls through\n case \"drag\": p = pointer(touch || event, container), n = active; break;\n }\n dispatch.call(\n type,\n that,\n new DragEvent(type, {\n sourceEvent: event,\n subject: s,\n target: drag,\n identifier,\n active: n,\n x: p[0] + dx,\n y: p[1] + dy,\n dx: p[0] - p0[0],\n dy: p[1] - p0[1],\n dispatch\n }),\n d\n );\n };\n }\n\n drag.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), drag) : filter;\n };\n\n drag.container = function(_) {\n return arguments.length ? (container = typeof _ === \"function\" ? _ : constant(_), drag) : container;\n };\n\n drag.subject = function(_) {\n return arguments.length ? (subject = typeof _ === \"function\" ? _ : constant(_), drag) : subject;\n };\n\n drag.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), drag) : touchable;\n };\n\n drag.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? drag : value;\n };\n\n drag.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);\n };\n\n return drag;\n}\n","/*\n * Copyright 2017-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint no-lonely-if: \"off\" */\n\nimport * as d3Drag from \"d3-drag\";\nimport * as d3Selection from \"d3-selection\";\nconst d3 = Object.assign({}, d3Drag, d3Selection);\n\nimport Logger from \"../logging/canvas-logger.js\";\nimport KeyboardUtils from \"./keyboard-utils.js\";\nimport CanvasUtils from \"./common-canvas-utils.js\";\nimport { SNAP_TO_GRID_AFTER, SNAP_TO_GRID_DURING, LINK_SELECTION_DETACHABLE,\n\tNORTH, SOUTH, EAST, WEST,\n\tSINGLE_CLICK }\n\tfrom \"./constants/canvas-constants.js\";\n\n// This utility files provides a drag handler which manages drag operations to move\n// and resize nodes and comments. Also, it provides utility functions to handle\n// those same operations performed by the keyboard user.\n\nexport default class SVGCanvasUtilsDragObjects {\n\tconstructor(renderer) {\n\t\tthis.ren = renderer;\n\n\t\tthis.logger = new Logger(\"SVGCanvasUtilsDragObjects\");\n\n\t\t// Keeps track of the size and position, at the start of the sizing event,\n\t\t// of the object (node or comment) being sized.\n\t\tthis.resizeObjInitialInfo = null;\n\n\t\t// Allows us to track the sizing behavior of comments\n\t\tthis.commentSizing = false;\n\t\tthis.commentSizingDirection = null;\n\t\tthis.commentSizingCursor = \"\";\n\n\t\t// Allows us to track the sizing behavior of nodes\n\t\tthis.nodeSizing = false;\n\t\tthis.nodeSizingDirection = null;\n\t\tthis.nodeSizingCursor = \"\";\n\t\tthis.nodeSizingObjectsInfo = {};\n\t\tthis.nodeSizingDetLinksInfo = {};\n\n\t\t// Keeps track of the size and position, during a sizing event, of the\n\t\t// object (node or comment) being sized, before it is snapped to grid.\n\t\tthis.notSnappedXPos = 0;\n\t\tthis.notSnappedYPos = 0;\n\t\tthis.notSnappedWidth = 0;\n\t\tthis.notSnappedHeight = 0;\n\n\t\t// Object to store variables for move behavior or nodes and comments.\n\t\tthis.movingObjectData = null;\n\n\t\t// Flag to indicate if the current move operation is for a node that can\n\t\t// be inserted into a link. Such a node would need input and output ports.\n\t\tthis.existingNodeInsertableIntoLink = false;\n\n\t\t// Flag to indicate if the current move operation is for a node that can\n\t\t// be attached to a detached link.\n\t\tthis.existingNodeAttachableToDetachedLinks = false;\n\n\t\t// Create a drag handler for resizing and moving nodes and comments.\n\t\tthis.dragObjectHandler = d3.drag()\n\t\t\t.on(\"start\", this.dragStartObject.bind(this))\n\t\t\t.on(\"drag\", this.dragObject.bind(this))\n\t\t\t.on(\"end\", this.dragEndObject.bind(this));\n\t}\n\n\t// Returns the dragObjectsHandler\n\tgetDragObjectHandler() {\n\t\treturn this.dragObjectHandler;\n\t}\n\n\t// Returns true if a sizing operation is currently underway.\n\tisSizing() {\n\t\treturn this.nodeSizing || this.commentSizing;\n\t}\n\n\t// Returns truthy if a moving operation is currently underway.\n\tisMoving() {\n\t\treturn this.movingObjectData;\n\t}\n\n\tmouseEnterNodeSizingArea(d3Event, d) {\n\t\tif (CanvasUtils.isNodeResizable(d, this.ren.config) &&\n\t\t\t\t!this.ren.isRegionSelectOrSizingInProgress()) { // Don't switch sizing direction if we are already sizing\n\t\t\tlet cursorType = \"default\";\n\t\t\tif (!this.isPointerCloseToBodyEdge(d3Event, d)) {\n\t\t\t\tthis.nodeSizingDirection = this.getSizingDirection(d3Event, d, d.layout.nodeCornerResizeArea);\n\t\t\t\tthis.nodeSizingCursor = this.getCursorBasedOnDirection(this.nodeSizingDirection);\n\t\t\t\tcursorType = this.nodeSizingCursor;\n\t\t\t}\n\t\t\td3.select(d3Event.currentTarget).style(\"cursor\", cursorType);\n\t\t}\n\t}\n\n\tmouseDownNodeSizingArea(d) {\n\t\tif (CanvasUtils.isNodeResizable(d, this.ren.config)) {\n\t\t\tthis.nodeSizing = true;\n\t\t\t// Note - node resizing and finalization of size is handled by drag functions.\n\t\t\tthis.ren.addTempCursorOverlay(this.nodeSizingCursor);\n\t\t}\n\t}\n\n\tmouseLeaveNodeSizingArea(d3Event) {\n\t\td3.select(d3Event.currentTarget).style(\"cursor\", \"default\");\n\t}\n\n\tmouseEnterCommentSizingArea(d3Event, d) {\n\t\tif (this.ren.config.enableEditingActions && // Only set cursor when we are able to edit comments\n\t\t\t!this.ren.isRegionSelectOrSizingInProgress()) { // Don't switch sizing direction if we are already sizing\n\t\t\tlet cursorType = \"default\";\n\t\t\tif (!this.isPointerCloseToBodyEdge(d3Event, d)) {\n\t\t\t\tthis.commentSizingDirection = this.getSizingDirection(d3Event, d, this.ren.canvasLayout.commentCornerResizeArea);\n\t\t\t\tthis.commentSizingCursor = this.getCursorBasedOnDirection(this.commentSizingDirection);\n\t\t\t\tcursorType = this.commentSizingCursor;\n\t\t\t}\n\t\t\td3.select(d3Event.currentTarget).style(\"cursor\", cursorType);\n\t\t}\n\t}\n\n\tmouseDownCommentSizingArea() {\n\t\t// Note - comment resizing and finalization of size is handled by drag functions.\n\t\tthis.commentSizing = true;\n\t\tthis.ren.addTempCursorOverlay(this.commentSizingCursor);\n\t}\n\n\tmouseLeaveCommentSizingArea(d3Event) {\n\t\td3.select(d3Event.currentTarget).style(\"cursor\", \"default\");\n\t}\n\n\t// Moves the object passed in (and any other selected objects) by the\n\t// x and y amounts provided. This is called when the user moves an\n\t// object using the keyboard.\n\tmoveObject(d, dir) {\n\t\tlet xInc = 0;\n\t\tlet yInc = 0;\n\n\t\t({ xInc, yInc } = this.getMoveIncrements(dir));\n\n\t\tif (this.endMove) {\n\t\t\tclearTimeout(this.endMove);\n\t\t\tthis.endMove = null;\n\t\t}\n\n\t\tif (!this.isMoving()) {\n\t\t\tthis.startObjectsMoving(d);\n\t\t}\n\n\t\tconst x = d.x_pos + (d.width / 2);\n\t\tconst y = d.y_pos + (d.height / 2);\n\t\tconst pagePos = this.ren.convertCanvasCoordsToPageCoords(x, y);\n\n\t\tthis.moveObjects(xInc, yInc, pagePos.x, pagePos.y);\n\n\t\tthis.endMove = setTimeout(() => {\n\t\t\tthis.endObjectsMoving(d, false, false);\n\t\t}, 500);\n\t}\n\n\t// Sizes the object passed in (either a node or comment) in the\n\t// direction specified. This is called when the user sizes an object\n\t//\tusing the keyboard.\n\tsizeObject(d, direction) {\n\t\tlet xInc = 0;\n\t\tlet yInc = 0;\n\t\tlet dir = direction;\n\n\t\t({ xInc, yInc } = this.getMoveIncrements(dir));\n\n\t\t// When direction is NORTH this will cause the bottom border of\n\t\t// the object to be decrease and when the direction is WEST\n\t\t// the right border of the object will be decreased.\n\t\tif (dir === NORTH) {\n\t\t\tdir = SOUTH;\n\t\t} else if (dir === WEST) {\n\t\t\tdir = EAST;\n\t\t}\n\n\t\tif (this.endSize) {\n\t\t\tclearTimeout(this.endSize);\n\t\t\tthis.endSize = null;\n\t\t}\n\n\t\tif (!this.isSizing()) {\n\t\t\tconst objType = CanvasUtils.getObjectTypeName(d);\n\t\t\tif (objType === \"node\") {\n\t\t\t\tthis.nodeSizing = true;\n\t\t\t} else {\n\t\t\t\tthis.commentSizing = true;\n\t\t\t}\n\t\t\tthis.initializeResizeVariables(d);\n\t\t}\n\n\t\tif (this.nodeSizing) {\n\t\t\tthis.resizeNode(xInc, yInc, d, dir);\n\n\t\t} else if (this.commentSizing) {\n\t\t\tthis.resizeComment(xInc, yInc, d, dir);\n\t\t}\n\n\t\tthis.endSize = setTimeout(() => {\n\t\t\tif (this.nodeSizing) {\n\t\t\t\tthis.endNodeSizing(d);\n\t\t\t\tthis.nodeSizing = false;\n\n\t\t\t} else if (this.commentSizing) {\n\t\t\t\tthis.endCommentSizing(d);\n\t\t\t\tthis.commentSizing = false;\n\t\t\t}\n\t\t}, 500);\n\t}\n\n\tdragStartObject(d3Event, d) {\n\t\tthis.logger.logStartTimer(\"dragStartObject\");\n\n\t\tthis.ren.closeContextMenuIfOpen();\n\n\t\tif (this.commentSizing) {\n\t\t\tthis.initializeResizeVariables(d);\n\n\t\t} else if (this.nodeSizing) {\n\t\t\tthis.initializeResizeVariables(d);\n\n\t\t} else {\n\t\t\tthis.startObjectsMoving(d);\n\t\t}\n\n\t\tthis.logger.logEndTimer(\"dragStartObject\", true);\n\t}\n\n\tdragObject(d3Event, d) {\n\t\tthis.logger.logStartTimer(\"dragObject\");\n\t\tif (this.commentSizing) {\n\t\t\tthis.resizeComment(d3Event.dx, d3Event.dy, d, this.commentSizingDirection);\n\n\t\t} else if (this.nodeSizing) {\n\t\t\tthis.resizeNode(d3Event.dx, d3Event.dy, d, this.nodeSizingDirection);\n\n\t\t} else {\n\t\t\tthis.moveObjects(d3Event.dx, d3Event.dy, d3Event.sourceEvent.clientX, d3Event.sourceEvent.clientY);\n\t\t}\n\n\t\tthis.logger.logEndTimer(\"dragObject\", true);\n\t}\n\n\tdragEndObject(d3Event, d) {\n\t\tthis.logger.logStartTimer(\"dragEndObject\");\n\n\t\tthis.ren.removeTempCursorOverlay();\n\n\t\tif (this.commentSizing) {\n\t\t\tthis.endCommentSizing(d);\n\t\t\tthis.commentSizing = false;\n\n\t\t} else if (this.nodeSizing) {\n\t\t\tthis.endNodeSizing(d);\n\t\t\tthis.nodeSizing = false;\n\n\t\t} else {\n\t\t\tthis.endObjectsMoving(d, d3Event.sourceEvent.shiftKey, KeyboardUtils.isMetaKey(d3Event.sourceEvent));\n\t\t}\n\n\t\tthis.logger.logEndTimer(\"dragEndObject\", true);\n\t}\n\n\t// Records the initial starting position of the object being sized so\n\t// that drag increments can be added to the original starting\n\t// position to aid calculating the snap-to-grid position.\n\tinitializeResizeVariables(resizeObj) {\n\t\tthis.resizeObjInitialInfo = {\n\t\t\tx_pos: resizeObj.x_pos, y_pos: resizeObj.y_pos, width: resizeObj.width, height: resizeObj.height };\n\t\tthis.notSnappedXPos = resizeObj.x_pos;\n\t\tthis.notSnappedYPos = resizeObj.y_pos;\n\t\tthis.notSnappedWidth = resizeObj.width;\n\t\tthis.notSnappedHeight = resizeObj.height;\n\t}\n\n\t// This method allows us to avoid a strange behavior which only appears in the\n\t// Chrome browser. That is, when the mouse pointer is inside the\n\t// node/comment selection highlight area but is close to either the\n\t// right or bottom side of the node/comment body, any mousedown events will go\n\t// to the body instead of the highlight area. We use this method to detect\n\t// this situation and use the result to decide whether to display the sizing\n\t// cursor or not.\n\tisPointerCloseToBodyEdge(d3Event, d) {\n\t\tconst pos = this.ren.getTransformedMousePos(d3Event);\n\t\tconst rightEdge = d.x_pos + d.width;\n\t\tconst bottomEdge = d.y_pos + d.height;\n\n\t\t// Is the pointer within 1 pixel of the right edge of the node or comment\n\t\tconst rightEdgeState =\n\t\t\tpos.x >= rightEdge && pos.x <= rightEdge + 1 &&\n\t\t\tpos.y >= 0 && pos.y <= bottomEdge;\n\n\t\t// Is the pointer within 1 pixel of the bottom edge of the node or comment\n\t\tconst bottomEdgeState =\n\t\t\tpos.y >= bottomEdge && pos.y <= bottomEdge + 1 &&\n\t\t\tpos.x >= 0 && pos.x <= rightEdge;\n\n\t\treturn rightEdgeState || bottomEdgeState;\n\t}\n\n\t// Returns the comment or supernode sizing direction (i.e. one of n, s, e, w, nw, ne,\n\t// sw or se) based on the current mouse position and the position and\n\t// dimensions of the comment or node outline.\n\tgetSizingDirection(d3Event, d, cornerResizeArea) {\n\t\tvar xPart = \"\";\n\t\tvar yPart = \"\";\n\n\t\tconst transPos = this.ren.getTransformedMousePos(d3Event);\n\t\tif (transPos.x < d.x_pos + cornerResizeArea) {\n\t\t\txPart = \"w\";\n\t\t} else if (transPos.x > d.x_pos + d.width - cornerResizeArea) {\n\t\t\txPart = \"e\";\n\t\t}\n\t\tif (transPos.y < d.y_pos + cornerResizeArea) {\n\t\t\tyPart = \"n\";\n\t\t} else if (transPos.y > d.y_pos + d.height - cornerResizeArea) {\n\t\t\tyPart = \"s\";\n\t\t}\n\n\t\treturn yPart + xPart;\n\t}\n\n\t// Returns a cursor type based on the current comment sizing direction.\n\t// Possible values are: ns-resize, ew-resize, nwse-resize or nesw-resize.\n\tgetCursorBasedOnDirection(direction) {\n\t\tvar cursorType;\n\t\tswitch (direction) {\n\t\tcase \"n\":\n\t\tcase \"s\":\n\t\t\tcursorType = \"ns-resize\";\n\t\t\tbreak;\n\t\tcase \"e\":\n\t\tcase \"w\":\n\t\t\tcursorType = \"ew-resize\";\n\t\t\tbreak;\n\t\tcase \"nw\":\n\t\tcase \"se\":\n\t\t\tcursorType = \"nwse-resize\";\n\t\t\tbreak;\n\t\tcase \"ne\":\n\t\tcase \"sw\":\n\t\t\tcursorType = \"nesw-resize\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tcursorType = \"\";\n\t\t}\n\n\t\treturn cursorType;\n\t}\n\n\t// Sets the size and position of the node in the canvasInfo.nodes\n\t// array based on the position of the pointer during the resize action\n\t// then redraws the nodes and links (the link positions may move based\n\t// on the node size change).\n\tresizeNode(dx, dy, resizeObj, dir) {\n\t\tconst oldSupernode = Object.assign({}, resizeObj);\n\t\tconst minHeight = this.getMinHeight(resizeObj);\n\t\tconst minWidth = this.getMinWidth(resizeObj);\n\n\t\tconst delta = this.resizeObject(dx, dy, resizeObj, dir, minWidth, minHeight);\n\n\t\tif (delta && (delta.x_pos !== 0 || delta.y_pos !== 0 || delta.width !== 0 || delta.height !== 0)) {\n\t\t\tif (CanvasUtils.isExpandedSupernode(resizeObj) &&\n\t\t\t\t\tthis.ren.config.enableMoveNodesOnSupernodeResize) {\n\t\t\t\tconst objectsInfo = CanvasUtils.moveSurroundingObjects(\n\t\t\t\t\toldSupernode,\n\t\t\t\t\tthis.ren.activePipeline.getNodesAndComments(),\n\t\t\t\t\tdir,\n\t\t\t\t\tresizeObj.width,\n\t\t\t\t\tresizeObj.height,\n\t\t\t\t\ttrue // Pass true to indicate that object positions should be updated.\n\t\t\t\t);\n\n\t\t\t\tconst linksInfo = CanvasUtils.moveSurroundingDetachedLinks(\n\t\t\t\t\toldSupernode,\n\t\t\t\t\tthis.ren.activePipeline.links,\n\t\t\t\t\tdir,\n\t\t\t\t\tresizeObj.width,\n\t\t\t\t\tresizeObj.height,\n\t\t\t\t\ttrue // Pass true to indicate that link positions should be updated.\n\t\t\t\t);\n\n\t\t\t\t// Overwrite the object and link info with any new info.\n\t\t\t\tthis.nodeSizingObjectsInfo = Object.assign(this.nodeSizingObjectsInfo, objectsInfo);\n\t\t\t\tthis.nodeSizingDetLinksInfo = Object.assign(this.nodeSizingDetLinksInfo, linksInfo);\n\t\t\t}\n\n\t\t\tthis.logger.logStartTimer(\"displayObjects\");\n\n\t\t\tthis.ren.displayMovedComments();\n\t\t\tthis.ren.displayMovedNodes();\n\t\t\tthis.ren.displaySingleNode(resizeObj);\n\t\t\tthis.ren.displayMovedLinks();\n\t\t\tthis.ren.displayCanvasAccoutrements();\n\n\t\t\tif (CanvasUtils.isExpandedSupernode(resizeObj)) {\n\t\t\t\tif (this.ren.dispUtils.isDisplayingSubFlow()) {\n\t\t\t\t\tthis.ren.displayBindingNodesToFitSVG();\n\t\t\t\t}\n\t\t\t\tthis.ren.superRenderers.forEach((renderer) => renderer.displaySVGToFitSupernode());\n\t\t\t}\n\t\t\tthis.logger.logEndTimer(\"displayObjects\");\n\t\t}\n\t}\n\n\t// Sets the size and position of the comment in the canvasInfo.comments\n\t// array based on the position of the pointer during the resize action\n\t// then redraws the comment and links (the link positions may move based\n\t// on the comment size change).\n\tresizeComment(dx, dy, resizeObj, dir) {\n\t\tthis.resizeObject(dx, dy, resizeObj, dir, 20, 20);\n\t\tthis.ren.displaySingleComment(resizeObj);\n\t\tthis.ren.displayMovedLinks();\n\t\tthis.ren.displayCanvasAccoutrements();\n\t}\n\n\t// Sets the size and position of the object in the canvasInfo\n\t// array based on the position of the pointer during the resize action.\n\tresizeObject(dx, dy, canvasObj, direction, minWidth, minHeight) {\n\t\tlet incrementX = 0;\n\t\tlet incrementY = 0;\n\t\tlet incrementWidth = 0;\n\t\tlet incrementHeight = 0;\n\n\t\tif (direction.indexOf(\"e\") > -1) {\n\t\t\tincrementWidth += dx;\n\t\t}\n\t\tif (direction.indexOf(\"s\") > -1) {\n\t\t\tincrementHeight += dy;\n\t\t}\n\t\tif (direction.indexOf(\"n\") > -1) {\n\t\t\tincrementY += dy;\n\t\t\tincrementHeight -= dy;\n\t\t}\n\t\tif (direction.indexOf(\"w\") > -1) {\n\t\t\tincrementX += dx;\n\t\t\tincrementWidth -= dx;\n\t\t}\n\n\t\tlet xPos = 0;\n\t\tlet yPos = 0;\n\t\tlet width = 0;\n\t\tlet height = 0;\n\n\t\tif (this.ren.config.enableSnapToGridType === SNAP_TO_GRID_DURING) {\n\t\t\t// Calculate where the object being resized would be and its size given\n\t\t\t// current increments.\n\t\t\tthis.notSnappedXPos += incrementX;\n\t\t\tthis.notSnappedYPos += incrementY;\n\t\t\tthis.notSnappedWidth += incrementWidth;\n\t\t\tthis.notSnappedHeight += incrementHeight;\n\n\t\t\txPos = CanvasUtils.snapToGrid(this.notSnappedXPos, this.ren.canvasLayout.snapToGridXPx);\n\t\t\tyPos = CanvasUtils.snapToGrid(this.notSnappedYPos, this.ren.canvasLayout.snapToGridYPx);\n\t\t\twidth = CanvasUtils.snapToGrid(this.notSnappedWidth, this.ren.canvasLayout.snapToGridXPx);\n\t\t\theight = CanvasUtils.snapToGrid(this.notSnappedHeight, this.ren.canvasLayout.snapToGridYPx);\n\n\t\t\twidth = Math.max(width, minWidth);\n\t\t\theight = Math.max(height, minHeight);\n\n\t\t} else {\n\t\t\txPos = canvasObj.x_pos + incrementX;\n\t\t\tyPos = canvasObj.y_pos + incrementY;\n\t\t\twidth = canvasObj.width + incrementWidth;\n\t\t\theight = canvasObj.height + incrementHeight;\n\t\t}\n\n\t\t// Don't allow the object area to shrink below the min width and height.\n\t\t// For comment sizing, errors may occur especially if the width becomes\n\t\t// less that one character's width. For node sizing we want at least some\n\t\t// area to display the sub-flow.\n\t\tif (width < minWidth || height < minHeight) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst delta = {\n\t\t\twidth: width - canvasObj.width,\n\t\t\theight: height - canvasObj.height,\n\t\t\tx_pos: xPos - canvasObj.x_pos,\n\t\t\ty_pos: yPos - canvasObj.y_pos\n\t\t};\n\n\t\tcanvasObj.x_pos = xPos;\n\t\tcanvasObj.y_pos = yPos;\n\t\tcanvasObj.width = width;\n\t\tcanvasObj.height = height;\n\n\t\treturn delta;\n\t}\n\n\t// Finalizes the sizing of a node by calling editActionHandler\n\t// with an editNode action.\n\tendNodeSizing(node) {\n\t\tlet resizeObj = node;\n\t\tif (this.ren.config.enableSnapToGridType === SNAP_TO_GRID_AFTER) {\n\t\t\tresizeObj = this.snapToGridObject(resizeObj);\n\t\t\tresizeObj = this.restrictNodeSizingToMinimums(resizeObj);\n\t\t}\n\n\t\t// If the dimensions or position has changed, issue the \"resizeObjects\" command.\n\t\t// Note: x_pos or y_pos might change on resize if the node is sized\n\t\t// upwards or to the left.\n\t\tif (this.resizeObjInitialInfo.x_pos !== resizeObj.x_pos ||\n\t\t\t\tthis.resizeObjInitialInfo.y_pos !== resizeObj.y_pos ||\n\t\t\t\tthis.resizeObjInitialInfo.width !== resizeObj.width ||\n\t\t\t\tthis.resizeObjInitialInfo.height !== resizeObj.height) {\n\t\t\t// Add the dimensions of the object being resized to the array of object infos.\n\t\t\tthis.nodeSizingObjectsInfo[resizeObj.id] = {\n\t\t\t\twidth: resizeObj.width,\n\t\t\t\theight: resizeObj.height,\n\t\t\t\tx_pos: resizeObj.x_pos,\n\t\t\t\ty_pos: resizeObj.y_pos\n\t\t\t};\n\n\t\t\t// If the node has been resized set the resize properties appropriately.\n\t\t\t// We use some padding because sometimes, when a node is sized back to its\n\t\t\t// original dimensions, it isn't returned to EXACTLY its default width/height.\n\t\t\tif (resizeObj.height > resizeObj.layout.defaultNodeHeight + 2 ||\n\t\t\t\t\tresizeObj.width > resizeObj.layout.defaultNodeWidth + 2) {\n\t\t\t\tthis.nodeSizingObjectsInfo[resizeObj.id].isResized = true;\n\t\t\t\tthis.nodeSizingObjectsInfo[resizeObj.id].resizeWidth = resizeObj.width;\n\t\t\t\tthis.nodeSizingObjectsInfo[resizeObj.id].resizeHeight = resizeObj.height;\n\t\t\t}\n\n\t\t\tthis.ren.canvasController.editActionHandler({\n\t\t\t\teditType: \"resizeObjects\",\n\t\t\t\teditSource: \"canvas\",\n\t\t\t\tobjectsInfo: this.nodeSizingObjectsInfo,\n\t\t\t\tdetachedLinksInfo: this.nodeSizingDetLinksInfo,\n\t\t\t\tpipelineId: this.ren.activePipeline.id\n\t\t\t});\n\n\t\t\t// Clear the objects ready for next sizing action.\n\t\t\tthis.nodeSizingObjectsInfo = {};\n\t\t}\n\t}\n\n\t// Finalizes the sizing of a comment by calling editActionHandler\n\t// with an editComment action.\n\tendCommentSizing(comment) {\n\t\tlet resizeObj = comment;\n\t\tif (this.ren.config.enableSnapToGridType === SNAP_TO_GRID_AFTER) {\n\t\t\tresizeObj = this.snapToGridObject(resizeObj);\n\t\t}\n\n\t\t// If the dimensions or position has changed, issue the command.\n\t\t// Note: x_pos or y_pos might change on resize if the node is sized\n\t\t// upwards or to the left.\n\t\tif (this.resizeObjInitialInfo.x_pos !== resizeObj.x_pos ||\n\t\t\t\tthis.resizeObjInitialInfo.y_pos !== resizeObj.y_pos ||\n\t\t\t\tthis.resizeObjInitialInfo.width !== resizeObj.width ||\n\t\t\t\tthis.resizeObjInitialInfo.height !== resizeObj.height) {\n\t\t\tconst commentSizingObjectsInfo = [];\n\t\t\tcommentSizingObjectsInfo[resizeObj.id] = {\n\t\t\t\twidth: resizeObj.width,\n\t\t\t\theight: resizeObj.height,\n\t\t\t\tx_pos: resizeObj.x_pos,\n\t\t\t\ty_pos: resizeObj.y_pos\n\t\t\t};\n\n\t\t\tconst data = {\n\t\t\t\teditType: \"resizeObjects\",\n\t\t\t\teditSource: \"canvas\",\n\t\t\t\tobjectsInfo: commentSizingObjectsInfo,\n\t\t\t\tdetachedLinksInfo: {}, // Comments cannot have detached links\n\t\t\t\tpipelineId: this.ren.activePipeline.id\n\t\t\t};\n\t\t\tthis.ren.canvasController.editActionHandler(data);\n\t\t}\n\t}\n\n\t// Ensure the snap-to-grid does not make the width or height smaller than\n\t// the minimums allowed.\n\trestrictNodeSizingToMinimums(resizeObj) {\n\t\tconst minHeight = this.getMinHeight(resizeObj);\n\t\tconst minWidth = this.getMinWidth(resizeObj);\n\t\tresizeObj.width = Math.max(resizeObj.width, minWidth);\n\t\tresizeObj.height = Math.max(resizeObj.height, minHeight);\n\t\treturn resizeObj;\n\t}\n\n\t// Returns the minimum allowed height for the node passed in. For supernodes\n\t// this means combining the bigger of the space for the inputs and output ports\n\t// with some space for the top of the display frame and the padding at the\n\t// bottom of the frame. Then the bigger of that height versus the default\n\t// supernode minimum height is returned.\n\tgetMinHeight(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\tconst minHt = Math.max(node.inputPortsHeight, node.outputPortsHeight) +\n\t\t\t\tthis.ren.canvasLayout.supernodeTopAreaHeight + this.ren.canvasLayout.supernodeSVGAreaPadding;\n\t\t\treturn Math.max(this.ren.canvasLayout.supernodeMinHeight, minHt);\n\t\t}\n\t\treturn node.layout.defaultNodeHeight;\n\t}\n\n\t// Returns the minimum allowed width for the node passed in.\n\tgetMinWidth(node) {\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\treturn this.ren.canvasLayout.supernodeMinWidth;\n\t\t}\n\t\treturn node.layout.defaultNodeWidth;\n\t}\n\n\t// Starts the moving action for canvas objects (nodes and comments).\n\t// Can be called when the mouse is dragging the object OR when a\n\t// keyboard event moves the object. Only nodes that allowed to be\n\t// moved will be moved.\n\tstartObjectsMoving(d) {\n\t\t// Ensure flags are false before staring a new move operation.\n\t\tthis.existingNodeInsertableIntoLink = false;\n\t\tthis.existingNodeAttachableToDetachedLinks = false;\n\n\t\tthis.movingObjectData = {\n\t\t\toffsetX: 0,\n\t\t\toffsetY: 0,\n\t\t\trunningX: 0,\n\t\t\trunningY: 0,\n\t\t\tobjects: this.getMoveObjects(d).filter((obj) => CanvasUtils.isObjectMovable(obj))\n\t\t};\n\n\t\tif (this.movingObjectData.objects?.length > 0) {\n\t\t\tthis.movingObjectData.startX = this.movingObjectData.objects[0].x_pos;\n\t\t\tthis.movingObjectData.startY = this.movingObjectData.objects[0].y_pos;\n\n\t\t\t// Apply the 'd3-is-moving' class to the objects being moved.\n\t\t\tthis.switchIsMovingClass(this.movingObjectData.objects, true);\n\t\t}\n\n\t\t// If we are moving an 'insertable' node, set it to be translucent so\n\t\t// that, when it is moved over a link line, the highlighted line can be seen OK.\n\t\tif (this.isExistingNodeInsertableIntoLink()) {\n\t\t\t// Only style the node to be translucent if this action isn't cancelled\n\t\t\t// by the user releasing the mouse button within 200 ms of pressing it.\n\t\t\t// This stops the node flashing when the user is only selecting it.\n\t\t\tthis.startNodeInsertingInLink = setTimeout(() => {\n\t\t\t\tthis.existingNodeInsertableIntoLink = true;\n\t\t\t\tthis.setNodeTranslucentState(this.movingObjectData.objects[0].id, true);\n\t\t\t\tthis.ren.setDataLinkSelectionAreaWider(true);\n\t\t\t}, 200);\n\t\t}\n\n\t\t// If we are moving an 'attachable' node, set it to be translucent so\n\t\t// that, when it is moved over link lines, the highlighted lines can be seen OK.\n\t\tif (this.isExistingNodeAttachableToDetachedLinks()) {\n\t\t\t// Only style the node to be translucent if this action isn't cancelled\n\t\t\t// by the user releasing the mouse button within 200 ms of pressing it.\n\t\t\t// This stops the node from being made translucent when the user is only selecting it.\n\t\t\tthis.startNodeAttachingToDetachedLinks = setTimeout(() => {\n\t\t\t\tthis.existingNodeAttachableToDetachedLinks = true;\n\t\t\t\tthis.setNodeTranslucentState(this.movingObjectData.objects[0].id, true);\n\t\t\t}, 200);\n\t\t}\n\t}\n\n\t// Performs the moving action for canvas objects (nodes and comments).\n\t// This occurs either as the user is moving the mouse pointer OR each time the user\n\t// presses a key on the keyboard, within the timeout value, to move the object.\n\t// The dx and dy parameters are the amount to move the object in the x and y directions.\n\t// The pagePosX and pagePosY parameters are the current page coordinates of either\n\t// the mouse in the context of a drag operation OR the current page coordinates of the\n\t// center of the object in the context of a keyboard operation.\n\tmoveObjects(dx, dy, pagePosX, pagePosY) {\n\t\tthis.movingObjectData.offsetX += dx;\n\t\tthis.movingObjectData.offsetY += dy;\n\n\t\t// Limit the size a move (typically a drag) can be so, when the user\n\t\t// is dragging objects in an in-place subflow they do not drag them too far.\n\t\t// this.logger.log(\"Move offset x = \" + this.movingObjectData.offsetX + \" y = \" + this.movingObjectData.offsetY);\n\t\tif (this.ren.dispUtils.isDisplayingSubFlowInPlace() &&\n\t\t\t\t(this.movingObjectData.offsetX > 1000 || this.movingObjectData.offsetX < -1000 ||\n\t\t\t\t\tthis.movingObjectData.offsetY > 1000 || this.movingObjectData.offsetY < -1000)) {\n\t\t\tthis.movingObjectData.offsetX -= dx;\n\t\t\tthis.movingObjectData.offsetY -= dy;\n\n\t\t} else {\n\t\t\tlet\tincrement = { x: 0, y: 0 };\n\n\t\t\tif (this.ren.config.enableSnapToGridType === SNAP_TO_GRID_DURING) {\n\t\t\t\tconst stgPos = this.snapToGridMovedNode(this.movingObjectData);\n\n\t\t\t\tincrement = {\n\t\t\t\t\tx: stgPos.x - this.movingObjectData.objects[0].x_pos,\n\t\t\t\t\ty: stgPos.y - this.movingObjectData.objects[0].y_pos\n\t\t\t\t};\n\n\t\t\t} else {\n\t\t\t\tincrement = {\n\t\t\t\t\tx: dx,\n\t\t\t\t\ty: dy\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.movingObjectData.runningX += increment.x;\n\t\t\tthis.movingObjectData.runningY += increment.y;\n\n\t\t\tthis.movingObjectData.objects.forEach((d) => {\n\t\t\t\td.x_pos += increment.x;\n\t\t\t\td.y_pos += increment.y;\n\t\t\t});\n\n\t\t\tif (this.ren.config.enableLinkSelection === LINK_SELECTION_DETACHABLE) {\n\t\t\t\tthis.ren.activePipeline.getSelectedLinks().forEach((link) => {\n\t\t\t\t\tif (link.srcPos) {\n\t\t\t\t\t\tlink.srcPos.x_pos += increment.x;\n\t\t\t\t\t\tlink.srcPos.y_pos += increment.y;\n\t\t\t\t\t}\n\t\t\t\t\tif (link.trgPos) {\n\t\t\t\t\t\tlink.trgPos.x_pos += increment.x;\n\t\t\t\t\t\tlink.trgPos.y_pos += increment.y;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// If enableDragWithoutSelect is enabled and the mouse pointer\n\t\t// hasn't moved very much, we don't move the objects.\n\t\tif (this.ren.config.enableDragWithoutSelect &&\n\t\t\tCanvasUtils.isTinyMovement({ x: 0, y: 0 }, { x: this.movingObjectData.offsetX, y: this.movingObjectData.offsetY })) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.ren.displayMovedComments();\n\t\tthis.ren.displayMovedNodes();\n\t\tthis.ren.displayMovedLinks();\n\t\tthis.ren.displayCanvasAccoutrements();\n\n\t\tif (this.ren.dispUtils.isDisplayingSubFlowInPlace()) {\n\t\t\tthis.ren.displaySVGToFitSupernode();\n\t\t}\n\n\t\tif (this.existingNodeInsertableIntoLink) {\n\t\t\tconst link = this.ren.getLinkAtMousePos(pagePosX, pagePosY);\n\t\t\t// Set highlighting when there is no link because this will turn\n\t\t\t// current highlighting off. And only switch on highlighting when we are\n\t\t\t// over a fully attached link (not a detached link) and provided the\n\t\t\t// link is not to/from the node being moved (which is possible in\n\t\t\t// some odd situations).\n\t\t\tif (!link ||\n\t\t\t\t\t(this.ren.isLinkFullyAttached(link) &&\n\t\t\t\t\t\tthis.movingObjectData.objects[0].id !== link.srcNodeId &&\n\t\t\t\t\t\tthis.movingObjectData.objects[0].id !== link.trgNodeId)) {\n\t\t\t\tthis.ren.setInsertNodeIntoLinkHighlighting(link);\n\t\t\t}\n\t\t}\n\n\t\tif (this.existingNodeAttachableToDetachedLinks) {\n\t\t\tconst node = this.movingObjectData.objects[0];\n\t\t\tconst ghostArea = {\n\t\t\t\tx1: node.x_pos,\n\t\t\t\ty1: node.y_pos,\n\t\t\t\tx2: node.x_pos + node.width,\n\t\t\t\ty2: node.y_pos + node.height\n\t\t\t};\n\t\t\tconst links = this.ren.getAttachableLinksForNodeAtPos(node, ghostArea);\n\t\t\tthis.ren.setDetachedLinkHighlighting(links);\n\t\t}\n\t}\n\n\t// Ends the moving action for canvas objects (nodes and comments).\n\t// This happens either when the user releases the mouse button when\n\t// dragging OR when the timeout value has expired when moving the\n\t// object using the keyboard.\n\tendObjectsMoving(d, range, augment) {\n\n\t\t// Save a local reference to this.movingObjectData so we can set it to null before\n\t\t// calling the canvas-controller. This means the this.movingObjectData object will\n\t\t// be null when the canvas is refreshed.\n\t\tconst movingObjectData = this.movingObjectData;\n\t\tthis.movingObjectData = null;\n\n\t\t// Cancels the styling of insertable/attachable nodes if the user releases\n\t\t// the mouse button with 200 milliseconds of pressing it on the node. This\n\t\t// stops the node flashing when the user just selects the node.\n\t\tclearTimeout(this.startNodeInsertingInLink);\n\t\tclearTimeout(this.startNodeAttachingToDetachedLinks);\n\n\t\t// Remove the 'd3-is-moving' class from the objects being moved.\n\t\tthis.switchIsMovingClass(movingObjectData.objects, false);\n\n\t\t// If enableDragWithoutSelect is enabled and the pointer hasn't moved\n\t\t// very much, we interpret that as a select on the object.\n\t\tif (this.ren.config.enableDragWithoutSelect &&\n\t\t\t\tCanvasUtils.isTinyMovement({ x: 0, y: 0 }, { x: movingObjectData.offsetX, y: movingObjectData.offsetY })) {\n\t\t\tthis.ren.selectObject(d, SINGLE_CLICK, range, augment);\n\n\t\t} else {\n\t\t\tif (movingObjectData.runningX !== 0 ||\n\t\t\t\tmovingObjectData.runningY !== 0) {\n\t\t\t\tlet finalOffset = null;\n\t\t\t\tif (this.ren.config.enableSnapToGridType === SNAP_TO_GRID_AFTER) {\n\t\t\t\t\tconst stgPos = this.snapToGridMovedNode(movingObjectData);\n\t\t\t\t\tfinalOffset = {\n\t\t\t\t\t\tx: stgPos.x - movingObjectData.startX,\n\t\t\t\t\t\ty: stgPos.y - movingObjectData.startY\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tfinalOffset = { x: movingObjectData.runningX, y: movingObjectData.runningY };\n\t\t\t\t}\n\n\t\t\t\tif (this.existingNodeInsertableIntoLink &&\n\t\t\t\t\t\tthis.ren.dragOverLink) {\n\t\t\t\t\tthis.ren.canvasController.editActionHandler({\n\t\t\t\t\t\teditType: \"insertNodeIntoLink\",\n\t\t\t\t\t\teditSource: \"canvas\",\n\t\t\t\t\t\tnode: movingObjectData.objects[0],\n\t\t\t\t\t\tlink: this.ren.dragOverLink,\n\t\t\t\t\t\toffsetX: finalOffset.x,\n\t\t\t\t\t\toffsetY: finalOffset.y,\n\t\t\t\t\t\tpipelineId: this.ren.activePipeline.id });\n\n\t\t\t\t} else if (this.existingNodeAttachableToDetachedLinks &&\n\t\t\t\t\t\t\tthis.ren.dragOverDetachedLinks.length > 0) {\n\t\t\t\t\tthis.ren.canvasController.editActionHandler({\n\t\t\t\t\t\teditType: \"attachNodeToLinks\",\n\t\t\t\t\t\teditSource: \"canvas\",\n\t\t\t\t\t\tnode: movingObjectData.objects[0],\n\t\t\t\t\t\tdetachedLinks: this.ren.dragOverDetachedLinks,\n\t\t\t\t\t\toffsetX: finalOffset.x,\n\t\t\t\t\t\toffsetY: finalOffset.y,\n\t\t\t\t\t\tpipelineId: this.ren.activePipeline.id });\n\n\t\t\t\t} else {\n\t\t\t\t\tthis.ren.canvasController.editActionHandler({\n\t\t\t\t\t\teditType: \"moveObjects\",\n\t\t\t\t\t\teditSource: \"canvas\",\n\t\t\t\t\t\tnodes: movingObjectData.objects.map((o) => o.id),\n\t\t\t\t\t\tlinks: this.ren.activePipeline.getSelectedDetachedLinks(),\n\t\t\t\t\t\toffsetX: finalOffset.x,\n\t\t\t\t\t\toffsetY: finalOffset.y,\n\t\t\t\t\t\tpipelineId: this.ren.activePipeline.id });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Switch off any move highlighting\n\t\tthis.ren.setDataLinkSelectionAreaWider(false);\n\t\tthis.unsetNodeTranslucentState(movingObjectData.objects);\n\t\tthis.ren.unsetInsertNodeIntoLinkHighlighting();\n\t\tthis.ren.unsetDetachedLinkHighlighting();\n\t}\n\n\t// Returns an array of objects to move which is typically the selected set of\n\t// nodes and comments. However, if enableDragWithoutSelect is true, and the\n\t// object being moved is not one of the selected objects, then just that\n\t// object is to be moved.\n\tgetMoveObjects(d) {\n\t\tlet moveObjects = this.ren.activePipeline.getSelectedNodesAndComments();\n\n\t\tif (this.ren.config.enableDragWithoutSelect &&\n\t\t\t\tmoveObjects.findIndex((o) => o.id === d.id) === -1) {\n\t\t\treturn [d];\n\t\t}\n\n\t\tif (this.ren.config.enableMoveNodesInComment) {\n\t\t\tif (CanvasUtils.isComment(d)) {\n\t\t\t\tconst objsInComment = this.objsInComment(d, this.ren.activePipeline.nodes);\n\t\t\t\tmoveObjects = CanvasUtils.concatUniqueBasedOnId(objsInComment, moveObjects);\n\t\t\t}\n\t\t}\n\n\t\treturn moveObjects;\n\t}\n\n\t// Returns any object from the set of objects passed in that are\n\t// fully inside the boundaries of the comment passed in.\n\tobjsInComment(com, objs) {\n\t\treturn objs.filter((n) =>\n\t\t\tn.x_pos > com.x_pos &&\n\t\t\tn.y_pos > com.y_pos &&\n\t\t\tn.x_pos + n.width < com.x_pos + com.width &&\n\t\t\tn.y_pos + n.height < com.y_pos + com.height\n\t\t);\n\t}\n\n\t// Switches the 'd3-is-moving' class on and off for the objects passed\n\t// in, based on the state passed in.\n\tswitchIsMovingClass(objs, state) {\n\t\tobjs.forEach((obj) => {\n\t\t\tif (CanvasUtils.isNode(obj)) {\n\t\t\t\tthis.ren.getNodeGroupSelectionById(obj.id).classed(\"d3-is-moving\", state);\n\t\t\t} else {\n\t\t\t\tthis.ren.getCommentGroupSelectionById(obj.id).classed(\"d3-is-moving\", state);\n\t\t\t}\n\t\t});\n\t}\n\n\t// Returns true if the current move objects array has a single node which\n\t// is 'insertable' into a data link between nodes on the canvas. Returns\n\t// false otherwise, including if a single comment is being moved.\n\tisExistingNodeInsertableIntoLink() {\n\t\treturn (this.ren.config.enableInsertNodeDroppedOnLink &&\n\t\t\tthis.movingObjectData.objects.length === 1 &&\n\t\t\tCanvasUtils.isNode(this.movingObjectData.objects[0]) &&\n\t\t\tCanvasUtils.hasInputAndOutputPorts(this.movingObjectData.objects[0]) &&\n\t\t\t!CanvasUtils.isNodeDefaultPortsCardinalityAtMax(this.movingObjectData.objects[0], this.ren.activePipeline.links));\n\t}\n\n\t// Returns true if the current move objects array has a single node which\n\t// is 'attachable' to any detached link on the canvas. Returns false otherwise,\n\t// including if a single comment is being moved.\n\tisExistingNodeAttachableToDetachedLinks() {\n\t\treturn (this.ren.config.enableLinkSelection === LINK_SELECTION_DETACHABLE &&\n\t\t\tthis.movingObjectData.objects.length === 1 &&\n\t\t\tCanvasUtils.isNode(this.movingObjectData.objects[0]));\n\t}\n\n\t// Switches on or off the translucent state of the node identified by the\n\t// node ID passed in. This is used when an 'insertable' node is moved on\n\t// the canvas. It makes is easier for the user to see the highlighted link\n\t// when the node is moved over it.\n\tsetNodeTranslucentState(nodeId, state) {\n\t\tthis.ren.getNodeGroupSelectionById(nodeId).classed(\"d3-node-group-translucent\", state);\n\t}\n\n\t// Switched off the translucent state of the objects being moved (if\n\t// there are any).\n\tunsetNodeTranslucentState(objs) {\n\t\tif (objs?.length > 0) {\n\t\t\tthis.setNodeTranslucentState(objs[0].id, false);\n\t\t}\n\t}\n\n\t// Returns the snap-to-grid position of the object positioned at\n\t// this.movingObjectData.startX and this.movingObjectData.startY\n\t// after applying the current offset of this.movingObjectData.offsetX\n\t// and this.movingObjectData.offsetY.\n\tsnapToGridMovedNode(movingObjectData) {\n\t\tconst x = movingObjectData.startX + movingObjectData.offsetX;\n\t\tconst y = movingObjectData.startY + movingObjectData.offsetY;\n\n\t\treturn this.ren.snapToGridPosition({ x, y });\n\t}\n\n\t// Returns the object passed in with its position and size snapped to\n\t// the current grid dimensions. Used when the object is being resized.\n\tsnapToGridObject(inResizeObj) {\n\t\tconst resizeObj = inResizeObj;\n\t\tresizeObj.x_pos = CanvasUtils.snapToGrid(resizeObj.x_pos, this.ren.canvasLayout.snapToGridXPx);\n\t\tresizeObj.y_pos = CanvasUtils.snapToGrid(resizeObj.y_pos, this.ren.canvasLayout.snapToGridYPx);\n\t\tresizeObj.width = CanvasUtils.snapToGrid(resizeObj.width, this.ren.canvasLayout.snapToGridXPx);\n\t\tresizeObj.height = CanvasUtils.snapToGrid(resizeObj.height, this.ren.canvasLayout.snapToGridYPx);\n\t\treturn resizeObj;\n\t}\n\n\t// Returns an object containing the x and y increments used to move or size\n\t// an object in the direction provided taking into account whether snap\n\t// to grid has been switched on or not.\n\tgetMoveIncrements(dir) {\n\t\t// If no snap-to-grid we just increment by 10px.\n\t\tlet x = 10;\n\t\tlet y = 10;\n\n\t\tif (this.ren.config.enableSnapToGridType === SNAP_TO_GRID_DURING ||\n\t\t\tthis.ren.config.enableSnapToGridType === SNAP_TO_GRID_AFTER) {\n\t\t\tx = this.ren.canvasLayout.snapToGridXPx;\n\t\t\ty = this.ren.canvasLayout.snapToGridYPx;\n\t\t}\n\n\t\tlet xInc = 0;\n\t\tlet yInc = 0;\n\n\t\tswitch (dir) {\n\t\tcase NORTH:\n\t\t\txInc = 0;\n\t\t\tyInc = -y;\n\t\t\tbreak;\n\t\tcase SOUTH:\n\t\t\txInc = 0;\n\t\t\tyInc = y;\n\t\t\tbreak;\n\t\tcase EAST:\n\t\t\txInc = x;\n\t\t\tyInc = 0;\n\t\t\tbreak;\n\t\tdefault:\n\t\tcase WEST:\n\t\t\txInc = -x;\n\t\t\tyInc = 0;\n\t\t\tbreak;\n\t\t}\n\t\treturn { xInc, yInc };\n\t}\n}\n","/*\n * Copyright 2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint no-unneeded-ternary: \"off\" */\n\nimport * as d3Drag from \"d3-drag\";\nimport * as d3Selection from \"d3-selection\";\nconst d3 = Object.assign({}, d3Drag, d3Selection);\n\nimport Logger from \"../logging/canvas-logger.js\";\nimport CanvasUtils from \"./common-canvas-utils.js\";\n\n// This utility files provides a drag handler which manages drag operations on\n// the middle part of a link when it is dragged to a node to convert the link\n// being dragged into two new links into and out of the node.\n\nexport default class SVGCanvasUtilsDragLink {\n\tconstructor(renderer) {\n\t\tthis.ren = renderer;\n\n\t\tthis.logger = new Logger(\"SVGCanvasUtilsDragLink\");\n\n\t\tthis.isDraggingLink = false;\n\n\t\t// Create a drag handler for dragging on a link.\n\t\tthis.dragLinkHandler = d3.drag()\n\t\t\t.on(\"start\", this.dragLinkStart.bind(this))\n\t\t\t.on(\"drag\", this.dragLink.bind(this))\n\t\t\t.on(\"end\", this.dragLinkEnd.bind(this));\n\t}\n\n\t// Returns the dragLinkHandler\n\tgetDragLinkHandler() {\n\t\treturn this.dragLinkHandler;\n\t}\n\n\tisDragging() {\n\t\treturn this.isDraggingLink;\n\t}\n\n\tdragLinkStart(d3Event, d) {\n\t\tthis.logger.logStartTimer(\"dragLinkStart\");\n\n\t\tthis.ren.closeContextMenuIfOpen();\n\n\t\tthis.isDraggingLink = true;\n\t\tthis.dragLink = this.ren.activePipeline.getLink(d.id);\n\n\t\tthis.logger.logEndTimer(\"dragLinkStart\", true);\n\t}\n\n\tdragLink(d3Event) {\n\t\tthis.logger.logStartTimer(\"dragLink\");\n\n\t\tthis.dragLink.centerDragPos = this.ren.getTransformedMousePos(d3Event);\n\t\tthis.ren.displayLinks();\n\t\tthis.ren.raiseLinkToTopById(this.dragLink.id);\n\n\t\tconst nodeNearMouse = this.ren.getNodeNearMousePos(d3Event, this.ren.canvasLayout.nodeProximity);\n\n\t\tconst links = this.ren.activePipeline.links;\n\t\tconst srcNode = this.dragLink.srcObj;\n\t\tconst trgNode = this.dragLink.trgNode;\n\n\t\tthis.targetNode = nodeNearMouse &&\n\t\t\tCanvasUtils.isNodeAttachableToDefaultPorts(nodeNearMouse, links) &&\n\t\t\t!CanvasUtils.linkAlreadyExists(srcNode.outputs[0].id, nodeNearMouse.inputs[0].id, srcNode, nodeNearMouse, links) &&\n\t\t\t!CanvasUtils.linkAlreadyExists(nodeNearMouse.outputs[0].id, trgNode.inputs[0].id, nodeNearMouse, trgNode, links)\n\t\t\t? nodeNearMouse\n\t\t\t: null;\n\n\t\tconst highlight = this.targetNode ? true : false;\n\t\tthis.ren.setHighlightingOverNode(highlight, this.targetNode);\n\n\t\tthis.logger.logEndTimer(\"dragLink\", true);\n\t}\n\n\tdragLinkEnd() {\n\t\tthis.logger.logStartTimer(\"dragLinkEnd\");\n\n\t\tthis.ren.removeTempCursorOverlay();\n\t\tthis.isDraggingLink = false;\n\n\t\tif (this.targetNode) {\n\t\t\tdelete this.dragLink.centerDragPos;\n\t\t\tthis.ren.setLinkOverNodeCancel();\n\n\t\t\tthis.ren.canvasController.editActionHandler({\n\t\t\t\teditType: \"insertNodeIntoLink\",\n\t\t\t\teditSource: \"canvas\",\n\t\t\t\tnode: this.targetNode,\n\t\t\t\tsrcPort: this.targetNode.outputs[0],\n\t\t\t\ttrgPort: this.targetNode.inputs[0],\n\t\t\t\tlink: this.dragLink,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\tpipelineId: this.ren.activePipeline.id });\n\t\t} else {\n\t\t\tthis.dragLink.centerDragPos = \"revertLink\";\n\t\t\tthis.ren.displayLinks();\n\t\t}\n\n\t\tthis.logger.logEndTimer(\"dragLinkEnd\", true);\n\t}\n}\n","export function quadIn(t) {\n return t * t;\n}\n\nexport function quadOut(t) {\n return t * (2 - t);\n}\n\nexport function quadInOut(t) {\n return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;\n}\n","export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n","var exponent = 3;\n\nexport var polyIn = (function custom(e) {\n e = +e;\n\n function polyIn(t) {\n return Math.pow(t, e);\n }\n\n polyIn.exponent = custom;\n\n return polyIn;\n})(exponent);\n\nexport var polyOut = (function custom(e) {\n e = +e;\n\n function polyOut(t) {\n return 1 - Math.pow(1 - t, e);\n }\n\n polyOut.exponent = custom;\n\n return polyOut;\n})(exponent);\n\nexport var polyInOut = (function custom(e) {\n e = +e;\n\n function polyInOut(t) {\n return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;\n }\n\n polyInOut.exponent = custom;\n\n return polyInOut;\n})(exponent);\n","var pi = Math.PI,\n halfPi = pi / 2;\n\nexport function sinIn(t) {\n return (+t === 1) ? 1 : 1 - Math.cos(t * halfPi);\n}\n\nexport function sinOut(t) {\n return Math.sin(t * halfPi);\n}\n\nexport function sinInOut(t) {\n return (1 - Math.cos(pi * t)) / 2;\n}\n","// tpmt is two power minus ten times t scaled to [0,1]\nexport function tpmt(x) {\n return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494;\n}\n","import {tpmt} from \"./math.js\";\n\nexport function expIn(t) {\n return tpmt(1 - +t);\n}\n\nexport function expOut(t) {\n return 1 - tpmt(t);\n}\n\nexport function expInOut(t) {\n return ((t *= 2) <= 1 ? tpmt(1 - t) : 2 - tpmt(t - 1)) / 2;\n}\n","export function circleIn(t) {\n return 1 - Math.sqrt(1 - t * t);\n}\n\nexport function circleOut(t) {\n return Math.sqrt(1 - --t * t);\n}\n\nexport function circleInOut(t) {\n return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;\n}\n","var b1 = 4 / 11,\n b2 = 6 / 11,\n b3 = 8 / 11,\n b4 = 3 / 4,\n b5 = 9 / 11,\n b6 = 10 / 11,\n b7 = 15 / 16,\n b8 = 21 / 22,\n b9 = 63 / 64,\n b0 = 1 / b1 / b1;\n\nexport function bounceIn(t) {\n return 1 - bounceOut(1 - t);\n}\n\nexport function bounceOut(t) {\n return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;\n}\n\nexport function bounceInOut(t) {\n return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;\n}\n","var overshoot = 1.70158;\n\nexport var backIn = (function custom(s) {\n s = +s;\n\n function backIn(t) {\n return (t = +t) * t * (s * (t - 1) + t);\n }\n\n backIn.overshoot = custom;\n\n return backIn;\n})(overshoot);\n\nexport var backOut = (function custom(s) {\n s = +s;\n\n function backOut(t) {\n return --t * t * ((t + 1) * s + t) + 1;\n }\n\n backOut.overshoot = custom;\n\n return backOut;\n})(overshoot);\n\nexport var backInOut = (function custom(s) {\n s = +s;\n\n function backInOut(t) {\n return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;\n }\n\n backInOut.overshoot = custom;\n\n return backInOut;\n})(overshoot);\n","import {tpmt} from \"./math.js\";\n\nvar tau = 2 * Math.PI,\n amplitude = 1,\n period = 0.3;\n\nexport var elasticIn = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticIn(t) {\n return a * tpmt(-(--t)) * Math.sin((s - t) / p);\n }\n\n elasticIn.amplitude = function(a) { return custom(a, p * tau); };\n elasticIn.period = function(p) { return custom(a, p); };\n\n return elasticIn;\n})(amplitude, period);\n\nexport var elasticOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticOut(t) {\n return 1 - a * tpmt(t = +t) * Math.sin((t + s) / p);\n }\n\n elasticOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticOut.period = function(p) { return custom(a, p); };\n\n return elasticOut;\n})(amplitude, period);\n\nexport var elasticInOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticInOut(t) {\n return ((t = t * 2 - 1) < 0\n ? a * tpmt(-t) * Math.sin((s - t) / p)\n : 2 - a * tpmt(t) * Math.sin((s + t) / p)) / 2;\n }\n\n elasticInOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticInOut.period = function(p) { return custom(a, p); };\n\n return elasticInOut;\n})(amplitude, period);\n","export const linear = t => +t;\n","/*\n * Copyright 2017-2026 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint no-lonely-if: \"off\" */\n\nimport * as d3Drag from \"d3-drag\";\nimport * as d3Ease from \"d3-ease\";\nimport * as d3Selection from \"d3-selection\";\nconst d3 = Object.assign({}, d3Drag, d3Ease, d3Selection);\n\nimport Logger from \"../logging/canvas-logger.js\";\nimport CanvasUtils from \"./common-canvas-utils.js\";\nimport { ASSOCIATION_LINK, COMMENT_LINK, NODE_LINK,\n\tLINK_TYPE_CURVE, LINK_TYPE_STRAIGHT, LINK_SELECTION_DETACHABLE,\n\tFLOW_IN, FLOW_OUT,\n\tPORT_DISPLAY_CIRCLE,\n\tLINK_METHOD_PORTS,\n\tSINGLE_CLICK\n} from \"./constants/canvas-constants.js\";\n\n// This utility files provides a drag handler which manages drag operations to\n// create new links either between nodes or from a comment to a node.\n\nexport default class SVGCanvasUtilsDragNewLink {\n\tconstructor(renderer) {\n\t\tthis.ren = renderer;\n\n\t\tthis.logger = new Logger(\"SVGCanvasUtilsDragNewLink\");\n\n\t\t// Object to store variables for dynamically drawing a new link line. The\n\t\t// existence of this object means a new link is being drawn. A null means\n\t\t// no link is currently being drawn.\n\t\tthis.drawingNewLinkData = null;\n\n\t\t// Create a drag handler for resizing and moving nodes and comments.\n\t\tthis.dragNewLinkHandler = d3.drag()\n\t\t\t.on(\"start\", this.dragStartNewLink.bind(this))\n\t\t\t.on(\"drag\", this.dragMoveNewLink.bind(this))\n\t\t\t.on(\"end\", this.dragEndNewLink.bind(this));\n\t}\n\n\t// Returns the dragResizeObjectHandler\n\tgetDragNewLinkHandler() {\n\t\treturn this.dragNewLinkHandler;\n\t}\n\n\t// Returns true if a new link is currently being dragged.\n\tisDragging() {\n\t\treturn this.drawingNewLinkData;\n\t}\n\n\t// Initialize new link creation info when a port node is dragged.\n\tdragStartNewLink(d3Event, d) {\n\t\tif (this.isEventForOutputPort(d3Event)) {\n\t\t\tconst node = this.getNodeForPort(d3Event);\n\t\t\tthis.startOutputPortNewLink(d3Event, d, node);\n\n\t\t} else if (this.isEventForInputPort(d3Event)) {\n\t\t\tconst node = this.getNodeForPort(d3Event);\n\t\t\tthis.startInputPortNewLink(d3Event, d, node);\n\n\t\t} else if (this.ren.activePipeline.getObjectTypeName(d) === \"comment\") {\n\t\t\tthis.startCommentNewLink(d3Event, d);\n\t\t}\n\t}\n\n\t// Draws an appropriate new link line when a port is being dragged.\n\tdragMoveNewLink(d3Event) {\n\t\tthis.drawNewLink(d3Event);\n\t}\n\n\t// Completes the creation (or not) of a new link line when a port has\n\t// finished being dragged.\n\tdragEndNewLink(d3Event) {\n\t\tthis.completeNewLink(d3Event);\n\t}\n\n\t// Return true if the d3Event passed in is for an input port.\n\tisEventForInputPort(d3Event) {\n\t\treturn this.targetContainsClass(d3Event, \"d3-node-port-input\") ||\n\t\t\tthis.targetContainsClass(d3Event, \"d3-node-port-input-assoc\");\n\t}\n\n\t// Return true if the d3Event passed in is for an output port.\n\tisEventForOutputPort(d3Event) {\n\t\treturn this.targetContainsClass(d3Event, \"d3-node-port-output\") ||\n\t\t\tthis.targetContainsClass(d3Event, \"d3-node-port-output-assoc\");\n\t}\n\n\t// Returns true if the d3Event contains a current target with the specified class name.\n\ttargetContainsClass(d3Event, className) {\n\t\treturn d3Event.sourceEvent?.currentTarget?.classList?.contains(className);\n\t}\n\n\t// Returns the node data for the target of the event passed in.\n\tgetNodeForPort(d3Event) {\n\t\treturn d3.select(d3Event.sourceEvent?.currentTarget?.parentNode).datum();\n\t}\n\n\t// Initialize this.drawingNewLinkData when dragging a comment port.\n\tstartCommentNewLink(d3Event, comment) {\n\t\tconst srcObj = this.ren.activePipeline.getComment(comment.id);\n\t\tthis.drawingNewLinkData = {\n\t\t\tsrcObj: srcObj,\n\t\t\taction: COMMENT_LINK,\n\t\t\tstartPos: {\n\t\t\t\tx: comment.x_pos - this.ren.canvasLayout.commentHighlightGap,\n\t\t\t\ty: comment.y_pos - this.ren.canvasLayout.commentHighlightGap\n\t\t\t},\n\t\t\tmousePos: { x: d3Event.x, y: d3Event.y },\n\t\t\tlinkArray: []\n\t\t};\n\t}\n\n\t// Initialize this.drawingNewLinkData when dragging an input port. This gesture\n\t// is only supported for association link creation.\n\tstartInputPortNewLink(d3Event, port, node) {\n\t\tif (this.ren.config.enableAssocLinkCreation) {\n\t\t\tconst srcNode = this.ren.activePipeline.getNode(node.id);\n\t\t\tconst portIndex = CanvasUtils.getPortIndex(node.inputs, port.id);\n\t\t\tthis.drawingNewLinkData = {\n\t\t\t\tsrcObj: srcNode,\n\t\t\t\tsrcPort: port,\n\t\t\t\taction: this.ren.config.enableAssocLinkCreation ? ASSOCIATION_LINK : NODE_LINK,\n\t\t\t\tmousePos: { x: d3Event.x, y: d3Event.y },\n\t\t\t\tstartPos: { x: srcNode.x_pos + port.cx, y: srcNode.y_pos + port.cy },\n\t\t\t\tportFlow: FLOW_IN,\n\t\t\t\tportDisplayInfo: this.ren.getPortDisplayInfo(srcNode.layout.inputPortDisplayObjects, portIndex),\n\t\t\t\tportGuideInfo: this.ren.getPortDisplayInfo(srcNode.layout.inputPortGuideObjects, portIndex),\n\t\t\t\tportRadius: this.ren.getPortRadius(srcNode),\n\t\t\t\tminInitialLine: srcNode.layout.minInitialLine,\n\t\t\t\tlinkArray: []\n\t\t\t};\n\t\t}\n\t}\n\n\t// Initialize this.drawingNewLinkData when dragging an output port.\n\tstartOutputPortNewLink(d3Event, port, node) {\n\t\tconst srcNode = this.ren.activePipeline.getNode(node.id);\n\t\tif (!CanvasUtils.isSrcCardinalityAtMax(port.id, srcNode, this.ren.activePipeline.links)) {\n\t\t\tconst portIndex = CanvasUtils.getPortIndex(node.outputs, port.id);\n\t\t\tthis.drawingNewLinkData = {\n\t\t\t\tsrcObj: srcNode,\n\t\t\t\tsrcPort: port,\n\t\t\t\taction: this.ren.config.enableAssocLinkCreation ? ASSOCIATION_LINK : NODE_LINK,\n\t\t\t\tmousePos: { x: d3Event.x, y: d3Event.y },\n\t\t\t\tstartPos: { x: srcNode.x_pos + port.cx, y: srcNode.y_pos + port.cy },\n\t\t\t\tportFlow: FLOW_OUT,\n\t\t\t\tportDisplayInfo: this.ren.getPortDisplayInfo(srcNode.layout.outputPortDisplayObjects, portIndex),\n\t\t\t\tportGuideInfo: this.ren.getPortDisplayInfo(srcNode.layout.outputPortGuideObjects, portIndex),\n\t\t\t\tportRadius: this.ren.getPortRadius(srcNode),\n\t\t\t\tminInitialLine: srcNode.layout.minInitialLine,\n\t\t\t\tlinkArray: []\n\t\t\t};\n\t\t\tif (this.ren.config.enableHighlightUnavailableNodes) {\n\t\t\t\tthis.ren.setUnavailableTargetNodesHighlighting(srcNode, port.id, this.ren.activePipeline.links);\n\t\t\t}\n\t\t}\n\t}\n\n\tdrawNewLink(d3Event) {\n\t\tif (this.ren.config.enableEditingActions === false || !this.drawingNewLinkData) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.ren.closeContextMenuIfOpen();\n\n\t\tconst transPos = this.ren.getTransformedMousePos(d3Event);\n\n\t\tif (this.drawingNewLinkData.action === COMMENT_LINK) {\n\t\t\tthis.drawNewCommentLink(transPos);\n\t\t} else {\n\t\t\tthis.drawNewNodeLink(transPos);\n\t\t}\n\t\t// Switch on an attribute to indicate a new link is being dragged\n\t\t// towards and over a target node.\n\t\tif (this.ren.config.enableHighlightNodeOnNewLinkDrag) {\n\t\t\tthis.setNewLinkOverNode(d3Event);\n\t\t}\n\t}\n\n\tdrawNewCommentLink(transPos) {\n\t\tconst srcComment = this.ren.activePipeline.getComment(this.drawingNewLinkData.srcObj.id);\n\t\tconst startPos = this.ren.linkUtils.getNewStraightCommentLinkStartPos(srcComment, transPos);\n\t\tconst linkType = COMMENT_LINK;\n\n\t\tthis.drawingNewLinkData.linkArray = [{\n\t\t\t\"x1\": startPos.x,\n\t\t\t\"y1\": startPos.y,\n\t\t\t\"x2\": transPos.x,\n\t\t\t\"y2\": transPos.y,\n\t\t\t\"type\": linkType }];\n\n\t\tconst connectionLineSel = this.ren.nodesLinksGrp.selectAll(\".d3-new-connection-line\");\n\t\tconst connectionGuideSel = this.ren.nodesLinksGrp.selectAll(\".d3-new-connection-guide\");\n\n\t\tconnectionLineSel\n\t\t\t.data(this.drawingNewLinkData.linkArray)\n\t\t\t.enter()\n\t\t\t.append(\"path\")\n\t\t\t.attr(\"class\", \"d3-new-connection-line\")\n\t\t\t.attr(\"linkType\", linkType)\n\t\t\t.merge(connectionLineSel)\n\t\t\t.attr(\"d\", (d) => this.ren.linkUtils.getConnectorPathInfo(d).path);\n\n\t\tconnectionGuideSel\n\t\t\t.data(this.drawingNewLinkData.linkArray)\n\t\t\t.enter()\n\t\t\t.append(\"circle\")\n\t\t\t.attr(\"class\", \"d3-new-connection-guide\")\n\t\t\t.attr(\"linkType\", linkType)\n\t\t\t.merge(connectionGuideSel)\n\t\t\t.attr(\"cx\", (d) => d.x2)\n\t\t\t.attr(\"cy\", (d) => d.y2)\n\t\t\t.attr(\"r\", this.ren.canvasLayout.commentPortRadius);\n\n\t\tif (this.ren.canvasLayout.commentLinkArrowHead) {\n\t\t\tconst connectionArrowHeadSel = this.ren.nodesLinksGrp.selectAll(\".d3-new-connection-arrow\");\n\n\t\t\tconnectionArrowHeadSel\n\t\t\t\t.data(this.drawingNewLinkData.linkArray)\n\t\t\t\t.enter()\n\t\t\t\t.append(\"path\")\n\t\t\t\t.attr(\"class\", \"d3-new-connection-arrow\")\n\t\t\t\t.attr(\"linkType\", linkType)\n\t\t\t\t.merge(connectionArrowHeadSel)\n\t\t\t\t.attr(\"d\", (d) => this.ren.getArrowHead(d))\n\t\t\t\t.attr(\"transform\", (d) => this.ren.getArrowHeadTransform(d));\n\t\t}\n\t}\n\n\tdrawNewNodeLink(transPos) {\n\t\tconst linkCategory = this.ren.config.enableAssocLinkCreation ? ASSOCIATION_LINK : NODE_LINK;\n\n\t\t// Create a temporary link to represent the new link being created.\n\t\tconst inLink = {\n\t\t\ttype: linkCategory,\n\t\t\tsrcObj: this.drawingNewLinkData.srcObj,\n\t\t\tsrcNodeId: this.drawingNewLinkData.srcObj.id,\n\t\t\tsrcNodePortId: this.drawingNewLinkData.srcPort.id,\n\t\t\ttrgPos: {\n\t\t\t\tx_pos: transPos.x,\n\t\t\t\ty_pos: transPos.y\n\t\t\t}\n\t\t};\n\n\t\tconst link = this.ren.getDetachedLinkObj(inLink);\n\t\tthis.drawingNewLinkData.linkArray = this.ren.linkUtils.addConnectionPaths([link]);\n\n\t\tif (this.ren.config.enableAssocLinkCreation) {\n\t\t\tthis.drawingNewLinkData.linkArray[0].assocLinkVariation =\n\t\t\t\tthis.ren.getNewLinkAssocVariation(\n\t\t\t\t\tthis.drawingNewLinkData.linkArray[0].x1,\n\t\t\t\t\tthis.drawingNewLinkData.linkArray[0].x2,\n\t\t\t\t\tthis.drawingNewLinkData.portFlow);\n\t\t}\n\n\t\tconst pathInfo = this.ren.linkUtils.getConnectorPathInfo(\n\t\t\tthis.drawingNewLinkData.linkArray[0], this.drawingNewLinkData.minInitialLine);\n\n\t\tconst connectionLineSel = this.ren.nodesLinksGrp.selectAll(\".d3-new-connection-line\");\n\t\tconst connectionStartSel = this.ren.nodesLinksGrp.selectAll(\".d3-new-connection-start\");\n\t\tconst connectionGuideSel = this.ren.nodesLinksGrp.selectAll(\".d3-new-connection-guide\");\n\n\t\t// For a straight node line, don't draw the new link line when the guide icon\n\t\t// or object is inside the node boundary otherwise it looks ugly when trying\n\t\t// to draw straight lines over the node.\n\t\tif (linkCategory === NODE_LINK &&\n\t\t\t\tthis.ren.canvasLayout.linkType === LINK_TYPE_STRAIGHT &&\n\t\t\t\tthis.ren.nodeUtils.isPointInNodeBoundary(transPos, this.drawingNewLinkData.srcObj)) {\n\t\t\tthis.removeNewLinkLine();\n\n\t\t} else {\n\t\t\tconnectionLineSel\n\t\t\t\t.data(this.drawingNewLinkData.linkArray)\n\t\t\t\t.enter()\n\t\t\t\t.append(\"path\")\n\t\t\t\t.attr(\"class\", \"d3-new-connection-line\")\n\t\t\t\t.attr(\"linkType\", linkCategory)\n\t\t\t\t.merge(connectionLineSel)\n\t\t\t\t.attr(\"d\", pathInfo.path)\n\t\t\t\t.attr(\"transform\", pathInfo.transform);\n\t\t}\n\n\t\t// If we are drawing a link from a port that is displayed as a circle,\n\t\t// we draw a circle at the start of the link to cover over the actual\n\t\t// link line that is drawn from the port's center.\n\t\tif (this.ren.canvasLayout.linkMethod === LINK_METHOD_PORTS &&\n\t\t\tthis.drawingNewLinkData.portDisplayInfo.tag === PORT_DISPLAY_CIRCLE) {\n\t\t\tconnectionStartSel\n\t\t\t\t.data(this.drawingNewLinkData.linkArray)\n\t\t\t\t.enter()\n\t\t\t\t.append(\"circle\")\n\t\t\t\t.attr(\"class\", \"d3-new-connection-start\")\n\t\t\t\t.attr(\"linkType\", linkCategory)\n\t\t\t\t.merge(connectionStartSel)\n\t\t\t\t.each((d, i, startSel) => {\n\t\t\t\t\td3.select(startSel[i])\n\t\t\t\t\t\t.attr(\"cx\", d.x1)\n\t\t\t\t\t\t.attr(\"cy\", d.y1)\n\t\t\t\t\t\t.attr(\"r\", this.drawingNewLinkData.portRadius);\n\t\t\t\t});\n\t\t}\n\n\t\t// Draw the guide object (either a circle, an image or JSX) which is\n\t\t// at the end of the new link being dragged out from the source object.\n\t\tconnectionGuideSel\n\t\t\t.data(this.drawingNewLinkData.linkArray)\n\t\t\t.enter()\n\t\t\t.append(this.drawingNewLinkData.portGuideInfo.tag)\n\t\t\t.attr(\"class\", \"d3-new-connection-guide\")\n\t\t\t.attr(\"linkType\", linkCategory)\n\t\t\t.merge(connectionGuideSel)\n\t\t\t.each((d, i, guideSel) => {\n\t\t\t\tconst obj = d3.select(guideSel[i]);\n\t\t\t\tconst transform = this.ren.getLinkImageTransform(d);\n\t\t\t\tthis.ren.updatePort(obj,\n\t\t\t\t\tthis.drawingNewLinkData.portGuideInfo,\n\t\t\t\t\tthis.drawingNewLinkData.srcObj,\n\t\t\t\t\td.x2,\n\t\t\t\t\td.y2,\n\t\t\t\t\ttransform);\n\t\t\t});\n\t}\n\n\tremoveNewLinkLine() {\n\t\tthis.ren.nodesLinksGrp.selectAll(\".d3-new-connection-line\").remove();\n\t}\n\n\t// Handles the completion of a new link being drawn from a source node.\n\tcompleteNewLink(d3Event) {\n\t\tif (this.ren.config.enableEditingActions === false || !this.drawingNewLinkData) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Save a local reference to this.drawingNewLinkData so we can set it to null before\n\t\t// calling the canvas-controller. This means the this.drawingNewLinkData object will\n\t\t// be null when the canvas is refreshed.\n\t\tconst drawingNewLinkData = this.drawingNewLinkData;\n\t\tthis.drawingNewLinkData = null;\n\n\t\t// If the user has not dragged the mouse far enough to create a new link, we\n\t\t// treat it as a click on the port.\n\t\tif (CanvasUtils.isTinyMovement(drawingNewLinkData.mousePos, { x: d3Event.x, y: d3Event.y })) {\n\t\t\tthis.removeNewLink();\n\t\t\tthis.ren.canvasController.clickActionHandler({\n\t\t\t\tclickType: SINGLE_CLICK,\n\t\t\t\tobjectType: \"port\",\n\t\t\t\tid: drawingNewLinkData.srcPort.id,\n\t\t\t\tnodeId: drawingNewLinkData.srcObj.id,\n\t\t\t\tselectedObjectIds: this.ren.activePipeline.getSelectedObjectIds(),\n\t\t\t\tpipelineId: this.ren.activePipeline.id\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.ren.config.enableHighlightUnavailableNodes) {\n\t\t\tthis.ren.unsetUnavailableNodesHighlighting();\n\t\t}\n\t\tconst pos = this.ren.getMousePosFromEvent(d3Event);\n\t\tconst trgNode = this.ren.getNodeAtPos(pos);\n\t\tif (trgNode !== null) {\n\t\t\tthis.createNewLinkFromDragData(d3Event, trgNode, drawingNewLinkData);\n\n\t\t} else {\n\t\t\tif (this.ren.config.enableLinkSelection === LINK_SELECTION_DETACHABLE &&\n\t\t\t\t\tdrawingNewLinkData.action === NODE_LINK &&\n\t\t\t\t\t!this.ren.config.enableAssocLinkCreation) {\n\t\t\t\tthis.completeNewDetachedLink(d3Event, drawingNewLinkData);\n\n\t\t\t} else {\n\t\t\t\tthis.stopDrawingNewLink(drawingNewLinkData);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Handles the creation of a link when the end of a new link\n\t// being drawn from a source node is dropped on a target node.\n\tcreateNewLinkFromDragData(d3Event, trgNode, drawingNewLinkData) {\n\t\t// If we completed a connection remove the new line objects.\n\t\tthis.removeNewLink();\n\n\t\t// Switch 'new link over node' highlighting off\n\t\tif (this.ren.config.enableHighlightNodeOnNewLinkDrag) {\n\t\t\tthis.ren.setLinkOverNodeCancel();\n\t\t}\n\n\t\t// Create the link.\n\t\tconst type = drawingNewLinkData.action;\n\n\t\tif (trgNode !== null) {\n\t\t\tif (type === NODE_LINK) {\n\t\t\t\tconst srcNode = drawingNewLinkData.srcObj;\n\t\t\t\tconst srcPortId = drawingNewLinkData.srcPort.id;\n\t\t\t\tconst pos = this.ren.getMousePosFromEvent(d3Event);\n\t\t\t\tconst trgPortId = this.ren.getInputNodePortId(pos, trgNode);\n\t\t\t\tthis.createNewNodeLink(srcNode, srcPortId, trgNode, trgPortId);\n\n\t\t\t} else if (type === ASSOCIATION_LINK) {\n\t\t\t\tconst srcObj = drawingNewLinkData.srcObj;\n\t\t\t\tthis.createNewAssocLink(srcObj, trgNode);\n\n\t\t\t} else if (type === COMMENT_LINK) {\n\t\t\t\tconst srcObj = drawingNewLinkData.srcObj;\n\t\t\t\tthis.createNewCommentLink(srcObj, trgNode);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Creates a link from the currently selected objects. This is called when\n\t// the user presses a keyboard shortcut to create the link. For the link to be\n\t// created, there must be exactly two selections and the first selection must\n\t// be either a comment or a node and the second selection must be a node.\n\tcreateNewLinkFromSelections() {\n\t\tconst selNodes = this.ren.activePipeline.getSelectedNodes();\n\t\tconst selComments = this.ren.activePipeline.getSelectedComments();\n\n\t\tif (selNodes.length + selComments.length === 2) {\n\t\t\tif (selNodes.length === 1 && selComments.length === 1) {\n\t\t\t\tthis.createNewCommentLink(selComments[0], selNodes[0]);\n\n\t\t\t} else if (selNodes.length === 2) {\n\t\t\t\tif (this.ren.config.enableAssocLinkCreation) {\n\t\t\t\t\tthis.createNewAssocLink(selNodes[0], selNodes[1]);\n\n\t\t\t\t} else {\n\t\t\t\t\tconst srcPortId = CanvasUtils.getDefaultOutputPortId(selNodes[0]);\n\t\t\t\t\tconst trgPortId = CanvasUtils.getDefaultInputPortId(selNodes[1]);\n\t\t\t\t\tthis.createNewNodeLink(selNodes[0], srcPortId, selNodes[1], trgPortId);\n\t\t\t\t\t// This selects just the target object which allows the user to\n\t\t\t\t\t// more easily create a subsequent link to the next node.\n\t\t\t\t\tthis.ren.canvasController.setSelections([selNodes[1].id]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcreateNewNodeLink(srcNode, srcPortId, trgNode, trgPortId) {\n\t\tif (CanvasUtils.isDataConnectionAllowed(srcPortId, trgPortId, srcNode, trgNode,\n\t\t\tthis.ren.activePipeline.links, this.ren.config.enableSelfRefLinks)) {\n\t\t\tthis.ren.canvasController.editActionHandler({\n\t\t\t\teditType: \"linkNodes\",\n\t\t\t\teditSource: \"canvas\",\n\t\t\t\tnodes: [{ \"id\": srcNode.id, \"portId\": srcPortId }],\n\t\t\t\ttargetNodes: [{ \"id\": trgNode.id, \"portId\": trgPortId }],\n\t\t\t\ttype: NODE_LINK,\n\t\t\t\tlinkType: \"data\", // Added for historical purposes - for WML Canvas support\n\t\t\t\tpipelineId: this.ren.activePipeline.id });\n\n\t\t\t// Clear connectFrom status if it was set on the source port\n\t\t\tthis.ren.canvasController.clearConnectFromStatus(this.ren.activePipeline.id);\n\n\t\t} else if (this.ren.config.enableLinkReplaceOnNewConnection &&\n\t\t\t\t\tCanvasUtils.isDataLinkReplacementAllowed(srcPortId, trgPortId, srcNode, trgNode,\n\t\t\t\t\t\tthis.ren.activePipeline.links, this.ren.config.enableSelfRefLinks)) {\n\t\t\tconst linksToTrgPort = CanvasUtils.getDataLinksConnectedTo(trgPortId, trgNode, this.ren.activePipeline.links);\n\t\t\t// We only replace a link to a maxed out cardinality port if there\n\t\t\t// is only one link. i.e. the input port cardinality is 0:1\n\t\t\tif (linksToTrgPort.length === 1) {\n\t\t\t\tthis.ren.canvasController.editActionHandler({\n\t\t\t\t\teditType: \"linkNodesAndReplace\",\n\t\t\t\t\teditSource: \"canvas\",\n\t\t\t\t\tnodes: [{ \"id\": srcNode.id, \"portId\": srcPortId }],\n\t\t\t\t\ttargetNodes: [{ \"id\": trgNode.id, \"portId\": trgPortId }],\n\t\t\t\t\ttype: NODE_LINK,\n\t\t\t\t\tpipelineId: this.pipelineId,\n\t\t\t\t\treplaceLink: linksToTrgPort[0]\n\t\t\t\t});\n\n\t\t\t\t// Clear connectFrom status if it was set on the source port\n\t\t\t\tthis.ren.canvasController.clearConnectFromStatus(this.ren.activePipeline.id);\n\t\t\t}\n\t\t}\n\t}\n\n\tcreateNewAssocLink(srcNode, trgNode) {\n\t\tif (CanvasUtils.isAssocConnectionAllowed(srcNode, trgNode, this.ren.activePipeline.links)) {\n\t\t\tthis.ren.canvasController.editActionHandler({\n\t\t\t\teditType: \"linkNodes\",\n\t\t\t\teditSource: \"canvas\",\n\t\t\t\tnodes: [{ \"id\": srcNode.id }],\n\t\t\t\ttargetNodes: [{ \"id\": trgNode.id }],\n\t\t\t\ttype: ASSOCIATION_LINK,\n\t\t\t\tpipelineId: this.ren.activePipeline.id });\n\t\t}\n\t}\n\n\tcreateNewCommentLink(srcObj, trgNode) {\n\t\tif (CanvasUtils.isCommentLinkConnectionAllowed(srcObj.id, trgNode.id, this.ren.activePipeline.links)) {\n\t\t\tthis.ren.canvasController.editActionHandler({\n\t\t\t\teditType: \"linkComment\",\n\t\t\t\teditSource: \"canvas\",\n\t\t\t\tnodes: [srcObj.id],\n\t\t\t\ttargetNodes: [trgNode.id],\n\t\t\t\ttype: COMMENT_LINK,\n\t\t\t\tlinkType: \"comment\", // Added for historical purposes - for WML Canvas support\n\t\t\t\tpipelineId: this.ren.activePipeline.id });\n\t\t}\n\t}\n\n\t// Handles the completion of a new link when the end is dropped away from\n\t// a node (when enableLinkSelection is set to LINK_SELECTION_DETACHABLE)\n\t// which creates a new detached link.\n\tcompleteNewDetachedLink(d3Event, drawingNewLinkData) {\n\t\t// If we completed a connection remove the new line objects.\n\t\tthis.removeNewLink();\n\n\t\t// Switch 'new link over node' highlighting off\n\t\tif (this.ren.config.enableHighlightNodeOnNewLinkDrag) {\n\t\t\tthis.ren.setLinkOverNodeCancel();\n\t\t}\n\n\t\tconst endPoint = this.ren.getTransformedMousePos(d3Event);\n\t\tthis.ren.canvasController.editActionHandler({\n\t\t\teditType: \"createDetachedLink\",\n\t\t\teditSource: \"canvas\",\n\t\t\tsrcNodeId: drawingNewLinkData.srcObj.id,\n\t\t\tsrcNodePortId: drawingNewLinkData.srcPort.id,\n\t\t\ttrgPos: endPoint,\n\t\t\ttype: NODE_LINK,\n\t\t\tpipelineId: this.ren.activePipeline.id });\n\t}\n\n\tstopDrawingNewLink(drawingNewLinkData) {\n\t\t// Switch 'new link over node' highlighting off\n\t\tif (this.ren.config.enableHighlightNodeOnNewLinkDrag) {\n\t\t\tthis.ren.setLinkOverNodeCancel();\n\t\t}\n\n\t\tthis.stopDrawingNewLinkForPorts(drawingNewLinkData);\n\t}\n\n\t// Draws a 'snap-back' link with a rubber-band effect that\n\t// animates the cancellation of a new link's creation.\n\tstopDrawingNewLinkForPorts(drawingNewLinkData) {\n\t\tif (drawingNewLinkData.linkArray?.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst saveX1 = drawingNewLinkData.linkArray[0].x1;\n\t\tconst saveY1 = drawingNewLinkData.linkArray[0].y1;\n\t\tconst saveX2 = drawingNewLinkData.linkArray[0].x2;\n\t\tconst saveY2 = drawingNewLinkData.linkArray[0].y2;\n\n\t\tconst saveNewLinkData = Object.assign({}, drawingNewLinkData);\n\n\t\t// If we completed a connection successfully just remove the new line\n\t\t// objects.\n\t\tlet newPath = \"\";\n\t\tlet duration = 350;\n\n\t\tif (this.ren.canvasLayout.linkType === LINK_TYPE_CURVE) {\n\t\t\tnewPath = \"M \" + saveX1 + \" \" + saveY1 +\n\t\t\t\t\t\t\t\t\"C \" + saveX2 + \" \" + saveY2 +\n\t\t\t\t\t\t\t\t\" \" + saveX2 + \" \" + saveY2 +\n\t\t\t\t\t\t\t\t\" \" + saveX2 + \" \" + saveY2;\n\n\t\t} else if (this.ren.canvasLayout.linkType === LINK_TYPE_STRAIGHT) {\n\t\t\tif (saveX1 < saveX2) {\n\t\t\t\tduration = 0;\n\t\t\t}\n\t\t\tnewPath = \"M \" + saveX1 + \" \" + saveY1 +\n\t\t\t\t\t\t\t\t\"L \" + saveX2 + \" \" + saveY2 +\n\t\t\t\t\t\t\t\t\" \" + saveX2 + \" \" + saveY2 +\n\t\t\t\t\t\t\t\t\" \" + saveX2 + \" \" + saveY2;\n\n\t\t} else {\n\t\t\tnewPath = \"M \" + saveX1 + \" \" + saveY1 +\n\t\t\t\t\t\t\t\t\"L \" + saveX2 + \" \" + saveY2 +\n\t\t\t\t\t\t\t\t\"Q \" + saveX2 + \" \" + saveY2 + \" \" + saveX2 + \" \" + saveY2 +\n\t\t\t\t\t\t\t\t\"L \" + saveX2 + \" \" + saveY2 +\n\t\t\t\t\t\t\t\t\"Q \" + saveX2 + \" \" + saveY2 + \" \" + saveX2 + \" \" + saveY2 +\n\t\t\t\t\t\t\t\t\"L \" + saveX2 + \" \" + saveY2 +\n\t\t\t\t\t\t\t\t\"Q \" + saveX2 + \" \" + saveY2 + \" \" + saveX2 + \" \" + saveY2 +\n\t\t\t\t\t\t\t\t\"L \" + saveX2 + \" \" + saveY2 +\n\t\t\t\t\t\t\t\t\"Q \" + saveX2 + \" \" + saveY2 + \" \" + saveX2 + \" \" + saveY2 +\n\t\t\t\t\t\t\t\t\"L \" + saveX2 + \" \" + saveY2;\n\t\t}\n\n\t\tthis.ren.nodesLinksGrp.selectAll(\".d3-new-connection-line\")\n\t\t\t.transition()\n\t\t\t.duration(duration)\n\t\t\t.attr(\"d\", newPath)\n\t\t\t.on(\"end\", () => {\n\t\t\t\tthis.ren.nodesLinksGrp.selectAll(\".d3-new-connection-arrow\").remove();\n\n\t\t\t\tthis.ren.nodesLinksGrp.selectAll(\".d3-new-connection-guide\")\n\t\t\t\t\t.transition()\n\t\t\t\t\t.duration(1000)\n\t\t\t\t\t.ease(d3.easeElastic)\n\t\t\t\t\t// The lines below set all attributes for images AND circles even\n\t\t\t\t\t// though some attributes will not be relevant. This is done\n\t\t\t\t\t// because I could not get the .each() method to work here (which\n\t\t\t\t\t// would be necessary to have an if statement based on guide object)\n\t\t\t\t\t.attr(\"x\", saveX1 - (saveNewLinkData.portGuideInfo?.width / 2))\n\t\t\t\t\t.attr(\"y\", saveY1 - (saveNewLinkData.portGuideInfo?.height / 2))\n\t\t\t\t\t.attr(\"cx\", saveX1)\n\t\t\t\t\t.attr(\"cy\", saveY1)\n\t\t\t\t\t.attr(\"transform\", null);\n\t\t\t\tthis.ren.nodesLinksGrp.selectAll(\".d3-new-connection-line\")\n\t\t\t\t\t.transition()\n\t\t\t\t\t.duration(1000)\n\t\t\t\t\t.ease(d3.easeElastic)\n\t\t\t\t\t.attr(\"d\", \"M \" + saveX1 + \" \" + saveY1 +\n\t\t\t\t\t\t\t\t\t\t\t\"L \" + saveX1 + \" \" + saveY1)\n\t\t\t\t\t.on(\"end\", this.removeNewLink.bind(this));\n\t\t\t});\n\t}\n\n\tremoveNewLink() {\n\t\t// If a guide object is drawn using JSX in a foreignObject, we need to\n\t\t// make sure it's internal React object is removed successfully.\n\t\tthis.ren.nodesLinksGrp.selectAll(\"foreignObject.d3-new-connection-guide\")\n\t\t\t.each((x, i, foreignObjects) =>\n\t\t\t\tthis.ren.externalUtils.removeExternalObject(x, i, foreignObjects));\n\n\t\t// Remove all the constituent parts of the new link.\n\t\tthis.ren.nodesLinksGrp.selectAll(\".d3-new-connection-line\").remove();\n\t\tthis.ren.nodesLinksGrp.selectAll(\".d3-new-connection-start\").remove();\n\t\tthis.ren.nodesLinksGrp.selectAll(\".d3-new-connection-guide\").remove();\n\t\tthis.ren.nodesLinksGrp.selectAll(\".d3-new-connection-arrow\").remove();\n\n\t}\n\n\t// Switches on or off node highlighting depending on whether a node is\n\t// close to the new link being dragged.\n\tsetNewLinkOverNode(d3Event) {\n\t\tconst nodeNearMouse = this.ren.getNodeNearMousePos(d3Event, this.ren.canvasLayout.nodeProximity);\n\t\tconst highlightState = nodeNearMouse && this.isNewLinkAllowedToNode(d3Event, nodeNearMouse);\n\t\tthis.ren.setHighlightingOverNode(highlightState, nodeNearMouse);\n\t}\n\n\t// Returns true if a connection is allowed to the node passed in based on the\n\t// this.drawingNewLinkData object which describes a new link being dragged.\n\tisNewLinkAllowedToNode(d3Event, node) {\n\t\tif (this.drawingNewLinkData) {\n\t\t\tif (this.drawingNewLinkData.action === NODE_LINK) {\n\t\t\t\tconst srcNode = this.drawingNewLinkData.srcObj;\n\t\t\t\tconst trgNode = node;\n\t\t\t\tconst srcNodePortId = this.drawingNewLinkData.srcPort.id;\n\t\t\t\tconst pos = this.ren.getMousePosFromEvent(d3Event);\n\t\t\t\tconst trgNodePortId = this.ren.getInputNodePortId(pos, trgNode);\n\t\t\t\treturn CanvasUtils.isDataConnectionAllowed(srcNodePortId, trgNodePortId, srcNode, trgNode,\n\t\t\t\t\tthis.ren.activePipeline.links, this.ren.config.enableSelfRefLinks);\n\n\t\t\t} else if (this.drawingNewLinkData.action === ASSOCIATION_LINK) {\n\t\t\t\tconst srcNode = this.drawingNewLinkData.srcObj;\n\t\t\t\tconst trgNode = node;\n\t\t\t\treturn CanvasUtils.isAssocConnectionAllowed(srcNode, trgNode, this.ren.activePipeline.links);\n\n\t\t\t} else if (this.drawingNewLinkData.action === COMMENT_LINK) {\n\t\t\t\tconst srcObjId = this.drawingNewLinkData.srcObj.id;\n\t\t\t\tconst trgNodeId = node.id;\n\t\t\t\treturn CanvasUtils.isCommentLinkConnectionAllowed(srcObjId, trgNodeId, this.ren.activePipeline.links);\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n}\n","/*\n * Copyright 2017-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint no-lonely-if: \"off\" */\n\nimport * as d3Drag from \"d3-drag\";\nimport * as d3Selection from \"d3-selection\";\nconst d3 = Object.assign({}, d3Drag, d3Selection);\n\nimport Logger from \"../logging/canvas-logger.js\";\nimport CanvasUtils from \"./common-canvas-utils.js\";\nimport { LINK_SELECTION_DETACHABLE, NORTH, SOUTH, EAST, WEST } from \"./constants/canvas-constants.js\";\n\n\n// This utility files provides a drag handler which manages drag operations on\n// the start and end points of detached links. Also, it provides utility functions\n// to handle those same operations performed by the keyboard user.\n\nexport default class SVGCanvasUtilsDragDetLink {\n\tconstructor(renderer) {\n\t\tthis.ren = renderer;\n\n\t\tthis.logger = new Logger(\"SVGCanvasUtilsDragDetLink\");\n\n\t\t// Object to store variables for dynamically drawing detached links.\n\t\tthis.draggingLinkData = null;\n\n\t\t// Create a drag handler that can be used with draggable ends of\n\t\t// detached links.\n\t\tthis.dragDetLinkHandler = d3.drag()\n\t\t\t.on(\"start\", this.dragStartDetLinkHandle.bind(this))\n\t\t\t.on(\"drag\", this.dragMoveDetLinkHandle.bind(this))\n\t\t\t.on(\"end\", this.dragEndDetLinkHandle.bind(this));\n\n\t}\n\n\t// Returns the dragResizeObjectHandler\n\tgetDragDetachedLinkHandler() {\n\t\treturn this.dragDetLinkHandler;\n\t}\n\n\t// Returns true if a detached link (start or end) is currently being dragged.\n\tisDragging() {\n\t\treturn this.draggingLinkData;\n\t}\n\n\t// Returns true if the link passed in is currently being dragged.\n\tisLinkBeingDragged(link) {\n\t\treturn this.draggingLinkData && this.draggingLinkData.link.id === link.id;\n\t}\n\n\t// Begins the dragging of a link handle of a detachable link.\n\tdragStartDetLinkHandle(d3Event, d) {\n\t\tthis.logger.logStartTimer(\"dragStartDetLinkHandle\");\n\t\tthis.startHandleMoving(d, d3Event.sourceEvent.currentTarget);\n\t\tthis.logger.logEndTimer(\"dragStartDetLinkHandle\", true);\n\t}\n\n\t// Display a link when its handle is being dragged.\n\tdragMoveDetLinkHandle(d3Event) {\n\t\tthis.logger.logStartTimer(\"dragMoveDetLinkHandle\");\n\t\tconst transPos = this.ren.getTransformedMousePos(d3Event);\n\t\tthis.moveHandle(transPos);\n\t\tthis.logger.logEndTimer(\"dragMoveDetLinkHandle\", true);\n\t}\n\n\t// Completes the dragging of a link handle.\n\tdragEndDetLinkHandle(d3Event) {\n\t\tthis.logger.logStartTimer(\"dragEndLinkHandle\");\n\n\t\tconst pos = this.ren.getMousePosFromEvent(d3Event);\n\n\t\tthis.completeDraggedDetLink(pos);\n\t\tthis.logger.logEndTimer(\"dragEndLinkHandle\", true);\n\t}\n\n\t// Starts the moving action for link handle.\n\t// Can be called when the mouse is dragging the handle OR when a\n\t// keyboard event moves the handle.\n\tstartHandleMoving(d, currentTarget) {\n\t\tthis.ren.closeContextMenuIfOpen();\n\n\t\tconst handleSelection = d3.select(currentTarget);\n\t\tconst link = this.ren.activePipeline.getLink(d.id);\n\t\tconst oldLink = { ...link };\n\n\t\tconst linkGrpSelector = this.ren.getLinkGroupSelectionById(d.id);\n\n\t\tthis.draggingLinkData = {\n\t\t\tlineInfo: d,\n\t\t\tlink: link,\n\t\t\toldLink: oldLink,\n\t\t\tlinkGrpSelection: d3.select(linkGrpSelector)\n\t\t};\n\n\t\tif (handleSelection.attr(\"class\").includes(\"d3-link-handle-end\")) {\n\t\t\tthis.draggingLinkData.endBeingDragged = \"end\";\n\n\t\t} else if (handleSelection.attr(\"class\").includes(\"d3-link-handle-start\")) {\n\t\t\tthis.draggingLinkData.endBeingDragged = \"start\";\n\t\t}\n\n\t\tif (this.ren.config.enableHighlightUnavailableNodes) {\n\t\t\tif (this.draggingLinkData.endBeingDragged === \"end\") {\n\t\t\t\tconst links = this.ren.activePipeline.links.filter((lnk) => lnk.id !== link.id);\n\t\t\t\tthis.ren.setUnavailableTargetNodesHighlighting(\n\t\t\t\t\tthis.ren.activePipeline.getNode(this.draggingLinkData.link.srcNodeId),\n\t\t\t\t\tthis.draggingLinkData.link.srcNodePortId,\n\t\t\t\t\tlinks\n\t\t\t\t);\n\t\t\t} else if (this.draggingLinkData.endBeingDragged === \"start\") {\n\t\t\t\tconst links = this.ren.activePipeline.links.filter((lnk) => lnk.id !== link.id);\n\t\t\t\tthis.ren.setUnavailableSourceNodesHighlighting(\n\t\t\t\t\tthis.ren.activePipeline.getNode(this.draggingLinkData.oldLink.trgNodeId),\n\t\t\t\t\tthis.draggingLinkData.link.trgNodePortId,\n\t\t\t\t\tlinks\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Moves the currently focused handle of the link in the\n\t// direction specified. This is called when the user moves a\n\t// link handle using the keyboard.\n\tmoveLinkHandle(link, dir, d3Event) {\n\t\tlet xInc = 0;\n\t\tlet yInc = 0;\n\n\t\t({ xInc, yInc } = this.getMoveIncrements(dir));\n\n\t\tif (this.endMove) {\n\t\t\tclearTimeout(this.endMove);\n\t\t\tthis.endMove = null;\n\t\t}\n\n\t\tif (!this.isDragging()) {\n\t\t\tthis.startHandleMoving(link, d3Event.currentTarget);\n\t\t}\n\n\t\tlet x = this.draggingLinkData.endBeingDragged === \"start\" ? this.draggingLinkData.link.x1 : this.draggingLinkData.link.x2;\n\t\tlet y = this.draggingLinkData.endBeingDragged === \"start\" ? this.draggingLinkData.link.y1 : this.draggingLinkData.link.y2;\n\n\t\tx += xInc;\n\t\ty += yInc;\n\n\t\tconst pos = { x, y };\n\n\t\tthis.moveHandle(pos);\n\n\t\t// When the handle is moved, redisplaying the link removes\n\t\t// focus from the handle. So we restore it.\n\t\tthis.ren.restoreFocusToSubObject();\n\n\t\tthis.endMove = setTimeout(() => {\n\t\t\tconst pos2 = this.ren.convertCanvasCoordsToPageCoords(pos.x, pos.y);\n\n\t\t\tthis.completeDraggedDetLink(pos2);\n\t\t}, 500);\n\t}\n\n\tmoveHandle(pos) {\n\t\tconst link = this.draggingLinkData.link;\n\n\t\tif (this.draggingLinkData.endBeingDragged === \"start\") {\n\t\t\tlink.srcPos = { x_pos: pos.x, y_pos: pos.y };\n\t\t\tdelete link.srcNodeId;\n\t\t\tdelete link.srcNodePortId;\n\t\t\tdelete link.srcObj;\n\n\t\t} else {\n\t\t\tlink.trgPos = { x_pos: pos.x, y_pos: pos.y };\n\t\t\tdelete link.trgNodeId;\n\t\t\tdelete link.trgNodePortId;\n\t\t\tdelete link.trgNode;\n\t\t}\n\n\t\tthis.ren.displayMovedLinks();\n\n\t\t// Switch on an attribute to indicate the link is being dragged\n\t\t// towards and over a target node.\n\t\tif (this.ren.config.enableHighlightNodeOnNewLinkDrag) {\n\t\t\tthis.setDetachedLinkOverNode(pos);\n\t\t}\n\t}\n\n\tcompleteDraggedDetLink(pos) {\n\t\tconst newLink = this.getNewLinkOnDrag(pos);\n\n\t\t// Save a local reference to this.draggingLinkData so we can set it to null before\n\t\t// calling the canvas-controller. This means the this.draggingLinkData object will\n\t\t// be null when the canvas is refreshed.\n\t\tconst draggingLinkData = this.draggingLinkData;\n\t\tthis.draggingLinkData = null;\n\n\t\tif (newLink) {\n\t\t\tconst editSubType = this.getLinkEditSubType(draggingLinkData.oldLink, newLink);\n\t\t\t// If editSubType is set the user did a gesture that requires a change\n\t\t\t// to the object model.\n\t\t\tif (editSubType) {\n\t\t\t\tconst success = this.ren.canvasController.editActionHandler({\n\t\t\t\t\teditType: \"updateLink\",\n\t\t\t\t\teditSubType: editSubType,\n\t\t\t\t\teditSource: \"canvas\",\n\t\t\t\t\tnewLink: newLink,\n\t\t\t\t\tpipelineId: this.ren.activePipeline.id });\n\n\t\t\t\t// The call to editActionHandler might \"fail\" if the host app\n\t\t\t\t// uses beforeEditActionHandler to cancel the edit action. In\n\t\t\t\t// this case, we snap the link back to its old position.\n\t\t\t\tif (!success) {\n\t\t\t\t\tthis.snapBackOldLink(draggingLinkData.oldLink);\n\t\t\t\t}\n\t\t\t// If editSubType is null, the user performed a gesture which should\n\t\t\t// not be executed as an action so draw the link back in its old position.\n\t\t\t} else {\n\t\t\t\tthis.snapBackOldLink(draggingLinkData.oldLink);\n\t\t\t}\n\t\t// newLink might be null when we are dragging a link handle with\n\t\t// enableLinkSelection not set to detachable. If that's the case the\n\t\t// link needs to snap back (redrawn) to its original position.\n\t\t} else {\n\t\t\tthis.snapBackOldLink(draggingLinkData.oldLink);\n\t\t}\n\n\t\t// Switch 'new link over node' highlighting off\n\t\tif (this.ren.config.enableHighlightNodeOnNewLinkDrag) {\n\t\t\tthis.ren.setLinkOverNodeCancel();\n\t\t}\n\n\t\tthis.ren.unsetUnavailableNodesHighlighting();\n\t}\n\n\t// Returns the edit sub-type for the link action being performed to further\n\t// explain the updateLink action.\n\tgetLinkEditSubType(oldLink, newLink) {\n\t\tif (oldLink.srcNodeId && !newLink.srcNodeId) {\n\t\t\treturn \"detachFromSrcNode\";\n\n\t\t} else if (oldLink.trgNodeId && !newLink.trgNodeId) {\n\t\t\treturn \"detachFromTrgNode\";\n\n\t\t} else if (!oldLink.srcNodeId && newLink.srcNodeId) {\n\t\t\treturn \"attachToSrcNode\";\n\n\t\t} else if (!oldLink.trgNodeId && newLink.trgNodeId) {\n\t\t\treturn \"attachToTrgNode\";\n\n\t\t} else if (!oldLink.srcNodeId && !newLink.srcNodeId &&\n\t\t\t\t\t(oldLink.srcPos.x_pos !== newLink.srcPos.x_pos ||\n\t\t\t\t\t\toldLink.srcPos.y_pos !== newLink.srcPos.y_pos)) {\n\t\t\treturn \"moveSrcPosition\";\n\n\t\t} else if (!oldLink.trgNodeId && !newLink.trgNodeId &&\n\t\t\t\t\t(oldLink.trgPos.x_pos !== newLink.trgPos.x_pos ||\n\t\t\t\t\t\toldLink.trgPos.y_pos !== newLink.trgPos.y_pos)) {\n\t\t\treturn \"moveTrgPosition\";\n\n\t\t} else if (oldLink.srcNodeId && newLink.srcNodeId &&\n\t\t\t\t\toldLink.srcNodeId !== newLink.srcNodeId) {\n\t\t\treturn \"switchSrcNode\";\n\n\t\t} else if (oldLink.trgNodeId && newLink.trgNodeId &&\n\t\t\t\t\t\t\toldLink.trgNodeId !== newLink.trgNodeId) {\n\t\t\treturn \"switchTrgNode\";\n\n\t\t} else if (oldLink.srcNodeId && newLink.srcNodeId &&\n\t\t\t\t\toldLink.srcNodeId === newLink.srcNodeId &&\n\t\t\t\t\toldLink.srcNodePortId !== newLink.srcNodePortId) {\n\t\t\treturn \"switchSrcNodePort\";\n\n\t\t} else if (oldLink.trgNodeId && newLink.trgNodeId &&\n\t\t\t\t\toldLink.trgNodeId === newLink.trgNodeId &&\n\t\t\t\t\toldLink.trgNodePortId !== newLink.trgNodePortId) {\n\t\t\treturn \"switchTrgNodePort\";\n\t\t}\n\t\t// We arrive here, in two ways:\n\t\t// 1. if the user dragged a link handle from a node/port and dropped it\n\t\t// back on the same node/port.\n\t\t// 2. If the user clicked on the unattached end of a detached link but did\n\t\t// not move it anywhere\n\t\t// In these cases, the updateLink action should NOT be performed and\n\t\t// consequently NO command should be added to the command stack.\n\t\treturn null;\n\t}\n\n\t// Resets and redraws the link being dragged back to its original position.\n\t// This is necessary when the user performs a link drag gesture which should\n\t// NOT be executed as an action -- therefore the link need to be drawn back\n\t// in its original position.\n\tsnapBackOldLink(oldLink) {\n\t\tthis.ren.activePipeline.replaceLink(oldLink);\n\t\tthis.ren.displayLinks();\n\t}\n\n\t// Switches on or off node port highlighting depending on the node\n\t// passed in and keeps track of the currently highlighted node. This is\n\t// called as a new link is being drawn towards a target node to highlight\n\t// the target node.\n\tsetDetachedLinkOverNode(pos) {\n\t\tconst nodeNearMouse = this.ren.getNodeNearPos(pos, this.ren.canvasLayout.nodeProximity);\n\t\tconst highlight = nodeNearMouse && this.isDetLinkConnectionAllowedToNearbyNode(pos);\n\t\tthis.ren.setHighlightingOverNode(highlight, nodeNearMouse);\n\t}\n\n\t// Returns true if a detached link being dragged can be attached to a node.\n\tisDetLinkConnectionAllowedToNearbyNode(pos) {\n\t\tif (this.draggingLinkData) {\n\t\t\tconst newLink = this.getNewLinkOnDrag(pos, this.ren.canvasLayout.nodeProximity);\n\t\t\tif (newLink) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Returns a new link if one can be created given the current data in the\n\t// this.draggingLinkData object. Returns null if a link cannot be created.\n\t// The position (pos) passed in should be specified in page coordinates.\n\tgetNewLinkOnDrag(pos, nodeProximity) {\n\t\tconst oldLink = this.draggingLinkData.oldLink;\n\t\tconst newLink = { ...oldLink };\n\n\t\tif (this.draggingLinkData.endBeingDragged === \"start\") {\n\t\t\tdelete newLink.srcObj;\n\t\t\tdelete newLink.srcNodeId;\n\t\t\tdelete newLink.srcNodePortId;\n\t\t\tdelete newLink.srcPos;\n\n\t\t\tconst srcNode = nodeProximity\n\t\t\t\t? this.ren.getNodeNearPos(pos, nodeProximity)\n\t\t\t\t: this.ren.getNodeAtPos(pos);\n\n\t\t\tif (srcNode) {\n\t\t\t\tnewLink.srcNodeId = srcNode.id;\n\t\t\t\tnewLink.srcObj = this.ren.activePipeline.getNode(srcNode.id);\n\t\t\t\tnewLink.srcNodePortId = this.ren.getOutputNodePortId(pos, srcNode);\n\t\t\t}\telse {\n\t\t\t\tnewLink.srcPos = this.draggingLinkData.link.srcPos;\n\t\t\t}\n\n\t\t} else {\n\t\t\tdelete newLink.trgNode;\n\t\t\tdelete newLink.trgNodeId;\n\t\t\tdelete newLink.trgNodePortId;\n\t\t\tdelete newLink.trgPos;\n\n\t\t\tconst trgNode = nodeProximity\n\t\t\t\t? this.ren.getNodeNearPos(pos, nodeProximity)\n\t\t\t\t: this.ren.getNodeAtPos(pos);\n\n\t\t\tif (trgNode) {\n\t\t\t\tnewLink.trgNodeId = trgNode.id;\n\t\t\t\tnewLink.trgNode = this.ren.activePipeline.getNode(trgNode.id);\n\t\t\t\tnewLink.trgNodePortId = this.ren.getInputNodePortId(pos, trgNode);\n\t\t\t}\telse {\n\t\t\t\tnewLink.trgPos = this.draggingLinkData.link.trgPos;\n\t\t\t}\n\t\t}\n\n\t\t// If links are not detachable, we cannot create a link if srcPos\n\t\t// or trgPos are set because that would create a detached link unconnected\n\t\t// to either a source node or a target node or both.\n\t\tif (this.ren.config.enableLinkSelection !== LINK_SELECTION_DETACHABLE &&\n\t\t\t\t(newLink.srcPos || newLink.trgPos)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (this.canUpdateLink(newLink, oldLink)) {\n\t\t\treturn newLink;\n\t\t}\n\t\treturn null;\n\t}\n\n\tgetMoveIncrements(dir) {\n\t\tlet xInc = 0;\n\t\tlet yInc = 0;\n\n\t\tswitch (dir) {\n\t\tcase NORTH:\n\t\t\txInc = 0;\n\t\t\tyInc = -10;\n\t\t\tbreak;\n\t\tcase SOUTH:\n\t\t\txInc = 0;\n\t\t\tyInc = 10;\n\t\t\tbreak;\n\t\tcase EAST:\n\t\t\txInc = 10;\n\t\t\tyInc = 0;\n\t\t\tbreak;\n\t\tdefault:\n\t\tcase WEST:\n\t\t\txInc = -10;\n\t\t\tyInc = 0;\n\t\t\tbreak;\n\t\t}\n\t\treturn { xInc, yInc };\n\t}\n\n\t// Returns true if the old link passed in can be updated with the attributes\n\t// of the new link.\n\tcanUpdateLink(newLink, oldLink) {\n\t\tconst srcNode = this.ren.activePipeline.getNode(newLink.srcNodeId);\n\t\tconst trgNode = this.ren.activePipeline.getNode(newLink.trgNodeId);\n\t\tconst linkSrcChanged = this.hasLinkSrcChanged(newLink, oldLink);\n\t\tconst linkTrgChanged = this.hasLinkTrgChanged(newLink, oldLink);\n\t\tconst links = this.ren.activePipeline.links;\n\t\tlet allowed = true;\n\n\t\tif (linkSrcChanged && srcNode &&\n\t\t\t\t!CanvasUtils.isSrcConnectionAllowedWithDetachedLinks(newLink.srcNodePortId, srcNode, links)) {\n\t\t\tallowed = false;\n\t\t}\n\t\tif (linkTrgChanged && trgNode &&\n\t\t\t\t!CanvasUtils.isTrgConnectionAllowedWithDetachedLinks(newLink.trgNodePortId, trgNode, links)) {\n\t\t\tallowed = false;\n\t\t}\n\t\tif (srcNode && trgNode &&\n\t\t\t\t!CanvasUtils.isConnectionAllowedWithDetachedLinks(newLink.srcNodePortId, newLink.trgNodePortId,\n\t\t\t\t\tsrcNode, trgNode, links, this.ren.config.enableSelfRefLinks)) {\n\t\t\tallowed = false;\n\t\t}\n\t\treturn allowed;\n\t}\n\n\t// Returns true if the source information has changed between\n\t// the two links.\n\thasLinkSrcChanged(newLink, oldLink) {\n\t\tlet linkUpdated = false;\n\n\t\tif (newLink.srcNodeId) {\n\t\t\tif (newLink.srcNodeId !== oldLink.srcNodeId) {\n\t\t\t\tlinkUpdated = true;\n\t\t\t}\n\n\t\t\tif (newLink.srcNodePortId !== oldLink.srcNodePortId) {\n\t\t\t\tlinkUpdated = true;\n\t\t\t}\n\n\t\t}\telse {\n\t\t\tif (oldLink.srcPos) {\n\t\t\t\tif (newLink.srcPos.x_pos !== oldLink.srcPos.x_pos ||\n\t\t\t\t\t\tnewLink.srcPos.y_pos !== oldLink.srcPos.y_pos) {\n\t\t\t\t\tlinkUpdated = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlinkUpdated = true;\n\t\t\t}\n\t\t}\n\t\treturn linkUpdated;\n\t}\n\n\t// Returns true if the target information has changed between\n\t// the two links.\n\thasLinkTrgChanged(newLink, oldLink) {\n\t\tlet linkUpdated = false;\n\n\t\tif (newLink.trgNodeId) {\n\t\t\tif (newLink.trgNodeId !== oldLink.trgNodeId) {\n\t\t\t\tlinkUpdated = true;\n\t\t\t}\n\n\t\t\tif (newLink.trgNodePortId !== oldLink.trgNodePortId) {\n\t\t\t\tlinkUpdated = true;\n\t\t\t}\n\n\t\t}\telse {\n\t\t\tif (oldLink.trgPos) {\n\t\t\t\tif (newLink.trgPos.x_pos !== oldLink.trgPos.x_pos ||\n\t\t\t\t\t\tnewLink.trgPos.y_pos !== oldLink.trgPos.y_pos) {\n\t\t\t\t\tlinkUpdated = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlinkUpdated = true;\n\t\t\t}\n\t\t}\n\t\treturn linkUpdated;\n\t}\n\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export default x => () => x;\n","import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n","import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n","import decompose, {identity} from \"./decompose.js\";\n\nvar svgNode;\n\n/* eslint-disable no-undef */\nexport function parseCss(value) {\n const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n","import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n","var epsilon2 = 1e-12;\n\nfunction cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\n\nexport default (function zoomRho(rho, rho2, rho4) {\n\n // p0 = [ux0, uy0, w0]\n // p1 = [ux1, uy1, w1]\n function zoom(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n dx = ux1 - ux0,\n dy = uy1 - uy0,\n d2 = dx * dx + dy * dy,\n i,\n S;\n\n // Special case for u0 ≅ u1.\n if (d2 < epsilon2) {\n S = Math.log(w1 / w0) / rho;\n i = function(t) {\n return [\n ux0 + t * dx,\n uy0 + t * dy,\n w0 * Math.exp(rho * t * S)\n ];\n }\n }\n\n // General case.\n else {\n var d1 = Math.sqrt(d2),\n b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / rho;\n i = function(t) {\n var s = t * S,\n coshr0 = cosh(r0),\n u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n return [\n ux0 + u * dx,\n uy0 + u * dy,\n w0 * coshr0 / cosh(rho * s + r0)\n ];\n }\n }\n\n i.duration = S * 1000 * rho / Math.SQRT2;\n\n return i;\n }\n\n zoom.rho = function(_) {\n var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;\n return zoomRho(_1, _2, _4);\n };\n\n return zoom;\n})(Math.SQRT2, 2, 4);\n","var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n","import {Timer} from \"./timer.js\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(elapsed => {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTED) throw new Error(\"too late; already running\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions.\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(node, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n","import {STARTING, ENDING, ENDED} from \"./transition/schedule.js\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n","import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n","import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttribute(name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttributeNS(fullname.space, fullname.local);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttribute(name);\n string0 = this.getAttribute(name);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n string0 = this.getAttributeNS(fullname.space, fullname.local);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));\n}\n","import {namespace} from \"d3-selection\";\n\nfunction attrInterpolate(name, i) {\n return function(t) {\n this.setAttribute(name, i.call(this, t));\n };\n}\n\nfunction attrInterpolateNS(fullname, i) {\n return function(t) {\n this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n };\n}\n\nfunction attrTweenNS(fullname, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n","import {get, init} from \"./schedule.js\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n","import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n","import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {set} from \"./schedule.js\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction styleNull(name, interpolate) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n string1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, string10 = string1);\n };\n}\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = style(this, name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n value1 = value(this),\n string1 = value1 + \"\";\n if (value1 == null) string1 = value1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction styleMaybeRemove(id, name) {\n var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\n return function() {\n var schedule = set(this, id),\n on = schedule.on,\n listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleNull(name, i))\n .on(\"end.style.\" + name, styleRemove(name))\n : typeof value === \"function\" ? this\n .styleTween(name, styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\n .each(styleMaybeRemove(this._id, name))\n : this\n .styleTween(name, styleConstant(name, i, value), priority)\n .on(\"end.style.\" + name, null);\n}\n","import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr.js\";\nimport transition_attrTween from \"./attrTween.js\";\nimport transition_delay from \"./delay.js\";\nimport transition_duration from \"./duration.js\";\nimport transition_ease from \"./ease.js\";\nimport transition_easeVarying from \"./easeVarying.js\";\nimport transition_filter from \"./filter.js\";\nimport transition_merge from \"./merge.js\";\nimport transition_on from \"./on.js\";\nimport transition_remove from \"./remove.js\";\nimport transition_select from \"./select.js\";\nimport transition_selectAll from \"./selectAll.js\";\nimport transition_selection from \"./selection.js\";\nimport transition_style from \"./style.js\";\nimport transition_styleTween from \"./styleTween.js\";\nimport transition_text from \"./text.js\";\nimport transition_textTween from \"./textTween.js\";\nimport transition_transition from \"./transition.js\";\nimport transition_tween from \"./tween.js\";\nimport transition_end from \"./end.js\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n selectChild: selection_prototype.selectChild,\n selectChildren: selection_prototype.selectChildren,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n textTween: transition_textTween,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease,\n easeVarying: transition_easeVarying,\n end: transition_end,\n [Symbol.iterator]: selection_prototype[Symbol.iterator]\n};\n","import {selector} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n","import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n","import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n","import {Transition} from \"./index.js\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n","import {Transition, newId} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n","import {get, set, init} from \"./schedule.js\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n","function styleInterpolate(name, i, priority) {\n return function(t) {\n this.style.setProperty(name, i.call(this, t), priority);\n };\n}\n\nfunction styleTween(name, value, priority) {\n var t, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n return t;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n","import {tweenValue} from \"./tween.js\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n","function textInterpolate(i) {\n return function(t) {\n this.textContent = i.call(this, t);\n };\n}\n\nfunction textTween(value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(value) {\n var key = \"text\";\n if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, textTween(value));\n}\n","function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n","import {set} from \"./schedule.js\";\n\nfunction easeVarying(id, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (typeof v !== \"function\") throw new Error;\n set(this, id).ease = v;\n };\n}\n\nexport default function(value) {\n if (typeof value !== \"function\") throw new Error;\n return this.each(easeVarying(this._id, value));\n}\n","import {set} from \"./schedule.js\";\n\nexport default function() {\n var on0, on1, that = this, id = that._id, size = that.size();\n return new Promise(function(resolve, reject) {\n var cancel = {value: reject},\n end = {value: function() { if (--size === 0) resolve(); }};\n\n that.each(function() {\n var schedule = set(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) {\n on1 = (on0 = on).copy();\n on1._.cancel.push(cancel);\n on1._.interrupt.push(cancel);\n on1._.end.push(end);\n }\n\n schedule.on = on1;\n });\n\n // The selection was empty, resolve end immediately\n if (size === 0) resolve();\n });\n}\n","import {Transition, newId} from \"../transition/index.js\";\nimport schedule from \"../transition/schedule.js\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n throw new Error(`transition ${id} not found`);\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n","import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt.js\";\nimport selection_transition from \"./transition.js\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n","import interrupt from \"../interrupt.js\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n","export default x => () => x;\n","export default function ZoomEvent(type, {\n sourceEvent,\n target,\n transform,\n dispatch\n}) {\n Object.defineProperties(this, {\n type: {value: type, enumerable: true, configurable: true},\n sourceEvent: {value: sourceEvent, enumerable: true, configurable: true},\n target: {value: target, enumerable: true, configurable: true},\n transform: {value: transform, enumerable: true, configurable: true},\n _: {value: dispatch}\n });\n}\n","export function Transform(k, x, y) {\n this.k = k;\n this.x = x;\n this.y = y;\n}\n\nTransform.prototype = {\n constructor: Transform,\n scale: function(k) {\n return k === 1 ? this : new Transform(this.k * k, this.x, this.y);\n },\n translate: function(x, y) {\n return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);\n },\n apply: function(point) {\n return [point[0] * this.k + this.x, point[1] * this.k + this.y];\n },\n applyX: function(x) {\n return x * this.k + this.x;\n },\n applyY: function(y) {\n return y * this.k + this.y;\n },\n invert: function(location) {\n return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\n },\n invertX: function(x) {\n return (x - this.x) / this.k;\n },\n invertY: function(y) {\n return (y - this.y) / this.k;\n },\n rescaleX: function(x) {\n return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\n },\n rescaleY: function(y) {\n return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\n },\n toString: function() {\n return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\n }\n};\n\nexport var identity = new Transform(1, 0, 0);\n\ntransform.prototype = Transform.prototype;\n\nexport default function transform(node) {\n while (!node.__zoom) if (!(node = node.parentNode)) return identity;\n return node.__zoom;\n}\n","export function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolateZoom} from \"d3-interpolate\";\nimport {select, pointer} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport ZoomEvent from \"./event.js\";\nimport {Transform, identity} from \"./transform.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\n// Ignore right-click, since that should open the context menu.\n// except for pinch-to-zoom, which is sent as a wheel+ctrlKey event\nfunction defaultFilter(event) {\n return (!event.ctrlKey || event.type === 'wheel') && !event.button;\n}\n\nfunction defaultExtent() {\n var e = this;\n if (e instanceof SVGElement) {\n e = e.ownerSVGElement || e;\n if (e.hasAttribute(\"viewBox\")) {\n e = e.viewBox.baseVal;\n return [[e.x, e.y], [e.x + e.width, e.y + e.height]];\n }\n return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];\n }\n return [[0, 0], [e.clientWidth, e.clientHeight]];\n}\n\nfunction defaultTransform() {\n return this.__zoom || identity;\n}\n\nfunction defaultWheelDelta(event) {\n return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1);\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\nfunction defaultConstrain(transform, extent, translateExtent) {\n var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],\n dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],\n dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],\n dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];\n return transform.translate(\n dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),\n dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)\n );\n}\n\nexport default function() {\n var filter = defaultFilter,\n extent = defaultExtent,\n constrain = defaultConstrain,\n wheelDelta = defaultWheelDelta,\n touchable = defaultTouchable,\n scaleExtent = [0, Infinity],\n translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],\n duration = 250,\n interpolate = interpolateZoom,\n listeners = dispatch(\"start\", \"zoom\", \"end\"),\n touchstarting,\n touchfirst,\n touchending,\n touchDelay = 500,\n wheelDelay = 150,\n clickDistance2 = 0,\n tapDistance = 10,\n // Elyra Extension - the trackpad variable is used to determine if\n // trackpad behavior is required. That is, when the user does two finger\n // scroll it pans the canvas up, down, left and right,\n trackpad = false,\n // Elyra Extension - the preventBackGesture variable is used to determine\n // if the default behavior in browsers, which is that a two finger swipe\n // right is a 'back page' gesture, is to be prevented or not.\n preventBackGesture = false;\n\n function zoom(selection) {\n selection\n .property(\"__zoom\", defaultTransform)\n .on(\"wheel.zoom\", wheeled, {passive: false})\n .on(\"mousedown.zoom\", mousedowned)\n .on(\"dblclick.zoom\", dblclicked)\n // Elyra Extension - These three gesture* event handlers are added for\n // Safari support. By default, Safari interprets the finger spread\n // gesture as zooming the entire page. These handlers allow the behavior\n // to be overriden.\n .on(\"gesturestart\", gesturestart)\n .on(\"gesturechange\", gesturechange)\n .on(\"gestureend\", gestureend)\n .filter(touchable)\n .on(\"touchstart.zoom\", touchstarted)\n .on(\"touchmove.zoom\", touchmoved)\n .on(\"touchend.zoom touchcancel.zoom\", touchended)\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n zoom.transform = function(collection, transform, point, event) {\n var selection = collection.selection ? collection.selection() : collection;\n selection.property(\"__zoom\", defaultTransform);\n if (collection !== selection) {\n schedule(collection, transform, point, event);\n } else {\n selection.interrupt().each(function() {\n gesture(this, arguments)\n .event(event)\n .start()\n .zoom(null, typeof transform === \"function\" ? transform.apply(this, arguments) : transform)\n .end();\n });\n }\n };\n\n zoom.scaleBy = function(selection, k, p, event) {\n zoom.scaleTo(selection, function() {\n var k0 = this.__zoom.k,\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return k0 * k1;\n }, p, event);\n };\n\n zoom.scaleTo = function(selection, k, p, event) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t0 = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p,\n p1 = t0.invert(p0),\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);\n }, p, event);\n };\n\n zoom.translateBy = function(selection, x, y, event) {\n zoom.transform(selection, function() {\n return constrain(this.__zoom.translate(\n typeof x === \"function\" ? x.apply(this, arguments) : x,\n typeof y === \"function\" ? y.apply(this, arguments) : y\n ), extent.apply(this, arguments), translateExtent);\n }, null, event);\n };\n\n zoom.translateTo = function(selection, x, y, p, event) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p;\n return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate(\n typeof x === \"function\" ? -x.apply(this, arguments) : -x,\n typeof y === \"function\" ? -y.apply(this, arguments) : -y\n ), e, translateExtent);\n }, p, event);\n };\n\n function scale(transform, k) {\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));\n return k === transform.k ? transform : new Transform(k, transform.x, transform.y);\n }\n\n function translate(transform, p0, p1) {\n var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;\n return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);\n }\n\n function centroid(extent) {\n return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];\n }\n\n function schedule(transition, transform, point, event) {\n transition\n .on(\"start.zoom\", function() { gesture(this, arguments).event(event).start(); })\n .on(\"interrupt.zoom end.zoom\", function() { gesture(this, arguments).event(event).end(); })\n .tween(\"zoom\", function() {\n var that = this,\n args = arguments,\n g = gesture(that, args).event(event),\n e = extent.apply(that, args),\n p = point == null ? centroid(e) : typeof point === \"function\" ? point.apply(that, args) : point,\n w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),\n a = that.__zoom,\n b = typeof transform === \"function\" ? transform.apply(that, args) : transform,\n i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));\n return function(t) {\n if (t === 1) t = b; // Avoid rounding error on end.\n else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }\n g.zoom(null, t);\n };\n });\n }\n\n function gesture(that, args, clean) {\n return (!clean && that.__zooming) || new Gesture(that, args);\n }\n\n function Gesture(that, args) {\n this.that = that;\n this.args = args;\n this.active = 0;\n this.sourceEvent = null;\n this.extent = extent.apply(that, args);\n this.taps = 0;\n }\n\n Gesture.prototype = {\n event: function(event) {\n if (event) this.sourceEvent = event;\n return this;\n },\n start: function() {\n if (++this.active === 1) {\n this.that.__zooming = this;\n this.emit(\"start\");\n }\n return this;\n },\n zoom: function(key, transform) {\n if (this.mouse && key !== \"mouse\") this.mouse[1] = transform.invert(this.mouse[0]);\n if (this.touch0 && key !== \"touch\") this.touch0[1] = transform.invert(this.touch0[0]);\n if (this.touch1 && key !== \"touch\") this.touch1[1] = transform.invert(this.touch1[0]);\n this.that.__zoom = transform;\n this.emit(\"zoom\");\n return this;\n },\n end: function() {\n if (--this.active === 0) {\n delete this.that.__zooming;\n this.emit(\"end\");\n }\n return this;\n },\n emit: function(type) {\n var d = select(this.that).datum();\n listeners.call(\n type,\n this.that,\n new ZoomEvent(type, {\n sourceEvent: this.sourceEvent,\n target: zoom,\n type,\n transform: this.that.__zoom,\n dispatch: listeners\n }),\n d\n );\n }\n };\n\n function wheeled(event, ...args) {\n // Elyra Extension - Doing the noevent calls here prevents the swipe right\n // gesture causing a Back page action in the browser.\n if (preventBackGesture) {\n noevent(event);\n }\n\n if (!filter.apply(this, arguments)) return;\n var g = gesture(this, args).event(event),\n t = this.__zoom,\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),\n p = pointer(event);\n\n // If the mouse is in the same location as before, reuse it.\n // If there were recent wheel events, reset the wheel idle timeout.\n if (g.wheel) {\n if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {\n g.mouse[1] = t.invert(g.mouse[0] = p);\n }\n clearTimeout(g.wheel);\n }\n\n // If this wheel event won’t trigger a transform change, ignore it.\n else if (t.k === k) return;\n\n // Otherwise, capture the mouse point and location at the start.\n else {\n // Elyra Extension - Calculate wheel translation start amounts. See\n // comments below for more details.\n if (trackpad && !event.ctrlKey && !event.safariPinchZoom) {\n g.wheelTransX = -t.x;\n g.wheelTransY = -t.y;\n }\n g.mouse = [p, t.invert(p)];\n interrupt(this);\n g.start();\n }\n\n noevent(event);\n g.wheel = setTimeout(wheelidled, wheelDelay);\n\n // Elyra Extension - On Chrome and Firefox, the wheel event will be called\n // for the pinch/spread gesture with ctrlKey set to true (even when the\n // ctrl key is not pressed). See this stack overflow issue for details:\n // https://stackoverflow.com/questions/52130484/how-to-catch-pinch-and-stretch-gesture-events-in-d3-zoom-d3v4-v5\n // On Chrome, Firefox and Safari, the wheel event will be called\n // for two finger scroll. This code interprets the two finger scroll gesture\n // as a pan movement (horizontal and/or vertical).\n if (trackpad && !event.ctrlKey && !event.safariPinchZoom) {\n g.wheelTransX += event.deltaX;\n g.wheelTransY += event.deltaY;\n var p0 = [t.x, t.y], p1 = [t.x + g.wheelTransX, t.y + g.wheelTransY];\n g.zoom(\"mouse\", constrain(translate(t, p0, p1), g.extent, translateExtent));\n\n } else {\n g.zoom(\"mouse\", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));\n }\n\n function wheelidled() {\n g.wheel = null;\n g.end();\n }\n }\n\n // Elyra Extension - On Safari, gesturestart, gesturechange, and gestureend\n // will be called for the pinch/spread gesture. This code not only implements\n // zoom on pinch/spread but also stops the whole browser page being\n // zoomed which is the default behavior for that gesture on Safari.\n // https://stackoverflow.com/questions/36458954/prevent-pinch-zoom-in-safari-for-osx\n function gesturestart(event) {\n noevent(event);\n this.scale = event.scale;\n }\n\n function gesturechange(event) {\n noevent(event);\n\n if (this.__zoom) {\n event.deltaY = (this.scale - event.scale) * 100;\n this.scale = event.scale;\n }\n\n event.safariPinchZoom = true;\n wheeled.apply(this, [event, ...arguments]);\n }\n\n function gestureend(event) {\n noevent(event);\n }\n\n // Elyra Extension - End of added gesture functions for Safari.\n\n function mousedowned(event, ...args) {\n if (touchending || !filter.apply(this, arguments)) return;\n var currentTarget = event.currentTarget,\n g = gesture(this, args, true).event(event),\n v = select(event.view).on(\"mousemove.zoom\", mousemoved, true).on(\"mouseup.zoom\", mouseupped, true),\n p = pointer(event, currentTarget),\n x0 = event.clientX,\n y0 = event.clientY;\n\n dragDisable(event.view);\n nopropagation(event);\n g.mouse = [p, this.__zoom.invert(p)];\n interrupt(this);\n g.start();\n\n function mousemoved(event) {\n noevent(event);\n if (!g.moved) {\n var dx = event.clientX - x0, dy = event.clientY - y0;\n g.moved = dx * dx + dy * dy > clickDistance2;\n }\n g.event(event)\n .zoom(\"mouse\", constrain(translate(g.that.__zoom, g.mouse[0] = pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent));\n }\n\n function mouseupped(event) {\n v.on(\"mousemove.zoom mouseup.zoom\", null);\n dragEnable(event.view, g.moved);\n noevent(event);\n g.event(event).end();\n }\n }\n\n function dblclicked(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var t0 = this.__zoom,\n p0 = pointer(event.changedTouches ? event.changedTouches[0] : event, this),\n p1 = t0.invert(p0),\n k1 = t0.k * (event.shiftKey ? 0.5 : 2),\n t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent);\n\n noevent(event);\n if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0, event);\n else select(this).call(zoom.transform, t1, p0, event);\n }\n\n function touchstarted(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var touches = event.touches,\n n = touches.length,\n g = gesture(this, args, event.changedTouches.length === n).event(event),\n started, i, t, p;\n\n nopropagation(event);\n for (i = 0; i < n; ++i) {\n t = touches[i], p = pointer(t, this);\n p = [p, this.__zoom.invert(p), t.identifier];\n if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;\n else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0;\n }\n\n if (touchstarting) touchstarting = clearTimeout(touchstarting);\n\n if (started) {\n if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);\n interrupt(this);\n g.start();\n }\n }\n\n function touchmoved(event, ...args) {\n if (!this.__zooming) return;\n var g = gesture(this, args).event(event),\n touches = event.changedTouches,\n n = touches.length, i, t, p, l;\n\n noevent(event);\n for (i = 0; i < n; ++i) {\n t = touches[i], p = pointer(t, this);\n if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;\n else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;\n }\n t = g.that.__zoom;\n if (g.touch1) {\n var p0 = g.touch0[0], l0 = g.touch0[1],\n p1 = g.touch1[0], l1 = g.touch1[1],\n dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,\n dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;\n t = scale(t, Math.sqrt(dp / dl));\n p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];\n l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];\n }\n else if (g.touch0) p = g.touch0[0], l = g.touch0[1];\n else return;\n\n g.zoom(\"touch\", constrain(translate(t, p, l), g.extent, translateExtent));\n }\n\n function touchended(event, ...args) {\n if (!this.__zooming) return;\n var g = gesture(this, args).event(event),\n touches = event.changedTouches,\n n = touches.length, i, t;\n\n nopropagation(event);\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, touchDelay);\n for (i = 0; i < n; ++i) {\n t = touches[i];\n if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;\n else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;\n }\n if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;\n if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);\n else {\n g.end();\n // If this was a dbltap, reroute to the (optional) dblclick.zoom handler.\n if (g.taps === 2) {\n t = pointer(t, this);\n if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) {\n var p = select(this).on(\"dblclick.zoom\");\n if (p) p.apply(this, arguments);\n }\n }\n }\n }\n\n zoom.wheelDelta = function(_) {\n return arguments.length ? (wheelDelta = typeof _ === \"function\" ? _ : constant(+_), zoom) : wheelDelta;\n };\n\n zoom.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), zoom) : filter;\n };\n\n zoom.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), zoom) : touchable;\n };\n\n zoom.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;\n };\n\n zoom.scaleExtent = function(_) {\n return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];\n };\n\n zoom.translateExtent = function(_) {\n return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];\n };\n\n zoom.constrain = function(_) {\n return arguments.length ? (constrain = _, zoom) : constrain;\n };\n\n // Elyra Extension - Function added for trackpad support\n zoom.trackpad = function(_) {\n return arguments.length ? (trackpad = _, zoom) : trackpad;\n };\n\n // Elyra Extension - Function added for 'prevent page back' support\n zoom.preventBackGesture = function(_) {\n return arguments.length ? (preventBackGesture = _, zoom) : preventBackGesture;\n };\n\n zoom.duration = function(_) {\n return arguments.length ? (duration = +_, zoom) : duration;\n };\n\n zoom.interpolate = function(_) {\n return arguments.length ? (interpolate = _, zoom) : interpolate;\n };\n\n zoom.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? zoom : value;\n };\n\n zoom.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);\n };\n\n zoom.tapDistance = function(_) {\n return arguments.length ? (tapDistance = +_, zoom) : tapDistance;\n };\n\n return zoom;\n}\n","/*\n * Copyright 2017-2023 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint no-lonely-if: \"off\" */\n\nimport * as d3Selection from \"d3-selection\";\nimport * as d3Zoom from \"./d3-zoom-extension/src\";\nconst d3 = Object.assign({}, d3Selection, d3Zoom);\n\nimport Logger from \"../logging/canvas-logger.js\";\nimport CanvasUtils from \"./common-canvas-utils.js\";\nimport { INTERACTION_CARBON, INTERACTION_MOUSE, INTERACTION_TRACKPAD,\n\tLINK_SELECTION_NONE\n} from \"./constants/canvas-constants.js\";\n\n// This utility file provides a d3-zoom handler which manages zoom operations\n// on the canvas as well as various utility functions to handle zoom behavior.\n\nexport default class SVGCanvasUtilsZoom {\n\n\tconstructor(renderer) {\n\t\tthis.ren = renderer;\n\n\t\tthis.logger = new Logger(\"SVGCanvasUtilsZoom\");\n\n\t\t// Dimensions for extent of canvas scaling\n\t\tthis.minScaleExtent = 0.2;\n\t\tthis.maxScaleExtent = 1.8;\n\n\t\t// Keep track of when the context menu has been closed, so we don't remove\n\t\t// selections when a context menu is closed during a zoom gesture.\n\t\tthis.contextMenuClosedOnZoom = false;\n\n\t\t// Keep track of when text editing has been closed, so we don't remove\n\t\t// selections when that happens during a zoom gesture.\n\t\tthis.textEditingClosedOnZoom = false;\n\n\t\t// Used to monitor the region selection rectangle.\n\t\tthis.regionSelect = false;\n\n\t\t// Used to track the start of the zoom.\n\t\tthis.zoomStartPoint = { x: 0, y: 0, k: 0, startX: 0, startY: 0 };\n\n\t\t// Stores the previous events from D3 so we can calculate zoom increment amounts.\n\t\tthis.previousD3Event = {};\n\n\t\t// Stores the dimensions of the canvas to save recalculating the size on\n\t\t// each zoom increment.\n\t\tthis.zoomCanvasDimensions = {};\n\n\t\t// I was not able to figure out how to use the zoom filter method to\n\t\t// allow mousedown and mousemove messages to go through to the canvas to\n\t\t// do region selection. Therefore I had to implement region selection in\n\t\t// the zoom methods. This has the side effect that, when a region is\n\t\t// selected, d3Event.transform.x and d3Event.transform.y are incremented\n\t\t// even though the objects in the canvas have not moved. The values below\n\t\t// are used to store the current transform x and y amounts at the beginning\n\t\t// of the region selection and then restore those amounts at the end of\n\t\t// the region selection.\n\t\tthis.regionStartTransformX = 0;\n\t\tthis.regionStartTransformY = 0;\n\n\t\t// Stores the current zoom transform amounts.\n\t\tthis.zoomTransform = d3.zoomIdentity.translate(0, 0).scale(1);\n\n\t\t// Flag to indicate when a zoom handled by zoomHandler is happening.\n\t\tthis.zooming = false;\n\n\t\t// Flag to indicate when a zoom is invoked programmatically.\n\t\tthis.zoomingAction = false;\n\n\t\t// Flag to indicate when the space key is down (used when dragging).\n\t\tthis.spaceKeyPressed = false;\n\n\t\t// Create a zoom handler for use with the canvas.\n\t\tthis.zoomHandler =\n\t\t\td3.zoom()\n\t\t\t\t.trackpad(this.ren.config.enableInteractionType === INTERACTION_TRACKPAD)\n\t\t\t\t.preventBackGesture(true)\n\t\t\t\t.wheelDelta((d3Event) => -d3Event.deltaY * (this.ren.config.enableInteractionType === INTERACTION_TRACKPAD ? 0.02 : 0.002))\n\t\t\t\t.scaleExtent([this.minScaleExtent, this.maxScaleExtent])\n\t\t\t\t.on(\"start\", this.zoomStart.bind(this))\n\t\t\t\t.on(\"zoom\", this.zoomAction.bind(this))\n\t\t\t\t.on(\"end\", this.zoomEnd.bind(this));\n\n\t}\n\n\t// Saves the state when the user presses and holds the space bar. This\n\t// can be used for gestures that require the space bar to be held down.\n\tsetSpaceKeyPressed(state) {\n\t\tthis.spaceKeyPressed = state;\n\t}\n\n\t// Returns true if the space bar is pressed and held down.\n\tisSpaceKeyPressed() {\n\t\treturn this.spaceKeyPressed;\n\t}\n\n\t// Returns the dragObjectsHandler\n\tgetZoomHandler() {\n\t\treturn this.zoomHandler;\n\t}\n\n\t// Returns the zoom transform object.\n\tgetZoomTransform() {\n\t\treturn this.zoomTransform;\n\t}\n\n\t// Returns a copy of the zoom transform object.\n\tgetZoom() {\n\t\treturn { ...this.zoomTransform };\n\t}\n\n\tgetZoomScale() {\n\t\treturn this.zoomTransform.k;\n\t}\n\n\t// Resets the local zoom transform object to the default (identity) zoom.\n\tresetZoomTransform() {\n\t\tthis.zoomTransform = d3.zoomIdentity.translate(0, 0).scale(1);\n\t}\n\n\t// Zooms the canvas to the extent specified in the zoom object. Animate\n\t// the zoom by the time specified (in milliseconds) or by 500ms by default.\n\tzoomTo(zoomObject, animateTime) {\n\t\tconst at = typeof animateTime === \"undefined\" ? 500 : animateTime;\n\t\tthis.zoomCanvasInvokeZoomBehavior(zoomObject, at);\n\t}\n\n\t// Pans the canvas by the x and y amount specified in the time specified.\n\ttranslateBy(x, y, animateTime) {\n\t\tconst z = this.getZoomTransform();\n\t\tconst zoomObject = d3.zoomIdentity.translate(z.x + x, z.y + y).scale(z.k);\n\t\tthis.zoomCanvasInvokeZoomBehavior(zoomObject, animateTime);\n\t}\n\n\t// Zooms in the canvas by an increment amount.\n\tzoomIn() {\n\t\tif (this.zoomTransform.k < this.maxScaleExtent) {\n\t\t\tconst newScale = Math.min(this.zoomTransform.k * 1.1, this.maxScaleExtent);\n\t\t\tthis.ren.canvasSVG.call(this.zoomHandler.scaleTo, newScale);\n\t\t}\n\t}\n\n\t// Zooms out the canvas by an increment amount.\n\tzoomOut() {\n\t\tif (this.zoomTransform.k > this.minScaleExtent) {\n\t\t\tconst newScale = Math.max(this.zoomTransform.k / 1.1, this.minScaleExtent);\n\t\t\tthis.ren.canvasSVG.call(this.zoomHandler.scaleTo, newScale);\n\t\t}\n\t}\n\n\t// Returns true if the canvas is currently zoomed to the maximum amount.\n\tisZoomedToMax() {\n\t\treturn this.zoomTransform ? this.zoomTransform.k === this.maxScaleExtent : false;\n\t}\n\n\t// Returns true if the canvas is currently zoomed to the minimum amount.\n\tisZoomedToMin() {\n\t\treturn this.zoomTransform ? this.zoomTransform.k === this.minScaleExtent : false;\n\t}\n\n\t// Sets the maximum zoom extent by multiplying the current extent by\n\t// the factor passed in.\n\tsetMaxZoomExtent(factor) {\n\t\t// Don't allow the scale extent to be changed while in the middle of a\n\t\t// zoom operation.\n\t\tif (this.zooming) {\n\t\t\treturn;\n\t\t}\n\t\tconst newMaxExtent = this.maxScaleExtent * factor;\n\t\tthis.zoomHandler = this.zoomHandler.scaleExtent([this.minScaleExtent, newMaxExtent]);\n\t\tthis.ren.resetCanvasSVGBehaviors();\n\t}\n\n\t// Transforms the x and y fields of the pos object passed in, which\n\t// should be in screen pixels measured from the top left of the SVG\n\t// area, to canvas coordinates.\n\ttransformPos(pos) {\n\t\treturn {\n\t\t\tx: this.transformPosX(pos.x),\n\t\t\ty: this.transformPosY(pos.y)\n\t\t};\n\t}\n\n\t// Transforms a screen pixel X value, measured from the top left of\n\t// the SVG area, to canvas coordinate.\n\ttransformPosX(posX) {\n\t\treturn (posX - this.zoomTransform.x) / this.zoomTransform.k;\n\t}\n\n\t// Transforms a screen pixel Y value, measured from the top left of\n\t// the SVG area, to canvas coordinate.\n\ttransformPosY(posY) {\n\t\treturn (posY - this.zoomTransform.y) / this.zoomTransform.k;\n\t}\n\n\t// Transforms the x and y fields passed in which should be in\n\t// canvas coordinates to a position measured in screen pixels\n\t// from the top left of the SVG area.\n\tunTransformPos(pos) {\n\t\treturn {\n\t\t\tx: (pos.x * this.zoomTransform.k) + this.zoomTransform.x,\n\t\t\ty: (pos.y * this.zoomTransform.k) + this.zoomTransform.y\n\t\t};\n\t}\n\n\t// Returns a 'rect' object for the DOM element passed in. The dimensions\n\t// and positions returned are in canvas coordinates. That is, transformed\n\t// by the current zoomTransform from page coordinates to canvas coordinates.\n\tgetTransformedElementRect(element) {\n\t\tconst vpRect = this.ren.canvasSVG.node().getBoundingClientRect();\n\t\tif (!element) {\n\t\t\treturn null;\n\t\t}\n\t\tconst elRect = element.getBoundingClientRect();\n\n\t\t// Remove any offset caused by where the viewport is on the page.\n\t\tconst rect = {\n\t\t\tx: elRect.x - vpRect.x,\n\t\t\ty: elRect.y - vpRect.y,\n\t\t\tleft: elRect.left - vpRect.x,\n\t\t\tright: elRect.right - vpRect.x,\n\t\t\ttop: elRect.top - vpRect.y,\n\t\t\tbottom: elRect.bottom - vpRect.y,\n\t\t\twidth: elRect.width,\n\t\t\theight: elRect.height\n\t\t};\n\n\t\t// Transform the positions and dimensions to canvas coordinates.\n\t\trect.x = this.transformPosX(rect.x);\n\t\trect.y = this.transformPosY(rect.y);\n\t\trect.left = this.transformPosX(rect.left);\n\t\trect.right = this.transformPosX(rect.right);\n\t\trect.top = this.transformPosY(rect.top);\n\t\trect.bottom = this.transformPosY(rect.bottom);\n\t\trect.width /= this.zoomTransform.k;\n\t\trect.height /= this.zoomTransform.k;\n\n\t\treturn rect;\n\t}\n\n\t// Transforms the x, y, height and width fields of the object passed in by the\n\t// current zoom transformation amounts to convert coordinate positions and\n\t// dimensions in screen pixels to coordinate positions and dimensions in\n\t// zoomed pixels.\n\tgetTransformedRect(svgRect, pad) {\n\t\tconst transPad = (pad / this.zoomTransform.k);\n\t\treturn {\n\t\t\tx: (-this.zoomTransform.x / this.zoomTransform.k) + transPad,\n\t\t\ty: (-this.zoomTransform.y / this.zoomTransform.k) + transPad,\n\t\t\theight: (svgRect.height / this.zoomTransform.k) - (2 * transPad),\n\t\t\twidth: (svgRect.width / this.zoomTransform.k) - (2 * transPad)\n\t\t};\n\t}\n\n\t// Handles the beginning of a zoom action\n\tzoomStart(d3Event) {\n\t\tthis.logger.log(\"zoomStart - \" + JSON.stringify(d3Event.transform));\n\n\t\t// Ensure any open tip is closed before starting a zoom operation.\n\t\tthis.ren.canvasController.closeTip();\n\n\t\tthis.zooming = true;\n\n\t\t// Close the context menu, if it's open, before panning or zooming.\n\t\t// If the context menu is opened inside the expanded supernode (in-place\n\t\t// subflow), when the user zooms the canvas, the full page flow is handling\n\t\t// that zoom, which causes a refresh in the subflow, so the full page flow\n\t\t// will take care of closing the context menu. This means the in-place\n\t\t// subflow doesn’t need to do anything on zoom,\n\t\t// hence: !this.ren.dispUtils.isDisplayingSubFlowInPlace()\n\t\tif (this.ren.canvasController.isContextMenuDisplayed() &&\n\t\t\t\t!this.ren.dispUtils.isDisplayingSubFlowInPlace()) {\n\t\t\tthis.ren.canvasController.closeContextMenu();\n\t\t\tthis.contextMenuClosedOnZoom = true;\n\t\t}\n\n\t\t// Any text editing in progress will be closed by the textarea's blur event\n\t\t// if the user clicks on the canvas background. So we set this flag to\n\t\t// prevent the selection being lost in the zoomEnd (mouseup) event.\n\t\tif (this.ren.svgCanvasTextArea.isEditingText()) {\n\t\t\tthis.textEditingClosedOnZoom = true;\n\t\t}\n\n\t\tthis.regionSelect = this.isRegionSelectActivated(d3Event);\n\n\t\tif (this.regionSelect) {\n\t\t\t// Add a delay so, if the user just clicks, they don't see the crosshair.\n\t\t\t// This will be cleared in zoomEnd if the user's click takes less than 200 ms.\n\t\t\tthis.addingCursorOverlay = setTimeout(() => this.ren.addTempCursorOverlay(\"crosshair\"), 200);\n\t\t\tthis.regionStartTransformX = d3Event.transform.x;\n\t\t\tthis.regionStartTransformY = d3Event.transform.y;\n\n\t\t} else {\n\t\t\tif (this.isDragActivated(d3Event)) {\n\t\t\t\tthis.addingCursorOverlay = setTimeout(() => this.ren.addTempCursorOverlay(\"grabbing\"), 200);\n\t\t\t} else {\n\t\t\t\tthis.addingCursorOverlay = setTimeout(() => this.ren.addTempCursorOverlay(\"default\"), 200);\n\t\t\t}\n\t\t}\n\n\t\tconst transPos = this.ren.getTransformedMousePos(d3Event);\n\t\tthis.zoomStartPoint = { x: d3Event.transform.x, y: d3Event.transform.y, k: d3Event.transform.k, startX: transPos.x, startY: transPos.y };\n\t\tthis.previousD3Event = { ...d3Event.transform };\n\n\t\t// Store the canvas dimensions so we don't have to recalculate\n\t\t// them for every zoom action event.\n\t\tthis.zoomCanvasDimensions = this.getCanvasDimensions();\n\t}\n\n\t// Handles each increment of a zoom action\n\tzoomAction(d3Event) {\n\t\tthis.logger.log(\"zoomAction - \" + JSON.stringify(d3Event.transform));\n\n\t\t// If the scale amount is the same we are not zooming, so we must be panning.\n\t\tif (d3Event.transform.k === this.zoomStartPoint.k) {\n\t\t\tif (this.regionSelect) {\n\t\t\t\tthis.drawRegionSelector(d3Event);\n\n\t\t\t} else {\n\t\t\t\tthis.zoomCanvasBackground(d3Event);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.ren.addTempCursorOverlay(\"default\");\n\t\t\tthis.zoomCanvasBackground(d3Event);\n\t\t\tthis.ren.repositionCommentToolbar();\n\t\t}\n\t}\n\n\t// Handles the end of a zoom action\n\tzoomEnd(d3Event) {\n\t\tthis.logger.log(\"zoomEnd - \" + JSON.stringify(d3Event.transform));\n\n\t\t// Clears the display of the cursor overlay if the user clicks within 200 ms\n\t\tclearTimeout(this.addingCursorOverlay);\n\n\t\tconst transPos = this.ren.getTransformedMousePos(d3Event);\n\n\t\t// The user just clicked -- with no drag.\n\t\tif (transPos.x === this.zoomStartPoint.startX &&\n\t\t\ttransPos.y === this.zoomStartPoint.startY &&\n\t\t\t!this.zoomChanged()) {\n\t\t\tthis.zoomClick(d3Event);\n\n\t\t} else if (this.regionSelect) {\n\t\t\tthis.zoomEndRegionSelect(d3Event);\n\n\t\t} else if (this.ren.dispUtils.isDisplayingFullPage() && this.zoomChanged()) {\n\t\t\tthis.zoomSave();\n\t\t}\n\n\t\t// Remove the cursor overlay and reset the SVG background rectangle\n\t\t// cursor style, which was set in the zoom start method.\n\t\tthis.ren.resetCanvasCursor(d3Event);\n\t\tthis.ren.removeTempCursorOverlay();\n\t\tthis.contextMenuClosedOnZoom = false;\n\t\tthis.textEditingClosedOnZoom = false;\n\t\tthis.regionSelect = false;\n\t\tthis.zooming = false;\n\t}\n\n\t// Returns true if the current zoom transform is different from the\n\t// zoom values at the beginning of the zoom action.\n\tzoomChanged() {\n\t\treturn (this.zoomTransform.k !== this.zoomStartPoint.k ||\n\t\t\tthis.zoomTransform.x !== this.zoomStartPoint.x ||\n\t\t\tthis.zoomTransform.y !== this.zoomStartPoint.y);\n\t}\n\n\t// Returns true if the event indicates that a drag (rather than a region\n\t// select) is in action. This means that, with the Carbon iteration\n\t// option the space bar is pressed or with legacy iteration the\n\t// shift key is NOT pressed.\n\tisDragActivated(d3Event) {\n\t\tif (this.ren.config.enableInteractionType === INTERACTION_CARBON) {\n\t\t\treturn this.isSpaceKeyPressed();\n\t\t}\n\t\treturn (d3Event && d3Event.sourceEvent && !d3Event.sourceEvent.shiftKey);\n\t}\n\n\t// Returns true if the region select gesture is requested by the user.\n\tisRegionSelectActivated(d3Event) {\n\t\t// The this.zoomingAction flag indicates zooming is being invoked\n\t\t// programmatically.\n\t\tif (this.zoomingAction) {\n\t\t\treturn false;\n\n\t\t} else if (this.ren.config.enableInteractionType === INTERACTION_MOUSE &&\n\t\t\t\t(d3Event && d3Event.sourceEvent && d3Event.sourceEvent.shiftKey)) {\n\t\t\treturn true;\n\n\t\t} else if (this.ren.config.enableInteractionType === INTERACTION_CARBON &&\n\t\t\t\t\t!this.isSpaceKeyPressed()) {\n\t\t\treturn true;\n\n\t\t} else if (this.ren.config.enableInteractionType === INTERACTION_TRACKPAD &&\n\t\t\t\t(d3Event.sourceEvent && d3Event.sourceEvent.buttons === 1) && // Main button is pressed\n\t\t\t\t!this.isSpaceKeyPressed()) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tdrawRegionSelector(d3Event) {\n\t\tthis.removeRegionSelector();\n\t\tconst { x, y, width, height } = this.getRegionDimensions(d3Event);\n\n\t\t// Highlight objects within the region, as it is being drawn, to show\n\t\t// the user which objects will be selected. Highlighting is done by setting\n\t\t// the selection info in the (temporary) activePipeline object.\n\t\tconst selections = this.getObjectsInRegion({ x, y, width, height });\n\t\tthis.ren.setSelectionInfo({ selections, pipelineId: this.ren.activePipeline.id });\n\n\t\tthis.ren.canvasGrp\n\t\t\t.append(\"rect\")\n\t\t\t.attr(\"width\", width)\n\t\t\t.attr(\"height\", height)\n\t\t\t.attr(\"x\", x)\n\t\t\t.attr(\"y\", y)\n\t\t\t.attr(\"class\", \"d3-region-selector\");\n\t}\n\n\t// Handles the behavior when the user stops doing a region select.\n\tzoomEndRegionSelect(d3Event) {\n\t\tthis.removeRegionSelector();\n\n\t\t// Reset the transform x and y to what they were before the region\n\t\t// selection action was started. This directly sets the x and y values\n\t\t// in the __zoom property of the svgCanvas DOM object.\n\t\td3Event.transform.x = this.regionStartTransformX;\n\t\td3Event.transform.y = this.regionStartTransformY;\n\n\t\t// Get the objects in the region and set them as 'selected' in the\n\t\t// object model by calling the canvas controller.\n\t\tconst region = this.getRegionDimensions(d3Event);\n\t\tconst selections = this.getObjectsInRegion(region);\n\t\tthis.ren.canvasController.setSelections(selections, this.ren.activePipeline.id);\n\t}\n\n\t// Removes the region selection graphic rectangle.\n\tremoveRegionSelector() {\n\t\tthis.ren.canvasGrp.selectAll(\".d3-region-selector\").remove();\n\t}\n\n\t// Returns any objects in the region provided where region is { x, y, width, height }\n\tgetObjectsInRegion(region) {\n\t\treturn CanvasUtils.getObjectsInRegion(\n\t\t\tregion,\n\t\t\tthis.ren.activePipeline,\n\t\t\tthis.ren.config.enableLinkSelection !== LINK_SELECTION_NONE,\n\t\t\tthis.ren.canvasLayout.linkType,\n\t\t\tthis.ren.canvasLayout.linkMethod,\n\t\t\tthis.ren.config.enableAssocLinkType);\n\t}\n\n\t// Returns the x, y, width and height of the selection region\n\t// where x and y are always the top left corner of the region\n\t// and width and height are therefore always positive.\n\tgetRegionDimensions(d3Event) {\n\t\tconst transPos = this.ren.getTransformedMousePos(d3Event);\n\t\tlet x = this.zoomStartPoint.startX;\n\t\tlet y = this.zoomStartPoint.startY;\n\t\tlet width = transPos.x - x;\n\t\tlet height = transPos.y - y;\n\n\t\tif (width < 0) {\n\t\t\twidth = Math.abs(width);\n\t\t\tx -= width;\n\t\t}\n\t\tif (height < 0) {\n\t\t\theight = Math.abs(height);\n\t\t\ty -= height;\n\t\t}\n\n\t\treturn { x, y, width, height };\n\t}\n\n\t// Performs zoom behaviors for each incremental zoom action.\n\tzoomCanvasBackground(d3Event) {\n\t\tthis.regionSelect = false;\n\n\t\tif (this.ren.dispUtils.isDisplayingPrimaryFlowFullPage()) {\n\t\t\tconst incTransform = this.getTransformIncrement(d3Event);\n\t\t\tthis.zoomTransform = this.zoomConstrainRegular(incTransform, this.getViewportDimensions(), this.zoomCanvasDimensions);\n\t\t} else {\n\t\t\tthis.zoomTransform = d3.zoomIdentity.translate(d3Event.transform.x, d3Event.transform.y).scale(d3Event.transform.k);\n\t\t}\n\n\t\tthis.ren.canvasGrp.attr(\"transform\", this.zoomTransform);\n\t\tthis.ren.canvasBackground.attr(\"transform\", this.zoomTransform);\n\n\t\tthis.ren.displayCanvasAccoutrements();\n\t}\n\n\t// Handles a zoom operation that is just a click on the canvas background.\n\tzoomClick(d3Event) {\n\t\t// Only clear selections under these conditions:\n\t\t// * if the click was on the canvas of the current active pipeline. (This\n\t\t// is because clicking on the canvas background of an expanded supernode\n\t\t// should select that node.)\n\t\t// * if we have not just closed a context menu\n\t\t// * if we have not just closed text editing\n\t\t// * if editing actions are enabled OR the target is the canvas background.\n\t\t// (This condition is necessary because when editing actions are disabled,\n\t\t// for a read-only canvas, the mouse-up over a node can cause this method\n\t\t// to be called.)\n\t\tif (this.ren.dispUtils.isDisplayingCurrentPipeline() &&\n\t\t\t\t!this.contextMenuClosedOnZoom &&\n\t\t\t\t!this.textEditingClosedOnZoom &&\n\t\t\t\t(this.ren.config.enableEditingActions ||\n\t\t\t\t(d3Event.sourceEvent?.target?.classList?.contains(\"d3-svg-background\")))) {\n\t\t\tthis.ren.canvasController.clearSelections();\n\t\t}\n\t}\n\n\t// Save the zoom amount. The canvas controller/object model will decide\n\t// how this info is saved.\n\tzoomSave() {\n\t\t// Set the internal zoom value for canvasSVG used by D3. This will be\n\t\t// used by d3Event next time a zoom action is initiated.\n\t\tthis.ren.canvasSVG.property(\"__zoom\", this.zoomTransform);\n\n\t\tconst data = {\n\t\t\teditType: \"setZoom\",\n\t\t\teditSource: \"canvas\",\n\t\t\tzoom: this.zoomTransform,\n\t\t\tpipelineId: this.ren.activePipeline.id\n\t\t};\n\t\tthis.ren.canvasController.editActionHandler(data);\n\n\t}\n\n\t// Returns a new zoom which is the result of incrementing the current zoom\n\t// by the amount since the previous d3Event event.\n\t// We calculate increments because d3Event.transform is not based on\n\t// the constrained zoom position (which is very annoying) so we keep track\n\t// of the current constrained zoom amount in this.zoomTransform.\n\tgetTransformIncrement(d3Event) {\n\t\tconst xInc = d3Event.transform.x - this.previousD3Event.x;\n\t\tconst yInc = d3Event.transform.y - this.previousD3Event.y;\n\n\t\tconst newTransform = { x: this.zoomTransform.x + xInc, y: this.zoomTransform.y + yInc, k: d3Event.transform.k };\n\t\tthis.previousD3Event = { ...d3Event.transform };\n\t\treturn newTransform;\n\t}\n\n\t// Returns a modified transform object so that the canvas area (the area\n\t// containing nodes and comments) is constrained such that it never totally\n\t// disappears from the view port.\n\tzoomConstrainRegular(transform, viewPort, canvasDimensions) {\n\t\tif (!canvasDimensions) {\n\t\t\treturn this.zoomTransform;\n\t\t}\n\n\t\tconst k = transform.k;\n\t\tlet x = transform.x;\n\t\tlet y = transform.y;\n\n\t\tconst canv =\n\t\t\tthis.convertRectAdjustedForScaleWithPadding(canvasDimensions, k, this.getZoomToFitPadding());\n\n\t\tconst rightOffsetLimit = viewPort.width - Math.min((viewPort.width * 0.25), (canv.width * 0.25));\n\t\tconst leftOffsetLimit = -(Math.max((canv.width - (viewPort.width * 0.25)), (canv.width * 0.75)));\n\n\t\tconst bottomOffsetLimit = viewPort.height - Math.min((viewPort.height * 0.25), (canv.height * 0.25));\n\t\tconst topOffsetLimit = -(Math.max((canv.height - (viewPort.height * 0.25)), (canv.height * 0.75)));\n\n\t\tif (x > -canv.left + rightOffsetLimit) {\n\t\t\tx = -canv.left + rightOffsetLimit;\n\n\t\t} else if (x < -canv.left + leftOffsetLimit) {\n\t\t\tx = -canv.left + leftOffsetLimit;\n\t\t}\n\n\t\tif (y > -canv.top + bottomOffsetLimit) {\n\t\t\ty = -canv.top + bottomOffsetLimit;\n\n\t\t} else if (y < -canv.top + topOffsetLimit) {\n\t\t\ty = -canv.top + topOffsetLimit;\n\t\t}\n\n\t\treturn d3.zoomIdentity.translate(x, y).scale(k);\n\t}\n\n\t// Restores the zoom of the canvas, if it has changed, based on the type\n\t// of 'save zoom' specified in the configuration and, if no saved zoom, was\n\t// provided pans the canvas area so it is always visible.\n\trestoreZoom() {\n\t\tlet newZoom = this.ren.canvasController.getSavedZoom(this.ren.activePipeline.id);\n\n\t\t// If there's no saved zoom, and enablePanIntoViewOnOpen is set, pan so\n\t\t// the canvas area (containing nodes and comments) is visible in the viewport.\n\t\tif (!newZoom && this.ren.config.enablePanIntoViewOnOpen) {\n\t\t\tconst canvWithPadding = this.getCanvasDimensionsWithPadding();\n\t\t\tif (canvWithPadding) {\n\t\t\t\tnewZoom = { x: -canvWithPadding.left, y: -canvWithPadding.top, k: 1 };\n\t\t\t}\n\t\t}\n\n\t\t// If there's no saved zoom and we have some initial pan amounts provided use them.\n\t\tif (!newZoom && this.ren.canvasLayout.initialPanX && this.ren.canvasLayout.initialPanY) {\n\t\t\tnewZoom = { x: this.ren.canvasLayout.initialPanX, y: this.ren.canvasLayout.initialPanY, k: 1 };\n\t\t}\n\n\t\t// If new zoom is different to the current zoom amount, apply it.\n\t\tif (newZoom &&\n\t\t\t\t(newZoom.k !== this.zoomTransform.k ||\n\t\t\t\t\tnewZoom.x !== this.zoomTransform.x ||\n\t\t\t\t\tnewZoom.y !== this.zoomTransform.y)) {\n\t\t\tthis.zoomCanvasInvokeZoomBehavior(newZoom);\n\t\t}\n\t}\n\n\t// Zooms the canvas to the amount specified in newZoomTransform. Zooming the\n\t// canvas in this way will invoke the zoom behavior methods: zoomStart,\n\t// zoomAction and zoomEnd. It does not perform a zoom if newZoomTransform\n\t// is the same as the current zoom transform.\n\tzoomCanvasInvokeZoomBehavior(newZoomTransform, animateTime) {\n\t\tif (newZoomTransform &&\n\t\t\t\tisFinite(newZoomTransform.x) &&\n\t\t\t\tisFinite(newZoomTransform.y) &&\n\t\t\t\tisFinite(newZoomTransform.k) &&\n\t\t\t\tthis.zoomHasChanged(newZoomTransform)) {\n\t\t\tthis.zoomingAction = true;\n\t\t\tconst zoomTransform = d3.zoomIdentity.translate(newZoomTransform.x, newZoomTransform.y).scale(newZoomTransform.k);\n\t\t\tif (animateTime) {\n\t\t\t\tthis.ren.canvasSVG.call(this.zoomHandler).transition()\n\t\t\t\t\t.duration(animateTime)\n\t\t\t\t\t.call(this.zoomHandler.transform, zoomTransform);\n\t\t\t} else {\n\t\t\t\tthis.ren.canvasSVG.call(this.zoomHandler.transform, zoomTransform);\n\t\t\t}\n\t\t\tthis.zoomingAction = false;\n\t\t}\n\t}\n\n\t// Return true if the new zoom transform passed in is different from the\n\t// current zoom transform.\n\tzoomHasChanged(newZoomTransform) {\n\t\treturn newZoomTransform.k !== this.zoomTransform.k ||\n\t\t\tnewZoomTransform.x !== this.zoomTransform.x ||\n\t\t\tnewZoomTransform.y !== this.zoomTransform.y;\n\t}\n\n\t// Zooms all the canvas objects to fit in the current viewport.\n\tzoomToFit(animateTime) {\n\t\tconst canvasDimensions = this.getCanvasDimensionsWithPadding();\n\t\tconst zoom = this.getZoomToFit(canvasDimensions);\n\t\tif (zoom) {\n\t\t\tthis.zoomCanvasInvokeZoomBehavior(zoom, animateTime);\n\t\t}\n\t}\n\n\t// Returns a zoom object that can be used to zoom canvas objects (nodes,\n\t// comments and/or detached links), that occupy the canvasDimensions,\n\t// to fit in the current viewport.\n\tgetZoomToFit(canvasDimensions) {\n\t\tconst viewPortDimensions = this.getViewportDimensions();\n\n\t\tif (canvasDimensions) {\n\t\t\tconst xRatio = viewPortDimensions.width / canvasDimensions.width;\n\t\t\tconst yRatio = viewPortDimensions.height / canvasDimensions.height;\n\t\t\tconst newScale = Math.min(xRatio, yRatio, 1); // Don't let the canvas be scaled more than 1 in either direction\n\n\t\t\tlet x = (viewPortDimensions.width - (canvasDimensions.width * newScale)) / 2;\n\t\t\tlet y = (viewPortDimensions.height - (canvasDimensions.height * newScale)) / 2;\n\n\t\t\tx -= newScale * canvasDimensions.left;\n\t\t\ty -= newScale * canvasDimensions.top;\n\n\t\t\treturn { x: x, y: y, k: newScale };\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Returns a zoom object that will, if applied to the canvas, zoom the objects\n\t// identified in the objectIDs array so their center is at the xPos, yPos\n\t// position in the viewport.\n\tgetZoomToReveal(objectIDs, xPos, yPos) {\n\t\tconst transformedSVGRect = this.getTransformedViewportDimensions();\n\t\tconst nodes = this.ren.activePipeline.getNodes(objectIDs);\n\t\tconst comments = this.ren.activePipeline.getComments(objectIDs);\n\t\tconst links = this.ren.activePipeline.getLinks(objectIDs);\n\n\t\tif (nodes.length > 0 || comments.length > 0 || links.length > 0) {\n\t\t\tconst canvasDimensions = CanvasUtils.getCanvasDimensions(nodes, comments, links, 0, 0, true);\n\t\t\tconst canv = this.convertRectAdjustedForScaleWithPadding(canvasDimensions, 1, 30);\n\n\t\t\tif (canv) {\n\t\t\t\t// If the bounding rectangle (canv) doesn't completely fit in the viewport\n\t\t\t\t// we do a zoom to fit to bring the requested objects into view.\n\t\t\t\tif (canv.width > transformedSVGRect.width || canv.height > transformedSVGRect.height) {\n\t\t\t\t\treturn this.getZoomToFit(canv);\n\t\t\t\t}\n\n\t\t\t\tconst xPosInt = parseInt(xPos, 10);\n\t\t\t\tconst yPosInt = typeof yPos === \"undefined\" ? xPosInt : parseInt(yPos, 10);\n\n\t\t\t\tlet xOffset;\n\t\t\t\tlet yOffset;\n\n\t\t\t\tif (!Number.isNaN(xPosInt) && !Number.isNaN(yPosInt)) {\n\t\t\t\t\txOffset = transformedSVGRect.x + (transformedSVGRect.width * (xPosInt / 100)) - (canv.left + (canv.width / 2));\n\t\t\t\t\tyOffset = transformedSVGRect.y + (transformedSVGRect.height * (yPosInt / 100)) - (canv.top + (canv.height / 2));\n\n\t\t\t\t} else {\n\t\t\t\t\tif (canv.right > transformedSVGRect.x + transformedSVGRect.width) {\n\t\t\t\t\t\txOffset = transformedSVGRect.x + transformedSVGRect.width - canv.right;\n\t\t\t\t\t}\n\t\t\t\t\tif (canv.left < transformedSVGRect.x) {\n\t\t\t\t\t\txOffset = transformedSVGRect.x - canv.left;\n\t\t\t\t\t}\n\t\t\t\t\tif (canv.bottom > transformedSVGRect.y + transformedSVGRect.height) {\n\t\t\t\t\t\tyOffset = transformedSVGRect.y + transformedSVGRect.height - canv.bottom;\n\t\t\t\t\t}\n\t\t\t\t\tif (canv.top < transformedSVGRect.y) {\n\t\t\t\t\t\tyOffset = transformedSVGRect.y - canv.top;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (typeof xOffset !== \"undefined\" || typeof yOffset !== \"undefined\") {\n\t\t\t\t\tconst x = this.zoomTransform.x + ((xOffset || 0)) * this.zoomTransform.k;\n\t\t\t\t\tconst y = this.zoomTransform.y + ((yOffset || 0)) * this.zoomTransform.k;\n\t\t\t\t\treturn { x: x || 0, y: y || 0, k: this.zoomTransform.k };\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t// Returns the maximum amount for padding, when zooming to fit the canvas\n\t// objects within a subflow, to allow the connection lines to be displayed\n\t// without them doubling back on themselves.\n\tgetMaxZoomToFitPaddingForConnections() {\n\t\tconst paddingForInputBinding = this.getMaxPaddingForConnectionsFromInputBindingNodes();\n\t\tconst paddingForOutputBinding = this.getMaxPaddingForConnectionsToOutputBindingNodes();\n\t\tconst padding = Math.max(paddingForInputBinding, paddingForOutputBinding);\n\t\treturn padding;\n\t}\n\n\t// Returns the maximum amount for padding, when zooming to fit the canvas\n\t// objects within a subflow, to allow the connection lines (from input binding\n\t// nodes to other sub-flow nodes) to be displayed without them doubling back\n\t// on themselves.\n\tgetMaxPaddingForConnectionsFromInputBindingNodes() {\n\t\tlet maxPadding = 0;\n\t\tconst inputBindingNodes = this.ren.activePipeline.nodes.filter((n) => n.isSupernodeInputBinding);\n\n\t\tinputBindingNodes.forEach((n) => {\n\t\t\tconst nodePadding = CanvasUtils.getNodePaddingToTargetNodes(n, this.ren.activePipeline.nodes,\n\t\t\t\tthis.ren.activePipeline.links, this.ren.canvasLayout.linkType);\n\t\t\tmaxPadding = Math.max(maxPadding, nodePadding);\n\t\t});\n\n\t\treturn maxPadding;\n\t}\n\n\t// Returns the maximum amount for padding, when zooming to fit the canvas\n\t// objects within a subflow, to allow the connection lines (from sub-flow nodes\n\t// to output binding nodes) to be displayed without them doubling back\n\t// on themselves.\n\tgetMaxPaddingForConnectionsToOutputBindingNodes() {\n\t\tlet maxPadding = 0;\n\t\tconst outputBindingNodes = this.ren.activePipeline.nodes.filter((n) => n.isSupernodeOutputBinding);\n\n\t\tthis.ren.activePipeline.nodes.forEach((n) => {\n\t\t\tconst nodePadding = CanvasUtils.getNodePaddingToTargetNodes(n, outputBindingNodes,\n\t\t\t\tthis.ren.activePipeline.links, this.ren.canvasLayout.linkType);\n\t\t\tmaxPadding = Math.max(maxPadding, nodePadding);\n\t\t});\n\n\t\treturn maxPadding;\n\t}\n\n\t// Returns an object representing the viewport dimensions which have been\n\t// transformed for the current zoom amount.\n\tgetTransformedViewportDimensions() {\n\t\tconst svgRect = this.getViewportDimensions();\n\t\treturn this.getTransformedRect(svgRect, 0);\n\t}\n\n\t// Returns the dimensions of the SVG area. When we are displaying a sub-flow\n\t// we can use the supernode's dimensions. If not we are displaying\n\t// full-page so we can use getBoundingClientRect() to get the dimensions\n\t// (for some reason that method doesn't return correct values with embedded SVG areas).\n\tgetViewportDimensions() {\n\t\tlet viewportDimensions = {};\n\n\t\tif (this.ren.dispUtils.isDisplayingSubFlowInPlace()) {\n\t\t\tconst dims = this.ren.getParentSupernodeSVGDimensions();\n\t\t\tviewportDimensions.width = dims.width;\n\t\t\tviewportDimensions.height = dims.height;\n\n\t\t} else {\n\t\t\tif (this.ren.canvasSVG && this.ren.canvasSVG.node()) {\n\t\t\t\tviewportDimensions = this.ren.canvasSVG.node().getBoundingClientRect();\n\t\t\t} else {\n\t\t\t\tviewportDimensions = { x: 0, y: 0, width: 1100, height: 640 }; // Return a sensible default (for Jest tests)\n\t\t\t}\n\t\t}\n\t\treturn viewportDimensions;\n\t}\n\n\t// Returns the dimensions in SVG coordinates of the canvas area. This is\n\t// based on the position and width and height of the nodes and comments. It\n\t// does not include the 'super binding nodes' which are the binding nodes in\n\t// a sub-flow that map to a port in the containing supernode. The dimensions\n\t// include an appropriate padding amount.\n\tgetCanvasDimensionsWithPadding() {\n\t\treturn this.getCanvasDimensions(this.getZoomToFitPadding());\n\t}\n\n\t// Returns the dimensions in SVG coordinates of the canvas area. This is\n\t// based on the position and width and height of the nodes and comments. It\n\t// does not include the 'super binding nodes' which are the binding nodes in\n\t// a sub-flow that map to a port in the containing supernode. If a pad is\n\t// provided, it is also added in to the dimensions.\n\tgetCanvasDimensions(pad) {\n\t\tconst gap = this.ren.canvasLayout.commentHighlightGap;\n\t\tconst canvasDimensions = this.ren.activePipeline.getCanvasDimensions(gap);\n\t\treturn this.convertRectAdjustedForScaleWithPadding(canvasDimensions, 1, pad);\n\t}\n\n\t// Returns a rect object describing the rect passed in but\n\t// scaled by k and with padding added.\n\tconvertRectAdjustedForScaleWithPadding(rect, k, pad = 0) {\n\t\tif (rect) {\n\t\t\treturn {\n\t\t\t\tleft: (rect.left * k) - pad,\n\t\t\t\ttop: (rect.top * k) - pad,\n\t\t\t\tright: (rect.right * k) + pad,\n\t\t\t\tbottom: (rect.bottom * k) + pad,\n\t\t\t\twidth: (rect.width * k) + (2 * pad),\n\t\t\t\theight: (rect.height * k) + (2 * pad)\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Returns the padding space for the canvas objects to be zoomed which takes\n\t// into account any connections that need to be made to/from any sub-flow\n\t// binding nodes plus any space needed for the binding nodes ports.\n\tgetZoomToFitPadding() {\n\t\tlet padding = this.ren.canvasLayout.zoomToFitPadding;\n\n\t\tif (this.ren.dispUtils.isDisplayingSubFlow()) {\n\t\t\t// Allocate some space for connecting lines and the binding node ports\n\t\t\tconst newPadding = this.getMaxZoomToFitPaddingForConnections() + (2 * this.ren.canvasLayout.supernodeBindingPortRadius);\n\t\t\tpadding = Math.max(padding, newPadding);\n\t\t}\n\t\treturn padding;\n\t}\n}\n","/*\n * Copyright 2024-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* eslint brace-style: \"off\" */\n\nimport Logger from \"../logging/canvas-logger.js\";\nimport CanvasUtils from \"./common-canvas-utils.js\";\nimport { ASSOCIATION_LINK, NODE_LINK, COMMENT_LINK, CANVAS_FOCUS,\n\tLINK_SELECTION_HANDLES, LINK_SELECTION_DETACHABLE\n} from \"./constants/canvas-constants.js\";\n\n\nexport default class SVGCanvasUtilsAccessibility {\n\tconstructor(activePipeline) {\n\t\tthis.logger = new Logger(\"SVGCanvasUtilsAccessibility\");\n\t\tthis.logger.log(\"constructor - start\");\n\n\t\tthis.ap = activePipeline;\n\n\t\tthis.initialize();\n\n\t\tthis.logger.log(\"constructor - end\");\n\t}\n\n\tinitialize() {\n\t\tthis.logger.logStartTimer(\"initialize\");\n\n\t\t// Create a tab objects array for accessibility. Tab objects are the\n\t\t// set of objects that tab key will move the focus to on the canvas.\n\t\t// They are either solitary comments OR detached links OR 'starting'\n\t\t// objects (either a node or semi-detached link) for a connected group\n\t\t// of canvas objects. Once the user has tabbed to a starting object he\n\t\t// may use the arrow keys to navigate through the group of connected\n\t\t// objects.\n\t\tthis.tabObjects = this.createTabObjectsArray();\n\n\t\tthis.logger.logEndTimer(\"initialize\");\n\t}\n\n\t// Returns an array of tab groups for the active pipeline. Each element of\n\t// the array is the starting object (node, comment or link) for the group.\n\tcreateTabObjectsArray() {\n\t\tthis.removeGrpProperties();\n\n\t\tconst objGroups = this.getObjectGroups();\n\n\t\tconst entryComments = this.getEntryComments();\n\t\tconst entryLinks = this.getEntryLinks();\n\t\tconst entryNodes = this.getEntryNodes();\n\t\tconst entryNodesForLoops = this.getEntryNodesForLoops(objGroups);\n\n\t\tlet tabGroups = [...entryComments, ...entryNodes, ...entryLinks, ...entryNodesForLoops];\n\t\ttabGroups = tabGroups.sort(this.sortTabGroups.bind(this));\n\t\treturn tabGroups;\n\t}\n\n\t// Prepares the canvas objects for processing into tab groups by removing\n\t// the 'grp' properties from each object. 'grp' is used to keep track of\n\t// which tab group an object is allocated to.\n\tremoveGrpProperties() {\n\t\tthis.ap.pipeline.nodes.forEach((n) => delete n.grp);\n\t\tthis.ap.pipeline.links.forEach((l) => delete l.grp);\n\t\tthis.ap.pipeline.comments.forEach((c) => delete c.grp);\n\t}\n\n\tgetEntryComments() {\n\t\tif (this.ap.canvasInfo.hideComments) {\n\t\t\treturn [];\n\t\t}\n\t\tlet solitaryComments = this.ap.pipeline.comments.filter((c) => !this.commentHasLinks(c));\n\t\tsolitaryComments = solitaryComments.map((sc) => ({ type: \"comment\", obj: sc }));\n\t\treturn solitaryComments;\n\t}\n\n\tgetEntryLinks() {\n\t\tlet entryLinks = this.ap.pipeline.links.filter((l) => l.srcPos && l.trgPos);\n\t\tentryLinks = entryLinks.map((el) => ({ type: \"link\", obj: el }));\n\t\treturn entryLinks;\n\t}\n\n\tgetEntryNodes() {\n\t\tlet entryNodes = this.ap.pipeline.nodes.filter((n) => !this.nodeHasInputLinks(n) && !this.nodeHasAssocLinks(n));\n\t\tentryNodes = entryNodes.map((en) => ({ type: \"node\", obj: en }));\n\t\treturn entryNodes;\n\t}\n\n\tgetEntryNodesForLoops(objGroups) {\n\t\tconst loopEntryNodes = [];\n\n\t\tobjGroups.forEach((og) => {\n\t\t\tconst entryNodes = og.filter((node) => !this.nodeHasInputLinks(node) && !this.nodeHasAssocLinks(node));\n\t\t\tif (entryNodes.length === 0) {\n\t\t\t\tconst loopEntryNode = this.getLoopEntryNode(og);\n\t\t\t\tloopEntryNodes.push(loopEntryNode);\n\t\t\t}\n\t\t});\n\t\treturn loopEntryNodes;\n\t}\n\n\tgetLoopEntryNode(nodeGroup) {\n\t\tlet entryNode = null;\n\t\tlet xPos = Infinity;\n\n\t\tnodeGroup.forEach((node) => {\n\t\t\tif (node.x_pos < xPos) {\n\t\t\t\tentryNode = node;\n\t\t\t\txPos = node.x_pos;\n\t\t\t}\n\t\t});\n\t\treturn { type: \"node\", obj: entryNode };\n\t}\n\n\t// Returns an array of groups of nodes, comments and links that are\n\t// connected. It assigns a group number to the objects in each group.\n\t// After processing all the nodes, it iterates over each comment in\n\t// the pipeline and assigns a group number to each comment that does\n\t// not already have one. It does the same for each link in the pipeline.\n\tgetObjectGroups() {\n\t\tconst objGroups = [];\n\t\tlet grpNumber = -1;\n\n\t\t// Process nodes and discover the other nodes and comments that are\n\t\t// connected to that node. Assign a grp number to each attached node,\n\t\t// link and comment.\n\t\tthis.ap.pipeline.nodes.forEach((n) => {\n\t\t\tif (typeof n.grp === \"undefined\") {\n\t\t\t\tconst group = [];\n\t\t\t\tgrpNumber++;\n\t\t\t\tthis.getNodesInGroup(n, group, grpNumber);\n\t\t\t\tobjGroups.push(group);\n\t\t\t}\n\t\t});\n\n\t\t// Only solitary comments will be left without a grp field because all\n\t\t// connected comments will have been handled when the node groups were\n\t\t// processed in the loop above -- so assign a new group number to each.\n\t\tthis.ap.pipeline.comments.forEach((c) => {\n\t\t\tif (typeof c.grp === \"undefined\") {\n\t\t\t\tgrpNumber++;\n\t\t\t\tc.grp = grpNumber;\n\t\t\t}\n\t\t});\n\n\t\t// Only detached links will be left without a grp field because all\n\t\t// connected links will have been handled when the node groups were\n\t\t// processed in the loop above -- so assign a new group number to each.\n\t\tthis.ap.pipeline.links.forEach((l) => {\n\t\t\tif (typeof l.grp === \"undefined\") {\n\t\t\t\tgrpNumber++;\n\t\t\t\tl.grp = grpNumber;\n\t\t\t}\n\t\t});\n\n\t\treturn objGroups;\n\t}\n\n\tgetNodesInGroup(n, group, grpNumber) {\n\t\tif (typeof n.grp === \"undefined\") {\n\t\t\tn.grp = grpNumber;\n\t\t\tgroup.push(n);\n\n\t\t\tlet inputLinks = this.getInputDataLinks(n);\n\t\t\tinputLinks = inputLinks.map((inLink) => { inLink.grp = grpNumber; return inLink; });\n\n\t\t\tlet outputLinks = this.getOutputDataLinks(n);\n\t\t\toutputLinks = outputLinks.map((outLink) => { outLink.grp = grpNumber; return outLink; });\n\n\t\t\tlet assocLinks = this.getAssociationLinks(n);\n\t\t\tassocLinks = assocLinks.map((assocLink) => { assocLink.grp = grpNumber; return assocLink; });\n\n\t\t\tlet commentLinks = this.getCommentLinks(n);\n\t\t\tcommentLinks = commentLinks.map((comLink) => { comLink.grp = grpNumber; return comLink; });\n\n\t\t\tconst srcNodes = this.getSrcNodes(inputLinks);\n\t\t\tconst trgNodes = this.getTrgNodes(outputLinks);\n\t\t\tconst assocNodes = this.getAssocNodes(assocLinks, n);\n\t\t\tconst connComments = this.getConnectedComments(commentLinks);\n\n\t\t\tsrcNodes.forEach((srcNode) => {\n\t\t\t\tif (typeof srcNode.grp === \"undefined\") {\n\t\t\t\t\tthis.getNodesInGroup(srcNode, group, grpNumber);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\ttrgNodes.forEach((trgNode) => {\n\t\t\t\tif (typeof trgNode.grp === \"undefined\") {\n\t\t\t\t\tthis.getNodesInGroup(trgNode, group, grpNumber);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tassocNodes.forEach((assocNode) => {\n\t\t\t\tif (typeof assocNode.grp === \"undefined\") {\n\t\t\t\t\tthis.getNodesInGroup(assocNode, group, grpNumber);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconnComments.forEach((connComment) => {\n\t\t\t\tif (typeof connComment.grp === \"undefined\") {\n\t\t\t\t\tconnComment.grp = grpNumber;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tgetSrcNodes(inputLinks) {\n\t\tconst srcNodes = [];\n\t\tinputLinks.forEach((inLink) => {\n\t\t\tconst srcNode = this.ap.getNode(inLink.srcNodeId);\n\t\t\tif (srcNode) {\n\t\t\t\tsrcNodes.push(srcNode);\n\t\t\t}\n\t\t});\n\t\treturn srcNodes;\n\t}\n\n\tgetTrgNodes(outputLinks) {\n\t\tconst trgNodes = [];\n\t\toutputLinks.forEach((outLink) => {\n\t\t\tconst trgNode = this.ap.getNode(outLink.trgNodeId);\n\t\t\tif (trgNode) {\n\t\t\t\ttrgNodes.push(trgNode);\n\t\t\t}\n\t\t});\n\t\treturn trgNodes;\n\t}\n\n\tgetAssocNodes(assocLinks, node) {\n\t\tconst assocNodes = [];\n\t\tassocLinks.forEach((assocLink) => {\n\t\t\tconst nodeId = assocLink.srcNodeId === node.id ? assocLink.trgNodeId : assocLink.srcNodeId;\n\t\t\tconst assocNode = this.ap.getNode(nodeId);\n\t\t\tif (assocNode) {\n\t\t\t\tassocNodes.push(assocNode);\n\t\t\t}\n\t\t});\n\t\treturn assocNodes;\n\t}\n\n\tgetConnectedComments(commentLinks) {\n\t\tconst connectedComments = [];\n\t\tcommentLinks.forEach((commentLink) => {\n\t\t\tconst com = this.ap.getComment(commentLink.srcNodeId);\n\t\t\tif (com) {\n\t\t\t\tconnectedComments.push(com);\n\t\t\t}\n\t\t});\n\t\treturn connectedComments;\n\t}\n\n\tsortTabGroups(tg1, tg2) {\n\t\tconst y1 = this.getTagGroupYCoord(tg1);\n\t\tconst y2 = this.getTagGroupYCoord(tg2);\n\n\t\tif (y1 > y2) {\n\t\t\treturn 1;\n\t\t} else if (y1 === y2) {\n\t\t\tconst x1 = this.getTagGroupXCoord(tg1);\n\t\t\tconst x2 = this.getTagGroupXCoord(tg2);\n\t\t\tif (x1 > x2) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\tgetTagGroupYCoord(tg) {\n\t\tif (tg.type === \"link\") {\n\t\t\treturn tg.obj.srcPos.y_pos;\n\t\t}\n\t\treturn tg.obj.y_pos;\n\t}\n\n\tgetTagGroupXCoord(tg) {\n\t\tif (tg.type === \"link\") {\n\t\t\treturn tg.obj.srcPos.x_pos;\n\t\t}\n\t\treturn tg.obj.x_pos;\n\t}\n\n\tgetInputDataLinks(node) {\n\t\treturn this.ap.pipeline.links.filter((l) => l.type === NODE_LINK && l.trgNodeId === node.id);\n\t}\n\n\tgetOutputDataLinks(node) {\n\t\treturn this.ap.pipeline.links.filter((l) => l.type === NODE_LINK && l.srcNodeId === node.id);\n\t}\n\n\tgetAssociationLinks(node) {\n\t\treturn this.ap.pipeline.links.filter((l) => l.type === ASSOCIATION_LINK && (l.srcNodeId === node.id || l.trgNodeId === node.id));\n\t}\n\n\tgetCommentLinks(node) {\n\t\treturn this.ap.pipeline.links.filter((l) => l.type === COMMENT_LINK && l.trgNodeId === node.id);\n\t}\n\n\tnodeHasInputLinks(node) {\n\t\tif (node.inputs && node.inputs.length > 0) {\n\t\t\tconst linksTo = this.getLinksToNode(node, NODE_LINK);\n\t\t\treturn linksTo.length > 0;\n\t\t}\n\t\treturn false;\n\t}\n\n\tnodeHasAssocLinks(node) {\n\t\tconst links = this.getAssocLinksForNode(node);\n\t\treturn (links.length > 0);\n\t}\n\n\tcommentHasLinks(comment) {\n\t\treturn this.getLinksFromComment(comment).length > 0;\n\t}\n\n\tgetNextTabGroupStartObject(focusObj) {\n\t\tif (this.tabObjects.length === 0) {\n\t\t\treturn null;\n\t\t}\n\t\tif (!focusObj || focusObj === CANVAS_FOCUS) {\n\t\t\treturn this.tabObjects[0].obj;\n\t\t}\n\n\t\tconst localObj = this.getLocalObject(focusObj);\n\t\tlet index = this.tabObjects.findIndex((tg) => tg.obj.grp === localObj?.grp && tg.obj.id === localObj?.id);\n\n\t\t// If we don't find an exact match, look for the first tab object that is in the\n\t\t// same group as the object passed in.\n\t\tif (index === -1) {\n\t\t\tindex = this.tabObjects.findIndex((tg) => tg.obj.grp === localObj?.grp);\n\t\t}\n\n\t\tif (index === this.tabObjects.length - 1) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.tabObjects[index + 1].obj;\n\t}\n\n\tgetPreviousTabGroupStartObject(focusObj) {\n\t\tif (this.tabObjects.length === 0) {\n\t\t\treturn null;\n\t\t}\n\t\tif (!focusObj || focusObj === CANVAS_FOCUS) {\n\t\t\treturn this.tabObjects[this.tabObjects.length - 1].obj;\n\t\t}\n\n\t\tconst localObj = this.getLocalObject(focusObj);\n\t\tlet index = this.tabObjects.findIndex((tg) => tg.obj.grp === localObj?.grp && tg.obj.id === localObj?.id);\n\n\t\t// If we don't find an exact match, look for the last tab object that is in the\n\t\t// same group as the object passed in.\n\t\tif (index === -1) {\n\t\t\tindex = this.tabObjects.findLastIndex((tg) => tg.obj.grp === localObj?.grp);\n\t\t}\n\n\t\tif (index < 1) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.tabObjects[index - 1].obj;\n\t}\n\n\t// Returns one of the locally cached objects (cached in the active pipeline)\n\t// with the same ID as the one passed in. We use the cached object because it\n\t// will have the 'grp' field set appropriately.\n\tgetLocalObject(focusObj) {\n\t\treturn this.ap.pipeline.nodes.find((n) => n.id === focusObj.id) ||\n\t\t\tthis.ap.pipeline.links.find((l) => l.id === focusObj.id) ||\n\t\t\tthis.ap.pipeline.comments.find((c) => c.id === focusObj.id);\n\t}\n\n\tgetAllLinksForNode(node) {\n\t\tconst linkInfos = [];\n\t\tconst dataLinksFrom = this.getLinksFromNode(node, NODE_LINK);\n\t\tdataLinksFrom.forEach((link) => { linkInfos.push({ link: link, type: \"node\", obj: link.srcObj }); });\n\n\t\tconst dataLinksTo = this.getLinksToNode(node, NODE_LINK);\n\t\tdataLinksTo.forEach((link) => { linkInfos.push({ link: link, type: \"node\", obj: link.trgNode }); });\n\n\t\tconst assocLinksFrom = this.getLinksFromNode(node, ASSOCIATION_LINK);\n\t\tassocLinksFrom.forEach((link) => { linkInfos.push({ link: link, type: \"node\", obj: link.srcObj }); });\n\n\t\tconst assocLinksTo = this.getLinksToNode(node, ASSOCIATION_LINK);\n\t\tassocLinksTo.forEach((link) => { linkInfos.push({ link: link, type: \"node\", obj: link.trgNode }); });\n\n\t\tconst commentLinksFrom = this.getLinksToNode(node, COMMENT_LINK);\n\t\tcommentLinksFrom.forEach((link) => { linkInfos.push({ link: link, type: \"comment\", obj: this.ap.getComment(link.srcNodeId) }); });\n\n\t\treturn linkInfos;\n\t}\n\n\tgetNextLinksFromNode(node) {\n\t\tconst linkInfos = [];\n\t\tconst dataLinksFrom = this.getLinksFromNode(node, NODE_LINK);\n\t\tdataLinksFrom.forEach((link) => { linkInfos.push({ link: link, type: \"node\", obj: this.ap.getNode(link.trgNodeId) }); });\n\n\t\tconst assocLinksFrom = this.getLinksFromNode(node, ASSOCIATION_LINK);\n\t\tassocLinksFrom.forEach((link) => { linkInfos.push({ link: link, type: \"node\", obj: this.ap.getNode(node.id === link.srcNodeId ? link.trgNodeId : link.srcNodeId) }); });\n\n\t\tconst assocLinksTo = this.getLinksToNode(node, ASSOCIATION_LINK);\n\t\tassocLinksTo.forEach((link) => { linkInfos.push({ link: link, type: \"node\", obj: link.trgNode }); });\n\n\t\tconst commentLinksFrom = this.getLinksToNode(node, COMMENT_LINK);\n\t\tcommentLinksFrom.forEach((link) => { linkInfos.push({ link: link, type: \"comment\", obj: this.ap.getComment(link.srcNodeId) }); });\n\n\t\treturn linkInfos;\n\t}\n\n\tgetNextLinksFromComment(comment) {\n\t\tconst linkInfos = [];\n\t\tconst commentLinksFrom = this.getLinksFromComment(comment);\n\t\tcommentLinksFrom.forEach((link) => { linkInfos.push({ link: link, type: \"node\", obj: this.ap.getNode(link.trgNodeId) }); });\n\n\t\treturn linkInfos;\n\t}\n\n\tgetNextSiblingLink(link) {\n\t\t// If link is fully detached, there are no sibling links.\n\t\tif (link.srcPos && link.trgPos) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst navObject = link.navObject ? link.navObject : link.srcObj;\n\n\t\tconst linkInfos = CanvasUtils.isNode(navObject)\n\t\t\t? this.getAllLinksForNode(navObject)\n\t\t\t: this.getNextLinksFromComment(navObject);\n\n\t\tconst index = linkInfos.findIndex((li) => li.link.id === link.id);\n\t\tif (index > -1) {\n\t\t\tif (index === linkInfos.length - 1) {\n\t\t\t\treturn linkInfos[0].link;\n\t\t\t}\n\t\t\treturn linkInfos[index + 1].link;\n\t\t}\n\t\treturn null;\n\t}\n\n\tgetPreviousSiblingLink(link) {\n\t\t// If link is fully detached, there are no sibling links.\n\t\tif (link.srcPos && link.trgPos) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst navObject = link.navObject ? link.navObject : link.srcObj;\n\n\t\tconst linkInfos = CanvasUtils.isNode(navObject)\n\t\t\t? this.getAllLinksForNode(navObject)\n\t\t\t: this.getNextLinksFromComment(navObject);\n\n\t\tconst index = linkInfos.findIndex((li) => li.link.id === link.id);\n\t\tif (index > -1) {\n\t\t\tif (index === 0) {\n\t\t\t\treturn linkInfos[linkInfos.length - 1].link;\n\t\t\t}\n\t\t\treturn linkInfos[index - 1].link;\n\t\t}\n\t\treturn null;\n\t}\n\n\tgetNextNodeFromDataLink(link) {\n\t\treturn this.ap.getNode(link.trgNodeId);\n\t}\n\n\tgetNextNodeFromAssocLink(link) {\n\t\tif (link.srcNodeId === link.navObject?.id) {\n\t\t\treturn link.trgNode;\n\t\t}\n\t\treturn link.srcObj;\n\t}\n\n\tgetNextObjectFromCommentLink(link) {\n\t\tif (link.srcNodeId === link.navObject?.id) {\n\t\t\treturn link.trgNode;\n\t\t}\n\t\treturn link.srcObj;\n\t}\n\n\tgetPreviousLinksToNode(node) {\n\t\tconst linkInfos = [];\n\t\tconst dataLinksTo = this.getLinksToNode(node, NODE_LINK);\n\t\tdataLinksTo.forEach((link) => { linkInfos.push({ link: link, type: \"node\", obj: this.ap.getNode(link.trgNodeId) }); });\n\n\t\treturn linkInfos;\n\t}\n\n\tgetPreviousNodeFromDataLink(link) {\n\t\treturn link.srcObj;\n\t}\n\n\tgetPreviousNodeFromAssocLink(link) {\n\t\tif (link.srcObjId === link.navObject.id) {\n\t\t\treturn link.srcObj;\n\t\t}\n\t\treturn link.trgNode;\n\t}\n\n\tgetPreviousObjectFromCommentLink(link) {\n\t\tif (link.srcObjId === link.navObject.id) {\n\t\t\treturn link.srcObj;\n\t\t}\n\t\treturn link.trgNode;\n\t}\n\n\t// Returns an array of links that go to the node passed in, of the type\n\t// specified.\n\tgetLinksToNode(node, type) {\n\t\treturn this.ap.pipeline.links.filter((l) => l.type === type && l.trgNodeId === node.id);\n\t}\n\n\t// Returns an array of links that go from the node passed in, of the type\n\t// specified.\n\tgetLinksFromNode(node, type) {\n\t\treturn this.ap.pipeline.links.filter((l) => l.type === type && l.srcNodeId === node.id);\n\t}\n\n\tgetAssocLinksForNode(node) {\n\t\treturn this.ap.pipeline.links.filter((l) => l.type === ASSOCIATION_LINK && (l.srcNodeId === node.id || l.trgNodeId === node.id));\n\t}\n\n\tgetLinksFromComment(comment) {\n\t\treturn this.ap.pipeline.links.filter((l) => l.srcNodeId === comment.id);\n\t}\n\n\t/* ------------------------------------------------------------------------------- */\n\t/* Focus functions for sub-objects. */\n\t/* ------------------------------------------------------------------------------- */\n\n\t// Returns the next sub-object, after the subObject passed in, from\n\t// the set of focusable sub-objects.\n\tgetNextSubObject(obj, subObject) {\n\t\tconst subObjs = this.getFocusableSubObjects(obj);\n\n\t\tif (!subObject) {\n\t\t\treturn subObjs[0];\n\t\t}\n\n\t\tlet index = subObjs.findIndex((so) => so.type === subObject.type && so.obj.id === subObject.obj.id);\n\t\tindex++;\n\n\t\tif (index > subObjs.length - 1) {\n\t\t\tindex = 0;\n\t\t}\n\n\t\treturn subObjs[index];\n\t}\n\n\t// Returns the previous sub-object, before the subObject passed in, from\n\t// the set of focusable sub-objects.\n\tgetPreviousSubObject(obj, subObject) {\n\t\tconst subObjs = this.getFocusableSubObjects(obj);\n\n\t\tif (!subObject) {\n\t\t\treturn subObjs[subObjs.length - 1];\n\t\t}\n\n\t\tlet index = subObjs.findIndex((so) => so.type === subObject.type && so.obj.id === subObject.obj.id);\n\t\tindex--;\n\n\t\tif (index < 0) {\n\t\t\tindex = subObjs.length - 1;\n\t\t}\n\n\t\treturn subObjs[index];\n\t}\n\n\t// Returns an array of focusable sub-elements of a node or link. These are items within\n\t// the node or link that the user might want to interact with using the keyboard such\n\t// as: visible, focusable ports or focusable decorations\n\tgetFocusableSubObjects(d) {\n\t\tconst focusableSubElements = [];\n\t\tconst objType = CanvasUtils.getObjectTypeName(d);\n\n\t\tif (objType === \"node\") {\n\t\t\tif (d.inputs && d.layout.inputPortDisplay && d.layout.inputPortFocusable) {\n\t\t\t\td.inputs.forEach((ip) => {\n\t\t\t\t\tfocusableSubElements.push({ type: \"inputPort\", obj: ip });\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (d.outputs && d.layout.outputPortDisplay && d.layout.outputPortFocusable) {\n\t\t\t\td.outputs.forEach((op) => {\n\t\t\t\t\tfocusableSubElements.push({ type: \"outputPort\", obj: op });\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (d.focusFunction) {\n\t\t\t\tfocusableSubElements.push({ type: \"reactObject\", obj: d });\n\t\t\t}\n\t\t}\n\n\t\tif (objType === \"link\" &&\n\t\t\t\td.type === NODE_LINK &&\n\t\t\t\t(this.ap.config.enableLinkSelection === LINK_SELECTION_HANDLES ||\n\t\t\t\tthis.ap.config.enableLinkSelection === LINK_SELECTION_DETACHABLE))\n\t\t{\n\t\t\tfocusableSubElements.push({ type: \"linkStart\", obj: d });\n\t\t}\n\n\n\t\t// Decorations apply for nodes AND links\n\t\tif (d.decorations) {\n\t\t\td.decorations.forEach((dec) => {\n\t\t\t\tif (dec.focusable) {\n\t\t\t\t\tfocusableSubElements.push({ type: \"decoration\", obj: dec });\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (objType === \"link\" &&\n\t\t\td.type === NODE_LINK &&\n\t\t\t(this.ap.config.enableLinkSelection === LINK_SELECTION_HANDLES ||\n\t\t\tthis.ap.config.enableLinkSelection === LINK_SELECTION_DETACHABLE))\n\t\t{\n\t\t\tfocusableSubElements.push({ type: \"linkEnd\", obj: d });\n\t\t}\n\n\t\treturn focusableSubElements;\n\t}\n}\n","/*\n * Copyright 2017-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* eslint brace-style: \"off\" */\n\nimport { isEmpty } from \"lodash\";\nimport Logger from \"../logging/canvas-logger.js\";\nimport CanvasUtils from \"./common-canvas-utils.js\";\nimport { COMMENT_LINK, NODE_LINK } from \"./constants/canvas-constants\";\nimport SvgCanvasAccessibility from \"./svg-canvas-utils-accessibility.js\";\n\n\nexport default class SVGCanvasPipeline {\n\tconstructor(pipelineId, config, canvasInfo, selectionInfo) {\n\t\tthis.logger = new Logger(\"SVGCanvasActivePipeline\");\n\t\tthis.logger.log(\"constructor - start\");\n\n\t\tthis.initialize(pipelineId, config, canvasInfo, selectionInfo);\n\n\t\tthis.logger.log(\"constructor - end\");\n\t}\n\n\tinitialize(pipelineId, config, canvasInfo, selectionInfo) {\n\t\tthis.logger.logStartTimer(\"initialize\");\n\t\tthis.config = config;\n\t\tthis.canvasInfo = canvasInfo;\n\t\tthis.selections = selectionInfo.pipelineId === pipelineId ? selectionInfo.selections : [];\n\t\tthis.pipeline = this.getPipeline(pipelineId, canvasInfo);\n\n\t\t// These variables are accessed directly by svg-canvas-renderer\n\t\tthis.id = this.pipeline.id;\n\t\tthis.zoom = this.pipeline.zoom;\n\t\tthis.nodes = this.pipeline.nodes;\n\t\tthis.comments = this.pipeline.comments;\n\t\tthis.links = this.pipeline.links;\n\n\t\t// We create mapped arrays for quick lookup\n\t\tthis.mappedNodes = this.getMappedArray(this.pipeline.nodes);\n\t\tthis.mappedComments = this.getMappedArray(this.pipeline.comments);\n\t\tthis.mappedLinks = this.getMappedArray(this.pipeline.links);\n\n\t\t// preProcessPipeline uses the mapped objects so this needs to be done\n\t\t// after they have been created.\n\t\tthis.pipeline = this.preProcessPipeline(this.pipeline);\n\n\t\t// Create an object to help us with handling accessibility, in\n\t\t// particular, handling keyboard navigation within the flow. Make\n\t\t// sure to do this after the mappedXXX arrays have been created.\n\t\tthis.accessibility = null;\n\n\t\tthis.logger.logEndTimer(\"initialize\");\n\t}\n\n\t// Returns the accessibility object. This saves the accessibility object\n\t// from being generated until one of the keyboard navigation calls (below)\n\t// are made. Those calls will only be made when the config field\n\t// enableKeyboardNavigation is true.\n\tgetAccessibility() {\n\t\tif (this.accessibility) {\n\t\t\treturn this.accessibility;\n\t\t}\n\t\tthis.accessibility = new SvgCanvasAccessibility(this);\n\t\treturn this.accessibility;\n\t}\n\n\tgetAllLinksForNode(node) {\n\t\treturn this.getAccessibility().getAllLinksForNode(node);\n\t}\n\n\tgetNextLinksFromNode(node) {\n\t\treturn this.getAccessibility().getNextLinksFromNode(node);\n\t}\n\n\tgetPreviousLinksToNode(node) {\n\t\treturn this.getAccessibility().getPreviousLinksToNode(node);\n\t}\n\n\tgetPreviousNodeFromDataLink(link) {\n\t\treturn this.getAccessibility().getPreviousNodeFromDataLink(link);\n\t}\n\n\tgetPreviousNodeFromAssocLink(link) {\n\t\treturn this.getAccessibility().getPreviousNodeFromAssocLink(link);\n\t}\n\n\tgetPreviousObjectFromCommentLink(link) {\n\t\treturn this.getAccessibility().getPreviousObjectFromCommentLink(link);\n\t}\n\n\tgetNextLinksFromComment(comment) {\n\t\treturn this.getAccessibility().getNextLinksFromComment(comment);\n\t}\n\n\tgetNextNodeFromDataLink(link) {\n\t\treturn this.getAccessibility().getNextNodeFromDataLink(link);\n\t}\n\n\tgetNextNodeFromAssocLink(link) {\n\t\treturn this.getAccessibility().getNextNodeFromAssocLink(link);\n\t}\n\n\tgetNextObjectFromCommentLink(link) {\n\t\treturn this.getAccessibility().getNextObjectFromCommentLink(link);\n\t}\n\n\tgetNextSiblingLink(link) {\n\t\treturn this.getAccessibility().getNextSiblingLink(link);\n\t}\n\n\tgetPreviousSiblingLink(link) {\n\t\treturn this.getAccessibility().getPreviousSiblingLink(link);\n\t}\n\n\tgetNextTabGroupStartObject(focusObj) {\n\t\treturn this.getAccessibility().getNextTabGroupStartObject(focusObj);\n\t}\n\n\tgetPreviousTabGroupStartObject(focusObj) {\n\t\treturn this.getAccessibility().getPreviousTabGroupStartObject(focusObj);\n\t}\n\n\tgetCanvasDimensions(gap) {\n\t\treturn CanvasUtils.getCanvasDimensions(\n\t\t\tthis.pipeline.nodes, this.pipeline.comments,\n\t\t\tthis.pipeline.links, gap);\n\t}\n\n\t// Returns the name of the type of object d.\n\tgetObjectTypeName(d) {\n\t\tif (this.getComment(d.id)) {\n\t\t\treturn \"comment\";\n\t\t} else if (this.getNode(d.id)) {\n\t\t\treturn \"node\";\n\t\t}\n\t\treturn \"link\";\n\t}\n\n\tgetNode(nodeId) {\n\t\tconst node = this.mappedNodes[nodeId];\n\t\treturn (typeof node === \"undefined\") ? null : node;\n\t}\n\n\t// Returns nodes from the active pipeline. If nodeIds is\n\t// provided as an array the nodes corresponding to those IDs\n\t// are returned otherwise all nodes are returned.\n\tgetNodes(nodeIds) {\n\t\tif (!nodeIds) {\n\t\t\treturn this.pipeline.nodes;\n\t\t}\n\t\tconst nodes = [];\n\t\tnodeIds.forEach((nId) => {\n\t\t\tconst n = this.getNode(nId);\n\t\t\tif (n) {\n\t\t\t\tnodes.push(n);\n\t\t\t}\n\t\t});\n\t\treturn nodes;\n\t}\n\n\tgetSupernodes() {\n\t\treturn this.pipeline.nodes.filter((node) => CanvasUtils.isSupernode(node));\n\t}\n\n\t// Returns true if the pipeline is empty except for any binding nodes.\n\tisEmptyOrBindingsOnly() {\n\t\treturn (isEmpty(this.pipeline.nodes) || this.containsOnlyBindingNodes()) &&\n\t\t\t\t\t\tisEmpty(this.pipeline.comments) && isEmpty(this.pipeline.links);\n\t}\n\n\tcontainsOnlyBindingNodes() {\n\t\treturn !this.pipeline.nodes.find((node) => !CanvasUtils.isSuperBindingNode(node));\n\t}\n\n\tgetComment(commentId) {\n\t\tconst com = this.mappedComments[commentId];\n\t\treturn (typeof com === \"undefined\") ? null : com;\n\t}\n\n\tgetComments(commentIds) {\n\t\tconst comments = [];\n\t\tcommentIds.forEach((cId) => {\n\t\t\tconst c = this.getComment(cId);\n\t\t\tif (c) {\n\t\t\t\tcomments.push(c);\n\t\t\t}\n\t\t});\n\t\treturn comments;\n\t}\n\n\tgetNodesAndComments() {\n\t\treturn this.pipeline.nodes.concat(this.pipeline.comments);\n\t}\n\n\tgetNodeOrComment(id) {\n\t\tlet obj = this.getNode(id);\n\t\tif (obj === null) {\n\t\t\tobj = this.getComment(id);\n\t\t}\n\t\treturn obj;\n\t}\n\n\tgetLink(linkId) {\n\t\tconst link = this.mappedLinks[linkId];\n\t\treturn (typeof link === \"undefined\") ? null : link;\n\t}\n\n\tgetLinks(linkIds) {\n\t\tconst links = [];\n\t\tlinkIds.forEach((lId) => {\n\t\t\tconst l = this.getLink(lId);\n\t\t\tif (l) {\n\t\t\t\tlinks.push(l);\n\t\t\t}\n\t\t});\n\t\treturn links;\n\t}\n\n\t// Replaces the link in the links array with the one passed in.\n\treplaceLink(oldLink) {\n\t\tconst index = this.pipeline.links.findIndex((l) => l.id === oldLink.id);\n\t\tthis.pipeline.links.splice(index, 1, oldLink);\n\t\tthis.mappedLinks = this.getMappedArray(this.pipeline.links);\n\t}\n\n\tgetPipeline(pipelineId, canvasInfo) {\n\t\tconst pipeline = canvasInfo.pipelines.find((p) => p.id === pipelineId);\n\t\tif (pipeline) {\n\t\t\treturn pipeline;\n\t\t}\n\t\treturn { id: pipelineId, nodes: [], comments: [], links: [] };\n\t}\n\n\t// Preprocesses the pipeline to set the connected attribute of the ports\n\t// for each node. This is used when rendering the connection status of ports.\n\tpreProcessPipeline(pipeline) {\n\t\tthis.setAllPortsDisconnected(pipeline);\n\n\t\tpipeline.links.forEach((link) => {\n\t\t\tif (link.type === COMMENT_LINK) {\n\t\t\t\tlink.srcObj = this.getComment(link.srcNodeId);\n\t\t\t\tlink.trgNode = this.getNode(link.trgNodeId);\n\n\t\t\t} else {\n\t\t\t\t// For node (port) and association links, we need to set the srcObj\n\t\t\t\t// and trgNode field for the link.\n\t\t\t\tlink.srcObj = this.getNode(link.srcNodeId);\n\t\t\t\tlink.trgNode = this.getNode(link.trgNodeId);\n\n\t\t\t\t// For node (port) links, we need to set the isConnected field\n\t\t\t\t// for each port.\n\t\t\t\tif (link.type === NODE_LINK) {\n\t\t\t\t\tif (link.srcObj) {\n\t\t\t\t\t\tthis.setOutputPortConnected(link.srcObj, link.srcNodePortId);\n\t\t\t\t\t}\n\t\t\t\t\tif (link.trgNode) {\n\t\t\t\t\t\tthis.setInputPortConnected(link.trgNode, link.trgNodePortId);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn pipeline;\n\t}\n\n\t// Sets the isConnected property of all ports in the pipeline to false.\n\tsetAllPortsDisconnected(pipeline) {\n\t\tpipeline.nodes.forEach((n) => {\n\t\t\tif (n.inputs) {\n\t\t\t\tn.inputs.forEach((inp) => (inp.isConnected = false));\n\t\t\t}\n\t\t\tif (n.outputs) {\n\t\t\t\tn.outputs.forEach((out) => (out.isConnected = false));\n\t\t\t}\n\t\t});\n\t}\n\n\t// Sets the isConnected property of the port, identified by inPortId,\n\t// for the trgNode to true.\n\tsetInputPortConnected(trgNode, inPortId) {\n\t\tconst portId = inPortId || CanvasUtils.getDefaultInputPortId(trgNode);\n\t\tif (trgNode.inputs) {\n\t\t\ttrgNode.inputs.forEach((inp) => {\n\t\t\t\tif (inp.id === portId) {\n\t\t\t\t\tinp.isConnected = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t// Sets the isConnected property of the port, identified by outPortId,\n\t// for the srcNode to true.\n\tsetOutputPortConnected(srcNode, outPortId) {\n\t\tconst portId = outPortId || CanvasUtils.getDefaultOutputPortId(srcNode);\n\t\tif (srcNode.outputs) {\n\t\t\tsrcNode.outputs.forEach((out) => {\n\t\t\t\tif (out.id === portId) {\n\t\t\t\t\tout.isConnected = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t// Returns an object where each element in the array provided is indexed by\n\t// the id property of the element.\n\tgetMappedArray(array) {\n\t\treturn array.reduce((map, o) => { map[o.id] = o; return map; }, {});\n\t}\n\n\t// Returns the IDs of the selected objects for this pipeline.\n\tgetSelectedObjectIds() {\n\t\treturn this.selections;\n\t}\n\n\t// Returns an array of any currently selected nodes and comments.\n\tgetSelectedNodesAndComments() {\n\t\tvar objs = this.getSelectedNodes();\n\n\t\tthis.comments.forEach((comment) => {\n\t\t\tif (this.getSelectedObjectIds().includes(comment.id)) {\n\t\t\t\tobjs.push(comment);\n\t\t\t}\n\t\t});\n\t\treturn objs;\n\t}\n\n\t// Returns an array of any currently selected nodes in the same order\n\t// the IDs appear in the selected objects IDs array.\n\tgetSelectedNodes() {\n\t\tvar objs = [];\n\t\tthis.getSelectedObjectIds().forEach((id) => {\n\t\t\tconst node = this.getNode(id);\n\t\t\tif (node) {\n\t\t\t\tobjs.push(node);\n\t\t\t}\n\t\t});\n\t\treturn objs;\n\t}\n\n\t// Returns an array of any currently selected comments in the same order\n\t// the IDs appear in the selected objects IDs array.\n\tgetSelectedComments() {\n\t\tvar objs = [];\n\t\tthis.getSelectedObjectIds().forEach((id) => {\n\t\t\tconst com = this.getComment(id);\n\t\t\tif (com) {\n\t\t\t\tobjs.push(com);\n\t\t\t}\n\t\t});\n\t\treturn objs;\n\t}\n\n\t// Returns an array of any currently selected node IDs.\n\tgetSelectedNodeIds() {\n\t\treturn this.getSelectedNodes().map((n) => n.id);\n\t}\n\n\t// Returns an array of any currently selected links\n\tgetSelectedLinks() {\n\t\tvar objs = [];\n\t\tthis.links.forEach((link) => {\n\t\t\tif (this.getSelectedObjectIds().includes(link.id)) {\n\t\t\t\tobjs.push(link);\n\t\t\t}\n\t\t});\n\t\treturn objs;\n\t}\n\n\t// Returns an array of selected detached links. Detached links are recognized\n\t// if they have either a srcPos or trgPos field which holds the coordinates\n\t// of the source or target of the link. If they have one of these fields they\n\t// are semi-detached and if they have both they are fully detached.\n\tgetSelectedDetachedLinks() {\n\t\treturn this.getSelectedLinks().filter((l) => l.srcPos || l.trgPos);\n\t}\n\n\t// Returns the number of selected links.\n\tgetSelectedLinksCount() {\n\t\treturn this.getSelectedLinks().length;\n\t}\n\n\tisSelected(objId) {\n\t\treturn this.getSelectedObjectIds().indexOf(objId) >= 0;\n\t}\n\n\t/* ------------------------------------------------------------------------------- */\n\t/* Focus functions for sub-objects. */\n\t/* ------------------------------------------------------------------------------- */\n\n\t// Returns the next sub-object after subObject from the set of focusable sub-objects.\n\tgetNextSubObject(obj, subObject) {\n\t\treturn this.getAccessibility().getNextSubObject(obj, subObject);\n\t}\n\n\t// Returns the previous sub-object before subOject from the set of focusable sub-objects.\n\tgetPreviousSubObject(obj, subObject) {\n\t\treturn this.getAccessibility().getPreviousSubObject(obj, subObject);\n\t}\n\n\t// Returns an array of focusable sub-elements of a node or link. If the object\n\t// is a node they might be visible ports or focusable decorations. If the\n\t// object is a link they might be focusable decorations or start and end\n\t// points of detached links.\n\tgetFocusableSubObjects(d) {\n\t\treturn this.getAccessibility().getFocusableSubObjects(d);\n\t}\n}\n","/*\n * Copyright 2017-2026 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint no-invalid-this: \"off\" */\n/* eslint brace-style: \"off\" */\n/* eslint no-lonely-if: \"off\" */\n\n// Import just the D3 modules that are needed and combine them as the 'd3' object.\nimport * as d3Selection from \"d3-selection\";\nimport * as d3Fetch from \"d3-fetch\";\nconst d3 = Object.assign({}, d3Selection, d3Fetch);\nimport markdownIt from \"markdown-it\";\n\nimport { escape as escapeText, forOwn, get } from \"lodash\";\nimport { ASSOC_RIGHT_SIDE_CURVE, ASSOCIATION_LINK, NODE_LINK, COMMENT_LINK,\n\tASSOC_VAR_CURVE_LEFT, ASSOC_VAR_CURVE_RIGHT, ASSOC_VAR_DOUBLE_BACK_RIGHT,\n\tLINK_TYPE_ELBOW, LINK_TYPE_STRAIGHT, LINK_TYPE_CURVE,\n\tLINK_DIR_LEFT_RIGHT, LINK_DIR_RIGHT_LEFT, LINK_DIR_TOP_BOTTOM, LINK_DIR_BOTTOM_TOP,\n\tLINK_METHOD_FREEFORM, LINK_METHOD_PORTS,\n\tLINK_SELECTION_NONE, LINK_SELECTION_HANDLES, LINK_SELECTION_DETACHABLE,\n\tCONTEXT_MENU_BUTTON, DEC_LINK, DEC_NODE, EDIT_ICON,\n\tNODE_MENU_ICON, SUPER_NODE_EXPAND_ICON,\n\tPORT_DISPLAY_CIRCLE, PORT_DISPLAY_CIRCLE_WITH_ARROW, PORT_DISPLAY_IMAGE, PORT_DISPLAY_JSX,\n\tTIP_TYPE_NODE, TIP_TYPE_PORT, TIP_TYPE_DEC, TIP_TYPE_LINK,\n\tUSE_DEFAULT_ICON, USE_DEFAULT_EXT_ICON,\n\tSUPER_NODE, SNAP_TO_GRID_AFTER, SNAP_TO_GRID_DURING,\n\tNORTH, SOUTH, EAST, WEST,\n\tWYSIWYG, CAUSE_KEYBOARD, CAUSE_MOUSE,\n\tFLOW_IN, FLOW_OUT,\n\tSHAPE_PORT_ARCS, SHAPE_RECTANGLE_ROUNDED_CORNERS,\n\tPORT_WIDTH_DEFAULT, PORT_HEIGHT_DEFAULT,\n\tSINGLE_CLICK, SINGLE_CLICK_CONTEXTMENU, DOUBLE_CLICK,\n\tDISPLAY_GRID_DOTS, DISPLAY_GRID_DOTS_AND_LINES, DISPLAY_GRID_BOXES, DISPLAY_GRID_BOXES_AND_LINES,\n\tCANVAS_FOCUS\n} from \"./constants/canvas-constants\";\nimport SUPERNODE_ICON from \"../../assets/images/supernode.svg\";\nimport SUPERNODE_EXT_ICON from \"../../assets/images/supernode_ext.svg\";\nimport Logger from \"../logging/canvas-logger.js\";\nimport CanvasUtils from \"./common-canvas-utils.js\";\nimport KeyboardUtils from \"./keyboard-utils.js\";\nimport SvgCanvasDisplay from \"./svg-canvas-utils-display.js\";\nimport SvgCanvasNodes from \"./svg-canvas-utils-nodes.js\";\nimport SvgCanvasComments from \"./svg-canvas-utils-comments.js\";\nimport SvgCanvasLinks from \"./svg-canvas-utils-links.js\";\nimport SvgCanvasDecs from \"./svg-canvas-utils-decs.js\";\nimport SvgCanvasExternal from \"./svg-canvas-utils-external.js\";\nimport SvgCanvasTextArea from \"./svg-canvas-utils-textarea.js\";\nimport SvgCanvasDragObject from \"./svg-canvas-utils-drag-objects.js\";\nimport SvgCanvasDragLink from \"./svg-canvas-utils-drag-link.js\";\nimport SvgCanvasDragNewLink from \"./svg-canvas-utils-drag-new-link.js\";\nimport SvgCanvasDragDetLink from \"./svg-canvas-utils-drag-det-link.js\";\nimport SvgCanvasZoom from \"./svg-canvas-utils-zoom.js\";\nimport SVGCanvasPipeline from \"./svg-canvas-pipeline\";\n\nexport default class SVGCanvasRenderer {\n\tconstructor(pipelineId, canvasDiv, canvasController, canvasInfo, selectionInfo, breadcrumbs, nodeLayout, canvasLayout, config, supernodeInfo = {}) {\n\t\tthis.logger = new Logger([\"SVGCanvasRenderer\", \"PipeId\", pipelineId]);\n\t\tthis.logger.logStartTimer(\"constructor - \" + pipelineId.substring(0, 5));\n\t\tthis.pipelineId = pipelineId;\n\t\tthis.supernodeInfo = supernodeInfo; // Contents will be 'empty object' in case of primary pipeline renderer\n\t\tthis.canvasDiv = canvasDiv;\n\t\tthis.canvasInfo = canvasInfo;\n\t\tthis.selectionInfo = selectionInfo;\n\t\tthis.breadcrumbs = breadcrumbs;\n\t\tthis.nodeLayout = nodeLayout;\n\t\tthis.canvasLayout = canvasLayout;\n\t\tthis.config = config;\n\t\tthis.canvasController = canvasController;\n\t\tthis.activePipeline = new SVGCanvasPipeline(pipelineId, config, canvasInfo, selectionInfo);\n\n\t\t// An array of renderers for the supernodes on the canvas.\n\t\tthis.superRenderers = [];\n\n\t\t// Our instance ID for adding to DOM element IDs\n\t\tthis.instanceId = this.canvasController.getInstanceId();\n\n\t\tthis.dispUtils = new SvgCanvasDisplay(this.canvasController, this.supernodeInfo.d3Selection, this.pipelineId, breadcrumbs);\n\t\tthis.nodeUtils = new SvgCanvasNodes(this.canvasLayout);\n\t\tthis.commentUtils = new SvgCanvasComments();\n\t\tthis.linkUtils = new SvgCanvasLinks(this.config, this.canvasLayout, this.nodeUtils, this.commentUtils);\n\t\tthis.decUtils = new SvgCanvasDecs(this.canvasLayout);\n\t\tthis.dragObjectUtils = new SvgCanvasDragObject(this);\n\t\tthis.dragLinkUtils = new SvgCanvasDragLink(this);\n\t\tthis.dragNewLinkUtils = new SvgCanvasDragNewLink(this);\n\t\tthis.dragDetLinkUtils = new SvgCanvasDragDetLink(this);\n\t\tthis.zoomUtils = new SvgCanvasZoom(this);\n\t\tthis.externalUtils = new SvgCanvasExternal(this);\n\t\tthis.svgCanvasTextArea = new SvgCanvasTextArea(\n\t\t\tthis.config,\n\t\t\tthis.dispUtils,\n\t\t\tthis.nodeUtils,\n\t\t\tthis.decUtils,\n\t\t\tthis.canvasController,\n\t\t\tthis.canvasDiv,\n\t\t\tthis.activePipeline,\n\t\t\tthis.removeTempCursorOverlay.bind(this), // Function\n\t\t\tthis.displayComments.bind(this), // Function\n\t\t\tthis.displayLinks.bind(this), // Function\n\t\t\tthis.getCommentToolbarPos.bind(this), // Function\n\t\t\tthis.addCanvasZoomBehavior.bind(this), // Function\n\t\t\tthis.removeCanvasZoomBehavior.bind(this) // Function\n\t\t);\n\n\t\tthis.dispUtils.setDisplayState();\n\t\tthis.logger.log(this.dispUtils.getDisplayStateMsg());\n\n\t\t// The data link a node is currently being dragged over. It will be null\n\t\t// when the node being dragged is not over a data link.\n\t\tthis.dragOverLink = null;\n\n\t\t// The detached data links a node is currently being dragged over. It will\n\t\t// be empty when the node being dragged is not over any data links.\n\t\t// When dragging a node over detached links there may be more than one\n\t\t// entry in this array.\n\t\tthis.dragOverDetachedLinks = [];\n\n\t\t// The node over which the 'guide' object for a new link or a link handle\n\t\t// is being dragged. Used when enableHighlightNodeOnNewLinkDrag config\n\t\t// option is switched on.\n\t\tthis.dragNewLinkOverNode = null;\n\n\t\t// These variables keep track of the currently focused sub-object (such\n\t\t// as a port, decoration or detached link handle) and its parent (which\n\t\t// could be a node or link).\n\t\tthis.subObject = null;\n\t\tthis.subObjectParentObj = null;\n\n\t\t// Initialize a <div> to create ghost objects to appear under the canvas SVG.\n\t\tthis.initializeGhostDiv();\n\n\t\t// Create the main SVG area to display all canvas contents.\n\t\tthis.canvasSVG = this.createCanvasSVG();\n\n\t\t// Add a <defs> element to the canvas SVG.\n\t\tthis.canvasDefs = this.createDefs(this.canvasSVG, this.canvasLayout);\n\n\t\t// Add a background rectangle to the canvas SVG\n\t\tthis.canvasBackground = this.createCanvasBackground(this.canvasSVG);\n\n\t\t// Add group to contain all canvas objects\n\t\tthis.canvasGrp = this.createCanvasGroup(this.canvasSVG, \"d3-canvas-group\");\n\n\t\t// Add an underlay rectangle to the canvas group to appear under comments, nodes and links\n\t\tthis.canvasUnderlay = this.createCanvasUnderlay(this.canvasGrp, \"d3-canvas-underlay\");\n\n\t\t// Add group to always position comments under nodes and links\n\t\tthis.commentsGrp = this.createCanvasGroup(this.canvasGrp, \"d3-comments-group\");\n\n\t\t// Add group to position nodes and links over comments\n\t\tthis.nodesLinksGrp = this.createCanvasGroup(this.canvasGrp, \"d3-nodes-links-group\");\n\n\t\t// Add group to optionally add bounding rectangles over all objects\n\t\tthis.boundingRectsGrp = this.createBoundingRectanglesGrp(this.canvasGrp, \"d3-bounding-rect-group\");\n\n\t\tthis.resetCanvasSVGBehaviors();\n\n\t\tthis.displayCanvas();\n\n\t\tif (this.dispUtils.isDisplayingFullPage()) {\n\t\t\tthis.zoomUtils.restoreZoom();\n\t\t}\n\n\t\t// If we are showing a sub-flow in full screen mode and there\n\t\t// is no saved zoom for this pipeline, zoom it to fit the\n\t\t// screen so it looks similar to the in-place sub-flow view.\n\t\tif (this.dispUtils.isDisplayingSubFlowFullPage() &&\n\t\t\t\t!this.canvasController.getSavedZoom(this.pipelineId)) {\n\t\t\tthis.zoomToFit();\n\t\t}\n\n\t\t// If we are showing an in-place subflow make sure any already existing\n\t\t// port on the parent supernode overlap on top of our SVG area.\n\t\tif (this.dispUtils.isDisplayingSubFlowInPlace()) {\n\t\t\tthis.supernodeInfo.d3Selection.selectAll(\".d3-node-port-input\").raise();\n\t\t\tthis.supernodeInfo.d3Selection.selectAll(\".d3-node-port-output\").raise();\n\t\t}\n\n\t\tthis.logger.logEndTimer(\"constructor - \" + pipelineId.substring(0, 5));\n\t}\n\n\t// Sets the pressed state of the space bar. This is called\n\t// from outside canvas via svg-canvas-d3.\n\tsetSpaceKeyPressed(state) {\n\t\tthis.zoomUtils.setSpaceKeyPressed(state);\n\t\tthis.resetCanvasCursor();\n\t}\n\n\t// Returns true if the space bar is pressed and held down. This is called\n\t// from outside canvas via svg-canvas-d3.\n\tisSpaceKeyPressed() {\n\t\treturn this.zoomUtils.isSpaceKeyPressed();\n\t}\n\n\tzoomTo(zoomObject, animateTime) {\n\t\tthis.zoomUtils.zoomTo(zoomObject, animateTime);\n\t}\n\n\ttranslateBy(x, y, animateTime) {\n\t\tthis.zoomUtils.translateBy(x, y, animateTime);\n\t}\n\n\tzoomIn() {\n\t\tthis.zoomUtils.zoomIn();\n\t}\n\n\tzoomOut() {\n\t\tthis.zoomUtils.zoomOut();\n\t}\n\n\tzoomToFit(animateTime) {\n\t\tthis.zoomUtils.zoomToFit(animateTime);\n\t}\n\n\tisZoomedToMax() {\n\t\treturn this.zoomUtils.isZoomedToMax();\n\t}\n\n\tisZoomedToMin() {\n\t\treturn this.zoomUtils.isZoomedToMin();\n\t}\n\n\tgetZoomToReveal(objectIDs, xPos, yPos) {\n\t\treturn this.zoomUtils.getZoomToReveal(objectIDs, xPos, yPos);\n\t}\n\n\tgetZoom() {\n\t\treturn this.zoomUtils.getZoom();\n\t}\n\n\tgetTransformedViewportDimensions() {\n\t\treturn this.zoomUtils.getTransformedViewportDimensions();\n\t}\n\n\tgetCanvasDimensionsWithPadding() {\n\t\treturn this.zoomUtils.getCanvasDimensionsWithPadding();\n\t}\n\n\t// Returns the data object for the parent supernode that references the\n\t// active pipeline (managed by this renderer). We get the supernode by\n\t// looking through the overall canvas info object.\n\t// Don't be tempted into thinking you can retrieve the supernode datum by\n\t// calling the parent renderer because there is no parent renderer when we\n\t// are showing a sub-flow in full page mode.\n\tgetParentSupernodeDatum() {\n\t\tlet node = null;\n\t\tthis.canvasInfo.pipelines.forEach((pipeline) => {\n\t\t\tif (pipeline.id === this.supernodeInfo.pipelineId) {\n\t\t\t\tif (!node) {\n\t\t\t\t\tnode =\n\t\t\t\t\t\tpipeline.nodes.find((n) =>\n\t\t\t\t\t\t\tCanvasUtils.isSupernode(n) && n.id === this.supernodeInfo.id);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn node;\n\t}\n\n\t// Provides new canvas info data to this renderer and other display and layout info\n\t// so the canvas can be redisplayed.\n\tsetCanvasInfoRenderer(canvasInfo, selectionInfo, breadcrumbs, nodeLayout, canvasLayout, config) {\n\t\tthis.logger.logStartTimer(\"setCanvasInfoRenderer\" + this.pipelineId.substring(0, 5));\n\n\t\tthis.config = config;\n\t\tthis.canvasInfo = canvasInfo;\n\t\tthis.selectionInfo = selectionInfo;\n\t\tthis.breadcrumbs = breadcrumbs;\n\t\tthis.nodeLayout = nodeLayout;\n\t\tthis.canvasLayout = canvasLayout;\n\n\t\tthis.activePipeline.initialize(this.pipelineId, config, canvasInfo, selectionInfo);\n\n\t\t// Must recreate these utils objects because they use the config object\n\t\t// which may have changed.\n\t\tthis.linkUtils = new SvgCanvasLinks(this.config, this.canvasLayout, this.nodeUtils, this.commentUtils);\n\t\tthis.svgCanvasTextArea = new SvgCanvasTextArea(\n\t\t\tthis.config,\n\t\t\tthis.dispUtils,\n\t\t\tthis.nodeUtils,\n\t\t\tthis.decUtils,\n\t\t\tthis.canvasController,\n\t\t\tthis.canvasDiv,\n\t\t\tthis.activePipeline,\n\t\t\tthis.removeTempCursorOverlay.bind(this), // Function\n\t\t\tthis.displayComments.bind(this), // Function\n\t\t\tthis.displayLinks.bind(this), // Function\n\t\t\tthis.getCommentToolbarPos.bind(this), // Function\n\t\t\tthis.addCanvasZoomBehavior.bind(this), // Function\n\t\t\tthis.removeCanvasZoomBehavior.bind(this) // Function\n\t\t);\n\n\n\t\t// Set the display state in case we changed from in-place to full-page\n\t\t// sub-flow display.\n\t\tthis.dispUtils.setDisplayState();\n\t\tthis.logger.log(this.dispUtils.getDisplayStateMsg());\n\n\t\t// Reset the SVG area's zoom behaviors. We do this in case the canvas has\n\t\t// changed from empty (no nodes/comments) where we do not need any zoom\n\t\t// behavior to populated (with at least one node or comment) where we do\n\t\t// need the zoom behavior, or vice versa.\n\t\tthis.resetCanvasSVGBehaviors();\n\n\t\t// If a supernode and its corresponding pipeline has been deleted in the\n\t\t// object model we need to make sure the renderer is removed.\n\t\tthis.superRenderers = this.cleanUpSuperRenderers();\n\n\t\t// Display all objects for this renderer's pipeline. When supernodes in\n\t\t// this pipeline are rendered they will pass on the new canvasinfo to their\n\t\t// associated renderer.\n\t\tthis.displayCanvas();\n\n\t\t// Restore the focus back to whatever object is currently in focus if\n\t\t// keyboard navigation is enabled.\n\t\tif (this.config.enableKeyboardNavigation) {\n\t\t\tthis.logger.log(\"setCanvasInfoRenderer - Restoring focus\");\n\t\t\tthis.restoreFocus();\n\t\t}\n\n\t\tthis.logger.logEndTimer(\"setCanvasInfoRenderer\" + this.pipelineId.substring(0, 5));\n\t}\n\n\t// Updates the selection info for all renderers and displays the selection\n\t// highlighting for nodes, links and comments. This provides a performance\n\t// improvement over running the displayCanvas method which displays the\n\t// whole canvas.\n\tsetSelectionInfo(selectionInfo) {\n\t\tthis.selectionInfo = selectionInfo;\n\t\tthis.activePipeline.initialize(this.pipelineId, this.config, this.canvasInfo, selectionInfo);\n\n\t\tthis.displayCommentsSelectionStatus();\n\t\tthis.displayNodesSelectionStatus();\n\t\tthis.displayLinksSelectionStatus();\n\n\t\tthis.superRenderers.forEach((renderer) => {\n\t\t\trenderer.setSelectionInfo(selectionInfo);\n\t\t});\n\t}\n\n\t// Returns a subset of renderers, from the current set of super renderers,\n\t// that correspond to the supernodes for the active pipeline. This will\n\t// remove any renderers that do not have a corresponding supernode which\n\t// might happen when a supernode is deleted directly, or removed through an\n\t// undo action.\n\tcleanUpSuperRenderers() {\n\t\tconst newSuperRenderers = [];\n\t\tconst supernodes = this.activePipeline.getSupernodes();\n\n\t\tsupernodes.forEach((supernode) => {\n\t\t\tconst ren = this.getRendererForSupernode(supernode);\n\t\t\tif (ren) {\n\t\t\t\tnewSuperRenderers.push(ren);\n\t\t\t}\n\n\t\t\tthis.getDiscardedRenderersForSupernode(supernode)\n\t\t\t\t.forEach((dr) => dr.canvasSVG.remove());\n\t\t});\n\n\t\treturn newSuperRenderers;\n\t}\n\n\tclearCanvas() {\n\t\tthis.zoomUtils.resetZoomTransform();\n\t\tthis.canvasSVG.remove();\n\t}\n\n\t// This is called when the user changes the size of the canvas area.\n\trefreshOnSizeChange() {\n\t\tthis.logger.log(\"refreshOnSizeChange\");\n\t\tif (this.dispUtils.isDisplayingSubFlowFullPage()) {\n\t\t\tthis.displayBindingNodesToFitSVG();\n\t\t}\n\n\t\tif (this.config.enableBoundingRectangles) {\n\t\t\tthis.displayBoundingRectangles();\n\t\t}\n\n\t\tthis.setCanvasBackgroundSize();\n\n\t\tif (this.config.enablePositionNodeOnRightFlyoutOpen &&\n\t\t\t\tthis.canvasController.isRightFlyoutOpen()) {\n\t\t\tconst posInfo = (typeof this.config.enablePositionNodeOnRightFlyoutOpen === \"boolean\")\n\t\t\t\t? { x: 50, y: 50 }\n\t\t\t\t: this.config.enablePositionNodeOnRightFlyoutOpen;\n\t\t\tconst x = posInfo.x ? posInfo.x : 50;\n\t\t\tconst y = posInfo.y ? posInfo.y : 50;\n\t\t\tconst selNodeIds = this.activePipeline.getSelectedNodeIds();\n\t\t\tconst zoom = this.getZoomToReveal(selNodeIds, x, y);\n\t\t\tthis.zoomTo(zoom);\n\t\t}\n\t}\n\n\thideCanvas() {\n\t\tthis.canvasSVG.style(\"display\", \"none\");\n\t}\n\n\tdisplayCanvas() {\n\t\tthis.logger.logStartTimer(\"displayCanvas\");\n\n\t\t// Ensure the SVG area is displayed, in case it was previously hidden.\n\t\tthis.canvasSVG.style(\"display\", \"inherit\");\n\n\t\tthis.displayComments();\n\t\tthis.displayNodes();\n\t\tthis.displayLinks();\n\n\t\tif (this.dispUtils.isDisplayingSubFlowInPlace()) {\n\t\t\tthis.displaySVGToFitSupernode();\n\t\t}\n\n\t\tthis.displayCanvasAccoutrements();\n\n\t\tthis.logger.logEndTimer(\"displayCanvas\");\n\t}\n\n\t// Displays zoom and size dependent canvas elements.\n\tdisplayCanvasAccoutrements() {\n\t\tif (this.config.enableBoundingRectangles) {\n\t\t\tthis.displayBoundingRectangles();\n\t\t}\n\n\t\tif (this.config.enableCanvasUnderlay !== \"None\" &&\n\t\t\t\tthis.dispUtils.isDisplayingPrimaryFlowFullPage()) {\n\t\t\tthis.setCanvasUnderlaySize();\n\t\t}\n\n\t\tthis.setCanvasBackgroundSize();\n\n\t\t// The supernode will not have any calculated port positions when the\n\t\t// subflow is being displayed full screen, so calculate them first.\n\t\tif (this.dispUtils.isDisplayingSubFlowFullPage()) {\n\t\t\tthis.displayPortsForSubFlowFullPage();\n\t\t}\n\t}\n\n\t// Ensures the binding ports for a full-page sub-flow are calculated\n\t// and displayed correctly.\n\tdisplayPortsForSubFlowFullPage() {\n\t\tthis.setPortPositionsForNode(this.getParentSupernodeDatum());\n\t\tthis.displayBindingNodesToFitSVG();\n\t}\n\n\t// Called during a resize.\n\tdisplaySVGToFitSupernode() {\n\t\tthis.logger.log(\"displaySVGToFitSupernode - start\");\n\t\tconst dims = this.getParentSupernodeSVGDimensions();\n\t\tthis.canvasSVG.attr(\"width\", dims.width);\n\t\tthis.canvasSVG.attr(\"height\", dims.height);\n\t\tthis.canvasSVG.attr(\"x\", dims.x);\n\t\tthis.canvasSVG.attr(\"y\", dims.y);\n\n\t\t// Keep the background rectangle the same size as the SVG area.\n\t\tconst background = this.canvasSVG.selectChildren(\".d3-svg-background\");\n\t\tbackground.attr(\"width\", dims.width);\n\t\tbackground.attr(\"height\", dims.height);\n\n\t\tthis.zoomToFit();\n\t\tthis.displayBindingNodesToFitSVG();\n\t\tthis.logger.log(\"displaySVGToFitSupernode - end\");\n\t}\n\n\tdisplayBindingNodesToFitSVG() {\n\t\tthis.logger.log(\"displayBindingNodesToFitSVG - start\");\n\t\t// Need to set port positions before moving super binding nodes because\n\t\t// we need ports positioned correctly on the supernode so binding nodes are\n\t\t// moved to the right place.\n\t\tthis.setPortPositionsAllNodes();\n\t\tthis.moveSuperBindingNodes();\n\n\t\tthis.displayMovedNodes();\n\t\tthis.displayMovedLinks();\n\n\t\tthis.logger.log(\"displayBindingNodesToFitSVG - end\");\n\t}\n\n\tgetParentSupernodeSVGDimensions() {\n\t\tconst datum = this.getParentSupernodeDatum();\n\t\treturn {\n\t\t\twidth: datum.width - (2 * this.canvasLayout.supernodeSVGAreaPadding),\n\t\t\theight: datum.height - this.canvasLayout.supernodeTopAreaHeight - this.canvasLayout.supernodeSVGAreaPadding,\n\t\t\tx: this.canvasLayout.supernodeSVGAreaPadding,\n\t\t\ty: this.canvasLayout.supernodeTopAreaHeight,\n\t\t\tx_pos: datum.x_pos + this.canvasLayout.supernodeSVGAreaPadding,\n\t\t\ty_pos: datum.y_pos + this.canvasLayout.supernodeTopAreaHeight\n\t\t};\n\t}\n\n\t// Moves the binding nodes in a sub-flow, which map to nodes in the parent\n\t// supernode, to the edge of the SVG area.\n\tmoveSuperBindingNodes() {\n\t\tconst transformedSVGRect = this.zoomUtils.getTransformedViewportDimensions();\n\n\t\t// this.logger.log(\"transformedSVGRect\" +\n\t\t// \t\" x = \" + transformedSVGRect.x +\n\t\t// \t\" y = \" + transformedSVGRect.y +\n\t\t// \t\" width = \" + transformedSVGRect.width +\n\t\t// \t\" height = \" + transformedSVGRect.height);\n\n\t\tconst supernodeDatum = this.getParentSupernodeDatum();\n\n\t\tif (this.canvasLayout.linkDirection === LINK_DIR_TOP_BOTTOM ||\n\t\t\t\tthis.canvasLayout.linkDirection === LINK_DIR_BOTTOM_TOP) {\n\t\t\tconst svgWid = supernodeDatum.width - (2 * this.canvasLayout.supernodeSVGAreaPadding);\n\t\t\tthis.activePipeline.nodes.forEach((d) => {\n\t\t\t\tif (d.isSupernodeInputBinding) {\n\t\t\t\t\tconst x = this.nodeUtils.getSupernodePortXOffset(d.id, supernodeDatum.inputs);\n\t\t\t\t\td.x_pos = (transformedSVGRect.width * (x / svgWid)) + transformedSVGRect.x - d.outputs[0].cx;\n\t\t\t\t\td.y_pos = this.canvasLayout.linkDirection === LINK_DIR_TOP_BOTTOM\n\t\t\t\t\t\t? transformedSVGRect.y - d.height\n\t\t\t\t\t\t: transformedSVGRect.y + transformedSVGRect.height;\n\t\t\t\t}\n\t\t\t\tif (d.isSupernodeOutputBinding) {\n\t\t\t\t\tconst x = this.nodeUtils.getSupernodePortXOffset(d.id, supernodeDatum.outputs);\n\t\t\t\t\td.x_pos = (transformedSVGRect.width * (x / svgWid)) + transformedSVGRect.x - d.inputs[0].cx;\n\t\t\t\t\td.y_pos = this.canvasLayout.linkDirection === LINK_DIR_TOP_BOTTOM\n\t\t\t\t\t\t? d.y_pos = transformedSVGRect.y + transformedSVGRect.height\n\t\t\t\t\t\t: d.y_pos = transformedSVGRect.y - d.height;\n\t\t\t\t}\n\t\t\t});\n\n\t\t} else {\n\t\t\t// If we have navigated from an in-place supernode view the supernode\n\t\t\t// will be expanded. If we navigated from a collapsed node (directly to\n\t\t\t// the full screen view) the supernode will not be expanded so we set the\n\t\t\t// dimensions accordingly.\n\t\t\tlet topAreaHeight;\n\t\t\tlet svgHt;\n\t\t\tif (CanvasUtils.isExpanded(supernodeDatum)) {\n\t\t\t\ttopAreaHeight = this.canvasLayout.supernodeTopAreaHeight;\n\t\t\t\tsvgHt = supernodeDatum.height - (this.canvasLayout.supernodeTopAreaHeight + this.canvasLayout.supernodeSVGAreaPadding);\n\t\t\t} else {\n\t\t\t\ttopAreaHeight = 0;\n\t\t\t\tsvgHt = supernodeDatum.height;\n\t\t\t}\n\n\t\t\t// Position the binding nodes.\n\t\t\tthis.activePipeline.nodes.forEach((d) => {\n\t\t\t\tif (d.isSupernodeInputBinding) {\n\t\t\t\t\td.x_pos = this.canvasLayout.linkDirection === LINK_DIR_LEFT_RIGHT\n\t\t\t\t\t\t? transformedSVGRect.x - d.width\n\t\t\t\t\t\t: transformedSVGRect.x + transformedSVGRect.width;\n\t\t\t\t\tconst y = this.nodeUtils.getSupernodePortYOffset(d.id, supernodeDatum.inputs) - topAreaHeight;\n\t\t\t\t\td.y_pos = (transformedSVGRect.height * (y / svgHt)) + transformedSVGRect.y - d.outputs[0].cy;\n\t\t\t\t}\n\t\t\t\tif (d.isSupernodeOutputBinding) {\n\t\t\t\t\td.x_pos = this.canvasLayout.linkDirection === LINK_DIR_LEFT_RIGHT\n\t\t\t\t\t\t? transformedSVGRect.x + transformedSVGRect.width\n\t\t\t\t\t\t: transformedSVGRect.x - d.width;\n\t\t\t\t\tconst y = this.nodeUtils.getSupernodePortYOffset(d.id, supernodeDatum.outputs) - topAreaHeight;\n\t\t\t\t\td.y_pos = (transformedSVGRect.height * (y / svgHt)) + transformedSVGRect.y - d.inputs[0].cy;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t// Display bounding rectangles around the SVG area and the canvas area defined\n\t// by the nodes and comments.\n\tdisplayBoundingRectangles() {\n\t\tif (!this.activePipeline) {\n\t\t\treturn;\n\t\t}\n\t\tconst svgRect = this.zoomUtils.getViewportDimensions();\n\t\tconst transformedSVGRect = this.zoomUtils.getTransformedRect(svgRect, 1);\n\t\tconst canv = this.zoomUtils.getCanvasDimensions();\n\t\tconst canvWithPadding = this.zoomUtils.getCanvasDimensionsWithPadding();\n\n\t\tthis.boundingRectsGrp.selectChildren(\".d3-bounding\").remove();\n\n\t\tconst grp = this.boundingRectsGrp\n\t\t\t.append(\"g\")\n\t\t\t.attr(\"class\", \"d3-bounding\");\n\n\t\tgrp\n\t\t\t.append(\"rect\")\n\t\t\t.attr(\"height\", svgRect.height)\n\t\t\t.attr(\"width\", svgRect.width)\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", 0)\n\t\t\t.style(\"fill\", \"none\")\n\t\t\t.style(\"stroke\", \"darkorange\");\n\n\t\tgrp\n\t\t\t.append(\"rect\")\n\t\t\t.attr(\"height\", transformedSVGRect.height)\n\t\t\t.attr(\"width\", transformedSVGRect.width - 2)\n\t\t\t.attr(\"x\", transformedSVGRect.x)\n\t\t\t.attr(\"y\", transformedSVGRect.y)\n\t\t\t.style(\"fill\", \"none\")\n\t\t\t.style(\"stroke\", \"red\");\n\n\t\tif (canv) {\n\t\t\tgrp\n\t\t\t\t.append(\"rect\")\n\t\t\t\t.attr(\"height\", canv.height)\n\t\t\t\t.attr(\"width\", canv.width)\n\t\t\t\t.attr(\"x\", canv.left)\n\t\t\t\t.attr(\"y\", canv.top)\n\t\t\t\t.style(\"fill\", \"none\")\n\t\t\t\t.style(\"stroke\", \"blue\");\n\t\t}\n\n\t\tif (canvWithPadding) {\n\t\t\tgrp\n\t\t\t\t.append(\"rect\")\n\t\t\t\t.attr(\"height\", canvWithPadding.height)\n\t\t\t\t.attr(\"width\", canvWithPadding.width)\n\t\t\t\t.attr(\"x\", canvWithPadding.left)\n\t\t\t\t.attr(\"y\", canvWithPadding.top)\n\t\t\t\t.style(\"fill\", \"none\")\n\t\t\t\t.style(\"stroke\", \"green\");\n\t\t}\n\n\t\tif (this.config.enableBoundingRectangles &&\n\t\t\t\tthis.superRenderers.length > 0) {\n\t\t\tthis.superRenderers.forEach((sr) => sr.displayBoundingRectangles());\n\t\t}\n\t}\n\n\t// Returns true when we are editing text. Called by svg-canvas-d3.\n\tisEditingText() {\n\t\tif (this.svgCanvasTextArea.isEditingText()) {\n\t\t\treturn true;\n\t\t}\n\t\tlet state = false;\n\t\tthis.superRenderers.forEach((superRen) => {\n\t\t\tif (!state) {\n\t\t\t\tstate = superRen.isEditingText();\n\t\t\t}\n\t\t});\n\t\treturn state;\n\t}\n\n\t// Returns true when we are dragging objects. Called by svg-canvas-d3.\n\tisDragging() {\n\t\treturn this.dragObjectUtils.isMoving() ||\n\t\t\tthis.dragNewLinkUtils.isDragging() ||\n\t\t\tthis.dragDetLinkUtils.isDragging() ||\n\t\t\tthis.dragLinkUtils.isDragging();\n\t}\n\n\t// Returns true whenever a node or comment is being resized.\n\tisSizing() {\n\t\tthis.dragObjectUtils.isSizing();\n\t}\n\n\tgetAllNodeGroupsSelection() {\n\t\treturn this.nodesLinksGrp.selectChildren(\".d3-node-group\");\n\t}\n\n\tgetAllLinkGroupsSelection() {\n\t\treturn this.nodesLinksGrp.selectChildren(\".d3-link-group\");\n\t}\n\n\tgetAllCommentGroupsSelection() {\n\t\treturn this.commentsGrp.selectChildren(\".d3-comment-group\");\n\t}\n\n\tgetNodeGroupSelectionById(nodeId) {\n\t\tconst nodeGrpSelector = this.getSelectorForId(\"node_grp\", nodeId);\n\t\treturn this.nodesLinksGrp.selectChildren(nodeGrpSelector);\n\t}\n\n\tgetLinkGroupSelectionById(linkId) {\n\t\tconst linkGrpSelector = this.getSelectorForId(\"link_grp\", linkId);\n\t\treturn this.nodesLinksGrp.selectChildren(linkGrpSelector);\n\t}\n\n\tgetCommentGroupSelectionById(comId) {\n\t\tconst selector = this.getSelectorForId(\"comment_grp\", comId);\n\t\treturn this.commentsGrp.selectChildren(selector);\n\t}\n\n\tgetNodeLabelSelectionById(nodeId) {\n\t\tconst nodeSel = this.getNodeGroupSelectionById(nodeId);\n\t\tconst selector = this.getSelectorForNodeLabelId();\n\t\treturn nodeSel.selectAll(selector);\n\t}\n\n\tgetNodeInputPortSelectionById(portId, nodeId) {\n\t\tconst nodeSel = this.getNodeGroupSelectionById(nodeId);\n\t\tconst selector = this.getSelectorForInputPortId(portId);\n\t\treturn nodeSel.selectAll(selector);\n\t}\n\n\tgetNodeOutputPortSelectionById(portId, nodeId) {\n\t\tconst nodeSel = this.getNodeGroupSelectionById(nodeId);\n\t\tconst selector = this.getSelectorForOutputPortId(portId);\n\t\treturn nodeSel.selectAll(selector);\n\t}\n\n\tgetNodeDecSelectionById(decId, nodeId) {\n\t\tconst nodeSel = this.getNodeGroupSelectionById(nodeId);\n\t\tconst selector = this.getSelectorForId(\"node_dec_group\", decId);\n\t\treturn nodeSel.selectAll(selector);\n\t}\n\n\tgetLinkStartHandleGrpSelectionById(linkId) {\n\t\tconst linkSel = this.getLinkGroupSelectionById(linkId);\n\t\treturn linkSel.selectAll(\".d3-link-handle-start-group\");\n\t}\n\n\tgetLinkEndHandleGrpSelectionById(linkId) {\n\t\tconst linkSel = this.getLinkGroupSelectionById(linkId);\n\t\treturn linkSel.selectAll(\".d3-link-handle-end-group\");\n\t}\n\n\tgetLinkDecSelectionById(decId, linkId) {\n\t\tconst linkSel = this.getLinkGroupSelectionById(linkId);\n\t\tconst selector = this.getSelectorForId(\"link_dec_group\", decId);\n\t\treturn linkSel.selectAll(selector);\n\t}\n\n\tgetSelectorForNodeLabelId() {\n\t\treturn \".d3-foreign-object-node-label\";\n\t}\n\n\tgetSelectorForInputPortId(portId) {\n\t\treturn `[data-port-id='${portId}'].d3-node-port-input`;\n\t}\n\n\tgetSelectorForOutputPortId(portId) {\n\t\treturn `[data-port-id='${portId}'].d3-node-port-output`;\n\t}\n\n\t// Returns a selector for the ID string like one of the following:\n\t// * [data-id='prefix_instanceID']\n\t// * [data-id='prefix_instanceID_suffix']\n\t// * [data-id='prefix_instanceID_suffix_suffix2']\n\t// depending on what parameters are provided.\n\tgetSelectorForId(prefix, suffix, suffix2) {\n\t\treturn `[data-id='${this.getId(prefix, suffix, suffix2)}']`;\n\t}\n\n\t// Returns an ID string like one of the following:\n\t// * 'prefix_instanceID'\n\t// * 'prefix_instanceID_suffix'\n\t// * 'prefix_instanceID_suffix_suffix2'\n\t// depending on what parameters are provided.\n\tgetId(prefix, suffix, suffix2) {\n\t\tlet id = `${prefix}_${this.instanceId}`;\n\t\tif (suffix) {\n\t\t\tid += `_${suffix}`;\n\t\t}\n\t\tif (suffix2) {\n\t\t\tid += `_${suffix2}`;\n\t\t}\n\t\treturn id;\n\t}\n\n\t// Returns the passed in mouse position snapped to the grid\n\t// if either option is switched on.\n\tgetMousePosSnapToGrid(mousePos) {\n\t\tlet transPos = mousePos;\n\n\t\tif (this.config.enableSnapToGridType === SNAP_TO_GRID_DURING ||\n\t\t\t\tthis.config.enableSnapToGridType === SNAP_TO_GRID_AFTER) {\n\t\t\ttransPos = this.snapToGridPosition(transPos);\n\t\t}\n\t\treturn transPos;\n\t}\n\n\t// Returns the current mouse position transformed by the current zoom\n\t// transformation amounts based on the local SVG -- that is, if we're\n\t// displaying a sub-flow it is based on the SVG in the supernode.\n\tgetTransformedMousePos(d3Event) {\n\t\treturn this.zoomUtils.transformPos(this.getMousePos(d3Event, this.canvasSVG));\n\t}\n\n\t// Returns the current mouse position based on the D3 SVG selection object\n\t// passed in.\n\tgetMousePos(d3Event, svgSel) {\n\t\t// The d3Event must have either a sourceEvent or be an actual event, which\n\t\t// can be indicated by the existence of a pageX attribute. This test is only\n\t\t// necessary on Firefox and then only when the action (such as zoom)\n\t\t// calling this function is itself called programmatically - for example,\n\t\t// when the user clicks one of the zoom buttons on the toolbar. It's not\n\t\t// clear why d3.pointer cannot handle all events like it can on Chrome.\n\t\tif (d3Event.sourceEvent || d3Event.pageX) {\n\t\t\tconst mousePos = d3.pointer(d3Event, svgSel.node());\n\t\t\treturn { x: mousePos[0], y: mousePos[1] };\n\t\t}\n\t\treturn { x: 0, y: 0 };\n\t}\n\n\t// Returns the page position passed in snapped to the grid in canvas\n\t// coordinates. Called externally via svg-canvas-d3.\n\tconvertPageCoordsToSnappedCanvasCoords(pos) {\n\t\tlet position = this.convertPageCoordsToCanvasCoords(pos.x, pos.y);\n\t\tposition = this.getMousePosSnapToGrid(position);\n\t\treturn position;\n\t}\n\n\t// Convert coordinates from the page (based on the page top left corner) to\n\t// canvas coordinates based on the canvas coordinate system.\n\tconvertPageCoordsToCanvasCoords(x, y) {\n\t\tconst svgRect = this.canvasSVG.node().getBoundingClientRect();\n\t\treturn this.zoomUtils.transformPos({ x: x - Math.round(svgRect.left), y: y - Math.round(svgRect.top) });\n\t}\n\n\t// Convert coordinates from canvas to page coordinates (based\n\t// on the page top left corner).\n\tconvertCanvasCoordsToPageCoords(x, y) {\n\t\tconst svgRect = this.canvasSVG.node().getBoundingClientRect();\n\t\tconst pos = this.zoomUtils.unTransformPos({ x, y });\n\t\treturn { x: pos.x + Math.round(svgRect.left), y: pos.y + Math.round(svgRect.top) };\n\t}\n\n\t// Converts canvas coordinates to screen coordinates.\n\t// If we're displaying a sub-flow in place, we need to adjust the position\n\t// to account for the offset of the sub-flow SVG area within the parent canvas.\n\t// This is done recursively for nested sub-flows.\n\tconvertCanvasCoordsToScreenCoords(pos) {\n\t\tlet screenPos = this.zoomUtils.unTransformPos(pos);\n\n\t\tif (this.dispUtils.isDisplayingSubFlowInPlace()) {\n\t\t\tscreenPos = this.addParentSupernodeOffset(screenPos);\n\t\t}\n\n\t\treturn screenPos;\n\t}\n\n\t// Recursively adds the parent supernode offset to the position.\n\t// This handles nested sub-flows by transforming through each parent's zoom level.\n\taddParentSupernodeOffset(pos) {\n\t\tconst parentSVGDims = this.getParentSupernodeSVGDimensions();\n\n\t\t// Add the offset of this sub-flow's SVG area within the parent's canvas (in canvas coordinates)\n\t\tconst posWithOffset = {\n\t\t\tx: pos.x + parentSVGDims.x_pos,\n\t\t\ty: pos.y + parentSVGDims.y_pos\n\t\t};\n\n\t\t// Transform through the parent's zoom to get to parent's viewport coordinates\n\t\tconst transformedPos = this.supernodeInfo.renderer.zoomUtils.unTransformPos(posWithOffset);\n\n\t\t// If the parent renderer is also displaying a sub-flow in place,\n\t\t// recursively transform through its parent's zoom\n\t\tif (this.supernodeInfo.renderer.dispUtils.isDisplayingSubFlowInPlace()) {\n\t\t\treturn this.supernodeInfo.renderer.addParentSupernodeOffset(transformedPos);\n\t\t}\n\n\t\treturn transformedPos;\n\t}\n\n\t// Creates the div which contains the ghost node for drag and\n\t// drop actions from the palette. The way setDragImage is handled in\n\t// browsers for HTML drag and drop is very odd since the image has to be\n\t// 'visible' but not necessarily on display! I know, it confusing. Checkout\n\t// this link for an explanation:\n\t// https://www.kryogenix.org/code/browser/custom-drag-image.html\n\t// Consequently, we place the ghost div, using CSS, within the canvas div\n\t// with an absolute position and with a z-index to make it 'appear'\n\t// underneath the svg area.\n\tinitializeGhostDiv() {\n\t\tif (this.dispUtils.isDisplayingFullPage() &&\n\t\t\t\tthis.getGhostDivSel().empty()) {\n\t\t\tthis.canvasDiv\n\t\t\t\t.append(\"div\")\n\t\t\t\t.attr(\"class\", \"d3-ghost-div\");\n\t\t}\n\t}\n\n\t// Returns the ghost div selection. We always reselect the ghost div when it\n\t// is required because there is one ghost div for the whole common-canvas so\n\t// if this renderer is for an in-place subflow we need to get the ghost image\n\t// from the parent div.\n\tgetGhostDivSel() {\n\t\treturn this.canvasDiv.selectAll(\".d3-ghost-div\");\n\t}\n\n\t// Returns a ghost data object for displaying a ghost image when dragging\n\t// nodes from the palette. The object contains a DOM element to display\n\t// plus its width and height. This needs to be called each time a new node\n\t// is dragged from the palette, in case the dimensions of the ghost node\n\t// have changed because the canvas has been zoomed.\n\tgetGhostNode(node) {\n\t\tconst ghostDivSel = this.getGhostDivSel();\n\t\tconst zoomScale = this.zoomUtils.getZoomScale();\n\n\t\t// Calculate the ghost area width which is the maximum of either the node\n\t\t// label or the default node width.\n\t\tconst ghostAreaWidth = Math.max(this.nodeLayout.labelWidth, node.width);\n\n\t\tlet xOffset = 0;\n\n\t\t// Remove any existing SVG object from the div\n\t\tghostDivSel\n\t\t\t.selectAll(\".d3-ghost-svg\")\n\t\t\t.remove();\n\n\t\t// Create a new SVG area for the ghost area.\n\t\tconst ghostAreaSVG = ghostDivSel\n\t\t\t.append(\"svg\")\n\t\t\t.attr(\"width\", ghostAreaWidth * zoomScale)\n\t\t\t.attr(\"height\", (50 + node.height) * zoomScale) // Add some extra pixels, in case label is below label bottom\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", 0)\n\t\t\t.attr(\"aria-hidden\", true)\n\t\t\t.attr(\"class\", \"d3-ghost-svg\");\n\n\t\tconst ghostGrp = ghostAreaSVG\n\t\t\t.append(\"g\")\n\t\t\t.attr(\"class\", \"d3-node-group\");\n\n\t\tghostGrp\n\t\t\t.append(\"rect\")\n\t\t\t.attr(\"class\", \"d3-ghost-node\")\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", 0)\n\t\t\t.attr(\"width\", node.width)\n\t\t\t.attr(\"height\", node.height);\n\n\t\tif (!this.nodeLayout.nodeExternalObject) {\n\t\t\tghostGrp\n\t\t\t\t.append(() => this.getImageElement(node))\n\t\t\t\t.each((d, idx, imgs) => this.setNodeImageContent(node, idx, imgs))\n\t\t\t\t.attr(\"x\", this.nodeUtils.getNodeImagePosX(node))\n\t\t\t\t.attr(\"y\", this.nodeUtils.getNodeImagePosY(node))\n\t\t\t\t.attr(\"width\", this.nodeUtils.getNodeImageWidth(node))\n\t\t\t\t.attr(\"height\", this.nodeUtils.getNodeImageHeight(node));\n\n\t\t\tconst fObject = ghostGrp\n\t\t\t\t.append(\"foreignObject\")\n\t\t\t\t.attr(\"x\", this.nodeUtils.getNodeLabelPosX(node))\n\t\t\t\t.attr(\"y\", this.nodeUtils.getNodeLabelPosY(node))\n\t\t\t\t.attr(\"width\", this.nodeUtils.getNodeLabelWidth(node))\n\t\t\t\t.attr(\"height\", this.nodeUtils.getNodeLabelHeight(node))\n\t\t\t\t.attr(\"class\", \"d3-foreign-object-ghost-label\");\n\n\t\t\tconst fObjectDiv = fObject\n\t\t\t\t.append(\"xhtml:div\")\n\t\t\t\t.attr(\"class\", this.nodeUtils.getNodeLabelClass(node));\n\n\t\t\tconst fObjectSpan = fObjectDiv\n\t\t\t\t.append(\"xhtml:span\")\n\t\t\t\t.html(node.label);\n\n\t\t\t// At the time of writing, Firefox takes the ghost image from only those\n\t\t\t// objects that are visible (ignoring any invisible objects like the div\n\t\t\t// and SVG area) consequently we position the node and label so the label\n\t\t\t// (if bigger than the node width) is positioned up against the left edge\n\t\t\t// of the invisible div and SVG area. If the label is shorter than the node\n\t\t\t// width, the node is positioned up against the left edge of the SVG. We do\n\t\t\t// this by translating the group object in the x direction.\n\n\t\t\t// First calculate the display width of the label. The span will be the\n\t\t\t// full text but it may be constricted by the label width in the layout.\n\t\t\tconst labelSpanWidth = fObjectSpan.node().getBoundingClientRect().width + 4; // Include border for label\n\t\t\tconst nodeLabelWidth = this.nodeUtils.getNodeLabelWidth(node);\n\t\t\tconst labelDisplayLength = Math.min(nodeLabelWidth, labelSpanWidth);\n\n\t\t\t// Next calculate the amount, if any, the label protrudes beyond the edge\n\t\t\t// of the node width and move the ghost group by that amount.\n\t\t\txOffset = Math.max(0, (labelDisplayLength - node.width) / 2) * zoomScale;\n\n\t\t\t// If the label is center justified, restrict the label width to the\n\t\t\t// display amount and adjust the x coordinate to compensate for the change\n\t\t\t// in width.\n\t\t\tif (node.layout.labelAlign === \"center\") {\n\t\t\t\tconst labelDiff = Math.max(0, (nodeLabelWidth - labelDisplayLength) / 2);\n\n\t\t\t\tfObject\n\t\t\t\t\t.attr(\"width\", labelDisplayLength)\n\t\t\t\t\t.attr(\"x\", this.nodeUtils.getNodeLabelPosX(node) + labelDiff);\n\t\t\t\tfObjectDiv.attr(\"width\", labelDisplayLength);\n\t\t\t}\n\t\t}\n\n\t\tghostGrp.attr(\"transform\", `translate(${xOffset}, 0) scale(${zoomScale})`);\n\n\t\t// Get the amount the actual browser page is 'zoomed'. This is different\n\t\t// to the zoom amount for the canvas objects.\n\t\tconst browserZoom = this.getBrowserZoom();\n\n\t\t// Calculate the center of the node area for positioning the mouse pointer\n\t\t// on the image when it is being dragged.\n\t\tconst centerX = (xOffset + ((node.width / 2) * zoomScale)) * browserZoom;\n\t\tconst centerY = ((node.height / 2) * zoomScale) * browserZoom;\n\n\t\treturn {\n\t\t\telement: ghostDivSel.node(),\n\t\t\tcenterX: centerX,\n\t\t\tcenterY: centerY,\n\t\t\tnodeTemplate: node\n\t\t};\n\t}\n\n\t// Returns the amount the actual browser page is 'zoomed'. This is different\n\t// to the zoom amount for the canvas objects. Unfortunately, this value is not\n\t// returned the same for each type of browser so we have to calculate it based\n\t// on the type of browser.\n\tgetBrowserZoom() {\n\t\tlet browserZoom = window.devicePixelRatio;\n\n\t\t// Make sure we search for browser identifiers in this order because with\n\t\t// the Chrome browser userAgent contains the words \"Chrome and \"Safari\"!\n\t\t// However, with the Safari browser, userAgent only contains the word \"Safari\".\n\t\tif (navigator.userAgent.includes(\"Chrome\")) {\n\t\t\tbrowserZoom = 1; // This works for Chrome\n\n\t\t} else if (navigator.userAgent.includes(\"Safari\")) {\n\t\t\tbrowserZoom = (window.outerWidth - 8) / window.innerWidth; // This works for Safari\n\n\t\t} else if (navigator.userAgent.includes(\"Firefox\")) {\n\t\t\tbrowserZoom = 1; // This works for Firefox\n\t\t}\n\n\t\treturn browserZoom;\n\t}\n\n\tnodeTemplateDragStart(nodeTemplate) {\n\t\tif (this.isNodeTemplateInsertableIntoLink(nodeTemplate)) {\n\t\t\tthis.setDataLinkSelectionAreaWider(true);\n\t\t}\n\t}\n\n\tnodeTemplateDragEnd(nodeTemplate) {\n\t\tif (this.isNodeTemplateInsertableIntoLink(nodeTemplate)) {\n\t\t\tthis.setDataLinkSelectionAreaWider(false);\n\t\t}\n\t}\n\n\t// Highlights any data link, that an 'insertable' nodeTemplate from the\n\t// palette, is dragged over. The x and y passed in are in page coordinates\n\t// based on the top left corner of the page.\n\tnodeTemplateDragOver(nodeTemplate, x, y) {\n\t\tif (this.isNodeTemplateInsertableIntoLink(nodeTemplate)) {\n\t\t\tconst link = this.getLinkAtMousePos(x, y);\n\t\t\t// Set highlighting when there is no link because this will turn\n\t\t\t// current highlighting off. And only switch on highlighting when we are\n\t\t\t// over a fully attached link (not a detached link).\n\t\t\tif (!link || this.isLinkFullyAttached(link)) {\n\t\t\t\tthis.setInsertNodeIntoLinkHighlighting(link);\n\t\t\t}\n\t\t}\n\n\t\tif (this.isNodeTemplateAttachableToDetachedLinks(nodeTemplate)) {\n\t\t\tconst mousePos = this.convertPageCoordsToCanvasCoords(x, y);\n\t\t\tconst ghostArea = {\n\t\t\t\tx1: mousePos.x - (nodeTemplate.width / 2),\n\t\t\t\ty1: mousePos.y - (nodeTemplate.height / 2),\n\t\t\t\tx2: mousePos.x + (nodeTemplate.width / 2),\n\t\t\t\ty2: mousePos.y + (nodeTemplate.height / 2)\n\t\t\t};\n\t\t\tconst template = this.canvasController.convertNodeTemplate(nodeTemplate);\n\t\t\tconst links = this.getAttachableLinksForNodeAtPos(template, ghostArea);\n\t\t\tthis.setDetachedLinkHighlighting(links);\n\t\t}\n\n\t\tif (this.config.enableCanvasUnderlay !== \"None\" && this.dispUtils.isDisplayingPrimaryFlowFullPage()) {\n\t\t\tthis.setCanvasUnderlaySize(x, y);\n\t\t}\n\t}\n\n\t// Switches on or off data link highlighting depending on the element\n\t// passed in and keeps track of the currently highlighted link. This is\n\t// called when a node is being dragged from the palette or canvas onto an\n\t// attached link (which joins two nodes together) which is enabled when\n\t// 'enableInsertNodeDroppedOnLink' is true.\n\tsetInsertNodeIntoLinkHighlighting(link) {\n\t\tif (link) {\n\t\t\tif (!this.dragOverLink) {\n\t\t\t\tthis.dragOverLink = link;\n\t\t\t\tthis.setNodeDragOverLinkHighlighting(this.dragOverLink, true);\n\n\t\t\t} else if (link.id !== this.dragOverLink.id) {\n\t\t\t\tthis.unsetInsertNodeIntoLinkHighlighting();\n\t\t\t\tthis.dragOverLink = link;\n\t\t\t\tthis.setNodeDragOverLinkHighlighting(this.dragOverLink, true);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.unsetInsertNodeIntoLinkHighlighting();\n\t\t}\n\t}\n\n\t// Switches off the data link highlighting caused when an insertable\n\t// node is dragged over a link (which joins two nodes together)\n\t// which is enabled when 'enableInsertNodeDroppedOnLink' is true.\n\tunsetInsertNodeIntoLinkHighlighting(link) {\n\t\tif (this.dragOverLink) {\n\t\t\tthis.setNodeDragOverLinkHighlighting(this.dragOverLink, false);\n\t\t\tthis.dragOverLink = null;\n\t\t}\n\t}\n\n\t// Switches on or off data link highlighting depending on the link array\n\t// passed in and keeps track of the currently highlighted links. This is\n\t// called when a node is dragged from the palette or the canvas over a\n\t// fully or partially detached link This behavior is enabled when\n\t// 'enableLinkSelection 'is set to LINK_SELECTION_DETACHABLE.\n\tsetDetachedLinkHighlighting(links) {\n\t\tif (links && links.length > 0) {\n\t\t\tthis.unsetDetachedLinkHighlighting();\n\t\t\tthis.dragOverDetachedLinks = links;\n\t\t\tthis.dragOverDetachedLinks.forEach((link) => this.setNodeDragOverLinkHighlighting(link, true));\n\n\t\t} else {\n\t\t\tif (this.dragOverDetachedLinks.length > 0) {\n\t\t\t\tthis.unsetDetachedLinkHighlighting();\n\t\t\t}\n\t\t}\n\t}\n\n\t// Switches off the link highlighting when a node is dragged over a fully or\n\t// partially detached link. This behavior is enabled when\n\t// 'enableLinkSelection 'is set to LINK_SELECTION_DETACHABLE.\n\tunsetDetachedLinkHighlighting() {\n\t\tthis.dragOverDetachedLinks.forEach((link) => this.setNodeDragOverLinkHighlighting(link, false));\n\t\tthis.dragOverDetachedLinks = [];\n\t}\n\n\t// Switches on or off the drop-node highlighting on the link passed in.\n\t// This is called when the user drags a node over a link.\n\t// Link highlighting is used for the 'enableInsertNodeDroppedOnLink' function\n\t// where a node can be dragged from either the palette or the canvas onto a\n\t// link between two nodes AND it is used for the function where a node can\n\t// be dragged from either the palette of canvas onto a detached link. This is\n\t// enabled when enableLinkSelection is set to LINK_SELECTION_DETACHABLE.\n\tsetNodeDragOverLinkHighlighting(link, state) {\n\t\tthis.getLinkGroupSelectionById(link.id)\n\t\t\t.attr(\"data-drag-node-over\", state ? true : null); // true will add the attr, null will remove it\n\t}\n\n\t// Switches on or off node highlighting depending on the node\n\t// passed in and keeps track of the currently highlighted node. This is\n\t// called as a new link or a detached link is being dragged towards or\n\t// away from a target node to highlight or unhighlight the target node.\n\tsetHighlightingOverNode(state, nodeNearMouse) {\n\t\tif (state) {\n\t\t\tif (!this.dragNewLinkOverNode) {\n\t\t\t\tthis.dragNewLinkOverNode = nodeNearMouse;\n\t\t\t\tthis.setLinkOverNode(this.dragNewLinkOverNode, true);\n\n\t\t\t} else if (nodeNearMouse.id !== this.dragNewLinkOverNode.id) {\n\t\t\t\tthis.setLinkOverNode(this.dragNewLinkOverNode, false);\n\t\t\t\tthis.dragNewLinkOverNode = nodeNearMouse;\n\t\t\t\tthis.setLinkOverNode(this.dragNewLinkOverNode, true);\n\t\t\t}\n\n\t\t} else {\n\t\t\tif (this.dragNewLinkOverNode) {\n\t\t\t\tthis.setLinkOverNode(this.dragNewLinkOverNode, false);\n\t\t\t\tthis.dragNewLinkOverNode = null;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Switches on or off the highlighting on the node passed in.\n\t// This is called when the user drags a link towards a target node.\n\tsetLinkOverNode(node, state) {\n\t\tif (node) {\n\t\t\tthis.getNodeGroupSelectionById(node.id)\n\t\t\t\t.attr(\"data-new-link-over\", state ? \"yes\" : \"no\");\n\t\t}\n\t}\n\n\t// Removes the data-new-link-over attribute used for highlighting a node\n\t// that a new link is being dragged towards or over.\n\tsetLinkOverNodeCancel() {\n\t\tthis.setLinkOverNode(this.dragNewLinkOverNode, false);\n\t\tthis.dragNewLinkOverNode = null;\n\t}\n\n\t// Processes the drop of a palette node template onto the canvas. The\n\t// nodeTemplate is in internal format.\n\tnodeTemplateDropped(nodeTemplate, x, y) {\n\t\tif (nodeTemplate === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst transPos = this.transformMousePosForNode(x, y, nodeTemplate);\n\n\t\t// If the node template was dropped on a link\n\t\tif (this.dragOverLink) {\n\t\t\tthis.canvasController.createNodeFromTemplateOnLinkAt(\n\t\t\t\tnodeTemplate, this.dragOverLink, transPos, this.pipelineId);\n\t\t\tthis.unsetInsertNodeIntoLinkHighlighting();\n\n\t\t// If the node template was dropped on one or more detached links.\n\t\t} else if (this.dragOverDetachedLinks.length > 0) {\n\t\t\tthis.canvasController.createNodeFromTemplateAttachLinks(\n\t\t\t\tnodeTemplate, this.dragOverDetachedLinks, transPos, this.pipelineId);\n\t\t\tthis.unsetDetachedLinkHighlighting();\n\n\t\t// If the node template was dropped on the canvas.\n\t\t} else {\n\t\t\tthis.canvasController.createNodeFromTemplateAt(\n\t\t\t\tnodeTemplate, transPos, this.pipelineId);\n\t\t}\n\t}\n\n\t// Processes the drop of an 'external' object onto the canvas. This may be\n\t// either a node from the desktop or even from elsewhere on the browser page.\n\texternalObjectDropped(dropData, x, y) {\n\t\tif (dropData === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst transPos = this.transformMousePosForNode(x, y);\n\t\tthis.canvasController.createDroppedExternalObject(dropData, transPos, this.pipelineId);\n\t}\n\n\t// Transforms the mouse position passed in to be appropriate for a palette\n\t// node or external object being dragged over the canvas.\n\ttransformMousePosForNode(x, y, node) {\n\t\tconst mousePos = this.convertPageCoordsToCanvasCoords(x, y);\n\n\t\t// Offset mousePos so new node appears in center of mouse location.\n\t\tif (node && node.width && node.height) {\n\t\t\tmousePos.x -= node.width / 2;\n\t\t\tmousePos.y -= node.height / 2;\n\t\t} else {\n\t\t\tmousePos.x -= this.nodeLayout.defaultNodeWidth / 2;\n\t\t\tmousePos.y -= this.nodeLayout.defaultNodeHeight / 2;\n\t\t}\n\n\t\treturn this.getMousePosSnapToGrid(mousePos);\n\t}\n\n\t// Returns true if the nodeTemplate passed in is 'insertable' into a data\n\t// link between nodes on the canvas. This involves ensuring the node template\n\t// will create a non binding node and also that the cardinality of the ports\n\t// is not explicitly set to zero (which some crazy apps want to do!).\n\tisNodeTemplateInsertableIntoLink(nodeTemplate) {\n\t\treturn this.config.enableInsertNodeDroppedOnLink &&\n\t\t\tCanvasUtils.hasInputAndOutputPorts(nodeTemplate) &&\n\t\t\t!this.isPortMaxCardinalityZero(nodeTemplate.inputs[0]) &&\n\t\t\t!this.isPortMaxCardinalityZero(nodeTemplate.outputs[0]);\n\t}\n\n\n\t// Returns true if the current node template being dragged from the palette\n\t// is 'attachable' to any detached link on the canvas. Returns false otherwise.\n\tisNodeTemplateAttachableToDetachedLinks(nodeTemplate) {\n\t\treturn this.config.enableLinkSelection === LINK_SELECTION_DETACHABLE;\n\t}\n\n\t// Returns an array of detached links, which can be attached to the node\n\t// passed in, that exist in proximity to the mouse position provided. Proximity\n\t// is specified by the dimensions of the ghost area passed in.\n\t// Note: The passed in 'node' will be a node when an existing node on the\n\t// canvas is being dragged but will be a node template when a node is being\n\t// dragged from the palette. Since both have inputs and outputs all should be OK.\n\tgetAttachableLinksForNodeAtPos(node, ghostArea) {\n\t\tconst nodeHasInputs = node.inputs && node.inputs.length > 0;\n\t\tconst nodeHasOutputs = node.outputs && node.outputs.length > 0;\n\n\t\tlet attachableLinks = this.activePipeline.links.filter((link) => {\n\t\t\tif (link.srcPos && nodeHasOutputs &&\n\t\t\t\t\tCanvasUtils.isPosInArea(link.srcPos, ghostArea, this.canvasLayout.ghostAreaPadding)) {\n\t\t\t\tlink.nodeOverSrcPos = true;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (link.trgPos && nodeHasInputs &&\n\t\t\t\t\tCanvasUtils.isPosInArea(link.trgPos, ghostArea, this.canvasLayout.ghostAreaPadding)) {\n\t\t\t\tlink.nodeOverTrgPos = true;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tlink.nodeOverSrcPos = false;\n\t\t\tlink.nodeOverTrgPos = false;\n\t\t\treturn false;\n\t\t});\n\n\t\tif (attachableLinks.length > 0) {\n\t\t\t// Make sure the attachable links can be attached to the node based on\n\t\t\t// the availability of ports and whether they are maxed out or not.\n\t\t\tconst linkArrays =\n\t\t\t\tCanvasUtils.getDetachedLinksToUpdate(node, attachableLinks, this.activePipeline.links);\n\t\t\tattachableLinks = linkArrays.oldLinks;\n\t\t}\n\t\treturn attachableLinks;\n\t}\n\n\t// Returns true if the link is attached to both a source node and a\n\t// target node which is indicated by the link having srcNodeId and trgNodeId\n\t// fields. When either or both of these fields are undefined the link is\n\t// semi or fully detached. This can happen when detachable links are allowed.\n\tisLinkFullyAttached(link) {\n\t\tif (link) {\n\t\t\treturn typeof link.srcNodeId !== \"undefined\" && typeof link.trgNodeId !== \"undefined\";\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Sets the maximum zoom extent if we are the renderer of the top level flow\n\t// or calls the same method on our parent renderer if we are a sub-flow. This\n\t// means the factors will multiply as they percolate up to the top flow.\n\tsetMaxZoomExtent(factor) {\n\t\tif (this.dispUtils.isDisplayingFullPage()) {\n\t\t\tthis.zoomUtils.setMaxZoomExtent(factor);\n\t\t} else {\n\t\t\tconst newFactor = Number(factor) * 1 / this.zoomUtils.getZoomScale();\n\t\t\tthis.supernodeInfo.renderer.setMaxZoomExtent(newFactor);\n\t\t}\n\t}\n\n\t// Returns a new canvas SVG object with all the behavior expected of a great\n\t// SVG canvas object.\n\tcreateCanvasSVG() {\n\t\tthis.logger.log(\"Create Canvas SVG.\");\n\n\t\t// The dimensions for the <svg> element is dependent on if it is\n\t\t// displayed for full-page display or in an expanded in-place supernode.\n\t\tconst dims = this.dispUtils.isDisplayingSubFlowInPlace()\n\t\t\t? this.getParentSupernodeSVGDimensions()\n\t\t\t: {\n\t\t\t\twidth: \"100%\",\n\t\t\t\theight: \"100%\",\n\t\t\t\tx: 0,\n\t\t\t\ty: 0\n\t\t\t};\n\n\t\t// For full screen display of primary or sub flows we use the canvasDiv as\n\t\t// the parent for the <svg> element. When rendering supernode contents we\n\t\t// use the parent supernode as the parent.\n\t\tconst parentObject = this.dispUtils.isDisplayingSubFlowInPlace()\n\t\t\t? this.supernodeInfo.d3Selection\n\t\t\t: this.canvasDiv;\n\n\t\tconst canvasSVG = parentObject\n\t\t\t.append(\"svg\")\n\t\t\t.attr(\"class\", \"svg-area\") // svg-area used in tests.\n\t\t\t.attr(\"data-pipeline-id\", this.activePipeline.id)\n\t\t\t.attr(\"aria-label\", this.canvasController.labelUtil.getLabel(\"canvas.contents\"))\n\t\t\t.attr(\"width\", dims.width)\n\t\t\t.attr(\"height\", dims.height)\n\t\t\t.attr(\"x\", dims.x)\n\t\t\t.attr(\"y\", dims.y)\n\t\t\t.on(\"mouseenter\", (d3Event, d) => {\n\t\t\t\t// If we are a sub-flow (i.e. we have a parent renderer) set the max\n\t\t\t\t// zoom extent with a factor calculated from our zoom amount.\n\t\t\t\tif (this.supernodeInfo.renderer && this.config.enableZoomIntoSubFlows) {\n\t\t\t\t\tthis.supernodeInfo.renderer.setMaxZoomExtent(1 / this.zoomUtils.getZoomScale());\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseleave\", (d3Event, d) => {\n\t\t\t\t// If we are a sub-flow (i.e. we have a parent renderer) set the max\n\t\t\t\t// zoom extent with a factor of 1.\n\t\t\t\tif (this.supernodeInfo.renderer && this.config.enableZoomIntoSubFlows) {\n\t\t\t\t\tthis.supernodeInfo.renderer.setMaxZoomExtent(1);\n\t\t\t\t}\n\t\t\t});\n\n\t\treturn canvasSVG;\n\t}\n\n\t// Creates a <defs> element that is attached to the top most SVG area when\n\t// we are displaying either the primary pipeline full page or a sub-pipeline\n\t// full page. This only needs to be done once for the whole page.\n\tcreateDefs(canvasSVG, canvasLayout) {\n\t\tif (this.dispUtils.isDisplayingFullPage()) {\n\t\t\tvar defs = canvasSVG.append(\"defs\");\n\t\t\tthis.createDropShadow(defs);\n\t\t\tthis.createGrid(defs, canvasLayout);\n\n\t\t\treturn canvasSVG.selectChildren(\"defs\");\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Adds a background rectangle to the canvas group. This is added for three reasons:\n\t// 1. On Safari, wheel events will not go to the SVG unless there is an\n\t// SVG object under the mouse pointer. Therefore we open this rectangle\n\t// to fill the SVG area to catch those events in Safari. See this stack\n\t// overflow issue for details:\n\t// https://stackoverflow.com/questions/40887193/d3-js-zoom-is-not-working-with-mousewheel-in-safari\n\t// 2. If we're displaying a sub-flow inside a supernode (on any browser)\n\t// we need a background rectangle to display the same color as\n\t// the background of the main canvas.\n\t// 3. To display a background grid underneath the canvas objects which will zoom\n\t// and pan with the canvas objects.\n\tcreateCanvasBackground(canvasSVG) {\n\t\tconst dims = this.zoomUtils.getTransformedViewportDimensions();\n\n\t\tconst canvasBackground = canvasSVG\n\t\t\t.append(\"rect\")\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", 0)\n\t\t\t.attr(\"width\", dims.width)\n\t\t\t.attr(\"height\", dims.height)\n\t\t\t.attr(\"data-pipeline-id\", this.activePipeline.id)\n\t\t\t.attr(\"pointer-events\", \"all\")\n\t\t\t.style(\"cursor\", \"default\")\n\t\t\t.on(\"mousedown\", () => {\n\t\t\t\tif (!this.svgCanvasTextArea.isEditingText()) {\n\t\t\t\t\tthis.canvasController.setFocusOnCanvas();\n\t\t\t\t}\n\t\t\t});\n\n\t\t// Set the appropriate grid ID for the canvas background.\n\t\tconst gridId = this.getGridId();\n\t\tif (gridId) {\n\t\t\tcanvasBackground.attr(\"class\", \"d3-svg-background-grid\");\n\t\t\tcanvasBackground.attr(\"fill\", `url(#${gridId})`);\n\t\t} else {\n\t\t\tcanvasBackground.attr(\"class\", \"d3-svg-background\");\n\t\t}\n\n\t\treturn canvasBackground;\n\t}\n\n\t// Sets the canvas zoom and mouse behaviors on the canvas SVG area. This is\n\t// done when the SVG area is created and also when set new canvas info is\n\t// called. This is necessary because the canvas may transition between an\n\t// empty canvas and a populated canvas (i.e. a canvas with at least one node\n\t// or comment). In the empty case we do not want any zoom behavior and in\n\t// the populated case we do.\n\tresetCanvasSVGBehaviors() {\n\t\t// Remove zoom behaviors from canvasSVG area.\n\t\tthis.removeCanvasZoomBehavior();\n\n\t\t// If there are no nodes or comments we don't apply any zoom behaviors\n\t\t// to the SVG area. We only attach the zoom behavior to the top most SVG\n\t\t// area i.e. when we are displaying either the primary pipeline full page\n\t\t// or a sub-pipeline full page.\n\t\tif (!this.activePipeline.isEmptyOrBindingsOnly() &&\n\t\t\t\tthis.dispUtils.isDisplayingFullPage()) {\n\t\t\tthis.canvasSVG.call(this.zoomUtils.getZoomHandler());\n\t\t}\n\n\t\t// These behaviors will be applied to SVG areas at the top level and\n\t\t// SVG areas displaying an in-place subflow\n\t\tthis.canvasSVG\n\t\t\t// Don't use mousedown.zoom here as it will replace the zoom start behavior\n\t\t\t// and prevent panning of canvas background.\n\t\t\t.on(\"mousedown\", (d3Event) => {\n\t\t\t\tthis.logger.log(\"Canvas - mousedown\");\n\t\t\t\t// When displaying in-place subflow and a context menu is requested\n\t\t\t\t// suppress the mouse down which would go to the containing supernode.\n\t\t\t\t// This prevents the deselection of any selected nodes in the subflow.\n\t\t\t\tif (this.dispUtils.isDisplayingSubFlowInPlace() &&\n\t\t\t\t\t\td3Event.button === CONTEXT_MENU_BUTTON) {\n\t\t\t\t\td3Event.stopPropagation();\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"click.zoom\", (d3Event) => {\n\t\t\t\t// Control comes here after the zoomClick action has been performed in zoomUtils.\n\t\t\t\tthis.logger.log(\"Canvas - click-zoom\");\n\n\t\t\t\tthis.canvasController.clickActionHandler({\n\t\t\t\t\tclickType: d3Event.type === \"contextmenu\" ? SINGLE_CLICK_CONTEXTMENU : SINGLE_CLICK,\n\t\t\t\t\tobjectType: \"canvas\",\n\t\t\t\t\tselectedObjectIds: this.activePipeline.getSelectedObjectIds()\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"dblclick.zoom\", () => {\n\t\t\t\tthis.logger.log(\"Zoom - double click\");\n\t\t\t\tthis.canvasController.clickActionHandler({\n\t\t\t\t\tclickType: DOUBLE_CLICK,\n\t\t\t\t\tobjectType: \"canvas\",\n\t\t\t\t\tselectedObjectIds: this.activePipeline.getSelectedObjectIds() });\n\t\t\t})\n\t\t\t.on(\"contextmenu.zoom\", (d3Event, d) => {\n\t\t\t\tthis.logger.log(\"Zoom - context menu\");\n\t\t\t\tthis.openContextMenu(d3Event, \"canvas\");\n\t\t\t});\n\t}\n\n\t// When adding back zoom behavior we need to reset all canvas behaviors\n\t// because the \".zoom\" events will have been removed from this.canvasSVG\n\t// when removeCanvasZoomBehavior was called.\n\taddCanvasZoomBehavior() {\n\t\tthis.resetCanvasSVGBehaviors();\n\t}\n\n\tremoveCanvasZoomBehavior() {\n\t\tthis.canvasSVG.on(\".zoom\", null);\n\t}\n\n\t// Resets the pointer cursor on the background rectangle in the Canvas SVG area.\n\tresetCanvasCursor() {\n\t\tconst selector = \".d3-svg-background[data-pipeline-id='\" + this.activePipeline.id + \"']\";\n\t\tthis.canvasSVG.select(selector).style(\"cursor\", this.zoomUtils.isDragActivated() && this.dispUtils.isDisplayingFullPage() ? \"grab\" : \"default\");\n\t}\n\n\tcreateCanvasGroup(canvasObj, className) {\n\t\treturn canvasObj.append(\"g\").attr(\"class\", className);\n\t}\n\n\tcreateCanvasUnderlay(canvasGrp, className) {\n\t\tif (this.config.enableCanvasUnderlay !== \"None\" && this.dispUtils.isDisplayingPrimaryFlowFullPage()) {\n\t\t\treturn canvasGrp.append(\"rect\").attr(\"class\", className);\n\t\t}\n\t\treturn null;\n\t}\n\n\tcreateBoundingRectanglesGrp(canvasGrp, className) {\n\t\tif (this.config.enableBoundingRectangles) {\n\t\t\treturn canvasGrp.append(\"g\").attr(\"class\", className);\n\t\t}\n\t\treturn null;\n\t}\n\n\tsetCanvasUnderlaySize(x = 0, y = 0) {\n\t\tconst canv = this.zoomUtils.getCanvasDimensionsWithPadding();\n\t\tif (canv) {\n\t\t\tthis.canvasUnderlay\n\t\t\t\t.attr(\"x\", canv.left - 50)\n\t\t\t\t.attr(\"y\", canv.top - 50)\n\t\t\t\t.attr(\"width\", canv.width + 100)\n\t\t\t\t.attr(\"height\", canv.height + 100);\n\t\t}\n\t}\n\n\tsetCanvasBackgroundSize() {\n\t\tconst dims = this.zoomUtils.getTransformedViewportDimensions();\n\n\t\tthis.canvasBackground\n\t\t\t.attr(\"x\", dims.x)\n\t\t\t.attr(\"y\", dims.y)\n\t\t\t.attr(\"width\", dims.width)\n\t\t\t.attr(\"height\", dims.height);\n\t}\n\n\tcreateDropShadow(defs) {\n\t\tvar dropShadowFilter = defs.append(\"filter\")\n\t\t\t.attr(\"id\", this.getId(\"node_drop_shadow\"))\n\t\t\t.attr(\"x\", \"-20%\")\n\t\t\t.attr(\"y\", \"-20%\")\n\t\t\t.attr(\"width\", \"200%\")\n\t\t\t.attr(\"height\", \"200%\");\n\n\t\tdropShadowFilter.append(\"feOffset\")\n\t\t\t.attr(\"in\", \"SourceAlpha\")\n\t\t\t.attr(\"dx\", 1)\n\t\t\t.attr(\"dy\", 1)\n\t\t\t.attr(\"result\", \"offOut\");\n\n\t\tdropShadowFilter.append(\"feGaussianBlur\")\n\t\t\t.attr(\"in\", \"offOut\")\n\t\t\t.attr(\"stdDeviation\", \"3\")\n\t\t\t.attr(\"result\", \"blurOut\");\n\n\t\tdropShadowFilter.append(\"feBlend\")\n\t\t\t.attr(\"in\", \"SourceGraphic\")\n\t\t\t.attr(\"in2\", \"blurOut\")\n\t\t\t.attr(\"mode\", \"normal\");\n\n\t\tdropShadowFilter.append(\"feComponentTransfer\")\n\t\t\t.append(\"feFuncA\")\n\t\t\t.attr(\"type\", \"linear\")\n\t\t\t.attr(\"slope\", \"0.2\");\n\n\t\tvar feMerge = dropShadowFilter.append(\"feMerge\");\n\t\tfeMerge.append(\"feMergeNode\");\n\t\tfeMerge.append(\"feMergeNode\").attr(\"in\", \"SourceGraphic\");\n\t}\n\n\t// Adds <pattern>s to the <defs> element which can be used to draw\n\t// different background grids on the canvas based on the settings\n\t// in canvasLayout. This can be:\n\t// Dots -- which needs a single pattern\n\t// Boxes -- which needs a single pattern\n\t// DotsAndLines -- which needs two patterns\n\t// BoxesAndLines -- which needs two patterns\n\tcreateGrid(defs, canvasLayout) {\n\t\tconst gridMajorPx = canvasLayout.displayGridMajorPx;\n\t\tconst gridMajorPy = canvasLayout.displayGridMajorPy;\n\t\tconst gridMinorPx = canvasLayout.displayGridMinorPx;\n\t\tconst gridMinorPy = canvasLayout.displayGridMinorPy;\n\n\t\tconst gridId = this.getGridId();\n\n\t\tif (canvasLayout.displayGridType === DISPLAY_GRID_DOTS) {\n\t\t\tthis.addDotsPattern(defs, gridId, gridMinorPx, gridMinorPy);\n\n\t\t} else if (canvasLayout.displayGridType === DISPLAY_GRID_BOXES) {\n\t\t\tthis.addBoxesPattern(defs, gridId, gridMinorPx, gridMinorPy);\n\n\t\t} else if (canvasLayout.displayGridType === DISPLAY_GRID_BOXES_AND_LINES) {\n\t\t\tthis.addBoxesPattern(defs, \"smallGrid\", gridMinorPx, gridMinorPy);\n\n\t\t\tconst gridPattern = defs.append(\"pattern\")\n\t\t\t\t.attr(\"id\", gridId)\n\t\t\t\t.attr(\"width\", gridMajorPx)\n\t\t\t\t.attr(\"height\", gridMajorPy)\n\t\t\t\t.attr(\"x\", 0)\n\t\t\t\t.attr(\"y\", 0)\n\t\t\t\t.attr(\"patternUnits\", \"userSpaceOnUse\");\n\t\t\tgridPattern.append(\"rect\")\n\t\t\t\t.attr(\"width\", gridMajorPx)\n\t\t\t\t.attr(\"height\", gridMajorPy)\n\t\t\t\t.attr(\"stroke\", \"none\")\n\t\t\t\t.attr(\"fill\", \"url(#smallGrid)\");\n\t\t\tgridPattern.append(\"path\")\n\t\t\t\t.attr(\"d\", `M ${gridMajorPx} 0 L 0 0 0 ${gridMajorPy}`)\n\t\t\t\t.attr(\"class\", \"d3-grid-lines\");\n\n\t\t} else if (canvasLayout.displayGridType === DISPLAY_GRID_DOTS_AND_LINES) {\n\t\t\tthis.addDotsPattern(defs, \"smallGrid\", gridMinorPx, gridMinorPy);\n\n\t\t\tconst gridPattern = defs.append(\"pattern\")\n\t\t\t\t.attr(\"id\", gridId)\n\t\t\t\t.attr(\"width\", gridMajorPx)\n\t\t\t\t.attr(\"height\", gridMajorPy)\n\t\t\t\t.attr(\"x\", 0)\n\t\t\t\t.attr(\"y\", 0)\n\t\t\t\t.attr(\"patternUnits\", \"userSpaceOnUse\");\n\t\t\tgridPattern.append(\"rect\")\n\t\t\t\t.attr(\"width\", gridMajorPx - gridMinorPx)\n\t\t\t\t.attr(\"height\", gridMajorPy - gridMinorPy)\n\t\t\t\t.attr(\"x\", gridMinorPx * 0.5)\n\t\t\t\t.attr(\"y\", gridMinorPy * 0.5)\n\t\t\t\t.attr(\"stroke\", \"none\")\n\t\t\t\t.attr(\"fill\", \"url(#smallGrid)\");\n\t\t\tgridPattern.append(\"path\")\n\t\t\t\t.attr(\"d\", `M ${gridMajorPx} 0 L 0 0 0 ${gridMajorPy}`)\n\t\t\t\t.attr(\"class\", \"d3-grid-lines\");\n\t\t}\n\t}\n\n\t// Returns a grid ID for the display grid requested. The instanceId\n\t// is included in the returned ID to ensure that each instance of\n\t// the canvas has its own grid pattern.\n\tgetGridId() {\n\t\tif (this.canvasLayout.displayGridType === DISPLAY_GRID_DOTS) {\n\t\t\treturn \"d3_grid_dots_pattern_\" + this.instanceId;\n\n\t\t} else if (this.canvasLayout.displayGridType === DISPLAY_GRID_BOXES) {\n\t\t\treturn \"d3_grid_boxes_pattern_\" + this.instanceId;\n\n\t\t} else if (this.canvasLayout.displayGridType === DISPLAY_GRID_DOTS_AND_LINES) {\n\t\t\treturn \"d3_grid_dots_lines_pattern_\" + this.instanceId;\n\n\t\t} else if (this.canvasLayout.displayGridType === DISPLAY_GRID_BOXES_AND_LINES) {\n\t\t\treturn \"d3_grid_boxes_lines_pattern_\" + this.instanceId;\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Adds a pattern of dots to the <defs> element.\n\taddDotsPattern(defs, id, gridMinorPx, gridMinorPy) {\n\t\tconst smallGridPattern = defs.append(\"pattern\")\n\t\t\t.attr(\"id\", id)\n\t\t\t.attr(\"width\", gridMinorPx)\n\t\t\t.attr(\"height\", gridMinorPy)\n\t\t\t.attr(\"x\", gridMinorPx * 0.5)\n\t\t\t.attr(\"y\", gridMinorPy * 0.5)\n\t\t\t.attr(\"patternUnits\", \"userSpaceOnUse\");\n\n\t\tsmallGridPattern.append(\"circle\")\n\t\t\t.attr(\"cx\", gridMinorPx * 0.5)\n\t\t\t.attr(\"cy\", gridMinorPy * 0.5)\n\t\t\t.attr(\"class\", \"d3-grid-dot\");\n\n\t\treturn smallGridPattern;\n\t}\n\n\t// Adds a pattern of boxes to the <defs> element.\n\taddBoxesPattern(defs, id, gridMinorPx, gridMinorPy) {\n\t\tconst smallGridPattern = defs.append(\"pattern\")\n\t\t\t.attr(\"id\", id)\n\t\t\t.attr(\"width\", gridMinorPx)\n\t\t\t.attr(\"height\", gridMinorPy)\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", 0)\n\t\t\t.attr(\"patternUnits\", \"userSpaceOnUse\");\n\t\tsmallGridPattern.append(\"path\")\n\t\t\t.attr(\"d\", `M ${gridMinorPx} 0 L 0 0 0 ${gridMinorPy}`)\n\t\t\t.attr(\"class\", \"d3-grid-boxes\");\n\t}\n\n\tsetCommentEditingMode(commentId, pipelineId) {\n\t\tif (this.pipelineId === pipelineId) {\n\t\t\tconst comment = this.activePipeline.getComment(commentId);\n\t\t\tif (comment && this.config.enableEditingActions) {\n\t\t\t\tconst comSel = this.getCommentGroupSelectionById(commentId);\n\t\t\t\tconst comDomObj = comSel.node();\n\t\t\t\tthis.displayCommentTextArea(comment, comDomObj);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.superRenderers.forEach((renderer) => {\n\t\t\t\trenderer.setCommentEditingMode(commentId, pipelineId);\n\t\t\t});\n\t\t}\n\t}\n\n\tsetNodeLabelEditingMode(nodeId, pipelineId) {\n\t\tif (this.pipelineId === pipelineId) {\n\t\t\tconst node = this.activePipeline.getNode(nodeId);\n\t\t\tif (node && node.layout.labelEditable && this.config.enableEditingActions) {\n\t\t\t\tconst nodeSel = this.getNodeGroupSelectionById(nodeId);\n\t\t\t\tconst nodeDomObj = nodeSel.node();\n\t\t\t\tthis.displayNodeLabelTextArea(node, nodeDomObj);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.superRenderers.forEach((renderer) => {\n\t\t\t\trenderer.setNodeLabelEditingMode(nodeId, pipelineId);\n\t\t\t});\n\t\t}\n\t}\n\n\tsetNodeDecorationLabelEditingMode(decId, nodeId, pipelineId) {\n\t\tif (this.pipelineId === pipelineId) {\n\t\t\tconst node = this.activePipeline.getNode(nodeId);\n\t\t\tif (node && node.decorations) {\n\t\t\t\tconst dec = node.decorations.find((d) => d.id === decId);\n\t\t\t\tif (dec && typeof dec.label !== \"undefined\" && dec.label_editable && this.config.enableEditingActions) {\n\t\t\t\t\tconst nodeDecSel = this.getNodeDecSelectionById(decId, nodeId);\n\t\t\t\t\tconst nodeDecDomObj = nodeDecSel.node();\n\t\t\t\t\tthis.displayDecLabelTextArea(dec, node, \"node\", nodeDecDomObj);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.superRenderers.forEach((renderer) => {\n\t\t\t\trenderer.setLinkDecorationLabelEditingMode(decId, nodeId, pipelineId);\n\t\t\t});\n\t\t}\n\t}\n\n\tsetLinkDecorationLabelEditingMode(decId, linkId, pipelineId) {\n\t\tif (this.pipelineId === pipelineId) {\n\t\t\tconst link = this.activePipeline.getLink(linkId);\n\t\t\tif (link && link.decorations) {\n\t\t\t\tconst dec = link.decorations.find((d) => d.id === decId);\n\t\t\t\tif (dec && typeof dec.label !== \"undefined\" && dec.label_editable && this.config.enableEditingActions) {\n\t\t\t\t\tconst linkDecSel = this.getLinkDecSelectionById(decId, linkId);\n\t\t\t\t\tconst linkDecDomObj = linkDecSel.node();\n\t\t\t\t\tthis.displayDecLabelTextArea(dec, link, \"link\", linkDecDomObj);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.superRenderers.forEach((renderer) => {\n\t\t\t\trenderer.setLinkDecorationLabelEditingMode(decId, linkId, pipelineId);\n\t\t\t});\n\t\t}\n\t}\n\n\t// Repositions the comment toolbar so it is always over the top of the\n\t// comment being edited.\n\trepositionCommentToolbar() {\n\t\tif (this.dispUtils.isDisplayingFullPage() &&\n\t\t\tthis.svgCanvasTextArea.isEditingText()) {\n\t\t\t// If a node label or text decoration is being edited com will be undefined.\n\t\t\tconst com = this.activePipeline.getComment(this.svgCanvasTextArea.getEditingTextId());\n\t\t\tif (com && (com.contentType === WYSIWYG || this.config.enableMarkdownInComments)) {\n\t\t\t\tconst pos = this.getCommentToolbarPos(com);\n\t\t\t\tthis.canvasController.moveTextToolbar(pos.x, pos.y);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Returns a position object that describes the position in page coordinates\n\t// of the comment toolbar so that it is positioned above the comment being edited.\n\tgetCommentToolbarPos(com) {\n\t\tconst pos = this.zoomUtils.unTransformPos({ x: com.x_pos, y: com.y_pos });\n\t\treturn {\n\t\t\tx: pos.x + this.canvasLayout.commentToolbarPosX,\n\t\t\ty: pos.y + this.canvasLayout.commentToolbarPosY\n\t\t};\n\t}\n\n\t// Returns the snap-to-grid position of the object positioned at objPos.x\n\t// and objPos.y. The grid that is snapped to is defined by this.snapToGridXPx\n\t// and this.snapToGridYPx values which are pixel values.\n\tsnapToGridPosition(objPos) {\n\t\tconst stgPosX = CanvasUtils.snapToGrid(objPos.x, this.canvasLayout.snapToGridXPx);\n\t\tconst stgPosY = CanvasUtils.snapToGrid(objPos.y, this.canvasLayout.snapToGridYPx);\n\n\t\treturn { x: stgPosX, y: stgPosY };\n\t}\n\n\t// Displays all the nodes on the canvas either by creating new nodes,\n\t// updating existing nodes or removing unwanted nodes.\n\tdisplayNodes() {\n\t\tthis.logger.logStartTimer(\"displayNodes \" + this.getFlags());\n\n\t\t// Set the port positions for all ports - these will be needed when displaying\n\t\t// nodes and links. This needs to be done here because a resized supernode\n\t\t// will cause its ports to move and resizing comments causes links to be\n\t\t// redrawn which will need port positions to be set appropriately.\n\t\tthis.setPortPositionsAllNodes();\n\n\t\tconst sel = this.getAllNodeGroupsSelection();\n\t\tthis.displayNodesSubset(sel, this.activePipeline.nodes);\n\n\t\tthis.logger.logEndTimer(\"displayNodes \" + this.getFlags());\n\t}\n\n\tdisplayMovedNodes() {\n\t\tthis.logger.logStartTimer(\"displayMovedNodes\");\n\t\tconst nodeGroupSel = this.getAllNodeGroupsSelection();\n\n\t\tnodeGroupSel\n\t\t\t.datum((d) => this.activePipeline.getNode(d.id))\n\t\t\t.attr(\"transform\", (d) => `translate(${d.x_pos}, ${d.y_pos})`);\n\n\t\tif (this.dispUtils.isDisplayingSubFlow()) {\n\t\t\tnodeGroupSel\n\t\t\t\t.each((d, i, nodeGrps) => {\n\t\t\t\t\tif (d.isSupernodeInputBinding) {\n\t\t\t\t\t\tthis.updatePortRadiusAndPos(nodeGrps[i], d, \"d3-node-port-output-main\");\n\t\t\t\t\t\tthis.updateOutputPortArrowPath(nodeGrps[i], \"d3-node-port-output-arrow\");\n\t\t\t\t\t}\n\t\t\t\t\tif (d.isSupernodeOutputBinding) {\n\t\t\t\t\t\tthis.updatePortRadiusAndPos(nodeGrps[i], d, \"d3-node-port-input-main\");\n\t\t\t\t\t\tthis.updateInputPortArrowPath(nodeGrps[i], \"d3-node-port-input-arrow\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\t\tthis.logger.logEndTimer(\"displayMovedNodes\");\n\t}\n\n\tdisplayNodesSelectionStatus(selectionInfo) {\n\t\tthis.logger.logStartTimer(\"displayNodesSelectionStatus\");\n\n\t\tthis.getAllNodeGroupsSelection()\n\t\t\t.selectChildren(\".d3-node-selection-highlight\")\n\t\t\t.attr(\"data-selected\", (d) => (this.activePipeline.isSelected(d.id) ? \"yes\" : \"no\"));\n\n\t\tthis.logger.logEndTimer(\"displayNodesSelectionStatus\");\n\t}\n\n\tdisplaySingleNode(d) {\n\t\tthis.logger.logStartTimer(\"displaySingleNode \" + this.getFlags());\n\n\t\tthis.setPortPositionsForNode(d);\n\n\t\tconst selection = this.getNodeGroupSelectionById(d.id);\n\t\tthis.displayNodesSubset(selection, [d]);\n\n\t\tthis.logger.logEndTimer(\"displaySingleNode \" + this.getFlags());\n\t}\n\n\tdisplayNodesSubset(selection, data) {\n\t\t// The D3 join operation can sometimes cause focus to be lost from any\n\t\t// currently focused object involved in the join (even if no new objects\n\t\t// have been created or if no objects are removed) so we preserve and\n\t\t// reinstate the focus after this operation is complete.\n\t\tthis.preserveFocus(() => {\n\t\t\tselection\n\t\t\t\t.data(data, (d) => d.id)\n\t\t\t\t.join(\n\t\t\t\t\t(enter) => this.createNodes(enter),\n\t\t\t\t\tnull,\n\t\t\t\t\t(remove) => this.removeNodes(remove)\n\t\t\t\t)\n\t\t\t\t.attr(\"transform\", (d) => `translate(${d.x_pos}, ${d.y_pos})`)\n\t\t\t\t.attr(\"class\", (d) => this.getNodeGroupClass(d))\n\t\t\t\t.attr(\"style\", (d) => this.getNodeGrpStyle(d))\n\t\t\t\t.attr(\"tabindex\", (d) => (this.config.enableKeyboardNavigation ? -1 : null))\n\t\t\t\t.attr(\"aria-label\", (d) => d.label)\n\t\t\t\t.attr(\"aria-roledescription\", this.canvasController.labelUtil.getLabel(\"node.ariaRoleDescription\"))\n\t\t\t\t.call((joinedNodeGrps) => this.updateNodes(joinedNodeGrps, data));\n\t\t});\n\t}\n\n\tcreateNodes(enter) {\n\t\tthis.logger.logStartTimer(\"createNodes\");\n\n\t\tconst newNodeGroups = enter\n\t\t\t.append(\"g\")\n\t\t\t.attr(\"data-id\", (d) => this.getId(\"node_grp\", d.id))\n\t\t\t.call(this.attachNodeGroupListeners.bind(this));\n\n\t\tthis.logger.logEndTimer(\"createNodes\");\n\n\t\treturn newNodeGroups;\n\t}\n\n\tupdateNodes(joinedNodeGrps, data) {\n\t\tthis.logger.logStartTimer(\"updateNodes\");\n\n\t\tconst nonBindingNodeGrps = joinedNodeGrps.filter((node) => !CanvasUtils.isSuperBindingNode(node));\n\n\t\t// Node Focus Outline\n\t\t// This is created by the 'moveFocusTo' function when focus is moved to a\n\t\t// node. The 'd3-focus-path' element only exists for one canvas object at a time.\n\t\tnonBindingNodeGrps\n\t\t\t.selectChildren(\".d3-focus-path\")\n\t\t\t.data((d) => ([d]), (d) => d.id)\n\t\t\t.join(\n\t\t\t\t(enter) => null // Focus outline is created when focus is moved to the node (in moveFocusTo)\n\t\t\t)\n\t\t\t.attr(\"d\", (d) => this.getNodeShapePathSizing(d));\n\n\t\t// Node Sizing Area\n\t\tnonBindingNodeGrps\n\t\t\t.selectChildren(\".d3-node-sizing\")\n\t\t\t.data((d) => (CanvasUtils.isNodeResizable(d, this.config) ? [d] : []), (d) => d.id)\n\t\t\t.join(\n\t\t\t\t(enter) =>\n\t\t\t\t\tenter\n\t\t\t\t\t\t.insert(\"path\",\n\t\t\t\t\t\t\t(d, i, newNodes) =>\n\t\t\t\t\t\t\t\tthis.nodeUtils.getBeforeElement(newNodes[i]._parent, \"d3-node-sizing\"))\n\t\t\t\t\t\t.attr(\"class\", \"d3-node-sizing\")\n\t\t\t\t\t\t.call(this.attachNodeSizingListeners.bind(this))\n\t\t\t)\n\t\t\t.datum((d) => this.activePipeline.getNode(d.id))\n\t\t\t.attr(\"d\", (d) => this.getNodeShapePathSizing(d));\n\n\t\t// Node Selection Highlighting Outline.\n\t\tnonBindingNodeGrps\n\t\t\t.selectChildren(\".d3-node-selection-highlight\")\n\t\t\t.data((d) => ([d]), (d) => d.id)\n\t\t\t.join(\n\t\t\t\t(enter) =>\n\t\t\t\t\tenter\n\t\t\t\t\t\t.insert(\"path\",\n\t\t\t\t\t\t\t(d, i, newNodes) =>\n\t\t\t\t\t\t\t\tthis.nodeUtils.getBeforeElement(newNodes[i]._parent, \"d3-node-selection-highlight\"))\n\t\t\t\t\t\t.attr(\"class\", \"d3-node-selection-highlight\")\n\t\t\t)\n\t\t\t.datum((d) => this.activePipeline.getNode(d.id))\n\t\t\t.attr(\"d\", (d) => this.getNodeSelectionOutline(d))\n\t\t\t.attr(\"data-selected\", (d) => (this.activePipeline.isSelected(d.id) ? \"yes\" : \"no\"))\n\t\t\t.attr(\"style\", (d) => this.getNodeSelectionOutlineStyle(d, \"default\"));\n\n\t\t// Node Body\n\t\tnonBindingNodeGrps\n\t\t\t.selectChildren(\".d3-node-body-outline\")\n\t\t\t.data((d) => (d.layout.nodeShapeDisplay ? [d] : []), (d) => d.id)\n\t\t\t.join(\n\t\t\t\t(enter) =>\n\t\t\t\t\tenter\n\t\t\t\t\t\t.insert(\"path\",\n\t\t\t\t\t\t\t(d, i, newNodes) =>\n\t\t\t\t\t\t\t\tthis.nodeUtils.getBeforeElement(newNodes[i]._parent, \"d3-node-body-outline\"))\n\t\t\t\t\t\t.attr(\"class\", \"d3-node-body-outline\")\n\t\t\t)\n\t\t\t.datum((d) => this.activePipeline.getNode(d.id))\n\t\t\t.attr(\"d\", (d) => this.getNodeShapePath(d))\n\t\t\t.attr(\"style\", (d) => this.getNodeBodyStyle(d, \"default\"));\n\n\t\t// Optional foreign object to contain a React object\n\t\tnonBindingNodeGrps\n\t\t\t.selectChildren(\".d3-foreign-object-external-node\")\n\t\t\t.data((d) => (d.layout.nodeExternalObject ? [d] : []), (d) => d.id)\n\t\t\t.join(\n\t\t\t\t(enter) =>\n\t\t\t\t\tenter\n\t\t\t\t\t\t.insert(\"foreignObject\",\n\t\t\t\t\t\t\t(d, i, newNodes) =>\n\t\t\t\t\t\t\t\tthis.nodeUtils.getBeforeElement(newNodes[i]._parent, \"d3-foreign-object-external-node\"))\n\t\t\t\t\t\t.attr(\"class\", \"d3-foreign-object-external-node\"),\n\t\t\t\tnull,\n\t\t\t\t(exit) => {\n\t\t\t\t\texit.each((d, idx, exts) =>\n\t\t\t\t\t\tthis.externalUtils.removeExternalObject(d, idx, exts));\n\t\t\t\t\texit.remove();\n\t\t\t\t}\n\t\t\t)\n\t\t\t.datum((d) => this.activePipeline.getNode(d.id))\n\t\t\t.attr(\"tabindex\", -1)\n\t\t\t.attr(\"width\", (d) => d.width)\n\t\t\t.attr(\"height\", (d) => d.height)\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", 0)\n\t\t\t.each((d, idx, exts) =>\n\t\t\t\tthis.externalUtils.addNodeExternalObject(d, idx, exts, this.activePipeline.pipeline));\n\n\t\t// Node Image\n\t\tnonBindingNodeGrps\n\t\t\t.selectChildren(\".d3-node-image\")\n\t\t\t.data((d) => (d.layout.imageDisplay ? [d] : []), (d) => d.id)\n\t\t\t.join(\n\t\t\t\t(enter) =>\n\t\t\t\t\tenter\n\t\t\t\t\t\t.insert((d) => this.getImageElement(d),\n\t\t\t\t\t\t\t(d, i, newNodes) =>\n\t\t\t\t\t\t\t\tthis.nodeUtils.getBeforeElement(newNodes[i]._parent, \"d3-node-image\"))\n\t\t\t)\n\t\t\t.datum((d) => this.activePipeline.getNode(d.id))\n\t\t\t.each((d, idx, imgs) => this.setNodeImageContent(d, idx, imgs))\n\t\t\t.attr(\"x\", (d) => this.nodeUtils.getNodeImagePosX(d))\n\t\t\t.attr(\"y\", (d) => this.nodeUtils.getNodeImagePosY(d))\n\t\t\t.attr(\"width\", (d) => this.nodeUtils.getNodeImageWidth(d))\n\t\t\t.attr(\"height\", (d) => this.nodeUtils.getNodeImageHeight(d))\n\t\t\t.attr(\"style\", (d) => this.getNodeImageStyle(d, \"default\"));\n\n\t\t// Node Label\n\t\tnonBindingNodeGrps\n\t\t\t.selectChildren(\".d3-foreign-object-node-label\")\n\t\t\t.data((d) => (d.layout.labelDisplay ? [d] : []), (d) => d.id)\n\t\t\t.join(\n\t\t\t\t(enter) => {\n\t\t\t\t\tconst labelFOSel = enter\n\t\t\t\t\t\t.insert(\"foreignObject\",\n\t\t\t\t\t\t\t(d, i, newNodes) =>\n\t\t\t\t\t\t\t\tthis.nodeUtils.getBeforeElement(newNodes[i]._parent, \"d3-foreign-object-node-label\"))\n\t\t\t\t\t\t.attr(\"class\", \"d3-foreign-object-node-label\")\n\t\t\t\t\t\t.call(this.attachNodeLabelListeners.bind(this));\n\t\t\t\t\tlabelFOSel\n\t\t\t\t\t\t.append(\"xhtml:div\") // Provide a namespace when div is inside foreignObject\n\t\t\t\t\t\t.append(\"xhtml:span\") // Provide a namespace when span is inside foreignObject\n\t\t\t\t\t\t.call(this.attachNodeLabelSpanListeners.bind(this));\n\t\t\t\t\treturn labelFOSel;\n\t\t\t\t}\n\t\t\t)\n\t\t\t.datum((d) => this.activePipeline.getNode(d.id))\n\t\t\t.attr(\"x\", (d) => this.nodeUtils.getNodeLabelPosX(d))\n\t\t\t.attr(\"y\", (d) => this.nodeUtils.getNodeLabelPosY(d))\n\t\t\t.attr(\"width\", (d) => this.nodeUtils.getNodeLabelWidth(d))\n\t\t\t.attr(\"height\", (d) => this.nodeUtils.getNodeLabelHeight(d))\n\t\t\t.select(\"div\")\n\t\t\t.attr(\"class\", (d) => this.nodeUtils.getNodeLabelClass(d))\n\t\t\t.attr(\"style\", (d) => this.getNodeLabelStyle(d, \"default\"))\n\t\t\t.select(\"span\")\n\t\t\t.html((d) => escapeText(d.label));\n\n\t\t// Node Ellipsis Icon - if one exists\n\t\tnonBindingNodeGrps.selectChildren(\".d3-node-ellipsis-group\")\n\t\t\t.attr(\"transform\", (d) => this.nodeUtils.getNodeEllipsisTranslate(d));\n\n\t\t// Node (Supernode) Expansion Icon - if one exists\n\t\tnonBindingNodeGrps.selectChildren(\".d3-node-super-expand-icon-group\")\n\t\t\t.attr(\"transform\", (d) => this.nodeUtils.getNodeExpansionIconTranslate(d));\n\n\t\t// Ports display; Supernode sub-flow display; Error marker display; and\n\t\t// Decoration display.\n\t\tjoinedNodeGrps.each((d, index, grps) => {\n\t\t\tconst nodeGrp = d3.select(grps[index]);\n\n\t\t\tthis.displayPorts(nodeGrp, d);\n\n\t\t\tif (CanvasUtils.isSupernode(d)) {\n\t\t\t\tthis.displaySupernodeContents(d, d3.select(grps[index]));\n\t\t\t}\n\n\t\t\tif (!CanvasUtils.isSuperBindingNode(d)) {\n\t\t\t\t// Display error indicator\n\t\t\t\tthis.addErrorMarker(d, nodeGrp);\n\n\t\t\t\t// Display Decorators\n\t\t\t\tconst decorations = CanvasUtils.getCombinedDecorations(d.layout.decorations, d.decorations);\n\t\t\t\tthis.displayDecorations(d, DEC_NODE, nodeGrp, decorations);\n\t\t\t}\n\t\t});\n\n\t\t// Add or remove drag behavior as appropriate\n\t\tconst handler = this.dragObjectUtils.getDragObjectHandler();\n\t\tnonBindingNodeGrps\n\t\t\t.filter((d) => this.shouldAddDragHandlerToNode(d))\n\t\t\t.call(handler);\n\n\t\tnonBindingNodeGrps\n\t\t\t.filter((d) => !this.shouldAddDragHandlerToNode(d))\n\t\t\t.on(\".drag\", null);\n\n\t\tthis.logger.logEndTimer(\"updateNodes\");\n\t}\n\n\t// Returns true if the drag handler should be added to a node.\n\tshouldAddDragHandlerToNode(d) {\n\t\treturn CanvasUtils.isObjectMovable(d) && this.config.enableEditingActions;\n\t}\n\n\tremoveNodes(removeSel) {\n\t\t// Remove any JSX images for the nodes being removed to\n\t\t// unmount their React objects.\n\t\tremoveSel\n\t\t\t.selectAll(\".d3-foreign-object-node-image\")\n\t\t\t.each((d, idx, exts) =>\n\t\t\t\tthis.externalUtils.removeExternalObject(d, idx, exts));\n\n\t\t// Remove any JSX decorations for the nodes being removed to\n\t\t// unmount their React objects.\n\t\tremoveSel\n\t\t\t.selectAll(\".d3-foreign-object-dec-jsx\")\n\t\t\t.each((d, idx, exts) =>\n\t\t\t\tthis.externalUtils.removeExternalObject(d, idx, exts));\n\n\t\t// Remove any JSX ports for nodes being removed to\n\t\t// unmount their React objects.\n\t\tremoveSel\n\t\t\t.selectChildren(\".d3-foreign-object-port-jsx\")\n\t\t\t.each((d, idx, exts) =>\n\t\t\t\tthis.externalUtils.removeExternalObject(d, idx, exts));\n\n\t\t// Remove any foreign objects for React nodes to\n\t\t// unmount their React objects.\n\t\tremoveSel\n\t\t\t.selectChildren(\".d3-foreign-object-external-node\")\n\t\t\t.each((d, idx, exts) =>\n\t\t\t\tthis.externalUtils.removeExternalObject(d, idx, exts));\n\n\t\t// Remove all nodes in the selection.\n\t\tremoveSel.remove();\n\t}\n\n\t// Handles the display of a supernode sub-flow contents or hides the contents\n\t// as necessary.\n\tdisplaySupernodeContents(d, supernodeD3Object) {\n\t\tlet ren = this.getRendererForSupernode(d);\n\n\t\tif (CanvasUtils.isExpanded(d)) {\n\t\t\tif (!ren) {\n\t\t\t\tren = this.createSupernodeRenderer(d, supernodeD3Object); // Create will call displayCanvas\n\t\t\t\tthis.superRenderers.push(ren);\n\t\t\t} else {\n\t\t\t\t// Setting canvas info will call displayCanvas for the sub-flow\n\t\t\t\tren.setCanvasInfoRenderer(\n\t\t\t\t\tthis.canvasInfo,\n\t\t\t\t\tthis.selectionInfo,\n\t\t\t\t\tthis.breadcrumbs,\n\t\t\t\t\tthis.nodeLayout,\n\t\t\t\t\tthis.canvasLayout,\n\t\t\t\t\tthis.config\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tif (ren) {\n\t\t\t\tren.hideCanvas(d);\n\t\t\t}\n\t\t}\n\t}\n\n\tdisplayPorts(nodeGrp, d) {\n\t\tthis.displayInputPorts(nodeGrp, d);\n\t\tthis.displayOutputPorts(nodeGrp, d);\n\t}\n\n\tdisplayInputPorts(nodeGrp, node) {\n\t\tconst inSelector = \".\" + this.getNodeInputPortClassName();\n\n\t\t// Some applications may set inputs to undefined after inputs was\n\t\t// previously set to an array, so use empty array in that case so any\n\t\t// existing input ports are removed from the node.\n\t\tlet inputs = node.inputs || [];\n\n\t\t// Don't display input ports if config says not to.\n\t\tinputs = node.layout.inputPortDisplay ? inputs : [];\n\n\t\tnodeGrp.selectChildren(inSelector)\n\t\t\t.data(inputs, (p) => p.id)\n\t\t\t.join(\n\t\t\t\t(enter) => this.createInputPorts(enter, node),\n\t\t\t\tnull,\n\t\t\t\t(remove) => this.removePorts(remove)\n\t\t\t)\n\t\t\t.attr(\"connected\", (port) => (port.isConnected ? \"yes\" : \"no\"))\n\t\t\t.attr(\"class\", (port) => this.getNodeInputPortClassName() + (port.class_name ? \" \" + port.class_name : \"\"))\n\t\t\t.attr(\"tabindex\", -1)\n\t\t\t.attr(\"role\", \"button\")\n\t\t\t.attr(\"aria-label\", (port) => port.label || port.id)\n\t\t\t.attr(\"aria-roledescription\", this.canvasController.labelUtil.getLabel(\"port.ariaRoleDescription\"))\n\t\t\t.call((joinedInputPortGrps) => this.updateInputPorts(joinedInputPortGrps, node));\n\t}\n\n\tcreateInputPorts(enter, node) {\n\t\tconst inputPortGroups = enter\n\t\t\t.append(\"g\")\n\t\t\t.attr(\"data-port-id\", (port) => port.id)\n\t\t\t.attr(\"isSupernodeBinding\", CanvasUtils.isSuperBindingNode(node) ? \"yes\" : \"no\")\n\t\t\t.each((port, i, inputPorts) => {\n\t\t\t\tconst portIdx = CanvasUtils.getPortIndex(node.inputs, port.id);\n\t\t\t\tconst portDisplayInfo = this.getPortDisplayInfo(node.layout.inputPortDisplayObjects, portIdx);\n\t\t\t\tconst obj = d3.select(inputPorts[i]);\n\t\t\t\tobj\n\t\t\t\t\t.append(portDisplayInfo.tag)\n\t\t\t\t\t.attr(\"tabindex\", -1)\n\t\t\t\t\t.attr(\"class\", \"d3-node-port-input-main\" +\n\t\t\t\t\t\t(portDisplayInfo.tag === \"foreignObject\" ? \" d3-foreign-object-port-jsx\" : \"\"));\n\n\t\t\t\t// Show a port arrow inside the port circle if:\n\t\t\t\t// We are not supporting association link creation,\n\t\t\t\t// and we are drawing a circleWithArrow and this is not a super binding node.\n\t\t\t\tobj\n\t\t\t\t\t.filter(() => (!this.config.enableAssocLinkCreation &&\n\t\t\t\t\t\tportDisplayInfo.type === PORT_DISPLAY_CIRCLE_WITH_ARROW &&\n\t\t\t\t\t\t!CanvasUtils.isSuperBindingNode(node)))\n\t\t\t\t\t.append(\"path\")\n\t\t\t\t\t.attr(\"class\", \"d3-node-port-input-arrow\");\n\t\t\t})\n\t\t\t.call(this.attachInputPortListeners.bind(this), node);\n\n\t\treturn inputPortGroups;\n\t}\n\n\tupdateInputPorts(joinedInputPortGrps, node) {\n\t\tjoinedInputPortGrps.selectChildren(\".d3-node-port-input-main\")\n\t\t\t.datum((port) => node.inputs.find((i) => port.id === i.id))\n\t\t\t.each((port, i, inputPorts) => {\n\t\t\t\tconst obj = d3.select(inputPorts[i]);\n\t\t\t\tconst portIdx = CanvasUtils.getPortIndex(node.inputs, port.id);\n\t\t\t\tconst portDisplayInfo = this.getPortDisplayInfo(node.layout.inputPortDisplayObjects, portIdx);\n\t\t\t\tconst transform = this.getPortImageTransform(port, FLOW_IN);\n\t\t\t\tthis.updatePort(obj, portDisplayInfo, node, port.cx, port.cy, transform);\n\t\t\t});\n\n\t\tjoinedInputPortGrps.selectChildren(\".d3-node-port-input-arrow\")\n\t\t\t.datum((port) => node.inputs.find((i) => port.id === i.id))\n\t\t\t.each((port, i, inputPorts) => {\n\t\t\t\tconst obj = d3.select(inputPorts[i]);\n\t\t\t\tconst portIdx = CanvasUtils.getPortIndex(node.inputs, port.id);\n\t\t\t\tconst portDisplayInfo = this.getPortDisplayInfo(node.layout.inputPortDisplayObjects, portIdx);\n\t\t\t\tif (portDisplayInfo.type === PORT_DISPLAY_CIRCLE_WITH_ARROW) {\n\t\t\t\t\tobj\n\t\t\t\t\t\t.attr(\"d\", this.getPortArrowPath())\n\t\t\t\t\t\t.attr(\"transform\", this.getInputPortArrowPathTransform(port));\n\t\t\t\t}\n\t\t\t});\n\n\t\tif (this.config.enableEditingActions) {\n\t\t\tconst handler = this.dragNewLinkUtils.getDragNewLinkHandler();\n\t\t\tjoinedInputPortGrps.call(handler);\n\t\t} else {\n\t\t\tjoinedInputPortGrps.on(\".drag\", null);\n\t\t}\n\t}\n\n\tremovePorts(removeSel) {\n\t\t// Remove any JSX ports for nodes being removed to\n\t\t// unmount their React objects.\n\t\tremoveSel\n\t\t\t.selectChildren(\".d3-foreign-object-port-jsx\")\n\t\t\t.each((d, idx, exts) =>\n\t\t\t\tthis.externalUtils.removeExternalObject(d, idx, exts));\n\n\t\t// Remove all ports in the selection.\n\t\tremoveSel.remove();\n\t}\n\n\tdisplayOutputPorts(nodeGrp, node) {\n\t\tconst outSelector = \".\" + this.getNodeOutputPortClassName();\n\n\t\t// Some applications may set outputs to undefined after outputs was\n\t\t// previously set to an array, so use empty array in that case so any\n\t\t// existing output ports are removed from the node.\n\t\tlet outputs = node.outputs || [];\n\n\t\t// Don't display output ports if config says not to.\n\t\toutputs = node.layout.outputPortDisplay ? outputs : [];\n\n\t\t// Only show a single output port (the last one) if config tells us to.\n\t\toutputs = this.config.enableSingleOutputPortDisplay && outputs.length > 1\n\t\t\t? [outputs[outputs.length - 1]]\n\t\t\t: outputs;\n\n\t\tnodeGrp.selectChildren(outSelector)\n\t\t\t.data(outputs, (p) => p.id)\n\t\t\t.join(\n\t\t\t\t(enter) => this.createOutputPorts(enter, node),\n\t\t\t\tnull,\n\t\t\t\t(remove) => this.removePorts(remove)\n\t\t\t)\n\t\t\t.attr(\"connected\", (port) => (port.isConnected ? \"yes\" : \"no\"))\n\t\t\t.attr(\"class\", (port) => this.getNodeOutputPortClassName() + (port.class_name ? \" \" + port.class_name : \"\"))\n\t\t\t.attr(\"tabindex\", -1)\n\t\t\t.attr(\"role\", \"button\")\n\t\t\t.attr(\"aria-label\", (port) => {\n\t\t\t\tconst label = port.label || port.id;\n\t\t\t\treturn port.connectFrom\n\t\t\t\t\t? this.canvasController.labelUtil.getLabel(\"port.markedForOutput\", { label: label })\n\t\t\t\t\t: label;\n\t\t\t})\n\t\t\t.attr(\"aria-roledescription\", this.canvasController.labelUtil.getLabel(\"port.ariaRoleDescription\"))\n\t\t\t.call((joinedOutputPortGrps) => this.updateOutputPorts(joinedOutputPortGrps, node));\n\t}\n\n\tcreateOutputPorts(enter, node) {\n\t\tconst outputPortGroups = enter\n\t\t\t.append(\"g\")\n\t\t\t.attr(\"data-port-id\", (port) => port.id)\n\t\t\t.attr(\"isSupernodeBinding\", CanvasUtils.isSuperBindingNode(node) ? \"yes\" : \"no\")\n\t\t\t.each((port, i, outputPorts) => {\n\t\t\t\tconst portIdx = CanvasUtils.getPortIndex(node.outputs, port.id);\n\t\t\t\tconst portDisplayInfo = this.getPortDisplayInfo(node.layout.outputPortDisplayObjects, portIdx);\n\t\t\t\tconst obj = d3.select(outputPorts[i]);\n\t\t\t\tobj\n\t\t\t\t\t.append(portDisplayInfo.tag)\n\t\t\t\t\t.attr(\"tabindex\", -1)\n\t\t\t\t\t.attr(\"class\", \"d3-node-port-output-main\" +\n\t\t\t\t\t\t(portDisplayInfo.tag === \"foreignObject\" ? \" d3-foreign-object-port-jsx\" : \"\"));\n\n\t\t\t\t// Show a port arrow inside the port circle if:\n\t\t\t\t// We are not supporting association link creation,\n\t\t\t\t// and we are drawing a circleWithArrow and this is not a super binding node.\n\t\t\t\tobj\n\t\t\t\t\t.filter(() => (!this.config.enableAssocLinkCreation &&\n\t\t\t\t\t\tportDisplayInfo.type === PORT_DISPLAY_CIRCLE_WITH_ARROW &&\n\t\t\t\t\t\t!CanvasUtils.isSuperBindingNode(node)))\n\t\t\t\t\t.append(\"path\")\n\t\t\t\t\t.attr(\"class\", \"d3-node-port-output-arrow\");\n\n\t\t\t})\n\t\t\t.call(this.attachOutputPortListeners.bind(this), node);\n\n\t\treturn outputPortGroups;\n\t}\n\n\tupdateOutputPorts(joinedOutputPortGrps, node) {\n\t\tjoinedOutputPortGrps.selectChildren(\".d3-node-port-output-main\")\n\t\t\t.datum((port) => node.outputs.find((o) => port.id === o.id))\n\t\t\t.each((port, i, outputPorts) => {\n\t\t\t\tconst obj = d3.select(outputPorts[i]);\n\t\t\t\tconst portIdx = CanvasUtils.getPortIndex(node.outputs, port.id);\n\t\t\t\tconst portInfo = this.getPortDisplayInfo(node.layout.outputPortDisplayObjects, portIdx);\n\t\t\t\tconst transform = this.getPortImageTransform(port, FLOW_OUT);\n\t\t\t\tthis.updatePort(obj, portInfo, node, port.cx, port.cy, transform);\n\t\t\t});\n\n\t\tjoinedOutputPortGrps.selectChildren(\".d3-node-port-output-arrow\")\n\t\t\t.datum((port) => node.outputs.find((i) => port.id === i.id))\n\t\t\t.each((port, i, outputPorts) => {\n\t\t\t\tconst obj = d3.select(outputPorts[i]);\n\t\t\t\tconst portIdx = CanvasUtils.getPortIndex(node.outputs, port.id);\n\t\t\t\tconst portDisplayInfo = this.getPortDisplayInfo(node.layout.outputPortDisplayObjects, portIdx);\n\t\t\t\tif (portDisplayInfo.type === PORT_DISPLAY_CIRCLE_WITH_ARROW) {\n\t\t\t\t\tobj\n\t\t\t\t\t\t.attr(\"d\", this.getPortArrowPath())\n\t\t\t\t\t\t.attr(\"transform\", this.getOutputPortArrowPathTransform(port));\n\t\t\t\t}\n\t\t\t});\n\n\t\t// Update connect-from indicator arrows - only create when needed\n\t\tjoinedOutputPortGrps.each((port, i, outputPortGrps) => {\n\t\t\tconst portGrp = d3.select(outputPortGrps[i]);\n\t\t\tconst existingArrow = portGrp.select(\".d3-node-port-output-connect-from-arrow\");\n\n\t\t\tif (port.connectFrom) {\n\t\t\t\t// Create arrow if it doesn't exist\n\t\t\t\tif (existingArrow.empty()) {\n\t\t\t\t\tportGrp.append(\"path\")\n\t\t\t\t\t\t.attr(\"class\", \"d3-node-port-output-connect-from-arrow\");\n\t\t\t\t}\n\t\t\t\t// Update arrow path and transform based on port direction\n\t\t\t\tconst arrowInfo = this.getConnectFromArrowInfo(port, node);\n\t\t\t\tportGrp.select(\".d3-node-port-output-connect-from-arrow\")\n\t\t\t\t\t.attr(\"d\", arrowInfo.path)\n\t\t\t\t\t.attr(\"transform\", arrowInfo.transform);\n\t\t\t} else {\n\t\t\t\t// Remove arrow if it exists and connectFrom is false\n\t\t\t\tif (!existingArrow.empty()) {\n\t\t\t\t\texistingArrow.remove();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif (this.config.enableEditingActions) {\n\t\t\tconst handler = this.dragNewLinkUtils.getDragNewLinkHandler();\n\t\t\tjoinedOutputPortGrps.call(handler);\n\t\t} else {\n\t\t\tjoinedOutputPortGrps.on(\".drag\", null);\n\t\t}\n\t}\n\n\tupdatePort(obj, portInfo, node, cx, cy, transform) {\n\t\tif (portInfo.type === PORT_DISPLAY_JSX || portInfo.type === PORT_DISPLAY_IMAGE) {\n\t\t\tif (portInfo.type === PORT_DISPLAY_JSX) {\n\t\t\t\tobj\n\t\t\t\t\t.each((portData, idx, exts) => this.externalUtils.addJsxExternalObject(portInfo.src, idx, exts));\n\t\t\t} else {\n\t\t\t\tobj.attr(\"xlink:href\", portInfo.src);\n\t\t\t}\n\t\t\tobj\n\t\t\t\t.attr(\"x\", cx - (portInfo.width / 2))\n\t\t\t\t.attr(\"y\", cy - (portInfo.height / 2))\n\t\t\t\t.attr(\"width\", portInfo.width)\n\t\t\t\t.attr(\"height\", portInfo.height)\n\t\t\t\t.attr(\"transform\", transform);\n\n\t\t} else {\n\t\t\tobj\n\t\t\t\t.attr(\"r\", this.getPortRadius(node))\n\t\t\t\t.attr(\"cx\", cx)\n\t\t\t\t.attr(\"cy\", cy);\n\t\t}\n\t}\n\n\tgetPortDisplayInfo(displayObjects, i) {\n\t\tconst idx = (i < displayObjects.length) ? i : displayObjects.length - 1;\n\t\tconst portObj = displayObjects[idx];\n\t\tconst obj = { ...portObj };\n\t\tobj.tag = obj.type === \"jsx\" ? \"foreignObject\" : obj.type;\n\t\tobj.tag = obj.type === \"circleWithArrow\" ? \"circle\" : obj.tag;\n\t\tobj.width = obj.width || PORT_WIDTH_DEFAULT;\n\t\tobj.width = obj.height || PORT_HEIGHT_DEFAULT;\n\t\treturn obj;\n\t}\n\n\t// Attaches the appropriate listeners to the node groups.\n\tattachNodeGroupListeners(nodeGrps) {\n\t\tnodeGrps\n\t\t\t.on(\"keydown\", (d3Event, d) => {\n\t\t\t\tif (this.config.enableKeyboardNavigation) {\n\t\t\t\t\tif (KeyboardUtils.nextObjectInGroup(d3Event)) {\n\t\t\t\t\t\tconst linkInfos = this.activePipeline.getNextLinksFromNode(d);\n\t\t\t\t\t\tif (linkInfos.length > 0) {\n\t\t\t\t\t\t\tconst linkInfosAll = this.activePipeline.getAllLinksForNode(d);\n\t\t\t\t\t\t\tlinkInfosAll.forEach((li) => (li.link.navObject = d));\n\t\t\t\t\t\t\tthis.setFocusObject(linkInfos[0].link, d3Event);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if (KeyboardUtils.previousObjectInGroup(d3Event)) {\n\t\t\t\t\t\tconst linkInfos = this.activePipeline.getPreviousLinksToNode(d);\n\t\t\t\t\t\tif (linkInfos.length > 0) {\n\t\t\t\t\t\t\tconst linkInfosAll = this.activePipeline.getAllLinksForNode(d);\n\t\t\t\t\t\t\tlinkInfosAll.forEach((li) => (li.link.navObject = d));\n\t\t\t\t\t\t\tthis.setFocusObject(linkInfos[0].link, d3Event);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if (KeyboardUtils.focusSubObject(d3Event)) {\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\t\tthis.clearSubObject();\n\t\t\t\t\t\tthis.setFocusNextSubObject(d, d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.cancelFocusOnSubObject(d3Event)) {\n\t\t\t\t\t\tthis.canvasController.restoreFocus();\n\n\t\t\t\t\t} else if (KeyboardUtils.moveObjectUp(d3Event)) {\n\t\t\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\t\t\tthis.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\t\t\t\tthis.dragObjectUtils.moveObject(d, NORTH));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.moveObjectDown(d3Event)) {\n\t\t\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\t\t\tthis.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\t\t\t\tthis.dragObjectUtils.moveObject(d, SOUTH));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.moveObjectRight(d3Event)) {\n\t\t\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\t\t\tthis.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\t\t\t\tthis.dragObjectUtils.moveObject(d, EAST));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.moveObjectLeft(d3Event)) {\n\t\t\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\t\t\tthis.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\t\t\t\tthis.dragObjectUtils.moveObject(d, WEST));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.selectObject(d3Event)) {\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\t\tconst clickType = this.canvasController.isSelected(d.id, this.activePipeline.id) ? DOUBLE_CLICK : SINGLE_CLICK;\n\t\t\t\t\t\tthis.selectObject(d, clickType);\n\n\t\t\t\t\t} else if (KeyboardUtils.selectObjectAugment(d3Event)) {\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\t\tthis.selectObject(d, SINGLE_CLICK, false, true);\n\n\t\t\t\t\t} else if (KeyboardUtils.selectObjectRange(d3Event)) {\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\t\tthis.selectObject(d, SINGLE_CLICK, true, false);\n\n\t\t\t\t\t} else if (KeyboardUtils.sizeObjectUp(d3Event)) {\n\t\t\t\t\t\tif (CanvasUtils.isNodeResizable(d, this.config)) {\n\t\t\t\t\t\t\tthis.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\t\t\t\tthis.dragObjectUtils.sizeObject(d, NORTH));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.sizeObjectDown(d3Event)) {\n\t\t\t\t\t\tif (CanvasUtils.isNodeResizable(d, this.config)) {\n\t\t\t\t\t\t\tthis.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\t\t\t\tthis.dragObjectUtils.sizeObject(d, SOUTH));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.sizeObjectRight(d3Event)) {\n\t\t\t\t\t\tif (CanvasUtils.isNodeResizable(d, this.config)) {\n\t\t\t\t\t\t\tthis.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\t\t\t\tthis.dragObjectUtils.sizeObject(d, EAST));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.sizeObjectLeft(d3Event)) {\n\t\t\t\t\t\tif (CanvasUtils.isNodeResizable(d, this.config)) {\n\t\t\t\t\t\t\tthis.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\t\t\t\tthis.dragObjectUtils.sizeObject(d, WEST));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.createLink(d3Event)) {\n\t\t\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\t\t\tthis.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\t\t\t\tthis.dragNewLinkUtils.createNewLinkFromSelections(),\n\t\t\t\t\t\t\ttrue, // true - \"augment\" the selection\n\t\t\t\t\t\t\ttrue); // true - always do the auto-select (regardless of how enableDragWithoutSelect is set)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.displayContextOptions(d3Event)) {\n\t\t\t\t\t\t// Don't let keypress go through to the Canvas otherwise the\n\t\t\t\t\t\t// canvas context menu/toolbar will be opened.\n\t\t\t\t\t\td3Event.stopPropagation();\n\n\t\t\t\t\t\tif (!CanvasUtils.isSuperBindingNode(d)) {\n\t\t\t\t\t\t\tthis.selectObject(d, SINGLE_CLICK_CONTEXTMENU);\n\n\t\t\t\t\t\t\tif (this.config.enableContextToolbar) {\n\t\t\t\t\t\t\t\tthis.addContextToolbar(d3Event, d, \"node\", CAUSE_KEYBOARD);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst pos = this.getObjectCenterPosition(d3Event.currentTarget);\n\t\t\t\t\t\t\t\tthis.openContextMenu(d3Event, \"node\", d, null, pos);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseenter\", (d3Event, d) => {\n\t\t\t\tif (this.isDragging() || this.svgCanvasTextArea.isEditingText()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst nodeGrp = d3.select(d3Event.currentTarget);\n\t\t\t\tthis.raiseNodeToTop(nodeGrp);\n\n\t\t\t\tthis.setNodeStyles(d, \"hover\", nodeGrp);\n\n\t\t\t\tif (this.config.enableContextToolbar) {\n\t\t\t\t\tthis.addContextToolbar(d3Event, d, \"node\", CAUSE_MOUSE);\n\t\t\t\t} else {\n\t\t\t\t\tthis.addDynamicNodeIcons(d3Event, d, nodeGrp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t// This will be called when the mouse cursor enters the node or moves out of\n\t\t\t// child elements of the node. Some child elements, like decorations, may have\n\t\t\t// their own tooltips so this will redisplay the node tooltip on exiting the decoration.\n\t\t\t.on(\"mouseover\", (d3Event, d) => {\n\t\t\t\td3Event.stopPropagation(); // Stop propagation in case we are in a sub-flow\n\t\t\t\tif (this.canOpenTip(TIP_TYPE_NODE)) {\n\t\t\t\t\tconst tipId = this.canvasController.getTipId(); // Id of current tip or null\n\t\t\t\t\tconst nodeTipId = this.getId(\"node_tip\", d.id);\n\n\t\t\t\t\tif (tipId === null || tipId !== nodeTipId) {\n\t\t\t\t\t\tthis.canvasController.closeTip();\n\t\t\t\t\t\tthis.canvasController.openTip({\n\t\t\t\t\t\t\tid: nodeTipId,\n\t\t\t\t\t\t\ttype: TIP_TYPE_NODE,\n\t\t\t\t\t\t\ttargetObj: d3Event.currentTarget,\n\t\t\t\t\t\t\tpipelineId: this.activePipeline.id,\n\t\t\t\t\t\t\tnode: d\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseleave\", (d3Event, d) => {\n\t\t\t\tconst nodeGrp = d3.select(d3Event.currentTarget);\n\t\t\t\tthis.setNodeStyles(d, \"default\", nodeGrp);\n\t\t\t\tif (this.config.enableContextToolbar) {\n\t\t\t\t\tthis.removeContextToolbar();\n\t\t\t\t} else {\n\t\t\t\t\tthis.removeDynamicNodeIcons(d3Event, d, nodeGrp);\n\t\t\t\t}\n\t\t\t\tthis.canvasController.closeTip();\n\t\t\t})\n\t\t\t// Use mouse down instead of click because it gets called before drag start.\n\t\t\t.on(\"mousedown\", (d3Event, d) => {\n\t\t\t\tthis.logger.logStartTimer(\"Node Group - mouse down\");\n\t\t\t\td3Event.stopPropagation();\n\t\t\t\tif (this.svgCanvasTextArea.isEditingText()) {\n\t\t\t\t\tthis.svgCanvasTextArea.completeEditing(d3Event);\n\t\t\t\t}\n\n\t\t\t\tif (this.config.enableKeyboardNavigation) {\n\t\t\t\t\tthis.setFocusObject(d, d3Event, d.layout.onFocusAllowDefaultAction, true);\n\t\t\t\t}\n\n\t\t\t\tif (!this.config.enableDragWithoutSelect) {\n\t\t\t\t\tconst clickType = d3Event.button === 2 ? SINGLE_CLICK_CONTEXTMENU : SINGLE_CLICK;\n\t\t\t\t\tthis.selectObjectD3Event(d3Event, d, clickType);\n\t\t\t\t}\n\t\t\t\tthis.logger.logEndTimer(\"Node Group - mouse down\");\n\t\t\t})\n\t\t\t.on(\"click\", (d3Event, d) => {\n\t\t\t\tthis.logger.log(\"Node Group - click\");\n\t\t\t\td3Event.stopPropagation();\n\t\t\t})\n\t\t\t.on(\"dblclick\", (d3Event, d) => {\n\t\t\t\tthis.logger.log(\"Node Group - double click\");\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\tthis.canvasController.clickActionHandler({\n\t\t\t\t\tclickType: DOUBLE_CLICK,\n\t\t\t\t\tobjectType: \"node\",\n\t\t\t\t\tid: d.id,\n\t\t\t\t\tselectedObjectIds: this.activePipeline.getSelectedObjectIds(),\n\t\t\t\t\tpipelineId: this.activePipeline.id\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"contextmenu\", (d3Event, d) => {\n\t\t\t\tthis.logger.log(\"Node Group - context menu\");\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\tif (!CanvasUtils.isSuperBindingNode(d)) {\n\t\t\t\t\t// With enableDragWithoutSelect set to true, the object for which the\n\t\t\t\t\t// context menu is being requested needs to be implicitly selected.\n\t\t\t\t\tif (this.config.enableDragWithoutSelect) {\n\t\t\t\t\t\tthis.selectObjectD3Event(d3Event, d, SINGLE_CLICK_CONTEXTMENU);\n\t\t\t\t\t}\n\t\t\t\t\tthis.setFocusObject(d, d3Event, false, true);\n\t\t\t\t\tif (!this.config.enableContextToolbar) {\n\t\t\t\t\t\tthis.openContextMenu(d3Event, \"node\", d);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tgetObjectCenterPosition(obj) {\n\t\tconst rect = obj.getBoundingClientRect();\n\t\tconst rect2 = this.canvasSVG.node().getBoundingClientRect();\n\t\treturn {\n\t\t\tx: rect.left - rect2.left + (rect.width / 2),\n\t\t\ty: rect.top - rect2.top + (rect.height / 2)\n\t\t};\n\t}\n\n\tattachNodeSizingListeners(nodeGrps) {\n\t\tnodeGrps\n\t\t\t.on(\"mousedown\", (d3Event, d) => {\n\t\t\t\tthis.dragObjectUtils.mouseDownNodeSizingArea(d);\n\t\t\t})\n\t\t\t// Use mousemove as well as mouseenter so the cursor will change\n\t\t\t// if the pointer moves from one area of the node outline to another\n\t\t\t// (eg. from east area to north-east area) without exiting the node outline.\n\t\t\t// A mouseenter is triggered when the sizing operation stops and the\n\t\t\t// pointer leaves the temporary overlay (which is removed) and enters\n\t\t\t// the node outline.\n\t\t\t.on(\"mousemove mouseenter\", (d3Event, d) => {\n\t\t\t\tthis.dragObjectUtils.mouseEnterNodeSizingArea(d3Event, d);\n\t\t\t})\n\t\t\t.on(\"mouseleave\", (d3Event, d) => {\n\t\t\t\tthis.dragObjectUtils.mouseLeaveNodeSizingArea(d3Event, d);\n\t\t\t});\n\t}\n\n\tattachNodeLabelListeners(nodeLabels) {\n\t\tnodeLabels\n\t\t\t.on(\"mouseenter\", (d3Event, d) => {\n\t\t\t\tconst labelSel = d3.select(d3Event.currentTarget);\n\t\t\t\tif (this.config.enableDisplayFullLabelOnHover && !CanvasUtils.isExpandedSupernode(d)) {\n\t\t\t\t\tconst spanSel = labelSel.selectAll(\"span\");\n\t\t\t\t\tlabelSel\n\t\t\t\t\t\t.attr(\"x\", this.nodeUtils.getNodeLabelHoverPosX(d))\n\t\t\t\t\t\t.attr(\"width\", this.nodeUtils.getNodeLabelHoverWidth(d))\n\t\t\t\t\t\t.attr(\"height\", this.nodeUtils.getNodeLabelHoverHeight(d, spanSel.node(), this.zoomUtils.getZoomScale()));\n\t\t\t\t\tspanSel.classed(\"d3-label-full\", true);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseleave\", (d3Event, d) => {\n\t\t\t\tconst labelSel = d3.select(d3Event.currentTarget);\n\t\t\t\tif (this.config.enableDisplayFullLabelOnHover && !CanvasUtils.isExpandedSupernode(d)) {\n\t\t\t\t\tlabelSel\n\t\t\t\t\t\t.attr(\"x\", this.nodeUtils.getNodeLabelPosX(d))\n\t\t\t\t\t\t.attr(\"width\", this.nodeUtils.getNodeLabelWidth(d))\n\t\t\t\t\t\t.attr(\"height\", this.nodeUtils.getNodeLabelHeight(d));\n\t\t\t\t\tlabelSel.selectAll(\"span\").classed(\"d3-label-full\", false);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"dblclick\", (d3Event, d) => {\n\t\t\t\tthis.logger.log(\"Node Label - double click\");\n\t\t\t\tif (d.layout.labelEditable && this.config.enableEditingActions) {\n\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\tthis.canvasController.textActionHandler(\"setNodeLabelEditingMode\", \"textdoubleclick\",\n\t\t\t\t\t\t{ id: d.id, pipelineId: this.activePipeline.id });\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tattachNodeLabelSpanListeners(nodeLabelSpans) {\n\t\tnodeLabelSpans\n\t\t\t.on(\"mouseenter\", (d3Event, d) => {\n\t\t\t\tif (d.layout.labelEditable && this.config.enableEditingActions) {\n\t\t\t\t\tclearTimeout(this.hideEditIconPending);\n\t\t\t\t\tthis.displayNodeLabelEditIcon(d3Event.currentTarget, d);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseleave\", (d3Event, d) => {\n\t\t\t\tif (d.layout.labelEditable && this.config.enableEditingActions) {\n\t\t\t\t\t// Wait half a sec to let the user get the pointer into the edit icon, otherwise it is closed immediately.\n\t\t\t\t\tthis.hideEditIconPending = setTimeout(this.hideEditIcon.bind(this), 500, d3Event.currentTarget, d);\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tattachInputPortListeners(inputPorts, node) {\n\t\tinputPorts\n\t\t\t.on(\"keydown\", (d3Event, port) => {\n\t\t\t\tif (this.config.enableKeyboardNavigation) {\n\t\t\t\t\tif (KeyboardUtils.nextSubObject(d3Event)) {\n\t\t\t\t\t\t// Get updated node from activePipeline that will contain focusFunction - if one exists\n\t\t\t\t\t\tconst n = this.activePipeline.getNode(node.id);\n\t\t\t\t\t\tthis.setFocusNextSubObject(n, d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.previousSubObject(d3Event)) {\n\t\t\t\t\t\t// Get updated node from activePipeline that will contain focusFunction - if one exists\n\t\t\t\t\t\tconst n = this.activePipeline.getNode(node.id);\n\t\t\t\t\t\tthis.setFocusPreviousSubObject(n, d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.cancelFocusOnSubObject(d3Event)) {\n\t\t\t\t\t\tthis.canvasController.restoreFocus();\n\n\t\t\t\t\t} else if (KeyboardUtils.clickSubObject(d3Event)) {\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\t\tthis.canvasController.clickActionHandler({\n\t\t\t\t\t\t\tclickType: SINGLE_CLICK,\n\t\t\t\t\t\t\tobjectType: \"port\",\n\t\t\t\t\t\t\tid: port.id,\n\t\t\t\t\t\t\tnodeId: node.id,\n\t\t\t\t\t\t\tselectedObjectIds: this.activePipeline.getSelectedObjectIds(),\n\t\t\t\t\t\t\tpipelineId: this.activePipeline.id\n\t\t\t\t\t\t});\n\n\t\t\t\t\t} else if (KeyboardUtils.createLinkFromConnectFrom(d3Event)) {\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\t\tconst connectFromInfo = this.canvasController.getConnectFromInfo(this.activePipeline.id);\n\t\t\t\t\t\tif (connectFromInfo) {\n\t\t\t\t\t\t\tthis.dragNewLinkUtils.createNewNodeLink(connectFromInfo.node, connectFromInfo.portId, node, port.id);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if (KeyboardUtils.displayContextOptions(d3Event)) {\n\t\t\t\t\t\t// Don't let keypress go through to the Canvas otherwise the\n\t\t\t\t\t\t// canvas context menu/toolbar will be opened.\n\t\t\t\t\t\td3Event.stopPropagation();\n\n\t\t\t\t\t\t// Simulates a single right-button click on the port\n\t\t\t\t\t\tthis.selectObject(node, SINGLE_CLICK_CONTEXTMENU);\n\n\t\t\t\t\t\tif (this.config.enableContextToolbar) {\n\t\t\t\t\t\t\tthis.addContextToolbar(d3Event, node, \"input_port\", CAUSE_KEYBOARD, null, null, port);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst pos = this.getObjectCenterPosition(d3Event.currentTarget);\n\t\t\t\t\t\t\tthis.openContextMenu(d3Event, \"input_port\", node, port, pos);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseenter\", (d3Event, port) => {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event); // stop event propagation, otherwise node tip is shown\n\t\t\t\tif (this.canOpenTip(TIP_TYPE_PORT)) {\n\t\t\t\t\tthis.canvasController.closeTip();\n\t\t\t\t\tthis.canvasController.openTip({\n\t\t\t\t\t\tid: this.getId(\"node_port_tip\", port.id),\n\t\t\t\t\t\ttype: TIP_TYPE_PORT,\n\t\t\t\t\t\ttargetObj: d3Event.currentTarget,\n\t\t\t\t\t\tpipelineId: this.activePipeline.id,\n\t\t\t\t\t\tnode: node,\n\t\t\t\t\t\tport: port\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseleave\", () => {\n\t\t\t\tthis.canvasController.closeTip();\n\t\t\t})\n\t\t\t.on(\"contextmenu\", (d3Event, port) => {\n\t\t\t\tthis.logger.log(\"Input Port Circle - context menu\");\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t// With enableDragWithoutSelect set to true, the object for which the\n\t\t\t\t// context menu is being requested needs to be implicitly selected.\n\t\t\t\tif (this.config.enableDragWithoutSelect) {\n\t\t\t\t\tthis.selectObjectD3Event(d3Event, node, SINGLE_CLICK_CONTEXTMENU);\n\t\t\t\t}\n\n\t\t\t\tthis.openContextMenu(d3Event, \"input_port\", node, port);\n\t\t\t});\n\t}\n\n\tattachOutputPortListeners(outputPorts, node) {\n\t\toutputPorts\n\t\t\t.on(\"keydown\", (d3Event, port) => {\n\t\t\t\tif (this.config.enableKeyboardNavigation) {\n\t\t\t\t\tif (KeyboardUtils.nextSubObject(d3Event)) {\n\t\t\t\t\t\t// Get updated node from activePipeline that will contain focusFunction - if one exists\n\t\t\t\t\t\tconst n = this.activePipeline.getNode(node.id);\n\t\t\t\t\t\tthis.setFocusNextSubObject(n, d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.previousSubObject(d3Event)) {\n\t\t\t\t\t\t// Get updated node from activePipeline that will contain focusFunction - if one exists\n\t\t\t\t\t\tconst n = this.activePipeline.getNode(node.id);\n\t\t\t\t\t\tthis.setFocusPreviousSubObject(n, d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.cancelFocusOnSubObject(d3Event)) {\n\t\t\t\t\t\tthis.canvasController.restoreFocus();\n\n\t\t\t\t\t} else if (KeyboardUtils.clickSubObject(d3Event)) {\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\t\tthis.canvasController.clickActionHandler({\n\t\t\t\t\t\t\tclickType: SINGLE_CLICK,\n\t\t\t\t\t\t\tobjectType: \"port\",\n\t\t\t\t\t\t\tid: port.id,\n\t\t\t\t\t\t\tnodeId: node.id,\n\t\t\t\t\t\t\tselectedObjectIds: this.activePipeline.getSelectedObjectIds(),\n\t\t\t\t\t\t\tpipelineId: this.activePipeline.id\n\t\t\t\t\t\t});\n\n\t\t\t\t\t} else if (KeyboardUtils.addConnectFromStatus(d3Event)) {\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\t\tthis.canvasController.setPortConnectFrom(node.id, port.id, this.activePipeline.id);\n\n\t\t\t\t\t} else if (KeyboardUtils.displayContextOptions(d3Event)) {\n\t\t\t\t\t\t// Don't let keypress go through to the Canvas otherwise the\n\t\t\t\t\t\t// canvas context menu/toolbar will be opened.\n\t\t\t\t\t\td3Event.stopPropagation();\n\n\t\t\t\t\t\t// Simulates a single right-button click on the port\n\t\t\t\t\t\tthis.selectObject(node, SINGLE_CLICK_CONTEXTMENU);\n\n\t\t\t\t\t\tif (this.config.enableContextToolbar) {\n\t\t\t\t\t\t\tthis.addContextToolbar(d3Event, node, \"output_port\", CAUSE_KEYBOARD, null, null, port);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst pos = this.getObjectCenterPosition(d3Event.currentTarget);\n\t\t\t\t\t\t\tthis.openContextMenu(d3Event, \"output_port\", node, port, pos);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseenter\", (d3Event, port) => {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event); // stop event propagation, otherwise node tip is shown\n\t\t\t\tif (this.canOpenTip(TIP_TYPE_PORT)) {\n\t\t\t\t\tthis.canvasController.closeTip();\n\t\t\t\t\tthis.canvasController.openTip({\n\t\t\t\t\t\tid: this.getId(\"node_port_tip\", port.id),\n\t\t\t\t\t\ttype: TIP_TYPE_PORT,\n\t\t\t\t\t\ttargetObj: d3Event.currentTarget,\n\t\t\t\t\t\tpipelineId: this.activePipeline.id,\n\t\t\t\t\t\tnode: node,\n\t\t\t\t\t\tport: port\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseleave\", () => {\n\t\t\t\tthis.canvasController.closeTip();\n\t\t\t})\n\t\t\t.on(\"contextmenu\", (d3Event, port) => {\n\t\t\t\tthis.logger.log(\"Output Port Circle - context menu\");\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t// With enableDragWithoutSelect set to true, the object for which the\n\t\t\t\t// context menu is being requested needs to be implicitly selected.\n\t\t\t\tif (this.config.enableDragWithoutSelect) {\n\t\t\t\t\tthis.selectObjectD3Event(d3Event, node, SINGLE_CLICK_CONTEXTMENU);\n\t\t\t\t}\n\t\t\t\tthis.openContextMenu(d3Event, \"output_port\", node, port);\n\t\t\t});\n\t}\n\n\t// Sets the d3-node-unavailable class on any node that is currently not\n\t// available for connection as a target node for the source node and port ID,\n\t// passed in, of the link being manipulated. srcNode and scrPortId may be\n\t// undefined if a detached link is being manipulated.\n\tsetUnavailableTargetNodesHighlighting(srcNode, srcPortId, links) {\n\t\tthis.getAllNodeGroupsSelection()\n\t\t\t.filter((trgNode) => !CanvasUtils.isTrgNodeAvailable(trgNode, srcNode, srcPortId, links))\n\t\t\t.classed(\"d3-node-unavailable\", true);\n\t}\n\n\t// Sets the d3-node-unavailable class on any node that is currently not\n\t// available for connection as a source node for the target node and port ID,\n\t// passed in, of the link being manipulated. trgNode and trgPortId may be\n\t// undefined if a detached link is being manipulated.\n\tsetUnavailableSourceNodesHighlighting(trgNode, trgPortId, links) {\n\t\tthis.getAllNodeGroupsSelection()\n\t\t\t.filter((srcNode) => !CanvasUtils.isSrcNodeAvailable(srcNode, trgNode, trgPortId, links))\n\t\t\t.classed(\"d3-node-unavailable\", true);\n\t}\n\n\t// Removes the d3-node-unavailable class from any node that currently has it.\n\tunsetUnavailableNodesHighlighting() {\n\t\tthis.getAllNodeGroupsSelection().classed(\"d3-node-unavailable\", false);\n\t}\n\n\t// Displays the edit icon for an editable node label.\n\tdisplayNodeLabelEditIcon(spanObj, node) {\n\t\tconst labelObj = spanObj.parentElement;\n\t\tconst foreignObj = labelObj.parentElement;\n\t\tconst nodeObj = foreignObj.parentElement;\n\t\tconst nodeGrpSel = d3.select(nodeObj);\n\t\tconst transform = this.nodeUtils.getNodeLabelEditIconTranslate(node, spanObj,\n\t\t\tthis.zoomUtils.getZoomScale(), this.config.enableDisplayFullLabelOnHover);\n\n\t\tthis.displayEditIcon(spanObj, nodeGrpSel, transform,\n\t\t\t(d3Event, d) => this.canvasController.textActionHandler(\"setNodeLabelEditingMode\", \"editicon\",\n\t\t\t\t{ id: d.id, pipelineId: this.activePipeline.id }));\n\t}\n\n\t// Displays the edit icon for an editable decoration label.\n\t// obj can be either DEC_NODE or DEC_LINK.\n\tdisplayDecLabelEditIcon(spanObj, dec, obj, objType) {\n\t\tconst labelObj = spanObj.parentElement;\n\t\tconst foreignObj = labelObj.parentElement;\n\t\tconst decObj = foreignObj.parentElement;\n\t\tconst decGrpSel = d3.select(decObj);\n\t\tconst transform = this.decUtils.getDecLabelEditIconTranslate(\n\t\t\tdec, obj, objType, spanObj, this.zoomUtils.getZoomScale());\n\t\tconst editType = this.getDecorationLabelEditType(objType);\n\n\t\tthis.displayEditIcon(spanObj, decGrpSel, transform,\n\t\t\t(d3Event, d) => this.canvasController.textActionHandler(editType, \"editicon\",\n\t\t\t\t{ id: obj.id, decId: dec.id, objType, pipelineId: this.activePipeline.id }));\n\t}\n\n\t// Returns the appropriate editType string (for changing to edit mode)\n\t// for the objType passed in.\n\tgetDecorationLabelEditType(objType) {\n\t\treturn objType === DEC_NODE ? \"setNodeDecorationLabelEditingMode\" : \"setLinkDecorationLabelEditingMode\";\n\t}\n\n\t// Displays the edit icon (which can be clicked to start editing) next\n\t// to an editable node label or editable text decoration\n\tdisplayEditIcon(spanObj, grpSel, transform, displayTextArea) {\n\t\tconst that = this;\n\n\t\tconst editIconGrpSel = grpSel.append(\"g\")\n\t\t\t.attr(\"class\", \"d3-label-edit-icon-group\")\n\t\t\t.attr(\"transform\", transform)\n\t\t\t.on(\"mouseenter\", function(d3Event, d) {\n\t\t\t\tclearTimeout(this.hideEditIconPending);\n\t\t\t\tthat.mouseOverLabelEditIcon = true;\n\t\t\t})\n\t\t\t.on(\"mouseleave\", function(d3Event, d) {\n\t\t\t\tthat.mouseOverLabelEditIcon = false;\n\t\t\t\tthat.hideEditIcon(this);\n\t\t\t})\n\t\t\t.on(\"mousedown\", function() {\n\t\t\t\t// Don't stop propagation here because mousedown needs to go through\n\t\t\t\t// to the parent object to perform selection of that object before the\n\t\t\t\t// \"click\" event is caught by the code below. This will also cause a blur\n\t\t\t\t// on any currently open text entry area and complete any text entry.\n\t\t\t})\n\t\t\t.on(\"click\", function(d3Event, d) {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\tdisplayTextArea(d3Event, d);\n\t\t\t\tthat.mouseOverLabelEditIcon = false;\n\t\t\t\tthat.hideEditIcon(this);\n\t\t\t});\n\n\t\tconst EDIT_ICON_X_OFFSET = 5;\n\t\tconst EDIT_ICON_Y_OFFSET = -4;\n\t\tconst EDIT_ICON_POS_X = 4;\n\t\tconst EDIT_ICON_POS_Y = 4;\n\n\t\teditIconGrpSel\n\t\t\t.append(\"rect\")\n\t\t\t.attr(\"class\", \"d3-label-edit-icon-background1\")\n\t\t\t.attr(\"width\", 24 + EDIT_ICON_X_OFFSET)\n\t\t\t.attr(\"height\", 24)\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", EDIT_ICON_Y_OFFSET);\n\n\t\teditIconGrpSel\n\t\t\t.append(\"rect\")\n\t\t\t.attr(\"class\", \"d3-label-edit-icon-background2\")\n\t\t\t.attr(\"width\", 24)\n\t\t\t.attr(\"height\", 24)\n\t\t\t.attr(\"x\", EDIT_ICON_X_OFFSET)\n\t\t\t.attr(\"y\", EDIT_ICON_Y_OFFSET);\n\n\t\teditIconGrpSel\n\t\t\t.append(\"svg\")\n\t\t\t.attr(\"class\", \"d3-node-edit-label-icon\")\n\t\t\t.html(EDIT_ICON)\n\t\t\t.attr(\"width\", 16)\n\t\t\t.attr(\"height\", 16)\n\t\t\t.attr(\"aria-label\", \"Node edit label icon\")\n\t\t\t.attr(\"x\", EDIT_ICON_X_OFFSET + EDIT_ICON_POS_X)\n\t\t\t.attr(\"y\", EDIT_ICON_Y_OFFSET + EDIT_ICON_POS_Y);\n\t}\n\n\thideEditIcon(spanObj) {\n\t\tif (!this.mouseOverLabelEditIcon) {\n\t\t\tconst labelObj = spanObj.parentElement;\n\t\t\tif (labelObj) {\n\t\t\t\tconst foreignObj = labelObj.parentElement;\n\t\t\t\tconst nodeObj = foreignObj.parentElement;\n\t\t\t\tconst nodeGrpSel = d3.select(nodeObj);\n\t\t\t\tnodeGrpSel.selectAll(\".d3-label-edit-icon-group\").remove();\n\t\t\t}\n\t\t}\n\t}\n\n\t// Adds the object passed in to the set of selected objects using\n\t// the d3Event object passed in.\n\tselectObjectD3Event(d3Event, d, clickType) {\n\t\tthis.selectObject(\n\t\t\td,\n\t\t\tclickType,\n\t\t\td3Event.shiftKey,\n\t\t\tKeyboardUtils.isMetaKey(d3Event)\n\t\t);\n\t}\n\n\t// Performs required action for when either a comment, node or link is selected.\n\t// This may mean: simply selecting the object; or adding the object to the\n\t// currently selected set of objects; or even toggling the object's selection\n\t// off. This method also will result in call being made to the clickActionHandler\n\t// callback in the host application.\n\tselectObject(d, clickType, range = false, augment = false) {\n\t\tthis.canvasController.selectObjectWithClick(\n\t\t\td, clickType, this.activePipeline.id, range, augment);\n\t}\n\n\t// Displays a set of decorations on either a node or link object.\n\t// d - This is a node or link object.\n\t// objType - A string set to either DEC_NODE or DEC_LINK.\n\t// trgGrp - A D3 selection object that references the node or link to\n\t// which the decorations are to be attached.\n\t// decs - An array of decorations to be applied to the node or link.\n\t// This is a combination of the object's decorations with any\n\t// decorations from the layout config information.\n\tdisplayDecorations(d, objType, trgGrp, decs) {\n\t\tconst that = this;\n\t\tconst decorations = decs || [];\n\t\tconst decGrpClassName = `d3-${objType}-dec-group`;\n\t\tconst decGrpSelector = \".\" + decGrpClassName;\n\t\ttrgGrp.selectChildren(decGrpSelector)\n\t\t\t.data(decorations, (dec) => dec.id)\n\t\t\t.join(\n\t\t\t\t(enter) => this.createDecorations(enter, d, objType, decGrpClassName)\n\t\t\t)\n\t\t\t.attr(\"tabindex\", (dec) => (dec.focusable ? -1 : null))\n\t\t\t.attr(\"aria-roledescription\", this.canvasController.labelUtil.getLabel(\"decoration.ariaRoleDescription\"))\n\t\t\t.attr(\"transform\", (dec) => this.decUtils.getDecTransform(dec, d, objType))\n\t\t\t.on(\"mousedown\", (d3Event, dec) => (dec.hotspot && d3Event.button === 0 ? that.callDecoratorCallback(d3Event, d, dec) : null))\n\t\t\t.each((dec, i, elements) => this.updateDecoration(dec, d3.select(elements[i]), objType, d));\n\t}\n\n\tcreateDecorations(enter, d, objType, decGrpClassName) {\n\t\tconst newDecGroups = enter\n\t\t\t.append(\"g\")\n\t\t\t.attr(\"data-id\", (dec) => this.getId(`${objType}_dec_group`, dec.id)) // Used in tests\n\t\t\t.attr(\"class\", decGrpClassName)\n\t\t\t.call(this.attachDecGroupListeners.bind(this, d, objType));\n\n\t\treturn newDecGroups;\n\t}\n\n\tupdateDecoration(dec, decSel, objType, d) {\n\t\tthis.updateDecOutlines(dec, decSel, objType, d);\n\t\tthis.updateDecPaths(dec, decSel, objType);\n\t\tthis.updateDecImages(dec, decSel, objType, d);\n\t\tthis.updateDecLabels(dec, decSel, objType, d);\n\t\tthis.updateDecJsxObjs(dec, decSel, objType, d);\n\t}\n\n\tupdateDecOutlines(dec, decSel, objType, d) {\n\t\tlet outlnSel = decSel.selectChild(\"rect\");\n\n\t\tif (!dec.label && !dec.path && !dec.jsx && dec.outline !== false) {\n\t\t\toutlnSel = outlnSel.empty() ? decSel.append(\"rect\") : outlnSel;\n\t\t\toutlnSel\n\t\t\t\t.attr(\"class\", this.decUtils.getDecClass(dec, `d3-${objType}-dec-outline`))\n\t\t\t\t.attr(\"x\", 0)\n\t\t\t\t.attr(\"y\", 0)\n\t\t\t\t.attr(\"width\", this.decUtils.getDecWidth(dec, d, objType))\n\t\t\t\t.attr(\"height\", this.decUtils.getDecHeight(dec, d, objType))\n\t\t\t\t.lower(); // Make sure the outline goes below the image\n\t\t} else {\n\t\t\toutlnSel.remove();\n\t\t}\n\t}\n\n\tupdateDecPaths(dec, decSel, objType) {\n\t\tlet pathSel = decSel.selectChild(\"path\");\n\n\t\tif (dec.path) {\n\t\t\tpathSel = pathSel.empty() ? decSel.append(\"path\") : pathSel;\n\t\t\tpathSel\n\t\t\t\t.attr(\"class\", this.decUtils.getDecClass(dec, `d3-${objType}-dec-path`))\n\t\t\t\t.attr(\"x\", 0)\n\t\t\t\t.attr(\"y\", 0)\n\t\t\t\t.attr(\"d\", dec.path)\n\t\t\t\t.attr(\"aria-label\", dec.tooltip ? dec.tooltip : this.canvasController.labelUtil.getLabel(\"decoration.shapeDecoration\"));\n\t\t} else {\n\t\t\tpathSel.remove();\n\t\t}\n\t}\n\n\tupdateDecImages(dec, decSel, objType, d) {\n\t\tlet imageSel = decSel.selectChild(\"g\");\n\n\t\tif (dec.image) {\n\t\t\tconst nodeImageType = this.getImageType(dec.image);\n\t\t\timageSel = imageSel.empty() ? decSel.append(\"g\").append(nodeImageType) : imageSel.select(nodeImageType);\n\t\t\timageSel\n\t\t\t\t.attr(\"class\", this.decUtils.getDecClass(dec, `d3-${objType}-dec-image`))\n\t\t\t\t.attr(\"x\", this.decUtils.getDecPadding(dec, d, objType))\n\t\t\t\t.attr(\"y\", this.decUtils.getDecPadding(dec, d, objType))\n\t\t\t\t.attr(\"width\", this.decUtils.getDecWidth(dec, d, objType) - (2 * this.decUtils.getDecPadding(dec, d, objType)))\n\t\t\t\t.attr(\"height\", this.decUtils.getDecHeight(dec, d, objType) - (2 * this.decUtils.getDecPadding(dec, d, objType)))\n\t\t\t\t.attr(\"aria-label\", dec.tooltip ? dec.tooltip : this.canvasController.labelUtil.getLabel(\"decoration.imageDecoration\"))\n\t\t\t\t.each(() => this.setDecImageContent(imageSel, dec.image));\n\t\t} else {\n\t\t\timageSel.remove();\n\t\t}\n\t}\n\n\tupdateDecLabels(dec, decSel, objType, d) {\n\t\tlet labelSel = decSel.selectChild(\".d3-foreign-object-dec-label\");\n\n\t\tif (typeof dec.label !== \"undefined\") {\n\t\t\tif (labelSel.empty()) {\n\t\t\t\tlabelSel = decSel\n\t\t\t\t\t.append(\"foreignObject\")\n\t\t\t\t\t.attr(\"class\", \"d3-foreign-object-dec-label\")\n\t\t\t\t\t.attr(\"x\", 0)\n\t\t\t\t\t.attr(\"y\", 0)\n\t\t\t\t\t.call(this.attachDecLabelListeners.bind(this, d, objType));\n\t\t\t\tlabelSel\n\t\t\t\t\t.append(\"xhtml:div\")\n\t\t\t\t\t.append(\"xhtml:span\")\n\t\t\t\t\t.call(this.attachDecLabelSpanListeners.bind(this, d, objType));\n\t\t\t}\n\t\t\tlabelSel\n\t\t\t\t.attr(\"width\", this.decUtils.getDecLabelWidth(dec, d, objType))\n\t\t\t\t.attr(\"height\", this.decUtils.getDecLabelHeight(dec, d, objType))\n\t\t\t\t.attr(\"aria-label\", escapeText(dec.label))\n\t\t\t\t.select(\"div\")\n\t\t\t\t.attr(\"class\", this.decUtils.getDecLabelClass(dec, objType))\n\t\t\t\t.select(\"span\")\n\t\t\t\t.html(escapeText(dec.label));\n\t\t} else {\n\t\t\tlabelSel.remove();\n\t\t}\n\t}\n\n\tupdateDecJsxObjs(dec, decSel, objType, d) {\n\t\tlet extSel = decSel.selectChild(\".d3-foreign-object-dec-jsx\");\n\n\t\tif (dec.jsx) {\n\t\t\tif (extSel.empty()) {\n\t\t\t\textSel = decSel\n\t\t\t\t\t.append(\"foreignObject\")\n\t\t\t\t\t.attr(\"class\", \"d3-foreign-object-dec-jsx\")\n\t\t\t\t\t.attr(\"tabindex\", -1)\n\t\t\t\t\t.attr(\"x\", 0)\n\t\t\t\t\t.attr(\"y\", 0)\n\t\t\t\t\t.attr(\"aria-label\", dec.tooltip ? dec.tooltip : this.canvasController.labelUtil.getLabel(\"decoration.jsxDecoration\"));\n\t\t\t}\n\t\t\textSel\n\t\t\t\t.attr(\"width\", this.decUtils.getDecWidth(dec, d, objType))\n\t\t\t\t.attr(\"height\", this.decUtils.getDecHeight(dec, d, objType))\n\t\t\t\t.each((decData, idx, exts) =>\n\t\t\t\t\tthis.externalUtils.addDecExternalObject(decData, idx, exts));\n\t\t} else {\n\t\t\textSel.each((decData, idx, exts) =>\n\t\t\t\tthis.externalUtils.removeExternalObject(decData, idx, exts));\n\t\t\textSel.remove();\n\t\t}\n\t}\n\n\tattachDecLabelListeners(obj, objType, decLabels) {\n\t\tdecLabels\n\t\t\t.on(\"dblclick\", (d3Event, dec) => {\n\t\t\t\tthis.logger.log(\"Decoration Label - double click\");\n\t\t\t\tif (dec.label_editable && this.config.enableEditingActions) {\n\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\tconst editType = this.getDecorationLabelEditType(objType);\n\t\t\t\t\tthis.canvasController.textActionHandler(editType, \"textdoubleclick\",\n\t\t\t\t\t\t{ id: obj.id, decId: dec.id, pipelineId: this.activePipeline.id });\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tattachDecLabelSpanListeners(obj, objType, decLabelSpans) {\n\t\tdecLabelSpans\n\t\t\t.on(\"mouseenter\", (d3Event, dec) => {\n\t\t\t\tif (dec.label_editable && this.config.enableEditingActions) {\n\t\t\t\t\tthis.displayDecLabelEditIcon(d3Event.currentTarget, dec, obj, objType);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseleave\", (d3Event, dec) => {\n\t\t\t\tif (dec.label_editable && this.config.enableEditingActions) {\n\t\t\t\t\t// Wait half a sec to let the user get the pointer into the edit icon, otherwise it is closed immediately.\n\t\t\t\t\tthis.hideEditIconPending = setTimeout(this.hideEditIcon.bind(this), 500, d3Event.currentTarget, dec);\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tattachDecGroupListeners(d, objType, decGrps) {\n\t\tdecGrps\n\t\t\t.on(\"keydown\", (d3Event, dec) => {\n\t\t\t\tif (this.config.enableKeyboardNavigation) {\n\t\t\t\t\tif (KeyboardUtils.nextSubObject(d3Event)) {\n\t\t\t\t\t\t// Get updated node from activePipeline that will contain focusFunction - if one exists\n\t\t\t\t\t\tconst parentObj = CanvasUtils.getObjectTypeName(d) === \"node\"\n\t\t\t\t\t\t\t? this.activePipeline.getNode(d.id)\n\t\t\t\t\t\t\t: this.activePipeline.getLink(d.id);\n\t\t\t\t\t\tthis.setFocusNextSubObject(parentObj, d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.previousSubObject(d3Event)) {\n\t\t\t\t\t\t// Get updated node from activePipeline that will contain focusFunction - if one exists\n\t\t\t\t\t\tconst parentObj = CanvasUtils.getObjectTypeName(d) === \"node\"\n\t\t\t\t\t\t\t? this.activePipeline.getNode(d.id)\n\t\t\t\t\t\t\t: this.activePipeline.getLink(d.id);\n\t\t\t\t\t\tthis.setFocusPreviousSubObject(parentObj, d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.cancelFocusOnSubObject(d3Event)) {\n\t\t\t\t\t\tthis.canvasController.restoreFocus();\n\n\t\t\t\t\t} else if (KeyboardUtils.clickSubObject(d3Event) && dec.hotspot) {\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\t\tthis.callDecoratorCallback(d3Event, d, dec);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"focus\", (d3Event, dec) => {\n\t\t\t\tif (this.canOpenTip(TIP_TYPE_DEC) && dec.tooltip) {\n\t\t\t\t\tthis.canvasController.closeTip(); // Ensure any existing tip is removed\n\t\t\t\t\tthis.canvasController.openTip({\n\t\t\t\t\t\tid: this.getId(\"dec_tip\", dec.id),\n\t\t\t\t\t\ttype: TIP_TYPE_DEC,\n\t\t\t\t\t\ttargetObj: d3Event.currentTarget,\n\t\t\t\t\t\tpipelineId: this.activePipeline.id,\n\t\t\t\t\t\tdecoration: dec\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"blur\", (d3Event, dec) => {\n\t\t\t\tif (this.canOpenTip(TIP_TYPE_DEC) && dec.tooltip) {\n\t\t\t\t\tthis.canvasController.closeTip();\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseenter\", (d3Event, dec) => {\n\t\t\t\tif (this.canOpenTip(TIP_TYPE_DEC) && dec.tooltip) {\n\t\t\t\t\tthis.canvasController.closeTip(); // Ensure any existing tip is removed\n\t\t\t\t\tthis.canvasController.openTip({\n\t\t\t\t\t\tid: this.getId(\"dec_tip\", dec.id),\n\t\t\t\t\t\ttype: TIP_TYPE_DEC,\n\t\t\t\t\t\ttargetObj: d3Event.currentTarget,\n\t\t\t\t\t\tpipelineId: this.activePipeline.id,\n\t\t\t\t\t\tdecoration: dec\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseleave\", (d3Event, dec) => {\n\t\t\t\tif (this.canOpenTip(TIP_TYPE_DEC) && dec.tooltip) {\n\t\t\t\t\tthis.canvasController.closeTip();\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\taddErrorMarker(d, nodeGrp) {\n\t\tconst errorMarkerSelection = nodeGrp.selectChildren(\".node-error-marker\");\n\n\t\tif (d.messages && d.messages.length > 0) {\n\t\t\tif (errorMarkerSelection.empty()) {\n\t\t\t\tnodeGrp\n\t\t\t\t\t.append(\"svg\")\n\t\t\t\t\t.attr(\"class\", \"node-error-marker\"); // Need to set this so following selection will work\n\t\t\t}\n\n\t\t\tnodeGrp.selectChildren(\".node-error-marker\")\n\t\t\t\t.attr(\"class\", () => \"node-error-marker \" + this.nodeUtils.getErrorMarkerClass(d.messages))\n\t\t\t\t.html(this.nodeUtils.getErrorMarkerIcon(d))\n\t\t\t\t.attr(\"width\", this.nodeUtils.getNodeErrorWidth(d))\n\t\t\t\t.attr(\"height\", this.nodeUtils.getNodeErrorHeight(d))\n\t\t\t\t.attr(\"x\", this.nodeUtils.getNodeErrorPosX(d))\n\t\t\t\t.attr(\"y\", this.nodeUtils.getNodeErrorPosY(d));\n\n\t\t} else {\n\t\t\tif (!errorMarkerSelection.empty()) {\n\t\t\t\terrorMarkerSelection.remove();\n\t\t\t}\n\t\t}\n\t}\n\n\tgetNodeInputPortClassName() {\n\t\tif (this.config.enableAssocLinkCreation) {\n\t\t\treturn \"d3-node-port-input-assoc\";\n\t\t}\n\t\treturn \"d3-node-port-input\";\n\t}\n\n\tgetNodeOutputPortClassName() {\n\t\tif (this.config.enableAssocLinkCreation) {\n\t\t\treturn \"d3-node-port-output-assoc\";\n\t\t}\n\t\treturn \"d3-node-port-output\";\n\t}\n\n\t// Sets the image specified in the node passed in into the DOM image object\n\t// passed in specified by imgs[i].\n\tsetNodeImageContent(node, i, imgs) {\n\t\tconst image = this.getNodeImage(node);\n\t\tconst imageType = this.getImageType(image);\n\n\t\tif (imageType === \"jsx\") {\n\t\t\tthis.externalUtils.addNodeImageExternalObject(image, i, imgs);\n\t\t} else {\n\t\t\tconst imageSel = d3.select(imgs[i]);\n\t\t\tthis.setImageContent(imageSel, image, imageType);\n\t\t}\n\t}\n\n\t// Sets the image specified for the decoration into the D3 selection\n\t// of the decoration image.\n\tsetDecImageContent(imageSel, image) {\n\t\tconst imageType = this.getImageType(image);\n\t\tthis.setImageContent(imageSel, image, imageType);\n\t}\n\n\t// Sets the image passed in into the D3 image selection passed in. This loads\n\t// svg files as inline SVG while other image files are loaded with href.\n\tsetImageContent(imageSel, image, imageType) {\n\t\tif (image !== imageSel.attr(\"data-image\")) {\n\t\t\t// Save image field in DOM object to avoid unnecessary image refreshes.\n\t\t\timageSel.attr(\"data-image\", image);\n\t\t\tif (imageType === \"svg\") {\n\t\t\t\tif (this.config.enableImageDisplay === \"LoadSVGToDefs\") {\n\t\t\t\t\tthis.loadSVGToDefs(imageSel, image);\n\n\t\t\t\t} else {\n\t\t\t\t\timageSel.selectChild(\"svg\").remove();\n\t\t\t\t\td3.svg(image, { cache: \"force-cache\" }).then((data) => {\n\t\t\t\t\t\tconst svgElement = data.documentElement;\n\t\t\t\t\t\tsvgElement.setAttribute(\"aria-label\", \"Node Image\");\n\t\t\t\t\t\timageSel.node().append(svgElement);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\timageSel.attr(\"xlink:href\", image);\n\t\t\t}\n\t\t}\n\t}\n\n\t// The default behavior for SVG files is to load them in-line regardless\n\t// of how many times a unique image is used for a particular flow. This\n\t// can be unnecessarily slow if an image is referenced many times. This\n\t// method provides a performance enhancement for displaying SVG images.\n\t// It stores each unique SVG file encountered in the <defs> element for the\n\t// canvas as a <symbol> element. It then adds <use> elements to each place\n\t// where that image is referenced. So, if the same image is referenced many\n\t// times there is just one symbol for the SVG file stored in the <defs>\n\t// element. This is faster but can restrict customization capabilities of\n\t// the canvas images.\n\tloadSVGToDefs(imageSel, image) {\n\t\tconst symbolId = \"img\" + image.replaceAll(/[/.]/g, \"-\"); // Replace all / and . characters with -\n\t\tconst symbolSelector = \"#\" + symbolId;\n\t\tconst symbol = this.canvasDefs.selectChildren(symbolSelector);\n\t\t// If no symbol exists in <defs> for this image, add a place holder\n\t\t// <symbol> for it.\n\t\tif (symbol.empty()) {\n\t\t\tthis.canvasDefs.append(\"symbol\").attr(\"id\", symbolId);\n\n\t\t\td3.svg(image, { cache: \"force-cache\" }).then((data) => {\n\t\t\t\t// Asynchronously, populate placeholder <symbol> with SVG file contents.\n\t\t\t\tthis.canvasDefs.selectChildren(symbolSelector)\n\t\t\t\t\t.node()\n\t\t\t\t\t.append(data.documentElement);\n\t\t\t});\n\t\t}\n\n\t\t// Use <symbol> containing our SVG image from <defs>\n\t\timageSel.selectChild(\"use\").remove();\n\t\timageSel.append(\"use\").attr(\"href\", symbolSelector);\n\t}\n\n\t// Returns the appropriate image from the object (either node or decoration)\n\t// passed in.\n\tgetNodeImage(d) {\n\t\tif (!d.image) {\n\t\t\treturn null;\n\t\t} else if (d.image === USE_DEFAULT_ICON) {\n\t\t\tif (CanvasUtils.isSupernode(d)) {\n\t\t\t\treturn SUPERNODE_ICON;\n\t\t\t}\n\t\t} else if (d.image === USE_DEFAULT_EXT_ICON) {\n\t\t\tif (CanvasUtils.isSupernode(d)) {\n\t\t\t\treturn SUPERNODE_EXT_ICON;\n\t\t\t}\n\t\t}\n\t\treturn d.image;\n\t}\n\n\t// Returns the type of image passed in, either \"svg\" or \"image\" or\n\t// \"jsx\" or null (if no image was provided).\n\t// This will be used to append an svg or image element to the DOM.\n\tgetImageType(nodeImage) {\n\t\tif (nodeImage) {\n\t\t\tif (typeof nodeImage === \"object\") {\n\t\t\t\tif (this.externalUtils.isValidJsxElement(nodeImage)) {\n\t\t\t\t\treturn \"jsx\";\n\t\t\t\t}\n\t\t\t} else if (typeof nodeImage === \"string\") {\n\t\t\t\treturn\tnodeImage.endsWith(\".svg\") && this.config.enableImageDisplay !== \"SVGAsImage\" ? \"svg\" : \"image\";\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Returns a DOM element for the image of the node passed in to be appended\n\t// to the node element.\n\tgetImageElement(node) {\n\t\tconst nodeImage = this.getNodeImage(node);\n\t\tconst imageType = this.getImageType(nodeImage);\n\t\tconst nodeAriaLabel = node?.label;\n\n\t\tif (imageType === \"jsx\") {\n\t\t\treturn d3.create(\"svg:foreignObject\")\n\t\t\t\t.attr(\"tabindex\", -1)\n\t\t\t\t.attr(\"class\", \"d3-foreign-object-node-image d3-node-image\")\n\t\t\t\t.attr(\"aria-label\", nodeAriaLabel)\n\t\t\t\t.node();\n\n\t\t} else if (imageType === \"svg\") {\n\t\t\treturn d3.create(\"svg\")\n\t\t\t\t.attr(\"class\", \"d3-node-image\")\n\t\t\t\t.attr(\"aria-label\", nodeAriaLabel)\n\t\t\t\t.node();\n\n\t\t}\n\t\t// If imageType is \"image\" or null, we create an image element\n\t\treturn d3.create(\"svg:image\")\n\t\t\t.attr(\"class\", \"d3-node-image\")\n\t\t\t.attr(\"aria-label\", nodeAriaLabel)\n\t\t\t.node();\n\t}\n\n\tsetNodeStyles(d, type, nodeGrp) {\n\t\tthis.setNodeBodyStyles(d, type, nodeGrp);\n\t\tthis.setNodeSelectionOutlineStyles(d, type, nodeGrp);\n\t\tthis.setNodeImageStyles(d, type, nodeGrp);\n\t\tthis.setNodeLabelStyles(d, type, nodeGrp);\n\t}\n\n\tsetNodeBodyStyles(d, type, nodeGrp) {\n\t\tconst style = this.getNodeBodyStyle(d, type);\n\t\tnodeGrp.selectChildren(\".d3-node-body-outline\").attr(\"style\", style);\n\t}\n\n\tsetNodeSelectionOutlineStyles(d, type, nodeGrp) {\n\t\tconst style = this.getNodeSelectionOutlineStyle(d, type);\n\t\tnodeGrp.selectChildren(\".d3-node-selection-highlight\").attr(\"style\", style);\n\t}\n\n\tsetNodeImageStyles(d, type, nodeGrp) {\n\t\tconst style = this.getNodeImageStyle(d, type);\n\t\tnodeGrp.selectChildren(\".d3-node-image\").attr(\"style\", style);\n\t}\n\n\tsetNodeLabelStyles(d, type, nodeGrp) {\n\t\tconst style = this.getNodeLabelStyle(d, type);\n\t\tnodeGrp.selectChildren(\".d3-node-label\").attr(\"style\", style);\n\t}\n\n\tgetNodeBodyStyle(d, type) {\n\t\tlet style = CanvasUtils.getObjectStyle(d, \"body\", type);\n\t\t// For port-arcs display we reapply the drop shadow if no style is provided\n\t\tif (style === null && d.layout.dropShadow) {\n\t\t\tstyle = `filter:url(${this.getId(\"#node_drop_shadow\")})`;\n\t\t}\n\t\treturn style;\n\t}\n\n\tgetNodeSelectionOutlineStyle(d, type) {\n\t\treturn CanvasUtils.getObjectStyle(d, \"selection_outline\", type);\n\t}\n\n\tgetNodeImageStyle(d, type) {\n\t\treturn CanvasUtils.getObjectStyle(d, \"image\", type);\n\t}\n\n\tgetNodeLabelStyle(d, type) {\n\t\treturn CanvasUtils.getObjectStyle(d, \"label\", type);\n\t}\n\n\tgetNodeGrpStyle(d) {\n\t\treturn !d.style_temp && !d.style && this.canvasInfo.subdueStyle && !this.doesExpandedSupernodeHaveStyledNodes(d)\n\t\t\t? this.canvasInfo.subdueStyle\n\t\t\t: null;\n\t}\n\n\tgetLinkGrpStyle(d) {\n\t\treturn !d.style_temp && !d.style && this.canvasInfo.subdueStyle\n\t\t\t? this.canvasInfo.subdueStyle\n\t\t\t: null;\n\t}\n\n\tdoesExpandedSupernodeHaveStyledNodes(d) {\n\t\tlet expandedSupernodeHaveStyledNodes = false;\n\t\tif (CanvasUtils.isExpandedSupernode(d) && d.subflow_ref && d.subflow_ref.pipeline_id_ref) {\n\t\t\tconst subflow = new SVGCanvasPipeline(d.subflow_ref.pipeline_id_ref, this.config, this.canvasInfo);\n\t\t\tconst nodeGrp = subflow.nodes;\n\t\t\tnodeGrp.forEach((node) => {\n\t\t\t\tif (node.style || node.style_temp) {\n\t\t\t\t\texpandedSupernodeHaveStyledNodes = true;\n\t\t\t\t\treturn;\n\t\t\t\t} else if (!expandedSupernodeHaveStyledNodes && CanvasUtils.isExpandedSupernode(node)) {\n\t\t\t\t\texpandedSupernodeHaveStyledNodes = this.doesExpandedSupernodeHaveStyledNodes(node);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn expandedSupernodeHaveStyledNodes;\n\t}\n\n\tgetPortRadius(d) {\n\t\treturn CanvasUtils.isSuperBindingNode(d) ? this.getBindingPortRadius() : d.layout.portRadius;\n\t}\n\n\t// Returns the radius size of the supernode binding ports scaled up by\n\t// the zoom scale amount to give the actual size.\n\tgetBindingPortRadius() {\n\t\treturn this.canvasLayout.supernodeBindingPortRadius / this.zoomUtils.getZoomScale();\n\t}\n\n\taddDynamicNodeIcons(d3Event, d, nodeGrp) {\n\t\tif (!this.isSizing() && !CanvasUtils.isSuperBindingNode(d)) {\n\t\t\t// Add the ellipsis icon if requested by layout config.\n\t\t\tif (d.layout.ellipsisDisplay) {\n\t\t\t\tthis.addEllipsisIcon(d, nodeGrp);\n\t\t\t}\n\n\t\t\t// Add Supernode expansion icon and background for expanded supernodes\n\t\t\tif (CanvasUtils.isExpandedSupernode(d)) {\n\t\t\t\tthis.addSuperNodeFullPageIcon(nodeGrp);\n\t\t\t}\n\t\t}\n\t}\n\n\tgetDefaultContextToolbarPos(objType, d, port) {\n\t\tif (objType === \"link\") {\n\t\t\treturn { ...d.pathInfo.centerPoint };\n\n\t\t} else if (objType === \"input_port\" || objType === \"output_port\") {\n\t\t\t// For ports, d is the node and port contains cx/cy coordinates relative to the node\n\t\t\t// Convert to absolute canvas coordinates by adding node position\n\t\t\treturn { x: d.x_pos + port.cx, y: d.y_pos + port.cy };\n\n\t\t} else if (objType === \"node\" && d.layout.contextToolbarPosition === \"topCenter\" && !d.is_expanded) {\n\t\t\treturn { x: d.x_pos + (d.width / 2), y: d.y_pos };\n\n\t\t}\n\t\treturn { x: d.x_pos + d.width, y: d.y_pos };\n\t}\n\n\taddContextToolbar(d3Event, d, objType, cause, xPos, yPos, port) {\n\t\tif (!this.isSizing() && !this.isDragging() &&\n\t\t\t\t!this.svgCanvasTextArea.isEditingText() && !CanvasUtils.isSuperBindingNode(d)) {\n\t\t\tif (cause === CAUSE_MOUSE) {\n\t\t\t\tthis.canvasController.setMouseInObject(d.id);\n\t\t\t}\n\t\t\tlet pos = this.getDefaultContextToolbarPos(objType, d, port);\n\t\t\tpos.x = xPos ? pos.x + xPos : pos.x;\n\t\t\tpos.y = yPos ? pos.y + yPos : pos.y;\n\t\t\tpos = this.convertCanvasCoordsToScreenCoords(pos);\n\t\t\tthis.openContextMenu(d3Event, objType, d, port, pos, cause);\n\t\t}\n\t}\n\n\tremoveContextToolbar() {\n\t\tthis.canvasController.setMouseInObject(null);\n\t\tif (this.canvasController.isContextMenuDisplayed()) {\n\t\t\tsetTimeout(() => this.canvasController.closeContextToolbar(), 200);\n\t\t}\n\t}\n\n\taddEllipsisIcon(d, nodeGrp) {\n\t\tconst ellipsisGrp = nodeGrp\n\t\t\t.append(\"g\")\n\t\t\t.attr(\"class\", \"d3-node-ellipsis-group\")\n\t\t\t.attr(\"transform\", (nd) => this.nodeUtils.getNodeEllipsisTranslate(nd))\n\t\t\t.on(\"mousedown\", (d3Event) => {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\tthis.selectObjectD3Event(d3Event, d, SINGLE_CLICK_CONTEXTMENU);\n\n\t\t\t\tif (this.canvasController.isContextMenuDisplayed()) {\n\t\t\t\t\tthis.canvasController.closeContextMenu();\n\t\t\t\t} else {\n\t\t\t\t\tconst rect = ellipsisGrp.node().getBoundingClientRect();\n\t\t\t\t\tconst rect2 = this.canvasSVG.node().getBoundingClientRect();\n\t\t\t\t\tconst pos = { x: rect.left - rect2.left, y: rect.bottom - rect2.top };\n\t\t\t\t\tthis.setFocusObject(d, d3Event);\n\t\t\t\t\tthis.openContextMenu(d3Event, \"node\", d, null, pos);\n\t\t\t\t}\n\t\t\t});\n\n\t\tellipsisGrp\n\t\t\t.append(\"rect\")\n\t\t\t.attr(\"class\", \"d3-node-ellipsis-background\")\n\t\t\t.attr(\"width\", (nd) => this.nodeUtils.getNodeEllipsisWidth(nd))\n\t\t\t.attr(\"height\", (nd) => this.nodeUtils.getNodeEllipsisHeight(nd))\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", 0);\n\n\t\tellipsisGrp\n\t\t\t.append(\"svg\")\n\t\t\t.attr(\"class\", \"d3-node-ellipsis\")\n\t\t\t.html(NODE_MENU_ICON)\n\t\t\t.attr(\"width\", (nd) => this.nodeUtils.getNodeEllipsisIconWidth(nd))\n\t\t\t.attr(\"height\", (nd) => this.nodeUtils.getNodeEllipsisIconHeight(nd))\n\t\t\t.attr(\"x\", (nd) => nd.layout.ellipsisHoverAreaPadding)\n\t\t\t.attr(\"y\", (nd) => nd.layout.ellipsisHoverAreaPadding);\n\t}\n\n\taddSuperNodeFullPageIcon(nodeGrp) {\n\t\tconst expGrp = nodeGrp\n\t\t\t.append(\"g\")\n\t\t\t.attr(\"transform\", (nd) => this.nodeUtils.getNodeExpansionIconTranslate(nd))\n\t\t\t.attr(\"class\", \"d3-node-super-expand-icon-group\")\n\t\t\t.on(\"mousedown\", (d3Event) => {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\tconst breadcrumbs = this.getSupernodeBreadcrumbs(d3Event.currentTarget);\n\t\t\t\tthis.canvasController.displaySubPipelineForBreadcrumbs(breadcrumbs);\n\t\t\t})\n\t\t\t.on(\"mouseenter\", function() { // Use function keyword so 'this' pointer references the DOM text object\n\t\t\t\td3.select(this).attr(\"data-pointer-hover\", \"yes\");\n\t\t\t})\n\t\t\t.on(\"mouseleave\", function() { // Use function keyword so 'this' pointer references the DOM text object\n\t\t\t\td3.select(this).attr(\"data-pointer-hover\", \"no\");\n\t\t\t});\n\n\t\texpGrp\n\t\t\t.append(\"rect\")\n\t\t\t.attr(\"class\", \"d3-node-super-expand-icon-background\")\n\t\t\t.attr(\"width\", this.canvasLayout.supernodeExpansionIconWidth)\n\t\t\t.attr(\"height\", this.canvasLayout.supernodeExpansionIconHeight)\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", 0);\n\n\t\texpGrp\n\t\t\t.append(\"svg\")\n\t\t\t.attr(\"class\", \"d3-node-super-expand-icon\")\n\t\t\t.html(SUPER_NODE_EXPAND_ICON)\n\t\t\t.attr(\"width\", this.canvasLayout.supernodeExpansionIconWidth - (2 * this.canvasLayout.supernodeExpansionIconHoverAreaPadding))\n\t\t\t.attr(\"height\", this.canvasLayout.supernodeExpansionIconHeight - (2 * this.canvasLayout.supernodeExpansionIconHoverAreaPadding))\n\t\t\t.attr(\"x\", this.canvasLayout.supernodeExpansionIconHoverAreaPadding)\n\t\t\t.attr(\"y\", this.canvasLayout.supernodeExpansionIconHoverAreaPadding);\n\t}\n\n\t// Returns an array of breadcrumbs for the DOM element passed in. The DOM\n\t// element is expected to be an element within a node (like the expansion\n\t// icon). The output array will contain one breadcrumb for each nested\n\t// supernode down to the supernode of which the DOM element is a part. So if\n\t// there are three nested supernodes and the DOM element is part of the third\n\t// one, the breadcrumbs array will have three elements.\n\tgetSupernodeBreadcrumbs(domEl) {\n\t\tconst breadcrumbs = [];\n\n\t\tlet nodeGroupEl = domEl.closest(\".d3-node-group\");\n\n\t\twhile (nodeGroupEl) {\n\t\t\tconst svgAreaEl = nodeGroupEl.closest(\".svg-area\");\n\t\t\tconst supernodeDatum = this.getD3DatumFromDomEl(nodeGroupEl);\n\t\t\tconst parentPipelineId = svgAreaEl.getAttribute(\"data-pipeline-id\");\n\n\t\t\tbreadcrumbs.push(\n\t\t\t\tthis.canvasController.createBreadcrumb(supernodeDatum, parentPipelineId)\n\t\t\t);\n\n\t\t\tnodeGroupEl = svgAreaEl.closest(\".d3-node-group\");\n\t\t}\n\n\t\t// Reverse the order, so they appear in the nesting order of the supernodes.\n\t\treturn breadcrumbs.reverse();\n\t}\n\n\t// Returns the datum object (managed by D3) for the DOM element passed in.\n\tgetD3DatumFromDomEl(el) {\n\t\tconst sel = d3.select(el);\n\t\tif (sel) {\n\t\t\treturn sel.datum();\n\t\t}\n\t\treturn null;\n\t}\n\n\tupdatePortRadiusAndPos(nodeObj, node, portObjClassName) {\n\t\tconst nodeGrp = d3.select(nodeObj);\n\t\tnodeGrp.selectAll(\".\" + portObjClassName)\n\t\t\t.attr(\"r\", () => this.getPortRadius(node))\n\t\t\t.attr(\"cx\", (port) => port.cx)\n\t\t\t.attr(\"cy\", (port) => port.cy); // Port position may change for binding nodes with multiple-ports.\n\t}\n\n\tupdateInputPortArrowPath(nodeObj, portArrowClassName) {\n\t\tconst nodeGrp = d3.select(nodeObj);\n\t\tnodeGrp.selectAll(\".\" + portArrowClassName)\n\t\t\t.attr(\"d\", this.getPortArrowPath())\n\t\t\t.attr(\"transform\", (port) => this.getInputPortArrowPathTransform(port));\n\t}\n\n\tupdateOutputPortArrowPath(nodeObj, portArrowClassName) {\n\t\tconst nodeGrp = d3.select(nodeObj);\n\t\tnodeGrp.selectAll(\".\" + portArrowClassName)\n\t\t\t.attr(\"d\", this.getPortArrowPath())\n\t\t\t.attr(\"transform\", (port) => this.getOutputPortArrowPathTransform(port));\n\t}\n\n\t// Returns true if the port (from a node template) passed in has a max\n\t// cardinality of zero. If cardinality or cardinality.max is missing the\n\t// max is considered to be non-zero.\n\tisPortMaxCardinalityZero(port) {\n\t\treturn (get(port, \"app_data.ui_data.cardinality.max\", 1) === 0);\n\t}\n\n\tremoveDynamicNodeIcons(d3Event, d, nodeGrp) {\n\t\tif (d.layout.ellipsisDisplay) {\n\t\t\tnodeGrp.selectChildren(\".d3-node-ellipsis-group\").remove();\n\t\t}\n\t\tnodeGrp.selectChildren(\".d3-node-super-expand-icon-group\").remove();\n\t}\n\n\tcreateSupernodeRenderer(d, supernodeD3Object) {\n\t\tif (d.subflow_ref && d.subflow_ref.pipeline_id_ref) {\n\t\t\tconst superRenderer = new SVGCanvasRenderer(\n\t\t\t\td.subflow_ref.pipeline_id_ref,\n\t\t\t\tthis.canvasDiv,\n\t\t\t\tthis.canvasController,\n\t\t\t\tthis.canvasInfo,\n\t\t\t\tthis.selectionInfo,\n\t\t\t\tthis.breadcrumbs,\n\t\t\t\tthis.nodeLayout,\n\t\t\t\tthis.canvasLayout,\n\t\t\t\tthis.config,\n\t\t\t\t{ id: d.id,\n\t\t\t\t\tpipelineId: this.activePipeline.id,\n\t\t\t\t\trenderer: this, // Only provided for in-place sub-flow\n\t\t\t\t\td3Selection: supernodeD3Object // Only provided for in-place sub-flow\n\t\t\t\t});\n\t\t\treturn superRenderer;\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Returns the renderer for the supernode passed in. With external\n\t// pipeline handling the pipeline referenced by the supernode can change\n\t// over time so we have to make sure the renderer is for the supernode AND\n\t// for the active pipeline.\n\tgetRendererForSupernode(d) {\n\t\treturn this.superRenderers.find((sr) =>\n\t\t\tsr.supernodeInfo.id === d.id && sr.activePipeline.id === d.subflow_ref.pipeline_id_ref);\n\t}\n\n\t// Returns an array containing any renderers that are for the supernode passed\n\t// in but where the supernode does NOT reference the renderer's active pipeline.\n\tgetDiscardedRenderersForSupernode(d) {\n\t\treturn this.superRenderers.filter((sr) =>\n\t\t\tsr.supernodeInfo.id === d.id && sr.activePipeline.id !== d.subflow_ref.pipeline_id_ref);\n\n\t}\n\n\t// Opens the canvas context menu or context toolbar, depending on which is enabled.\n\t// This is called from svg-canvas-d3.js to enable a keyboard shortcut to open\n\t// the context options in an appropriate position.\n\topenCanvasContextOptions(evt) {\n\t\tthis.openContextMenu(evt, \"canvas\", null, null, { x: 100, y: 100 }, CAUSE_KEYBOARD);\n\t}\n\n\t// Opens either the context menu or the context toolbar depending on which is\n\t// currently enabled. The pos parameter is optional. It is provided when menu\n\t// is opened from the keyboard and it sets both the context menu position and\n\t// the \"mouse position\", if one is needed, by the action selected in the menu.\n\topenContextMenu(d3Event, type, d, port, pos, cause) {\n\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event); // Stop the browser context menu appearing\n\t\tthis.canvasController.contextMenuHandler({\n\t\t\ttype: type,\n\t\t\ttargetObject: type === \"canvas\" ? null : d,\n\t\t\tid: type === \"canvas\" ? null : d.id, // For historical purposes, we pass d.id as well as d as targetObject.\n\t\t\tpipelineId: this.activePipeline.id,\n\t\t\tcmPos: pos\n\t\t\t\t? pos\n\t\t\t\t: this.getMousePos(d3Event, this.canvasDiv.selectAll(\"svg\")), // Get mouse pos relative to top most SVG area even in a subflow.\n\t\t\tmousePos: this.getMousePosSnapToGrid(this.getTransformedMousePos(d3Event)),\n\t\t\tselectedObjectIds: this.canvasController.getSelectedObjectIds(),\n\t\t\taddBreadcrumbs: (d && d.type === SUPER_NODE) ? this.getSupernodeBreadcrumbs(d3Event.currentTarget) : null,\n\t\t\tport: port,\n\t\t\tzoom: this.zoomUtils.getZoomScale(),\n\t\t\tcause: cause });\n\t}\n\n\t// Closes the context menu if open. Called by various drag utility\n\t// classes.\n\tcloseContextMenuIfOpen() {\n\t\tif (this.canvasController.isContextMenuDisplayed()) {\n\t\t\tthis.canvasController.closeContextMenu();\n\t\t}\n\t\tif (this.config.enableContextToolbar) {\n\t\t\tthis.removeContextToolbar();\n\t\t}\n\t}\n\n\tcallDecoratorCallback(d3Event, node, dec) {\n\t\td3Event.stopPropagation();\n\t\tif (this.canvasController.decorationActionHandler) {\n\t\t\tthis.canvasController.decorationActionHandler(node, dec.id, this.activePipeline.id);\n\t\t}\n\t}\n\n\t// Returns a link, if one can be found, at the position indicated by x and y\n\t// coordinates.\n\tgetLinkAtMousePos(x, y) {\n\t\tconst element = this.getElementWithClassAtPosition(x, y, \"d3-data-link\");\n\t\tconst link = this.getNodeLinkForElement(element);\n\t\treturn link;\n\t}\n\n\t// Returns the node link object from the canvasInfo corresponding to the\n\t// element passed in provided it is a 'path' DOM object. Returns null if\n\t// a link cannot be found.\n\tgetNodeLinkForElement(element) {\n\t\tif (element) {\n\t\t\tconst datum = d3.select(element).datum();\n\t\t\tif (datum) {\n\t\t\t\tvar foundLink = this.activePipeline.getLink(datum.id);\n\t\t\t\tif (foundLink && foundLink.type === NODE_LINK) {\n\t\t\t\t\treturn foundLink;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Switches the link selection area to be wider (when state is true) and\n\t// regular size (when state is false). The wider width assists detection\n\t// of a node being dragged over the link - for when the 'insert node into link'\n\t// feature is active.\n\tsetDataLinkSelectionAreaWider(state) {\n\t\tthis.nodesLinksGrp.selectAll(\".d3-data-link-selection-area\").classed(\"d3-extra-width\", state);\n\t}\n\n\t// Returns a node, if one can be found, at the position { x, y } provided\n\t// which is specified in page coordinates.\n\tgetNodeAtPos(pos) {\n\t\tconst nodeGrpElement = this.getElementWithClassAtPosition(pos.x, pos.y, \"d3-node-group\");\n\t\treturn this.getNodeForElement(nodeGrpElement);\n\t}\n\n\t// Returns an input node port ID for either, the port that is under the\n\t// position { x, y } or, if the position is not over a port, the\n\t// ID of the default input port for the node provided.\n\tgetInputNodePortId(pos, trgNode) {\n\t\tconst portElement = this.getElementWithClassAtPosition(pos.x, pos.y, this.getNodeInputPortClassName());\n\t\treturn this.getNodePortIdForElement(portElement) || CanvasUtils.getDefaultInputPortId(trgNode);\n\t}\n\n\t// Returns an output node port ID for either, the port that is under the\n\t// position { x, y } provided or, if the position is not over a port, the\n\t// ID of the default output port for the node provided.\n\tgetOutputNodePortId(pos, srcNode) {\n\t\tconst portElement = this.getElementWithClassAtPosition(pos.x, pos.y, this.getNodeOutputPortClassName());\n\t\treturn this.getNodePortIdForElement(portElement) || CanvasUtils.getDefaultOutputPortId(srcNode);\n\t}\n\n\t// Returns a pos object { x, y } for the mouse position contained in the\n\t// event object/\n\tgetMousePosFromEvent(d3Event) {\n\t\treturn {\n\t\t\tx: d3Event.clientX ? d3Event.clientX : d3Event.sourceEvent.clientX,\n\t\t\ty: d3Event.clientY ? d3Event.clientY : d3Event.sourceEvent.clientY\n\t\t};\n\t}\n\n\t// Returns a DOM element which either has the classNames passed in or\n\t// has an ancestor with the className passed in, at the position { x, y }\n\t// passed in.\n\t// Note: It may not be the top-most element so we have to search through the\n\t// elements array for it.\n\tgetElementWithClassAtPosition(x, y, className) {\n\t\tconst elements = document.elementsFromPoint(x, y);\n\t\tlet foundElement = null;\n\t\tlet count = 0;\n\t\twhile (!foundElement && count < elements.length) {\n\t\t\tfoundElement = CanvasUtils.getParentElementWithClass(elements[count], className);\n\t\t\tcount++;\n\t\t}\n\t\treturn foundElement;\n\t}\n\n\t// Returns the node link object from the canvasInfo corresponding to the\n\t// element passed in provided it is a 'path' DOM object. Returns null if\n\t// a link cannot be found.\n\tgetNodeForElement(element) {\n\t\tif (element && element.nodeName === \"g\") {\n\t\t\tconst datum = d3.select(element).datum();\n\t\t\tif (datum) {\n\t\t\t\treturn this.activePipeline.getNode(datum.id);\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Returns the node port Id corresponding to the element passed in.\n\tgetNodePortIdForElement(element) {\n\t\tif (element) {\n\t\t\treturn d3.select(element).attr(\"data-port-id\");\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Returns the node that is near the current mouse position. If nodeProximity\n\t// is provided it will be used as additional space beyond the node boundary\n\t// to decide if the node is under the current mouse position.\n\tgetNodeNearMousePos(d3Event, nodeProximity) {\n\t\tvar pos = this.getTransformedMousePos(d3Event);\n\t\treturn this.getNodeNearPos(pos, nodeProximity);\n\t}\n\n\t// Returns the node that is near the position passed in. If nodeProximity\n\t// is provided it will be used as additional space beyond the node boundary\n\t// to decide if the node is under the current mouse position.\n\tgetNodeNearPos(pos, nodeProximity) {\n\t\tvar node = null;\n\t\tconst prox = nodeProximity || 0;\n\t\tthis.getAllNodeGroupsSelection()\n\t\t\t.each((d) => {\n\t\t\t\tif (pos.x >= d.x_pos - prox &&\n\t\t\t\t\t\tpos.x <= d.x_pos + d.width + prox &&\n\t\t\t\t\t\tpos.y >= d.y_pos - prox &&\n\t\t\t\t\t\tpos.y <= d.y_pos + d.height + prox) {\n\t\t\t\t\tnode = d;\n\t\t\t\t}\n\t\t\t});\n\t\treturn node;\n\t}\n\n\t// Returns a sizing rectangle for nodes and comments. This extends an\n\t// invisible area out beyond the highlight sizing line to improve usability\n\t// when sizing.\n\tgetNodeShapePathSizing(data) {\n\t\treturn this.getRectangleNodeShapePath(data, data.layout.nodeSizingArea);\n\t}\n\n\t// Returns an SVG path string that will draw the selection outline shape of the node.\n\tgetNodeSelectionOutline(data) {\n\t\tif (data.layout.selectionPath && !CanvasUtils.isExpanded(data)) {\n\t\t\tif (typeof data.layout.selectionPath === \"function\") {\n\t\t\t\treturn data.layout.selectionPath(data);\n\t\t\t}\n\t\t\treturn data.layout.selectionPath;\n\n\t\t} else if (data.layout.nodeShape === SHAPE_PORT_ARCS) {\n\t\t\treturn this.getPortArcsNodeShapePath(data); // Port-arc outline does not have a highlight gap\n\n\t\t} else if (data.layout.nodeShape === SHAPE_RECTANGLE_ROUNDED_CORNERS) {\n\t\t\treturn this.getRectRoundCornersShapePath(data, data.layout.nodeHighlightGap);\n\t\t}\n\n\t\treturn this.getRectangleNodeShapePath(data, data.layout.nodeHighlightGap);\n\t}\n\n\t// Returns an SVG path string that will draw the body shape of the node.\n\tgetNodeShapePath(data) {\n\t\tif (data.layout.bodyPath && !CanvasUtils.isExpanded(data)) {\n\t\t\tif (typeof data.layout.bodyPath === \"function\") {\n\t\t\t\treturn data.layout.bodyPath(data);\n\t\t\t}\n\n\t\t\treturn data.layout.bodyPath;\n\n\t\t} else if (data.layout.nodeShape === SHAPE_PORT_ARCS) {\n\t\t\treturn this.getPortArcsNodeShapePath(data);\n\n\t\t} else if (data.layout.nodeShape === SHAPE_RECTANGLE_ROUNDED_CORNERS) {\n\t\t\treturn this.getRectRoundCornersShapePath(data);\n\t\t}\n\n\t\treturn this.getRectangleNodeShapePath(data);\n\t}\n\n\t// Returns an SVG path that will draw the shape for a rectangle node\n\t// display. This is drawn as a path rather than an SVG rectangle to make the\n\t// calling code more generic.\n\tgetRectangleNodeShapePath(data, highlightGap = 0) {\n\t\tconst gaps = typeof highlightGap === \"object\"\n\t\t\t? highlightGap\n\t\t\t: {\n\t\t\t\tleftGap: highlightGap,\n\t\t\t\trightGap: highlightGap,\n\t\t\t\ttopGap: highlightGap,\n\t\t\t\tbottomGap: highlightGap\n\t\t\t};\n\n\t\tconst l = 0 - gaps.leftGap;\n\t\tconst t = 0 - gaps.topGap;\n\t\tconst r = data.width + gaps.rightGap;\n\t\tconst b = data.height + gaps.bottomGap;\n\n\t\treturn \"M \" + l + \" \" + t + \" L \" + r + \" \" + t + \" \" + r + \" \" + b + \" \" + l + \" \" + b + \" Z\";\n\t}\n\n\t// Returns an SVG path that will draw a shape for a\n\t// rectangle-with-rounded-corners node shape display.\n\tgetRectRoundCornersShapePath(data, highlightGap = 0) {\n\t\tconst c = 10; // Corner size\n\t\tconst l = 0 - highlightGap;\n\t\tconst t = 0 - highlightGap;\n\t\tconst r = data.width + highlightGap;\n\t\tconst b = data.height + highlightGap;\n\t\tconst lc = l + c;\n\t\tconst rc = r - c;\n\t\tconst tc = t + c;\n\t\tconst bc = b - c;\n\n\t\treturn \"M \" + lc + \" \" + t + \" L \" + rc + \" \" + t + \" \" +\n\t\t\t\"Q \" + r + \" \" + t + \" \" + r + \" \" + tc + \" \" +\n\t\t\t\"L \" + r + \" \" + bc + \" \" +\n\t\t\t\"Q \" + r + \" \" + b + \" \" + rc + \" \" + b + \" \" +\n\t\t\t\"L \" + lc + \" \" + b + \" \" +\n\t\t\t\"Q \" + l + \" \" + b + \" \" + l + \" \" + bc + \" \" +\n\t\t\t\"L \" + l + \" \" + tc + \" \" +\n\t\t\t\"Q \" + l + \" \" + t + \" \" + lc + \" \" + t +\n\t\t\t\" Z\";\n\t}\n\n\t// Returns an SVG path that will draw the outline shape for the 'port-arcs'\n\t// display which shows arcs around each of the node circles.\n\tgetPortArcsNodeShapePath(data) {\n\t\tif (this.canvasLayout.linkDirection === LINK_DIR_TOP_BOTTOM) {\n\t\t\treturn this.getPortArcsNodeShapePathVertical(data, data.inputs, data.inputPortsWidth, data.outputs, data.outputPortsWidth);\n\t\t} else if (this.canvasLayout.linkDirection === LINK_DIR_BOTTOM_TOP) {\n\t\t\treturn this.getPortArcsNodeShapePathVertical(data, data.outputs, data.outputPortsWidth, data.inputs, data.inputPortsWidth);\n\t\t} else if (this.canvasLayout.linkDirection === LINK_DIR_RIGHT_LEFT) {\n\t\t\treturn this.getPortArcsNodeShapePathHoriz(data, data.outputs, data.outputPortsHeight, data.inputs, data.inputPortsHeight);\n\t\t}\n\n\t\treturn this.getPortArcsNodeShapePathHoriz(data, data.inputs, data.inputPortsHeight, data.outputs, data.outputPortsHeight);\n\t}\n\n\t// Returns an SVG path that will draw the outline shape for the 'port-arcs'\n\t// display which shows arcs around each of the node circles for the horizontal\n\t// (LeftRight and RightLeft) directions.\n\tgetPortArcsNodeShapePathHoriz(data, leftPorts, leftPortsHeight, rightPorts, rightPortsHeight) {\n\t\tlet path = \"M 0 0 L \" + data.width + \" 0 \"; // Draw line across the top of the node\n\n\t\tif (rightPorts && rightPorts.length > 0) {\n\t\t\tlet endPoint = data.layout.portArcOffset;\n\n\t\t\t// Draw straight segment down to ports (if needed)\n\t\t\tif (rightPortsHeight < data.height) {\n\t\t\t\tendPoint = rightPorts[0].cy - data.layout.portArcRadius;\n\t\t\t}\n\n\t\t\tpath += \" L \" + data.width + \" \" + endPoint;\n\n\t\t\t// Draw port arcs\n\t\t\trightPorts.forEach((port, index) => {\n\t\t\t\tendPoint += (data.layout.portArcRadius * 2);\n\t\t\t\tpath += \" A \" + data.layout.portArcRadius + \" \" + data.layout.portArcRadius + \" 180 0 1 \" + data.width + \" \" + endPoint;\n\t\t\t\tif (index < rightPorts.length - 1) {\n\t\t\t\t\tendPoint += data.layout.portArcSpacing;\n\t\t\t\t\tpath += \" L \" + data.width + \" \" + endPoint;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Draw finishing segment to bottom right corner\n\t\t\tpath += \" L \" + data.width + \" \" + data.height;\n\n\t\t// If no right-side ports just draw a straight line.\n\t\t} else {\n\t\t\tpath += \" L \" + data.width + \" \" + data.height;\n\t\t}\n\n\t\tpath += \" L 0 \" + data.height; // Draw line across the bottom of the node\n\n\t\tif (leftPorts && leftPorts.length > 0) {\n\t\t\tlet endPoint2 = data.height - data.layout.portArcOffset;\n\n\t\t\tif (leftPortsHeight < data.height) {\n\t\t\t\tendPoint2 = leftPorts[leftPorts.length - 1].cy + data.layout.portArcRadius;\n\t\t\t}\n\n\t\t\tpath += \" L 0 \" + endPoint2;\n\n\t\t\tleftPorts.forEach((port, index) => {\n\t\t\t\tendPoint2 -= (data.layout.portArcRadius * 2);\n\t\t\t\tpath += \" A \" + data.layout.portArcRadius + \" \" + data.layout.portArcRadius + \" 180 0 1 0 \" + endPoint2;\n\t\t\t\tif (index < leftPorts.length - 1) {\n\t\t\t\t\tendPoint2 -= data.layout.portArcSpacing;\n\t\t\t\t\tpath += \" L 0 \" + endPoint2;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tpath += \" Z\"; // Draw finishing segment back to origin\n\t\t} else {\n\t\t\tpath += \" Z\"; // If no left-side ports just draw a straight line.\n\t\t}\n\t\treturn path;\n\t}\n\n\t// Returns an SVG path that will draw the outline shape for the 'port-arcs'\n\t// display which shows arcs around each of the node circles for vertical\n\t// (TopBottom and BottomTop) directions.\n\tgetPortArcsNodeShapePathVertical(data, topPorts, topPortsWidth, bottomPorts, bottomPortsWidth) {\n\t\tlet path = \"M 0 0 L 0 \" + data.height; // Draw line down the left of the node\n\n\t\tif (bottomPorts && bottomPorts.length > 0) {\n\t\t\tlet endPoint = data.layout.portArcOffset;\n\n\t\t\t// Draw straight segment across to ports (if needed)\n\t\t\tif (bottomPortsWidth < data.width) {\n\t\t\t\tendPoint = bottomPorts[0].cx - data.layout.portArcRadius;\n\t\t\t}\n\n\t\t\tpath += \" L \" + endPoint + \" \" + data.height;\n\n\t\t\t// Draw port arcs\n\t\t\tbottomPorts.forEach((port, index) => {\n\t\t\t\tendPoint += (data.layout.portArcRadius * 2);\n\t\t\t\tpath += \" A \" + data.layout.portArcRadius + \" \" + data.layout.portArcRadius + \" 180 0 0 \" + endPoint + \" \" + data.height;\n\t\t\t\tif (index < bottomPorts.length - 1) {\n\t\t\t\t\tendPoint += data.layout.portArcSpacing;\n\t\t\t\t\tpath += \" L \" + endPoint + \" \" + data.height;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Draw finishing segment to bottom right corner\n\t\t\tpath += \" L \" + data.width + \" \" + data.height;\n\n\t\t// If no bottom ports just draw a straight line.\n\t\t} else {\n\t\t\tpath += \" L \" + data.width + \" \" + data.height;\n\t\t}\n\n\t\tpath += \" L \" + data.width + \" 0 \"; // Draw line up the right side of the node\n\n\t\tif (topPorts && topPorts.length > 0) {\n\t\t\tlet endPoint2 = data.width - data.layout.portArcOffset;\n\n\t\t\tif (topPortsWidth < data.width) {\n\t\t\t\tendPoint2 = topPorts[topPorts.length - 1].cx + data.layout.portArcRadius;\n\t\t\t}\n\n\t\t\tpath += \" L \" + endPoint2 + \" 0 \";\n\n\t\t\ttopPorts.forEach((port, index) => {\n\t\t\t\tendPoint2 -= (data.layout.portArcRadius * 2);\n\t\t\t\tpath += \" A \" + data.layout.portArcRadius + \" \" + data.layout.portArcRadius + \" 180 0 0 \" + endPoint2 + \" 0 \";\n\t\t\t\tif (index < topPorts.length - 1) {\n\t\t\t\t\tendPoint2 -= data.layout.portArcSpacing;\n\t\t\t\t\tpath += \" L \" + endPoint2 + \" 0 \";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tpath += \" Z\"; // Draw finishing segment back to origin\n\t\t} else {\n\t\t\tpath += \" Z\"; // If no top ports just draw a straight line.\n\t\t}\n\t\treturn path;\n\t}\n\n\t// Sets the port positions on nodes for use when displaying nodes and links\n\tsetPortPositionsAllNodes() {\n\t\tthis.activePipeline.nodes.forEach((node) => {\n\t\t\tthis.setPortPositionsForNode(node);\n\t\t});\n\t}\n\n\tsetPortPositionsForNode(node) {\n\t\tif (this.canvasLayout.linkDirection === LINK_DIR_TOP_BOTTOM ||\n\t\t\t\tthis.canvasLayout.linkDirection === LINK_DIR_BOTTOM_TOP) {\n\t\t\tthis.setPortPositionsVertical(\n\t\t\t\tnode, node.inputs, node.inputPortsWidth,\n\t\t\t\tnode.layout.inputPortPositions,\n\t\t\t\tnode.layout.inputPortAutoPosition);\n\t\t\tthis.setPortPositionsVertical(\n\t\t\t\tnode, node.outputs, node.outputPortsWidth,\n\t\t\t\tnode.layout.outputPortPositions,\n\t\t\t\tnode.layout.outputPortAutoPosition,\n\t\t\t\tthis.config.enableSingleOutputPortDisplay);\n\n\t\t} else {\n\t\t\tthis.setPortPositionsHoriz(\n\t\t\t\tnode, node.inputs, node.inputPortsHeight,\n\t\t\t\tnode.layout.inputPortPositions,\n\t\t\t\tnode.layout.inputPortAutoPosition);\n\t\t\tthis.setPortPositionsHoriz(\n\t\t\t\tnode, node.outputs, node.outputPortsHeight,\n\t\t\t\tnode.layout.outputPortPositions,\n\t\t\t\tnode.layout.outputPortAutoPosition,\n\t\t\t\tthis.config.enableSingleOutputPortDisplay);\n\t\t}\n\t}\n\n\tsetPortPositionsVertical(node, ports, portsWidth, portPositions, autoPosition, displaySinglePort = false) {\n\t\tif (ports && ports.length > 0) {\n\t\t\tconst xPos = this.nodeUtils.getNodePortPosX(portPositions[0], node);\n\t\t\tconst yPos = this.nodeUtils.getNodePortPosY(portPositions[0], node);\n\n\t\t\tif (node.width <= node.layout.defaultNodeWidth &&\n\t\t\t\t\tports.length === 1) {\n\t\t\t\tports[0].cx = xPos;\n\t\t\t\tports[0].cy = yPos;\n\t\t\t\tports[0].dir = CanvasUtils.getPortDir(ports[0].cx, ports[0].cy, node);\n\t\t\t} else {\n\t\t\t\t// If we are only going to display a single port, we set all the\n\t\t\t\t// port positions to be the same as if there is only one port.\n\t\t\t\tif (displaySinglePort) {\n\t\t\t\t\tthis.setPortPositionsVerticalDisplaySingle(node, ports, xPos, yPos);\n\n\t\t\t\t} else if (autoPosition || CanvasUtils.isExpandedSupernode(node)) {\n\t\t\t\t\tthis.setPortPositionsVerticalAuto(node, ports, portsWidth, yPos);\n\n\t\t\t\t} else {\n\t\t\t\t\tthis.setPortPositionsCustom(ports, portPositions, node, xPos, yPos);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// If only a single port is to be displayed, this methods sets the x and y\n\t// coordinates of all the ports to the same values appropriately for either\n\t// regular nodes or expanded supernodes.\n\tsetPortPositionsVerticalDisplaySingle(node, ports, xPos, yPos) {\n\t\tlet xPosition = 0;\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\tconst widthSvgArea = node.width - (2 * this.canvasLayout.supernodeSVGAreaPadding);\n\t\t\txPosition = widthSvgArea / 2;\n\n\t\t} else {\n\t\t\txPosition = xPos;\n\t\t}\n\n\t\tports.forEach((p) => {\n\t\t\tp.cx = xPosition;\n\t\t\tp.cy = yPos;\n\t\t\tp.dir = CanvasUtils.getPortDir(p.cx, p.cy, node);\n\t\t});\n\t}\n\n\t// Sets the ports x and y coordinates for regular and expanded supernodes\n\t// when all ports are displayed in a normal manner (as opposed to when a\n\t// single port is displayed).\n\tsetPortPositionsVerticalAuto(node, ports, portsWidth, yPos) {\n\t\tlet xPosition = 0;\n\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\tconst widthSvgArea = node.width - (2 * this.canvasLayout.supernodeSVGAreaPadding);\n\t\t\tconst remainingSpace = widthSvgArea - portsWidth;\n\t\t\txPosition = this.canvasLayout.supernodeSVGAreaPadding + (remainingSpace / 2);\n\n\t\t} else if (portsWidth < node.width) {\n\t\t\txPosition = (node.width - portsWidth) / 2;\n\t\t}\n\n\t\txPosition += node.layout.portArcOffset;\n\n\t\t// Sub-flow binding node ports need to be spaced by the inverse of the\n\t\t// zoom amount so that, after zoomToFit on the in-place sub-flow the\n\t\t// binding node ports line up with those on the supernode. This is only\n\t\t// necessary with binding nodes with multiple ports.\n\t\tlet multiplier = 1;\n\t\tif (CanvasUtils.isSuperBindingNode(node)) {\n\t\t\tmultiplier = 1 / this.zoomUtils.getZoomScale();\n\t\t}\n\t\tports.forEach((p) => {\n\t\t\txPosition += (node.layout.portArcRadius * multiplier);\n\t\t\tp.cx = xPosition;\n\t\t\tp.cy = yPos;\n\t\t\tp.dir = CanvasUtils.getPortDir(p.cx, p.cy, node);\n\t\t\txPosition += ((node.layout.portArcRadius + node.layout.portArcSpacing) * multiplier);\n\t\t});\n\t}\n\n\tsetPortPositionsHoriz(node, ports, portsHeight, portPositions, autoPosition, displaySinglePort = false) {\n\t\tif (ports && ports.length > 0) {\n\t\t\tconst xPos = this.nodeUtils.getNodePortPosX(portPositions[0], node);\n\t\t\tconst yPos = this.nodeUtils.getNodePortPosY(portPositions[0], node);\n\n\t\t\tif (node.height <= node.layout.defaultNodeHeight &&\n\t\t\t\t\tports.length === 1) {\n\t\t\t\tports[0].cx = xPos;\n\t\t\t\tports[0].cy = yPos;\n\t\t\t\tports[0].dir = CanvasUtils.getPortDir(ports[0].cx, ports[0].cy, node);\n\n\t\t\t} else {\n\t\t\t\t// If we are only going to display a single port, we set all the\n\t\t\t\t// port positions to be the same as if there is only one port.\n\t\t\t\tif (displaySinglePort) {\n\t\t\t\t\tthis.setPortPositionsHorizDisplaySingle(node, ports, xPos, yPos);\n\n\t\t\t\t} else if (autoPosition || CanvasUtils.isExpandedSupernode(node)) {\n\t\t\t\t\tthis.setPortPositionsHorizAuto(node, ports, portsHeight, xPos);\n\n\t\t\t\t} else {\n\t\t\t\t\tthis.setPortPositionsCustom(ports, portPositions, node, xPos, yPos);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// If only a single port is to be displayed, this methods sets the x and y\n\t// coordinates of all the ports to the same values appropriately for either\n\t// regular nodes or expanded supernodes.\n\tsetPortPositionsHorizDisplaySingle(node, ports, xPos, yPos) {\n\t\tlet yPosition = 0;\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\tconst heightSvgArea = node.height - this.canvasLayout.supernodeTopAreaHeight - this.canvasLayout.supernodeSVGAreaPadding;\n\t\t\tyPosition = this.canvasLayout.supernodeTopAreaHeight + (heightSvgArea / 2);\n\n\t\t} else {\n\t\t\tyPosition = yPos;\n\t\t}\n\n\t\tports.forEach((p) => {\n\t\t\tp.cx = xPos;\n\t\t\tp.cy = yPosition;\n\t\t\tp.dir = CanvasUtils.getPortDir(p.cx, p.cy, node);\n\t\t});\n\t}\n\n\t// Sets the ports x and y coordinates for regular and expanded supernodes\n\t// when all ports are displayed in a normal manner (as opposed to when a\n\t// single port is displayed).\n\tsetPortPositionsHorizAuto(node, ports, portsHeight, xPos) {\n\t\tlet yPosition = 0;\n\n\t\tif (CanvasUtils.isExpandedSupernode(node)) {\n\t\t\tconst heightSvgArea = node.height - this.canvasLayout.supernodeTopAreaHeight - this.canvasLayout.supernodeSVGAreaPadding;\n\t\t\tconst remainingSpace = heightSvgArea - portsHeight;\n\t\t\tyPosition = this.canvasLayout.supernodeTopAreaHeight + (remainingSpace / 2);\n\n\t\t} else if (portsHeight < node.height) {\n\t\t\tyPosition = (node.height - portsHeight) / 2;\n\t\t}\n\n\t\tyPosition += node.layout.portArcOffset;\n\n\t\t// Sub-flow binding node ports need to be spaced by the inverse of the\n\t\t// zoom amount so that, after zoomToFit on the in-place sub-flow the\n\t\t// binding node ports line up with those on the supernode. This is only\n\t\t// necessary with binding nodes with multiple ports.\n\t\tlet multiplier = 1;\n\t\tif (CanvasUtils.isSuperBindingNode(node)) {\n\t\t\tmultiplier = 1 / this.zoomUtils.getZoomScale();\n\t\t}\n\t\tports.forEach((p) => {\n\t\t\tyPosition += (node.layout.portArcRadius * multiplier);\n\t\t\tp.cx = xPos;\n\t\t\tp.cy = yPosition;\n\t\t\tp.dir = CanvasUtils.getPortDir(p.cx, p.cy, node);\n\t\t\tyPosition += ((node.layout.portArcRadius + node.layout.portArcSpacing) * multiplier);\n\t\t});\n\t}\n\n\t// Sets the node's port positions based on the custom positions provided\n\t// by the application in the portPositions array.\n\tsetPortPositionsCustom(ports, portPositions, node, zerothX, zerothY) {\n\t\tlet xPos = zerothX;\n\t\tlet yPos = zerothY;\n\n\t\tports.forEach((p, i) => {\n\t\t\t// No need to recalculate the zeroth position AND if there are more\n\t\t\t// ports than portPositions just use the last port position for all\n\t\t\t// subsequent ports.\n\t\t\tif (i > 0 && i < portPositions.length) {\n\t\t\t\txPos = this.nodeUtils.getNodePortPosX(portPositions[i], node);\n\t\t\t\tyPos = this.nodeUtils.getNodePortPosY(portPositions[i], node);\n\t\t\t}\n\t\t\tp.cx = xPos;\n\t\t\tp.cy = yPos;\n\t\t\tp.dir = CanvasUtils.getPortDir(p.cx, p.cy, node);\n\t\t});\n\t}\n\n\t// Displays all the comments on the canvas either by creating new comments,\n\t// updating existing comments or removing unwanted comments.\n\tdisplayComments() {\n\t\tthis.logger.logStartTimer(\"displayComments \" + this.getFlags());\n\n\t\tconst selection = this.getAllCommentGroupsSelection();\n\t\tthis.displayCommentsSubset(selection, this.activePipeline.comments);\n\n\t\tthis.logger.logEndTimer(\"displayComments \" + this.getFlags());\n\t}\n\n\tdisplayMovedComments() {\n\t\tthis.logger.logStartTimer(\"displayMovedComments\");\n\n\t\tthis.getAllCommentGroupsSelection()\n\t\t\t.attr(\"transform\", (c) => `translate(${c.x_pos}, ${c.y_pos})`)\n\t\t\t.datum((d) => this.activePipeline.getComment(d.id));\n\n\t\tthis.logger.logEndTimer(\"displayMovedComments\");\n\t}\n\n\tdisplayCommentsSelectionStatus() {\n\t\tthis.logger.logStartTimer(\"displayCommentsSelectionStatus\");\n\n\t\tthis.getAllCommentGroupsSelection()\n\t\t\t.selectChildren(\".d3-comment-selection-highlight\")\n\t\t\t.attr(\"data-selected\", (c) => (this.activePipeline.isSelected(c.id) ? \"yes\" : \"no\"));\n\n\t\tthis.logger.logEndTimer(\"displayCommentsSelectionStatus\");\n\t}\n\n\tdisplaySingleComment(comment) {\n\t\tconst selection = this.getCommentGroupSelectionById(comment.id);\n\t\tthis.displayCommentsSubset(selection, [comment]);\n\t}\n\n\tdisplayCommentsSubset(selection, data) {\n\t\tconst newData = this.canvasInfo.hideComments ? [] : data;\n\t\tselection\n\t\t\t.data(newData, (c) => c.id)\n\t\t\t.join(\n\t\t\t\t(enter) => this.createComments(enter)\n\t\t\t)\n\t\t\t.attr(\"transform\", (c) => `translate(${c.x_pos}, ${c.y_pos})`)\n\t\t\t.attr(\"tabindex\", (d) => (this.config.enableKeyboardNavigation ? -1 : null))\n\t\t\t.attr(\"class\", (c) => this.getCommentGroupClass(c))\n\t\t\t.attr(\"aria-roledescription\", this.canvasController.labelUtil.getLabel(\"comment.ariaRoleDescription\"))\n\t\t\t.attr(\"aria-label\", (c) => this.canvasController.labelUtil.getLabel(\"comment.ariaLabel\", { content: c.content }))\n\t\t\t.call((joinedCommentGrps) => this.updateComments(joinedCommentGrps));\n\t}\n\n\tcreateComments(enter) {\n\t\tthis.logger.logStartTimer(\"createComments\");\n\n\t\tconst newCommentGroups = enter\n\t\t\t.append(\"g\")\n\t\t\t.attr(\"data-id\", (c) => this.getId(\"comment_grp\", c.id))\n\t\t\t.call(this.attachCommentGroupListeners.bind(this));\n\n\t\tthis.logger.logEndTimer(\"createComments\");\n\n\t\treturn newCommentGroups;\n\t}\n\n\tupdateComments(joinedCommentGrps) {\n\t\tthis.logger.logStartTimer(\"updateComments\");\n\n\t\t// Comment Focus Outline\n\t\t// This is created by the 'moveFocusTo' function when focus is moved to a\n\t\t// comment. The 'd3-focus-path' element only exists for one canvas object at a time.\n\t\tjoinedCommentGrps\n\t\t\t.selectChildren(\".d3-focus-path\")\n\t\t\t.data((d) => ([d]), (d) => d.id)\n\t\t\t.join(\n\t\t\t\t(enter) => null // Focus outline is created when focus is moved to the comment (in moveFocusTo)\n\t\t\t)\n\t\t\t.attr(\"x\", -this.canvasLayout.commentSizingArea)\n\t\t\t.attr(\"y\", -this.canvasLayout.commentSizingArea)\n\t\t\t.attr(\"height\", (c) => c.height + (2 * this.canvasLayout.commentSizingArea))\n\t\t\t.attr(\"width\", (c) => c.width + (2 * this.canvasLayout.commentSizingArea));\n\n\t\t// Comment Sizing Area\n\t\tjoinedCommentGrps\n\t\t\t.selectChildren(\".d3-comment-sizing\")\n\t\t\t.data((d) => ([d]), (d) => d.id)\n\t\t\t.join(\n\t\t\t\t(enter) =>\n\t\t\t\t\tenter\n\t\t\t\t\t\t.append(\"rect\")\n\t\t\t\t\t\t.attr(\"class\", \"d3-comment-sizing\")\n\t\t\t\t\t\t.call(this.attachCommentSizingListeners.bind(this))\n\t\t\t)\n\t\t\t.datum((c) => this.activePipeline.getComment(c.id))\n\t\t\t.attr(\"x\", -this.canvasLayout.commentSizingArea)\n\t\t\t.attr(\"y\", -this.canvasLayout.commentSizingArea)\n\t\t\t.attr(\"height\", (c) => c.height + (2 * this.canvasLayout.commentSizingArea))\n\t\t\t.attr(\"width\", (c) => c.width + (2 * this.canvasLayout.commentSizingArea))\n\t\t\t.attr(\"class\", \"d3-comment-sizing\");\n\n\t\t// Comment Selection Highlighting Outline\n\t\tjoinedCommentGrps\n\t\t\t.selectChildren(\".d3-comment-selection-highlight\")\n\t\t\t.data((d) => ([d]), (d) => d.id)\n\t\t\t.join(\n\t\t\t\t(enter) =>\n\t\t\t\t\tenter\n\t\t\t\t\t\t.append(\"rect\")\n\t\t\t\t\t\t.attr(\"class\", \"d3-comment-selection-highlight\")\n\t\t\t)\n\t\t\t.datum((c) => this.activePipeline.getComment(c.id))\n\t\t\t.attr(\"x\", -this.canvasLayout.commentHighlightGap)\n\t\t\t.attr(\"y\", -this.canvasLayout.commentHighlightGap)\n\t\t\t.attr(\"height\", (c) => c.height + (2 * this.canvasLayout.commentHighlightGap))\n\t\t\t.attr(\"width\", (c) => c.width + (2 * this.canvasLayout.commentHighlightGap))\n\t\t\t.attr(\"data-selected\", (c) => (this.activePipeline.isSelected(c.id) ? \"yes\" : \"no\"))\n\t\t\t.attr(\"style\", (d) => this.getNodeSelectionOutlineStyle(d, \"default\"));\n\n\t\t// Comment Text\n\t\tjoinedCommentGrps\n\t\t\t.selectChildren(\".d3-foreign-object-comment-text\")\n\t\t\t.data((d) => [d], (d) => d.id)\n\t\t\t.join(\n\t\t\t\t(enter) => {\n\t\t\t\t\tconst fo = enter\n\t\t\t\t\t\t.append(\"foreignObject\")\n\t\t\t\t\t\t.attr(\"class\", (d) => \"d3-foreign-object-comment-text\")\n\t\t\t\t\t\t.attr(\"x\", 0)\n\t\t\t\t\t\t.attr(\"y\", 0);\n\t\t\t\t\tfo\n\t\t\t\t\t\t.append(\"xhtml:div\") // Provide a namespace when div is inside foreignObject\n\t\t\t\t\t\t.attr(\"class\", \"d3-comment-text-scroll\")\n\t\t\t\t\t\t.append(\"xhtml:div\") // Provide a namespace when div is inside foreignObject\n\t\t\t\t\t\t.attr(\"class\", \"d3-comment-text-outer\")\n\t\t\t\t\t\t.append(\"xhtml:div\") // Provide a namespace when div is inside foreignObject\n\t\t\t\t\t\t.attr(\"class\", (d) => \"d3-comment-text\" + (d.contentType !== WYSIWYG ? \" markdown\" : \"\"));\n\t\t\t\t\treturn fo;\n\t\t\t\t}\n\t\t\t)\n\t\t\t.datum((c) => this.activePipeline.getComment(c.id))\n\t\t\t.attr(\"width\", (c) => c.width)\n\t\t\t.attr(\"height\", (c) => c.height)\n\n\t\t\t.select(\".d3-comment-text-scroll\")\n\t\t\t.attr(\"tabindex\", \"-1\") // Prevent tab taking focus to the scroll div\n\t\t\t.each((d, i, commentTexts) => {\n\t\t\t\tconst commentElement = d3.select(commentTexts[i]);\n\t\t\t\tCanvasUtils.applyOutlineStyle(commentElement, d.formats); // Only apply outlineStyle format here\n\t\t\t})\n\n\t\t\t.select(\".d3-comment-text-outer\")\n\t\t\t.select(\".d3-comment-text\")\n\t\t\t.attr(\"style\", null) // Wipe the in-line styles before applying formats\n\n\t\t\t.each((d, i, commentTexts) => {\n\t\t\t\tconst commentElement = d3.select(commentTexts[i]);\n\t\t\t\tCanvasUtils.applyNonOutlineStyle(commentElement, d.formats); // Apply all formats except outlineStyle\n\n\t\t\t})\n\n\t\t\t.html((d) => this.getCommentHTMLStr(d));\n\n\t\t// Add or remove drag object behavior for the comment groups.\n\t\tif (this.config.enableEditingActions) {\n\t\t\tconst handler = this.dragObjectUtils.getDragObjectHandler();\n\t\t\tjoinedCommentGrps\n\t\t\t\t.call(handler);\n\t\t} else {\n\t\t\tjoinedCommentGrps\n\t\t\t\t.on(\".drag\", null);\n\t\t}\n\t\tthis.logger.logEndTimer(\"updateComments\");\n\t}\n\n\t// Returns an HTML string for the comment passed in containing HTML tags for any\n\t// formatting required, including <mark> tags around any text specified to be highlighted.\n\tgetCommentHTMLStr(d) {\n\t\tconst htmlString = (d.contentType !== WYSIWYG && this.config.enableMarkdownInComments\n\t\t\t? this.getCommentAsMarkdownHTML(d.content)\n\t\t\t: escapeText(d.content));\n\n\t\tif (d.highlightText) {\n\t\t\treturn this.commentUtils.insertCommentHighlight(htmlString, d.highlightText);\n\t\t}\n\t\treturn htmlString;\n\t}\n\n\t// Returns the comment content passed in as an HTML string. We dynamically\n\t// create this.markdownIt because changing\n\t// this.config.enableMarkdownHTML during runtime can cause errors.\n\tgetCommentAsMarkdownHTML(content) {\n\t\tif (!this.markdownIt) {\n\t\t\tthis.markdownIt = markdownIt({\n\t\t\t\thtml: this.config.enableMarkdownHTML\n\t\t\t});\n\t\t}\n\n\t\treturn this.markdownIt.render(content);\n\t}\n\n\t// Attaches the appropriate listeners to the comment groups.\n\tattachCommentGroupListeners(commentGrps) {\n\t\tcommentGrps\n\t\t\t.on(\"keydown\", (d3Event, d) => {\n\t\t\t\tif (this.config.enableKeyboardNavigation) {\n\t\t\t\t\tif (this.svgCanvasTextArea.isEditingText()) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (KeyboardUtils.nextObjectInGroup(d3Event)) {\n\t\t\t\t\t\tconst linkInfos = this.activePipeline.getNextLinksFromComment(d);\n\t\t\t\t\t\tif (linkInfos.length > 0) {\n\t\t\t\t\t\t\tlinkInfos.forEach((li) => (li.link.navObject = d));\n\t\t\t\t\t\t\tthis.setFocusObject(linkInfos[0].link, d3Event);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if (KeyboardUtils.moveObjectUp(d3Event)) {\n\t\t\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\t\t\tthis.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\t\t\t\tthis.dragObjectUtils.moveObject(d, NORTH));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.moveObjectDown(d3Event)) {\n\t\t\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\t\t\tthis.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\t\t\t\tthis.dragObjectUtils.moveObject(d, SOUTH));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.moveObjectRight(d3Event)) {\n\t\t\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\t\t\tthis.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\t\t\t\tthis.dragObjectUtils.moveObject(d, EAST));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.moveObjectLeft(d3Event)) {\n\t\t\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\t\t\tthis.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\t\t\t\tthis.dragObjectUtils.moveObject(d, WEST));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.sizeObjectUp(d3Event)) {\n\t\t\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\t\t\tthis.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\t\t\t\tthis.dragObjectUtils.sizeObject(d, NORTH));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.sizeObjectDown(d3Event)) {\n\t\t\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\t\t\tthis.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\t\t\t\tthis.dragObjectUtils.sizeObject(d, SOUTH));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.sizeObjectRight(d3Event)) {\n\t\t\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\t\t\tthis.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\t\t\t\tthis.dragObjectUtils.sizeObject(d, EAST));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.sizeObjectLeft(d3Event)) {\n\t\t\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\t\t\tthis.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\t\t\t\tthis.dragObjectUtils.sizeObject(d, WEST));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.scrollTextUp(d3Event)) {\n\t\t\t\t\t\tthis.scrollComment(d3Event, 10);\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.scrollTextDown(d3Event)) {\n\t\t\t\t\t\tthis.scrollComment(d3Event, -10);\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.selectObject(d3Event)) {\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\t\tconst clickType = this.canvasController.isSelected(d.id, this.activePipeline.id) ? DOUBLE_CLICK : SINGLE_CLICK;\n\t\t\t\t\t\tthis.selectObject(d, clickType);\n\n\t\t\t\t\t} else if (KeyboardUtils.selectObjectAugment(d3Event)) {\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\t\tthis.selectObject(d, SINGLE_CLICK, false, true);\n\n\t\t\t\t\t} else if (KeyboardUtils.displayContextOptions(d3Event)) {\n\t\t\t\t\t\t// Don't let keypress go through to the Canvas otherwise the\n\t\t\t\t\t\t// canvas context menu/toolbar will be opened.\n\t\t\t\t\t\td3Event.stopPropagation();\n\n\t\t\t\t\t\tthis.selectObject(d, SINGLE_CLICK_CONTEXTMENU);\n\n\t\t\t\t\t\tif (this.config.enableContextToolbar) {\n\t\t\t\t\t\t\tthis.addContextToolbar(d3Event, d, \"comment\", CAUSE_KEYBOARD);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst pos = this.getObjectCenterPosition(d3Event.currentTarget);\n\t\t\t\t\t\t\tthis.openContextMenu(d3Event, \"comment\", d, null, pos);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseenter\", (d3Event, d) => {\n\t\t\t\tif (this.isDragging()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (this.config.enableEditingActions && d.id !== this.svgCanvasTextArea.getEditingTextId()) {\n\t\t\t\t\tthis.createCommentPort(d3Event.currentTarget, d);\n\t\t\t\t}\n\t\t\t\tif (this.config.enableContextToolbar) {\n\t\t\t\t\tthis.addContextToolbar(d3Event, d, \"comment\", CAUSE_MOUSE);\n\t\t\t\t}\n\t\t\t\tif (this.commentHasScrollableText(d3Event.currentTarget)) {\n\t\t\t\t\tthis.removeCanvasZoomBehavior(); // Remove canvas zoom behavior to allow scrolling of comment\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseleave\", (d3Event, d) => {\n\t\t\t\tif (this.config.enableContextToolbar) {\n\t\t\t\t\tthis.removeContextToolbar();\n\t\t\t\t}\n\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\tthis.deleteCommentPort(d3Event.currentTarget);\n\t\t\t\t}\n\n\t\t\t\tthis.addCanvasZoomBehavior(); // Add back zoom behavior to reenable canvas zooming\n\t\t\t})\n\t\t\t// Use mouse down instead of click because it gets called before drag start.\n\t\t\t.on(\"mousedown\", (d3Event, d) => {\n\t\t\t\tthis.logger.logStartTimer(\"Comment Group - mouse down\");\n\n\t\t\t\td3Event.stopPropagation();\n\t\t\t\tif (this.svgCanvasTextArea.isEditingText()) {\n\t\t\t\t\tthis.svgCanvasTextArea.completeEditing(d3Event);\n\t\t\t\t}\n\t\t\t\tif (!this.config.enableDragWithoutSelect) {\n\t\t\t\t\tif (this.config.enableKeyboardNavigation) {\n\t\t\t\t\t\tthis.setFocusObject(d, d3Event, false, true);\n\t\t\t\t\t}\n\t\t\t\t\tconst clickType = d3Event.button === 2 ? SINGLE_CLICK_CONTEXTMENU : SINGLE_CLICK;\n\t\t\t\t\tthis.selectObjectD3Event(d3Event, d, clickType);\n\t\t\t\t}\n\t\t\t\tthis.logger.logEndTimer(\"Comment Group - mouse down\");\n\t\t\t})\n\t\t\t.on(\"click\", (d3Event, d) => {\n\t\t\t\tthis.logger.log(\"Comment Group - click\");\n\t\t\t\td3Event.stopPropagation();\n\t\t\t})\n\t\t\t.on(\"dblclick\", (d3Event, d) => {\n\t\t\t\tthis.logger.log(\"Comment Group - double click\");\n\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\tthis.deleteCommentPort(d3Event.currentTarget);\n\t\t\t\t\tthis.canvasController.textActionHandler(\"setCommentEditingMode\", \"textdoubleclick\",\n\t\t\t\t\t\t{ id: d.id, pipelineId: this.activePipeline.id });\n\n\t\t\t\t\tthis.canvasController.clickActionHandler({\n\t\t\t\t\t\tclickType: DOUBLE_CLICK,\n\t\t\t\t\t\tobjectType: \"comment\",\n\t\t\t\t\t\tid: d.id,\n\t\t\t\t\t\tselectedObjectIds: this.activePipeline.getSelectedObjectIds(),\n\t\t\t\t\t\tpipelineId: this.activePipeline.id });\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"contextmenu\", (d3Event, d) => {\n\t\t\t\tthis.logger.log(\"Comment Group - context menu\");\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t// With enableDragWithoutSelect set to true, the object for which the\n\t\t\t\t// context menu is being requested needs to be implicitly selected.\n\t\t\t\tif (this.config.enableDragWithoutSelect) {\n\t\t\t\t\tthis.selectObjectD3Event(d3Event, d, SINGLE_CLICK_CONTEXTMENU);\n\t\t\t\t}\n\t\t\t\tthis.setFocusObject(d, d3Event, false, true);\n\t\t\t\tif (!this.config.enableContextToolbar) {\n\t\t\t\t\tthis.openContextMenu(d3Event, \"comment\", d);\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t// Returns true if the comment has scrollable text or not. That is if the contents\n\t// of the comment's scroll <div> is bigger that the scroll <div> can accommodate.\n\t// When a comment is being edited, it will have a foreignObject containing its own\n\t// scroll <div> over the top of the foreignObject used to display the comment.\n\tcommentHasScrollableText(element) {\n\t\t// Look for entry foreign object first because, if present it will be over the top\n\t\t// of the display foreign object and it will be handling scrollable text.\n\t\tlet scrollDiv = element.getElementsByClassName(\"d3-comment-text-entry-scroll\");\n\t\tif (!scrollDiv[0]) {\n\t\t\tscrollDiv = element.getElementsByClassName(\"d3-comment-text-scroll\");\n\t\t}\n\t\tif (scrollDiv[0].clientHeight < scrollDiv[0].scrollHeight) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Scrolls the scrollable <div> in the comment in the d3Event.currentTarget field,\n\t// by the amount (in pixels) passed in.\n\tscrollComment(d3Event, yAmt) {\n\t\tif (this.commentHasScrollableText(d3Event.currentTarget)) {\n\t\t\tconst scrollDiv = d3Event.currentTarget.getElementsByClassName(\"d3-comment-text-scroll\");\n\t\t\tscrollDiv[0].scrollBy(0, yAmt);\n\t\t}\n\t}\n\n\tattachCommentSizingListeners(commentGrps) {\n\t\tcommentGrps\n\t\t\t.on(\"mousedown\", (d3Event, d) => {\n\t\t\t\tthis.dragObjectUtils.mouseDownCommentSizingArea();\n\t\t\t})\n\t\t\t// Use mousemove and mouseenter so the cursor will change\n\t\t\t// if the pointer moves from one area of the node outline to another\n\t\t\t// (eg. from east area to north-east area) without exiting the node outline.\n\t\t\t// A mouseenter is triggered when the sizing operation stops and the\n\t\t\t// pointer leaves the temporary overlay (which is removed) and enters\n\t\t\t// the node outline.\n\t\t\t.on(\"mousemove mouseenter\", (d3Event, d) => {\n\t\t\t\tthis.dragObjectUtils.mouseEnterCommentSizingArea(d3Event, d);\n\t\t\t})\n\t\t\t.on(\"mouseleave\", (d3Event, d) => {\n\t\t\t\tthis.dragObjectUtils.mouseLeaveCommentSizingArea(d3Event, d);\n\t\t\t});\n\t}\n\n\t// Creates a port object (a grey circle in the top left corner of the\n\t// comment for creating links to nodes) for the comment associated with\n\t// the comment group object passed in.\n\tcreateCommentPort(commentObj, d) {\n\t\tconst commentGrp = d3.select(commentObj);\n\n\t\tconst commentPort = commentGrp\n\t\t\t.append(PORT_DISPLAY_CIRCLE)\n\t\t\t.attr(\"cx\", (com) => com.width / 2)\n\t\t\t.attr(\"cy\", (com) => com.height + this.canvasLayout.commentHighlightGap)\n\t\t\t.attr(\"r\", this.canvasLayout.commentPortRadius)\n\t\t\t.attr(\"class\", \"d3-comment-port-circle\");\n\n\t\tif (this.config.enableEditingActions) {\n\t\t\tconst handler = this.dragNewLinkUtils.getDragNewLinkHandler();\n\t\t\tcommentPort.call(handler);\n\t\t} else {\n\t\t\tcommentPort.on(\".drag\", null);\n\t\t}\n\t}\n\n\tdeleteCommentPort(commentObj) {\n\t\td3.select(commentObj)\n\t\t\t.selectChildren(\".d3-comment-port-circle\")\n\t\t\t.remove();\n\t}\n\n\tsetCommentStyles(d, type, comGrp) {\n\t\tthis.setCommentSelectionOutlineStyles(d, type, comGrp);\n\t\tthis.setCommentBodyStyles(d, type, comGrp);\n\t\tthis.setCommentTextStyles(d, type, comGrp);\n\t}\n\n\tsetCommentSelectionOutlineStyles(d, type, comGrp) {\n\t\tconst style = this.getCommentSelectionOutlineStyle(d, type);\n\t\tcomGrp.selectChildren(\".d3-comment-selection-highlight\").attr(\"style\", style);\n\t}\n\n\tsetCommentBodyStyles(d, type, comGrp) {\n\t\tconst style = this.getCommentBodyStyle(d, type);\n\t\tcomGrp.selectChildren(\".d3-comment-text\").attr(\"style\", style);\n\t}\n\n\tsetCommentTextStyles(d, type, comGrp) {\n\t\tconst style = this.getCommentTextStyle(d, type);\n\t\tcomGrp.selectChildren(\".d3-foreign-object-comment-text\").select(\"div\")\n\t\t\t.attr(\"style\", style);\n\t}\n\n\tgetCommentSelectionOutlineStyle(d, type) {\n\t\treturn CanvasUtils.getObjectStyle(d, \"selection_outline\", type);\n\t}\n\n\tgetCommentBodyStyle(d, type) {\n\t\treturn CanvasUtils.getObjectStyle(d, \"body\", type);\n\t}\n\n\tgetCommentTextStyle(d, type) {\n\t\treturn CanvasUtils.getObjectStyle(d, \"text\", type);\n\t}\n\n\tdisplayCommentTextArea(comment, parentDomObj) {\n\t\tcomment.autoSize = this.canvasLayout.commentAutoSize; // TODO - read from comment layout when canvas layout is refactored.\n\t\tthis.svgCanvasTextArea.displayCommentTextArea(comment, parentDomObj);\n\t}\n\n\tdisplayNodeLabelTextArea(node, parentDomObj) {\n\t\tthis.svgCanvasTextArea.displayNodeLabelTextArea(node, parentDomObj);\n\t}\n\n\tdisplayDecLabelTextArea(dec, obj, objType, parentDomObj) {\n\t\tthis.svgCanvasTextArea.displayDecLabelTextArea(dec, obj, objType, parentDomObj);\n\t}\n\n\t// Adds a rectangle over the top of the canvas which is used to display a\n\t// temporary pointer cursor style (like the crosshair while doing a region\n\t// select operation). This allows the same cursor to be displayed even when\n\t// the pointer is moved over the top of objects that have their own cursor\n\t// styles set in the CSS because the style for the overlay rectangle overrides\n\t// any cursor styles of the underlying objects.\n\taddTempCursorOverlay(cursorStyle) {\n\t\tif (this.dispUtils.isDisplayingFullPage()) {\n\t\t\tif (this.canvasDiv.selectAll(\".d3-temp-cursor-overlay\").size() > 0) {\n\t\t\t\tthis.removeTempCursorOverlay();\n\t\t\t}\n\n\t\t\tthis.canvasSVG\n\t\t\t\t.append(\"rect\")\n\t\t\t\t.attr(\"x\", 0)\n\t\t\t\t.attr(\"y\", 0)\n\t\t\t\t.attr(\"width\", \"100%\")\n\t\t\t\t.attr(\"height\", \"100%\")\n\t\t\t\t.attr(\"data-pipeline-id\", this.activePipeline.id)\n\t\t\t\t.attr(\"class\", \"d3-temp-cursor-overlay\")\n\t\t\t\t.attr(\"pointer-events\", \"all\")\n\t\t\t\t.style(\"cursor\", cursorStyle);\n\t\t}\n\t}\n\n\t// Removes the temporary cursor overlay.\n\tremoveTempCursorOverlay() {\n\t\tif (this.dispUtils.isDisplayingFullPage()) {\n\t\t\tthis.canvasDiv.selectAll(\".d3-temp-cursor-overlay\").remove();\n\t\t}\n\t}\n\n\t// Returns true if this renderer or any of its ancestors are currently in the\n\t// process of selecting a region or sizing a node or comment.\n\tisRegionSelectOrSizingInProgress() {\n\t\tif (this.regionSelect || this.isSizing()) {\n\t\t\treturn true;\n\t\t}\n\t\tif (this.supernodeInfo.renderer) {\n\t\t\tif (this.supernodeInfo.renderer.isRegionSelectOrSizingInProgress()) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Displays all the links on the canvas either by creating new links,\n\t// updating existing links or removing unwanted links.\n\tdisplayLinks() {\n\t\tthis.logger.logStartTimer(\"displayLinks\");\n\n\t\tconst linksArray = this.buildLinksArray();\n\t\tconst selection = this.getAllLinkGroupsSelection();\n\t\tthis.displayLinksSubset(selection, linksArray);\n\n\t\tthis.logger.logEndTimer(\"displayLinks\");\n\t}\n\n\tdisplayLinksSelectionStatus() {\n\t\tthis.logger.logStartTimer(\"displayLinksSelectionStatus\");\n\n\t\tif (this.config.enableLinkSelection !== LINK_SELECTION_NONE) {\n\t\t\tthis.getAllLinkGroupsSelection()\n\t\t\t\t.attr(\"data-selected\", (d) => (this.activePipeline.isSelected(d.id) ? true : null));\n\t\t}\n\n\t\tthis.logger.logEndTimer(\"displayLinksSelectionStatus\");\n\t}\n\n\tdisplayMovedLinks() {\n\t\tthis.logger.logStartTimer(\"displayMovedLinks\");\n\n\t\tconst linksArray = this.buildLinksArray();\n\t\tconst movedLinks = linksArray.filter((l) => l.coordsUpdated);\n\n\t\tmovedLinks.forEach((l) => {\n\t\t\tthis.displaySingleLink(l);\n\t\t});\n\n\t\tthis.logger.logEndTimer(\"displayMovedLinks\");\n\t}\n\n\tdisplaySingleLink(link) {\n\t\tconst selection = this.getLinkGroupSelectionById(link.id);\n\t\tthis.displayLinksSubset(selection, [link]);\n\t}\n\n\tdisplayLinksSubset(selection, linksArray) {\n\t\tselection\n\t\t\t.data(linksArray, (link) => link.id)\n\t\t\t.join(\n\t\t\t\t(enter) => this.createLinks(enter)\n\t\t\t)\n\t\t\t.attr(\"class\", (d) => this.getLinkGroupClass(d))\n\t\t\t.attr(\"tabindex\", (d) => (this.config.enableKeyboardNavigation ? -1 : null))\n\t\t\t.attr(\"style\", (d) => this.getLinkGrpStyle(d))\n\t\t\t.attr(\"data-selected\", (d) => (this.activePipeline.isSelected(d.id) ? true : null))\n\t\t\t.attr(\"aria-label\", (d) => CanvasUtils.getLinkAriaLabel(d, this.canvasController.labelUtil))\n\t\t\t.attr(\"aria-roledescription\", this.canvasController.labelUtil.getLabel(\"link.ariaRoleDescription\"))\n\t\t\t.call((joinedLinkGrps) => {\n\t\t\t\tthis.updateLinks(joinedLinkGrps, linksArray);\n\t\t\t});\n\t}\n\n\t// Creates all newly created links specified in the enter selection.\n\tcreateLinks(enter) {\n\t\tthis.logger.logStartTimer(\"createLinks\");\n\t\t// Add groups for links\n\t\tconst newLinkGrps = enter\n\t\t\t.append(\"g\")\n\t\t\t.attr(\"data-id\", (d) => this.getId(\"link_grp\", d.id))\n\t\t\t.call(this.attachLinkGroupListeners.bind(this));\n\n\t\t// Add selection area for link line\n\t\tnewLinkGrps\n\t\t\t.append(\"path\")\n\t\t\t.attr(\"class\", (d) => this.getLinkSelectionAreaClass(d));\n\n\t\t// Add displayed link line\n\t\tnewLinkGrps\n\t\t\t.append(\"path\")\n\t\t\t.attr(\"class\", \"d3-link-line\");\n\n\t\t// Add displayed link line arrow heads\n\t\tnewLinkGrps\n\t\t\t.filter((d) => (d.type === NODE_LINK && this.canvasLayout.dataLinkArrowHead) ||\n\t\t\t\t\t\t\t(d.type === COMMENT_LINK && this.canvasLayout.commentLinkArrowHead))\n\t\t\t.append(\"path\")\n\t\t\t.attr(\"class\", \"d3-link-line-arrow-head\");\n\n\t\t// Add a group to store decorations only for links that can have decorations.\n\t\t// Adding this here ensures the decorations are always under the link handles\n\t\t// whose groups are added next.\n\t\tnewLinkGrps\n\t\t\t.filter((d) => d.type === NODE_LINK || d.type === ASSOCIATION_LINK)\n\t\t\t.append(\"g\")\n\t\t\t.attr(\"class\", \"d3-link-decorations-group\");\n\n\t\t// Add a group to store link start handle, only if handles will be displayed.\n\t\tnewLinkGrps\n\t\t\t.filter((d) => d.type === NODE_LINK && (\n\t\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_HANDLES ||\n\t\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_DETACHABLE))\n\t\t\t.append(\"g\")\n\t\t\t.attr(\"class\", \"d3-link-handle-start-group\");\n\n\t\t// Add a group to store link end handle, only if handles will be displayed.\n\t\tnewLinkGrps\n\t\t\t.filter((d) => d.type === NODE_LINK && (\n\t\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_HANDLES ||\n\t\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_DETACHABLE))\n\t\t\t.append(\"g\")\n\t\t\t.attr(\"class\", \"d3-link-handle-end-group\");\n\n\t\tthis.logger.logEndTimer(\"createLinks\");\n\n\t\treturn newLinkGrps;\n\t}\n\n\t// Updates all the link groups (and descendant objects) in the joinedLinkGrps\n\t// selection object. The selection object will contain newly created links\n\t// as well as existing links.\n\tupdateLinks(joinedLinkGrps, lineArray) {\n\t\tthis.logger.logStartTimer(\"updateLinks\");\n\t\t// Update link selection area\n\t\tjoinedLinkGrps\n\t\t\t.selectAll(\".d3-link-selection-area\")\n\t\t\t.datum((d) => this.activePipeline.getLink(d.id))\n\t\t\t.attr(\"d\", (d) => d.pathInfo.path);\n\n\t\t// Update link line\n\t\tjoinedLinkGrps\n\t\t\t.selectAll(\".d3-link-line\")\n\t\t\t.datum((d) => this.activePipeline.getLink(d.id))\n\t\t\t.attr(\"d\", (d) => d.pathInfo.path)\n\t\t\t.attr(\"class\", \"d3-link-line\")\n\t\t\t.attr(\"style\", (d) => CanvasUtils.getObjectStyle(d, \"line\", \"default\"));\n\n\t\t// Update link line arrow head\n\t\tjoinedLinkGrps\n\t\t\t.filter((d) => (d.type === NODE_LINK && this.canvasLayout.dataLinkArrowHead) ||\n\t\t\t\t\t\t\t(d.type === COMMENT_LINK && this.canvasLayout.commentLinkArrowHead))\n\t\t\t.selectAll(\".d3-link-line-arrow-head\")\n\t\t\t.datum((d) => this.activePipeline.getLink(d.id))\n\t\t\t.attr(\"d\", (d) => this.getArrowHead(d))\n\t\t\t.attr(\"transform\", (d) => this.getArrowHeadTransform(d))\n\t\t\t.attr(\"class\", \"d3-link-line-arrow-head\")\n\t\t\t.attr(\"style\", (d) => CanvasUtils.getObjectStyle(d, \"line\", \"default\"));\n\n\t\t// Update decorations on the node-node or association links.\n\t\tjoinedLinkGrps.each((d, i, linkGrps) => {\n\t\t\tif (d.type === NODE_LINK || d.type === ASSOCIATION_LINK) {\n\t\t\t\tconst linkGrp = d3.select(linkGrps[i]).selectAll(\".d3-link-decorations-group\");\n\t\t\t\tconst decorations = this.shouldDisplayAltDecorations(d)\n\t\t\t\t\t? this.canvasLayout.linkAltDecorations\n\t\t\t\t\t: d.decorations;\n\t\t\t\tthis.displayDecorations(d, DEC_LINK, linkGrp, decorations);\n\t\t\t}\n\t\t});\n\n\t\t// Update the link handles at start and end of link, if required\n\t\tjoinedLinkGrps\n\t\t\t.each((d, i, linkGrps) => {\n\t\t\t\tthis.updateStartHandles(d, linkGrps[i]);\n\t\t\t\tthis.updateEndHandles(d, linkGrps[i]);\n\t\t\t});\n\n\t\t// Add or remove drag behavior as appropriate - for now we only support this for\n\t\t// freeform, straight links\n\t\tif (this.config.enableEditingActions &&\n\t\t\t\tthis.config.enableSplitLinkDroppedOnNode &&\n\t\t\t\tthis.config.enableLinkMethod === LINK_METHOD_FREEFORM &&\n\t\t\t\tthis.config.enableLinkType === LINK_TYPE_STRAIGHT\n\t\t) {\n\t\t\tconst handler = this.dragLinkUtils.getDragLinkHandler();\n\t\t\tjoinedLinkGrps\n\t\t\t\t.call(handler);\n\t\t} else {\n\t\t\tjoinedLinkGrps\n\t\t\t\t.on(\".drag\", null);\n\t\t}\n\n\t\tif (!this.isDragging() && !this.isSizing() && !this.config.enableLinksOverNodes) {\n\t\t\tthis.setDisplayOrder(joinedLinkGrps);\n\t\t}\n\n\t\tthis.logger.logEndTimer(\"updateLinks\");\n\t}\n\n\t// Attaches listeners to the link groups.\n\tattachLinkGroupListeners(linkGrps) {\n\t\tlinkGrps\n\t\t\t.on(\"keydown\", (d3Event, d) => {\n\t\t\t\tif (this.config.enableKeyboardNavigation) {\n\t\t\t\t\tif (KeyboardUtils.nextObjectInGroup(d3Event)) {\n\t\t\t\t\t\tif (d.type === NODE_LINK) {\n\t\t\t\t\t\t\tconst node = this.activePipeline.getNextNodeFromDataLink(d);\n\t\t\t\t\t\t\tthis.setFocusObject(node, d3Event);\n\n\t\t\t\t\t\t} else if (d.type === ASSOCIATION_LINK) {\n\t\t\t\t\t\t\tconst node = this.activePipeline.getNextNodeFromAssocLink(d);\n\t\t\t\t\t\t\tthis.setFocusObject(node, d3Event);\n\n\t\t\t\t\t\t} else if (d.type === COMMENT_LINK) {\n\t\t\t\t\t\t\tconst obj = this.activePipeline.getNextObjectFromCommentLink(d);\n\t\t\t\t\t\t\tthis.setFocusObject(obj, d3Event);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if (KeyboardUtils.previousObjectInGroup(d3Event)) {\n\t\t\t\t\t\tif (d.type === NODE_LINK) {\n\t\t\t\t\t\t\tconst node = this.activePipeline.getPreviousNodeFromDataLink(d);\n\t\t\t\t\t\t\tthis.setFocusObject(node, d3Event);\n\n\t\t\t\t\t\t} else if (d.type === ASSOCIATION_LINK) {\n\t\t\t\t\t\t\tconst node = this.activePipeline.getPreviousNodeFromAssocLink(d);\n\t\t\t\t\t\t\tthis.setFocusObject(node, d3Event);\n\n\t\t\t\t\t\t} else if (d.type === COMMENT_LINK) {\n\t\t\t\t\t\t\tconst obj = this.activePipeline.getPreviousObjectFromCommentLink(d);\n\t\t\t\t\t\t\tthis.setFocusObject(obj, d3Event);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if (KeyboardUtils.nextSiblingLink(d3Event)) {\n\t\t\t\t\t\tconst link = this.activePipeline.getNextSiblingLink(d);\n\t\t\t\t\t\tthis.setFocusObject(link, d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.previousSiblingLink(d3Event)) {\n\t\t\t\t\t\tconst link = this.activePipeline.getPreviousSiblingLink(d);\n\t\t\t\t\t\tthis.setFocusObject(link, d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.focusSubObject(d3Event)) {\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\t\tthis.clearSubObject();\n\t\t\t\t\t\tthis.setFocusNextSubObject(d, d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.cancelFocusOnSubObject(d3Event)) {\n\t\t\t\t\t\tthis.canvasController.restoreFocus();\n\n\t\t\t\t\t} else if (KeyboardUtils.moveObjectLeft(d3Event)) {\n\t\t\t\t\t\t// Prevent Chrome returning to previous browser page!\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.selectObject(d3Event) &&\n\t\t\t\t\t\t\t\tthis.config.enableLinkSelection !== LINK_SELECTION_NONE) {\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\t\tconst clickType = this.canvasController.isSelected(d.id, this.activePipeline.id) ? DOUBLE_CLICK : SINGLE_CLICK;\n\t\t\t\t\t\tthis.selectObject(d, clickType);\n\n\t\t\t\t\t} else if (KeyboardUtils.selectObjectAugment(d3Event) &&\n\t\t\t\t\t\t\t\tthis.config.enableLinkSelection !== LINK_SELECTION_NONE) {\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\t\tthis.selectObject(d, SINGLE_CLICK, false, true);\n\n\n\t\t\t\t\t} else if (KeyboardUtils.displayContextOptions(d3Event)) {\n\t\t\t\t\t\t// Don't let keypress go through to the Canvas otherwise the\n\t\t\t\t\t\t// canvas context menu/toolbar will be opened.\n\t\t\t\t\t\td3Event.stopPropagation();\n\n\t\t\t\t\t\tif (this.config.enableLinkSelection !== LINK_SELECTION_NONE) {\n\t\t\t\t\t\t\tthis.selectObject(d, SINGLE_CLICK_CONTEXTMENU);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this.config.enableContextToolbar) {\n\t\t\t\t\t\t\tthis.addContextToolbar(d3Event, d, \"link\", CAUSE_KEYBOARD,\n\t\t\t\t\t\t\t\tthis.canvasLayout.linkContextToolbarPosX,\n\t\t\t\t\t\t\t\tthis.canvasLayout.linkContextToolbarPosY\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst pos = this.getObjectCenterPosition(d3Event.currentTarget);\n\t\t\t\t\t\t\tthis.openContextMenu(d3Event, \"link\", d, null, pos);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseenter\", (d3Event, d) => {\n\t\t\t\tif (this.isDragging()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst targetObj = d3Event.currentTarget;\n\n\t\t\t\tif ((this.config.enableLinkSelection === LINK_SELECTION_HANDLES ||\n\t\t\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_DETACHABLE ||\n\t\t\t\t\tthis.config.enableRaiseLinksToTopOnHover) &&\n\t\t\t\t\td.type === NODE_LINK)\n\t\t\t\t{\n\t\t\t\t\t// Only raise link if we're NOT editing text because raising a link\n\t\t\t\t\t// will cause a 'blur' in the text edit area which will end editing.\n\t\t\t\t\tif (!this.isEditingText()) {\n\t\t\t\t\t\tthis.raiseLinkToTop(targetObj);\n\t\t\t\t\t}\n\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t}\n\t\t\t\tthis.setLinkLineStyles(targetObj, d, \"hover\");\n\n\t\t\t\tif (this.config.enableContextToolbar) {\n\t\t\t\t\tthis.addContextToolbar(d3Event, d, \"link\", CAUSE_MOUSE,\n\t\t\t\t\t\tthis.canvasLayout.linkContextToolbarPosX,\n\t\t\t\t\t\tthis.canvasLayout.linkContextToolbarPosY\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t})\n\t\t\t// This will be called when the mouse cursor enters the link or moves out of\n\t\t\t// child elements of the link. Some child elements, like decorations, may have\n\t\t\t// their own tooltips so this will redisplay the link tooltip on exiting the decoration.\n\t\t\t.on(\"mouseover\", (d3Event, link) => {\n\t\t\t\td3Event.stopPropagation(); // Stop propagation in case we are in a sub-flow\n\t\t\t\tif (this.canOpenTip(TIP_TYPE_LINK)) {\n\t\t\t\t\tconst tipId = this.canvasController.getTipId(); // Id of current tip or null\n\t\t\t\t\tconst linkTipId = this.getId(\"link_tip\", link.id);\n\n\t\t\t\t\tif (tipId === null || tipId !== linkTipId) {\n\t\t\t\t\t\tthis.canvasController.closeTip();\n\t\t\t\t\t\tthis.canvasController.openTip({\n\t\t\t\t\t\t\tid: linkTipId,\n\t\t\t\t\t\t\ttype: TIP_TYPE_LINK,\n\t\t\t\t\t\t\ttargetObj: d3Event.currentTarget,\n\t\t\t\t\t\t\tmousePos: { x: d3Event.clientX, y: d3Event.clientY },\n\t\t\t\t\t\t\tpipelineId: this.activePipeline.id,\n\t\t\t\t\t\t\tlink: link\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseleave\", (d3Event, link) => {\n\t\t\t\tconst targetObj = d3Event.currentTarget;\n\n\t\t\t\tif (link.type === NODE_LINK &&\n\t\t\t\t\t\t!this.config.enableLinksOverNodes &&\n\t\t\t\t\t\t!this.isEditingText() &&\n\t\t\t\t\t\t!this.isDragging()) {\n\t\t\t\t\tthis.lowerLinkToBottom(targetObj);\n\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t}\n\t\t\t\tthis.setLinkLineStyles(targetObj, link, \"default\");\n\t\t\t\tthis.canvasController.closeTip();\n\n\t\t\t\tif (this.config.enableContextToolbar) {\n\t\t\t\t\tthis.removeContextToolbar();\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mousedown\", (d3Event, d, index, links) => {\n\t\t\t\tthis.logger.log(\"Link Group - mouse down\");\n\t\t\t\tif (this.svgCanvasTextArea.isEditingText()) {\n\t\t\t\t\tthis.svgCanvasTextArea.completeEditing(d3Event);\n\t\t\t\t}\n\t\t\t\tif (this.config.enableKeyboardNavigation) {\n\t\t\t\t\tthis.setFocusObject(d, d3Event, false, true);\n\t\t\t\t}\n\t\t\t\tif (this.config.enableLinkSelection !== LINK_SELECTION_NONE &&\n\t\t\t\t\t\t!this.config.enableDragWithoutSelect) {\n\t\t\t\t\tconst clickType = d3Event.button === 2 ? SINGLE_CLICK_CONTEXTMENU : SINGLE_CLICK;\n\t\t\t\t\tthis.selectObjectD3Event(d3Event, d, clickType);\n\t\t\t\t}\n\t\t\t\td3Event.stopPropagation(); // Stop event going to canvas when enableEditingActions is false\n\t\t\t})\n\t\t\t.on(\"click\", (d3Event, d) => {\n\t\t\t\tthis.logger.log(\"Link Group - click\");\n\t\t\t\td3Event.stopPropagation();\n\t\t\t})\n\t\t\t.on(\"dblclick\", (d3Event, d) => {\n\t\t\t\tthis.logger.log(\"Link Group - double click\");\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\tif (this.config.enableLinkSelection !== LINK_SELECTION_NONE) {\n\t\t\t\t\tthis.canvasController.clickActionHandler({\n\t\t\t\t\t\tclickType: DOUBLE_CLICK,\n\t\t\t\t\t\tobjectType: \"link\",\n\t\t\t\t\t\tid: d.id,\n\t\t\t\t\t\tselectedObjectIds: this.activePipeline.getSelectedObjectIds(),\n\t\t\t\t\t\tpipelineId: this.activePipeline.id\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"contextmenu\", (d3Event, d) => {\n\t\t\t\tthis.logger.log(\"Link Group - context menu\");\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t// With enableDragWithoutSelect set to true, the object for which the\n\t\t\t\t// context menu is being requested needs to be implicitly selected (if possible).\n\t\t\t\tif (this.config.enableLinkSelection !== LINK_SELECTION_NONE &&\n\t\t\t\t\t\tthis.config.enableDragWithoutSelect) {\n\t\t\t\t\tthis.selectObjectD3Event(d3Event, d, SINGLE_CLICK_CONTEXTMENU);\n\t\t\t\t}\n\t\t\t\tthis.setFocusObject(d, d3Event, false, true);\n\t\t\t\tif (!this.config.enableContextToolbar) {\n\t\t\t\t\tthis.openContextMenu(d3Event, \"link\", d);\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t// Returns true if the alternative decorations for the link line\n\t// should be displayed.\n\tshouldDisplayAltDecorations(link) {\n\t\treturn (this.canvasLayout.linkAltDecorations &&\n\t\t\tCanvasUtils.getLinkDistance(link) < this.canvasLayout.linkDistanceForAltDecorations);\n\t}\n\n\t// Updates the start link handles for the link groups passed in.\n\tupdateStartHandles(d, linkGrp) {\n\t\tconst handlesGrp = d3.select(linkGrp)\n\t\t\t.selectAll(\".d3-link-handle-start-group\")\n\t\t\t.attr(\"tabindex\", () => (this.config.enableKeyboardNavigation &&\n\t\t\t\t(this.config.enableLinkSelection === LINK_SELECTION_HANDLES ||\n\t\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_DETACHABLE) ? -1 : null))\n\t\t\t.call(this.attachLinkHandleListeners.bind(this, \"start\"));\n\n\t\tconst handles = d.type === NODE_LINK && (\n\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_HANDLES ||\n\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_DETACHABLE)\n\t\t\t? [{ id: this.canvasLayout.linkStartHandleObject }]\n\t\t\t: [];\n\n\t\thandlesGrp.selectChildren(\".d3-link-handle-start\")\n\t\t\t.data(handles, (h) => h.id)\n\t\t\t.join(\n\t\t\t\t(enter) => this.createStartHandle(enter, d)\n\t\t\t)\n\t\t\t.datum(this.activePipeline.getLink(d.id))\n\t\t\t.attr(\"class\", \"d3-link-handle-start\");\n\n\t\t// Add or remove drag behavior as appropriate\n\t\tif (this.config.enableEditingActions) {\n\t\t\tconst handler = this.dragDetLinkUtils.getDragDetachedLinkHandler();\n\t\t\thandlesGrp.call(handler);\n\t\t} else {\n\t\t\thandlesGrp.on(\".drag\", null);\n\t\t}\n\t}\n\n\t// Creates the link handle for the start of the link.\n\tcreateStartHandle(enter, d) {\n\t\tlet handle = null;\n\t\tconst sourceHandleLabel = this.canvasController.labelUtil.getLabel(\"link.sourceHandle\");\n\t\tif (this.canvasLayout.linkStartHandleObject === PORT_DISPLAY_IMAGE) {\n\t\t\thandle = enter\n\t\t\t\t.append(\"image\")\n\t\t\t\t.attr(\"xlink:href\", this.canvasLayout.linkStartHandleImage)\n\t\t\t\t.attr(\"x\", d.x1 - (this.canvasLayout.linkStartHandleWidth / 2))\n\t\t\t\t.attr(\"y\", d.y1 - (this.canvasLayout.linkStartHandleHeight / 2))\n\t\t\t\t.attr(\"width\", this.canvasLayout.linkStartHandleWidth)\n\t\t\t\t.attr(\"height\", this.canvasLayout.linkStartHandleHeight)\n\t\t\t\t.attr(\"aria-label\", sourceHandleLabel);\n\n\t\t} else if (this.canvasLayout.linkStartHandleObject === PORT_DISPLAY_CIRCLE) {\n\t\t\thandle = enter\n\t\t\t\t.append(\"circle\")\n\t\t\t\t.attr(\"r\", this.canvasLayout.linkStartHandleRadius)\n\t\t\t\t.attr(\"cx\", d.x1)\n\t\t\t\t.attr(\"cy\", d.y1)\n\t\t\t\t.attr(\"aria-label\", sourceHandleLabel);\n\t\t}\n\t\treturn handle;\n\t}\n\n\t// Updates the end link handles for the link groups passed in.\n\tupdateEndHandles(d, linkGrp) {\n\t\tconst handlesGrp = d3.select(linkGrp)\n\t\t\t.selectAll(\".d3-link-handle-end-group\")\n\t\t\t.attr(\"tabindex\", () => (this.config.enableKeyboardNavigation &&\n\t\t\t\t(this.config.enableLinkSelection === LINK_SELECTION_HANDLES ||\n\t\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_DETACHABLE) ? -1 : null))\n\n\t\t\t.call(this.attachLinkHandleListeners.bind(this, \"end\"));\n\n\t\tconst handles = d.type === NODE_LINK && (\n\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_HANDLES ||\n\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_DETACHABLE)\n\t\t\t? [{ id: this.canvasLayout.linkEndHandleObject }]\n\t\t\t: [];\n\n\t\thandlesGrp.selectChildren(\".d3-link-handle-end\")\n\t\t\t.data(handles, (h) => h.id)\n\t\t\t.join(\n\t\t\t\t(enter) => this.createEndHandle(enter, d)\n\t\t\t)\n\t\t\t.datum(this.activePipeline.getLink(d.id))\n\t\t\t.attr(\"class\", \"d3-link-handle-end\");\n\n\t\t// Add or remove drag behavior as appropriate\n\t\tif (this.config.enableEditingActions) {\n\t\t\tconst handler = this.dragDetLinkUtils.getDragDetachedLinkHandler();\n\t\t\thandlesGrp.call(handler);\n\t\t} else {\n\t\t\thandlesGrp.on(\".drag\", null);\n\t\t}\n\t}\n\n\t// Creates the link handle for the end of the link.\n\tcreateEndHandle(enter, d) {\n\t\tlet handle = null;\n\t\tconst targetHandleLabel = this.canvasController.labelUtil.getLabel(\"link.targetHandle\");\n\t\tif (this.canvasLayout.linkEndHandleObject === PORT_DISPLAY_IMAGE) {\n\t\t\thandle = enter\n\t\t\t\t.append(\"image\")\n\t\t\t\t.attr(\"xlink:href\", this.canvasLayout.linkEndHandleImage)\n\t\t\t\t.attr(\"x\", d.x2 - (this.canvasLayout.linkEndHandleWidth / 2))\n\t\t\t\t.attr(\"y\", d.y2 - (this.canvasLayout.linkEndHandleHeight / 2))\n\t\t\t\t.attr(\"width\", this.canvasLayout.linkEndHandleWidth)\n\t\t\t\t.attr(\"height\", this.canvasLayout.linkEndHandleHeight)\n\t\t\t\t.attr(\"transform\", this.getLinkImageTransform(d))\n\t\t\t\t.attr(\"aria-label\", targetHandleLabel);\n\n\t\t} else if (this.canvasLayout.linkStartHandleObject === PORT_DISPLAY_CIRCLE) {\n\t\t\thandle = enter\n\t\t\t\t.append(\"circle\")\n\t\t\t\t.attr(\"r\", this.canvasLayout.linkEndHandleRadius)\n\t\t\t\t.attr(\"cx\", d.x2)\n\t\t\t\t.attr(\"cy\", d.y2)\n\t\t\t\t.attr(\"aria-label\", targetHandleLabel);\n\t\t}\n\t\treturn handle;\n\t}\n\n\t// Attaches any required event listeners to a handle of the link.\n\tattachLinkHandleListeners(handleType, handles) {\n\t\thandles\n\t\t\t.on(\"keydown\", (d3Event, link) => {\n\t\t\t\tif (this.config.enableKeyboardNavigation) {\n\t\t\t\t\tif (KeyboardUtils.nextSubObject(d3Event)) {\n\t\t\t\t\t\tthis.setFocusNextSubObject(link, d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.previousSubObject(d3Event)) {\n\t\t\t\t\t\tthis.setFocusPreviousSubObject(link, d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.cancelFocusOnSubObject(d3Event)) {\n\t\t\t\t\t\tthis.canvasController.restoreFocus();\n\n\t\t\t\t\t} else if (KeyboardUtils.moveLinkHandleUp(d3Event)) {\n\t\t\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\t\t\tthis.dragDetLinkUtils.moveLinkHandle(link, NORTH, d3Event);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.moveLinkHandleDown(d3Event)) {\n\t\t\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\t\t\tthis.dragDetLinkUtils.moveLinkHandle(link, SOUTH, d3Event);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.moveLinkHandleRight(d3Event)) {\n\t\t\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\t\t\tthis.dragDetLinkUtils.moveLinkHandle(link, EAST, d3Event);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\n\t\t\t\t\t} else if (KeyboardUtils.moveLinkHandleLeft(d3Event)) {\n\t\t\t\t\t\tif (this.config.enableEditingActions) {\n\t\t\t\t\t\t\tthis.dragDetLinkUtils.moveLinkHandle(link, WEST, d3Event);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t// Use mouse down instead of click because it gets called before drag start.\n\t\t\t.on(\"mousedown\", (d3Event, d) => {\n\t\t\t\tthis.logger.log(\"Link \" + handleType + \" handle - mouse down\");\n\n\t\t\t\tif (!this.config.enableDragWithoutSelect) {\n\t\t\t\t\tif (this.config.enableKeyboardNavigation) {\n\t\t\t\t\t\tthis.setFocusObject(d, d3Event, false, true);\n\t\t\t\t\t}\n\t\t\t\t\tconst clickType = d3Event.button === 2 ? SINGLE_CLICK_CONTEXTMENU : SINGLE_CLICK;\n\t\t\t\t\tthis.selectObjectD3Event(d3Event, d, clickType);\n\t\t\t\t}\n\n\t\t\t\tthis.logger.log(\"Link \" + handleType + \" handle - finished mouse down\");\n\t\t\t});\n\t}\n\n\t// Sets the custom inline styles on the link object passed in.\n\tsetLinkLineStyles(linkObj, link, type) {\n\t\tconst style = CanvasUtils.getObjectStyle(link, \"line\", type);\n\t\tconst linkSel = d3.select(linkObj);\n\t\tlinkSel.select(\".d3-link-line\").attr(\"style\", style);\n\t\tlinkSel.select(\".d3-link-line-arrow-head\").attr(\"style\", style);\n\t}\n\n\t// Returns the class string to be applied to the link selection area.\n\tgetLinkSelectionAreaClass(d) {\n\t\tlet typeClass = \"\";\n\t\tif (d.type === ASSOCIATION_LINK) {\n\t\t\ttypeClass = \"d3-association-link-selection-area\";\n\t\t} else if (d.type === COMMENT_LINK) {\n\t\t\ttypeClass = \"d3-comment-link-selection-area\";\n\t\t} else {\n\t\t\ttypeClass = \"d3-data-link-selection-area\";\n\t\t}\n\n\t\treturn \"d3-link-selection-area \" + typeClass;\n\t}\n\n\t// Returns the class string to be applied to the link group object.\n\tgetLinkGroupClass(d) {\n\t\treturn \"d3-link-group \" + this.getLinkTypeClass(d) + \" \" + this.getLinkBranchHighlightCLass(d) + \" \" + this.getLinkCustomClass(d);\n\t}\n\n\t// Returns the class to be used for branch highlighting if the branchHighlight flag id set for the link.\n\tgetLinkBranchHighlightCLass(d) {\n\t\treturn (d.branchHighlight ? \"d3-branch-highlight\" : \"\");\n\t}\n\n\t// Returns the custom class string for the link object passed in.\n\tgetLinkCustomClass(d) {\n\t\t// If the link has a classname, that isn't the current or historic default,\n\t\t// use it!\n\t\tif (d.class_name &&\n\t\t\t\td.class_name !== \"canvas-data-link\" &&\n\t\t\t\td.class_name !== \"canvas-object-link\" &&\n\t\t\t\td.class_name !== \"canvas-comment-link\" &&\n\t\t\t\td.class_name !== \"d3-data-link\" &&\n\t\t\t\td.class_name !== \"d3-association-link\" &&\n\t\t\t\td.class_name !== \"d3-object-link\" &&\n\t\t\t\td.class_name !== \"d3-comment-link\") {\n\t\t\treturn d.class_name;\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t// Returns the class string for the type of link object passed in.\n\tgetLinkTypeClass(d) {\n\t\tif (d.type === ASSOCIATION_LINK) {\n\t\t\tif (this.config.enableAssocLinkType === ASSOC_RIGHT_SIDE_CURVE) {\n\t\t\t\treturn \"d3-association-link\";\n\t\t\t}\n\t\t\treturn \"d3-object-link\";\n\t\t} else if (d.type === COMMENT_LINK) {\n\t\t\treturn \"d3-comment-link\";\n\t\t}\n\t\treturn \"d3-data-link\";\n\t}\n\n\t// Returns the class string to be applied to the comment group object.\n\tgetCommentGroupClass(d) {\n\t\tlet customClass = \"\";\n\t\t// If the comment has a classname that isn't the default use it!\n\t\tif (d.class_name &&\n\t\t\t\td.class_name !== \"canvas-comment\" &&\n\t\t\t\td.class_name !== \"d3-comment-rect\") { // Left in for historical reasons\n\t\t\tcustomClass = \" \" + d.class_name;\n\t\t}\n\n\t\t// Set class to enable mouse cursor to be set appropriately.\n\t\tconst draggableClass = this.config.enableEditingActions\n\t\t\t? \" d3-draggable\"\n\t\t\t: \" d3-non-draggable\";\n\n\t\t// If the class name provided IS the default, or there is no classname,\n\t\t// return the class name.\n\t\treturn \"d3-comment-group\" + draggableClass + customClass;\n\t}\n\n\t// Returns the class string to be applied to the node group object.\n\tgetNodeGroupClass(d) {\n\t\tlet customClass = \" \" + d.layout.className || \"\";\n\n\t\t// If the node has a classname that isn't the default use it!\n\t\tif (d.class_name &&\n\t\t\t\td.class_name !== \"canvas-node\" &&\n\t\t\t\td.class_name !== \"d3-node-body\" &&\n\t\t\t\td.class_name !== \"d3-node-body-outline\") {\n\t\t\tcustomClass = \" \" + d.class_name;\n\t\t}\n\n\t\tconst supernodeClass = CanvasUtils.isExpandedSupernode(d)\n\t\t\t? \" d3-node-supernode-expanded\"\n\t\t\t: \"\";\n\n\t\t// Set class to enable mouse cursor to be set appropriately.\n\t\tconst draggableClass = this.config.enableEditingActions\n\t\t\t? \" d3-draggable\"\n\t\t\t: \" d3-non-draggable\";\n\n\t\tconst resizeClass = d.isResized // this.isNodeResized(d)\n\t\t\t? \" d3-resized\"\n\t\t\t: \"\";\n\n\t\tconst shapeClass = this.getNodeShapeClass(d.layout.nodeShape);\n\n\t\tconst branchHighlightClass = d.branchHighlight ? \" d3-branch-highlight\" : \"\";\n\n\t\treturn \"d3-node-group\" + supernodeClass + resizeClass + draggableClass +\n\t\t\tbranchHighlightClass + shapeClass + customClass;\n\t}\n\n\t// Returns a class name to indicate the type of node shape being displayed.\n\tgetNodeShapeClass(shape) {\n\t\tif (shape === SHAPE_PORT_ARCS) {\n\t\t\treturn \" d3-node-shape-port-arcs\";\n\n\t\t} else if (shape === SHAPE_RECTANGLE_ROUNDED_CORNERS) {\n\t\t\treturn \" d3-node-shape-rectangle-rounded-corners\";\n\t\t}\n\t\treturn \" d3-node-shape-rectangle\";\n\t}\n\n\t// Rearranges the display order of links so 'sub-objects', like decorations and\n\t// link handles, are visible.\n\tsetDisplayOrder(linkGroup) {\n\t\tthis.preserveFocus(() => {\n\t\t\t// Force those links without decorations to be behind those with decorations\n\t\t\t// so when the links overlap the decorations are not overwritten.\n\t\t\tlinkGroup.filter((lnk) => this.hasOneDecorationOrMore(lnk)).lower();\n\t\t\tlinkGroup.filter((lnk) => !this.hasOneDecorationOrMore(lnk)).lower();\n\n\t\t\tif (this.config.enableLinkSelection === LINK_SELECTION_HANDLES ||\n\t\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_DETACHABLE)\n\t\t\t{\n\t\t\t\t// Raises any selected links to the top of the display order. This is necessary\n\t\t\t\t// when selection handles are being displayed on selected links because the\n\t\t\t\t// handles may be in the same positions as port circles on the nodes.\n\t\t\t\tthis.nodesLinksGrp\n\t\t\t\t\t.selectAll(\".d3-link-group[data-selected]\")\n\t\t\t\t\t.raise();\n\t\t\t}\n\t\t});\n\t}\n\n\t// Raises the node, specified by the node ID, above other nodes and objects.\n\t// Called by svg-canvas-utils-external.js for use by apps using React nodes.\n\traiseNodeToTopById(nodeId) {\n\t\tthis.preserveFocus(() =>\n\t\t\tthis.getNodeGroupSelectionById(nodeId).raise()\n\t\t);\n\t}\n\n\t// Raises the node above other nodes and objects (on the mouse entering\n\t// the node). This is necessary for apps that have ports that protrude from\n\t// the side of the node and where those nodes may be positioned close to each\n\t// other so it makes the ports appear on top of any adjacent node. We don't\n\t// raise the nodes for various conditions:\n\t// * The enableRaiseNodesToTopOnHover config option is set to false\n\t// * We are currently dragging to create a new link, or to move objects or detached links\n\t// * There are one or more selected links\n\t// * We are editing text\n\t// * The app has indicated links should be displayed over nodes\n\traiseNodeToTop(nodeGrp) {\n\t\tif (this.config.enableRaiseNodesToTopOnHover &&\n\t\t\t!this.isDragging() &&\n\t\t\tthis.activePipeline.getSelectedLinksCount() === 0 &&\n\t\t\t!this.isEditingText() &&\n\t\t\t!this.config.enableLinksOverNodes\n\t\t) {\n\t\t\tthis.preserveFocus(() =>\n\t\t\t\tnodeGrp.raise()\n\t\t\t);\n\t\t}\n\t}\n\n\traiseLinkToTopById(linkId) {\n\t\tthis.preserveFocus(() =>\n\t\t\tthis.getLinkGroupSelectionById(linkId).raise()\n\t\t);\n\t}\n\n\traiseLinkToTop(obj) {\n\t\tthis.preserveFocus(() =>\n\t\t\td3.select(obj)\n\t\t\t\t.raise()\n\t\t);\n\t}\n\n\tlowerLinkToBottom(obj) {\n\t\tthis.preserveFocus(() =>\n\t\t\td3.select(obj)\n\t\t\t\t.lower()\n\t\t);\n\t}\n\n\t// Preserves the focus while calling the fn function by saving the\n\t// focus object and reinstating if after the fn has finished. If,\n\t// before the function is called, the active element is in the canvas\n\t// then we force the focus to be changed.\n\tpreserveFocus(fn) {\n\t\tconst focusObj = this.canvasController.getFocusObject();\n\t\tconst shouldForceFocusChange = this.canvasController.isTargetInsideCanvas(document.activeElement);\n\n\t\tfn();\n\n\t\tif (this.config.enableKeyboardNavigation &&\n\t\t\t!this.isEditingText() &&\n\t\t\t!this.canvasController.isContextMenuDisplayed())\n\t\t{\n\t\t\tif (this.subObject) {\n\t\t\t\tthis.restoreFocusToSubObject();\n\n\t\t\t} else {\n\t\t\t\tthis.canvasController.setFocusObject(focusObj, null, shouldForceFocusChange);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Returns true if the link passed in has one or more decorations.\n\thasOneDecorationOrMore(link) {\n\t\treturn link.decorations && link.decorations.length > 0;\n\t}\n\n\t// Returns an array of links taken from the active pipeline, that contain\n\t// additional fields to describe how the link line should be drawn.\n\t// Additional fields\n\t// -----------------\n\t// These are added by the updateFreeformLinksForNodes function:\n\t// srcFreeformInfo - Added for freeform links. Indicates the starting point of the\n\t// link line used so the starts don't bunch up together if more\n\t// than one link enters or exits on one side of the node.\n\t// trgFreeformInfo - Added for freeform links. Indicates the ending point of the\n\t// link line used so the ends don't bunch up together if more\n\t// than one link enters or exists on one side of the node.\n\t//\n\t// These are added by the getAttachedLinkObj and getDetachedLinkObj functions:\n\t// x1 and y1 - Coordinates of the start of the line\n\t// x2 and y2 - Coordinates of the end of the line\n\t// coordsUpdated - A boolean - true means the coordinates are different to before.\n\t// Used for performance to prevent unnecessary line drawing.\n\t// srcDir - Direction (\"n\", \"s\", \"e\" or \"W\") of the source of the line\n\t// trgDir - Direction (\"n\", \"s\", \"e\" or \"W\") of the target of the line\n\t// originX and originY - The theoretical origin in the source node of the line\n\t// assocLinkVariation - Either \"curveRight\", \"curveLeft\" or \"doubleBack\". Indicates\n\t// the style used for drawing association links\n\t//\n\t// These fields are added by the addConnectionPaths function:\n\t// pathinfo - an object containing:\n\t// - elements - An array of elements that make up the path of the link line\n\t// - path - The SVG path used to draw the link line\n\t// - centerPoint - The x,y coordinate of the center of the link line. Used for\n\t// positioning decorations and the context toolbar.\n\tbuildLinksArray() {\n\t\tthis.logger.logStartTimer(\"buildLinksArray\");\n\n\t\tlet linksArray = [];\n\n\t\tif (this.canvasLayout.linkMethod === LINK_METHOD_FREEFORM) {\n\t\t\tthis.updateFreeformLinksForNodes();\n\t\t}\n\n\t\tthis.activePipeline.links.forEach((link) => {\n\t\t\tlet linkObj = null;\n\n\t\t\tif (((this.config.enableLinkSelection === LINK_SELECTION_HANDLES &&\n\t\t\t\t\tthis.dragDetLinkUtils.isLinkBeingDragged(link)) ||\n\t\t\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_DETACHABLE) &&\n\t\t\t\t\t(!link.srcObj || !link.trgNode)) {\n\t\t\t\tlinkObj = this.getDetachedLinkObj(link);\n\n\t\t\t} else {\n\t\t\t\tlinkObj = this.getAttachedLinkObj(link);\n\t\t\t}\n\t\t\tif (linkObj) {\n\t\t\t\tlinksArray.push(linkObj);\n\n\t\t\t} else {\n\t\t\t\t// If no linkObj, remove link if displayLinkOnOverlap is false because\n\t\t\t\t// node may be being dragged over linked node.\n\t\t\t\tif (!this.canvasLayout.displayLinkOnOverlap) {\n\t\t\t\t\tconst selection = this.getLinkGroupSelectionById(link.id);\n\t\t\t\t\tselection.remove();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Adjust the minInitialLineForElbow property for links when displaying\n\t\t// the Elbow line type. This prevents overlapping at the links' first elbow.\n\t\tif (this.canvasLayout.linkType === LINK_TYPE_ELBOW) {\n\t\t\tlinksArray = this.addMinInitialLineForElbow(linksArray);\n\t\t}\n\n\t\t// Add connection path info to the links.\n\t\tlinksArray = this.linkUtils.addConnectionPaths(linksArray);\n\n\t\tthis.logger.logEndTimer(\"buildLinksArray\");\n\n\t\treturn linksArray;\n\t}\n\n\t// Returns the link object passed in with additional fields to describe an fully\n\t// attached link. This is called when both srcNode AND trgNode set to node\n\t// objects indicating a link that is attached at the source and target ends.\n\tgetAttachedLinkObj(link) {\n\t\tconst srcObj = link.srcObj;\n\t\tconst trgNode = link.trgNode;\n\n\t\tif (!srcObj) {\n\t\t\tthis.logger.error(\n\t\t\t\t\"Common Canvas error trying to draw a link. A link was specified for source ID '\" + link.srcNodeId +\n\t\t\t\t\"' in the Canvas data that does not have a valid source node/comment.\");\n\t\t}\n\n\t\tif (!trgNode) {\n\t\t\tthis.logger.error(\n\t\t\t\t\"Common Canvas error trying to draw a link. A link was specified for target ID '\" + link.trgNodeId +\n\t\t\t\t\"' in the Canvas data that does not have a valid target node.\");\n\t\t}\n\n\t\t// Only proceed if we have a source and a target node/comment and the\n\t\t// conditions are right for displaying the link.\n\t\tif (srcObj && trgNode && this.shouldDisplayLink(srcObj, trgNode, link.type)) {\n\t\t\tconst srcPortId = CanvasUtils.getSourcePortId(link, srcObj);\n\t\t\tconst trgPortId = CanvasUtils.getTargetPortId(link, trgNode);\n\t\t\tconst assocLinkVariation =\n\t\t\t\tlink.type === ASSOCIATION_LINK && this.config.enableAssocLinkType === ASSOC_RIGHT_SIDE_CURVE\n\t\t\t\t\t? this.getAssocLinkVariation(srcObj, trgNode)\n\t\t\t\t\t: null;\n\t\t\tconst coords = this.linkUtils.getLinkCoords(link, srcObj, srcPortId, trgNode, trgPortId, assocLinkVariation);\n\n\t\t\t// If start and end coords are updated, the link will need to be redrawn.\n\t\t\tlink.coordsUpdated =\n\t\t\t\tlink.x1 !== coords.x1 ||\n\t\t\t\tlink.y1 !== coords.y1 ||\n\t\t\t\tlink.x2 !== coords.x2 ||\n\t\t\t\tlink.y2 !== coords.y2 ||\n\t\t\t\tlink.centerDragPos; // If link has centerDragPos, ensure this link is refreshed.\n\n\t\t\t// Set additional calculated fields on link object.\n\t\t\tlink.assocLinkVariation = assocLinkVariation;\n\t\t\tlink.x1 = coords.x1;\n\t\t\tlink.y1 = coords.y1;\n\t\t\tlink.x2 = coords.x2;\n\t\t\tlink.y2 = coords.y2;\n\t\t\tlink.originX = coords.originX;\n\t\t\tlink.originY = coords.originY;\n\t\t\tlink.srcDir = coords.srcDir;\n\t\t\tlink.trgDir = coords.trgDir;\n\n\t\t\treturn link;\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Returns the link object passed in with additional fields to describe\n\t// a fully-detached or semi-detached link. This will only ever\n\t// be called when either srcNode OR trgNode are null indicating a\n\t// semi-detached link, or when both are null, indicating a fully-detached link.\n\tgetDetachedLinkObj(link) {\n\t\tconst srcObj = link.srcObj;\n\t\tconst trgNode = link.trgNode;\n\n\t\tconst coords = { x1: link.x1, y1: link.y1, x2: link.x2, y2: link.y2 };\n\n\t\t// Fully-detached link.\n\t\tif (!srcObj && !trgNode) {\n\t\t\tlink.x1 = link.srcPos.x_pos;\n\t\t\tlink.y1 = link.srcPos.y_pos;\n\t\t\tlink.x2 = link.trgPos.x_pos;\n\t\t\tlink.y2 = link.trgPos.y_pos;\n\t\t\tlink.originX = 0;\n\t\t\tlink.originY = 0;\n\n\t\t\tif (this.canvasLayout.linkMethod === LINK_METHOD_FREEFORM) {\n\t\t\t\tlink.srcDir = CanvasUtils.getPortDir((link.x2 - link.x1), (link.y2 - link.y1), { width: 10, height: 10, }); // Pass in a dummy node\n\t\t\t\tlink.trgDir = this.reverseDir(link.srcDir);\n\t\t\t} else {\n\t\t\t\tlink.srcDir = this.getDefaultSrcDirForPorts();\n\t\t\t\tlink.trgDir = this.reverseDir(link.srcDir);\n\t\t\t}\n\n\t\t// Semi-detached at source end.\n\t\t} else if (trgNode) {\n\t\t\tconst trgInfo = this.getTargetEndInfo(link, trgNode);\n\n\t\t\tlink.x1 = link.srcPos.x_pos;\n\t\t\tlink.y1 = link.srcPos.y_pos;\n\t\t\tlink.x2 = trgInfo.x2;\n\t\t\tlink.y2 = trgInfo.y2;\n\t\t\tlink.trgDir = trgInfo.trgDir;\n\t\t\tlink.originX = 0;\n\t\t\tlink.originY = 0;\n\n\t\t\tlink.srcDir = this.getSrcDirForDetachedLink(link, link.x1, link.y1);\n\n\t\t// Semi-detached at target end.\n\t\t} else {\n\t\t\tconst srcInfo = this.getSourceEndInfo(link, srcObj);\n\n\t\t\tlink.x1 = srcInfo.x1;\n\t\t\tlink.y1 = srcInfo.y1;\n\t\t\tlink.x2 = link.trgPos.x_pos;\n\t\t\tlink.y2 = link.trgPos.y_pos;\n\t\t\tlink.srcDir = srcInfo.srcDir;\n\t\t\tlink.originX = srcInfo.originX;\n\t\t\tlink.originY = srcInfo.originY;\n\n\t\t\tlink.trgDir = this.getTrgDirForDetachedLink(link, link.x2, link.y2);\n\t\t}\n\n\t\t// Set additional calculated fields on link object.\n\t\tlink.coordsUpdated =\n\t\t\tlink.x1 !== coords.x1 ||\n\t\t\tlink.y1 !== coords.y1 ||\n\t\t\tlink.x2 !== coords.x2 ||\n\t\t\tlink.y2 !== coords.y2;\n\n\t\treturn link;\n\t}\n\n\t// Returns an info object for the source end of the link, with:\n\t// x1 and y1 - Coordinate of the start of the link line.\n\t// srcDir - Direction (\"n\", \"s\", \"e\" or \"w\") the link line should be drawn.\n\t// originX and originY = The theoretical start point of the link line from.\n\tgetSourceEndInfo(link, srcObj) {\n\t\tconst info = {};\n\n\t\tif (this.canvasLayout.linkMethod === LINK_METHOD_FREEFORM) {\n\t\t\tconst endPos = { x: link.trgPos.x_pos, y: link.trgPos.y_pos };\n\t\t\tconst startPos = this.linkUtils.getNewFreeformNodeLinkStartPos(srcObj, endPos, link.srcFreeformInfo);\n\t\t\tinfo.x1 = startPos.x;\n\t\t\tinfo.y1 = startPos.y;\n\t\t\tinfo.originX = startPos.originX;\n\t\t\tinfo.originY = startPos.originY;\n\t\t\tinfo.srcDir = startPos.dir;\n\n\t\t} else {\n\t\t\tconst srcPortId = CanvasUtils.getSourcePortId(link, srcObj);\n\t\t\tlet port = CanvasUtils.getOutputPort(srcPortId, srcObj);\n\t\t\t// If no port, we must be handling a new association link being drawn from an input port.\n\t\t\tif (!port) {\n\t\t\t\tport = CanvasUtils.getInputPort(srcPortId, srcObj);\n\t\t\t}\n\n\t\t\tif (port) {\n\t\t\t\tinfo.x1 = srcObj.x_pos + port.cx;\n\t\t\t\tinfo.y1 = srcObj.y_pos + port.cy;\n\t\t\t\tinfo.srcDir = port.dir;\n\t\t\t}\n\t\t}\n\t\treturn info;\n\t}\n\n\t// Returns an info object for the target end of the link, with:\n\t// x1 and y1 - Coordinate of the end of the link line.\n\t// srcDir - Direction (\"n\", \"s\", \"e\" or \"w\") the link line should be drawn to.\n\tgetTargetEndInfo(link, trgNode) {\n\t\tconst info = {};\n\n\t\tif (this.canvasLayout.linkMethod === LINK_METHOD_FREEFORM) {\n\t\t\tconst endPos = { x: link.srcPos.x_pos, y: link.srcPos.y_pos };\n\t\t\tconst startPos = this.linkUtils.getNewFreeformNodeLinkStartPos(trgNode, endPos, link.trgFreeformInfo);\n\t\t\tinfo.x2 = startPos.x;\n\t\t\tinfo.y2 = startPos.y;\n\t\t\tinfo.trgDir = startPos.dir;\n\n\t\t} else {\n\t\t\tconst trgPortId = CanvasUtils.getTargetPortId(link, trgNode);\n\t\t\tconst port = CanvasUtils.getInputPort(trgPortId, trgNode);\n\t\t\tif (port) {\n\t\t\t\tinfo.x2 = trgNode.x_pos + port.cx;\n\t\t\t\tinfo.y2 = trgNode.y_pos + port.cy;\n\t\t\t\tinfo.trgDir = port.dir;\n\t\t\t}\n\t\t}\n\t\treturn info;\n\t}\n\n\t// Returns a default source direction.\n\tgetDefaultSrcDirForPorts() {\n\t\tif (this.canvasLayout.linkDirection === LINK_DIR_LEFT_RIGHT) {\n\t\t\treturn EAST;\n\n\t\t} else if (this.canvasLayout.linkDirection === LINK_DIR_RIGHT_LEFT) {\n\t\t\treturn WEST;\n\n\t\t} else if (this.canvasLayout.linkDirection === LINK_DIR_BOTTOM_TOP) {\n\t\t\treturn NORTH;\n\n\t\t} else if (this.canvasLayout.linkDirection === LINK_DIR_TOP_BOTTOM) {\n\t\t\treturn SOUTH;\n\t\t}\n\t\treturn EAST;\n\t}\n\n\t// Returns a direction (\"n\", \"s\", \"e\" or \"w\") for the source end of a detached link.\n\tgetSrcDirForDetachedLink(link, x, y) {\n\t\tif (link.trgNode) {\n\t\t\tif (this.canvasLayout.linkMethod === LINK_METHOD_PORTS) {\n\t\t\t\t// If we have a trgDir and it fits with the linkDirection currently employed we\n\t\t\t\t// can set the srcDir accordingly. These will be the default cases for ports that\n\t\t\t\t// are positioned based on link direction.\n\t\t\t\tif (link.trgDir === WEST && this.canvasLayout.linkDirection === LINK_DIR_LEFT_RIGHT) {\n\t\t\t\t\treturn EAST;\n\n\t\t\t\t} else if (link.trgDir === EAST && this.canvasLayout.linkDirection === LINK_DIR_RIGHT_LEFT) {\n\t\t\t\t\treturn WEST;\n\n\t\t\t\t} else if (link.trgDir === SOUTH && this.canvasLayout.linkDirection === LINK_DIR_BOTTOM_TOP) {\n\t\t\t\t\treturn NORTH;\n\n\t\t\t\t} else if (link.trgDir === NORTH && this.canvasLayout.linkDirection === LINK_DIR_TOP_BOTTOM) {\n\t\t\t\t\treturn SOUTH;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If the trgDir does not fit with one of the link directions then the trgDir\n\t\t\t// is associated with a port that is in a custom position. In that case, calculate\n\t\t\t// the srcDir based on the coordinates of the target point in relation to the trgNode.\n\t\t\tconst srcDir = CanvasUtils.getPortDir((x - link.trgNode.x_pos), (y - link.trgNode.y_pos), link.trgNode);\n\t\t\treturn this.reverseDir(srcDir);\n\t\t}\n\t\t// If there is no target node then this is a fully detached link so set the source\n\t\t// direction based on the position relative to the target.\n\t\tconst dir = CanvasUtils.getPortDir((x - link.trgPos.x_pos), (y - link.trgPos.y_pos), { width: 10, height: 10, }); // Pass in a dummy node\n\t\treturn this.reverseDir(dir);\n\t}\n\n\t// Returns a direction (\"n\", \"s\", \"e\" or \"w\") for the target end of a detached link.\n\tgetTrgDirForDetachedLink(link, x, y) {\n\t\tif (link.srcObj) {\n\t\t\tif (this.canvasLayout.linkMethod === LINK_METHOD_PORTS) {\n\t\t\t\t// If there is a srcDir for the link we return a trgDir if the srcDir matches the\n\t\t\t\t// linkDirection (port placement) currently in use.\n\t\t\t\tif (link.srcDir === EAST && this.canvasLayout.linkDirection === LINK_DIR_LEFT_RIGHT) {\n\t\t\t\t\treturn WEST;\n\n\t\t\t\t} else if (link.srcDir === WEST && this.canvasLayout.linkDirection === LINK_DIR_RIGHT_LEFT) {\n\t\t\t\t\treturn EAST;\n\n\t\t\t\t} else if (link.srcDir === NORTH && this.canvasLayout.linkDirection === LINK_DIR_BOTTOM_TOP) {\n\t\t\t\t\treturn SOUTH;\n\n\t\t\t\t} else if (link.srcDir === SOUTH && this.canvasLayout.linkDirection === LINK_DIR_TOP_BOTTOM) {\n\t\t\t\t\treturn NORTH;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If the srcDir does not fit with one of the link directions then the srcDir\n\t\t\t// is associated with a port that is in a custom position. In that case, calculate\n\t\t\t// the trgDir based on the coordinates of the target point in relation to the srcObj.\n\t\t\tconst srcDir = CanvasUtils.getPortDir((x - link.srcObj.x_pos), (y - link.srcObj.y_pos), link.srcObj);\n\t\t\treturn this.reverseDir(srcDir);\n\t\t}\n\t\tconst dir = CanvasUtils.getPortDir((x - link.srcPos.x_pos), (y - link.srcPos.y_pos), { width: 10, height: 10, }); // Pass in a dummy node\n\t\treturn this.reverseDir(dir);\n\t}\n\n\t// Returns the reverse of the direction passed in.\n\treverseDir(dir) {\n\t\tswitch (dir) {\n\t\tcase NORTH:\n\t\t\treturn SOUTH;\n\t\tcase SOUTH:\n\t\t\treturn NORTH;\n\t\tcase EAST:\n\t\t\treturn WEST;\n\t\tcase WEST:\n\t\tdefault:\n\t\t\treturn EAST;\n\t\t}\n\t}\n\n\t// Returns true if a link should be displayed and false if not. The link\n\t// should not be displayed if:\n\t// * it is a comment link and comment links are switched off (comments are hiding)\n\t// * the displayLinkOnOverlap flag is false and the objects at each end of\n\t// the link are overlapping.\n\tshouldDisplayLink(srcNode, trgNode, linkType) {\n\t\tif (linkType === COMMENT_LINK && this.canvasInfo.hideComments) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.canvasLayout.displayLinkOnOverlap === false) {\n\t\t\treturn !this.areLinkedObjectsOverlapping(srcNode, trgNode, linkType);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// Returns true if the linked objects overlap. srcObj can be either a comment\n\t// or node while trgNode is always a node.\n\tareLinkedObjectsOverlapping(srcObj, trgNode, linkType) {\n\t\tconst srcHighlightGap = linkType === COMMENT_LINK ? this.canvasLayout.commentHighlightGap : srcObj.layout.nodeHighlightGap;\n\t\tconst trgHighlightGap = trgNode.layout.nodeHighlightGap;\n\n\t\tconst srcLeft = srcObj.x_pos - srcHighlightGap;\n\t\tconst srcRight = srcObj.x_pos + srcObj.width + srcHighlightGap;\n\t\tconst trgLeft = trgNode.x_pos - trgHighlightGap;\n\t\tconst trgRight = trgNode.x_pos + trgNode.width + trgHighlightGap;\n\n\t\tconst srcTop = srcObj.y_pos - srcHighlightGap;\n\t\tconst srcBottom = srcObj.y_pos + srcObj.height + srcHighlightGap;\n\t\tconst trgTop = trgNode.y_pos - trgHighlightGap;\n\t\tconst trgBottom = trgNode.y_pos + trgNode.height + trgHighlightGap;\n\n\t\tif (srcRight >= trgLeft && trgRight >= srcLeft &&\n\t\t\t\tsrcBottom >= trgTop && trgBottom >= srcTop) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Returns an array of links where the minInitialLineForElbow property is\n\t// set and incremented so that elbow links that emanate from a source node\n\t// do not overlap when the first elbow bend occurs. To do this it\n\t// loops through the current nodes and for each node that has multiple\n\t// output ports:\n\t// 1. Gets the link objects associated with those ports.\n\t// 2. Sorts those link objects based on the vertical separation from\n\t// the source to the target.\n\t// 3. Applies ever increasing minInitialLineForElbow values to the link\n\t// objects based on their sort order.\n\t// The result is that the elbow links, emanating from the ports of the node,\n\t// do not overlap.\n\taddMinInitialLineForElbow(links) {\n\t\tthis.activePipeline.nodes.forEach((node) => {\n\t\t\tif (node.outputs && node.outputs.length > 1) {\n\t\t\t\tconst nodeLinks = this.getNodeOutputLinks(node, links);\n\t\t\t\tconst sortedNodeLinks = this.sortNodeOutputLinks(nodeLinks);\n\t\t\t\tthis.applyMinInitialLine(node, sortedNodeLinks);\n\t\t\t}\n\t\t});\n\t\treturn links;\n\t}\n\n\t// Returns an array of links where each link emanates from the\n\t// output ports of the source node passed in.\n\tgetNodeOutputLinks(srcNode, links) {\n\t\tconst outArray = [];\n\t\tlinks.forEach((link) => {\n\t\t\tif (link.srcObj && link.srcObj.id === srcNode.id) {\n\t\t\t\toutArray.push(link);\n\t\t\t}\n\t\t});\n\t\treturn outArray;\n\t}\n\n\t// Returns the input array of link objects sorted by the differences\n\t// between the absolute distance from the source port position to the\n\t// target port position. This means the lines connecting source node ports\n\t// to target node ports over the furthest distance (in the y direction with\n\t// Left -> Right linkDirection) will be sorted first and the lines connecting\n\t// source to target ports over the shortest y direction distance will be sorted last.\n\tsortNodeOutputLinks(nodeLinks) {\n\t\treturn nodeLinks.sort((nodeLineData1, nodeLineData2) => {\n\t\t\tlet first;\n\t\t\tlet second;\n\t\t\tif (this.canvasLayout.linkDirection === LINK_DIR_LEFT_RIGHT) {\n\t\t\t\tfirst = Math.abs(nodeLineData1.y1 - nodeLineData1.y2);\n\t\t\t\tsecond = Math.abs(nodeLineData2.y1 - nodeLineData2.y2);\n\t\t\t} else {\n\t\t\t\tfirst = Math.abs(nodeLineData1.x1 - nodeLineData1.x2);\n\t\t\t\tsecond = Math.abs(nodeLineData2.x1 - nodeLineData2.x2);\n\t\t\t}\n\t\t\tif (first === second) {\n\t\t\t\tif (this.canvasLayout.linkDirection === LINK_DIR_LEFT_RIGHT) {\n\t\t\t\t\treturn (nodeLineData1.y1 < nodeLineData1.y2) ? 1 : -1; // Tie breaker\n\t\t\t\t}\n\t\t\t\treturn (nodeLineData1.x1 < nodeLineData1.x2) ? 1 : -1; // Tie breaker\n\n\t\t\t} else if (first < second) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn -1;\n\t\t});\n\t}\n\n\t// Loops through the link objects associated with the output ports of\n\t// the node passed in and applies an ever increasing minInitialLineForElbow\n\t// value to each one. This means that, because the link objects are sorted by\n\t// vertical separation, the line with greatest vertical separation will get\n\t// the smallest minInitialLineForElbow and the line with the smallest vertical\n\t// separation will get the biggest minInitialLineForElbow.\n\tapplyMinInitialLine(node, sortedNodeLinks) {\n\t\tlet runningInitialLine = node.layout.minInitialLine;\n\t\tsortedNodeLinks.forEach((lineData) => {\n\t\t\tlineData.minInitialLineForElbow = runningInitialLine;\n\t\t\trunningInitialLine += lineData.srcObj.layout.minInitialLineIncrement;\n\t\t});\n\t}\n\n\t// Updates the data links for all the nodes with two optional fields\n\t// (called srcFreeformInfo and trgFreeformInfo) based on the location of the\n\t// nodes the links go from and to. The info in these fields is used to\n\t// calculate the starting and ending position of freeform link lines.\n\t// This ensures that input and output links that go in a certain direction\n\t// (NORTH, SOUTH, EAST or WEST) are grouped together so they can be\n\t// separated out when freeform lines are drawn between nodes.\n\tupdateFreeformLinksForNodes() {\n\t\tthis.activePipeline.nodes.forEach((n) => this.updateFreeformLinksForNode(n));\n\t}\n\n\t// Updates the links going into and out of the node passed in with up to\n\t// two new fields (called srcFreeformInfo and trgFreeformInfo).\n\tupdateFreeformLinksForNode(node) {\n\t\tconst linksInfo = {};\n\t\tlinksInfo.n = [];\n\t\tlinksInfo.s = [];\n\t\tlinksInfo.e = [];\n\t\tlinksInfo.w = [];\n\n\t\t// Update the linksInfo arrays for each direction: n, s, e and w.\n\t\tthis.activePipeline.links.forEach((link) => {\n\t\t\tif (link.type === NODE_LINK) {\n\t\t\t\t// Self-referencing link\n\t\t\t\tif (node.id === link.srcObj?.id &&\n\t\t\t\t\t\tlink.srcObj?.id === link.trgNode?.id) {\n\t\t\t\t\tlinksInfo[NORTH].push({ flow: FLOW_IN, startNode: link.srcObj, endNode: link.trgNode, link });\n\t\t\t\t\tlinksInfo[EAST].push({ flow: FLOW_OUT, startNode: link.srcObj, endNode: link.trgNode, link });\n\n\t\t\t\t} else if (link.trgNode && link.trgNode.id === node.id) {\n\t\t\t\t\tif (link.srcObj) {\n\t\t\t\t\t\tconst dir = this.getDirToNode(link.trgNode, link.srcObj);\n\t\t\t\t\t\tlinksInfo[dir].push({ flow: FLOW_IN, startNode: link.trgNode, endNode: link.srcObj, link });\n\n\t\t\t\t\t} else if (link.srcPos) {\n\t\t\t\t\t\tconst dir = this.getDirToEndPos(link.trgNode, link.srcPos.x_pos, link.srcPos.y_pos);\n\t\t\t\t\t\tlinksInfo[dir].push({ flow: FLOW_IN, x: link.srcPos.x_pos, y: link.srcPos.y_pos, link });\n\t\t\t\t\t}\n\n\t\t\t\t} else if (link.srcObj && link.srcObj.id === node.id) {\n\t\t\t\t\tif (link.trgNode) {\n\t\t\t\t\t\tconst dir = this.getDirToNode(link.srcObj, link.trgNode);\n\t\t\t\t\t\tlinksInfo[dir].push({ flow: FLOW_OUT, startNode: link.srcObj, endNode: link.trgNode, link });\n\n\t\t\t\t\t} else if (link.trgPos) {\n\t\t\t\t\t\tconst dir = this.getDirToEndPos(link.srcObj, link.trgPos.x_pos, link.trgPos.y_pos);\n\t\t\t\t\t\tlinksInfo[dir].push({ flow: FLOW_OUT, x: link.trgPos.x_pos, y: link.trgPos.y_pos, link });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tconst startCenter = {\n\t\t\tx: node.x_pos + node.width / 2,\n\t\t\ty: node.y_pos + node.height / 2\n\t\t};\n\n\t\tlinksInfo.n = this.sortLinksInfo(linksInfo.n, NORTH, startCenter);\n\t\tlinksInfo.s = this.sortLinksInfo(linksInfo.s, SOUTH, startCenter);\n\t\tlinksInfo.e = this.sortLinksInfo(linksInfo.e, EAST, startCenter);\n\t\tlinksInfo.w = this.sortLinksInfo(linksInfo.w, WEST, startCenter);\n\n\t\tthis.updateLinksInfo(linksInfo.n, NORTH);\n\t\tthis.updateLinksInfo(linksInfo.s, SOUTH);\n\t\tthis.updateLinksInfo(linksInfo.e, EAST);\n\t\tthis.updateLinksInfo(linksInfo.w, WEST);\n\t}\n\n\t// Returns the direction (NORTH, SOUTH, EAST or WEST) from the start node\n\t// to the end node.\n\tgetDirToNode(startNode, endNode) {\n\t\tconst endX = this.nodeUtils.getNodeCenterPosX(endNode);\n\t\tconst endY = this.nodeUtils.getNodeCenterPosY(endNode);\n\t\treturn this.getDirToEndPos(startNode, endX, endY);\n\t}\n\n\t// Returns the direction (NORTH, SOUTH, EAST or WEST) from the start node\n\t// to the end position endX, endY.\n\tgetDirToEndPos(startNode, endX, endY) {\n\t\tconst originX = this.nodeUtils.getNodeCenterPosX(startNode);\n\t\tconst originY = this.nodeUtils.getNodeCenterPosY(startNode);\n\n\t\tconst x = startNode.x_pos;\n\t\tconst y = startNode.y_pos;\n\t\tconst w = startNode.width;\n\t\tconst h = startNode.height;\n\n\t\treturn CanvasUtils.getDir(x, y, w, h, originX, originY, endX, endY);\n\t}\n\n\t// Returns the linksDirArray passed in with the linkInfo objects in the\n\t// array ordered by the angle that each link makes with the center of the\n\t// start node. When handling multiple links that go to the same node\n\t// the links have to be grouped where links in the same group go to/from\n\t// the same node. For groups, the x and y are *projected* coordinates to\n\t// allow us to calculate the angles and ordering etc. The actual x and y\n\t// for the links is calculated in getAttachedLinkObj and getDetachedLinkObj.\n\tsortLinksInfo(linksDirArrayIn, dir, startCenter) {\n\t\tlet linksDirArray = linksDirArrayIn;\n\t\tif (linksDirArray.length > 1) {\n\t\t\tconst groups = this.getLinkInfoGroups(linksDirArray);\n\n\t\t\tforOwn(groups, (group) => {\n\t\t\t\tgroup.forEach((li, i) => {\n\t\t\t\t\tconst node = li.endNode;\n\t\t\t\t\tconst parts = group.length + 1;\n\n\t\t\t\t\tif (dir === NORTH || dir === SOUTH) {\n\t\t\t\t\t\tli.x = node.x_pos + ((node.width / parts) * (i + 1));\n\t\t\t\t\t\tli.y = this.nodeUtils.getNodeCenterPosY(node);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tli.x = this.nodeUtils.getNodeCenterPosX(node);\n\t\t\t\t\t\tli.y = node.y_pos + ((node.height / parts) * (i + 1));\n\t\t\t\t\t}\n\t\t\t\t\t// Special case where links that go SOUTH from the node and\n\t\t\t\t\t// point to the WEST of the end node, get crossed over each other.\n\t\t\t\t\t// In this case the x coordinates of the link items need to be\n\t\t\t\t\t// reversed.\n\t\t\t\t\tif (dir === SOUTH) {\n\t\t\t\t\t\tconst reverseDir = this.getDirToNode(li.endNode, li.startNode);\n\t\t\t\t\t\tif (reverseDir === WEST) {\n\t\t\t\t\t\t\tli.x = node.x_pos + ((node.width / parts) * (group.length - i));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Special case where links that go NORTH from the node and\n\t\t\t\t\t// point to the EAST of the end node, get crossed over each other.\n\t\t\t\t\t// In this case the x coordinates of the link items need to be\n\t\t\t\t\t// reversed.\n\t\t\t\t\tif (dir === NORTH) {\n\t\t\t\t\t\tconst reverseDir = this.getDirToNode(li.endNode, li.startNode);\n\t\t\t\t\t\tif (reverseDir === EAST) {\n\t\t\t\t\t\t\tli.x = node.x_pos + ((node.width / parts) * (group.length - i));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// Set an angle for each linkDir so that they can be sorted so they do not\n\t\t\t// overlap when being drawn to or from the node. The angle is from the\n\t\t\t// center of the node we are handling to their projected end point.\n\t\t\tlinksDirArray.forEach((ld) => {\n\t\t\t\tld.angle = CanvasUtils.calculateAngle(startCenter.x, startCenter.y, ld.x, ld.y);\n\n\t\t\t\t// Make sure the angles for links on the EAST side of the node are\n\t\t\t\t// increasing in the clockwise direction by decrementing the angles from\n\t\t\t\t// 270 to 360 by 360 degrees. (This is because calculateAngle returns\n\t\t\t\t// positive angles from the 3 o'clock position in clockwise direction.)\n\t\t\t\tif (dir === EAST && ld.angle >= 270) {\n\t\t\t\t\tld.angle -= 360;\n\t\t\t\t}\n\n\t\t\t\t// For self-referencing links we overwrite the angle to ensure that\n\t\t\t\t// the outward direction (EAST) is always drawn at the top of any\n\t\t\t\t// EAST links and the inward direction (NORTH) is always drawn to\n\t\t\t\t// the right of any NORTH links.\n\t\t\t\tif (ld.startNode && ld.endNode && ld.startNode === ld.endNode) {\n\t\t\t\t\tif (dir === EAST) {\n\t\t\t\t\t\tld.angle = -90;\n\t\t\t\t\t} else if (dir === NORTH) {\n\t\t\t\t\t\tld.angle = 360;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Sort the linksDirArray by the angle that each link forms with the\n\t\t\t// center of the start node.\n\t\t\tif (dir === NORTH || dir === EAST) {\n\t\t\t\tlinksDirArray = linksDirArray.sort((a, b) => (a.angle > b.angle ? 1 : -1));\n\t\t\t} else {\n\t\t\t\tlinksDirArray = linksDirArray.sort((a, b) => (a.angle < b.angle ? 1 : -1));\n\t\t\t}\n\t\t}\n\t\treturn linksDirArray;\n\t}\n\n\t// Returns a 'groups' object where each field is indexed by a node ID and\n\t// contains an array of linkInfo objects that go to/from the node. Note:\n\t// endNode is the target node for link that point away from the node we\n\t// are handling and is the source node for links the point to the node\n\t// we are handling.\n\tgetLinkInfoGroups(linksDirArray) {\n\t\tconst groups = {};\n\t\tlinksDirArray.forEach((li) => {\n\t\t\t// Only create groups for attached links.\n\t\t\tif (li.endNode) {\n\t\t\t\tif (!groups[li.endNode.id]) {\n\t\t\t\t\tgroups[li.endNode.id] = [];\n\t\t\t\t}\n\t\t\t\tgroups[li.endNode.id].push(li);\n\t\t\t}\n\t\t});\n\t\treturn groups;\n\t}\n\n\t// Updates the link objects referenced by the linkInfo objects in the\n\t// linksDirArray with info to specify the link direction (n, s, e or w),\n\t// plus the index and number of connections. This is used when\n\t// drawing straight lines to/from nodes to spread out the lines.\n\tupdateLinksInfo(linksDirArray, dir) {\n\t\tlinksDirArray.forEach((li, i) => {\n\t\t\tif (li.flow === FLOW_OUT) {\n\t\t\t\tli.link.srcFreeformInfo = {\n\t\t\t\t\tdir: dir,\n\t\t\t\t\tidx: i,\n\t\t\t\t\tlen: linksDirArray.length\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tli.link.trgFreeformInfo = {\n\t\t\t\t\tdir: dir,\n\t\t\t\t\tidx: i,\n\t\t\t\t\tlen: linksDirArray.length\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\t}\n\n\t// Returns a variation of association link to draw when a new link is being\n\t// drawn outwards from a port. startX is the beginning point of the line\n\t// at the port. endX is the position where the mouse is currently positioned.\n\tgetNewLinkAssocVariation(startX, endX, flow) {\n\t\tif (flow === FLOW_IN && startX > endX) {\n\t\t\treturn ASSOC_VAR_CURVE_LEFT;\n\n\t\t} else if (flow === FLOW_OUT && startX < endX) {\n\t\t\treturn ASSOC_VAR_CURVE_RIGHT;\n\t\t}\n\t\treturn ASSOC_VAR_DOUBLE_BACK_RIGHT;\n\t}\n\n\t// Returns a variation of association link to draw between a source node and a\n\t// target node based on their relative positions.\n\tgetAssocLinkVariation(srcNode, trgNode) {\n\t\tconst gap = srcNode.layout.minInitialLine;\n\t\tif (trgNode.x_pos >= srcNode.x_pos + srcNode.width + gap) {\n\t\t\treturn ASSOC_VAR_CURVE_RIGHT;\n\n\t\t} else if (srcNode.x_pos >= trgNode.x_pos + trgNode.width + gap) {\n\t\t\treturn ASSOC_VAR_CURVE_LEFT;\n\n\t\t// TODO - If we decide to optionally also support doubleBackLeft for\n\t\t// association links at some point uncomment this code.\n\t\t// } else if (trgNode.x_pos + (trgNode.width / 2) >= srcNode.x_pos + (srcNode.width / 2)) {\n\t\t// \treturn DOUBLE_BACK_LEFT;\n\t\t}\n\t\treturn ASSOC_VAR_DOUBLE_BACK_RIGHT;\n\t}\n\n\t// Returns path for arrow head displayed within an port circle. It is\n\t// draw so the tip is 2px in front of the origin 0,0 so it appears nicely in\n\t// the port circle.\n\tgetPortArrowPath() {\n\t\treturn \"M -2 3 L 2 0 -2 -3\";\n\t}\n\n\t// Returns the transform to position and, if necessary, rotate the port\n\t// circle arrow for input ports.\n\tgetInputPortArrowPathTransform(port) {\n\t\tconst angle = CanvasUtils.getAngleForInputPorts(port.dir);\n\t\treturn `translate(${port.cx}, ${port.cy}) rotate(${angle})`;\n\t}\n\n\t// Returns the transform to position and, if necessary, rotate the port\n\t// circle arrow for output ports.\n\tgetOutputPortArrowPathTransform(port) {\n\t\tconst angle = CanvasUtils.getAngleForOutputPorts(port.dir);\n\t\treturn `translate(${port.cx}, ${port.cy}) rotate(${angle})`;\n\t}\n\n\t// Returns the path and transform for the connect-from indicator arrow\n\t// based on the port's direction. The arrow points away from the port.\n\tgetConnectFromArrowInfo(port, node) {\n\t\tconst offset = node.layout.portRadius + 5;\n\t\tconst dir = port.dir || \"e\"; // Default to east if no direction specified\n\n\t\t// Single arrow path pointing right: shaft is 12px long, arrowhead is 3px\n\t\tconst path = \"M 0 0 L 12 0 L 9 -3 M 12 0 L 9 3\";\n\n\t\t// Rotation angles for each direction\n\t\tconst rotations = {\n\t\t\te: 0, // East - no rotation (arrow points right)\n\t\t\ts: 90, // South - rotate 90° (arrow points down)\n\t\t\tw: 180, // West - rotate 180° (arrow points left)\n\t\t\tn: 270 // North - rotate 270° (arrow points up)\n\t\t};\n\n\t\tconst rotation = rotations[dir] || 0;\n\n\t\t// Calculate offset position based on direction\n\t\tlet offsetX = 0;\n\t\tlet offsetY = 0;\n\t\tswitch (dir) {\n\t\tcase \"n\":\n\t\t\toffsetY = -offset;\n\t\t\tbreak;\n\t\tcase \"s\":\n\t\t\toffsetY = offset;\n\t\t\tbreak;\n\t\tcase \"e\":\n\t\t\toffsetX = offset;\n\t\t\tbreak;\n\t\tcase \"w\":\n\t\tdefault:\n\t\t\toffsetX = -offset;\n\t\t\tbreak;\n\t\t}\n\n\t\tconst transform = `translate(${port.cx + offsetX}, ${port.cy + offsetY}) rotate(${rotation})`;\n\n\t\treturn { path, transform };\n\t}\n\n\t// Returns an SVG path to draw the arrow head.\n\tgetArrowHead(d) {\n\t\tif (d.type === COMMENT_LINK) {\n\t\t\tif (typeof this.canvasLayout.commentLinkArrowHead === \"string\") {\n\t\t\t\treturn this.canvasLayout.commentLinkArrowHead;\n\t\t\t}\n\t\t\treturn \"M -8 3 L 0 0 -8 -3\";\n\t\t}\n\t\tif (typeof this.canvasLayout.dataLinkArrowHead === \"string\") {\n\t\t\treturn this.canvasLayout.dataLinkArrowHead;\n\t\t}\n\t\treturn \"M -6 6 L 0 0 -6 -6\";\n\t}\n\n\t// Returns a transform for an arrow head at the target end of a link line.\n\tgetArrowHeadTransform(link) {\n\t\tconst angle = CanvasUtils.getLinkEndAngle(link, FLOW_IN, this.canvasLayout);\n\t\treturn `translate(${link.x2}, ${link.y2}) rotate(${angle})`;\n\t}\n\n\t// Returns a rotation transform for an image displayed for a\n\t// port of the type defined by the flow parameter (in or out).\n\tgetPortImageTransform(port, flow) {\n\t\tconst angle = flow === FLOW_OUT\n\t\t\t? CanvasUtils.getAngleForOutputPorts(port.dir)\n\t\t\t: CanvasUtils.getAngleForInputPorts(port.dir);\n\n\t\treturn `rotate(${angle},${port.cx},${port.cy})`;\n\t}\n\n\tgetLinkImageTransform(d) {\n\t\tlet angle = 0;\n\n\t\t// For \"Freeform\" Straight and Curve links, we calculate the angle\n\t\t// based on the rotation of the link line direction.\n\t\tif (this.canvasLayout.linkMethod === LINK_METHOD_FREEFORM &&\n\t\t\t(this.canvasLayout.linkType === LINK_TYPE_STRAIGHT ||\n\t\t\t\tthis.canvasLayout.linkType === LINK_TYPE_CURVE)) {\n\t\t\tangle = CanvasUtils.calculateAngle((d.originX || d.x1), (d.originY || d.y1), d.x2, d.y2);\n\n\t\t// For \"Freeform\" Elbow and Parallax links AND all links using the\n\t\t// \"Ports\" method, we snap the link direction to the target\n\t\t// direction stored in the link.\n\t\t} else {\n\t\t\tangle = CanvasUtils.getAngleForInputPorts(d.trgDir);\n\t\t}\n\n\t\treturn `rotate(${angle},${d.x2},${d.y2})`;\n\n\t}\n\n\tcanOpenTip(tipType) {\n\t\treturn this.canvasController.isTipEnabled(tipType) &&\n\t\t\t!this.regionSelect && !this.isDragging() && !this.isSizing();\n\t}\n\n\t// Return the x,y coordinates for the default position of a new comment\n\t// created from the toolbar. This make sure the new comment always appears\n\t// in the top left corner of the view port.\n\tgetDefaultCommentOffset() {\n\t\tlet xPos = this.canvasLayout.addCommentOffsetX;\n\t\tlet yPos = this.canvasLayout.addCommentOffsetY;\n\t\tconst z = this.zoomUtils.getZoomTransform();\n\n\t\tif (z) {\n\t\t\tconst xPanByScale = z.x / z.k;\n\t\t\tconst yPanByScale = z.y / z.k;\n\n\t\t\t// Offset in the negative direction.\n\t\t\txPos = -xPanByScale + this.canvasLayout.addCommentOffsetX;\n\t\t\tyPos = -yPanByScale + this.canvasLayout.addCommentOffsetY;\n\t\t}\n\n\t\tif (this.config.enableSnapToGridType === SNAP_TO_GRID_DURING ||\n\t\t\t\tthis.config.enableSnapToGridType === SNAP_TO_GRID_AFTER) {\n\t\t\treturn this.snapToGridPosition({ x: xPos, y: yPos });\n\t\t}\n\t\treturn { x: xPos, y: yPos };\n\t}\n\n\t// Returns a string that explains which flags are set to true.\n\tgetFlags() {\n\t\tlet str = \"Flags:\";\n\t\tif (this.isDragging()) {\n\t\t\tstr += \" dragging = true\";\n\t\t}\n\t\tif (this.isSizing()) {\n\t\t\tstr += \" sizing = true\";\n\t\t}\n\t\tif (this.regionSelect) {\n\t\t\tstr += \" regionSelect = true\";\n\t\t}\n\t\tif (str === \"Flags:\") {\n\t\t\tstr += \" None\";\n\t\t}\n\t\treturn str;\n\t}\n\n\tfocusNextTabGroup(evt) {\n\t\tconst focusObj = this.canvasController.getFocusObject();\n\t\tconst nextObj = this.activePipeline.getNextTabGroupStartObject(focusObj);\n\n\t\tif (nextObj) {\n\t\t\tthis.setFocusObject(nextObj, evt, false, true);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tfocusPreviousTabGroup(evt) {\n\t\tconst focusObj = this.canvasController.getFocusObject();\n\t\tconst previousObj = this.activePipeline.getPreviousTabGroupStartObject(focusObj);\n\n\t\tif (previousObj) {\n\t\t\tthis.setFocusObject(previousObj, evt);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Returns the canvas object (node, link or comment) for the currently\n\t// focused (active) canvas DOM element.\n\tgetActiveCanvasObject() {\n\t\tconst el = this.getActiveCanvasElement();\n\t\tif (el) {\n\t\t\treturn d3.select(el).datum();\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Returns the currently focused canvas DOM element for a node, comment\n\t// or link as described by the document.activeElement property. This will\n\t// return a DOM element for node, comment or link even if a sub-object\n\t// within one of these objects has focus.\n\tgetActiveCanvasElement() {\n\t\tlet objElement = null;\n\n\t\tif (document.activeElement) {\n\t\t\tobjElement = document.activeElement.closest(\".d3-node-group\");\n\n\t\t\tif (!objElement) {\n\t\t\t\tobjElement = document.activeElement.closest(\".d3-comment-group\");\n\t\t\t}\n\t\t\tif (!objElement) {\n\t\t\t\tobjElement = document.activeElement.closest(\".d3-link-group\");\n\t\t\t}\n\t\t}\n\t\treturn objElement;\n\t}\n\n\t// Sets the focus object passed in.\n\tsetFocusObject(focusObj, evt, allowDefaultAction = false, force = false) {\n\t\tif (!this.config.enableKeyboardNavigation) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If allowDefaultAction is specified as true, we do not 'preventDefault'\n\t\t// only stop propagation. Setting allowDefaultAction to true is useful for\n\t\t// applications that provide a React object for the node body and they want\n\t\t// the default action to go through to the React, perhaps to initiate a drag event.\n\t\tif (allowDefaultAction) {\n\t\t\tevt.stopPropagation();\n\n\t\t} else {\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t}\n\n\t\tthis.canvasController.setFocusObject(focusObj, evt, force);\n\t}\n\n\tclearSubObject() {\n\t\tthis.subObject = null;\n\t\tthis.subObjectParentObj = null;\n\t}\n\n\t// Restores the focus to the previous focused object or sub-object.\n\trestoreFocus() {\n\t\tif (!this.canvasController.isContextMenuDisplayed()) {\n\n\t\t\tif (this.subObject) {\n\t\t\t\tthis.restoreFocusToSubObject();\n\n\t\t\t} else if (this.canvasController.getFocusObject()) {\n\t\t\t\tthis.canvasController.restoreFocus();\n\t\t\t}\n\t\t}\n\t}\n\n\tfocusOnTextEntryElement(evt) {\n\t\tthis.svgCanvasTextArea.focusOnTextEntryElement(evt);\n\t}\n\n\t// Returns an object containing 4 \"gaps\" that can be used to draw a focus\n\t// outline around the node and corresponding node selection passed in.\n\t// This method calculates the gaps by calculating the amount the node\n\t// label protrudes outside of the node boundary. This is necessary\n\t// because, unfortunately, JavaScript's getClientBoundingRect method\n\t// does not take into account the variable size of the <span> inside\n\t// the <div> of the <foreignobject> used to display the label.\n\tgetNodeFocusIncrements(node, objSel) {\n\t\tlet leftGap = 0;\n\t\tlet rightGap = 0;\n\t\tlet topGap = 0;\n\t\tlet bottomGap = 0;\n\n\t\tconst labelDivElement = objSel\n\t\t\t.select(\".d3-node-label\")\n\t\t\t.node();\n\n\t\tconst labelSpanElement = objSel\n\t\t\t.select(\".d3-node-label\")\n\t\t\t.select(\"span\")\n\t\t\t.node();\n\n\t\tif (labelDivElement && labelSpanElement) {\n\t\t\tconst labelDivRect = this.zoomUtils.getTransformedElementRect(labelDivElement);\n\t\t\tconst labelSpanRect = this.zoomUtils.getTransformedElementRect(labelSpanElement);\n\n\t\t\tconst labelRectRight = Math.min(labelSpanRect.right, labelDivRect.right);\n\t\t\tconst labelRectBottom = Math.min(labelSpanRect.bottom, labelDivRect.bottom);\n\n\t\t\t// Calculate the gap which is the label overlap from the node boundary.\n\t\t\tleftGap = node.x_pos - labelSpanRect.x;\n\t\t\trightGap = labelRectRight - (node.x_pos + node.width);\n\t\t\ttopGap = node.y_pos - labelSpanRect.y;\n\t\t\tbottomGap = labelRectBottom - (node.y_pos + node.height);\n\t\t}\n\n\t\t// Ensure the gaps include a small increment for spacing and are at\n\t\t// least as big as the nodeSizingArea.\n\t\tconst focusInc = 4;\n\t\tleftGap = Math.max(node.layout.nodeSizingArea, leftGap + focusInc);\n\t\trightGap = Math.max(node.layout.nodeSizingArea, rightGap + focusInc);\n\t\ttopGap = Math.max(node.layout.nodeSizingArea, topGap + focusInc);\n\t\tbottomGap = Math.max(node.layout.nodeSizingArea, bottomGap + focusInc);\n\n\t\treturn { leftGap, rightGap, topGap, bottomGap };\n\t}\n\n\t// Moves the visual focus onto the object provided and\n\t// uses zoom-to-reveal to bring the focused object into the\n\t// viewport if it is not already.\n\t// This is a utility method called from the canvas controller.\n\tmoveFocusTo(obj, evt) {\n\t\tthis.logger.log(\"moveFocusTo - \" + CanvasUtils.getFocusName(obj));\n\n\t\tif (!obj || obj === CANVAS_FOCUS) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there is currently a focused link and it is the top most object,\n\t\t// push it to the bottom of the display order, because it will have\n\t\t// been raised to the top when it previously received focus.\n\t\tif (!this.config.enableLinksOverNodes &&\n\t\t\t\t(this.config.enableLinkSelection === LINK_SELECTION_HANDLES ||\n\t\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_DETACHABLE)) {\n\t\t\tconst focusSel = d3.selectAll(\".d3-link-group:focus-within\");\n\t\t\tconst focusElement = focusSel.node();\n\t\t\tconst topElement = focusElement?.parentElement?.lastChild;\n\t\t\tif (topElement?.classList?.contains(\"d3-link-group\")) {\n\t\t\t\td3.select(topElement).lower();\n\t\t\t}\n\t\t}\n\n\t\tthis.subObject = null;\n\t\tthis.subObjectParentObj = null;\n\n\t\tconst type = CanvasUtils.getObjectTypeName(obj);\n\n\t\tthis.canvasGrp.selectAll(\".d3-focus-path\").remove();\n\n\t\tlet objSel = null;\n\t\tif (type === \"node\") {\n\t\t\tif (this.activePipeline.getNode(obj.id)) {\n\t\t\t\tobjSel = this.getNodeGroupSelectionById(obj.id);\n\n\t\t\t\tobjSel.insert(\"path\", \":first-child\")\n\t\t\t\t\t.attr(\"class\", \"d3-focus-path\")\n\t\t\t\t\t.attr(\"d\", (d) =>\n\t\t\t\t\t\tthis.getRectangleNodeShapePath(d, this.getNodeFocusIncrements(d, objSel)));\n\n\t\t\t} else {\n\t\t\t\t// This may happen when objects are being created.\n\t\t\t\tthis.logger.log(\"Node with ID \" + obj.id + \" not found in activePipeline\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t} else if (type === \"comment\") {\n\t\t\tif (this.activePipeline.getComment(obj.id)) {\n\t\t\t\tobjSel = this.getCommentGroupSelectionById(obj.id);\n\n\t\t\t\tobjSel.insert(\"rect\", \":first-child\")\n\t\t\t\t\t.attr(\"class\", \"d3-focus-path\")\n\t\t\t\t\t.attr(\"x\", -this.canvasLayout.commentSizingArea)\n\t\t\t\t\t.attr(\"y\", -this.canvasLayout.commentSizingArea)\n\t\t\t\t\t.attr(\"height\", (c) => c.height + (2 * this.canvasLayout.commentSizingArea))\n\t\t\t\t\t.attr(\"width\", (c) => c.width + (2 * this.canvasLayout.commentSizingArea));\n\t\t\t} else {\n\t\t\t\t// This may happen when objects are being created.\n\t\t\t\tthis.logger.log(\"Comment with ID \" + obj.id + \" not found in activePipeline\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t} else if (type === \"link\") {\n\t\t\tif (this.activePipeline.getLink(obj.id)) {\n\t\t\t\tobjSel = this.getLinkGroupSelectionById(obj.id);\n\n\t\t\t\t// Raise any node (data) link to top before focusing it, if it has handles\n\t\t\t\tif (obj.type === NODE_LINK &&\n\t\t\t\t\t\t(this.config.enableLinkSelection === LINK_SELECTION_HANDLES ||\n\t\t\t\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_DETACHABLE)) {\n\t\t\t\t\tobjSel.raise();\n\t\t\t\t}\n\n\t\t\t\t// TODO - Think of a way to show focus on links other than line thickness\n\t\t\t} else {\n\t\t\t\t// This may happen when objects are being created.\n\t\t\t\tthis.logger.log(\"Link with ID \" + obj.id + \" not found in activePipeline\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// If there is a non-null D3 selection object that is not empty,\n\t\t// we can position the node in the viewport and then set focus on it.\n\t\tif (objSel && !objSel.empty()) {\n\t\t\t// If the focus was initiated by a Keyboard event we zoom to reveal, so the object\n\t\t\t// appears in the viewport. If the event was a MouseEvent we don't zoom to reveal\n\t\t\t// because it interferes with double-click events (also it's not necessary because\n\t\t\t// the object will be at least partially visible in the view port for it to be clicked).\n\t\t\tif (CanvasUtils.isKeyboardEvent(evt)) {\n\t\t\t\tconst zoom = this.canvasController.getZoomToReveal([obj.id]);\n\n\t\t\t\tif (zoom) {\n\t\t\t\t\tthis.zoomTo(zoom);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst element = objSel.node();\n\t\t\tif (element) {\n\t\t\t\tthis.logger.log(\"moveFocusTo - set focus on element\");\n\t\t\t\telement.focus();\n\t\t\t}\n\n\t\t} else {\n\t\t\tconst id = obj ? obj.id : \"Unknown\";\n\t\t\tthis.logger.error(`Error applying focus to ${type} object with ID: ${id}`);\n\t\t}\n\t}\n\n\t// Moves the focus highlighting to the next appropriate sub-object within\n\t// the parent object.\n\tsetFocusNextSubObject(parentObj, evt) {\n\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\n\t\tconst subObject = this.activePipeline.getNextSubObject(parentObj, this.subObject);\n\t\tthis.moveFocusToSubObject(subObject, parentObj, evt);\n\t}\n\n\t// Moves the focus highlighting to the previous appropriate sub-object within\n\t// the parent object.\n\tsetFocusPreviousSubObject(parentObj, evt) {\n\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\n\t\tconst subObject = this.activePipeline.getPreviousSubObject(parentObj, this.subObject);\n\t\tthis.moveFocusToSubObject(subObject, parentObj, evt);\n\t}\n\n\t// Restores the focus to the previously focused sub-object of a node or link.\n\trestoreFocusToSubObject() {\n\t\tthis.moveFocusToSubObject(this.subObject, this.subObjectParentObj, null);\n\t}\n\n\t// Moves the focus to a new sub-object with a node or link.\n\tmoveFocusToSubObject(subObject, parentObj, d3Event) {\n\t\t// If there's no sub-object, just return.\n\t\tif (!subObject) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.subObject = subObject;\n\t\tthis.subObjectParentObj = parentObj;\n\n\t\t// Remove the current focus highlighting.\n\t\tthis.canvasGrp.selectAll(\".d3-focus-path\").remove();\n\n\t\tlet objSel = null;\n\n\t\t// If the subObject is a react object (used to provide the node body) we\n\t\t// pass focus control to the react object by calling the focus function that\n\t\t// the react object should have registered previously with the canvas controller.\n\t\tif (subObject.type === \"reactObject\") {\n\t\t\tif (parentObj.focusFunction && d3Event) {\n\t\t\t\tparentObj.focusFunction(d3Event);\n\t\t\t}\n\t\t\treturn;\n\n\t\t} else if (subObject.type === \"inputPort\") {\n\t\t\tobjSel = this.getNodeInputPortSelectionById(subObject.obj.id, parentObj.id);\n\n\t\t} else if (subObject.type === \"outputPort\") {\n\t\t\tobjSel = this.getNodeOutputPortSelectionById(subObject.obj.id, parentObj.id);\n\n\t\t} else if (subObject.type === \"linkStart\") {\n\t\t\tobjSel = this.getLinkStartHandleGrpSelectionById(subObject.obj.id);\n\n\t\t} else if (subObject.type === \"linkEnd\") {\n\t\t\tobjSel = this.getLinkEndHandleGrpSelectionById(subObject.obj.id);\n\n\t\t} else if (subObject.type === \"decoration\") {\n\t\t\tobjSel = CanvasUtils.getObjectTypeName(parentObj) === \"node\"\n\t\t\t\t? this.getNodeDecSelectionById(subObject.obj.id, parentObj.id)\n\t\t\t\t: this.getLinkDecSelectionById(subObject.obj.id, parentObj.id);\n\t\t}\n\n\t\tif (objSel) {\n\t\t\t// If the parent object is a link, raise it to the top of the display\n\t\t\t// because it may have been lowered during the setCanvasInfoRender\n\t\t\t// call following a change to the flow.\n\t\t\tif (CanvasUtils.getObjectTypeName(parentObj) === \"link\") {\n\t\t\t\tthis.getLinkGroupSelectionById(parentObj.id).raise();\n\t\t\t}\n\n\t\t\t// Get the DOM element for the selected sub-object.\n\t\t\tconst element = objSel.node();\n\n\t\t\tif (element) {\n\t\t\t\tthis.logger.log(\"moveFocusTo - set focus on element\");\n\t\t\t\tthis.drawFocusBox(objSel, element);\n\t\t\t\tif (d3Event) {\n\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t}\n\t\t\t\telement.focus();\n\t\t\t}\n\t\t}\n\t}\n\n\t// Draws a focus box around the object selection (and associated element)\n\t// passed in.\n\tdrawFocusBox(objSel, element) {\n\t\tconst bBox = element.getBBox();\n\n\t\tconst spacing = 2;\n\n\t\tobjSel.append(\"rect\")\n\t\t\t.attr(\"class\", \"d3-focus-path\")\n\t\t\t.attr(\"x\", bBox.x - spacing)\n\t\t\t.attr(\"y\", bBox.y - spacing)\n\t\t\t.attr(\"height\", bBox.height + (2 * spacing))\n\t\t\t.attr(\"width\", bBox.width + (2 * spacing));\n\t}\n}\n\n","/*\n * Copyright 2017-2023 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n// Import just the D3 modules that are needed.\nimport * as d3 from \"d3-selection\";\nimport { cloneDeep } from \"lodash\";\nimport SVGCanvasRenderer from \"./svg-canvas-renderer.js\";\nimport ConfigUtils from \"../object-model/config-utils.js\";\nimport Logger from \"../logging/canvas-logger.js\";\n\nexport default class SVGCanvasD3 {\n\n\tconstructor(canvasInfoId, canvasDivSelector, canvasController) {\n\t\tthis.logger = new Logger([\"SVGCanvasD3\", \"FlowId\", canvasInfoId]);\n\t\tthis.logger.logStartTimer(\"constructor\");\n\t\tthis.canvasController = canvasController;\n\t\tthis.canvasDiv = d3.select(canvasDivSelector);\n\t\tthis.logger.logEndTimer(\"constructor\", true);\n\t}\n\n\tsetCanvasInfo(canvasInfo, selectionInfo, breadcrumbs, nodeLayout, canvasLayout, config) {\n\t\tthis.logger = new Logger([\"SVGCanvasD3\", \"FlowId\", canvasInfo.id]);\n\t\tif (!this.config ||\n\t\t\t\t!this.renderer ||\n\t\t\t\t!this.canvasInfo ||\n\t\t\t\tcanvasInfo.id !== this.canvasInfo.id ||\n\t\t\t\t(this.renderer && this.renderer.pipelineId !== this.canvasController.getCurrentBreadcrumb().pipelineId) ||\n\t\t\t\t!ConfigUtils.compareCanvasConfigsOmitFields(this.config, config)) {\n\t\t\tthis.logger.logStartTimer(\"initializing\");\n\n\t\t\tthis.canvasInfo = this.cloneCanvasInfo(canvasInfo);\n\t\t\tthis.config = this.cloneConfig(config);\n\n\t\t\tif (this.renderer) {\n\t\t\t\tthis.renderer.clearCanvas();\n\t\t\t\tthis.renderer = null;\n\t\t\t}\n\n\t\t\tconst currentBreadcrumb = this.canvasController.getCurrentBreadcrumb();\n\t\t\tthis.renderer = new SVGCanvasRenderer(\n\t\t\t\tcurrentBreadcrumb.pipelineId,\n\t\t\t\tthis.canvasDiv,\n\t\t\t\tthis.canvasController,\n\t\t\t\tthis.canvasInfo,\n\t\t\t\tselectionInfo,\n\t\t\t\tbreadcrumbs,\n\t\t\t\tnodeLayout,\n\t\t\t\tcanvasLayout,\n\t\t\t\tconfig,\n\t\t\t\t{ id: currentBreadcrumb.supernodeId, // Will be null for primary pipeline\n\t\t\t\t\tpipelineId: currentBreadcrumb.supernodeParentPipelineId // Will be null for primary pipeline\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tthis.logger.logEndTimer(\"initializing\", true);\n\n\t\t} else {\n\t\t\tthis.logger.logStartTimer(\"set canvas info\");\n\n\t\t\tthis.canvasInfo = this.cloneCanvasInfo(canvasInfo);\n\t\t\tthis.config = this.cloneConfig(config);\n\t\t\tthis.renderer.setCanvasInfoRenderer(this.canvasInfo, selectionInfo, breadcrumbs, nodeLayout, canvasLayout, this.config);\n\n\t\t\tthis.logger.logEndTimer(\"set canvas info\", true);\n\t\t}\n\t}\n\n\tsetSelectionInfo(selectionInfo) {\n\t\tif (this.renderer) {\n\t\t\tthis.renderer.setSelectionInfo(selectionInfo);\n\t\t}\n\t}\n\n\t// Returns a copy of the config object. This is necessary so that comparisons\n\t// with new config objects that are provided reveal differences. This will\n\t// not clone the contents of emptyCanvasContent, dropZoneCanvasContent nor\n\t// enableNodeLayout.\n\tcloneConfig(config) {\n\t\treturn Object.assign({}, config);\n\t}\n\n\t// Returns a clone of the canvas info passed in.\n\tcloneCanvasInfo(canvasInfo) {\n\t\treturn cloneDeep(canvasInfo);\n\t}\n\n\tisEditingText() {\n\t\treturn this.renderer ? this.renderer.isEditingText() : false;\n\t}\n\n\tisDragging() {\n\t\treturn this.renderer ? this.renderer.isDragging() : false;\n\t}\n\n\tconvertPageCoordsToSnappedCanvasCoords(pos) {\n\t\treturn this.renderer.convertPageCoordsToSnappedCanvasCoords(pos);\n\t}\n\n\tnodeTemplateDragStart(nodeTemplate) {\n\t\tthis.renderer.nodeTemplateDragStart(nodeTemplate);\n\t}\n\n\tnodeTemplateDragOver(nodeTemplate, x, y) {\n\t\tthis.renderer.nodeTemplateDragOver(nodeTemplate, x, y);\n\t}\n\n\tnodeTemplateDragEnd(nodeTemplate) {\n\t\tthis.renderer.nodeTemplateDragEnd(nodeTemplate);\n\t}\n\n\tnodeTemplateDropped(nodeTemplate, x, y) {\n\t\tthis.renderer.nodeTemplateDropped(nodeTemplate, x, y);\n\t}\n\n\texternalObjectDropped(dropData, x, y) {\n\t\tthis.renderer.externalObjectDropped(dropData, x, y);\n\t}\n\n\tzoomTo(zoomObject, animateTime) {\n\t\tthis.renderer.zoomTo(zoomObject, animateTime);\n\t}\n\n\ttranslateBy(x, y, animateTime) {\n\t\tthis.renderer.translateBy(x, y, animateTime);\n\t}\n\n\tzoomIn() {\n\t\tthis.renderer.zoomIn();\n\t}\n\n\tzoomOut() {\n\t\tthis.renderer.zoomOut();\n\t}\n\n\tzoomToFit(animateTime) {\n\t\tthis.renderer.zoomToFit(animateTime);\n\t}\n\n\tisZoomedToMax() {\n\t\treturn this.renderer ? this.renderer.isZoomedToMax() : false;\n\t}\n\n\tisZoomedToMin() {\n\t\treturn this.renderer ? this.renderer.isZoomedToMin() : false;\n\t}\n\n\tgetZoomToReveal(objectIds, xPos, yPos) {\n\t\treturn this.renderer ? this.renderer.getZoomToReveal(objectIds, xPos, yPos) : null;\n\t}\n\n\tgetZoom() {\n\t\treturn this.renderer ? this.renderer.getZoom() : null;\n\t}\n\n\tsetCommentEditingMode(commentId, pipelineId) {\n\t\tthis.renderer.setCommentEditingMode(commentId, pipelineId);\n\t}\n\n\tsetNodeLabelEditingMode(nodeId, pipelineId) {\n\t\tthis.renderer.setNodeLabelEditingMode(nodeId, pipelineId);\n\t}\n\n\tsetNodeDecorationLabelEditingMode(decId, nodeId, pipelineId) {\n\t\tthis.renderer.setNodeDecorationLabelEditingMode(decId, nodeId, pipelineId);\n\t}\n\n\tsetLinkDecorationLabelEditingMode(decId, linkId, pipelineId) {\n\t\tthis.renderer.setLinkDecorationLabelEditingMode(decId, linkId, pipelineId);\n\t}\n\n\trefreshOnSizeChange() {\n\t\tif (this.renderer) {\n\t\t\tthis.renderer.refreshOnSizeChange();\n\t\t}\n\t}\n\n\tgetDefaultCommentOffset() {\n\t\treturn this.renderer.getDefaultCommentOffset();\n\t}\n\n\tgetTransformedViewportDimensions() {\n\t\treturn this.renderer.getTransformedViewportDimensions();\n\t}\n\n\tgetCanvasDimensionsWithPadding() {\n\t\treturn this.renderer.getCanvasDimensionsWithPadding();\n\t}\n\n\tgetGhostNode(nodeTemplate) {\n\t\treturn this.renderer.getGhostNode(nodeTemplate);\n\t}\n\n\tsetSpaceKeyPressed(state) {\n\t\tthis.renderer.setSpaceKeyPressed(state);\n\t}\n\n\tisSpaceKeyPressed() {\n\t\treturn this.renderer.isSpaceKeyPressed();\n\t}\n\n\tfocusNextTabGroup(evt) {\n\t\treturn this.renderer.focusNextTabGroup(evt);\n\t}\n\n\tfocusPreviousTabGroup(evt) {\n\t\treturn this.renderer.focusPreviousTabGroup(evt);\n\t}\n\n\tgetActiveCanvasObject() {\n\t\treturn this.renderer.getActiveCanvasObject();\n\t}\n\n\tmoveFocusTo(focusObj, evt) {\n\t\t// The D3 rendering object may not exist for some sophisticated\n\t\t// refresh scenarios, so check its existence first.\n\t\tif (this.renderer) {\n\t\t\tthis.renderer.moveFocusTo(focusObj, evt);\n\t\t}\n\t}\n\n\tfocusOnTextEntryElement(evt) {\n\t\tthis.renderer.focusOnTextEntryElement(evt);\n\t}\n\n\tclearSubObject() {\n\t\tthis.renderer?.clearSubObject();\n\t}\n\n\tsetFocusNextSubObject(parentObj, evt) {\n\t\tthis.renderer.setFocusNextSubObject(parentObj, evt);\n\t}\n\n\tsetFocusPreviousSubObject(parentObj, evt) {\n\t\tthis.renderer.setFocusPreviousSubObject(parentObj, evt);\n\t}\n\n\topenCanvasContextOptions(evt) {\n\t\tthis.renderer.openCanvasContextOptions(evt);\n\t}\n}\n","/*\n * Copyright 2017-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint no-shadow: [\"error\", { \"allow\": [\"Node\", \"Comment\"] }] */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport { injectIntl } from \"react-intl\";\nimport defaultMessages from \"../../locales/common-canvas/locales/en.json\";\nimport CommonCanvasContextMenu from \"./cc-context-menu.jsx\";\nimport CommonCanvasContextToolbar from \"./cc-context-toolbar.jsx\";\nimport CommonCanvasTextToolbar from \"./cc-text-toolbar.jsx\";\nimport CommonCanvasStateTag from \"./cc-state-tag.jsx\";\nimport CanvasUtils from \"./common-canvas-utils.js\";\nimport KeyboardUtils from \"./keyboard-utils.js\";\nimport { Button } from \"@carbon/react\";\nimport { FlowData, ArrowLeft } from \"@carbon/react/icons\";\nimport { CANVAS_FOCUS, DND_DATA_TEXT, STATE_TAG_LOCKED, STATE_TAG_READ_ONLY } from \"./constants/canvas-constants\";\nimport Logger from \"../logging/canvas-logger.js\";\nimport SVGCanvasD3 from \"./svg-canvas-d3.js\";\n\nclass CanvasContents extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t\tisDropZoneDisplayed: false\n\t\t};\n\n\t\tthis.logger = new Logger(\"CC-Contents\");\n\n\t\tthis.mainCanvasDivId = \"canvas-div-\" + this.props.canvasController.getInstanceId();\n\t\tthis.svgCanvasDivId = \"d3-svg-canvas-div-\" + this.props.canvasController.getInstanceId();\n\t\tthis.svgCanvasDivSelector = \"#\" + this.svgCanvasDivId;\n\n\t\t// Used to track the drag position of a node from the palette. The dragOver\n\t\t// event is continually fired, even when the mouse pointer is not moving,\n\t\t// so this lets us eliminate unnecessary events being passed to the renderer.\n\t\tthis.dragX = null;\n\t\tthis.dragY = null;\n\n\t\t// Reference for the contents <div>\n\t\tthis.contentsRef = React.createRef();\n\n\t\t// Record whether we added the event listeners or not.\n\t\tthis.eventListenersAdded = false;\n\n\t\t// Keeps track of mouse position to enable us to paste at mouse position\n\t\t// using keyboard.\n\t\tthis.mousePos = null;\n\n\t\t// Keeps track of whether the user is in the process of tabbing out from\n\t\t// the <div> using the keyboard.\n\t\tthis.tabbingOut = false;\n\n\t\tthis.drop = this.drop.bind(this);\n\t\tthis.focusOnCanvas = this.focusOnCanvas.bind(this);\n\t\tthis.setIsDropZoneDisplayed = this.setIsDropZoneDisplayed.bind(this);\n\t\tthis.dragOver = this.dragOver.bind(this);\n\t\tthis.dragEnter = this.dragEnter.bind(this);\n\t\tthis.dragLeave = this.dragLeave.bind(this);\n\t\tthis.refreshOnSizeChange = this.refreshOnSizeChange.bind(this);\n\t\tthis.getLabel = this.getLabel.bind(this);\n\n\t\tthis.onCut = this.onCut.bind(this);\n\t\tthis.onCopy = this.onCopy.bind(this);\n\t\tthis.onPaste = this.onPaste.bind(this);\n\t\tthis.onKeyDown = this.onKeyDown.bind(this);\n\t\tthis.onKeyUp = this.onKeyUp.bind(this);\n\t\tthis.onMouseMove = this.onMouseMove.bind(this);\n\t\tthis.onClickReturnToPrevious = this.onClickReturnToPrevious.bind(this);\n\t\tthis.onMouseLeave = this.onMouseLeave.bind(this);\n\t\tthis.onMouseDown = this.onMouseDown.bind(this);\n\t\tthis.onFocus = this.onFocus.bind(this);\n\n\t\t// Variables to handle strange HTML drag and drop behaviors. That is, pairs\n\t\t// of dragEnter/dragLeave events are fired as an external object is\n\t\t// dragged around over the top of the 'drop zone' canvas.\n\t\tthis.first = false;\n\t\tthis.second = false;\n\n\t\t// The host application may set one or more callback functions to execute their own\n\t\t// code after an update has been performed caused by a redux update.\n\t\tthis.afterUpdateCallbacks = [];\n\n\t\t// Register ourself with the canvas controller so it can call this class\n\t\t// when necessary, and also call the SVGCanvasD3 object.\n\t\tprops.canvasController.setCanvasContents(this);\n\t}\n\n\tcomponentDidMount() {\n\t\tthis.logger.log(\"componentDidMount\");\n\t\t// componentDidMount may be called twice in StrictMode so only\n\t\t// create the svgCanvasD3 when necessary.\n\t\tif (!this.svgCanvasD3) {\n\t\t\tthis.svgCanvasD3 =\n\t\t\t\tnew SVGCanvasD3(this.props.canvasInfo.id,\n\t\t\t\t\tthis.svgCanvasDivSelector,\n\t\t\t\t\tthis.props.canvasController);\n\t\t}\n\t\tthis.setCanvasInfo();\n\n\t\tif (this.props.canvasConfig.enableBrowserEditMenu) {\n\t\t\tthis.addEventListeners();\n\t\t}\n\n\t\tif (this.props.canvasConfig.enableFocusOnMount) {\n\t\t\tthis.props.canvasController.setFocusOnCanvas();\n\t\t}\n\n\t\tthis.resizeObserver = new ResizeObserver((entries) => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tthis.refreshOnSizeChange(entry.contentRect);\n\t\t\t}\n\t\t});\n\t\tif (this.contentsRef.current) {\n\t\t\tthis.resizeObserver.observe(this.contentsRef.current);\n\t\t}\n\t}\n\n\tcomponentDidUpdate(prevProps) {\n\t\tthis.logger.log(\"componentDidUpdate\");\n\n\t\tif (this.svgCanvasD3 && !this.isDropZoneDisplayed()) {\n\t\t\tif (prevProps.canvasInfo !== this.props.canvasInfo ||\n\t\t\t\t\tprevProps.canvasConfig !== this.props.canvasConfig ||\n\t\t\t\t\tprevProps.breadcrumbs !== this.props.breadcrumbs) {\n\t\t\t\tthis.setCanvasInfo();\n\t\t\t\t// Run the afterUpdateCallbacks.\n\t\t\t\tthis.afterUpdate();\n\n\t\t\t// If the only change is selectionInfo, we can call the special method\n\t\t\t// setSelectionInfo, which will only update the selection highlighting.\n\t\t\t} else if (prevProps.selectionInfo !== this.props.selectionInfo) {\n\t\t\t\tthis.svgCanvasD3.setSelectionInfo(this.props.selectionInfo);\n\t\t\t\t// Run the afterUpdateCallbacks.\n\t\t\t\tthis.afterUpdate();\n\t\t\t}\n\t\t}\n\n\t\t// Manage the event browsers in case this config property changes.\n\t\tif (this.props.canvasConfig.enableBrowserEditMenu) {\n\t\t\tthis.addEventListeners();\n\t\t} else {\n\t\t\tthis.removeEventListeners();\n\t\t}\n\t}\n\n\tcomponentWillUnmount() {\n\t\tthis.removeEventListeners();\n\t\tthis.resizeObserver?.disconnect();\n\t}\n\n\tonCut(evt) {\n\t\tif (this.isFocusOnCanvasOrContents(evt) &&\n\t\t\t\tthis.props.canvasConfig.enableEditingActions &&\n\t\t\t\t!this.svgCanvasD3.isEditingText()) {\n\t\t\tevt.preventDefault();\n\t\t\tthis.props.canvasController.cutToClipboard();\n\t\t}\n\t}\n\n\tonCopy(evt) {\n\t\tif (this.isFocusOnCanvasOrContents(evt) &&\n\t\t\t\tthis.props.canvasConfig.enableEditingActions &&\n\t\t\t\t!this.svgCanvasD3.isEditingText()) {\n\t\t\tevt.preventDefault();\n\t\t\tthis.props.canvasController.copyToClipboard();\n\t\t}\n\t}\n\n\tonPaste(evt) {\n\t\tif (this.isFocusOnCanvasOrContents(evt) &&\n\t\t\t\tthis.props.canvasConfig.enableEditingActions &&\n\t\t\t\t!this.svgCanvasD3.isEditingText()) {\n\t\t\tevt.preventDefault();\n\t\t\tthis.props.canvasController.pasteFromClipboard();\n\t\t}\n\t}\n\n\tonKeyDown(evt) {\n\t\t// Make sure no tip is displayed, because having one displayed\n\t\t// will interfere with drawing of the canvas as the result of any\n\t\t// keyboard action.\n\t\tthis.props.canvasController.closeTip();\n\t\tconst actions = this.props.canvasController.getKeyboardConfig().actions;\n\n\t\t// We don't handle key presses when:\n\t\t// 1. We are editing text, because the text area needs to receive key\n\t\t// presses for undo, redo, delete etc.\n\t\t// 2. Dragging objects\n\t\tif (this.svgCanvasD3.isEditingText() || this.svgCanvasD3.isDragging()) {\n\t\t\treturn;\n\t\t}\n\n\t\t// These actions alter the canvas objects so we need to check\n\t\t// this.config.enableEditingActions before calling them.\n\t\tif (this.props.canvasConfig.enableEditingActions) {\n\t\t\tif (KeyboardUtils.delete(evt) && actions.delete) {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt); // Some browsers interpret Delete as 'Back to previous page'. So prevent that.\n\t\t\t\tthis.props.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\tthis.props.canvasController.keyboardActionHandler(\"deleteSelectedObjects\"));\n\n\t\t\t} else if (KeyboardUtils.undo(evt) && actions.undo) {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\t\tif (this.props.canvasController.canUndo()) {\n\t\t\t\t\tthis.props.canvasController.keyboardActionHandler(\"undo\");\n\t\t\t\t}\n\n\t\t\t} else if (KeyboardUtils.redo(evt) && actions.redo) {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\t\tif (this.props.canvasController.canRedo()) {\n\t\t\t\t\tthis.props.canvasController.keyboardActionHandler(\"redo\");\n\t\t\t\t}\n\n\t\t\t} else if (KeyboardUtils.copyToClipboard(evt) && actions.copyToClipboard) {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\t\tthis.props.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\tthis.props.canvasController.keyboardActionHandler(\"copy\"));\n\n\t\t\t} else if (KeyboardUtils.cutToClipboard(evt) && actions.cutToClipboard) {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\t\tthis.props.canvasController.autoSelectFocusObj(() =>\n\t\t\t\t\tthis.props.canvasController.keyboardActionHandler(\"cut\"));\n\n\t\t\t} else if (KeyboardUtils.pasteFromClipboard(evt) && actions.pasteFromClipboard) {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\t\tif (this.mousePos) {\n\t\t\t\t\tconst mousePos = this.svgCanvasD3.convertPageCoordsToSnappedCanvasCoords(this.mousePos);\n\t\t\t\t\tthis.props.canvasController.keyboardActionHandler(\"paste\", mousePos);\n\t\t\t\t} else {\n\t\t\t\t\tthis.props.canvasController.keyboardActionHandler(\"paste\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// These keyboard actions do not alter the canvas objects so we\n\t\t// do not need to check this.config.enableEditingActions before calling them.\n\t\tif (KeyboardUtils.selectAll(evt) && actions.selectAll) {\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\tthis.props.canvasController.keyboardActionHandler(\"selectAll\");\n\n\t\t} else if (KeyboardUtils.deselectAll(evt) && actions.deselectAll) {\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\tthis.props.canvasController.keyboardActionHandler(\"deselectAll\");\n\n\t\t} else if (KeyboardUtils.spaceKey(evt)) {\n\t\t\tif (!this.svgCanvasD3.isSpaceKeyPressed()) {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\t\tthis.svgCanvasD3.setSpaceKeyPressed(true);\n\t\t\t}\n\n\t\t} else if (KeyboardUtils.toggleLogging(evt)) {\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\tLogger.switchLoggingState(); // Switch the logging on and off\n\n\t\t} else if (KeyboardUtils.zoomToFit(evt) && this.props.canvasConfig.enableKeyboardNavigation) {\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\tthis.svgCanvasD3.zoomToFit();\n\n\t\t} else if (KeyboardUtils.zoomIn(evt) && this.props.canvasConfig.enableKeyboardNavigation) {\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\tthis.svgCanvasD3.zoomIn();\n\n\t\t} else if (KeyboardUtils.zoomOut(evt) && this.props.canvasConfig.enableKeyboardNavigation) {\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\tthis.svgCanvasD3.zoomOut();\n\n\t\t} else if (KeyboardUtils.panLeft(evt) && this.props.canvasConfig.enableKeyboardNavigation) {\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\tthis.svgCanvasD3.translateBy(-10, 0);\n\n\t\t} else if (KeyboardUtils.panRight(evt) && this.props.canvasConfig.enableKeyboardNavigation) {\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\tthis.svgCanvasD3.translateBy(10, 0);\n\n\t\t} else if (KeyboardUtils.panUp(evt) && this.props.canvasConfig.enableKeyboardNavigation) {\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\tthis.svgCanvasD3.translateBy(0, -10);\n\n\t\t} else if (KeyboardUtils.panDown(evt) && this.props.canvasConfig.enableKeyboardNavigation) {\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\tthis.svgCanvasD3.translateBy(0, 10);\n\n\t\t} else if (KeyboardUtils.nextGroup(evt) && this.props.canvasConfig.enableKeyboardNavigation) {\n\t\t\tthis.moveFocusToNextGroup(evt);\n\n\t\t} else if (KeyboardUtils.previousGroup(evt) && this.props.canvasConfig.enableKeyboardNavigation) {\n\t\t\tthis.moveFocusToPreviousGroup(evt);\n\n\t\t} else if (KeyboardUtils.displayContextOptions(evt) && this.props.canvasConfig.enableKeyboardNavigation) {\n\t\t\tthis.svgCanvasD3.openCanvasContextOptions(evt);\n\t\t}\n\t\tevt.stopPropagation();\n\t}\n\n\tonKeyUp() {\n\t\tthis.svgCanvasD3.setSpaceKeyPressed(false);\n\t}\n\n\t// When focus returns to the flow editor (for example, after another desktop window\n\t// has been surfaced) the internally stored focusObject may be null even though a\n\t// document.activeElement is still set on the flow editor. So we set the focus\n\t// object to be in sync with document.activeElement.\n\tonFocus(evt) {\n\t\tif (evt.target.classList.contains(\"d3-svg-canvas-div\") &&\n\t\t\t\tthis.props.canvasController.getFocusObject() !== CANVAS_FOCUS) {\n\t\t\tthis.props.canvasController.setFocusObject(CANVAS_FOCUS);\n\n\t\t} else if (!this.props.canvasController.getFocusObject()) {\n\t\t\tconst activeObject = this.svgCanvasD3.getActiveCanvasObject();\n\n\t\t\tif (activeObject) {\n\t\t\t\tthis.props.canvasController.setFocusObject(activeObject);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Records in mousePos the mouse pointer position when the pointer is inside\n\t// the boundaries of the canvas or sets the mousePos to null. This position\n\t// info can be used with keyboard operations.\n\tonMouseMove(e) {\n\t\tif (e?.target?.closest(\".svg-area\")) {\n\t\t\tthis.mousePos = {\n\t\t\t\tx: e.clientX,\n\t\t\t\ty: e.clientY\n\t\t\t};\n\t\t} else {\n\t\t\tthis.mousePos = null;\n\t\t}\n\t}\n\n\tonMouseLeave(e) {\n\t\tthis.mousePos = null;\n\t}\n\n\tonMouseDown(e) {\n\t\tthis.props.canvasController.setFocusOnCanvas();\n\t}\n\n\t// Handles the click on the \"Return to previous flow\" button.\n\tonClickReturnToPrevious(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\t\tthis.props.canvasController.displayPreviousPipeline();\n\t}\n\n\tsetCanvasInfo() {\n\t\t// TODO - Eventually move nodeLayout and canvasLayout into redux and then\n\t\t// pass them into this.svgCanvasD3() as props.\n\t\tconst nodeLayout = this.props.canvasController.objectModel.getNodeLayout();\n\t\tconst canvasLayout = this.props.canvasController.objectModel.getCanvasLayout();\n\t\tthis.svgCanvasD3.setCanvasInfo(\n\t\t\tthis.props.canvasInfo,\n\t\t\tthis.props.selectionInfo,\n\t\t\tthis.props.breadcrumbs,\n\t\t\tnodeLayout,\n\t\t\tcanvasLayout,\n\t\t\tthis.props.canvasConfig\n\t\t);\n\t}\n\n\tgetLabel(labelId) {\n\t\treturn this.props.intl.formatMessage({ id: labelId, defaultMessage: defaultMessages[labelId] });\n\t}\n\n\tgetDNDJson(event) {\n\t\ttry {\n\t\t\treturn JSON.parse(event.dataTransfer.getData(DND_DATA_TEXT));\n\t\t} catch (e) {\n\t\t\tthis.logger.warn(\"The dragged object's data does not conform to the expected internal format: \" + e);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tgetSVGCanvasD3() {\n\t\treturn this.svgCanvasD3;\n\t}\n\n\tgetStateTag() {\n\t\tlet stateTag = null;\n\n\t\tif (this.props.canvasConfig.enableStateTag === STATE_TAG_READ_ONLY ||\n\t\t\t\tthis.props.canvasConfig.enableStateTag === STATE_TAG_LOCKED) {\n\t\t\tstateTag = (\n\t\t\t\t<CommonCanvasStateTag\n\t\t\t\t\tstateTagType={this.props.canvasConfig.enableStateTag}\n\t\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\t\treturn stateTag;\n\t}\n\n\tgetEmptyCanvas() {\n\t\tlet emptyCanvas = null;\n\t\tif (this.props.canvasController.isPrimaryPipelineEmpty()) {\n\t\t\tif (this.props.canvasConfig.emptyCanvasContent) {\n\t\t\t\temptyCanvas = (\n\t\t\t\t\t<div className=\"empty-canvas\">\n\t\t\t\t\t\t{this.props.canvasConfig.emptyCanvasContent}\n\t\t\t\t\t</div>);\n\t\t\t} else {\n\t\t\t\temptyCanvas = (\n\t\t\t\t\t<div className=\"empty-canvas\">\n\t\t\t\t\t\t<div className=\"empty-canvas-image\"><FlowData /></div>\n\t\t\t\t\t\t<span className=\"empty-canvas-text1\">{this.getLabel(\"canvas.flowIsEmpty\")}</span>\n\t\t\t\t\t\t<span className=\"empty-canvas-text2\">{this.getLabel(\"canvas.addNodeToStart\")}</span>\n\t\t\t\t\t</div>);\n\t\t\t}\n\t\t}\n\t\treturn emptyCanvas;\n\t}\n\n\tgetReturnToPreviousBtn() {\n\t\tlet returnToPrevious = null;\n\t\tif (!this.props.canvasController.isPrimaryPipelineEmpty() &&\n\t\t\t\t(this.props.canvasController.isDisplayingFullPageSubFlow() ||\n\t\t\t\t\tthis.props.canvasConfig?.enableCanvasLayout?.alwaysDisplayBackToParentFlow)) {\n\t\t\tconst label = this.getLabel(\"canvas.returnToPrevious\");\n\t\t\treturnToPrevious = (\n\t\t\t\t<div className={\"return-to-previous\"}>\n\t\t\t\t\t<Button kind={\"tertiary\"}\n\t\t\t\t\t\tonClick={this.onClickReturnToPrevious}\n\t\t\t\t\t\taria-label={label}\n\t\t\t\t\t\tsize={\"md\"}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className={\"return-to-previous-content\"}>\n\t\t\t\t\t\t\t<ArrowLeft />\n\t\t\t\t\t\t\t<span>{label}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\treturn returnToPrevious;\n\t}\n\n\tgetContextMenu() {\n\t\tif (this.props.canvasConfig.enableContextToolbar) {\n\t\t\treturn (\n\t\t\t\t<CommonCanvasContextToolbar\n\t\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\t\tcontainingDivId={this.mainCanvasDivId}\n\t\t\t\t/>);\n\t\t}\n\t\treturn (\n\t\t\t<CommonCanvasContextMenu\n\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\tcontainingDivId={this.mainCanvasDivId}\n\t\t\t/>);\n\t}\n\n\tgetTextToolbar() {\n\t\treturn (\n\t\t\t<CommonCanvasTextToolbar\n\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\tcontainingDivId={this.mainCanvasDivId}\n\t\t\t/>);\n\t}\n\n\tgetDropZone() {\n\t\tlet dropZoneCanvas = null;\n\t\tif (this.isDropZoneDisplayed()) {\n\t\t\tif (this.props.canvasConfig.dropZoneCanvasContent) {\n\t\t\t\tdropZoneCanvas = this.props.canvasConfig.dropZoneCanvasContent;\n\t\t\t} else {\n\t\t\t\tdropZoneCanvas = (\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div className=\"dropzone-canvas\" />\n\t\t\t\t\t\t<div className=\"dropzone-canvas-rect\" />\n\t\t\t\t\t</div>);\n\t\t\t}\n\t\t}\n\t\treturn dropZoneCanvas;\n\t}\n\n\tgetSvgCanvasDivId() {\n\t\treturn this.svgCanvasDivId;\n\t}\n\n\tgetSVGCanvasDiv() {\n\t\tif (this.props.canvasConfig.enableKeyboardNavigation) {\n\t\t\t// Set tabindex to 0 so the focus can go to the <div>\n\t\t\treturn (\n\t\t\t\t<div role=\"application\"\n\t\t\t\t\tid={this.svgCanvasDivId}\n\t\t\t\t\ttabIndex=\"0\"\n\t\t\t\t\tclassName=\"d3-svg-canvas-div keyboard-navigation\"\n\t\t\t\t\tonMouseDown={this.onMouseDown}\n\t\t\t\t\tonMouseLeave={this.onMouseLeave}\n\t\t\t\t\tonFocus={this.onFocus}\n\t\t\t\t\tonKeyDown={this.onKeyDown} onKeyUp={this.onKeyUp}\n\t\t\t\t\taria-label={this.getLabel(\"canvas.label\")}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\t// Set tabindex to -1 so the focus (see componentDidMount above) can go to\n\t\t// the div (which allows keyboard events to go there) and using -1 means\n\t\t// the user cannot tab to the div. Keyboard events are handled in svg-canvas-d3.js.\n\t\t// https://stackoverflow.com/questions/32911355/whats-the-tabindex-1-in-bootstrap-for\n\t\treturn (\n\t\t\t<div tabIndex=\"-1\" className=\"d3-svg-canvas-div\" id={this.svgCanvasDivId}\n\t\t\t\tonKeyDown={this.onKeyDown} onKeyUp={this.onKeyUp}\n\t\t\t/>\n\t\t);\n\t}\n\n\tsetIsDropZoneDisplayed(isDropZoneDisplayed) {\n\t\tif (isDropZoneDisplayed !== this.state.isDropZoneDisplayed) {\n\t\t\tthis.setState({ isDropZoneDisplayed: isDropZoneDisplayed });\n\t\t}\n\t}\n\n\t// Returns true if the target element passed in is either the canvas div\n\t// or is inside the canvas div.\n\t// Utility function called from canvas-controller.js.\n\tisTargetInsideCanvas(target) {\n\t\treturn target && target.closest(\".common-canvas-drop-div\");\n\t}\n\n\tisDropZoneDisplayed() {\n\t\treturn this.props.canvasConfig.enableDropZoneOnExternalDrag && this.state.isDropZoneDisplayed;\n\t}\n\n\tisDataTypeBeingDraggedFile(event) {\n\t\tif (event.dataTransfer && Array.isArray(event.dataTransfer.types)) {\n\t\t\treturn event.dataTransfer.types.includes(\"Files\");\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Returns true if the focus is either on an element in the canvas or on the\n\t// canvas <div> itself.\n\tisFocusOnCanvasOrContents(evt) {\n\t\tif (evt.currentTarget?.activeElement) {\n\t\t\treturn evt.currentTarget.activeElement.closest(this.svgCanvasDivSelector) ||\n\t\t\t\tevt.currentTarget.activeElement.id === this.svgCanvasDivId;\n\t\t}\n\t\treturn false;\n\t}\n\n\tisFocusOnCanvas() {\n\t\treturn document.activeElement?.id === this.getSvgCanvasDivId();\n\t}\n\tafterUpdate() {\n\t\tthis.afterUpdateCallbacks.forEach((callback) => callback());\n\t}\n\n\taddAfterUpdateCallback(callback) {\n\t\tconst pos = this.afterUpdateCallbacks.findIndex((cb) => cb === callback);\n\t\tif (pos === -1) {\n\t\t\tthis.afterUpdateCallbacks.push(callback);\n\t\t}\n\t}\n\n\tremoveAfterUpdateCallback(callback) {\n\t\tconst pos = this.afterUpdateCallbacks.findIndex((cb) => cb === callback);\n\t\tif (pos > -1) {\n\t\t\tthis.afterUpdateCallbacks.splice(pos, 1);\n\t\t}\n\t}\n\n\taddEventListeners() {\n\t\tif (!this.eventListenersAdded) {\n\t\t\tdocument.addEventListener(\"cut\", this.onCut, true);\n\t\t\tdocument.addEventListener(\"copy\", this.onCopy, true);\n\t\t\tdocument.addEventListener(\"paste\", this.onPaste, true);\n\t\t\tdocument.addEventListener(\"mousemove\", this.onMouseMove, true);\n\t\t\tthis.eventListenersAdded = true;\n\t\t}\n\t}\n\n\tremoveEventListeners() {\n\t\tif (this.eventListenersAdded) {\n\t\t\tdocument.removeEventListener(\"cut\", this.onCut, true);\n\t\t\tdocument.removeEventListener(\"copy\", this.onCopy, true);\n\t\t\tdocument.removeEventListener(\"paste\", this.onPaste, true);\n\t\t\tdocument.removeEventListener(\"mousemove\", this.onMouseMove, true);\n\t\t\tthis.eventListenersAdded = false;\n\t\t}\n\t}\n\n\tdrop(event) {\n\t\tevent.preventDefault();\n\t\tthis.setIsDropZoneDisplayed(false);\n\n\t\tthis.first = false;\n\t\tthis.second = false;\n\n\t\tif (!this.props.canvasConfig.enableEditingActions) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst nodeTemplate = this.props.canvasController.getDragNodeTemplate();\n\t\tif (nodeTemplate) {\n\t\t\tthis.svgCanvasD3.nodeTemplateDropped(nodeTemplate, event.clientX, event.clientY);\n\t\t\tthis.props.canvasController.nodeTemplateDragEnd();\n\n\t\t} else {\n\t\t\tlet dropData = this.getDNDJson(event);\n\t\t\t// If no drop data is found (which complies with the calling protocol\n\t\t\t// described in the wiki) we just pass through the dataTransfer data and\n\t\t\t// set an appropriate operation.\n\t\t\tif (!dropData) {\n\t\t\t\tdropData = {\n\t\t\t\t\toperation: \"addToCanvas\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tdataTransfer: event.dataTransfer,\n\t\t\t\t\t\teditType: \"createFromExternalObject\"\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t\tthis.svgCanvasD3.externalObjectDropped(dropData, event.clientX, event.clientY);\n\t\t}\n\t}\n\n\tdragOver(event) {\n\t\t// Drag over is continually fired so only pass on the event when the mouse\n\t\t// cursor moves a reasonable distance.\n\t\tif (Math.abs(this.dragX - event.clientX) > 5 || Math.abs(this.dragY - event.clientY) > 5) {\n\t\t\tthis.dragX = event.clientX;\n\t\t\tthis.dragY = event.clientY;\n\t\t\tconst nodeTemplate = this.props.canvasController.getDragNodeTemplate();\n\t\t\tif (nodeTemplate) {\n\t\t\t\tthis.svgCanvasD3.nodeTemplateDragOver(nodeTemplate, event.clientX, event.clientY);\n\t\t\t}\n\t\t}\n\t}\n\n\tdragEnter(event) {\n\t\tthis.dragX = null;\n\t\tthis.dragY = null;\n\t\tif (this.isDataTypeBeingDraggedFile(event)) {\n\t\t\tif (this.first) {\n\t\t\t\tthis.second = true;\n\t\t\t} else {\n\t\t\t\tthis.first = true;\n\t\t\t\tthis.setIsDropZoneDisplayed(true);\n\t\t\t}\n\t\t}\n\t\tevent.preventDefault();\n\t}\n\n\tdragLeave(event) {\n\t\tif (this.isDataTypeBeingDraggedFile(event)) {\n\t\t\tif (this.second) {\n\t\t\t\tthis.second = false;\n\t\t\t} else if (this.first) {\n\t\t\t\tthis.first = false;\n\t\t\t}\n\n\t\t\tif (!this.first && !this.second) {\n\t\t\t\tthis.setIsDropZoneDisplayed(false);\n\t\t\t}\n\t\t}\n\t\tevent.preventDefault();\n\t}\n\n\t// Handles tab key presses on our div.\n\tmoveFocusToNextGroup(evt) {\n\t\tconst success = this.svgCanvasD3.focusNextTabGroup(evt);\n\t\tif (success) {\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t} else {\n\t\t\tthis.tabbingOut = true;\n\t\t\tthis.props.canvasController.setFocusOnCanvas();\n\t\t}\n\t}\n\n\t// Handles tab+shift key presses on our div.\n\tmoveFocusToPreviousGroup(evt) {\n\t\tconst success = this.svgCanvasD3.focusPreviousTabGroup(evt);\n\t\tif (success) {\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t} else {\n\t\t\tthis.tabbingOut = true;\n\t\t\tthis.props.canvasController.setFocusOnCanvas();\n\t\t}\n\t}\n\n\t// Sets the focus on our canvas <div> so keyboard events will go to it.\n\tfocusOnCanvas() {\n\t\tif (document.getElementById(this.svgCanvasDivId)) {\n\t\t\tdocument.getElementById(this.svgCanvasDivId).focus();\n\t\t\tthis.svgCanvasD3.clearSubObject();\n\t\t}\n\t}\n\n\t// Re-renders the diagram canvas when the canvas size changes. This refresh\n\t// is needed because the output binding ports of sub-flows displayed full-page\n\t// need to be rerendered as the canvas size changes. The canvas size might\n\t// change when the right side panel is opened or the browser is resized.\n\trefreshOnSizeChange() {\n\t\tif (this.svgCanvasD3) {\n\t\t\tthis.svgCanvasD3.refreshOnSizeChange();\n\t\t}\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\tconst stateTag = this.getStateTag();\n\t\tconst emptyCanvas = this.getEmptyCanvas();\n\t\tconst returnToPreviousBtn = this.getReturnToPreviousBtn();\n\t\tconst contextMenu = this.getContextMenu();\n\t\tconst textToolbar = this.getTextToolbar();\n\t\tconst dropZoneCanvas = this.getDropZone();\n\t\tconst svgCanvasDiv = this.getSVGCanvasDiv();\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tid={this.mainCanvasDivId}\n\t\t\t\tref={this.contentsRef}\n\t\t\t\tclassName=\"common-canvas-drop-div\"\n\t\t\t\tonDrop={this.drop}\n\t\t\t\tonDragOver={this.dragOver}\n\t\t\t\tonDragEnter={this.dragEnter}\n\t\t\t\tonDragLeave={this.dragLeave}\n\t\t\t>\n\t\t\t\t{svgCanvasDiv}\n\t\t\t\t{emptyCanvas}\n\t\t\t\t{returnToPreviousBtn}\n\t\t\t\t{stateTag}\n\t\t\t\t{contextMenu}\n\t\t\t\t{textToolbar}\n\t\t\t\t{dropZoneCanvas}\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nCanvasContents.propTypes = {\n\t// Provided by CommonCanvas\n\tintl: PropTypes.object.isRequired,\n\tcanvasController: PropTypes.object.isRequired,\n\n\t// Provided by Redux\n\tcanvasConfig: PropTypes.object.isRequired,\n\tcanvasInfo: PropTypes.object,\n\tselectionInfo: PropTypes.object,\n\tbreadcrumbs: PropTypes.array\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\tcanvasInfo: state.canvasinfo,\n\tcanvasConfig: state.canvasconfig,\n\tselectionInfo: state.selectioninfo,\n\tbreadcrumbs: state.breadcrumbs\n});\n\nexport default connect(mapStateToProps)(injectIntl(CanvasContents));\n","/*\n * Copyright 2017-2026 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport { injectIntl } from \"react-intl\";\nimport Icon from \"./../icons/icon.jsx\";\nimport { Button } from \"@carbon/react\";\nimport { Close } from \"@carbon/react/icons\";\nimport Logger from \"../logging/canvas-logger.js\";\nimport KeyboardUtils from \"../common-canvas/keyboard-utils.js\";\nimport { DEFAULT_NOTIFICATION_HEADER } from \"./../common-canvas/constants/canvas-constants.js\";\nimport defaultMessages from \"../../locales/notification-panel/locales/en.json\";\n\nclass NotificationPanel extends React.Component {\n\tstatic getDerivedStateFromProps(nextProps, prevState) {\n\t\tif (nextProps.messages !== prevState.messages) {\n\t\t\treturn ({ messages: nextProps.messages });\n\t\t}\n\t\treturn ({});\n\t}\n\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.state = {};\n\n\t\tthis.logger = new Logger(\"NotificationPanel\");\n\t\tthis.keyDownOnPanel = this.keyDownOnPanel.bind(this);\n\t}\n\n\tcomponentDidMount() {\n\t\tthis.setFocusOnFirstItem();\n\t}\n\n\tsetFocusOnFirstItem() {\n\t\tif (this.allRefs.length > 0) {\n\t\t\tthis.allRefs[0].focus();\n\t\t}\n\t}\n\n\tgetNotifications() {\n\t\tconst notifications = [];\n\t\tif (!this.props.messages) {\n\t\t\treturn notifications;\n\t\t}\n\t\tfor (let index = 0; index < this.props.messages.length; index++) {\n\t\t\tconst message = this.props.messages[index];\n\t\t\tconst className = message.callback ? \" clickable \" : \"\";\n\t\t\tconst iconType = message.type;\n\t\t\tconst type = (<div className=\"notification-message-type\">\n\t\t\t\t<Icon type={iconType} className={`notification-message-icon-${iconType}`} />\n\t\t\t</div>);\n\n\t\t\tconst title = message.title\n\t\t\t\t? (<div className=\"notification-message-title\">\n\t\t\t\t\t{message.title}\n\t\t\t\t</div>)\n\t\t\t\t: null;\n\n\t\t\tconst subtitle = message.subtitle\n\t\t\t\t? (<div className = \"notification-message-subtitle\">\n\t\t\t\t\t{message.subtitle}\n\t\t\t\t</div>)\n\t\t\t\t: null;\n\n\t\t\tconst closeMessage = message.closeMessage\n\t\t\t\t? (\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={(ref) => (!ref || this.allRefs.push(ref))}\n\t\t\t\t\t\tclassName=\"notification-message-close\"\n\t\t\t\t\t\tonClick={this.clickOnCloseButton.bind(this, message)}\n\t\t\t\t\t\tonKeyDown={this.keyDownOnCloseButton.bind(this, message)}\n\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t>\n\t\t\t\t\t\t{message.closeMessage}\n\t\t\t\t\t</div>)\n\t\t\t\t: null;\n\n\t\t\tconst timestamp = message.timestamp\n\t\t\t\t? (<div className=\"notification-message-timestamp\">\n\t\t\t\t\t<div className=\"notification-message-timestamp-icon\">\n\t\t\t\t\t\t<Icon type=\"time\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"notification-message-string\">\n\t\t\t\t\t\t{message.timestamp}\n\t\t\t\t\t</div>\n\t\t\t\t</div>)\n\t\t\t\t: null;\n\n\t\t\tconst notificationMessage = (\n\t\t\t\t<>\n\t\t\t\t\t{type}\n\t\t\t\t\t<div className=\"notification-message-details\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t\t{subtitle}\n\t\t\t\t\t\t<div className=\"notification-message-content\">\n\t\t\t\t\t\t\t{message.content}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{timestamp}\n\t\t\t\t\t\t{closeMessage}\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t);\n\n\t\t\tconst notificationElement = message.callback\n\t\t\t\t? (\n\t\t\t\t\t<button\n\t\t\t\t\t\tclassName={\"notifications notifications-button \" + className + message.type}\n\t\t\t\t\t\tonClick={this.notificationCallback.bind(this, message.id, message.callback)}\n\t\t\t\t\t\tref={(ref) => (!ref || this.allRefs.push(ref))}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{notificationMessage}\n\t\t\t\t\t</button>\n\t\t\t\t)\n\t\t\t\t: (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={\"notifications \" + className + message.type}\n\t\t\t\t\t\tref={(ref) => (!ref || this.allRefs.push(ref))}\n\t\t\t\t\t>\n\t\t\t\t\t\t{notificationMessage}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\n\t\t\tnotifications.push(\n\t\t\t\t<div className=\"notifications-button-container\" role=\"listitem\" key={index + \"-\" + message.id}>\n\t\t\t\t\t{notificationElement}\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn notifications;\n\t}\n\n\tgetAriaHeaderLabel(headerText, subtitleText, emptyMessageText, hasMessages) {\n\t\tlet ariaLabel = \"\";\n\t\tif (typeof headerText === \"string\") {\n\t\t\tariaLabel = headerText;\n\t\t\tif (typeof subtitleText === \"string\" && subtitleText) {\n\t\t\t\tariaLabel += \" \" + subtitleText;\n\t\t\t}\n\t\t\t// Add empty message if there are no notifications\n\t\t\tif (!hasMessages && typeof emptyMessageText === \"string\" && emptyMessageText) {\n\t\t\t\tariaLabel += \" \" + emptyMessageText;\n\t\t\t}\n\t\t}\n\t\treturn ariaLabel;\n\t}\n\n\tnotificationCallback(id, messageCallback, evt) {\n\t\tif (messageCallback) {\n\t\t\tmessageCallback(id);\n\t\t}\n\t}\n\n\tclickOnCloseButton(message) {\n\t\tthis.deleteNotification(message.id);\n\t}\n\n\tkeyDownOnCloseButton(message, evt) {\n\t\tif (KeyboardUtils.activateButton(evt)) {\n\t\t\tthis.deleteNotification(message.id);\n\t\t}\n\t}\n\n\tdeleteNotification(id) {\n\t\tthis.props.subPanelData.canvasController.deleteNotificationMessages(id);\n\t}\n\n\tclearNotificationMessages() {\n\t\tthis.props.subPanelData.canvasController.clearNotificationMessages();\n\t\tthis.setFocusOnFirstItem();\n\n\t\tif (typeof this.props.notificationConfig.clearAllCallback === \"function\") {\n\t\t\tthis.props.notificationConfig.clearAllCallback();\n\t\t}\n\t}\n\n\tkeyDownOnPanel(evt) {\n\t\tif (KeyboardUtils.nextSection(evt)) {\n\t\t\tconst lastElement = this.allRefs[this.allRefs.length - 1];\n\t\t\tif (evt.target === lastElement) {\n\t\t\t\tevt.stopPropagation();\n\t\t\t\tevt.preventDefault();\n\t\t\t\tthis.allRefs[0].focus();\n\t\t\t}\n\t\t} else if (KeyboardUtils.previousSection(evt)) {\n\t\t\tconst lastElement = this.allRefs[this.allRefs.length - 1];\n\t\t\tif (evt.target === this.allRefs[0]) {\n\t\t\t\tevt.stopPropagation();\n\t\t\t\tevt.preventDefault();\n\t\t\t\tlastElement.focus();\n\t\t\t}\n\t\t}\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\t\tthis.allRefs = [];\n\n\t\tif (!this.props.notificationConfig) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst headerText = this.props.notificationConfig?.notificationHeader || DEFAULT_NOTIFICATION_HEADER;\n\t\tconst subtitleText = this.props.notificationConfig?.notificationSubtitle ?? \"\";\n\t\tconst emptyMessageText = this.props.notificationConfig?.emptyMessage ?? \"\";\n\n\t\tconst ariaLabel = this.getAriaHeaderLabel(headerText, subtitleText, emptyMessageText, this.props.messages.length > 0);\n\n\t\tconst notificationHeader = (<div className=\"notification-panel-header\">{headerText}</div>);\n\n\t\tconst notificationSubtitle = this.props.notificationConfig?.notificationSubtitle\n\t\t\t? (<div className=\"notification-panel-subtitle\">\n\t\t\t\t{subtitleText}\n\t\t\t</div>)\n\t\t\t: null;\n\n\t\tconst closeButton = (\n\t\t\t<div className=\"notification-panel-close-button\">\n\t\t\t\t<Button\n\t\t\t\t\tref={(ref) => (!ref || this.allRefs.push(ref))}\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tkind=\"ghost\"\n\t\t\t\t\trenderIcon={Close}\n\t\t\t\t\thasIconOnly\n\t\t\t\t\ticonDescription={this.props.intl.formatMessage({\n\t\t\t\t\t\tid: \"notification.panel.close.button.description\",\n\t\t\t\t\t\tdefaultMessage: defaultMessages[\"notification.panel.close.button.description\"]\n\t\t\t\t\t})}\n\t\t\t\t\tonClick={this.props.closeSubPanel}\n\t\t\t\t\ttooltipAlignment=\"end\"\n\t\t\t\t\ttooltipPosition=\"bottom\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\n\t\tconst notificationPanelMessages = this.props.messages.length > 0\n\t\t\t? this.getNotifications()\n\t\t\t: (\n\t\t\t\t<div className=\"notification-panel-empty-message-container\">\n\t\t\t\t\t<div className=\"notification-panel-empty-message\">\n\t\t\t\t\t\t{emptyMessageText || null}\n\t\t\t\t\t</div>\n\t\t\t\t</div>);\n\n\t\tconst clearAll = this.props.notificationConfig && this.props.notificationConfig.clearAllMessage\n\t\t\t? (<div className=\"notification-panel-clear-all-container\">\n\t\t\t\t<Button\n\t\t\t\t\tref={(ref) => (!ref || this.props.messages.length === 0 || this.allRefs.push(ref))}\n\t\t\t\t\tclassName=\"notification-panel-clear-all\"\n\t\t\t\t\tonClick={this.clearNotificationMessages.bind(this)}\n\t\t\t\t\tkind=\"ghost\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tdisabled={this.props.messages.length === 0}\n\t\t\t\t>\n\t\t\t\t\t{this.props.notificationConfig.clearAllMessage}\n\t\t\t\t</Button>\n\t\t\t</div>)\n\t\t\t: null;\n\n\t\tconst secondaryButton = this.props.notificationConfig &&\n\t\t\tthis.props.notificationConfig.secondaryButtonLabel &&\n\t\t\tthis.props.notificationConfig.secondaryButtonCallback\n\t\t\t? (<div className=\"notification-panel-secondary-button-container\">\n\t\t\t\t<Button\n\t\t\t\t\tref={(ref) => (!ref || this.props.secondaryButtonDisabled || this.allRefs.push(ref))}\n\t\t\t\t\tclassName=\"notification-panel-secondary-button\"\n\t\t\t\t\tonClick={this.props.notificationConfig.secondaryButtonCallback.bind(this)}\n\t\t\t\t\tkind=\"ghost\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tdisabled={this.props.secondaryButtonDisabled}\n\t\t\t\t>\n\t\t\t\t\t{this.props.notificationConfig.secondaryButtonLabel}\n\t\t\t\t</Button>\n\t\t\t</div>)\n\t\t\t: null;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName=\"notification-panel\"\n\t\t\t\trole=\"region\"\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\tonKeyDown={this.keyDownOnPanel}\n\t\t\t>\n\t\t\t\t<div className=\"notification-panel-header-container\">\n\t\t\t\t\t{notificationHeader}\n\t\t\t\t\t{notificationSubtitle}\n\t\t\t\t</div>\n\t\t\t\t{closeButton}\n\t\t\t\t<div className=\"notification-panel-messages\" role=\"list\">\n\t\t\t\t\t{notificationPanelMessages}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"notification-panel-button-container\">\n\t\t\t\t\t{clearAll}\n\t\t\t\t\t{secondaryButton}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nNotificationPanel.propTypes = {\n\t// Provided by toolbar\n\tcloseSubPanel: PropTypes.func,\n\tsubPanelData: PropTypes.object,\n\n\t// Provided by Redux\n\tnotificationConfig: PropTypes.shape({\n\t\tnotificationHeader: PropTypes.oneOfType([\n\t\t\tPropTypes.string,\n\t\t\tPropTypes.object\n\t\t]),\n\t\tnotificationSubtitle: PropTypes.oneOfType([\n\t\t\tPropTypes.string,\n\t\t\tPropTypes.object\n\t\t]),\n\t\temptyMessage: PropTypes.oneOfType([\n\t\t\tPropTypes.string,\n\t\t\tPropTypes.object\n\t\t]),\n\t\tclearAllMessage: PropTypes.oneOfType([\n\t\t\tPropTypes.string,\n\t\t\tPropTypes.object\n\t\t]),\n\t\tclearAllCallback: PropTypes.func,\n\t\tkeepOpen: PropTypes.bool,\n\t\tsecondaryButtonLabel: PropTypes.oneOfType([\n\t\t\tPropTypes.string,\n\t\t\tPropTypes.object\n\t\t]),\n\t\tsecondaryButtonCallback: PropTypes.func,\n\t\tsecondaryButtonDisabled: PropTypes.bool\n\t}),\n\tsecondaryButtonDisabled: PropTypes.bool,\n\tmessages: PropTypes.array,\n\tintl: PropTypes.object.isRequired\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\tnotificationConfig: state.notificationpanel.config,\n\tsecondaryButtonDisabled: state.notificationpanel.config ? state.notificationpanel.config.secondaryButtonDisabled : false,\n\tmessages: state.notifications\n});\n\nexport default connect(mapStateToProps)(injectIntl(NotificationPanel));\n","/*\n * Copyright 2017-2026 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport { injectIntl } from \"react-intl\";\nimport defaultMessages from \"../../locales/common-canvas/locales/en.json\";\nimport defaultToolbarMessages from \"../../locales/toolbar/locales/en.json\";\nimport Toolbar from \"../toolbar/toolbar.jsx\";\nimport Logger from \"../logging/canvas-logger.js\";\nimport NotificationPanel from \"../notification-panel/notification-panel.jsx\";\nimport { ERROR, WARNING, SUCCESS, INFO, PALETTE_LAYOUT_NONE,\n\tNOTIFICATION_ICON_CLASS, TOOLBAR_TOGGLE_NOTIFICATION_PANEL, TOOLBAR_LAYOUT_TOP,\n\tTOOLBAR_TOGGLE_PALETTE }\n\tfrom \"../common-canvas/constants/canvas-constants\";\nimport { SidePanelOpenFilled, SidePanelCloseFilled } from \"@carbon/react/icons\";\n\nclass CommonCanvasToolbar extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.logger = new Logger(\"CC-Toolbar\");\n\n\t\tthis.getLabel = this.getLabel.bind(this);\n\t\tthis.toolbarActionHandler = this.toolbarActionHandler.bind(this);\n\t}\n\n\tgetLabel(labelId, substituteObj) {\n\t\tconst defaultMessage = defaultMessages[labelId] ? defaultMessages[labelId] : defaultToolbarMessages[labelId];\n\t\treturn this.props.intl.formatMessage({ id: labelId, defaultMessage: defaultMessage }, substituteObj);\n\t}\n\n\t// Returns the default toolbar which is shown if the user does not specify\n\t// a toolbar config.\n\tgetDefaultToolbar() {\n\t\treturn {\n\t\t\tleftBar: [\n\t\t\t\t{ action: \"undo\", label: this.getLabel(\"canvas.undo\"), enable: true },\n\t\t\t\t{ action: \"redo\", label: this.getLabel(\"canvas.redo\"), enable: true },\n\t\t\t\t{ action: \"cut\", label: this.getLabel(\"edit.cutSelection\"), enable: true },\n\t\t\t\t{ action: \"copy\", label: this.getLabel(\"edit.copySelection\"), enable: true },\n\t\t\t\t{ action: \"paste\", label: this.getLabel(\"edit.pasteSelection\"), enable: true },\n\t\t\t\t{ action: \"createAutoComment\", label: this.getLabel(\"canvas.addComment\"), enable: true },\n\t\t\t\t{ action: \"deleteSelectedObjects\", label: this.getLabel(\"canvas.deleteObject\"), enable: true }\n\t\t\t],\n\t\t\trightBar: [\n\t\t\t\t{ action: \"zoomIn\", label: this.getLabel(\"toolbar.zoomIn\"), enable: true },\n\t\t\t\t{ action: \"zoomOut\", label: this.getLabel(\"toolbar.zoomOut\"), enable: true },\n\t\t\t\t{ action: \"zoomToFit\", label: this.getLabel(\"toolbar.zoomToFit\"), enable: true }\n\t\t\t]\n\t\t};\n\t}\n\n\t// Returns a toolbar config for the toolbar the way it was initially supported.\n\t// That is, with an array of 'leftBar' items passed in to the toolbar config\n\t// and a fixed set of 'rightBar' items.\n\tgetConvertedLegacyToolbar(leftBarItems) {\n\t\treturn {\n\t\t\tleftBar: leftBarItems,\n\t\t\trightBar: this.getDefaultRightBar()\n\t\t};\n\t}\n\n\tgetDefaultRightBar() {\n\t\treturn [\n\t\t\t{ action: \"zoomIn\", label: this.getLabel(\"toolbar.zoomIn\"), enable: true },\n\t\t\t{ action: \"zoomOut\", label: this.getLabel(\"toolbar.zoomOut\"), enable: true },\n\t\t\t{ action: \"zoomToFit\", label: this.getLabel(\"toolbar.zoomToFit\"), enable: true }\n\t\t];\n\t}\n\n\tgetNotificationClassName() {\n\t\tconst maxMessageType = this.props.canvasController.getNotificationMessagesMaxType();\n\t\tlet className = NOTIFICATION_ICON_CLASS;\n\n\t\t// notification color indicator will show the highest severity status\n\t\tif (maxMessageType === ERROR) {\n\t\t\tclassName += \" error\";\n\t\t} else if (maxMessageType === WARNING) {\n\t\t\tclassName += \" warning\";\n\t\t} else if (maxMessageType === SUCCESS) {\n\t\t\tclassName += \" success\";\n\t\t} else if (maxMessageType === INFO) {\n\t\t\tclassName += \" info\";\n\t\t}\n\t\treturn className;\n\t}\n\n\t// Returns the index of the action passed in, in the\n\t// 'bar' passed in.\n\tgetToolIndexByAction(action, bar) {\n\t\treturn bar?.findIndex((a) => a.action === action);\n\t}\n\n\tgenerateToolbarConfig() {\n\t\tlet config = this.copyConfig();\n\n\t\tif (config) {\n\t\t\tif (Array.isArray(config)) {\n\t\t\t\tconfig = this.getConvertedLegacyToolbar(config);\n\t\t\t} else if (typeof config.rightBar === \"undefined\") {\n\t\t\t\tconfig.rightBar = this.getDefaultRightBar();\n\t\t\t}\n\n\t\t} else {\n\t\t\tconfig = this.getDefaultToolbar();\n\t\t\tconfig.size = \"md\";\n\t\t}\n\n\t\tconfig = this.optionallyAddPaletteTool(config);\n\t\tconfig = this.optionallyAddNotificationTool(config);\n\n\t\treturn config;\n\t}\n\n\t// Copy the props config because we will alter its contents and we don't want to\n\t// alter a props variable since that would alter the parent variable.\n\tcopyConfig() {\n\t\tif (!this.props.config) {\n\t\t\treturn null;\n\t\t}\n\t\tif (Array.isArray(this.props.config)) {\n\t\t\treturn [...this.props.config];\n\t\t}\n\n\t\tconst config = {};\n\t\tif (this.props.config.overrideAutoEnableDisable) {\n\t\t\tconfig.overrideAutoEnableDisable = true;\n\t\t}\n\t\tif (this.props.config && this.props.config.leftBar) {\n\t\t\tconfig.leftBar = [...this.props.config.leftBar];\n\t\t}\n\t\tif (this.props.config && this.props.config.rightBar) {\n\t\t\tconfig.rightBar = [...this.props.config.rightBar];\n\t\t}\n\t\tif (this.props.config.size) {\n\t\t\tconfig.size = this.props.config.size;\n\t\t}\n\t\treturn config;\n\t}\n\n\ttoolbarActionHandler(action) {\n\t\tthis.props.canvasController.toolbarActionHandler(action);\n\t}\n\n\toptionallyAddPaletteTool(config) {\n\t\tconst leftBar = config.leftBar || [];\n\t\tconst rightBar = config.rightBar || [];\n\n\t\tlet paletteLabel = this.getLabel(\"toolbar.palette\");\n\n\t\t// If the leftBar contains and old palette action and if followed by a\n\t\t// divider remove them.\n\t\tlet newLeftBar = leftBar;\n\t\tif (leftBar && leftBar.length > 0 && leftBar[0].action === \"palette\") {\n\t\t\t// Use the existing palette label if one was provided.\n\t\t\tpaletteLabel = leftBar[0].label ? leftBar[0].label : paletteLabel;\n\t\t\tnewLeftBar = leftBar.slice(1);\n\t\t\tif (leftBar.length > 1 && leftBar[1].divider) {\n\t\t\t\tnewLeftBar = leftBar.slice(2);\n\t\t\t}\n\t\t}\n\n\t\t// Add a new togglePalette icon if the palette is enabled and the app\n\t\t// has not provided its own palette action.\n\t\tif (this.props.isPaletteEnabled) {\n\t\t\t// Applications may need to detect these legacy classes to detect which action\n\t\t\t// is to be performed. So add them as additional classes. Also, jest tests require them.\n\t\t\t// TODO - In next major release, remove \"paletteClose-action\" and \"paletteOpen-action\"\n\t\t\tconst className = this.props.isPaletteOpen ? \"closePalette-action paletteClose-action\" : \"openPalette-action paletteOpen-action\";\n\t\t\tconst icon = this.props.isPaletteOpen ? (<SidePanelCloseFilled />) : (<SidePanelOpenFilled />);\n\n\t\t\tconst togglePaletteAction =\n\t\t\t\t{ action: TOOLBAR_TOGGLE_PALETTE, label: paletteLabel, enable: true, iconEnabled: icon,\n\t\t\t\t\tisSelected: this.props.isPaletteOpen, className };\n\n\t\t\tconst lbIdx = this.getToolIndexByAction(TOOLBAR_TOGGLE_PALETTE, leftBar);\n\t\t\tconst rbIdx = this.getToolIndexByAction(TOOLBAR_TOGGLE_PALETTE, rightBar);\n\n\t\t\tif (lbIdx > -1) {\n\t\t\t\tconst lbAction = leftBar[lbIdx];\n\t\t\t\tconfig.leftBar[lbIdx] = {\n\t\t\t\t\t...togglePaletteAction,\n\t\t\t\t\tlabel: lbAction.label ? lbAction.label : paletteLabel,\n\t\t\t\t\ticonEnabled: lbAction.iconEnabled ? lbAction.iconEnabled : null, // null means Icon provided by the toolbar\n\t\t\t\t\tincLabelWithIcon: lbAction.incLabelWithIcon ? lbAction.incLabelWithIcon : null,\n\t\t\t\t\ttooltip: lbAction.tooltip ? lbAction.tooltip : null\n\t\t\t\t};\n\n\t\t\t} else if (rbIdx > -1) {\n\t\t\t\tconst rbAction = rightBar[rbIdx];\n\t\t\t\tconfig.rightBar[rbIdx] = {\n\t\t\t\t\t...togglePaletteAction,\n\t\t\t\t\tlabel: rbAction.label ? rbAction.label : paletteLabel,\n\t\t\t\t\ticonEnabled: rbAction.iconEnabled ? rbAction.iconEnabled : null, // null means Icon provided by the toolbar\n\t\t\t\t\tincLabelWithIcon: rbAction.incLabelWithIcon ? rbAction.incLabelWithIcon : null,\n\t\t\t\t\ttooltip: rbAction.tooltip ? rbAction.tooltip : null\n\t\t\t\t};\n\n\t\t\t} else {\n\t\t\t\tconst paletteTools = [\n\t\t\t\t\ttogglePaletteAction,\n\t\t\t\t\t{ divider: true }\n\t\t\t\t];\n\t\t\t\tconfig.leftBar = paletteTools.concat(newLeftBar);\n\t\t\t}\n\t\t}\n\t\treturn config;\n\t}\n\n\toptionallyAddNotificationTool(config) {\n\t\tconst leftBar = config.leftBar || [];\n\t\tconst rightBar = config.rightBar || [];\n\n\t\t// Add a new toggleNotificationPanel icon if the notification panel exists\n\t\t// and the app has not provided its own notification panel action.\n\t\tif (this.props.notificationConfigExists) {\n\t\t\tconst notificationCount = this.props.notificationMessages.length;\n\n\t\t\tconst toggleNotificationAction =\n\t\t\t\t{ action: TOOLBAR_TOGGLE_NOTIFICATION_PANEL,\n\t\t\t\t\tlabel: this.props.notificationConfigLabel,\n\t\t\t\t\tenable: this.props.notificationConfigEnable,\n\t\t\t\t\textIsSubAreaDisplayed: this.props.isNotificationOpen,\n\t\t\t\t\tsetExtIsSubAreaDisplayed: this.callExtIsSubAreaDisplayed.bind(this),\n\t\t\t\t\tclassName: this.getNotificationClassName(),\n\t\t\t\t\ttextContent: (notificationCount > 9) ? \"9+\" : notificationCount.toString(),\n\t\t\t\t\tsubPanel: NotificationPanel,\n\t\t\t\t\tsubPanelData: { canvasController: this.props.canvasController },\n\t\t\t\t\tleaveSubAreaOpenOnClickOutside: this.props.notificationConfigKeepOpen\n\t\t\t\t};\n\n\t\t\tconst lbIdx = this.getToolIndexByAction(TOOLBAR_TOGGLE_NOTIFICATION_PANEL, leftBar);\n\t\t\tconst rbIdx = this.getToolIndexByAction(TOOLBAR_TOGGLE_NOTIFICATION_PANEL, rightBar);\n\n\t\t\tif (lbIdx > -1) {\n\t\t\t\tconst lbAction = leftBar[lbIdx];\n\t\t\t\tconfig.leftBar[lbIdx] = {\n\t\t\t\t\t...toggleNotificationAction,\n\t\t\t\t\ticonEnabled: lbAction.iconEnabled ? lbAction.iconEnabled : null, // null means Icon provided by the toolbar\n\t\t\t\t\tincLabelWithIcon: lbAction.incLabelWithIcon ? lbAction.incLabelWithIcon : null,\n\t\t\t\t\ttooltip: lbAction.tooltip ? lbAction.tooltip : null,\n\t\t\t\t\ttextContent: null // Assume text contents is not needed with customized action\n\t\t\t\t};\n\n\t\t\t} else if (rbIdx > -1) {\n\t\t\t\tconst rbAction = rightBar[rbIdx];\n\t\t\t\tconfig.rightBar[rbIdx] = {\n\t\t\t\t\t...toggleNotificationAction,\n\t\t\t\t\ticonEnabled: rbAction.iconEnabled ? rbAction.iconEnabled : null, // null means Icon provided by the toolbar\n\t\t\t\t\tincLabelWithIcon: rbAction.incLabelWithIcon ? rbAction.incLabelWithIcon : null,\n\t\t\t\t\ttooltip: rbAction.tooltip ? rbAction.tooltip : null,\n\t\t\t\t\ttextContent: null }; // Assume text contents is not needed with customized action\n\n\n\t\t\t} else {\n\t\t\t\tconst notificationTools = [\n\t\t\t\t\t{ divider: true },\n\t\t\t\t\ttoggleNotificationAction\n\t\t\t\t];\n\n\t\t\t\tconfig.rightBar = config.rightBar.concat(notificationTools);\n\t\t\t}\n\t\t}\n\t\treturn config;\n\t}\n\n\tcallExtIsSubAreaDisplayed(state) {\n\t\tif (state) {\n\t\t\tthis.props.canvasController.openNotificationPanel();\n\t\t} else {\n\t\t\tthis.props.canvasController.closeNotificationPanel();\n\t\t}\n\t}\n\n\tconfigureToolbarButtonsState(toolbarConfig) {\n\t\t// We only set toolbar state with the internal object model. With the\n\t\t// external object model the host app must set toolbar state through the\n\t\t// toolbar config params.\n\t\tif (!this.props.enableInternalObjectModel ||\n\t\t\t\ttoolbarConfig.overrideAutoEnableDisable) {\n\t\t\treturn toolbarConfig;\n\t\t}\n\n\t\tif (typeof toolbarConfig !== \"undefined\") {\n\t\t\tconst editingAllowed = this.props.enableEditingActions;\n\t\t\tthis.applyToolState(\"undo\", toolbarConfig, editingAllowed && this.props.canUndo);\n\t\t\tthis.applyToolState(\"redo\", toolbarConfig, editingAllowed && this.props.canRedo);\n\t\t\tthis.applyToolState(\"cut\", toolbarConfig, editingAllowed && this.props.canCutCopy);\n\t\t\tthis.applyToolState(\"copy\", toolbarConfig, editingAllowed && this.props.canCutCopy);\n\t\t\tthis.applyToolState(\"paste\", toolbarConfig, editingAllowed && this.props.canPaste);\n\t\t\tthis.applyToolState(\"deleteSelectedObjects\", toolbarConfig, editingAllowed && this.props.canDelete);\n\t\t\tthis.applyToolState(\"createAutoComment\", toolbarConfig, editingAllowed);\n\t\t\tthis.applyToolState(\"arrangeHorizontally\", toolbarConfig, editingAllowed);\n\t\t\tthis.applyToolState(\"arrangeVertically\", toolbarConfig, editingAllowed);\n\t\t\t// editingAllowed = false doesn't stop zoom capability\n\t\t\tthis.applyToolState(\"zoomIn\", toolbarConfig, this.props.canZoomIn);\n\t\t\tthis.applyToolState(\"zoomOut\", toolbarConfig, this.props.canZoomOut);\n\t\t\tthis.applyToolState(\"zoomToFit\", toolbarConfig, this.props.canZoomToFit);\n\t\t}\n\t\treturn toolbarConfig;\n\t}\n\n\taddUndoRedoCommandLabels(toolbarConfig) {\n\t\tconst undoLabel = this.props.undoLabel;\n\t\tconst redoLabel = this.props.redoLabel;\n\n\t\tif (undoLabel) {\n\t\t\tconst undoTool = this.findTool(\"undo\", toolbarConfig);\n\t\t\tif (undoTool) {\n\t\t\t\tundoTool.label = this.getLabel(\"canvas.undoCommand\", { undo_command: undoLabel });\n\t\t\t}\n\t\t}\n\t\tif (redoLabel) {\n\t\t\tconst redoTool = this.findTool(\"redo\", toolbarConfig);\n\t\t\tif (redoTool) {\n\t\t\t\tredoTool.label = this.getLabel(\"canvas.redoCommand\", { redo_command: redoLabel });\n\t\t\t}\n\t\t}\n\t\treturn toolbarConfig;\n\t}\n\n\tapplyToolState(action, toolbarConfig, state) {\n\t\tconst tool = this.findTool(action, toolbarConfig);\n\t\tif (tool) {\n\t\t\ttool.enable = state;\n\t\t} else {\n\t\t\tthis.logger.log(\"Toolbar tool \" + action + \" could not be found to set state to \" + state);\n\t\t}\n\t}\n\n\tfindTool(action, toolbarConfig) {\n\t\tlet tool = {};\n\t\tif (toolbarConfig.leftBar) {\n\t\t\ttool = toolbarConfig.leftBar.find((o) => o.action === action);\n\t\t}\n\t\tif (!tool && toolbarConfig.rightBar) {\n\t\t\ttool = toolbarConfig.rightBar.find((o) => o.action === action);\n\t\t}\n\t\treturn tool;\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\tlet toolbarConfig = this.generateToolbarConfig();\n\t\ttoolbarConfig = this.configureToolbarButtonsState(toolbarConfig);\n\t\ttoolbarConfig = this.addUndoRedoCommandLabels(toolbarConfig);\n\t\tlet canvasToolbar = null;\n\n\t\tif (this.props.enableToolbarLayout === TOOLBAR_LAYOUT_TOP) {\n\t\t\tconst toolbarSize = toolbarConfig.size || \"md\";\n\t\t\tcanvasToolbar = (\n\t\t\t\t<div\n\t\t\t\t\tclassName={\"common-canvas-toolbar\"}\n\t\t\t\t>\n\t\t\t\t\t<Toolbar\n\t\t\t\t\t\tconfig={toolbarConfig}\n\t\t\t\t\t\tcontainingDivId={this.props.containingDivId}\n\t\t\t\t\t\tinstanceId={this.props.canvasController.getInstanceId()}\n\t\t\t\t\t\ttoolbarActionHandler={this.toolbarActionHandler}\n\t\t\t\t\t\tsize={toolbarSize}\n\t\t\t\t\t\tadditionalText={{\n\t\t\t\t\t\t\toverflowMenuLabel: this.getLabel(\"toolbar.overflowMenu\"),\n\t\t\t\t\t\t\tariaLabel: this.getLabel(\"toolbar.flowEditorToolbarLabel\")\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\treturn canvasToolbar;\n\t}\n}\n\nCommonCanvasToolbar.propTypes = {\n\t// Provided by CommonCanvas\n\tintl: PropTypes.object.isRequired,\n\tcanvasController: PropTypes.object.isRequired,\n\tcontainingDivId: PropTypes.string.isRequired,\n\n\t// Provided by redux\n\tenableToolbarLayout: PropTypes.string.isRequired,\n\tconfig: PropTypes.oneOfType([\n\t\tPropTypes.array.isRequired,\n\t\tPropTypes.object.isRequired\n\t]),\n\tisPaletteEnabled: PropTypes.bool,\n\tisPaletteOpen: PropTypes.bool,\n\tisNotificationOpen: PropTypes.bool,\n\tnotificationMessages: PropTypes.array,\n\tnotificationConfigExists: PropTypes.object,\n\tnotificationConfigEnable: PropTypes.bool,\n\tnotificationConfigLabel: PropTypes.string,\n\tnotificationConfigKeepOpen: PropTypes.bool,\n\tenableInternalObjectModel: PropTypes.bool,\n\tenableEditingActions: PropTypes.bool,\n\tcanUndo: PropTypes.bool,\n\tcanRedo: PropTypes.bool,\n\tcanCutCopy: PropTypes.bool,\n\tcanPaste: PropTypes.bool,\n\tcanDelete: PropTypes.bool,\n\tcanZoomIn: PropTypes.bool,\n\tcanZoomOut: PropTypes.bool,\n\tcanZoomToFit: PropTypes.bool,\n\tundoLabel: PropTypes.string,\n\tredoLabel: PropTypes.string\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\tenableToolbarLayout: state.canvasconfig.enableToolbarLayout,\n\tconfig: state.canvastoolbar.config,\n\tisPaletteEnabled: state.canvasconfig.enablePaletteLayout !== PALETTE_LAYOUT_NONE,\n\tisPaletteOpen: state.palette.isOpen,\n\tisNotificationOpen: state.notificationpanel.isOpen,\n\tnotificationConfigExists: state.notificationpanel?.config,\n\tnotificationConfigEnable: state.notificationpanel?.config?.enable,\n\tnotificationConfigLabel: state.notificationpanel?.config?.label,\n\tnotificationConfigKeepOpen: state.notificationpanel?.config?.keepOpen,\n\tnotificationMessages: state.notifications,\n\tenableInternalObjectModel: state.canvasconfig.enableInternalObjectModel,\n\tenableEditingActions: state.canvasconfig.enableEditingActions,\n\tcanUndo: ownProps.canvasController.canUndo(),\n\tcanRedo: ownProps.canvasController.canRedo(),\n\tcanCutCopy: ownProps.canvasController.canCutCopy(),\n\tcanPaste: ownProps.canvasController.canPaste(),\n\tcanDelete: ownProps.canvasController.canDelete(),\n\tcanZoomIn: ownProps.canvasController.canZoomIn(),\n\tcanZoomOut: ownProps.canvasController.canZoomOut(),\n\tcanZoomToFit: ownProps.canvasController.canZoomToFit(),\n\tundoLabel: ownProps.canvasController.getUndoLabel(),\n\tredoLabel: ownProps.canvasController.getRedoLabel()\n});\n\nexport default connect(mapStateToProps)(injectIntl(CommonCanvasToolbar));\n","/*\n * Copyright 2024 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport { connect } from \"react-redux\";\nimport PropTypes from \"prop-types\";\nimport Logger from \"../logging/canvas-logger.js\";\n\nclass CommonCanvasLeftFlyout extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.logger = new Logger(\"CC-LeftFlyout\");\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\tlet leftFlyout = <div />; // For no content, return empty <div> so grid sizing for parent <div> work correctly.\n\n\t\tif (this.props.content && this.props.isOpen) {\n\t\t\tconst lfClass = this.props.enableLeftFlyoutUnderToolbar\n\t\t\t\t? \"left-flyout-panel under-toolbar\"\n\t\t\t\t: \"left-flyout-panel\";\n\n\t\t\tleftFlyout = (\n\t\t\t\t<div className={\"left-flyout\"}>\n\t\t\t\t\t<div className={lfClass}>\n\t\t\t\t\t\t{this.props.content}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn leftFlyout;\n\t}\n}\n\nCommonCanvasLeftFlyout.propTypes = {\n\t// Provided by Redux\n\tisOpen: PropTypes.bool,\n\tcontent: PropTypes.object,\n\tenableLeftFlyoutUnderToolbar: PropTypes.bool\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\tisOpen: state.leftflyout.isOpen,\n\tcontent: state.leftflyout.content,\n\tenableLeftFlyoutUnderToolbar: state.canvasconfig.enableLeftFlyoutUnderToolbar\n});\n\nexport default connect(mapStateToProps)(CommonCanvasLeftFlyout);\n","/*\n * Copyright 2017-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport { connect } from \"react-redux\";\nimport PropTypes from \"prop-types\";\nimport Logger from \"../logging/canvas-logger.js\";\n\n// Should cover at most 70% of available width.\nconst MAX_WIDTH_EXTEND_PERCENT = 0.7;\n\nclass CommonCanvasRightFlyout extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.logger = new Logger(\"CC-RightFlyout\");\n\n\t\tthis.rightFlyoutRef = React.createRef();\n\t\tthis.state = { isBeingDragging: false };\n\n\t\tthis.initialMinWidth = null;\n\n\t\tthis.onMouseUp = this.onMouseUp.bind(this);\n\t\tthis.onMouseDown = this.onMouseDown.bind(this);\n\t\tthis.onMouseMoveX = this.onMouseMoveX.bind(this);\n\t\tthis.getCurrentWidth = this.getCurrentWidth.bind(this);\n\n\t\tthis.getRightFlyoutResizeContent = this.getRightFlyoutResizeContent.bind(this);\n\t}\n\n\tcomponentDidMount() {\n\t\t// Since flyout content width can be dynamic set the minimum width to width of the content\n\t\t// unless a minimum width has been specified by the application. In which case, use it.\n\t\tif (typeof this.props.panelMinWidth === \"undefined\" || this.props.panelMinWidth === null) {\n\t\t\tthis.initialMinWidth = this.getCurrentWidth();\n\t\t}\n\t}\n\n\tonMouseDown(e) {\n\t\tif (e.button === 0) {\n\t\t\tthis.setState({ isBeingDragging: true });\n\t\t\tdocument.addEventListener(\"mousemove\", this.onMouseMoveX, true);\n\t\t\tdocument.addEventListener(\"mouseup\", this.onMouseUp, true);\n\t\t\tthis.posX = e.clientX;\n\t\t\t// Prevent panel contents being dragged in the test harness (which can\n\t\t\t// happen even though draggable is false for the contents!)\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\tonMouseUp() {\n\t\tthis.setState({ isBeingDragging: false });\n\t\tdocument.removeEventListener(\"mousemove\", this.onMouseMoveX, true);\n\t\tdocument.removeEventListener(\"mouseup\", this.onMouseUp, true);\n\t}\n\n\tonMouseMoveX(e) {\n\t\tif (e.clientX) {\n\t\t\tconst panelWidth = this.isPanelWidthSpecified() ? this.props.panelWidth : this.getCurrentWidth();\n\t\t\tconst diff = e.clientX - this.posX;\n\t\t\tconst wd = panelWidth - diff;\n\t\t\tthis.props.canvasController.setRightFlyoutWidth(this.limitWidth(wd));\n\t\t\tthis.posX = e.clientX;\n\t\t}\n\t}\n\n\t// Returns content to enable/disable resize based on feature flag.\n\tgetRightFlyoutResizeContent() {\n\t\tlet resizeContent = null;\n\n\t\tif (this.props.enableRightFlyoutDragToResize) {\n\t\t\tconst className = \"right-flyout-drag\" + (this.state.isBeingDragging ? \" is-being-dragged\" : \"\");\n\n\t\t\tresizeContent = (<div className={className} onMouseDown={this.onMouseDown} />);\n\t\t}\n\n\t\treturn resizeContent;\n\t}\n\n\t// Returns present width of the flyout.\n\tgetCurrentWidth() {\n\t\treturn this.rightFlyoutRef?.current ? this.rightFlyoutRef?.current.getBoundingClientRect().width : 0;\n\t}\n\n\t// Returns the minimum width for the flyout. This will be the minimum width specified by the\n\t// application but if one is not specified the width that the flyout when it first opened.\n\tgetMinWidth() {\n\t\tif (typeof this.props.panelMinWidth === \"undefined\" || this.props.panelMinWidth === null) {\n\t\t\t// When this flyout is first rendered, getMinWidth() will be called before\n\t\t\t// initialMinWidth has been set. So return min width as zero.\n\t\t\tif (this.initialMinWidth === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn this.initialMinWidth;\n\t\t}\n\t\treturn this.props.panelMinWidth;\n\t}\n\n\t// Return true if a value is provided for this.props.panelWidth\n\tisPanelWidthSpecified() {\n\t\treturn !(typeof this.props.panelWidth === \"undefined\" || this.props.panelWidth === null);\n\t}\n\n\t// Returns a new width for right panel limited by the need to enforce\n\t// a minimum and maximum width\n\tlimitWidth(wd) {\n\t\tconst centerPanelWidth = this.props.getCenterPanelWidth();\n\t\tconst panelWidth = this.getCurrentWidth();\n\n\t\t// Max Width should be a percentage of the total available width (center panel + rightflyout)\n\t\tconst maxWidth = (centerPanelWidth + panelWidth) * MAX_WIDTH_EXTEND_PERCENT;\n\t\tconst minWidth = this.getMinWidth();\n\t\tconst width = Math.min(Math.max(wd, minWidth), maxWidth);\n\n\t\treturn width;\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\tlet rightFlyout = null;\n\n\t\tif (this.props.content && this.props.isOpen) {\n\t\t\tconst rightFlyoutDragContent = this.getRightFlyoutResizeContent();\n\n\t\t\tconst width = this.isPanelWidthSpecified() ? this.limitWidth(this.props.panelWidth) + \"px\" : null;\n\n\t\t\tconst rfClass = this.props.enableRightFlyoutUnderToolbar\n\t\t\t\t? \"right-flyout-panel under-toolbar\"\n\t\t\t\t: \"right-flyout-panel\";\n\n\t\t\trightFlyout = (\n\t\t\t\t<div className=\"right-flyout\" style={{ width: width }} >\n\t\t\t\t\t{rightFlyoutDragContent}\n\t\t\t\t\t<div className={rfClass} ref={this.rightFlyoutRef}>\n\t\t\t\t\t\t{this.props.content}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn rightFlyout;\n\t}\n}\n\nCommonCanvasRightFlyout.propTypes = {\n\t// Provided by Common Canvas\n\tcanvasController: PropTypes.object,\n\tgetCenterPanelWidth: PropTypes.func,\n\n\t// Provided by Redux\n\tisOpen: PropTypes.bool,\n\tcontent: PropTypes.object,\n\tenableRightFlyoutUnderToolbar: PropTypes.bool,\n\tenableRightFlyoutDragToResize: PropTypes.bool,\n\tpanelWidth: PropTypes.number,\n\tpanelMinWidth: PropTypes.number\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\tisOpen: state.rightflyout.isOpen,\n\tcontent: state.rightflyout.content,\n\tenableRightFlyoutUnderToolbar: state.canvasconfig.enableRightFlyoutUnderToolbar,\n\tenableRightFlyoutDragToResize: state.canvasconfig.enableRightFlyoutDragToResize,\n\tpanelWidth: state.rightflyout.panelWidth,\n\tpanelMinWidth: state.rightflyout.panelMinWidth\n});\n\nexport default connect(mapStateToProps)(CommonCanvasRightFlyout);\n","/*\n * Copyright 2023 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport Logger from \"../logging/canvas-logger.js\";\n\nclass CanvasTopPanel extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.logger = new Logger(\"CC-Top-Panel\");\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\t\tlet topPanel = null;\n\n\t\tif (this.props.topPanelIsOpen) {\n\t\t\ttopPanel = (\n\t\t\t\t<div className={\"top-panel\"} >\n\t\t\t\t\t<div className={\"top-panel-contents\"}>\n\t\t\t\t\t\t{this.props.topPanelContent}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn topPanel;\n\t}\n}\n\nCanvasTopPanel.propTypes = {\n\t// Provided by CommonCanvas\n\tcanvasController: PropTypes.object,\n\tcontainingDivId: PropTypes.string,\n\n\t// Provided by Redux\n\ttopPanelIsOpen: PropTypes.bool,\n\ttopPanelContent: PropTypes.object\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\ttopPanelIsOpen: state.toppanel.isOpen,\n\ttopPanelContent: state.toppanel.content\n});\nexport default connect(mapStateToProps)(CanvasTopPanel);\n","/*\n * Copyright 2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport Logger from \"../logging/canvas-logger.js\";\n\nclass CanvasCenterPanel extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.divRef = React.createRef();\n\n\t\tthis.logger = new Logger(\"CC-Center-Panel\");\n\t}\n\n\t// Called by cc-panels.jsx through using a ref\n\tgetBoundingRect() {\n\t\treturn this.divRef?.current?.getBoundingClientRect();\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\treturn (\n\t\t\t<div className={\"center-panel\"} ref={this.divRef}>\n\t\t\t\t{this.props.content}\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nCanvasCenterPanel.propTypes = {\n\t// Provided by CommonCanvas\n\tcanvasController: PropTypes.object,\n\tcontent: PropTypes.node\n};\n\n\nexport default CanvasCenterPanel;\n","/*\n * Copyright 2017-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport Logger from \"../logging/canvas-logger.js\";\n\n// Should cover at most 80% of available height.\nconst MAX_HEIGHT_EXTEND_PERCENT = 0.8;\n\nclass CanvasBottomPanel extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.logger = new Logger(\"CC-Bottom-Panel\");\n\t\tthis.state = { isBeingDragging: false };\n\n\t\tthis.minHeight = 0;\n\n\t\tthis.bottomPanelRef = React.createRef();\n\n\t\tthis.onMouseUp = this.onMouseUp.bind(this);\n\t\tthis.onMouseDown = this.onMouseDown.bind(this);\n\t\tthis.onMouseMoveY = this.onMouseMoveY.bind(this);\n\t}\n\n\tcomponentDidMount() {\n\t\t// Minimum height is fixed for bottom panel.\n\t\tthis.minHeight = 75;\n\t}\n\n\tonMouseDown(e) {\n\t\tif (e.button === 0) {\n\t\t\tthis.setState({ isBeingDragging: true });\n\t\t\tdocument.addEventListener(\"mousemove\", this.onMouseMoveY, true);\n\t\t\tdocument.addEventListener(\"mouseup\", this.onMouseUp, true);\n\t\t\tthis.posY = e.clientY;\n\t\t\t// Prevent panel contents being dragged in the test harness (which can\n\t\t\t// happen even though draggable is false for the contents!)\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\tonMouseUp(e) {\n\t\tthis.setState({ isBeingDragging: false });\n\t\tdocument.removeEventListener(\"mousemove\", this.onMouseMoveY, true);\n\t\tdocument.removeEventListener(\"mouseup\", this.onMouseUp, true);\n\t}\n\n\tonMouseMoveY(e) {\n\t\tif (e.clientY) {\n\t\t\tconst diff = e.clientY - this.posY;\n\t\t\tconst ht = this.props.panelHeight - diff;\n\t\t\tthis.props.canvasController.setBottomPanelHeight(this.limitHeight(ht));\n\t\t\tthis.posY = e.clientY;\n\t\t}\n\t}\n\n\tlimitHeight(ht) {\n\t\tconst centerPanelHeight = this.props.getCenterPanelHeight();\n\t\t// Assume the bottom panel is zero height if it has not yet fully rendered.\n\t\tconst bottomPanelHeight = this.bottomPanelRef?.current ? this.bottomPanelRef.current.getBoundingClientRect().height : 0;\n\n\t\t// Max Height should be a percentage of the total available height (center panel + bottom panel)\n\t\tconst maxHeight = (centerPanelHeight + bottomPanelHeight) * MAX_HEIGHT_EXTEND_PERCENT;\n\t\tconst height = Math.min(Math.max(ht, this.minHeight), maxHeight);\n\n\t\treturn height;\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\t\tlet bottomPanel = null;\n\n\t\tif (this.props.bottomPanelIsOpen) {\n\t\t\tconst heightPx = this.limitHeight(this.props.panelHeight) + \"px\";\n\n\t\t\tconst className = \"bottom-panel-drag\" + (this.state.isBeingDragging ? \" is-being-dragged\" : \"\");\n\n\t\t\tbottomPanel = (\n\t\t\t\t<div ref={this.bottomPanelRef} className=\"bottom-panel\" style={{ height: heightPx }} >\n\t\t\t\t\t<div className={className} onMouseDown={this.onMouseDown} />\n\t\t\t\t\t<div className=\"bottom-panel-contents\">\n\t\t\t\t\t\t{this.props.bottomPanelContent}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn bottomPanel;\n\t}\n}\n\nCanvasBottomPanel.propTypes = {\n\t// Provided by CommonCanvas\n\tcanvasController: PropTypes.object,\n\tgetCenterPanelHeight: PropTypes.func,\n\n\t// Provided by Redux\n\tbottomPanelIsOpen: PropTypes.bool,\n\tbottomPanelContent: PropTypes.object,\n\tpanelHeight: PropTypes.number\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\tbottomPanelIsOpen: state.bottompanel.isOpen,\n\tbottomPanelContent: state.bottompanel.content,\n\tpanelHeight: state.bottompanel.panelHeight\n});\nexport default connect(mapStateToProps)(CanvasBottomPanel);\n","/*\n * Copyright 2017-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint no-lonely-if: \"off\" */\n\nimport React from \"react\";\nimport { connect } from \"react-redux\";\nimport PropTypes from \"prop-types\";\nimport Palette from \"../palette/palette.jsx\";\nimport PaletteDialog from \"../palette/palette-dialog.jsx\";\nimport CommonCanvasTooltip from \"./cc-tooltip.jsx\";\nimport CanvasContents from \"./cc-contents.jsx\";\nimport CommonCanvasToolbar from \"./cc-toolbar.jsx\";\nimport CommonCanvasLeftFlyout from \"./cc-left-flyout.jsx\";\nimport CommonCanvasRightFlyout from \"./cc-right-flyout.jsx\";\nimport CanvasTopPanel from \"./cc-top-panel.jsx\";\nimport CanvasCenterPanel from \"./cc-center-panel.jsx\";\nimport CanvasBottomPanel from \"./cc-bottom-panel.jsx\";\nimport Logger from \"../logging/canvas-logger.js\";\nimport { PALETTE_LAYOUT_FLYOUT, PALETTE_LAYOUT_DIALOG, PALETTE_LAYOUT_NONE }\n\tfrom \"../common-canvas/constants/canvas-constants\";\n\n\nclass CommonCanvasPanels extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.logger = new Logger(\"CC-Panels\");\n\n\t\tthis.containingDivId = \"common-canvas-items-container-\" + props.canvasController.getInstanceId();\n\n\t\tthis.centerPanelRef = React.createRef();\n\n\t\tthis.getCenterPanelWidth = this.getCenterPanelWidth.bind(this);\n\t\tthis.getCenterPanelHeight = this.getCenterPanelHeight.bind(this);\n\t}\n\n\t// Prevent the default behavior (which is to show a plus-sign pointer) as\n\t// an object is being dragged over the common canvas components.\n\t// Note: this is overridden by the canvas area itself to allow external objects\n\t// to be dragged over it.\n\tonDragOver(evt) {\n\t\tevt.preventDefault();\n\t}\n\n\t// Prevent an object being dropped on the common canvas causing a file\n\t// download event (which is the default!). Note: this is overridden by the\n\t// canvas area itself to allow external objects to be dropped on it.\n\tonDrop(evt) {\n\t\tevt.preventDefault();\n\t}\n\n\t// Returns the center panel width. Called by the panel flyout objects.\n\tgetCenterPanelWidth() {\n\t\tconst rect = this.centerPanelRef?.current?.getBoundingRect();\n\t\treturn rect ? rect.width : 0;\n\t}\n\n\t// Returns the center panel height. Called by the panel flyout objects.\n\tgetCenterPanelHeight() {\n\t\tconst rect = this.centerPanelRef?.current?.getBoundingRect();\n\n\t\t// Assume the center panel <div> is a reasonable height if it has not yet fully rendered.\n\t\treturn rect ? rect.height : 1000;\n\t}\n\n\tgenerateClass() {\n\t\tlet className = \"common-canvas\";\n\n\t\tclassName += (\n\t\t\t!this.props.enableEditingActions\n\t\t\t\t? \" config-editing-actions-false\"\n\t\t\t\t: \"\");\n\n\t\tclassName += (\n\t\t\tthis.props.enableParentClass\n\t\t\t\t? \" \" + this.props.enableParentClass\n\t\t\t\t: \"\");\n\n\t\treturn className;\n\t}\n\n\t// Returns a JSX <div> for the top, canvas contents and bottom panels that are always\n\t// on top of each other.\n\tgenerateTopCenterBottom() {\n\t\tconst centerContents = (<CanvasContents canvasController={this.props.canvasController} />);\n\n\t\tconst topPanel = (<CanvasTopPanel canvasController={this.props.canvasController} containingDivId={this.containingDivId} />);\n\t\tconst centerPanel = (<CanvasCenterPanel ref={this.centerPanelRef} content={centerContents} />);\n\t\tconst bottomPanel = (<CanvasBottomPanel canvasController={this.props.canvasController} getCenterPanelHeight={this.getCenterPanelHeight} />);\n\n\t\tlet templateRows = this.props.topPanelIsOpen ? \"auto 1fr\" : \"1fr\";\n\t\ttemplateRows += this.props.bottomPanelIsOpen ? \" auto\" : \"\";\n\n\t\treturn (\n\t\t\t<div className=\"common-canvas-grid-vertical\" style={{ gridTemplateRows: templateRows }}>\n\t\t\t\t{topPanel}\n\t\t\t\t{centerPanel}\n\t\t\t\t{bottomPanel}\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Returns true if the left flyout should be displayed. The application\n\t// can choose to:\n\t// * Use the in-built <Palette> behavior indicated by setting the\n\t// config field enablePaletteLayout to \"Flyout\"\n\t// * To put its own contents in the left flyout panel. This is\n\t// indicated by setting the config field enablePaletteLayout to\n\t// \"None\" and providing some JSX in the leftFlyoutContent field\n\t// of <CommonCanvas>.\n\tisLeftFlyoutOpen() {\n\t\tif (this.props.enablePaletteLayout === PALETTE_LAYOUT_DIALOG) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.props.enablePaletteLayout === PALETTE_LAYOUT_NONE &&\n\t\t\tthis.props.leftFlyoutIsOpen) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (this.props.enablePaletteLayout === PALETTE_LAYOUT_FLYOUT &&\n\t\t\t(this.props.paletteIsOpen || this.props.enableNarrowPalette)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Returns true if the right flyout should be displayed.\n\tisRightFlyoutOpen() {\n\t\treturn this.props.rightFlyoutIsOpen;\n\t}\n\n\t// Returns a JSX expression for the contents of the left panel. If the application\n\t// sets enablePaletteLayout to \"None\", this indicates the app wants its own content\n\t// to go into the left panel. This content is provided in the Common Canvas\n\t// leftFlyoutContent prop. Otherwise, if enablePaletteLayout is \"Flyout\", the\n\t// app wants Common Canvas to display the regular Palette in the left flyout.\n\tgenerateLeftFlyout() {\n\t\tif (this.props.enablePaletteLayout === PALETTE_LAYOUT_NONE && this.props.leftFlyoutIsOpen) {\n\t\t\treturn (<CommonCanvasLeftFlyout />);\n\n\t\t} else if (this.props.enablePaletteLayout === PALETTE_LAYOUT_FLYOUT) {\n\t\t\treturn (<Palette canvasController={this.props.canvasController} />);\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Returns a JSX object for the contents of the right panel.\n\tgenerateRightFlyout() {\n\t\treturn (\n\t\t\t<CommonCanvasRightFlyout\n\t\t\t\tgetCenterPanelWidth={this.getCenterPanelWidth}\n\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t/>\n\t\t);\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\tconst tip = (<CommonCanvasTooltip canvasController={this.props.canvasController} />);\n\t\tconst canvasToolbar = (\n\t\t\t<CommonCanvasToolbar canvasController={this.props.canvasController}\n\t\t\t\tcontainingDivId={this.containingDivId}\n\t\t\t/>\n\t\t);\n\t\tconst rightFlyoutIsOpen = this.isRightFlyoutOpen();\n\t\tconst rightFlyout = rightFlyoutIsOpen ? this.generateRightFlyout() : null;\n\t\tconst leftFlyoutIsOpen = this.isLeftFlyoutOpen();\n\t\tconst leftFlyout = leftFlyoutIsOpen ? this.generateLeftFlyout() : null;\n\n\t\tconst topCenterBottom = this.generateTopCenterBottom();\n\n\t\tlet panels = null;\n\n\t\tif (this.props.enableLeftFlyoutUnderToolbar) {\n\t\t\tif (this.props.enableRightFlyoutUnderToolbar) {\n\t\t\t\tlet templateCols = leftFlyoutIsOpen && leftFlyout ? \"auto \" : \"\";\n\t\t\t\ttemplateCols += \"1fr\"; // For topCenterBottom\n\t\t\t\ttemplateCols += this.props.rightFlyoutIsOpen ? \" auto\" : \"\";\n\n\t\t\t\tconst templateRows = this.props.toolbarIsOpen ? \"auto 1fr\" : \"1fr\";\n\n\t\t\t\tconst lowerPanels = (\n\t\t\t\t\t<div id={this.containingDivId} className=\"common-canvas-grid-horizontal\"\n\t\t\t\t\t\tstyle={{ gridTemplateColumns: templateCols }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{leftFlyout}\n\t\t\t\t\t\t{topCenterBottom}\n\t\t\t\t\t\t{rightFlyout}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t\tpanels = (\n\t\t\t\t\t<div className=\"common-canvas-grid-vertical\" style={{ gridTemplateRows: templateRows }}>\n\t\t\t\t\t\t{canvasToolbar}\n\t\t\t\t\t\t{lowerPanels}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\tconst templateColsMain = this.props.rightFlyoutIsOpen ? \"1fr auto\" : \"1fr\";\n\t\t\t\tconst templateRows = this.props.toolbarIsOpen ? \"auto 1fr\" : \"1fr\";\n\t\t\t\tconst templateCols = leftFlyoutIsOpen ? \"auto 1fr\" : \"1fr\";\n\n\t\t\t\tconst leftSideItems = (\n\t\t\t\t\t<div className=\"common-canvas-grid-vertical\" style={{ gridTemplateRows: templateRows }}>\n\t\t\t\t\t\t{canvasToolbar}\n\t\t\t\t\t\t<div id={this.containingDivId} className=\"common-canvas-grid-horizontal\"\n\t\t\t\t\t\t\tstyle={{ gridTemplateColumns: templateCols }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{leftFlyout}\n\t\t\t\t\t\t\t{topCenterBottom}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t\tpanels = (\n\t\t\t\t\t<div className=\"common-canvas-grid-horizontal\" style={{ gridTemplateColumns: templateColsMain }}>\n\t\t\t\t\t\t{leftSideItems}\n\t\t\t\t\t\t{rightFlyout}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\n\t\t} else {\n\t\t\tif (this.props.enableRightFlyoutUnderToolbar) {\n\t\t\t\tconst templateColsMain = leftFlyoutIsOpen ? \"auto 1fr\" : \"1fr\";\n\t\t\t\tconst templateRows = this.props.toolbarIsOpen ? \"auto 1fr\" : \"1fr\";\n\t\t\t\tconst templateCols = this.props.rightFlyoutIsOpen ? \"1fr auto\" : \"1fr\";\n\n\t\t\t\tconst rightSideItems = (\n\t\t\t\t\t<div className=\"common-canvas-grid-vertical\" style={{ gridTemplateRows: templateRows }}>\n\t\t\t\t\t\t{canvasToolbar}\n\t\t\t\t\t\t<div id={this.containingDivId} className=\"common-canvas-grid-horizontal\"\n\t\t\t\t\t\t\tstyle={{ gridTemplateColumns: templateCols }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{topCenterBottom}\n\t\t\t\t\t\t\t{rightFlyout}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t\tpanels = (\n\t\t\t\t\t<div className=\"common-canvas-grid-horizontal\" style={{ gridTemplateColumns: templateColsMain }}>\n\t\t\t\t\t\t{leftFlyout}\n\t\t\t\t\t\t{rightSideItems}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\tlet templateRows = \"\";\n\t\t\t\ttemplateRows += this.props.toolbarIsOpen ? \"auto\" : \"\";\n\t\t\t\ttemplateRows += \" 1fr\"; // For topCenterBottom panels <div>\n\n\t\t\t\tlet templateCols = leftFlyoutIsOpen && leftFlyout ? \"auto \" : \"\";\n\t\t\t\ttemplateCols += \"1fr\"; // For topCenterBottom\n\t\t\t\ttemplateCols += this.props.rightFlyoutIsOpen ? \" auto\" : \"\";\n\n\t\t\t\tconst centerItems = (\n\t\t\t\t\t<div className=\"common-canvas-grid-vertical\"\n\t\t\t\t\t\tstyle={{ gridTemplateRows: templateRows }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{canvasToolbar}\n\t\t\t\t\t\t<div id={this.containingDivId}>\n\t\t\t\t\t\t\t{topCenterBottom}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t\tpanels = (\n\t\t\t\t\t<div className=\"common-canvas-grid-horizontal\"\n\t\t\t\t\t\tstyle={{ gridTemplateColumns: templateCols }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{leftFlyout}\n\t\t\t\t\t\t{centerItems}\n\t\t\t\t\t\t{rightFlyout}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst dialogPalette = this.props.enablePaletteLayout === PALETTE_LAYOUT_DIALOG && this.props.paletteIsOpen\n\t\t\t? (<PaletteDialog canvasController={this.props.canvasController} containingDivId={this.containingDivId} />)\n\t\t\t: null;\n\n\t\tconst divClassName = this.generateClass();\n\n\t\treturn (\n\t\t\t<div className={divClassName} onDragOver={this.onDragOver} onDrop={this.onDrop}>\n\t\t\t\t{panels}\n\t\t\t\t{dialogPalette}\n\t\t\t\t{tip}\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nCommonCanvasPanels.propTypes = {\n\t// Provided by CommonCanvas\n\tcanvasController: PropTypes.object.isRequired,\n\n\t// Provided by Redux\n\tenableParentClass: PropTypes.string,\n\tenableEditingActions: PropTypes.bool,\n\tenablePaletteLayout: PropTypes.string,\n\tenableNarrowPalette: PropTypes.bool,\n\tenableLeftFlyoutUnderToolbar: PropTypes.bool,\n\tenableRightFlyoutUnderToolbar: PropTypes.bool,\n\ttoolbarIsOpen: PropTypes.bool,\n\tpaletteIsOpen: PropTypes.bool,\n\ttopPanelIsOpen: PropTypes.bool,\n\tbottomPanelIsOpen: PropTypes.bool,\n\tleftFlyoutIsOpen: PropTypes.bool,\n\trightFlyoutIsOpen: PropTypes.bool\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\tenableParentClass: state.canvasconfig.enableParentClass,\n\tenableEditingActions: state.canvasconfig.enableEditingActions,\n\tenablePaletteLayout: state.canvasconfig.enablePaletteLayout,\n\tenableNarrowPalette: state.canvasconfig.enableNarrowPalette,\n\tenableLeftFlyoutUnderToolbar: state.canvasconfig.enableLeftFlyoutUnderToolbar,\n\tenableRightFlyoutUnderToolbar: state.canvasconfig.enableRightFlyoutUnderToolbar,\n\tenableRightFlyoutDragToResize: state.canvasconfig.enableRightFlyoutDragToResize,\n\ttoolbarIsOpen: (state.canvasconfig.enableToolbarLayout !== PALETTE_LAYOUT_NONE),\n\tpaletteIsOpen: state.palette.isOpen,\n\ttopPanelIsOpen: state.toppanel.isOpen,\n\tbottomPanelIsOpen: state.bottompanel.isOpen,\n\tleftFlyoutIsOpen: state.leftflyout.isOpen,\n\trightFlyoutIsOpen: state.rightflyout.isOpen\n});\n\nexport default connect(mapStateToProps)(CommonCanvasPanels);\n","/*\n * Copyright 2017-2025 Elyra Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\nimport { Provider } from \"react-redux\";\nimport { injectIntl } from \"react-intl\";\nimport PropTypes from \"prop-types\";\nimport CommonCanvasPanels from \"./cc-panels.jsx\";\nimport Logger from \"../logging/canvas-logger.js\";\n\n\nclass CommonCanvas extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.logger = new Logger([\"CommonCanvas\"]);\n\t\tthis.logger.log(\"constructor\");\n\n\t\tthis.initializeController = this.initializeController.bind(this);\n\n\t\tprops.canvasController.setIntl(props.intl);\n\t\tthis.initializeController(props);\n\t}\n\n\tcomponentDidUpdate() {\n\t\tthis.logger.log(\"componentDidUpdate\");\n\t\tthis.initializeController(this.props);\n\t}\n\n\tinitializeController(props) {\n\t\tthis.logger.logStartTimer(\"initializeController\");\n\t\tprops.canvasController.setCanvasConfig(props.config);\n\t\tprops.canvasController.setContextMenuConfig(props.contextMenuConfig);\n\t\tprops.canvasController.setKeyboardConfig(props.keyboardConfig);\n\t\tprops.canvasController.setToolbarConfig(props.toolbarConfig);\n\t\tprops.canvasController.setNotificationPanelConfig(props.notificationConfig);\n\t\tprops.canvasController.setLeftFlyoutConfig(\n\t\t\t{ content: props.leftFlyoutContent, isOpen: props.showLeftFlyout });\n\t\tprops.canvasController.setRightFlyoutConfig(\n\t\t\t{ content: props.rightFlyoutContent, isOpen: props.showRightFlyout });\n\t\tprops.canvasController.setBottomPanelConfig(\n\t\t\t{ content: props.bottomPanelContent, isOpen: props.showBottomPanel });\n\t\tprops.canvasController.setTopPanelConfig(\n\t\t\t{ content: props.topPanelContent, isOpen: props.showTopPanel });\n\n\t\tprops.canvasController.setHandlers({\n\t\t\tcontextMenuHandler: props.contextMenuHandler,\n\t\t\tbeforeEditActionHandler: props.beforeEditActionHandler,\n\t\t\teditActionHandler: props.editActionHandler,\n\t\t\tclickActionHandler: props.clickActionHandler,\n\t\t\tdecorationActionHandler: props.decorationActionHandler,\n\t\t\ttipHandler: props.tipHandler,\n\t\t\tlayoutHandler: props.layoutHandler,\n\t\t\tidGeneratorHandler: props.idGeneratorHandler,\n\t\t\tselectionChangeHandler: props.selectionChangeHandler,\n\t\t\tactionLabelHandler: props.actionLabelHandler\n\t\t});\n\t\tthis.logger.logEndTimer(\"initializeController\");\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\treturn (\n\t\t\t<Provider store={this.props.canvasController.getStore()}>\n\t\t\t\t<CommonCanvasPanels canvasController={this.props.canvasController} />\n\t\t\t</Provider>\n\t\t);\n\t}\n}\n\nCommonCanvas.propTypes = {\n\tintl: PropTypes.object.isRequired,\n\tcanvasController: PropTypes.object.isRequired,\n\tconfig: PropTypes.object,\n\ttoolbarConfig: PropTypes.oneOfType([\n\t\tPropTypes.array,\n\t\tPropTypes.object\n\t]),\n\tnotificationConfig: PropTypes.object,\n\tcontextMenuConfig: PropTypes.object,\n\tkeyboardConfig: PropTypes.object,\n\tcontextMenuHandler: PropTypes.func,\n\tbeforeEditActionHandler: PropTypes.func,\n\teditActionHandler: PropTypes.func,\n\tclickActionHandler: PropTypes.func,\n\tdecorationActionHandler: PropTypes.func,\n\ttipHandler: PropTypes.func,\n\tlayoutHandler: PropTypes.func,\n\tidGeneratorHandler: PropTypes.func,\n\tselectionChangeHandler: PropTypes.func,\n\tactionLabelHandler: PropTypes.func,\n\trightFlyoutContent: PropTypes.object,\n\tshowRightFlyout: PropTypes.bool,\n\tbottomPanelContent: PropTypes.object,\n\tshowBottomPanel: PropTypes.bool,\n\ttopPanelContent: PropTypes.object,\n\tshowTopPanel: PropTypes.bool,\n\tshowLeftFlyout: PropTypes.bool,\n\tleftFlyoutContent: PropTypes.object\n};\n\nexport default injectIntl(CommonCanvas);\n"],"names":["_createForOfIteratorHelper","r","e","t","Symbol","iterator","Array","isArray","a","_arrayLikeToArray","toString","call","slice","constructor","name","from","test","_unsupportedIterableToArray","length","_n","F","s","n","done","value","f","TypeError","o","u","next","getFilteredNodeTypeInfosByCategory","category","filterStrings","filteredNodeTypeInfos","node_types","_step","_iterator","nodeType","occurrenceInfo","getOccurrences","push","err","_getCategoryLabelInfo","catLabel","_has","label","toLowerCase","_wordOccurrences","wordOccurrences","occurrences","hitCounts","catLabelOccurrences","catLabelHitCounts","getCategoryLabelInfo","_getNodeLabelInfo","nodeLabel","app_data","ui_data","_wordOccurrences2","nodeLabelOccurrences","nodeLabelHitCounts","getNodeLabelInfo","_getNodeDescInfo","desc","description","_wordOccurrences3","nodeDescOccurrences","nodeDescHitCounts","getNodeDescInfo","ranking","descHitCounts","filterStringsLength","multiStringHits","i","calcRanking","mainString","forEach","newOccurrences","searchString","start","index","count","indexOf","end","wordOccurrencesByString","addOccurrences","newOcc","handled","occ","outOccurrences","concat","sort","occ1","occ2","joinOccurrences","PaletteContentListItemBtn","_React$Component","_classCallCheck","this","arguments","_inherits","_createClass","key","less","props","intl","formatMessage","id","defaultMessage","defaultMessages","React","createElement","className","onClick","Component","injectIntl","SUPERNODE_ICON","SUPERNODE_EXT_ICON","PaletteContentListItem","_this","state","showFullDescription","ghostData","bind","showShortDescription","onDragStart","onDragEnd","onDoubleClick","onMouseOver","onMouseLeave","onMouseDown","onKeyDown","canvasController","closeTip","setFocusIndex","getGhostNode","nodeTypeInfo","ev","nodeTemplateDragStart","nodeTemplate","dataTransfer","setData","DND_DATA_TEXT","setDragImage","element","centerX","centerY","evt","KeyboardUtils","createAutoNode","stopPropagation","createAutoNodeNoLink","nextNodeInCategory","previousNodeInCategory","tabFocusOutOfPalette","tabOut","nodeTemplateDragEnd","allowClickToAdd","isDisplaySearchResult","buttons","displayTip","getHighlightedText","labelText","isLongDescription","_this$getAbbreviatedD","getAbbreviatedDescription","abbrDesc","elements","displayLen","substring","firstOccurrenceStart","remainder","offset","map","textToHighlight","highlightedElements","text","_this$props$nodeTypeI","paletteClass","palette_class_name","mainDivClass","isPaletteWide","setState","itemRef","current","focus","empty_text","openTip","op","type","TIP_TYPE_PALETTE_ITEM","targetObj","_this$props$nodeTypeI2","disabled","palette_disabled","isEditingEnabled","addLink","isItemDisabled","_this$props","itemText","_get","draggable","icon","ariaDisabled","image","palette_image","USE_DEFAULT_ICON","USE_DEFAULT_EXT_ICON","_typeof","isValidElement","endsWith","SVG","src","alt","getHighlightedLabel","isShowRanking","Icon","CANVAS_CARBON_ICONS","WARNING_UNFILLED","getMainDivClass","categoryLabel","getHighlightedCategoryLabel","getHighlightedDesc","createRef","ref","tabIndex","role","PaletteContentListItem$1","PaletteContentList$1","PaletteContentList","currentFocusIndex","contentItemRefs","idx","CanvasUtils","stopPropagationAndPreventDefault","contentItems","nodeTypeInfos","itemKey","width","PaletteFlyoutContentCategory$1","PaletteFlyoutContentCategory","onFocus","onKeyDownCategory","onHeadingClick","getTitleObj","openCategory","is_open","fromCategoryToFirstNode","pclRef","setFirstNode","closePaletteCategory","openPaletteCategory","loading_text","titleLoadingObj","InlineLoading","onSuccess","status","successDelay","AccordionItem","title","titleObj","content","getContent","open","itemImage","getItemImage","getItemText","catRef","get_1","substr","_this2","nt","TIP_TYPE_PALETTE_CATEGORY","getInlineLoadingRenderCategory","getRenderCategory","PaletteFlyoutContentSearch","searchOnClick","handleSearchStringChange","target","openPalette","placeHolder","Search","placeholder","onChange","size","PaletteFlyoutContentFilteredList","onKeyDownResults","tabOutOfOfPalette","noResultsFound","adjustSearch","isLastEntry","isShowingAllResults","isNodeTypeInfosArrayTruncated","resultsRestricted","getNoResultsDiv","getContentListDiv","logger","Logger","PaletteFlyoutContent$1","PaletteFlyoutContent","categories","getUniqueCategories","setSearchString","setSearchStringThrottled","_debounce","debounce_1","out","contentDivs","Accordion","logStartTimer","split","filter","kw","apply","_toConsumableArray","e1","e2","getFilteredNodeTypeInfos","logEndTimer","ss","paletteJSON","getFilteredContentDivs","getContentDivs","contentCategories","contentSearch","paletteHeader","PaletteFlyout","paletteNodes","Palette","convertNodeTemplate","log","Palette$1","connect","ownProps","palette","canvasconfig","enableEditingActions","enablePaletteHeader","enableSingleClickAddFromPalette","enablePaletteLayout","PALETTE_LAYOUT_NONE","PALETTE_LAYOUT_FLYOUT","isOpen","PaletteDialogTopbar$1","PaletteDialogTopbar","mouseDown","doubleClick","toolbarActionHandler","mouseDownEvent","mouseDownMethod","doubleClickEvent","windowMaximizeMethod","action","closePalette","showGridMethod","_this$props$canvasCon","labelUtil","gridLabel","getLabel","listLabel","closeLabel","config","leftBar","iconEnabled","Grid","enable","isSelected","showGrid","List","divider","rightBar","CloseOutline","Toolbar","instanceId","additionalText","overflowMenuLabel","ariaLabel","PaletteDialogContentCategory$1","PaletteDialogContentCategory","categorySelected","catSelEvent","categorySelectedMethod","style","selectedCategory","PaletteDialogContentCategories$1","PaletteDialogContentCategories","catDivs","PaletteDialogContentGridNode","currentTarget","has_1","txtClassName","PaletteDialogContentGridNode$1","PaletteDialogContentGrid$1","PaletteDialogContentGrid","gridNodes","nodeTypes","PaletteDialogContent$1","PaletteDialogContent","getSelectedCategory","firstChild","data","cats","nextProps","prevState","PaletteDialog","xPos","yPos","mouseDownOnTopBar","mouseDownOnPalette","mouseMove","mouseUp","windowResize","windowMaximize","getPaletteDiv","resizePalette","movePalette","setResizingCursors","setSizingHoverEdge","snapToWidth","snapToHeight","removePx","dragging","dragOffsetY","dragOffsetX","verticalSizingAction","verticalSizingHover","horizontalSizingAction","horizontalSizingHover","savedWidth","savedLeft","savedHeight","savedTop","hoverZoneSize","totalHoverZoneSize","adjustedWidth","adjustedHeight","adjustedScrollBarWidth","isMaximized","dialogPaletteDivRef","hackPaletteOffset","hackPaletteTopOffset","window","addEventListener","removeEventListener","canvasDiv","eventClientY","clientY","offsetTop","offsetHeight","eventClientX","clientX","offsetLeft","offsetWidth","_this$dialogPaletteDi","classOrId","property","firstChar","charAt","remaining","elem","document","getElementById","getElementsByClassName","getComputedStyle","getPropertyValue","paletteDiv","cursor","newHeight","newContentHeight","getStyleProperty","contentDiv","childNodes","height","newWidth","scrollDiv","clientHeight","scrollHeight","oldHeight","setContentDivHeight","containingDivId","newLeft","newTop","left","top","styleDimension","parseInt","minWidth","minHeight","getAdjustedMousePositionLeft","getAdjustedMousePositionRight","getAdjustedMousePositionTop","getAdjustedMousePositionBottom","gridNodeWidth","Math","round","gridHeight","PaletteDialogUnder","CommonCanvasTooltip","handleClick","direction","TIP_TYPE_NODE","TIP_TYPE_PORT","TIP_TYPE_DEC","TIP_TYPE_LINK","TIP_TYPE_STATE_TAG","customContent","getObjectModel","hasErrorMessage","node","ERROR","hasWarningMessage","WARNING","getPaletteNode","nodeTypeLabel","_isEmpty","isEmpty_1","port","decoration","tooltip","stateTagText","Tooltip","tip","mousePos","includes","CommonCanvasTooltip$1","CommonCanvasContextMenu","contextMenu","showContextMenu","ContextMenuWrapper","contextMenuDef","contextMenuActionHandler","contextMenuPos","closeContextMenu","CommonCanvasContextMenu$1","contextmenu","menuDef","source","cmPos","x","y","baseFindIndex","require$$0","_baseFindIndex","baseIteratee","require$$1","_baseIteratee","toInteger","require$$2","nativeMax","max","nativeMin","min","findLastIndex_1","array","predicate","fromIndex","undefined","CommonCanvasContextToolbar","onMouseEnter","colorClicked","closeContextToolbar","setMouseInContextToolbar","setTimeout","_ref","_this3","toolbarItems","overflowMenuItems","item","getMenuItem","menuItem","subPanelInfo","getSubPanelInfo","subMenu","subPanel","menu","getSubMenu","subPanelData","getEnable","_this4","ColorPicker","clickActionHandler","color","_this5","option","dividers","dividersCount","dividersWidth","overflowItemCount","items","findIndex","_findLastIndex","trimmedItems","outItems","previousDivider","editParam","setMouseInObject","CAUSE_KEYBOARD","objType","contextSource","targetObject","layout","contextToolbarPosition","is_expanded","containingDiv","divRect","getBoundingClientRect","bottom","right","rect","newX","newY","rightOver","leftOver","bottomOver","topOver","contextToolbar","cmItem","toolbarItem","removeUnnecessaryDividers","toolbarConfig","getToolbarConfig","toolbarWidth","getContextToolbarWidth","pos","shouldCenterJustifyToolbar","CM_ICON_SIZE","_this$adjustPosToFit","adjustPosToFit","setInitialFocus","cause","getInstanceId","tooltipDirection","closeToolbarOnEsc","closeToolbar","CommonCanvasContextToolbar$1","CommonCanvasTextToolbar","returnToTextEditing","focusOnTextEntryElement","preventDefault","labelId","substituteObj","defaultMessages1","defaultToolbarMessages","shortcutSuffix","shortcutSuffix2","osKey","isMacintosh","shortCut","shortCut2","boldLabel","getJsxLabel","italicsLabel","strikethroughLabel","headerLabel","codeLabel","linkLabel","quoteLabel","numberedListLabel","bulletedListLabel","closeSubAreaOnClick","TextScale","TextBold","TextItalic","TextStrikethrough","Code","Link","TextIndentMore","ListNumbered","ListBulleted","underlineLabel","subMenuFont","subMenuTextSize","subMenuAlignHorizontal","TextAlignLeft","TextAlignCenter","TextAlignRight","subMenuAlignVertical","AlignBoxTopCenter","AlignBoxMiddleCenter","AlignBoxBottomCenter","subMenuOutline","setSelectedMenuElement","formats","selectedTextColor","getFormatValue","selectedBackgroundColor","boldSelected","Boolean","getFormatType","italicsSelected","textDec","underlineSelected","strikethroughSelected","TextFont","TextUnderline","TextColor","WYSIWYG","selectedColor","actionHandler","ColorPalette","SquareOutline","me","format","find","contentType","MARKDOWN","getMarkdownToolbar","getWysiwygToolbar","textToolbar","pos_x","pos_y","onBlur","blurHandler","getTextToolbarConfig","texttoolbar","CommonCanvasStateTag","tipText","stateTagType","STATE_TAG_LOCKED","STATE_TAG_READ_ONLY","stateTag","getStateTag","Locked","EditOff","xhtml","namespaces","svg","xlink","xml","xmlns","namespace","prefix","hasOwnProperty","space","local","creatorInherit","ownerDocument","uri","namespaceURI","documentElement","createElementNS","creatorFixed","fullname","creator","none","selector","querySelector","empty","selectorAll","querySelectorAll","matcher","matches","childMatcher","prototype","childFirst","firstElementChild","children","sparse","update","EnterNode","parent","datum","_next","_parent","__data__","bindIndex","group","enter","exit","groupLength","dataLength","bindKey","keyValue","nodeByKeyValue","Map","keyValues","has","set","get","delete","arraylike","ascending","b","NaN","attrRemove","removeAttribute","attrRemoveNS","removeAttributeNS","attrConstant","setAttribute","attrConstantNS","setAttributeNS","attrFunction","v","attrFunctionNS","defaultView","styleRemove","removeProperty","styleConstant","priority","setProperty","styleFunction","styleValue","propertyRemove","propertyConstant","propertyFunction","classArray","string","trim","classList","ClassList","_node","_names","getAttribute","classedAdd","names","list","add","classedRemove","remove","classedTrue","classedFalse","classedFunction","textRemove","textContent","textConstant","textFunction","htmlRemove","innerHTML","htmlConstant","htmlFunction","raise","nextSibling","parentNode","appendChild","lower","previousSibling","insertBefore","constantNull","removeChild","selection_cloneShallow","clone","cloneNode","selection_cloneDeep","onRemove","typename","on","__on","j","m","listener","options","onAdd","event","contextListener","dispatchEvent","params","CustomEvent","createEvent","initEvent","bubbles","cancelable","detail","dispatchConstant","dispatchFunction","child","join","splice","contains","root","Selection","groups","parents","_groups","_parents","selection","select","subgroups","subnode","subgroup","selectAll","arrayAll","selectChild","match","childFind","selectChildren","childrenFilter","enterGroup","updateGroup","previous","i0","i1","_enter","_exit","onenter","onupdate","onexit","append","merge","order","context","groups0","groups1","m0","m1","merges","group0","group1","compareDocumentPosition","compare","compareNode","sortgroups","sortgroup","callback","nodes","each","attr","getAttributeNS","classed","html","create","insert","before","deep","typenames","parseTypenames","dispatch","nextId","Local","_","sourceEvent","pointer","ownerSVGElement","createSVGPoint","point","matrixTransform","getScreenCTM","inverse","clientLeft","clientTop","pageX","pageY","events","touches","baseForOwn","_baseForOwn","castFunction","forOwn_1","object","iteratee","_basePropertyOf","escapeHtmlChar","reUnescapedHtml","reHasUnescapedHtml","RegExp","_escape","replace","responseBlob","response","ok","Error","statusText","blob","responseArrayBuffer","arrayBuffer","EOL","EOF","objectConverter","columns","Function","JSON","stringify","inferColumns","rows","columnSet","Object","row","column","pad","formatDate","date","year","hours","getUTCHours","minutes","getUTCMinutes","seconds","getUTCSeconds","milliseconds","getUTCMilliseconds","isNaN","getUTCFullYear","getUTCMonth","getUTCDate","dsvFormat","delimiter","reFormat","DELIMITER","charCodeAt","parseRows","N","I","eof","eol","token","c","preformatBody","formatValue","formatRow","Date","parse","convert","customConverter","formatBody","formatRows","csvParse","dsv","tsvParse","responseText","input","init","fetch","then","dsvParse","csv","tsv","responseJson","json","parser","DOMParser","parseFromString","Promise","resolve","reject","Image","onerror","onload","SvgCanvasDisplay","isSubflow","pipelineId","breadcrumbs","isDisplayingCurrentPipeline","displayState","NODE_ELEMENT_ORDER","SvgCanvasNodes","canvasLayout","nodeGrp","newElementClass","_NODE_ELEMENT_ORDER$g","newElementIndex","getNextChildElement","found","shouldChildComeAfter","targetOrder","x_pos","y_pos","isExpandedSupernode","getMessageLabelClass","messages","lineTypeClass","labelSingleLine","justificationClass","labelAlign","iconPath","getMessageLevel","NODE_ERROR_ICON","NODE_WARNING_ICON","messageLevel","_step2","_iterator2","message","labelClass","supernodeImagePosX","supernodeImageWidth","getElementPosX","imagePosX","imagePosition","imageWidth","supernodeImagePosY","supernodeImageHeight","getElementPosY","imagePosY","imageHeight","supernodeLabelPosX","labelPosX","labelPosition","labelWidth","supernodeLabelPosY","labelPosY","supernodeErrorPosX","supernodeLabelHeight","labelHeight","spanObj","zoomScale","fullLabelOnHover","getNodeLabelEditIconPosX","getNodeLabelEditIconPosY","getNodeLabelHoverWidth","getNodeLabelWidth","posX","getNodeLabelHoverPosX","getNodeLabelPosX","spanWidth","halfLabelWidth","xOffsetFromStart","getNodeLabelPosY","calcHeight","TEXT_AREA_BORDER_ADJUSTMENT","getNodeLabelHeight","getNodeEllipsisPosX","getNodeEllipsisPosY","supernodeEllipsisWidth","ellipsisWidth","supernodeEllipsisHeight","ellipsisHeight","getNodeEllipsisWidth","ellipsisHoverAreaPadding","getNodeEllipsisHeight","supernodeEllipsisPosX","ellipsisPosX","ellipsisPosition","supernodeEllipsisPosY","ellipsisPosY","supernodeExpansionIconPosX","supernodeExpansionIconPosY","errorXPos","errorPosition","supernodeErrorPosY","errorYPos","supernodeErrorWidth","errorWidth","supernodeErrorHeight","errorHeight","posInfo","xOffset","position","Number","yOffset","startsWith","nodeId","ports","subflow_node_ref","cx","supernodeSVGAreaPadding","cy","SvgCanvasUtilsComments","com","htmlString","searchStr","body","getElementsByTagName","innerText","regex","matchAll","elementInfos","searchForElementInfos","insertMarkElements","outerHTML","searchStart","searchEnd","runStart","textStart","textEnd","Node","TEXT_NODE","_node$textContent","textLen","splitStart","splitEnd","ELEMENT_NODE","elementInfo","parentElement","markElement","node1","createTextNode","replaceChild","node2","node3","CLOCKWISE","ANTI_CLOCKWISE","SvgCanvasLinks","nodeUtils","commentUtils","srcComment","endPos","getOuterCoord","linkGap","getCommentCenterPosX","getCommentCenterPosY","originInfo","originX","originY","drawNodeLinkLineFromTo","isExpanded","_this$getCenterOffset","getCenterOffset","getNodeCenterPosX","getNodeCenterPosY","getNodeImageCenterPosX","getNodeImageCenterPosY","link","srcObj","srcPortId","trgNode","trgPortId","assocLinkVariation","NODE_LINK","linkMethod","LINK_METHOD_FREEFORM","getNodeLinkCoordsForFreeform","getNodeLinkCoordsForPortsConnection","ASSOCIATION_LINK","enableAssocLinkType","ASSOC_RIGHT_SIDE_CURVE","getAssociationCurveLinkCoords","getAssociationLinkCoords","getCommentLinkCoords","srcNode","srcCenterX","srcCenterY","trgCenterX","trgCenterY","x1","y1","x2","y2","selfRefLink","linkType","LINK_TYPE_STRAIGHT","srcFreeformInfo","_this$getCenterOffset2","trgFreeformInfo","_this$getCenterOffset3","dir","EAST","WEST","SOUTH","NORTH","srcDir","trgDir","startPos","parts","len","getYPosForCenterOffset","getXPosForCenterOffset","srcX","srcY","trgX","trgY","outputs","srcPort","output","getNodePortPosX","outputPortPositions","getNodePortPosY","getPortDir","inputs","trgPort","inputPortPositions","ASSOC_VAR_CURVE_RIGHT","ASSOC_VAR_CURVE_LEFT","ASSOC_VAR_DOUBLE_BACK_LEFT","drawCommentLinkLineTo","links","coordsUpdated","pathInfo","getConnectorPathInfo","drawingNewLinkMinInitialLine","minInitialLine","getMinInitialLine","getStraightPath","getNodeLinkPathInfo","getAssociationCurvePath","COMMENT_LINK","minInitialLineForElbow","inLink","topSrc","topTrg","bottomSrc","bottomTrg","rotateData90Degrees","getRotatedTrgDir","saveSrcDir","getPathInfo","rotateElements90Degrees","centerPoint","rotatePoint90Degrees","path","createPath","antiClockwise","newPoint1","newPoint2","_objectSpread","newPoint","el","p","x3","y3","srcNodeId","trgNodeId","selfRefLinkPath","centerDragPos","getStraightPathForCenterDrag","xDiff","yDiff","angle","calculateAngle","topInc","rightInc","getCurveLeftPath","getDoubleBackLeft","ASSOC_VAR_DOUBLE_BACK_RIGHT","getDoubleBackRight","getCurveRightPath","corner1X","getCurveOutPath","corner1Y","corner2X","corner2Y","getDoubleBack","getCenterPointCubicBezier","minFinalLine","getPathInfoEN","getPathInfoES","getPathInfoEE","getPathInfoEW","wrapAroundNodePadding","corner1","corner2","minXDiff","get3PartLink","corner3","corner4","midY","calculateMidY","get5PartLink","get2PartLink","get4PartLink","maxBottom","srcBottomInc","trgBottomInc","minTop","wrapAroundSpacing","LINK_TYPE_ELBOW","get2PartElbow","get2PartStraight","LINK_TYPE_PARALLAX","get2PartParallax","get2PartCurve","get3PartElbow","get3PartStraight","get3PartParallax","get3PartCurve","get4PartElbow","get4PartStraight","get4PartParallax","get4PartCurve","get5PartElbow","get5PartStraight","get5PartParallax","get5PartCurve","elbowSizeY","elbowSize","c1ElbowSizeX","c1ElbowSizeY","adjustElbowSize","c2ElbowSizeX","c3ElbowSizeY","c4ElbowSizeX","val1","val2","diff","abs","yInc","corner0","corner2a","xInc","getCenterPointQuadBezier","corner1a","xSeparation","corner2b","corner3a","SvgCanvasDecs","decorations","nd","dec","label_single_line","label_align","getDecClass","d","rotate","getDecRotateTransform","getDecPosX","getDecPosY","getLinkEndAngle","FLOW_OUT","FLOW_IN","DEC_LINK","getLinkDecPosX","getNodeDecPosX","decoratorLeftX","decoratorCenterX","decoratorRightX","sourcePoint","targetPoint","distance","angleInRadians","PI","cos","getDecWidth","getLinkDecPosY","getNodeDecPosY","decoratorTopY","decoratorMiddleY","decoratorBottomY","sin","obj","outline","linkDecoratorPadding","decoratorPadding","linkDecoratorWidth","decoratorWidth","linkDecoratorHeight","decoratorHeight","inClassName","class_name","getDecLabelEditIconPosX","getDecLabelEditIconPosY","getDecLabelWidth","linkDecoratorLabelWidth","decoratorLabelWidth","linkDecoratorLabelHeight","decoratorLabelHeight","getDecLabelHeight","process","env","NODE_ENV","createRoot","hydrateRoot","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","usingClientEntryPoint","SvgCanvasExternal","renderer","ren","version","foreignObjects","pipeline","jsx","nodeExternalObject","nodeData","pipelineData","externalUtils","renderExternalObject","container","isReact18OrHigher","ccExtRoot","render","ReactDOM","unmount","unmountComponentAtNode","activePipeline","getNodes","getNode","info","k","zoomUtils","getZoomScale","inputPositions","inputPos","inp","outputPositions","outputPos","displayMovedLinks","newProps","np","displayNodes","raiseNodeToTopById","_unescapeHtmlChar","toString_1","unescapeHtmlChar","reEscapedHtml","reHasEscapedHtml","_unescape","inStart","inEnd","mdObj","findFirstSpace","findLastSpace","allWhiteSpace","findFirstNonSpace","findLastNonSpace","processHeaderCommand","processWrapCommand","processCodeCommand","processLinkCommand","processMultiLineCommand","processReturnCommand","spacePos","lastIndexOf","newLinePos","newStart","newEnd","findPrecedingNewLine","findSucceedingNewLine","startText","selectedText","endText","newText","tempText","hashCount","getHashCount","firstSpace","headerSyntax","getHeaderSyntax","chars","charsCount","processTripleBackTicks","isMultiLineMarkdown","removeMultiLineMarkdown","addMultiLineMarkdown","every","line","isMultiLineItem","number","getPrefixNumber","firstText","lines","newLine","removeListPrefix","getListPrefix","suffixText","preStart","sucEnd","originalStart","originalEnd","isCursorAtBeginningOfLine","insertMultiLineItem","newEndText","renumberEndText","char","startIndex","finished","renumberLine","d3","assign","d3Selection","WHITE","BLACK","SvgCanvasTextArea","dispUtils","decUtils","removeTempCursorOverlay","displayCommentsCallback","displayLinksCallback","getCommentToolbarPosCallback","addCanvasZoomBehavior","removeCanvasZoomBehavior","editingText","editingTextId","addingTextToTextArea","textAreaHeight","parentDomObj","editingTextData","singleLine","maxCharacters","allowReturnKey","textCanBeEmpty","autoSize","newFormats","_cloneDeep","keyboardInputCallback","enableMarkdownInComments","commentKeyboardHandler","autoSizeCallback","autoSizeComment","saveTextChangesCallback","saveCommentChanges","closeTextAreaCallback","closeCommentTextArea","displayEditableComment","isDisplayingFullPage","openTextToolbar","wysiwygActionHandler","blurInTextToolbar","markdownActionHandler","d3Event","getMarkdownAction","relatedTarget","getParentElementWithClass","completeEditing","boldCommand","italicsCommand","strikethroughCommand","numberedListCommand","bulletedListCommand","codeCommand","linkCommand","quoteCommand","incHashesCommand","decHashesCommand","returnCommand","textDiv","getSelectionPositions","SvgCanvasMarkdown","processMarkdownAction","addTextToTextArea","addReplaceFormat","addAdditionalFormat","setTextColorAppropriately","toggleFormat","updateTextToolbarFormats","backgroundColor","textColorFormat","hasFormat","isDark","isDarkColor","removeFormat","addFormat","_this$editingTextData","_CanvasUtils$convertF","convertFormat","field","setWysiwygStyle","_CanvasUtils$convertF2","_CanvasUtils$convertF3","_this$editingTextData2","commentEntry","foreignObjectComment","commentEntryElement","selectNodeContents","execCommand","selectNodeRange","textArea","foreignObjectLabel","getComment","commentHasScrollableText","taData","comment","editType","editSource","editActionHandler","closeTextToolbar","displayDiv","displayDivStyle","labelMaxCharacters","labelAllowReturnKey","getNodeLabelTextAreaPosX","getNodeLabelTextAreaPosY","getNodeLabelTextAreaWidth","getNodeLabelTextAreaHeight","getNodeLabelTextAreaClass","autoSizeMultiLineLabel","saveNodeLabelChanges","closeEntryTextArea","displayEditableLabel","label_max_characters","label_allow_return_key","getDecLabelTextAreaPosX","getDecLabelTextAreaPosY","getDecLabelTextAreaWidth","getDecLabelTextAreaHeight","getDecLabelTextAreaClass","objId","saveDecLabelChanges","decId","attachTextEntryListeners","setSelectionRange","textContentSaved","saveAndCloseTextArea","newValue","closeTextArea","areFormatsTheSame","restoreFocus","f1","f2","f1Obj","formatArrayIncludes","f2Array","f2Obj","_isMatch","keyCode","isMetaKey","commentTexts","commentElement","applyOutlineStyle","getContentEditableValue","applyNonOutlineStyle","_data$text","setCursor","scrollIntoView","behavior","block","navigator","userAgent","posEnd","range","createRange","sel","getSelection","setStart","setEnd","collapse","removeAllRanges","addRange","textEntrySel","completeTextEntry","cancelTextEntry","textAreaEscKeyPressed","resetHeightOfTextDisplay","textAreaAllowedKeys","noop","Dispatch","types","T","copy","that","args","nonpassive","passive","nonpassivecapture","capture","nopropagation","stopImmediatePropagation","noevent$1","dragDisable","view","noevent","__noselect","MozUserSelect","yesdrag","noclick","constant$2","DragEvent","subject","identifier","active","dx","dy","defineProperties","enumerable","configurable","defaultFilter","ctrlKey","button","defaultContainer","defaultSubject","defaultTouchable","maxTouchPoints","mousedownx","mousedowny","mousemoving","touchending","touchable","gestures","listeners","clickDistance2","drag","mousedowned","touchstarted","touchmoved","touchended","gesture","beforestart","mousemoved","mouseupped","nodrag","mouse","changedTouches","clearTimeout","touch","p0","constant","clickDistance","sqrt","d3Drag","SVGCanvasUtilsDragObjects","resizeObjInitialInfo","commentSizing","commentSizingDirection","commentSizingCursor","nodeSizing","nodeSizingDirection","nodeSizingCursor","nodeSizingObjectsInfo","nodeSizingDetLinksInfo","notSnappedXPos","notSnappedYPos","notSnappedWidth","notSnappedHeight","movingObjectData","existingNodeInsertableIntoLink","existingNodeAttachableToDetachedLinks","dragObjectHandler","dragStartObject","dragObject","dragEndObject","isNodeResizable","isRegionSelectOrSizingInProgress","cursorType","isPointerCloseToBodyEdge","getSizingDirection","nodeCornerResizeArea","getCursorBasedOnDirection","addTempCursorOverlay","commentCornerResizeArea","_this$getMoveIncremen","getMoveIncrements","endMove","isMoving","startObjectsMoving","pagePos","convertCanvasCoordsToPageCoords","moveObjects","endObjectsMoving","_this$getMoveIncremen2","endSize","isSizing","getObjectTypeName","initializeResizeVariables","resizeNode","resizeComment","endNodeSizing","endCommentSizing","closeContextMenuIfOpen","shiftKey","resizeObj","getTransformedMousePos","rightEdge","bottomEdge","rightEdgeState","bottomEdgeState","cornerResizeArea","xPart","yPart","transPos","oldSupernode","getMinHeight","getMinWidth","delta","resizeObject","enableMoveNodesOnSupernodeResize","objectsInfo","moveSurroundingObjects","getNodesAndComments","linksInfo","moveSurroundingDetachedLinks","displayMovedComments","displayMovedNodes","displaySingleNode","displayCanvasAccoutrements","isDisplayingSubFlow","displayBindingNodesToFitSVG","superRenderers","displaySVGToFitSupernode","displaySingleComment","canvasObj","incrementX","incrementY","incrementWidth","incrementHeight","enableSnapToGridType","SNAP_TO_GRID_DURING","snapToGrid","snapToGridXPx","snapToGridYPx","SNAP_TO_GRID_AFTER","snapToGridObject","restrictNodeSizingToMinimums","defaultNodeHeight","defaultNodeWidth","isResized","resizeWidth","resizeHeight","detachedLinksInfo","commentSizingObjectsInfo","minHt","inputPortsHeight","outputPortsHeight","supernodeTopAreaHeight","supernodeMinHeight","supernodeMinWidth","_this$movingObjectDat","offsetX","offsetY","runningX","runningY","objects","getMoveObjects","isObjectMovable","startX","startY","switchIsMovingClass","isExistingNodeInsertableIntoLink","startNodeInsertingInLink","setNodeTranslucentState","setDataLinkSelectionAreaWider","isExistingNodeAttachableToDetachedLinks","startNodeAttachingToDetachedLinks","pagePosX","pagePosY","isDisplayingSubFlowInPlace","increment","stgPos","snapToGridMovedNode","enableLinkSelection","LINK_SELECTION_DETACHABLE","getSelectedLinks","srcPos","trgPos","enableDragWithoutSelect","isTinyMovement","getLinkAtMousePos","isLinkFullyAttached","setInsertNodeIntoLinkHighlighting","ghostArea","getAttachableLinksForNodeAtPos","setDetachedLinkHighlighting","augment","selectObject","SINGLE_CLICK","finalOffset","dragOverLink","dragOverDetachedLinks","detachedLinks","getSelectedDetachedLinks","unsetNodeTranslucentState","unsetInsertNodeIntoLinkHighlighting","unsetDetachedLinkHighlighting","getSelectedNodesAndComments","enableMoveNodesInComment","isComment","objsInComment","concatUniqueBasedOnId","objs","isNode","getNodeGroupSelectionById","getCommentGroupSelectionById","enableInsertNodeDroppedOnLink","hasInputAndOutputPorts","isNodeDefaultPortsCardinalityAtMax","snapToGridPosition","inResizeObj","SVGCanvasUtilsDragLink","isDraggingLink","dragLinkHandler","dragLinkStart","dragLink","dragLinkEnd","getLink","displayLinks","raiseLinkToTopById","nodeNearMouse","getNodeNearMousePos","nodeProximity","targetNode","isNodeAttachableToDefaultPorts","linkAlreadyExists","highlight","setHighlightingOverNode","setLinkOverNodeCancel","quadInOut","cubicInOut","polyIn","custom","pow","exponent","polyOut","polyInOut","pi","halfPi","sinInOut","tpmt","expInOut","circleInOut","b1","b2","b3","b5","b6","b8","b0","bounceOut","overshoot","backIn","backOut","backInOut","tau","elasticIn","asin","amplitude","period","elasticOut","elasticInOut","d3Ease","SVGCanvasUtilsDragNewLink","drawingNewLinkData","dragNewLinkHandler","dragStartNewLink","dragMoveNewLink","dragEndNewLink","isEventForOutputPort","getNodeForPort","startOutputPortNewLink","isEventForInputPort","startInputPortNewLink","startCommentNewLink","drawNewLink","completeNewLink","targetContainsClass","_d3Event$sourceEvent","_d3Event$sourceEvent2","commentHighlightGap","linkArray","enableAssocLinkCreation","portIndex","getPortIndex","portFlow","portDisplayInfo","getPortDisplayInfo","inputPortDisplayObjects","portGuideInfo","inputPortGuideObjects","portRadius","getPortRadius","isSrcCardinalityAtMax","outputPortDisplayObjects","outputPortGuideObjects","enableHighlightUnavailableNodes","setUnavailableTargetNodesHighlighting","drawNewCommentLink","drawNewNodeLink","enableHighlightNodeOnNewLinkDrag","setNewLinkOverNode","linkUtils","getNewStraightCommentLinkStartPos","connectionLineSel","nodesLinksGrp","connectionGuideSel","commentPortRadius","commentLinkArrowHead","connectionArrowHeadSel","getArrowHead","getArrowHeadTransform","linkCategory","srcNodePortId","getDetachedLinkObj","addConnectionPaths","getNewLinkAssocVariation","connectionStartSel","isPointInNodeBoundary","removeNewLinkLine","transform","LINK_METHOD_PORTS","tag","PORT_DISPLAY_CIRCLE","startSel","guideSel","getLinkImageTransform","updatePort","removeNewLink","clickType","objectType","selectedObjectIds","getSelectedObjectIds","unsetUnavailableNodesHighlighting","getMousePosFromEvent","getNodeAtPos","createNewLinkFromDragData","stopDrawingNewLink","completeNewDetachedLink","getInputNodePortId","createNewNodeLink","createNewAssocLink","createNewCommentLink","selNodes","getSelectedNodes","selComments","getSelectedComments","getDefaultOutputPortId","getDefaultInputPortId","setSelections","isDataConnectionAllowed","enableSelfRefLinks","portId","targetNodes","clearConnectFromStatus","enableLinkReplaceOnNewConnection","isDataLinkReplacementAllowed","linksToTrgPort","getDataLinksConnectedTo","replaceLink","isAssocConnectionAllowed","isCommentLinkConnectionAllowed","endPoint","stopDrawingNewLinkForPorts","_drawingNewLinkData$l","saveX1","saveY1","saveX2","saveY2","saveNewLinkData","newPath","duration","LINK_TYPE_CURVE","transition","_saveNewLinkData$port","_saveNewLinkData$port2","ease","easeElastic","removeExternalObject","highlightState","isNewLinkAllowedToNode","trgNodePortId","srcObjId","SVGCanvasUtilsDragDetLink","draggingLinkData","dragDetLinkHandler","dragStartDetLinkHandle","dragMoveDetLinkHandle","dragEndDetLinkHandle","startHandleMoving","moveHandle","completeDraggedDetLink","handleSelection","oldLink","linkGrpSelector","getLinkGroupSelectionById","lineInfo","linkGrpSelection","endBeingDragged","lnk","setUnavailableSourceNodesHighlighting","isDragging","restoreFocusToSubObject","pos2","setDetachedLinkOverNode","newLink","getNewLinkOnDrag","editSubType","getLinkEditSubType","snapBackOldLink","getNodeNearPos","isDetLinkConnectionAllowedToNearbyNode","getOutputNodePortId","canUpdateLink","linkSrcChanged","hasLinkSrcChanged","linkTrgChanged","hasLinkTrgChanged","allowed","isSrcConnectionAllowedWithDetachedLinks","isTrgConnectionAllowedWithDetachedLinks","isConnectionAllowedWithDetachedLinks","linkUpdated","define","factory","extend","definition","Color","darker","brighter","reI","reN","reP","reHex","reRgbInteger","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","color_formatHex","rgb","formatHex","color_formatRgb","formatRgb","l","exec","rgbn","Rgb","rgba","hsla","g","opacity","rgb_formatHex","hex","rgb_formatRgb","clampa","clampi","h","Hsl","hslConvert","clamph","clampt","hsl2rgb","m2","channels","displayable","formatHex8","formatHsl","clamp","constant$1","gamma","nogamma","exponential","linear","interpolateRgb","rgbGamma","colorRgb","interpolateNumber","reA","reB","interpolateString","am","bm","bs","bi","lastIndex","q","one","zero","svgNode","degrees","identity","translateX","translateY","skewX","scaleX","scaleY","decompose","atan2","atan","interpolateTransform","pxComma","pxParen","degParen","pop","xa","ya","xb","yb","translate","scale","interpolateTransformCss","DOMMatrix","WebKitCSSMatrix","isIdentity","interpolateTransformSvg","baseVal","consolidate","matrix","cosh","exp","taskHead","taskTail","interpolateZoom","zoomRho","rho","rho2","rho4","zoom","p1","S","ux0","uy0","w0","ux1","uy1","w1","d2","d1","r0","r1","coshr0","sinh","SQRT2","_1","_2","frame","timeout","interval","clockLast","clockNow","clockSkew","clock","performance","now","setFrame","requestAnimationFrame","clearNow","Timer","_call","_time","timer","delay","time","restart","wake","timerFlush","t0","t2","t1","Infinity","sleep","nap","poke","clearInterval","setInterval","elapsed","stop","emptyOn","emptyTween","schedule","timing","schedules","__transition","self","tween","tick","interrupt","tweenRemove","tween0","tween1","tweenFunction","tweenValue","_id","interpolate","value1","string00","interpolate0","string1","string0","string10","attrTweenNS","attrInterpolateNS","_value","attrTween","attrInterpolate","delayFunction","delayConstant","durationFunction","durationConstant","Transition","_name","newId","selection_prototype","inherit","id0","id1","on0","on1","sit","onFunction","styleTween","styleNull","listener0","styleMaybeRemove","styleInterpolate","textTween","textInterpolate","removeFunction","easeConstant","easeVarying","cancel","defaultTiming","easeCubicInOut","ZoomEvent","Transform","applyX","applyY","invert","location","invertX","invertY","rescaleX","domain","rescaleY","__zoom","defaultExtent","SVGElement","hasAttribute","viewBox","clientWidth","defaultTransform","defaultWheelDelta","deltaY","deltaMode","defaultConstrain","extent","translateExtent","dx0","dx1","dy0","dy1","touchstarting","touchfirst","constrain","wheelDelta","scaleExtent","tapDistance","trackpad","preventBackGesture","wheeled","dblclicked","gesturestart","gesturechange","gestureend","centroid","w","clean","__zooming","Gesture","taps","_len","_key","wheel","safariPinchZoom","wheelTransX","wheelTransY","deltaX","_len2","_key2","moved","x0","y0","dragEnable","_len3","_key3","k1","_len4","_key4","started","touch0","touch1","_len5","_key5","l0","l1","dp","dl","_len6","_key6","hypot","collection","scaleBy","scaleTo","translateBy","translateTo","emit","d3Zoom","SVGCanvasUtilsZoom","minScaleExtent","maxScaleExtent","contextMenuClosedOnZoom","textEditingClosedOnZoom","regionSelect","zoomStartPoint","previousD3Event","zoomCanvasDimensions","regionStartTransformX","regionStartTransformY","zoomTransform","zoomIdentity","zooming","zoomingAction","spaceKeyPressed","zoomHandler","enableInteractionType","INTERACTION_TRACKPAD","zoomStart","zoomAction","zoomEnd","zoomObject","animateTime","at","zoomCanvasInvokeZoomBehavior","z","getZoomTransform","newScale","canvasSVG","factor","newMaxExtent","resetCanvasSVGBehaviors","transformPosX","transformPosY","posY","vpRect","elRect","svgRect","transPad","isContextMenuDisplayed","svgCanvasTextArea","isEditingText","isRegionSelectActivated","addingCursorOverlay","isDragActivated","getCanvasDimensions","drawRegionSelector","zoomCanvasBackground","repositionCommentToolbar","zoomChanged","zoomEndRegionSelect","zoomSave","zoomClick","resetCanvasCursor","INTERACTION_CARBON","isSpaceKeyPressed","INTERACTION_MOUSE","removeRegionSelector","_this$getRegionDimens","getRegionDimensions","selections","getObjectsInRegion","setSelectionInfo","canvasGrp","region","LINK_SELECTION_NONE","isDisplayingPrimaryFlowFullPage","incTransform","getTransformIncrement","zoomConstrainRegular","getViewportDimensions","canvasBackground","clearSelections","newTransform","viewPort","canvasDimensions","canv","convertRectAdjustedForScaleWithPadding","getZoomToFitPadding","rightOffsetLimit","leftOffsetLimit","bottomOffsetLimit","topOffsetLimit","newZoom","getSavedZoom","enablePanIntoViewOnOpen","canvWithPadding","getCanvasDimensionsWithPadding","initialPanX","initialPanY","newZoomTransform","isFinite","zoomHasChanged","getZoomToFit","viewPortDimensions","xRatio","yRatio","objectIDs","transformedSVGRect","getTransformedViewportDimensions","comments","getComments","getLinks","xPosInt","yPosInt","paddingForInputBinding","getMaxPaddingForConnectionsFromInputBindingNodes","paddingForOutputBinding","getMaxPaddingForConnectionsToOutputBindingNodes","maxPadding","isSupernodeInputBinding","nodePadding","getNodePaddingToTargetNodes","outputBindingNodes","isSupernodeOutputBinding","getTransformedRect","viewportDimensions","dims","getParentSupernodeSVGDimensions","gap","padding","zoomToFitPadding","newPadding","getMaxZoomToFitPaddingForConnections","supernodeBindingPortRadius","SVGCanvasUtilsAccessibility","ap","initialize","tabObjects","createTabObjectsArray","removeGrpProperties","objGroups","getObjectGroups","entryComments","getEntryComments","entryLinks","getEntryLinks","entryNodes","getEntryNodes","entryNodesForLoops","getEntryNodesForLoops","tabGroups","sortTabGroups","grp","canvasInfo","hideComments","solitaryComments","commentHasLinks","sc","nodeHasInputLinks","nodeHasAssocLinks","en","loopEntryNodes","og","loopEntryNode","getLoopEntryNode","nodeGroup","entryNode","grpNumber","getNodesInGroup","inputLinks","getInputDataLinks","outputLinks","getOutputDataLinks","outLink","assocLinks","getAssociationLinks","assocLink","commentLinks","getCommentLinks","comLink","srcNodes","getSrcNodes","trgNodes","getTrgNodes","assocNodes","getAssocNodes","connComments","getConnectedComments","assocNode","connComment","_this6","_this7","_this8","_this9","connectedComments","commentLink","tg1","tg2","getTagGroupYCoord","getTagGroupXCoord","tg","getLinksToNode","getAssocLinksForNode","getLinksFromComment","focusObj","CANVAS_FOCUS","localObj","getLocalObject","findLastIndex","_this0","linkInfos","getLinksFromNode","_this1","_this10","navObject","getAllLinksForNode","getNextLinksFromComment","li","_link$navObject","_link$navObject2","_this11","subObject","subObjs","getFocusableSubObjects","so","focusableSubElements","inputPortDisplay","inputPortFocusable","ip","outputPortDisplay","outputPortFocusable","focusFunction","LINK_SELECTION_HANDLES","focusable","SVGCanvasPipeline","selectionInfo","getPipeline","mappedNodes","getMappedArray","mappedComments","mappedLinks","preProcessPipeline","accessibility","SvgCanvasAccessibility","getAccessibility","getNextLinksFromNode","getPreviousLinksToNode","getPreviousNodeFromDataLink","getPreviousNodeFromAssocLink","getPreviousObjectFromCommentLink","getNextNodeFromDataLink","getNextNodeFromAssocLink","getNextObjectFromCommentLink","getNextSiblingLink","getPreviousSiblingLink","getNextTabGroupStartObject","getPreviousTabGroupStartObject","nodeIds","nId","isSupernode","containsOnlyBindingNodes","isSuperBindingNode","commentId","commentIds","cId","linkId","linkIds","lId","pipelines","setAllPortsDisconnected","setOutputPortConnected","setInputPortConnected","isConnected","inPortId","outPortId","reduce","getNextSubObject","getPreviousSubObject","d3Fetch","SVGCanvasRenderer","nodeLayout","supernodeInfo","SvgCanvasComments","dragObjectUtils","SvgCanvasDragObject","dragLinkUtils","SvgCanvasDragLink","dragNewLinkUtils","SvgCanvasDragNewLink","dragDetLinkUtils","SvgCanvasDragDetLink","SvgCanvasZoom","displayComments","getCommentToolbarPos","setDisplayState","getDisplayStateMsg","dragNewLinkOverNode","subObjectParentObj","initializeGhostDiv","createCanvasSVG","canvasDefs","createDefs","createCanvasBackground","createCanvasGroup","canvasUnderlay","createCanvasUnderlay","commentsGrp","boundingRectsGrp","createBoundingRectanglesGrp","displayCanvas","restoreZoom","isDisplayingSubFlowFullPage","zoomToFit","setSpaceKeyPressed","zoomTo","zoomIn","zoomOut","isZoomedToMax","isZoomedToMin","getZoomToReveal","getZoom","cleanUpSuperRenderers","enableKeyboardNavigation","displayCommentsSelectionStatus","displayNodesSelectionStatus","displayLinksSelectionStatus","newSuperRenderers","getSupernodes","supernode","getRendererForSupernode","getDiscardedRenderersForSupernode","dr","resetZoomTransform","enableBoundingRectangles","displayBoundingRectangles","setCanvasBackgroundSize","enablePositionNodeOnRightFlyoutOpen","isRightFlyoutOpen","selNodeIds","getSelectedNodeIds","enableCanvasUnderlay","setCanvasUnderlaySize","displayPortsForSubFlowFullPage","setPortPositionsForNode","getParentSupernodeDatum","background","setPortPositionsAllNodes","moveSuperBindingNodes","supernodeDatum","linkDirection","LINK_DIR_TOP_BOTTOM","LINK_DIR_BOTTOM_TOP","svgWid","getSupernodePortXOffset","topAreaHeight","svgHt","LINK_DIR_LEFT_RIGHT","getSupernodePortYOffset","sr","superRen","nodeGrpSelector","getSelectorForId","comId","nodeSel","getSelectorForNodeLabelId","getSelectorForInputPortId","getSelectorForOutputPortId","linkSel","suffix","suffix2","getId","transformPos","getMousePos","svgSel","convertPageCoordsToCanvasCoords","getMousePosSnapToGrid","unTransformPos","screenPos","addParentSupernodeOffset","parentSVGDims","posWithOffset","transformedPos","getGhostDivSel","ghostDivSel","ghostAreaWidth","ghostGrp","getImageElement","imgs","setNodeImageContent","getNodeImagePosX","getNodeImagePosY","getNodeImageWidth","getNodeImageHeight","fObject","fObjectDiv","getNodeLabelClass","labelSpanWidth","nodeLabelWidth","labelDisplayLength","labelDiff","browserZoom","getBrowserZoom","devicePixelRatio","outerWidth","innerWidth","isNodeTemplateInsertableIntoLink","isNodeTemplateAttachableToDetachedLinks","template","setNodeDragOverLinkHighlighting","setLinkOverNode","transformMousePosForNode","createNodeFromTemplateOnLinkAt","createNodeFromTemplateAttachLinks","createNodeFromTemplateAt","dropData","createDroppedExternalObject","isPortMaxCardinalityZero","nodeHasInputs","nodeHasOutputs","attachableLinks","isPosInArea","ghostAreaPadding","nodeOverSrcPos","nodeOverTrgPos","getDetachedLinksToUpdate","oldLinks","setMaxZoomExtent","newFactor","enableZoomIntoSubFlows","defs","createDropShadow","createGrid","setFocusOnCanvas","gridId","getGridId","isEmptyOrBindingsOnly","getZoomHandler","CONTEXT_MENU_BUTTON","SINGLE_CLICK_CONTEXTMENU","DOUBLE_CLICK","openContextMenu","dropShadowFilter","feMerge","gridMajorPx","displayGridMajorPx","gridMajorPy","displayGridMajorPy","gridMinorPx","displayGridMinorPx","gridMinorPy","displayGridMinorPy","displayGridType","DISPLAY_GRID_DOTS","addDotsPattern","DISPLAY_GRID_BOXES","addBoxesPattern","DISPLAY_GRID_BOXES_AND_LINES","gridPattern","DISPLAY_GRID_DOTS_AND_LINES","smallGridPattern","comDomObj","displayCommentTextArea","setCommentEditingMode","labelEditable","nodeDomObj","displayNodeLabelTextArea","setNodeLabelEditingMode","label_editable","nodeDecDomObj","getNodeDecSelectionById","displayDecLabelTextArea","setLinkDecorationLabelEditingMode","linkDecDomObj","getLinkDecSelectionById","getEditingTextId","moveTextToolbar","commentToolbarPosX","commentToolbarPosY","objPos","getFlags","getAllNodeGroupsSelection","displayNodesSubset","nodeGroupSel","nodeGrps","updatePortRadiusAndPos","updateOutputPortArrowPath","updateInputPortArrowPath","preserveFocus","createNodes","removeNodes","getNodeGroupClass","getNodeGrpStyle","joinedNodeGrps","updateNodes","_this12","newNodeGroups","attachNodeGroupListeners","_this13","nonBindingNodeGrps","getNodeShapePathSizing","newNodes","getBeforeElement","attachNodeSizingListeners","getNodeSelectionOutline","getNodeSelectionOutlineStyle","nodeShapeDisplay","getNodeShapePath","getNodeBodyStyle","exts","addNodeExternalObject","imageDisplay","getNodeImageStyle","labelDisplay","labelFOSel","attachNodeLabelListeners","attachNodeLabelSpanListeners","getNodeLabelStyle","getNodeEllipsisTranslate","getNodeExpansionIconTranslate","grps","displayPorts","displaySupernodeContents","addErrorMarker","getCombinedDecorations","displayDecorations","DEC_NODE","handler","getDragObjectHandler","shouldAddDragHandlerToNode","removeSel","_this14","supernodeD3Object","setCanvasInfoRenderer","createSupernodeRenderer","hideCanvas","displayInputPorts","displayOutputPorts","_this15","inSelector","getNodeInputPortClassName","createInputPorts","removePorts","joinedInputPortGrps","updateInputPorts","_this16","inputPortGroups","inputPorts","portIdx","PORT_DISPLAY_CIRCLE_WITH_ARROW","attachInputPortListeners","_this17","getPortImageTransform","getPortArrowPath","getInputPortArrowPathTransform","getDragNewLinkHandler","_this18","_this19","outSelector","getNodeOutputPortClassName","enableSingleOutputPortDisplay","createOutputPorts","connectFrom","joinedOutputPortGrps","updateOutputPorts","_this20","outputPortGroups","outputPorts","attachOutputPortListeners","_this21","portInfo","getOutputPortArrowPathTransform","outputPortGrps","portGrp","existingArrow","arrowInfo","getConnectFromArrowInfo","_this22","PORT_DISPLAY_JSX","PORT_DISPLAY_IMAGE","portData","addJsxExternalObject","displayObjects","PORT_WIDTH_DEFAULT","PORT_HEIGHT_DEFAULT","_this23","nextObjectInGroup","setFocusObject","previousObjectInGroup","focusSubObject","clearSubObject","setFocusNextSubObject","cancelFocusOnSubObject","moveObjectUp","autoSelectFocusObj","moveObject","moveObjectDown","moveObjectRight","moveObjectLeft","selectObjectAugment","selectObjectRange","sizeObjectUp","sizeObject","sizeObjectDown","sizeObjectRight","sizeObjectLeft","createLink","createNewLinkFromSelections","displayContextOptions","enableContextToolbar","addContextToolbar","getObjectCenterPosition","raiseNodeToTop","setNodeStyles","CAUSE_MOUSE","addDynamicNodeIcons","canOpenTip","tipId","getTipId","nodeTipId","removeContextToolbar","removeDynamicNodeIcons","onFocusAllowDefaultAction","selectObjectD3Event","rect2","_this24","mouseDownNodeSizingArea","mouseEnterNodeSizingArea","mouseLeaveNodeSizingArea","nodeLabels","_this25","labelSel","enableDisplayFullLabelOnHover","spanSel","getNodeLabelHoverHeight","textActionHandler","nodeLabelSpans","_this26","hideEditIconPending","displayNodeLabelEditIcon","hideEditIcon","_this27","nextSubObject","previousSubObject","setFocusPreviousSubObject","clickSubObject","createLinkFromConnectFrom","connectFromInfo","getConnectFromInfo","_this28","addConnectFromStatus","setPortConnectFrom","isTrgNodeAvailable","isSrcNodeAvailable","_this29","nodeObj","nodeGrpSel","getNodeLabelEditIconTranslate","displayEditIcon","_this30","decObj","decGrpSel","getDecLabelEditIconTranslate","getDecorationLabelEditType","grpSel","displayTextArea","editIconGrpSel","mouseOverLabelEditIcon","EDIT_ICON","EDIT_ICON_X_OFFSET","EDIT_ICON_Y_OFFSET","labelObj","selectObjectWithClick","trgGrp","decs","_this31","decGrpClassName","decGrpSelector","createDecorations","getDecTransform","hotspot","callDecoratorCallback","updateDecoration","_this32","attachDecGroupListeners","decSel","updateDecOutlines","updateDecPaths","updateDecImages","updateDecLabels","updateDecJsxObjs","outlnSel","getDecHeight","pathSel","_this33","imageSel","nodeImageType","getImageType","getDecPadding","setDecImageContent","attachDecLabelListeners","attachDecLabelSpanListeners","getDecLabelClass","_this34","extSel","decData","addDecExternalObject","decLabels","_this35","decLabelSpans","_this36","displayDecLabelEditIcon","decGrps","_this37","parentObj","_this38","errorMarkerSelection","getErrorMarkerClass","getErrorMarkerIcon","getNodeErrorWidth","getNodeErrorHeight","getNodeErrorPosX","getNodeErrorPosY","getNodeImage","imageType","addNodeImageExternalObject","setImageContent","enableImageDisplay","loadSVGToDefs","cache","svgElement","_this39","symbolId","replaceAll","symbolSelector","nodeImage","isValidJsxElement","nodeAriaLabel","setNodeBodyStyles","setNodeSelectionOutlineStyles","setNodeImageStyles","setNodeLabelStyles","getObjectStyle","dropShadow","style_temp","subdueStyle","doesExpandedSupernodeHaveStyledNodes","_this40","expandedSupernodeHaveStyledNodes","subflow_ref","pipeline_id_ref","getBindingPortRadius","ellipsisDisplay","addEllipsisIcon","addSuperNodeFullPageIcon","getDefaultContextToolbarPos","convertCanvasCoordsToScreenCoords","_this41","_this42","ellipsisGrp","NODE_MENU_ICON","getNodeEllipsisIconWidth","getNodeEllipsisIconHeight","_this43","expGrp","getSupernodeBreadcrumbs","displaySubPipelineForBreadcrumbs","supernodeExpansionIconWidth","supernodeExpansionIconHeight","SUPER_NODE_EXPAND_ICON","supernodeExpansionIconHoverAreaPadding","domEl","nodeGroupEl","closest","svgAreaEl","getD3DatumFromDomEl","parentPipelineId","createBreadcrumb","reverse","portObjClassName","_this44","portArrowClassName","_this45","_this46","contextMenuHandler","addBreadcrumbs","SUPER_NODE","decorationActionHandler","getElementWithClassAtPosition","getNodeLinkForElement","foundLink","nodeGrpElement","getNodeForElement","portElement","getNodePortIdForElement","elementsFromPoint","foundElement","nodeName","prox","getRectangleNodeShapePath","nodeSizingArea","selectionPath","nodeShape","SHAPE_PORT_ARCS","getPortArcsNodeShapePath","SHAPE_RECTANGLE_ROUNDED_CORNERS","getRectRoundCornersShapePath","nodeHighlightGap","bodyPath","highlightGap","gaps","leftGap","rightGap","topGap","bottomGap","lc","rc","tc","bc","getPortArcsNodeShapePathVertical","inputPortsWidth","outputPortsWidth","LINK_DIR_RIGHT_LEFT","getPortArcsNodeShapePathHoriz","leftPorts","leftPortsHeight","rightPorts","rightPortsHeight","portArcOffset","portArcRadius","portArcSpacing","endPoint2","topPorts","topPortsWidth","bottomPorts","bottomPortsWidth","_this47","setPortPositionsVertical","inputPortAutoPosition","outputPortAutoPosition","setPortPositionsHoriz","portsWidth","portPositions","autoPosition","displaySinglePort","setPortPositionsVerticalDisplaySingle","setPortPositionsVerticalAuto","setPortPositionsCustom","xPosition","widthSvgArea","remainingSpace","multiplier","portsHeight","setPortPositionsHorizDisplaySingle","setPortPositionsHorizAuto","yPosition","heightSvgArea","zerothX","zerothY","_this48","getAllCommentGroupsSelection","displayCommentsSubset","_this49","_this50","_this51","newData","createComments","getCommentGroupClass","joinedCommentGrps","updateComments","_this52","newCommentGroups","attachCommentGroupListeners","_this53","commentSizingArea","attachCommentSizingListeners","fo","getCommentHTMLStr","getCommentAsMarkdownHTML","highlightText","insertCommentHighlight","markdownIt","enableMarkdownHTML","commentGrps","_this54","scrollTextUp","scrollComment","scrollTextDown","createCommentPort","deleteCommentPort","yAmt","scrollBy","_this55","mouseDownCommentSizingArea","mouseEnterCommentSizingArea","mouseLeaveCommentSizingArea","commentObj","_this56","commentPort","comGrp","setCommentSelectionOutlineStyles","setCommentBodyStyles","setCommentTextStyles","getCommentSelectionOutlineStyle","getCommentBodyStyle","getCommentTextStyle","commentAutoSize","cursorStyle","linksArray","buildLinksArray","getAllLinkGroupsSelection","displayLinksSubset","_this57","_this58","displaySingleLink","_this59","createLinks","getLinkGroupClass","getLinkGrpStyle","getLinkAriaLabel","joinedLinkGrps","updateLinks","_this60","newLinkGrps","attachLinkGroupListeners","getLinkSelectionAreaClass","dataLinkArrowHead","lineArray","_this61","linkGrps","linkGrp","shouldDisplayAltDecorations","linkAltDecorations","updateStartHandles","updateEndHandles","enableSplitLinkDroppedOnNode","enableLinkMethod","enableLinkType","getDragLinkHandler","enableLinksOverNodes","setDisplayOrder","_this62","nextSiblingLink","previousSiblingLink","linkContextToolbarPosX","linkContextToolbarPosY","enableRaiseLinksToTopOnHover","raiseLinkToTop","setLinkLineStyles","linkTipId","lowerLinkToBottom","getLinkDistance","linkDistanceForAltDecorations","_this63","handlesGrp","attachLinkHandleListeners","handles","linkStartHandleObject","createStartHandle","getDragDetachedLinkHandler","handle","sourceHandleLabel","linkStartHandleImage","linkStartHandleWidth","linkStartHandleHeight","linkStartHandleRadius","_this64","linkEndHandleObject","createEndHandle","targetHandleLabel","linkEndHandleImage","linkEndHandleWidth","linkEndHandleHeight","linkEndHandleRadius","handleType","_this65","moveLinkHandleUp","moveLinkHandle","moveLinkHandleDown","moveLinkHandleRight","moveLinkHandleLeft","linkObj","getLinkTypeClass","getLinkBranchHighlightCLass","getLinkCustomClass","branchHighlight","customClass","supernodeClass","draggableClass","resizeClass","shapeClass","getNodeShapeClass","shape","linkGroup","_this66","hasOneDecorationOrMore","_this67","enableRaiseNodesToTopOnHover","getSelectedLinksCount","_this68","fn","getFocusObject","shouldForceFocusChange","isTargetInsideCanvas","activeElement","_this69","updateFreeformLinksForNodes","isLinkBeingDragged","getAttachedLinkObj","displayLinkOnOverlap","addMinInitialLineForElbow","error","shouldDisplayLink","getSourcePortId","getTargetPortId","getAssocLinkVariation","coords","getLinkCoords","trgInfo","getTargetEndInfo","getSrcDirForDetachedLink","srcInfo","getSourceEndInfo","getTrgDirForDetachedLink","reverseDir","getDefaultSrcDirForPorts","getNewFreeformNodeLinkStartPos","getOutputPort","getInputPort","areLinkedObjectsOverlapping","srcHighlightGap","trgHighlightGap","srcLeft","srcRight","trgLeft","trgRight","srcTop","srcBottom","trgTop","trgBottom","_this70","nodeLinks","getNodeOutputLinks","sortedNodeLinks","sortNodeOutputLinks","applyMinInitialLine","outArray","_this71","nodeLineData1","nodeLineData2","first","second","runningInitialLine","lineData","minInitialLineIncrement","_this72","updateFreeformLinksForNode","_this73","_link$srcObj","_link$srcObj2","_link$trgNode","flow","startNode","endNode","getDirToNode","getDirToEndPos","startCenter","sortLinksInfo","updateLinksInfo","endX","endY","getDir","linksDirArrayIn","_this74","linksDirArray","getLinkInfoGroups","_forOwn","ld","getAngleForInputPorts","getAngleForOutputPorts","rotation","tipType","isTipEnabled","addCommentOffsetX","addCommentOffsetY","xPanByScale","yPanByScale","str","nextObj","previousObj","getActiveCanvasElement","objElement","allowDefaultAction","force","objSel","labelDivElement","labelSpanElement","labelDivRect","getTransformedElementRect","labelSpanRect","labelRectRight","labelRectBottom","_this75","getFocusName","_focusElement$parentE","_topElement$classList","focusElement","topElement","lastChild","getNodeFocusIncrements","isKeyboardEvent","moveFocusToSubObject","getNodeInputPortSelectionById","getNodeOutputPortSelectionById","getLinkStartHandleGrpSelectionById","getLinkEndHandleGrpSelectionById","drawFocusBox","bBox","getBBox","SVGCanvasD3","canvasInfoId","canvasDivSelector","getCurrentBreadcrumb","ConfigUtils","compareCanvasConfigsOmitFields","cloneCanvasInfo","cloneConfig","clearCanvas","currentBreadcrumb","supernodeId","supernodeParentPipelineId","convertPageCoordsToSnappedCanvasCoords","nodeTemplateDragOver","nodeTemplateDropped","externalObjectDropped","objectIds","setNodeDecorationLabelEditingMode","refreshOnSizeChange","getDefaultCommentOffset","focusNextTabGroup","focusPreviousTabGroup","getActiveCanvasObject","moveFocusTo","_this$renderer","openCanvasContextOptions","CanvasContents","isDropZoneDisplayed","mainCanvasDivId","svgCanvasDivId","svgCanvasDivSelector","dragX","dragY","contentsRef","eventListenersAdded","tabbingOut","drop","focusOnCanvas","setIsDropZoneDisplayed","dragOver","dragEnter","dragLeave","onCut","onCopy","onPaste","onKeyUp","onMouseMove","onClickReturnToPrevious","afterUpdateCallbacks","setCanvasContents","svgCanvasD3","setCanvasInfo","canvasConfig","enableBrowserEditMenu","addEventListeners","enableFocusOnMount","resizeObserver","ResizeObserver","entries","entry","contentRect","observe","prevProps","afterUpdate","removeEventListeners","_this$resizeObserver","disconnect","isFocusOnCanvasOrContents","cutToClipboard","copyToClipboard","pasteFromClipboard","actions","getKeyboardConfig","keyboardActionHandler","undo","canUndo","redo","canRedo","deselectAll","spaceKey","toggleLogging","switchLoggingState","panLeft","panRight","panUp","panDown","nextGroup","moveFocusToNextGroup","previousGroup","moveFocusToPreviousGroup","activeObject","_e$target","displayPreviousPipeline","objectModel","getNodeLayout","getCanvasLayout","getData","warn","enableStateTag","emptyCanvas","isPrimaryPipelineEmpty","emptyCanvasContent","FlowData","returnToPrevious","isDisplayingFullPageSubFlow","enableCanvasLayout","alwaysDisplayBackToParentFlow","Button","kind","ArrowLeft","dropZoneCanvas","dropZoneCanvasContent","enableDropZoneOnExternalDrag","_evt$currentTarget","_document$activeEleme","getSvgCanvasDivId","cb","getDragNodeTemplate","getDNDJson","operation","isDataTypeBeingDraggedFile","getEmptyCanvas","returnToPreviousBtn","getReturnToPreviousBtn","getContextMenu","getTextToolbar","getDropZone","svgCanvasDiv","getSVGCanvasDiv","onDrop","onDragOver","onDragEnter","onDragLeave","canvasinfo","selectioninfo","NotificationPanel","keyDownOnPanel","setFocusOnFirstItem","allRefs","notifications","iconType","subtitle","closeMessage","clickOnCloseButton","keyDownOnCloseButton","timestamp","notificationMessage","Fragment","notificationElement","notificationCallback","headerText","subtitleText","emptyMessageText","hasMessages","messageCallback","deleteNotification","activateButton","deleteNotificationMessages","clearNotificationMessages","notificationConfig","clearAllCallback","nextSection","lastElement","previousSection","_this$props$notificat","_this$props$notificat2","_this$props$notificat3","_this$props$notificat4","_this$props$notificat5","_this$props$notificat6","notificationHeader","DEFAULT_NOTIFICATION_HEADER","notificationSubtitle","emptyMessage","getAriaHeaderLabel","closeButton","renderIcon","Close","hasIconOnly","iconDescription","closeSubPanel","tooltipAlignment","tooltipPosition","notificationPanelMessages","getNotifications","clearAll","clearAllMessage","secondaryButton","secondaryButtonLabel","secondaryButtonCallback","secondaryButtonDisabled","notificationpanel","CommonCanvasToolbar","leftBarItems","getDefaultRightBar","maxMessageType","getNotificationMessagesMaxType","NOTIFICATION_ICON_CLASS","SUCCESS","INFO","bar","copyConfig","getConvertedLegacyToolbar","getDefaultToolbar","optionallyAddPaletteTool","optionallyAddNotificationTool","overrideAutoEnableDisable","paletteLabel","newLeftBar","isPaletteEnabled","isPaletteOpen","SidePanelCloseFilled","SidePanelOpenFilled","togglePaletteAction","TOOLBAR_TOGGLE_PALETTE","lbIdx","getToolIndexByAction","rbIdx","lbAction","incLabelWithIcon","rbAction","paletteTools","notificationConfigExists","notificationCount","notificationMessages","toggleNotificationAction","TOOLBAR_TOGGLE_NOTIFICATION_PANEL","notificationConfigLabel","notificationConfigEnable","extIsSubAreaDisplayed","isNotificationOpen","setExtIsSubAreaDisplayed","callExtIsSubAreaDisplayed","getNotificationClassName","leaveSubAreaOpenOnClickOutside","notificationConfigKeepOpen","notificationTools","openNotificationPanel","closeNotificationPanel","enableInternalObjectModel","editingAllowed","applyToolState","canCutCopy","canPaste","canDelete","canZoomIn","canZoomOut","canZoomToFit","undoLabel","redoLabel","undoTool","findTool","undo_command","redoTool","redo_command","tool","generateToolbarConfig","configureToolbarButtonsState","addUndoRedoCommandLabels","canvasToolbar","enableToolbarLayout","TOOLBAR_LAYOUT_TOP","toolbarSize","_state$notificationpa","_state$notificationpa2","_state$notificationpa3","_state$notificationpa4","canvastoolbar","keepOpen","getUndoLabel","getRedoLabel","CommonCanvasLeftFlyout","leftFlyout","lfClass","enableLeftFlyoutUnderToolbar","CommonCanvasLeftFlyout$1","leftflyout","CommonCanvasRightFlyout","rightFlyoutRef","isBeingDragging","initialMinWidth","onMouseUp","onMouseMoveX","getCurrentWidth","getRightFlyoutResizeContent","panelMinWidth","wd","isPanelWidthSpecified","panelWidth","setRightFlyoutWidth","limitWidth","resizeContent","enableRightFlyoutDragToResize","_this$rightFlyoutRef","_this$rightFlyoutRef2","maxWidth","getCenterPanelWidth","rightFlyout","rightFlyoutDragContent","rfClass","enableRightFlyoutUnderToolbar","CommonCanvasRightFlyout$1","rightflyout","CanvasTopPanel","topPanel","topPanelIsOpen","topPanelContent","CanvasTopPanel$1","toppanel","CanvasCenterPanel$1","CanvasCenterPanel","divRef","_this$divRef","CanvasBottomPanel","bottomPanelRef","onMouseMoveY","ht","panelHeight","setBottomPanelHeight","limitHeight","_this$bottomPanelRef","maxHeight","getCenterPanelHeight","bottomPanel","bottomPanelIsOpen","heightPx","bottomPanelContent","CanvasBottomPanel$1","bottompanel","CommonCanvasPanels","centerPanelRef","_this$centerPanelRef","getBoundingRect","_this$centerPanelRef2","enableParentClass","centerContents","centerPanel","templateRows","gridTemplateRows","PALETTE_LAYOUT_DIALOG","leftFlyoutIsOpen","paletteIsOpen","enableNarrowPalette","rightFlyoutIsOpen","generateRightFlyout","isLeftFlyoutOpen","generateLeftFlyout","topCenterBottom","generateTopCenterBottom","panels","templateCols","toolbarIsOpen","lowerPanels","gridTemplateColumns","templateColsMain","leftSideItems","rightSideItems","centerItems","dialogPalette","divClassName","generateClass","CommonCanvasPanels$1","CommonCanvas","initializeController","setIntl","setCanvasConfig","setContextMenuConfig","contextMenuConfig","setKeyboardConfig","keyboardConfig","setToolbarConfig","setNotificationPanelConfig","setLeftFlyoutConfig","leftFlyoutContent","showLeftFlyout","setRightFlyoutConfig","rightFlyoutContent","showRightFlyout","setBottomPanelConfig","showBottomPanel","setTopPanelConfig","showTopPanel","setHandlers","beforeEditActionHandler","tipHandler","layoutHandler","idGeneratorHandler","selectionChangeHandler","actionLabelHandler","Provider","store","getStore"],"mappings":"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"}
|