@elyra/canvas 12.32.2 → 12.34.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.
Files changed (108) hide show
  1. package/dist/{_baseIteratee-eabd2a94.js → _baseIteratee-2a601011.js} +2 -2
  2. package/dist/{_baseIteratee-eabd2a94.js.map → _baseIteratee-2a601011.js.map} +1 -1
  3. package/dist/{_baseIteratee-e1311552.js → _baseIteratee-7fb1949c.js} +2 -2
  4. package/dist/{_baseIteratee-e1311552.js.map → _baseIteratee-7fb1949c.js.map} +1 -1
  5. package/dist/{canvas-constants-72222288.js → canvas-constants-29b7f65c.js} +2 -2
  6. package/dist/{canvas-constants-72222288.js.map → canvas-constants-29b7f65c.js.map} +1 -1
  7. package/dist/{canvas-constants-903046ab.js → canvas-constants-85883d4c.js} +2 -2
  8. package/dist/{canvas-constants-903046ab.js.map → canvas-constants-85883d4c.js.map} +1 -1
  9. package/dist/{canvas-controller-c0b65951.js → canvas-controller-273d4b5b.js} +2 -2
  10. package/dist/{canvas-controller-c0b65951.js.map → canvas-controller-273d4b5b.js.map} +1 -1
  11. package/dist/{canvas-controller-2df80dc3.js → canvas-controller-96abce12.js} +2 -2
  12. package/dist/{canvas-controller-2df80dc3.js.map → canvas-controller-96abce12.js.map} +1 -1
  13. package/dist/{canvas-logger-6f90b136.js → canvas-logger-34ca361a.js} +2 -2
  14. package/dist/{canvas-logger-6f90b136.js.map → canvas-logger-34ca361a.js.map} +1 -1
  15. package/dist/{canvas-logger-3bfbcf85.js → canvas-logger-fec87cd1.js} +2 -2
  16. package/dist/{canvas-logger-3bfbcf85.js.map → canvas-logger-fec87cd1.js.map} +1 -1
  17. package/dist/common-canvas-5ccce28e.js +2 -0
  18. package/dist/common-canvas-5ccce28e.js.map +1 -0
  19. package/dist/common-canvas-f471a9f3.js +2 -0
  20. package/dist/common-canvas-f471a9f3.js.map +1 -0
  21. package/dist/common-canvas.es.js +1 -1
  22. package/dist/common-canvas.js +1 -1
  23. package/dist/common-properties-51bd2ecc.js +2 -0
  24. package/dist/common-properties-51bd2ecc.js.map +1 -0
  25. package/dist/common-properties-e82771ef.js +2 -0
  26. package/dist/common-properties-e82771ef.js.map +1 -0
  27. package/dist/{context-menu-wrapper-5846a20e.js → context-menu-wrapper-19a1cf72.js} +2 -2
  28. package/dist/{context-menu-wrapper-5846a20e.js.map → context-menu-wrapper-19a1cf72.js.map} +1 -1
  29. package/dist/{context-menu-wrapper-ac5e8c7a.js → context-menu-wrapper-c3a98c63.js} +2 -2
  30. package/dist/{context-menu-wrapper-ac5e8c7a.js.map → context-menu-wrapper-c3a98c63.js.map} +1 -1
  31. package/dist/{createClass-826941b3.js → createClass-09bc08f7.js} +1 -1
  32. package/dist/createClass-09bc08f7.js.map +1 -0
  33. package/dist/{createClass-be661622.js → createClass-ffbbe837.js} +1 -1
  34. package/dist/createClass-ffbbe837.js.map +1 -0
  35. package/dist/{datarecord-metadata-v3-schema-64329ae4.js → datarecord-metadata-v3-schema-531c7b07.js} +2 -2
  36. package/dist/{datarecord-metadata-v3-schema-64329ae4.js.map → datarecord-metadata-v3-schema-531c7b07.js.map} +1 -1
  37. package/dist/{datarecord-metadata-v3-schema-dd7370da.js → datarecord-metadata-v3-schema-db5150c5.js} +2 -2
  38. package/dist/{datarecord-metadata-v3-schema-dd7370da.js.map → datarecord-metadata-v3-schema-db5150c5.js.map} +1 -1
  39. package/dist/{flexible-table-23d61157.js → flexible-table-8c6db0fc.js} +2 -2
  40. package/dist/flexible-table-8c6db0fc.js.map +1 -0
  41. package/dist/{flexible-table-4259d869.js → flexible-table-b9c08069.js} +2 -2
  42. package/dist/flexible-table-b9c08069.js.map +1 -0
  43. package/dist/{getPrototypeOf-3751add9.js → getPrototypeOf-012c454b.js} +2 -2
  44. package/dist/{getPrototypeOf-3751add9.js.map → getPrototypeOf-012c454b.js.map} +1 -1
  45. package/dist/{getPrototypeOf-1e698126.js → getPrototypeOf-5f227292.js} +2 -2
  46. package/dist/{getPrototypeOf-1e698126.js.map → getPrototypeOf-5f227292.js.map} +1 -1
  47. package/dist/{icon-04f858ce.js → icon-a9c3f51e.js} +2 -2
  48. package/dist/{icon-04f858ce.js.map → icon-a9c3f51e.js.map} +1 -1
  49. package/dist/{icon-8cc7816d.js → icon-de9c6b33.js} +2 -2
  50. package/dist/{icon-8cc7816d.js.map → icon-de9c6b33.js.map} +1 -1
  51. package/dist/{index-101f9560.js → index-9960d3bf.js} +2 -2
  52. package/dist/{index-101f9560.js.map → index-9960d3bf.js.map} +1 -1
  53. package/dist/{index-2788d55d.js → index-d4a58ddb.js} +2 -2
  54. package/dist/{index-2788d55d.js.map → index-d4a58ddb.js.map} +1 -1
  55. package/dist/lib/canvas-controller.es.js +1 -1
  56. package/dist/lib/canvas-controller.js +1 -1
  57. package/dist/lib/canvas.es.js +1 -1
  58. package/dist/lib/canvas.js +1 -1
  59. package/dist/lib/command-stack.es.js +1 -1
  60. package/dist/lib/command-stack.js +1 -1
  61. package/dist/lib/context-menu.es.js +1 -1
  62. package/dist/lib/context-menu.js +1 -1
  63. package/dist/lib/properties/field-picker.es.js +1 -1
  64. package/dist/lib/properties/field-picker.js +1 -1
  65. package/dist/lib/properties/flexible-table.es.js +1 -1
  66. package/dist/lib/properties/flexible-table.js +1 -1
  67. package/dist/lib/properties.es.js +1 -1
  68. package/dist/lib/properties.js +1 -1
  69. package/dist/lib/tooltip.es.js +1 -1
  70. package/dist/lib/tooltip.js +1 -1
  71. package/dist/styles/common-canvas.min.css +1 -1
  72. package/dist/styles/common-canvas.min.css.map +1 -1
  73. package/dist/toolbar-233c09a8.js +2 -0
  74. package/dist/toolbar-233c09a8.js.map +1 -0
  75. package/dist/toolbar-cdb38f4a.js +2 -0
  76. package/dist/toolbar-cdb38f4a.js.map +1 -0
  77. package/package.json +3 -3
  78. package/src/common-canvas/cc-central-items.jsx +81 -17
  79. package/src/common-canvas/cc-contents.jsx +3 -19
  80. package/src/common-canvas/cc-right-flyout.jsx +1 -1
  81. package/src/common-canvas/common-canvas.jsx +1 -50
  82. package/src/common-canvas/common-canvas.scss +23 -45
  83. package/src/common-canvas/svg-canvas-d3.js +2 -1
  84. package/src/common-canvas/svg-canvas-renderer.js +255 -90
  85. package/src/common-canvas/svg-canvas-utils-nodes.js +0 -4
  86. package/src/common-properties/components/flexible-table/flexible-table.jsx +5 -5
  87. package/src/common-properties/constants/constants.js +1 -1
  88. package/src/common-properties/controls/dropdown/dropdown.jsx +8 -1
  89. package/src/common-properties/controls/numberfield/numberfield.jsx +21 -2
  90. package/src/notification-panel/notification-panel.scss +1 -0
  91. package/src/toolbar/toolbar-action-item.jsx +1 -1
  92. package/stats.html +1 -1
  93. package/dist/common-canvas-55d8916f.js +0 -2
  94. package/dist/common-canvas-55d8916f.js.map +0 -1
  95. package/dist/common-canvas-8eb241dc.js +0 -2
  96. package/dist/common-canvas-8eb241dc.js.map +0 -1
  97. package/dist/common-properties-96c9c88a.js +0 -2
  98. package/dist/common-properties-96c9c88a.js.map +0 -1
  99. package/dist/common-properties-c5292c66.js +0 -2
  100. package/dist/common-properties-c5292c66.js.map +0 -1
  101. package/dist/createClass-826941b3.js.map +0 -1
  102. package/dist/createClass-be661622.js.map +0 -1
  103. package/dist/flexible-table-23d61157.js.map +0 -1
  104. package/dist/flexible-table-4259d869.js.map +0 -1
  105. package/dist/toolbar-12f6def6.js +0 -2
  106. package/dist/toolbar-12f6def6.js.map +0 -1
  107. package/dist/toolbar-55e2020e.js +0 -2
  108. package/dist/toolbar-55e2020e.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"common-canvas-8eb241dc.js","sources":["../src/palette/palette-dialog-topbar-three-way-icon.jsx","../src/palette/palette-dialog-topbar.jsx","../assets/images/palette/palette_grid_selected.svg","../assets/images/palette/palette_grid_hover.svg","../assets/images/palette/palette_grid_deselected.svg","../assets/images/palette/palette_list_selected.svg","../assets/images/palette/palette_list_hover.svg","../assets/images/palette/palette_list_deselected.svg","../assets/images/palette/close_32.svg","../src/palette/palette-dialog-content-category.jsx","../src/palette/palette-dialog-content-categories.jsx","../assets/images/supernode.svg","../assets/images/supernode_ext.svg","../src/palette/palette-dialog-content-grid-node.jsx","../src/palette/palette-dialog-content-grid.jsx","../src/palette/palette-content-list-item.jsx","../src/palette/palette-content-list.jsx","../src/palette/palette-dialog-content.jsx","../src/palette/palette-dialog.jsx","../node_modules/lodash/now.js","../node_modules/lodash/debounce.js","../src/palette/palette-flyout-utils.js","../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/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-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","../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","../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","../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-external.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/lodash/_unescapeHtmlChar.js","../node_modules/lodash/unescape.js","../src/common-canvas/svg-canvas-utils-markdown.js","../src/common-canvas/svg-canvas-utils-textarea.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/common-canvas/cc-toolbar.jsx","../src/common-canvas/cc-right-flyout.jsx","../src/common-canvas/cc-bottom-panel.jsx","../src/common-canvas/cc-top-panel.jsx","../src/notification-panel/notification-panel.jsx","../src/common-canvas/cc-central-items.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 */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\n\nclass PaletteDialogTopbarThreeWayIcon extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t\thover: false\n\t\t};\n\n\t\tthis.iconClicked = this.iconClicked.bind(this);\n\t\tthis.mouseEnter = this.mouseEnter.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\t\tthis.mouseDown = this.mouseDown.bind(this);\n\t}\n\n\ticonClicked() {\n\t\tthis.props.iconClickedMethod();\n\t}\n\n\tmouseEnter() {\n\t\tthis.setState({ hover: true });\n\t}\n\n\tmouseLeave() {\n\t\tthis.setState({ hover: false });\n\t}\n\n\tmouseDown(mouseDownEvent) {\n\t\tmouseDownEvent.stopPropagation();\n\t}\n\n\trender() {\n\t\tlet icon = this.props.selectedIconName;\n\n\t\tif (!this.props.isSelected) {\n\t\t\tif (this.state.hover) {\n\t\t\t\ticon = this.props.hoverIconName;\n\t\t\t} else {\n\t\t\t\ticon = this.props.deselectedIconName;\n\t\t\t}\n\t\t}\n\n\t\treturn (\n\t\t\t<div draggable= \"false\" className=\"palette-three-way-icon-div\">\n\t\t\t\t<img src={icon} draggable=\"false\"\n\t\t\t\t\tonClick={this.iconClicked}\n\t\t\t\t\tonMouseEnter={this.mouseEnter}\n\t\t\t\t\tonMouseLeave={this.mouseLeave}\n\t\t\t\t\tonMouseDown={this.mouseDown}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nPaletteDialogTopbarThreeWayIcon.propTypes = {\n\ticonClickedMethod: PropTypes.func.isRequired,\n\tisSelected: PropTypes.bool.isRequired,\n\tselectedIconName: PropTypes.string.isRequired,\n\thoverIconName: PropTypes.string.isRequired,\n\tdeselectedIconName: PropTypes.string.isRequired\n};\n\nexport default PaletteDialogTopbarThreeWayIcon;\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 PaletteDialogTopbarThreeWayIcon from \"./palette-dialog-topbar-three-way-icon.jsx\";\nimport Close32Icon from \"../../assets/images/palette/close_32.svg\";\nimport PaletteGridSelectedIcon from \"../../assets/images/palette/palette_grid_selected.svg\";\nimport PaletteGridHoverIcon from \"../../assets/images/palette/palette_grid_hover.svg\";\nimport PaletteGridDeSelectedIcon from \"../../assets/images/palette/palette_grid_deselected.svg\";\nimport PaletteListSelectedIcon from \"../../assets/images/palette/palette_list_selected.svg\";\nimport PaletteListHoverIcon from \"../../assets/images/palette/palette_list_hover.svg\";\nimport PaletteListDeSelectedIcon from \"../../assets/images/palette/palette_list_deselected.svg\";\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.close = this.close.bind(this);\n\t\tthis.gridViewSelected = this.gridViewSelected.bind(this);\n\t\tthis.listViewSelected = this.listViewSelected.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\tclose(closeEvent) {\n\t\tthis.props.canvasController.closePalette(closeEvent);\n\t}\n\n\tgridViewSelected() {\n\t\tthis.props.showGridMethod(true);\n\t}\n\n\tlistViewSelected() {\n\t\tthis.props.showGridMethod(false);\n\t}\n\n\trender() {\n\t\treturn (\n\t\t\t<div className=\"palette-dialog-topbar\" onMouseDown={this.mouseDown} onDoubleClick={this.doubleClick}>\n\t\t\t\t<span className=\"left-navbar\">\n\t\t\t\t\t<PaletteDialogTopbarThreeWayIcon iconClickedMethod={this.gridViewSelected}\n\t\t\t\t\t\tisSelected={this.props.showGrid}\n\t\t\t\t\t\tselectedIconName={PaletteGridSelectedIcon}\n\t\t\t\t\t\thoverIconName={PaletteGridHoverIcon}\n\t\t\t\t\t\tdeselectedIconName={PaletteGridDeSelectedIcon}\n\t\t\t\t\t/>\n\t\t\t\t\t<PaletteDialogTopbarThreeWayIcon iconClickedMethod={this.listViewSelected}\n\t\t\t\t\t\tisSelected={!this.props.showGrid}\n\t\t\t\t\t\tselectedIconName={PaletteListSelectedIcon}\n\t\t\t\t\t\thoverIconName={PaletteListHoverIcon}\n\t\t\t\t\t\tdeselectedIconName={PaletteListDeSelectedIcon}\n\t\t\t\t\t/>\n\t\t\t\t</span>\n\t\t\t\t<span className=\"right-navbar\">\n\t\t\t\t\t<a className=\"secondary-action\" onClick={this.close}>\n\t\t\t\t\t\t<img src={Close32Icon} draggable=\"false\" className=\"close-icon\" />\n\t\t\t\t\t</a>\n\t\t\t\t</span>\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","export default \"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2016%2016%22%20enable-background%3D%22new%200%200%2016%2016%22%3E%3Cg%20fill%3D%22%233D70B2%22%3E%3Cpath%20d%3D%22m9.8%200h6.2v6.2h-6.2z%22%2F%3E%3Cpath%20d%3D%22M8.6%2C0H7.4H0v7.4v1.2V16h7.4h1.2H16V8.6V7.4H8.6V0z%20M7.4%2C14.8H1.2V8.6h6.2V14.8z%20M14.8%2C8.6v6.2H8.6V8.6%20%20H14.8z%20M1.2%2C7.4V1.2h6.2v6.2H1.2z%22%2F%3E%3C%2Fg%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%2016%2016%22%20enable-background%3D%22new%200%200%2016%2016%22%3E%3Cg%20fill%3D%22%235596e6%22%3E%3Cpath%20d%3D%22m9.8%200h6.2v6.2h-6.2z%22%2F%3E%3Cpath%20d%3D%22M8.6%2C0H7.4H0v7.4v1.2V16h7.4h1.2H16V8.6V7.4H8.6V0z%20M7.4%2C14.8H1.2V8.6h6.2V14.8z%20M14.8%2C8.6v6.2H8.6V8.6%20%20H14.8z%20M1.2%2C7.4V1.2h6.2v6.2H1.2z%22%2F%3E%3C%2Fg%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%2016%2016%22%20enable-background%3D%22new%200%200%2016%2016%22%3E%3Cg%20fill%3D%22%23C7C7C7%22%3E%3Cpath%20d%3D%22m9.8%200h6.2v6.2h-6.2z%22%2F%3E%3Cpath%20d%3D%22M8.6%2C0H7.4H0v7.4v1.2V16h7.4h1.2H16V8.6V7.4H8.6V0z%20M7.4%2C14.8H1.2V8.6h6.2V14.8z%20M14.8%2C8.6v6.2H8.6V8.6%20%20H14.8z%20M1.2%2C7.4V1.2h6.2v6.2H1.2z%22%2F%3E%3C%2Fg%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%2016%2016%22%20enable-background%3D%22new%200%200%2016%2016%22%3E%3Cg%20fill%3D%22%233D70B2%22%3E%3Cpath%20d%3D%22m0%2014.5h1.5v1.5h-1.5z%22%2F%3E%3Cpath%20d%3D%22m3.3%2014.5h12.7v1.5h-12.7z%22%2F%3E%3Cpath%20d%3D%22m0%209.7h1.5v1.5h-1.5z%22%2F%3E%3Cpath%20d%3D%22m3.3%209.7h12.7v1.5h-12.7z%22%2F%3E%3Cpath%20d%3D%22m0%204.8h1.5v1.5h-1.5z%22%2F%3E%3Cpath%20d%3D%22m3.3%204.8h12.7v1.5h-12.7z%22%2F%3E%3Cpath%20d%3D%22m0%200h1.5v1.5h-1.5z%22%2F%3E%3Cpath%20d%3D%22m3.3%200h12.7v1.5h-12.7z%22%2F%3E%3C%2Fg%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%2016%2016%22%20enable-background%3D%22new%200%200%2016%2016%22%3E%3Cg%20fill%3D%22%235596e6%22%3E%3Cpath%20d%3D%22m0%2014.5h1.5v1.5h-1.5z%22%2F%3E%3Cpath%20d%3D%22m3.3%2014.5h12.7v1.5h-12.7z%22%2F%3E%3Cpath%20d%3D%22m0%209.7h1.5v1.5h-1.5z%22%2F%3E%3Cpath%20d%3D%22m3.3%209.7h12.7v1.5h-12.7z%22%2F%3E%3Cpath%20d%3D%22m0%204.8h1.5v1.5h-1.5z%22%2F%3E%3Cpath%20d%3D%22m3.3%204.8h12.7v1.5h-12.7z%22%2F%3E%3Cpath%20d%3D%22m0%200h1.5v1.5h-1.5z%22%2F%3E%3Cpath%20d%3D%22m3.3%200h12.7v1.5h-12.7z%22%2F%3E%3C%2Fg%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%2016%2016%22%20enable-background%3D%22new%200%200%2016%2016%22%3E%3Cg%20fill%3D%22%23C7C7C7%22%3E%3Cpath%20d%3D%22m0%2014.5h1.5v1.5h-1.5z%22%2F%3E%3Cpath%20d%3D%22m3.3%2014.5h12.7v1.5h-12.7z%22%2F%3E%3Cpath%20d%3D%22m0%209.7h1.5v1.5h-1.5z%22%2F%3E%3Cpath%20d%3D%22m3.3%209.7h12.7v1.5h-12.7z%22%2F%3E%3Cpath%20d%3D%22m0%204.8h1.5v1.5h-1.5z%22%2F%3E%3Cpath%20d%3D%22m3.3%204.8h12.7v1.5h-12.7z%22%2F%3E%3Cpath%20d%3D%22m0%200h1.5v1.5h-1.5z%22%2F%3E%3Cpath%20d%3D%22m3.3%200h12.7v1.5h-12.7z%22%2F%3E%3C%2Fg%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%2032%2032%22%3E%3Cpath%20style%3D%22fill%3A%233D70B2%22%20d%3D%22M20.293%2010.293L16%2014.586l-4.293-4.293-1.414%201.414L14.586%2016l-4.293%204.293%201.414%201.414L16%2017.414l4.293%204.293%201.414-1.414L17.414%2016l4.293-4.293z%22%2F%3E%3Cpath%20style%3D%22fill%3A%233D70B2%22%20d%3D%22M16%202C8.269%202%202%208.269%202%2016s6.269%2014%2014%2014%2014-6.269%2014-14S23.731%202%2016%202zm0%2026C9.383%2028%204%2022.617%204%2016S9.383%204%2016%204s12%205.383%2012%2012-5.383%2012-12%2012z%22%2F%3E%3C%2Fsvg%3E\"","/*\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","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-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 { 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.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\tonDoubleClick() {\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\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\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\ticon = image.endsWith(\".svg\")\n\t\t\t\t? <SVG src={image} className=\"node-icon\" alt={label} />\n\t\t\t\t: <img src={image} className=\"node-icon\" alt={label} />;\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\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\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/>\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/>\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\tcanvasController: PropTypes.object.isRequired\n};\n\nexport default PaletteDialogContentGrid;\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 { get, has } from \"lodash\";\nimport { injectIntl } from \"react-intl\";\nimport defaultMessages from \"../../locales/palette/locales/en.json\";\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.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.onKeyPress = this.onKeyPress.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.nodeTypeInfo.nodeType);\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\tonKeyPress(e) {\n\t\t// e.key === \" \" is needed to allow Cypress test in palette.js to run on the build machine!\n\t\tif (e.key === \" \" || e.code === \"Space\" || e.keyCode === 32) {\n\t\t\tthis.onDoubleClick();\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.canvasController.createAutoNode) {\n\t\t\tconst nodeTemplate = this.props.canvasController.convertNodeTemplate(this.props.nodeTypeInfo.nodeType);\n\t\t\tthis.props.canvasController.createAutoNode(nodeTemplate);\n\t\t}\n\t}\n\n\tonMouseOver(ev) {\n\t\tif (!this.props.isDisplaySearchResult && ev.buttons === 0) {\n\t\t\tconst nodeTemplate = this.props.nodeTypeInfo.category.empty_text\n\t\t\t\t? { app_data: { ui_data: { label: this.props.nodeTypeInfo.category.empty_text } } }\n\t\t\t\t: this.props.nodeTypeInfo.nodeType;\n\n\t\t\tthis.props.canvasController.openTip({\n\t\t\t\tid: \"paletteTip_\" + this.props.nodeTypeInfo.nodeType.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.nodeTypeInfo.category\n\t\t\t});\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\tconst less =\n\t\t\t\t\tthis.props.intl.formatMessage({ id: \"palette.flyout.search.less\", defaultMessage: defaultMessages[\"palette.flyout.search.less\"] });\n\t\t\t\telements.push(<div key=\"l_btn\" className = \"palette-list-item-desc-button\" onClick={this.showShortDescription}>{less}</div>);\n\t\t\t} else {\n\t\t\t\tconst more =\n\t\t\t\t\tthis.props.intl.formatMessage({ id: \"palette.flyout.search.more\", defaultMessage: defaultMessages[\"palette.flyout.search.more\"] });\n\t\t\t\telements.push(<div key=\"m_btn\" className = \"palette-list-item-desc-button\" onClick={this.showFullDescription}>{more}</div>);\n\t\t\t}\n\t\t}\n\t\treturn elements;\n\t}\n\n\t// Returns an abbeviated 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 dscription 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 descriptin with \"... \"\n\t// This function also adjusts the occurencs 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 occurencs. 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\tshowFullDescription() {\n\t\tthis.setState({ showFullDescription: true });\n\t}\n\n\tshowShortDescription() {\n\t\tthis.setState({ showFullDescription: false });\n\t}\n\n\timageDrag() {\n\t\treturn false;\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.props.isEditingEnabled ? \"true\" : \"false\";\n\t\tlet icon = null;\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\t\t\ticon = image.endsWith(\".svg\")\n\t\t\t\t? <SVG src={image} className=\"palette-list-item-icon\" draggable=\"false\" />\n\t\t\t\t: <img src={image} className=\"palette-list-item-icon\" draggable=\"false\" alt={\"\"} />;\n\t\t}\n\n\t\tif (labelText && (this.props.isPaletteOpen || !icon)) {\n\t\t\titemText = this.props.isDisplaySearchResult\n\t\t\t\t? this.getHighlightedLabel(labelText)\n\t\t\t\t: (<span>{labelText}</span>);\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.isPaletteOpen) {\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.props.isDisplaySearchResult\n\t\t\t? \"palette-list-item search-result\"\n\t\t\t: \"palette-list-item\";\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 && has(this.props.nodeTypeInfo.nodeType, \"app_data.ui_data.description\") &&\n\t\t\t\t\t\t\t\t\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\" tabIndex=\"-1\">{itemText}</div>\n\t\t\t: null;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tdata-id={this.props.nodeTypeInfo.nodeType.op}\n\t\t\t\ttabIndex={0}\n\t\t\t\trole={\"button\"}\n\t\t\t\taria-label={labelText}\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\tonKeyPress={this.props.isEditingEnabled ? this.onKeyPress : 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\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\" tabIndex=\"-1\">\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\tintl: PropTypes.object.isRequired,\n\tnodeTypeInfo: PropTypes.object.isRequired,\n\tisDisplaySearchResult: PropTypes.bool.isRequired,\n\tcanvasController: PropTypes.object.isRequired,\n\tisEditingEnabled: PropTypes.bool.isRequired,\n\tisPaletteOpen: PropTypes.bool.isRequired,\n\tisShowRanking: PropTypes.bool\n};\n\nexport default injectIntl(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\";\n\nclass PaletteContentList 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 contentItems = [];\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\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\tisPaletteOpen={this.props.isPaletteOpen}\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\tcontentItems.push(\n\t\t\t\t\t<PaletteContentListItem\n\t\t\t\t\t\tkey={itemKey}\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\tisPaletteOpen={this.props.isPaletteOpen}\n\t\t\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\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\tisPaletteOpen: PropTypes.bool.isRequired,\n\tisEditingEnabled: PropTypes.bool.isRequired,\n};\n\nexport default PaletteContentList;\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 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 recieved.\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/>)\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\tisPaletteOpen\n\t\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t\t/>);\n\t\treturn (\n\t\t\t<div className=\"palette-dialog-content\" ref=\"palettecontent\">\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\tisEditingEnabled: PropTypes.bool.isRequired\n};\n\nexport default PaletteDialogContent;\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 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.hoizontalSizingHover = \"\";\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 heigth - (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\tthis.paletteNodes = [];\n\n\t\t// Correction for palette cursor position\n\t\t// Used in both hoverzone 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.refs.palette;\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\tcontentDiv.childNodes[2].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.parentDivId);\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.parentDivId);\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.parentDivId);\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.parentDivId);\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 displayValue = this.props.showPalette ? \"block\" : \"none\";\n\n\t\treturn (\n\t\t\t<nav aria-label={this.props.intl.formatMessage({ id: \"palette.dialog.label\", defaultMessage: defaultMessages[\"palette.dialog.label\"] })} role=\"navigation\">\n\t\t\t\t<div className=\"palette-dialog-div\"\n\t\t\t\t\tref=\"palette\"\n\t\t\t\t\tonMouseDown={this.mouseDownOnPalette}\n\t\t\t\t\tstyle={{ display: displayValue }}\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/>\n\t\t\t\t</div>\n\t\t\t</nav>\n\t\t);\n\t}\n}\n\nPaletteDialog.propTypes = {\n\tintl: PropTypes.object.isRequired,\n\tpaletteJSON: PropTypes.object.isRequired,\n\tshowPalette: PropTypes.bool.isRequired,\n\tparentDivId: PropTypes.string.isRequired,\n\tcanvasController: PropTypes.object.isRequired,\n\tisEditingEnabled: PropTypes.bool.isRequired\n};\n\nexport default injectIntl(PaletteDialog);\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\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 * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\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 */\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 occurences 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 occurences 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 occurences 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// considerd unlikely a user will care about anythig 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 inplace 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 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 { InlineLoading } from \"carbon-components-react\";\nimport SVG from \"react-inlinesvg\";\nimport { TIP_TYPE_PALETTE_CATEGORY } from \"../common-canvas/constants/canvas-constants.js\";\nimport { get } from \"lodash\";\nimport { AccordionItem } from \"carbon-components-react\";\nimport PaletteContentList from \"./palette-content-list.jsx\";\n\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.categoryClicked = this.categoryClicked.bind(this);\n\t}\n\n\tonMouseOver(ev) {\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: ev.currentTarget,\n\t\t\tcategory: this.props.category\n\t\t});\n\t}\n\n\tonMouseLeave() {\n\t\tthis.props.canvasController.closeTip();\n\t}\n\n\tgetDisplayLabel() {\n\t\tif (this.props.isPaletteOpen === true) {\n\t\t\treturn this.props.category.label;\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\t\t\t\tthis.props.category.label &&\n\t\t\t\t\t\t\t\tthis.props.category.label.length > 0) {\n\t\t\treturn this.props.category.label.substr(0, 3);\n\t\t}\n\t\treturn null;\n\t}\n\n\tgetInlineLoadingRenderCategory() {\n\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.isPaletteOpen) {\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 title={titleObj} open={this.props.category.is_open}>\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\treturn (\n\t\t\t<div className=\"palette-flyout-category\"\n\t\t\t\tdata-id={get(this.props.category, \"id\", \"\")}\n\t\t\t\tonClick={this.categoryClicked}\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\">\n\t\t\t\t\t{itemImage}\n\t\t\t\t\t{itemText}\n\t\t\t\t</div></div>\n\t\t);\n\t}\n\n\t// Returns the text for the category\n\tgetItemText() {\n\t\tlet itemText = null;\n\t\tconst label = this.getDisplayLabel();\n\t\tif (this.props.isPaletteOpen === true) {\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{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\t\t\t\tthis.props.category.label &&\n\t\t\t\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{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 (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\" />\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\treturn (\n\t\t\t\t<PaletteContentList\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\tisPaletteOpen={this.props.isPaletteOpen}\n\t\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\t\treturn null;\n\t}\n\n\tcategoryClicked(evt) {\n\t\t// Stopping event propagation prevents an extra refresh of the node icons when\n\t\t// a category is opened.\n\t\tevt.stopPropagation();\n\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\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\tisPaletteOpen: PropTypes.bool.isRequired,\n\tisEditingEnabled: PropTypes.bool.isRequired,\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-components-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.isPaletteOpen) {\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\tkey=\"palette-flyout-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\tisPaletteOpen: PropTypes.bool.isRequired,\n\tcanvasController: PropTypes.object.isRequired\n};\n\nexport default injectIntl(PaletteFlyoutContentSearch);\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 { injectIntl } from \"react-intl\";\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\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>\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\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\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\tisPaletteOpen={this.props.isPaletteOpen}\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}\n\n\t\tif (this.props.isNodeTypeInfosArrayTruncated) {\n\t\t\tconst resultsRestricted =\n\t\t\t\tthis.props.intl.formatMessage({ id: \"palette.flyout.search.resultsrestricted\", defaultMessage: defaultMessages[\"palette.flyout.search.resultsrestricted\"] });\n\t\t\tcontentItems.push(\n\t\t\t\t<div key=\"restrict-item\" className=\"palette-flyout-restrict-item\">{resultsRestricted}</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\tisPaletteOpen: PropTypes.bool.isRequired,\n\tisEditingEnabled: PropTypes.bool.isRequired,\n\tisNodeTypeInfosArrayTruncated: PropTypes.bool,\n\tisShowRanking: PropTypes.bool\n};\n\nexport default injectIntl(PaletteFlyoutContentFilteredList);\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 { 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-components-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 necessaery 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\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\tisPaletteOpen={this.props.isPaletteOpen}\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}\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\tisPaletteOpen={this.props.isPaletteOpen}\n\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t\t// isShowRanking // Uncomment this to show ranking for debuggig ranking algorithm\n\t\t\t\tisNodeTypeInfosArrayTruncated={isNodeTypeInfosArrayTruncated}\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\t}\n\n\trender() {\n\t\tthis.categories = this.getUniqueCategories(this.props.paletteJSON.categories);\n\t\tconst contentDivs = this.props.isPaletteOpen && 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\">\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\thandleSearchStringChange={this.handleSearchStringChange}\n\t\t\t\tisPaletteOpen={this.props.isPaletteOpen}\n\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t/>\n\t\t);\n\n\t\treturn (\n\t\t\t<div className=\"palette-flyout-content\">\n\t\t\t\t{contentSearch}\n\t\t\t\t{contentCategories}\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nPaletteFlyoutContent.propTypes = {\n\tpaletteJSON: PropTypes.object.isRequired,\n\tcanvasController: PropTypes.object.isRequired,\n\tisPaletteOpen: PropTypes.bool.isRequired,\n\tisEditingEnabled: PropTypes.bool.isRequired\n};\n\nexport default PaletteFlyoutContent;\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 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.showPalette) {\n\t\t\tclassName += \" palette-flyout-div-open\";\n\t\t} else {\n\t\t\tclassName += \" palette-flyout-div-closed\";\n\t\t\tif (this.props.enableNarrowPalette) {\n\t\t\t\tclassName += \" palette-flyout-div-narrow\";\n\t\t\t}\n\t\t}\n\n\t\treturn (\n\t\t\t<nav aria-label={this.props.intl.formatMessage({ id: \"palette.flyout.label\", defaultMessage: defaultMessages[\"palette.flyout.label\"] })} role=\"navigation\">\n\t\t\t\t<div className={className}>\n\t\t\t\t\t<PaletteFlyoutContent\n\t\t\t\t\t\tpaletteJSON={this.props.paletteJSON}\n\t\t\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\t\t\tisPaletteOpen={this.props.showPalette}\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</nav>\n\t\t);\n\t}\n}\n\nPaletteFlyout.propTypes = {\n\tintl: PropTypes.object.isRequired,\n\tpaletteJSON: PropTypes.object.isRequired,\n\tshowPalette: PropTypes.bool.isRequired,\n\tenableNarrowPalette: PropTypes.bool.isRequired,\n\tcanvasController: PropTypes.object.isRequired,\n\tisEditingEnabled: PropTypes.bool.isRequired\n};\n\nexport default injectIntl(PaletteFlyout);\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\";\n\nimport PaletteDialog from \"../palette/palette-dialog.jsx\";\nimport PaletteFlyout from \"../palette/palette-flyout.jsx\";\nimport Logger from \"../logging/canvas-logger.js\";\n\nimport { PALETTE_LAYOUT_FLYOUT, PALETTE_LAYOUT_MODAL }\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\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\tlet palette = null;\n\n\t\tif (this.props.enablePaletteLayout === PALETTE_LAYOUT_FLYOUT) {\n\t\t\tpalette = (<PaletteFlyout\n\t\t\t\tenableNarrowPalette={this.props.enableNarrowPalette}\n\t\t\t\tpaletteJSON={this.props.paletteJSON}\n\t\t\t\tshowPalette={this.props.showPalette}\n\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t/>);\n\t\t} else if (this.props.enablePaletteLayout === PALETTE_LAYOUT_MODAL) {\n\t\t\tpalette = (<PaletteDialog\n\t\t\t\tpaletteJSON={this.props.paletteJSON}\n\t\t\t\tshowPalette={this.props.showPalette}\n\t\t\t\tparentDivId={this.props.containingDivId}\n\t\t\t\tcanvasController={this.props.canvasController}\n\t\t\t\tisEditingEnabled={this.props.isEditingEnabled}\n\t\t\t/>);\n\t\t}\n\n\t\treturn palette;\n\t}\n}\n\nPalette.propTypes = {\n\t// Provided by common-canvas\n\tcanvasController: PropTypes.object.isRequired,\n\tcontainingDivId: PropTypes.string.isRequired,\n\n\t// Provided by redux\n\tenablePaletteLayout: PropTypes.string,\n\tenableNarrowPalette: PropTypes.bool,\n\tpaletteJSON: PropTypes.object,\n\tshowPalette: PropTypes.bool,\n\tisEditingEnabled: PropTypes.bool\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\tenablePaletteLayout: state.canvasconfig.enablePaletteLayout,\n\tenableNarrowPalette: state.canvasconfig.enableNarrowPalette,\n\tisEditingEnabled: state.canvasconfig.enableEditingActions,\n\tpaletteJSON: state.palette.content,\n\t// TODO - No need to do this when paletteInitialState is removed\n\tshowPalette: typeof state.palette.isOpen === \"undefined\" ? false : state.palette.isOpen\n});\n\nexport default connect(mapStateToProps)(Palette);\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 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\";\n\nconst CM_TOOLBAR_GAP = 4;\nconst CM_ICON_SIZE = 32;\nconst CM_ICON_PAD = 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}\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 subPanel = this.getSubPanel(menuItem);\n\t\tconst subMenu = !subPanel && menuItem.menu ? this.getSubMenu(menuItem) : null;\n\t\treturn {\n\t\t\taction: menuItem.action,\n\t\t\tlabel: menuItem.label,\n\t\t\tsubMenu: subMenu,\n\t\t\tsubPanel: subPanel,\n\t\t\tenable: this.getEnable(menuItem),\n\t\t\ticonEnabled: menuItem.icon\n\t\t};\n\t}\n\n\tgetSubPanel(menuItem) {\n\t\tif (menuItem.action === \"colorBackground\") {\n\t\t\treturn this.buildColorPicker();\n\t\t}\n\t\treturn null;\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\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 toolbarItemsCount = toolbarItems.length + overflowItemCount;\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 correcty with differnet browser magnificaitons.\n\t\tconst reduction = overflowMenuItems.length > 0 ? 5 : 0;\n\t\treturn (toolbarItemsCount * (CM_ICON_SIZE + CM_ICON_PAD)) - 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 unecessary 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, editParam) {\n\t\tthis.props.canvasController.setMouseInContextToolbar(false);\n\t\tthis.props.canvasController.closeContextToolbar();\n\t\tthis.props.canvasController.contextMenuActionHandler(action, editParam);\n\t}\n\n\tcolorClicked(color) {\n\t\tthis.toolbarActionHandler(\"colorSelectedObjects\", { color });\n\t}\n\n\tbuildColorPicker() {\n\t\treturn (\n\t\t\t<ColorPicker clickActionHandler={this.colorClicked} />\n\t\t);\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 === \"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\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 && !cmItem.divider);\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\tconst x = this.shouldCenterJustifyToolbar()\n\t\t\t\t? pos.x - (toolbarWidth / 2)\n\t\t\t\t: pos.x - toolbarWidth;\n\t\t\tconst y = (pos.y - CM_ICON_SIZE) - CM_TOOLBAR_GAP;\n\n\t\t\tcontextToolbar = (\n\t\t\t\t<div className={\"context-toolbar\"} style={{ left: x, top: y, width: toolbarWidth }}\n\t\t\t\t\tonMouseEnter={this.onMouseEnter} onMouseLeave={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\tsize={\"sm\"}\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-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 { 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 Logger from \"../logging/canvas-logger.js\";\nimport { Code32, Link32, ListBulleted32, ListNumbered32, TextIndentMore32,\n\tTextBold32, TextItalic32, TextScale32, TextStrikethrough32 } from \"@carbon/icons-react\";\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.logger = new Logger(\"CC-Text-Toolbar\");\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\tgetTextToolbar() {\n\t\tconst headerLabel = this.getJsxLabel(\"texttoolbar.headerAction\", \">\", \"<\");\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 codeLabel = this.getJsxLabel(\"texttoolbar.codeAction\", \"e\");\n\t\tconst linkLabel = this.getJsxLabel(\"texttoolbar.linkAction\", \"k\");\n\t\tconst quoteLabel = this.getJsxLabel(\"texttoolbar.quoteAction\", \"shift + >\");\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: (<TextScale32 />) },\n\t\t\t\t{ divider: true },\n\t\t\t\t{ action: \"bold\", label: boldLabel, enable: true, iconEnabled: (<TextBold32 />) },\n\t\t\t\t{ action: \"italics\", label: italicsLabel, enable: true, iconEnabled: (<TextItalic32 />) },\n\t\t\t\t{ action: \"strikethrough\", label: strikethroughLabel, enable: true, iconEnabled: (<TextStrikethrough32 />) },\n\t\t\t\t{ divider: true },\n\t\t\t\t{ action: \"code\", label: codeLabel, enable: true, iconEnabled: (<Code32 />) },\n\t\t\t\t{ divider: true },\n\t\t\t\t{ action: \"link\", label: linkLabel, enable: true, iconEnabled: (<Link32 />) },\n\t\t\t\t{ divider: true },\n\t\t\t\t{ action: \"quote\", label: quoteLabel, enable: true, iconEnabled: (<TextIndentMore32 />) },\n\t\t\t\t{ divider: true },\n\t\t\t\t{ action: \"numberedList\", label: numberedListLabel, enable: true, iconEnabled: (<ListNumbered32 />) },\n\t\t\t\t{ action: \"bulletedList\", label: bulletedListLabel, enable: true, iconEnabled: (<ListBulleted32 />) }\n\t\t\t]\n\t\t};\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 className={\"text-toolbar\"} style={{ left: this.props.pos_x, top: this.props.pos_y }} onBlur={this.props.blurHandler}>\n\t\t\t\t\t<Toolbar\n\t\t\t\t\t\tconfig={this.getTextToolbar()}\n\t\t\t\t\t\tinstanceId={this.props.canvasController.getInstanceId()}\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/>\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\n\t// Provided by redux\n\tisOpen: PropTypes.bool.isRequired,\n\tpos_x: PropTypes.number,\n\tpos_y: PropTypes.number,\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\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 { Locked16, EditOff16 } from \"@carbon/icons-react\";\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, (<Locked16 />));\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, (<EditOff16 />));\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, &amp; 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 '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;'\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","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","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","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","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)\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 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 currentTarget = 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 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 React from \"react\";\nimport ReactDOM from \"react-dom\";\n\nexport const addNodeExternalObject = (node, i, foreignObjects) => {\n\tReactDOM.render(\n\t\t<node.layout.nodeExternalObject\n\t\t\tnodeData={node}\n\t\t/>,\n\t\tforeignObjects[i]\n\t);\n};\n\nexport const addDecExternalObject = (dec, i, foreignObjects) => {\n\tReactDOM.render(dec.jsx, foreignObjects[i]);\n};\n\nexport const removeExternalObject = (obj, i, foreignObjects) => {\n\tReactDOM.unmountComponentAtNode(foreignObjects[i]);\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-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 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\nexport default class SvgCanvasNodes {\n\tconstructor(canvasLayout) {\n\t\tthis.canvasLayout = canvasLayout;\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\tgetNodeImageClass(node) {\n\t\treturn \"d3-node-image\";\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\tgetNodeInputPortLeftPosX(node) {\n\t\treturn this.getElementPosX(node.width, node.layout.inputPortLeftPosX, node.layout.inputPortLeftPosition);\n\t}\n\n\tgetNodeInputPortLeftPosY(node) {\n\t\treturn this.getElementPosY(node.height, node.layout.inputPortLeftPosY, node.layout.inputPortLeftPosition);\n\t}\n\n\tgetNodeOutputPortRightPosX(node) {\n\t\treturn this.getElementPosX(node.width, node.layout.outputPortRightPosX, node.layout.outputPortRightPosition);\n\t}\n\n\tgetNodeOutputPortRightPosY(node) {\n\t\treturn this.getElementPosY(node.height, node.layout.outputPortRightPosY, node.layout.outputPortRightPosition);\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-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\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","/*\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 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_CURVE, LINK_TYPE_ELBOW, LINK_TYPE_STRAIGHT,\n\tLINK_DIR_TOP_BOTTOM, LINK_DIR_BOTTOM_TOP,\n\tNORTH, SOUTH, EAST, WEST }\n\tfrom \"./constants/canvas-constants\";\n\nconst CLOCKWISE = false;\nconst ANTI_CLOCKWISE = true;\nconst ONE_EIGHTY_DEGREES_IN_RADIANS = Math.PI;\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 cordinate.\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 straight 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\tgetNewStraightNodeLinkStartPos(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));\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\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\t// If its a very short line to be drawn just draw a straight line instead\n\t\t// of zig-zagging in a very small space.\n\t\tif (Math.abs(link.x1 - link.x2) < 20 &&\n\t\t\t\tMath.abs(link.y1 - link.y2) < 20) {\n\t\t\treturn this.getStraightPath(link);\n\n\t\t} else if (link.type === NODE_LINK) {\n\n\t\t\tif (this.canvasLayout.linkType === LINK_TYPE_CURVE ||\n\t\t\t\t\tthis.canvasLayout.linkType === LINK_TYPE_ELBOW) {\n\t\t\t\treturn this.getPortLinkPath(link, minInitialLine);\n\t\t\t}\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);\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 = 10;\n\t\t}\n\t\treturn minInitialLine;\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.linkType === LINK_TYPE_STRAIGHT) {\n\t\t\t\tcoords = this.getNodeLinkCoordsForStraightLine(srcObj, trgNode, link);\n\t\t\t} else {\n\t\t\t\tcoords = this.getNodeLinkCoordsForPorts(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.getNodeLinkCoordsForStraightLine(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\tgetNodeLinkCoordsForStraightLine(srcNode, trgNode, link) {\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\" && !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.srcOriginInfo) {\n\t\t\t\t({ x: srcCenterX, y: srcCenterY } = this.getCenterOffset(srcNode, link.srcOriginInfo));\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\" && !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.trgOriginInfo) {\n\t\t\t\t({ x: trgCenterX, y: trgCenterY } = this.getCenterOffset(trgNode, link.trgOriginInfo));\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\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,\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 {\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};\n\t}\n\n\tgetCenterOffset(node, originInfo) {\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.nodeUtils.getNodeCenterPosY(node);\n\n\t\t} else if (originInfo.dir === EAST ||\n\t\t\t\t\t\t\t\toriginInfo.dir === WEST) {\n\t\t\tx = this.nodeUtils.getNodeCenterPosX(node);\n\t\t\ty = node.y_pos + ((node.height / parts) * index);\n\t\t}\n\n\t\treturn { x, y };\n\t}\n\n\tgetNodeLinkCoordsForPorts(srcNode, srcPortId, trgNode, trgPortId) {\n\t\tlet srcX = srcNode.width + srcNode.layout.outputPortRightPosX;\n\t\tlet srcY = srcNode.layout.outputPortRightPosY;\n\t\tlet trgX = trgNode.layout.inputPortLeftPosX;\n\t\tlet trgY = trgNode.layout.inputPortLeftPosY;\n\n\t\tif (this.canvasLayout.linkDirection === LINK_DIR_TOP_BOTTOM) {\n\t\t\tsrcX = srcNode.layout.outputPortBottomPosX;\n\t\t\tsrcY = srcNode.height + srcNode.layout.outputPortBottomPosY;\n\t\t\ttrgX = trgNode.layout.inputPortTopPosX;\n\t\t\ttrgY = trgNode.layout.inputPortTopPosY;\n\n\t\t} else if (this.canvasLayout.linkDirection === LINK_DIR_BOTTOM_TOP) {\n\t\t\tsrcX = srcNode.layout.outputPortBottomPosX;\n\t\t\tsrcY = srcNode.layout.outputPortBottomPosY;\n\t\t\ttrgX = trgNode.layout.inputPortTopPosX;\n\t\t\ttrgY = trgNode.height + trgNode.layout.inputPortTopPosY;\n\t\t}\n\n\t\tif (srcNode.outputs && srcNode.outputs.length > 0) {\n\t\t\tconst port = srcNode.outputs.find((srcPort) => srcPort.id === srcPortId);\n\t\t\tsrcX = port ? port.cx : srcX;\n\t\t\tsrcY = port ? port.cy : srcY;\n\t\t}\n\n\t\tif (trgNode.inputs && trgNode.inputs.length > 0) {\n\t\t\tconst port = trgNode.inputs.find((trgPort) => trgPort.id === trgPortId);\n\t\t\ttrgX = port ? port.cx : trgX;\n\t\t\ttrgY = port ? port.cy : trgY;\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};\n\t}\n\n\tgetAssociationCurveLinkCoords(srcNode, trgNode, assocLinkVariation) {\n\t\tlet x1 = 0;\n\t\tlet x2 = 0;\n\n\t\tif (assocLinkVariation === ASSOC_VAR_CURVE_RIGHT) {\n\t\t\tx1 = srcNode.x_pos + srcNode.width;\n\t\t\tx2 = trgNode.x_pos;\n\n\t\t} else if (assocLinkVariation === ASSOC_VAR_CURVE_LEFT) {\n\t\t\tx1 = srcNode.x_pos;\n\t\t\tx2 = trgNode.x_pos + trgNode.width;\n\n\t\t} else if (assocLinkVariation === ASSOC_VAR_DOUBLE_BACK_LEFT) {\n\t\t\tx1 = srcNode.x_pos;\n\t\t\tx2 = trgNode.x_pos;\n\n\t\t} else {\n\t\t\tx1 = srcNode.x_pos + srcNode.width;\n\t\t\tx2 = trgNode.x_pos + trgNode.width;\n\t\t}\n\n\t\treturn {\n\t\t\tx1: x1,\n\t\t\ty1: srcNode.y_pos + srcNode.layout.outputPortRightPosY,\n\t\t\tx2: x2,\n\t\t\ty2: trgNode.y_pos + trgNode.layout.inputPortLeftPosY };\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\t// Returns the path info, for the object passed in, which describes either a\n\t// curved or elbow connector line. This method can be called either for\n\t// drawing a connection line between nodes or for a new link line being\n\t// drawn out from a source node towards a target node. This method handles\n\t// the Top->Bottom and Bottom->Top configurations by rotating the input\n\t// variables to make them look like a Left->Right configuration and then,\n\t// after calculating the link line path, rotating the path back to fit the\n\t// Top->Bottom or Bottom->Top configuration.\n\t// The pathInfo returned contains:\n\t// path - an SVG path string describing the curved/elbow line\n\t// centerPoint - the center point of the line used for decoration placement\n\tgetPortLinkPath(link, minInitialLine) {\n\t\tlet topSrc;\n\t\tlet topTrg;\n\t\tlet bottomSrc;\n\t\tlet bottomTrg;\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\tif (this.canvasLayout.linkDirection === LINK_DIR_TOP_BOTTOM) {\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} else if (this.canvasLayout.linkDirection === LINK_DIR_BOTTOM_TOP) {\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} 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\tif (this.canvasLayout.linkDirection === LINK_DIR_TOP_BOTTOM) {\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} else if (this.canvasLayout.linkDirection === LINK_DIR_BOTTOM_TOP) {\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} 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\tlet newData = link;\n\t\t// Rotate the input data for TB and BT link configurations to be Left->Right\n\t\tif (this.canvasLayout.linkDirection === LINK_DIR_TOP_BOTTOM) {\n\t\t\tnewData = this.rotateData90Degrees(newData, ANTI_CLOCKWISE);\n\n\t\t} else if (this.canvasLayout.linkDirection === LINK_DIR_BOTTOM_TOP) {\n\t\t\tnewData = this.rotateData90Degrees(newData, CLOCKWISE);\n\t\t}\n\n\t\tconst pathInfo = this.canvasLayout.linkType === LINK_TYPE_ELBOW\n\t\t\t? this.getElbowPathInfo(newData, minInitialLine, topSrc, topTrg, bottomSrc, bottomTrg)\n\t\t\t: this.getCurvePathInfo(newData, minInitialLine, topSrc, topTrg, bottomSrc, bottomTrg);\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 (this.canvasLayout.linkDirection === LINK_DIR_TOP_BOTTOM) {\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 (this.canvasLayout.linkDirection === LINK_DIR_BOTTOM_TOP) {\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}\n\n\t\tpathInfo.path = this.createPath(pathInfo.elements);\n\n\t\treturn pathInfo;\n\t}\n\n\t// Returns a pathInfo object describing a curved conneciton line based on the\n\t// data object and minInitialLine passed in. topSrc, topTrg, bottomSrc,\n\t// bottomTrg describe the boundaries of the source and target node as they\n\t// would be in the left->right orientation. 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 coordinate for the center of the line\n\t// centerPoint is used for decoration placement.\n\tgetCurvePathInfo(data, minInitialLine, topSrc, topTrg, bottomSrc, bottomTrg) {\n\t\t// Declare points for decorator positioning. CenterPoint will be the\n\t\t// middle of the line.\n\t\tconst centerPoint = { x: 0, y: 0 };\n\t\tconst xDiff = data.x2 - data.x1;\n\n\t\tconst elements = [];\n\t\telements.push({ p: \"M\", x: data.x1, y: data.y1 });\n\n\t\tif (xDiff >= minInitialLine ||\n\t\t\t\t(bottomTrg > topSrc - this.canvasLayout.wrapAroundNodePadding &&\n\t\t\t\t\ttopTrg < bottomSrc + this.canvasLayout.wrapAroundNodePadding &&\n\t\t\t\t\tdata.x2 > data.x1)) {\n\t\t\tconst corner1X = data.x1 + (data.x2 - data.x1) / 2;\n\t\t\tconst corner1Y = data.y1;\n\t\t\tconst corner2X = corner1X;\n\t\t\tconst corner2Y = data.y2;\n\n\t\t\telements.push(\n\t\t\t\t{ p: \"C\", x: corner1X, y: corner1Y, x2: corner2X, y2: corner2Y, x3: data.x2, y3: data.y2 }\n\t\t\t);\n\t\t\tcenterPoint.x = corner1X;\n\t\t\tcenterPoint.y = corner1Y + ((corner2Y - corner1Y) / 2);\n\n\t\t} else {\n\t\t\tconst yDiff = data.y2 - data.y1;\n\n\t\t\tconst midY = this.calculateMidY(data, topSrc, bottomSrc, topTrg, bottomTrg);\n\n\t\t\t// Calculate an offset for the start points of the straight line. This\n\t\t\t// will be relative to the start and end point of the curve. This needs\n\t\t\t// to be based on the X gap between the source and target nodes but also\n\t\t\t// dependent on the Y gap between those nodes because, as the Y gap\n\t\t\t// increases, we want the straight line to decrease in size.\n\t\t\tconst offsetForStraightLine = Math.min((Math.abs(yDiff) / 2), -(xDiff - minInitialLine / 2));\n\n\t\t\t// Calculate an offset for the first and last corners. This allows the\n\t\t\t// curve to 'grow' slowly out from a straight line to a point where the\n\t\t\t// initial corners of the curve are a maximum of minInitialLine.\n\t\t\tconst offsetForFirstCorner = minInitialLine - Math.max((xDiff / 2), 0);\n\n\t\t\tconst corner1X = data.x1 + offsetForFirstCorner;\n\t\t\tconst corner1Y = data.y1;\n\n\t\t\tconst corner2X = corner1X;\n\t\t\tconst corner2Y = data.y1 + ((midY - data.y1) / 2);\n\n\t\t\tconst corner4X = data.x1 + ((data.x2 - data.x1) / 2);\n\t\t\tconst corner4Y = midY;\n\n\t\t\tconst corner4aX = data.x1 - offsetForStraightLine;\n\t\t\tconst corner4aY = midY;\n\n\t\t\tconst corner4bX = data.x2 + offsetForStraightLine;\n\t\t\tconst corner4bY = midY;\n\n\t\t\tconst corner5X = data.x2 - offsetForFirstCorner;\n\t\t\tconst corner5Y = midY;\n\n\t\t\tconst corner6X = corner5X;\n\t\t\tconst corner6Y = midY + ((data.y2 - midY) / 2);\n\n\t\t\t// There is enough space we draw a straight line to join one end of the\n\t\t\t// curve to another. Otherwise we just draw a continuous curve with no\n\t\t\t// straight line.\n\t\t\tif (corner4aX > corner4bX) {\n\t\t\t\telements.push(\n\t\t\t\t\t{ p: \"Q\", x: corner1X, y: corner1Y, x2: corner2X, y2: corner2Y },\n\t\t\t\t\t{ p: \"T\", x: corner4aX, y: corner4aY },\n\t\t\t\t\t{ p: \"L\", x: corner4bX, y: corner4bY },\n\t\t\t\t\t{ p: \"Q\", x: corner5X, y: corner5Y, x2: corner6X, y2: corner6Y },\n\t\t\t\t\t{ p: \"T\", x: data.x2, y: data.y2 }\n\t\t\t\t);\n\n\t\t\t\tcenterPoint.x = corner4aX + ((corner4bX - corner4aX) / 2);\n\t\t\t\tcenterPoint.y = corner4aY;\n\t\t\t} else {\n\t\t\t\telements.push(\n\t\t\t\t\t{ p: \"Q\", x: corner1X, y: corner1Y, x2: corner2X, y2: corner2Y },\n\t\t\t\t\t{ p: \"T\", x: corner4X, y: corner4Y },\n\t\t\t\t\t{ p: \"Q\", x: corner5X, y: corner5Y, x2: corner6X, y2: corner6Y },\n\t\t\t\t\t{ p: \"T\", x: data.x2, y: data.y2 }\n\t\t\t\t);\n\n\t\t\t\tcenterPoint.x = corner4X;\n\t\t\t\tcenterPoint.y = corner4Y;\n\t\t\t}\n\t\t}\n\n\t\treturn { elements, 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\tgetElbowPathInfo(data, minInitialLine, topSrc, topTrg, bottomSrc, bottomTrg) {\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\tconst minFinalLine = data.trgNode ? data.trgNode.layout.minFinalLine : 30;\n\n\t\t// Initalize centerPoint which can be used by the link decorations\n\t\tconst centerPoint = { x: 0, y: 0 };\n\n\t\tconst corner1X = data.x1 + minInitialLine;\n\t\tconst corner1Y = data.y1;\n\t\tlet corner2X = corner1X;\n\t\tconst corner2Y = data.y2;\n\n\t\tconst xDiff = data.x2 - data.x1;\n\t\tconst yDiff = data.y2 - data.y1;\n\n\t\tlet elbowYOffset;\n\n\t\t// This is a special case where the source and target handles are very\n\t\t// close together.\n\t\tif (xDiff > 0 &&\n\t\t\t\tyDiff < (4 * this.canvasLayout.elbowSize) &&\n\t\t\t\tyDiff > -(4 * this.canvasLayout.elbowSize)) {\n\t\t\tif (xDiff < (minInitialLine + minFinalLine)) {\n\t\t\t\telbowYOffset = yDiff / 4;\n\t\t\t} else {\n\t\t\t\telbowYOffset = yDiff / 2;\n\t\t\t}\n\n\t\t} else {\n\t\t\tif (yDiff >= 0) {\n\t\t\t\telbowYOffset = this.canvasLayout.elbowSize;\n\t\t\t} else {\n\t\t\t\telbowYOffset = -this.canvasLayout.elbowSize;\n\t\t\t}\n\t\t}\n\n\t\tlet elbowXOffset = this.canvasLayout.elbowSize;\n\t\tlet extraSegments = false;\t// Indicates need for extra elbows and lines\n\n\t\tif (xDiff < (minInitialLine + minFinalLine)) {\n\t\t\textraSegments = true;\n\t\t\tcorner2X = data.x2 - minFinalLine;\n\t\t\telbowXOffset = Math.min(this.canvasLayout.elbowSize, -((xDiff - (minInitialLine + minFinalLine)) / 2));\n\t\t}\n\n\t\tconst elements = [];\n\t\telements.push(\n\t\t\t{ p: \"M\", x: data.x1, y: data.y1 },\n\t\t\t{ p: \"L\", x: (corner1X - this.canvasLayout.elbowSize), y: corner1Y },\n\t\t);\n\n\t\tif (extraSegments === false) {\n\t\t\telements.push(\n\t\t\t\t{ p: \"Q\", x: corner1X, y: corner1Y, x2: corner1X, y2: (corner1Y + elbowYOffset) },\n\t\t\t\t{ p: \"L\", x: corner2X, y: (corner2Y - elbowYOffset) }\n\t\t\t);\n\n\t\t\tcenterPoint.x = corner2X;\n\t\t\tcenterPoint.y = corner2Y;\n\n\t\t} else {\n\t\t\tconst midY = (xDiff < 0)\n\t\t\t\t? this.calculateMidY(data, topSrc, bottomSrc, topTrg, bottomTrg)\n\t\t\t\t: corner2Y - (corner2Y - corner1Y) / 2;\n\n\t\t\tif (xDiff < 0) {\n\t\t\t\tif (midY >= bottomSrc) {\n\t\t\t\t\telbowYOffset = this.canvasLayout.elbowSize;\n\t\t\t\t} else {\n\t\t\t\t\telbowYOffset = -this.canvasLayout.elbowSize;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet corner2Ya;\n\t\t\tlet corner2Yb;\n\n\t\t\tif ((midY < topTrg && midY < topSrc) ||\n\t\t\t\t\t(midY > bottomTrg && midY > bottomSrc)) {\n\t\t\t\tcorner2Ya = midY - elbowYOffset;\n\t\t\t\tcorner2Yb = corner2Y + elbowYOffset;\n\n\t\t\t} else {\n\t\t\t\tcorner2Ya = midY + elbowYOffset;\n\t\t\t\tcorner2Yb = corner2Y - elbowYOffset;\n\t\t\t}\n\n\t\t\telements.push(\n\t\t\t\t{ p: \"Q\", x: corner1X, y: corner1Y, x2: corner1X, y2: (corner1Y + elbowYOffset) },\n\t\t\t\t{ p: \"L\", x: corner1X, y: (midY - elbowYOffset) },\n\t\t\t\t{ p: \"Q\", x: corner1X, y: midY, x2: (corner1X - elbowXOffset), y2: midY },\n\t\t\t\t{ p: \"L\", x: (corner2X + elbowXOffset), y: midY },\n\t\t\t\t{ p: \"Q\", x: corner2X, y: midY, x2: corner2X, y2: corner2Ya },\n\t\t\t\t{ p: \"L\", x: corner2X, y: corner2Yb }\n\t\t\t);\n\n\t\t\tcenterPoint.x = corner1X;\n\t\t\tcenterPoint.y = midY;\n\t\t}\n\n\t\telements.push(\n\t\t\t{ p: \"Q\", x: corner2X, y: corner2Y, x2: (corner2X + this.canvasLayout.elbowSize), y2: corner2Y },\n\t\t\t{ p: \"L\", x: data.x2, y: data.y2 }\n\t\t);\n\n\t\treturn { elements, centerPoint };\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\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 degress in the anti-clockwise dirction 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 { 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 anit-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 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\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(data) {\n\t\tconst path = \"M \" + data.x1 + \" \" + data.y1 + \" L \" + data.x2 + \" \" + data.y2;\n\t\tconst xDiff = data.x2 - data.x1;\n\t\tconst yDiff = data.y2 - data.y1;\n\t\tconst centerPoint = {\n\t\t\tx: data.x1 + (xDiff / 2),\n\t\t\ty: data.y1 + (yDiff / 2)\n\t\t};\n\t\tlet angle = Math.atan(yDiff / xDiff); // Atan(Opposite / Adjacent) = Angle in Radians\n\n\t\tif (xDiff < 0) {\n\t\t\tangle = ONE_EIGHTY_DEGREES_IN_RADIANS + angle;\n\t\t}\n\n\t\treturn { path, centerPoint, angle };\n\t}\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 = this.calcCenterPoint(data.x1, corner1X, corner2X, data.x2);\n\t\tconst centerPointY = this.calcCenterPoint(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 an x or y coordinate of the center point on a bezier curve from\n\t// the four x or y coordinates passed in which are the coordinates of the four\n\t// control points that describe the curve.\n\tcalcCenterPoint(c1, c2, c3, c4) {\n\t\tconst t = 0.5;\n\n\t\tconst part1 = Math.pow((1 - t), 3) * c1;\n\t\tconst part2 = 3 * Math.pow((1 - t), 2) * t * c2;\n\t\tconst part3 = 3 * Math.pow((1 - t), 2) * t * c3;\n\t\tconst part4 = Math.pow(t, 3) * c4;\n\n\t\treturn part1 + part2 + part3 + part4;\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\nimport { has } from \"lodash\";\nimport { DEC_LINK, TEXT_AREA_BORDER_ADJUSTMENT } from \"./constants/canvas-constants\";\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\treturn `translate(${this.getDecPosX(dec, d, objType)}, ${this.getDecPosY(dec, d, objType)})`;\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\tx += Math.cos(link.pathInfo.angle) * 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\ty += Math.sin(link.pathInfo.angle) * 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","var basePropertyOf = require('./_basePropertyOf');\n\n/** Used to map HTML entities to characters. */\nvar htmlUnescapes = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\"\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 * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` 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, &amp; 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.findSuceedingNewLine(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.findSuceedingNewLine(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.findSuceedingNewLine(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.findSuceedingNewLine(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.findSuceedingNewLine(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 (text[end] !== \"\\n\" || text[end + 1] !== \"\\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 findSuceedingNewLine(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.findSuceedingNewLine(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-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/* eslint no-invalid-this: \"off\" */\n\nimport * as d3Selection from \"d3-selection\";\nconst d3 = Object.assign({}, d3Selection);\n\nimport { unescape as unescapeText } from \"lodash\";\n\nimport Logger from \"../logging/canvas-logger.js\";\nimport CanvasUtils from \"./common-canvas-utils.js\";\nimport SvgCanvasMarkdown from \"./svg-canvas-utils-markdown.js\";\n\nconst BACKSPACE_KEY = 8;\nconst RETURN_KEY = 13;\nconst ESC_KEY = 27;\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;\nconst B_KEY = 66;\nconst E_KEY = 69;\nconst I_KEY = 73;\nconst K_KEY = 75;\nconst X_KEY = 88;\nconst LAB_KEY = 188; // Left angle bracket <\nconst RAB_KEY = 190; // Right angle bracket >\nconst SEVEN_KEY = 55;\nconst EIGHT_KEY = 56;\n\nconst SCROLL_PADDING = 12;\n\nexport default class SvgCanvasTextArea {\n\n\tconstructor(config, dispUtils, nodeUtils, decUtils, canvasController,\n\t\tcanvasDiv, activePipeline, displayCommentsCallback, displayLinksCallback, getCommentToolbarPosCallback) {\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.displayCommentsCallback = displayCommentsCallback;\n\t\tthis.displayLinksCallback = displayLinksCallback;\n\t\tthis.getCommentToolbarPosCallback = getCommentToolbarPosCallback;\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\tclassName: \"d3-comment-entry\",\n\t\t\tparentDomObj: parentDomObj,\n\t\t\tkeyboardInputCallback: this.config.enableMarkdownInComments ? this.commentKeyboardHandler.bind(this) : 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\t\tthis.displayTextArea(this.editingTextData);\n\n\t\tif (this.config.enableMarkdownInComments && this.dispUtils.isDisplayingFullPage()) {\n\t\t\tconst pos = this.getCommentToolbarPosCallback(d);\n\t\t\tthis.canvasController.openTextToolbar(pos.x, pos.y,\n\t\t\t\tthis.markdownActionHandler.bind(this),\n\t\t\t\tthis.blurInTextToolbar.bind(this));\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-entry\") ||\n\t\t\t\t\tCanvasUtils.getParentElementWithClass(evt.relatedTarget, \"text-toolbar\") ||\n\t\t\t\t\tCanvasUtils.getParentElementWithClass(evt.relatedTarget, \"bx--overflow-menu-options__btn\"))) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If the blur event is ocurring 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// Applies a markdown action to the comment text being edited using\n\t// the same commands as the toolbar.\n\tgetMarkdownAction(d3Event) {\n\t\tif (CanvasUtils.isCmndCtrlPressed(d3Event)) {\n\t\t\tswitch (d3Event.keyCode) {\n\t\t\tcase B_KEY: return \"bold\";\n\t\t\tcase I_KEY: return \"italics\";\n\t\t\tcase X_KEY: return d3Event.shiftKey ? \"strikethrough\" : null;\n\t\t\tcase SEVEN_KEY: return d3Event.shiftKey ? \"numberedList\" : null;\n\t\t\tcase EIGHT_KEY: return d3Event.shiftKey ? \"bulletedList\" : null;\n\t\t\tcase E_KEY: return \"code\";\n\t\t\tcase K_KEY: return \"link\";\n\t\t\tcase LAB_KEY: return \"decreaseHashes\";\n\t\t\tcase RAB_KEY: return d3Event.shiftKey ? \"quote\" : \"increaseHashes\";\n\t\t\tdefault:\n\t\t\t}\n\t\t} else if (d3Event.keyCode === RETURN_KEY) {\n\t\t\treturn \"return\";\n\t\t}\n\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 commentEntry = this.canvasDiv.selectAll(\".d3-comment-entry\");\n\t\tconst commentEntryElement = commentEntry.node();\n\t\tconst start = commentEntryElement.selectionStart;\n\t\tconst end = commentEntryElement.selectionEnd;\n\t\tconst text = commentEntryElement.value;\n\n\t\tconst mdObj = SvgCanvasMarkdown.processMarkdownAction(action, text, start, end);\n\t\tif (mdObj) {\n\t\t\tevt.preventDefault();\n\t\t\tthis.addTextToTextArea(mdObj, commentEntryElement);\n\t\t}\n\t}\n\n\t// Replaces the text in the currently displayed textarea 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 text = unescapeText(mdObj.newText);\n\t\tcommentEntryElement.focus();\n\t\tcommentEntryElement.select();\n\t\tdocument.execCommand(\"insertText\", false, text);\n\t\tcommentEntryElement.setSelectionRange(mdObj.newStart, mdObj.newEnd);\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\tconst scrollHeight = textArea.scrollHeight + SCROLL_PADDING;\n\t\tif (this.textAreaHeight < scrollHeight) {\n\t\t\tthis.textAreaHeight = scrollHeight;\n\t\t\tthis.foreignObject.style(\"height\", this.textAreaHeight + \"px\");\n\t\t\tthis.activePipeline.getComment(data.id).height = this.textAreaHeight;\n\t\t\tthis.displayCommentsCallback();\n\t\t\tthis.displayLinksCallback();\n\t\t}\n\t}\n\n\tsaveCommentChanges(id, newText, newHeight) {\n\t\tconst comment = this.activePipeline.getComment(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\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\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.displayTextArea(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\tthis.foreignObject.style(\"height\", 0);\n\t\tconst scrollHeight = textArea.scrollHeight + SCROLL_PADDING;\n\t\tthis.textAreaHeight = scrollHeight;\n\t\tthis.foreignObject.style(\"height\", this.textAreaHeight + \"px\");\n\t}\n\n\tsaveNodeLabelChanges(id, newText, newHeight, taData) {\n\t\tconst data = {\n\t\t\teditType: \"setNodeLabel\",\n\t\t\teditSource: \"canvas\",\n\t\t\tnodeId: 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 text area for an editable 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\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.displayTextArea(this.editingTextData);\n\t}\n\n\t// Handles saved changes to editable text decorations.\n\tsaveDecLabelChanges(id, newText, newHeight, taData) {\n\t\tconst data = {\n\t\t\teditType: \"editDecorationLabel\",\n\t\t\teditSource: \"canvas\",\n\t\t\tdecId: 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 text area to allow text entry and editing for: comments;\n\t// node labels; or text decorations on either a node or link.\n\tdisplayTextArea(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.foreignObject = 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.foreignObject\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.on(\"keydown\", (d3Event) => {\n\t\t\t\t// If user hits return/enter\n\t\t\t\tif (d3Event.keyCode === RETURN_KEY) {\n\t\t\t\t\tif (data.allowReturnKey === \"save\") {\n\t\t\t\t\t\tthis.textContentSaved = true;\n\t\t\t\t\t\tthis.saveAndCloseTextArea(data, d3Event.target.value, 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 just\n\t\t\t\t// closing the text area.\n\t\t\t\tif (d3Event.keyCode === ESC_KEY) {\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}\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})\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\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.value, 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})\n\t\t\t.on(\"mousedown click dblclick contextmenu\", (d3Event, d) => {\n\t\t\t\td3Event.stopPropagation(); // Allow default behavior to show system contenxt menu\n\t\t\t});\n\n\t\ttextArea.node().focus();\n\n\t\t// Set the cusrsor 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. evt may be undefined when called from the\n\t// canvas renderer.\n\tcompleteEditing(evt) {\n\t\t// const commentEntry = this.canvasDiv.selectAll(\".d3-comment-entry\");\n\t\tconst commentEntry = this.foreignObject.selectAll(\"textarea\");\n\t\tconst commentEntryElement = commentEntry.node();\n\t\tthis.textContentSaved = true;\n\t\tthis.saveAndCloseTextArea(this.editingTextData, commentEntryElement.value, evt);\n\t}\n\n\tsaveAndCloseTextArea(data, newValue, d3Event) {\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\tconst newText = newValue; // Save the text before closing the foreign object\n\t\tthis.closeTextArea(data);\n\t\tif (data.text !== newText || this.textAreaHeight !== data.height) {\n\t\t\tdata.saveTextChangesCallback(data.id, newText, this.textAreaHeight, data);\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\tthis.foreignObject.remove();\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 && CanvasUtils.isCmndCtrlPressed(d3Event));\n\t}\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/* 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\";\n\n\nexport default class SVGCanvasPipeline {\n\tconstructor(pipelineId, canvasInfo, selectionInfo) {\n\t\tthis.logger = new Logger(\"SVGCanvasActivePipeline\");\n\t\tthis.logger.log(\"constructor - start\");\n\n\t\tthis.initialize(pipelineId, canvasInfo, selectionInfo);\n\n\t\tthis.logger.log(\"constructor - end\");\n\t}\n\n\tinitialize(pipelineId, canvasInfo, selectionInfo) {\n\t\tthis.logger.logStartTimer(\"initialize\");\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\t\tthis.logger.logEndTimer(\"initialize\");\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\tgetNodes(nodeIds) {\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);\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 satus 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 isPosrtConnected 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.\n\tgetSelectedNodes() {\n\t\tvar objs = [];\n\t\tthis.nodes.forEach((node) => {\n\t\t\tif (this.getSelectedObjectIds().includes(node.id)) {\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 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","/*\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-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 d3Drag from \"d3-drag\";\nimport * as d3Ease from \"d3-ease\";\nimport * as d3Selection from \"d3-selection\";\nimport * as d3Fetch from \"d3-fetch\";\nimport * as d3Zoom from \"./d3-zoom-extension/src\";\nconst d3 = Object.assign({}, d3Drag, d3Ease, d3Selection, d3Fetch, d3Zoom);\n\nconst markdownIt = require(\"markdown-it\")({\n\thtml: false, // Don't allow HTML to be executed in comments.\n\tlinkify: false, // Don't convert strings, in URL format, to be links.\n\ttypographer: true\n});\n\nimport { cloneDeep, escape as escapeText, forOwn, get } from \"lodash\";\nimport { addNodeExternalObject, addDecExternalObject, removeExternalObject } from \"./svg-canvas-utils-external.js\";\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_CURVE, LINK_TYPE_ELBOW, LINK_TYPE_STRAIGHT,\n\tLINK_DIR_LEFT_RIGHT, LINK_DIR_TOP_BOTTOM, LINK_DIR_BOTTOM_TOP,\n\tLINK_SELECTION_NONE, LINK_SELECTION_HANDLES, LINK_SELECTION_DETACHABLE,\n\tCONTEXT_MENU_BUTTON, DEC_LINK, DEC_NODE, LEFT_ARROW_ICON, EDIT_ICON,\n\tNODE_MENU_ICON, SUPER_NODE_EXPAND_ICON, PORT_OBJECT_CIRCLE, PORT_OBJECT_IMAGE,\n\tTIP_TYPE_NODE, TIP_TYPE_PORT, TIP_TYPE_DEC, TIP_TYPE_LINK,\n\tINTERACTION_MOUSE, INTERACTION_TRACKPAD, INTERACTION_CARBON,\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\tfrom \"./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 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 SvgCanvasTextArea from \"./svg-canvas-utils-textarea.js\";\nimport SVGCanvasPipeline from \"./svg-canvas-pipeline\";\n\nconst NINETY_DEGREES = 90;\n\nconst INPUT_TYPE = \"input_type\";\nconst OUTPUT_TYPE = \"output_type\";\n\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, 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.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.displayComments.bind(this), // Function\n\t\t\tthis.displayLinks.bind(this), // Function\n\t\t\tthis.getCommentToolbarPos.bind(this) // Function\n\t\t);\n\n\t\tthis.dispUtils.setDisplayState();\n\t\tthis.logger.log(this.dispUtils.getDisplayStateMsg());\n\n\t\t// Initialize zoom variables\n\t\tthis.initializeZoomVariables();\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// Allows us to track the sizing behavior of comments\n\t\tthis.commentSizing = false;\n\t\tthis.commentSizingDirection = \"\";\n\n\t\t// Allows us to track the sizing behavior of nodes\n\t\tthis.nodeSizing = false;\n\t\tthis.nodeSizingDirection = \"\";\n\t\tthis.nodeSizingObjectsInfo = {};\n\t\tthis.nodeSizingDetLinksInfo = {};\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// 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// Allows us to record the drag behavior or nodes and comments.\n\t\tthis.dragging = false;\n\t\tthis.dragOffsetX = 0;\n\t\tthis.dragOffsetY = 0;\n\t\tthis.dragRunningX = 0;\n\t\tthis.dragRunningY = 0;\n\t\tthis.dragObjects = [];\n\t\tthis.dragStartX = 0;\n\t\tthis.dragStartY = 0;\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// An object containing the x and y offset of the position of the mouse\n\t\t// pointer from the top left corner of the node that is being dragged.\n\t\tthis.dragPointerOffsetInNode = null;\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// Flag to indicate if the current drag 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 drag 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// Flag to indicate when the space key is down (used when dragging).\n\t\tthis.spaceKeyPressed = false;\n\n\t\t// Flag to indicate when a zoom is invoked programmatically.\n\t\tthis.zoomingAction = false;\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// 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// 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 object for use with nodes and comments.\n\t\tthis.drag = d3.drag()\n\t\t\t.on(\"start\", this.dragStart.bind(this))\n\t\t\t.on(\"drag\", this.dragMove.bind(this))\n\t\t\t.on(\"end\", this.dragEnd.bind(this));\n\n\t\tthis.draggingLinkData = null;\n\n\t\tthis.dragSelectionHandle = d3.drag()\n\t\t\t.on(\"start\", this.dragStartLinkHandle.bind(this))\n\t\t\t.on(\"drag\", this.dragMoveLinkHandle.bind(this))\n\t\t\t.on(\"end\", this.dragEndLinkHandle.bind(this));\n\n\t\t// Create a zoom object for use with the canvas.\n\t\tthis.zoom =\n\t\t\td3.zoom()\n\t\t\t\t.trackpad(this.config.enableInteractionType === INTERACTION_TRACKPAD)\n\t\t\t\t.preventBackGesture(true)\n\t\t\t\t.wheelDelta((d3Event) => -d3Event.deltaY * (this.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\tthis.initializeGhostDiv();\n\n\t\tthis.canvasSVG = this.createCanvasSVG();\n\t\tthis.canvasDefs = this.canvasSVG.selectChildren(\"defs\");\n\t\tthis.canvasGrp = this.createCanvasGroup(this.canvasSVG, \"d3-canvas-group\"); // Group to contain all canvas objects\n\t\tthis.canvasUnderlay = this.createCanvasUnderlay(this.canvasGrp, \"d3-canvas-underlay\"); // Put underlay rectangle under comments, nodes and links\n\t\tthis.commentsGrp = this.createCanvasGroup(this.canvasGrp, \"d3-comments-group\"); // Group to always position comments under nodes and links\n\t\tthis.nodesLinksGrp = this.createCanvasGroup(this.canvasGrp, \"d3-nodes-links-group\"); // Group to position nodes and links over comments\n\t\tthis.boundingRectsGrp = this.createBoundingRectanglesGrp(this.canvasGrp, \"d3-bounding-rect-group\"); // Group to optionally add bounding rectangles over all objects\n\n\n\t\tthis.resetCanvasSVGBehaviors();\n\n\t\tthis.displayCanvas();\n\n\t\tif (this.dispUtils.isDisplayingFullPage()) {\n\t\t\tthis.restoreZoom();\n\t\t}\n\n\t\t// If we are showing a sub-flow in full screen mode, or the options is\n\t\t// switched on to always display it, show the 'back to parent' control.\n\t\tif (this.dispUtils.isDisplayingSubFlowFullPage() ||\n\t\t\t\tthis.canvasLayout.alwaysDisplayBackToParentFlow) {\n\t\t\tthis.addBackToParentFlowArrow(this.canvasSVG);\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\tsetSpaceKeyPressed(state) {\n\t\tthis.spaceKeyPressed = 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 as well as internally.\n\tisSpaceKeyPressed() {\n\t\treturn this.spaceKeyPressed;\n\t}\n\n\t// Returns true if the event indicates that a drag is in action. This means\n\t// with regular Mouse interation that the space bar is pressed or with\n\t// legacy interation it means the shift key is NOT pressed.\n\tisDragActivated(d3Event) {\n\t\tif (this.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 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 objects.\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\tgetZoomTransform() {\n\t\treturn this.zoomTransform;\n\t}\n\n\tinitializeZoomVariables() {\n\t\t// Allows us to record the current zoom amounts.\n\t\tthis.zoomTransform = d3.zoomIdentity.translate(0, 0).scale(1);\n\t}\n\n\tsetCanvasInfoRenderer(canvasInfo, selectionInfo, breadcrumbs, nodeLayout, canvasLayout) {\n\t\tthis.logger.logStartTimer(\"setCanvasInfoRenderer\" + this.pipelineId.substring(0, 5));\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, canvasInfo, selectionInfo);\n\n\t\t// Set the display state incase 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\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// inmprovment 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.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\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.initializeZoomVariables();\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\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, incase 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\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\n\t\tthis.displayCanvasAccoutrements();\n\n\t\tthis.logger.logEndTimer(\"displayCanvas\");\n\t}\n\n\tdisplayCanvasAccoutrements() {\n\t\tif (this.config.enableBoundingRectangles) {\n\t\t\tthis.displayBoundingRectangles();\n\t\t}\n\n\t\tif (this.config.enableCanvasUnderlay !== \"None\" && this.dispUtils.isDisplayingPrimaryFlowFullPage()) {\n\t\t\tthis.setCanvasUnderlaySize();\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 poitioned 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.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 = transformedSVGRect.x - d.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 = transformedSVGRect.x + transformedSVGRect.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.getViewportDimensions();\n\t\tconst transformedSVGRect = this.getTransformedRect(svgRect, 1);\n\t\tconst canv = this.getCanvasDimensionsAdjustedForScale(1);\n\t\tconst canvWithPadding = this.getCanvasDimensionsAdjustedForScale(1, this.getZoomToFitPadding());\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.dragging;\n\t}\n\n\t// Returns true if the node should be resizeable. Expanded supernodes are\n\t// always resizabele and all other nodes, except collapsed supernodes, are\n\t// resizeable when enableResizableNodes is switched on.\n\tisNodeResizable(node) {\n\t\tif (!this.config.enableEditingActions ||\n\t\t\t\tCanvasUtils.isSuperBindingNode(node) ||\n\t\t\t\tCanvasUtils.isCollapsedSupernode(node) ||\n\t\t\t\t(!this.config.enableResizableNodes && !CanvasUtils.isExpandedSupernode(node))) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Returns true if the node should have a resizing area. We should display\n\t// a sizing area even for collapsed supernodes so it is available if/when\n\t// the supernode is expanded\n\tshouldDisplayNodeSizingArea(node) {\n\t\treturn !CanvasUtils.isSuperBindingNode(node) &&\n\t\t\t(CanvasUtils.isSupernode(node) || this.config.enableResizableNodes);\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\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\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\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 object passed in with its position and size snapped to\n\t// the current grid dimensions.\n\tsnapToGridObject(inResizeObj) {\n\t\tconst resizeObj = inResizeObj;\n\t\tresizeObj.x_pos = CanvasUtils.snapToGrid(resizeObj.x_pos, this.canvasLayout.snapToGridXPx);\n\t\tresizeObj.y_pos = CanvasUtils.snapToGrid(resizeObj.y_pos, this.canvasLayout.snapToGridYPx);\n\t\tresizeObj.width = CanvasUtils.snapToGrid(resizeObj.width, this.canvasLayout.snapToGridXPx);\n\t\tresizeObj.height = CanvasUtils.snapToGrid(resizeObj.height, this.canvasLayout.snapToGridYPx);\n\t\treturn resizeObj;\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.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// 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.transformPos({ x: x - Math.round(svgRect.left), y: y - Math.round(svgRect.top) });\n\t}\n\n\t// Transforms the x and y fields passed in by the current zoom\n\t// transformation amounts to convert a coordinate position in screen pixels\n\t// to a canvas coordinate position.\n\ttransformPos(pos) {\n\t\treturn {\n\t\t\tx: (pos.x - this.zoomTransform.x) / this.zoomTransform.k,\n\t\t\ty: (pos.y - this.zoomTransform.y) / this.zoomTransform.k\n\t\t};\n\t}\n\n\t// Transforms the x and y fields passed in by the current zoom\n\t// transformation amounts to convert a canvas coordinate position\n\t// to a coordinate position in screen pixels.\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// 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// 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 necssarily 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 that = this;\n\t\tconst ghostDivSel = this.getGhostDivSel();\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 * this.zoomTransform.k)\n\t\t\t.attr(\"height\", (50 + node.height) * this.zoomTransform.k) // 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(\"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\tconst nodeImage = this.getNodeImage(node);\n\t\t\tconst nodeImageType = this.getImageType(nodeImage);\n\n\t\t\tghostGrp\n\t\t\t\t.append(nodeImageType)\n\t\t\t\t.attr(\"class\", \"d3-node-image\")\n\t\t\t\t.each(function() { that.setNodeImageContent(this, node); })\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) * this.zoomTransform.k;\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(${this.zoomTransform.k})`);\n\n\t\t// Get the amount the actual browser page is 'zoomed'. This is differet\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) * this.zoomTransform.k)) * browserZoom;\n\t\tconst centerY = ((node.height / 2) * this.zoomTransform.k) * 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 differet\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 idntifiers 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// Switchs 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 beheavior 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// Switchs off the link highlighting when a node is dragged over a fully or\n\t// partially detached link. This beheavior 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 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\tsetNewLinkOverNode(d3Event) {\n\t\tconst nodeNearMouse = this.getNodeNearMousePos(d3Event, this.canvasLayout.nodeProximity);\n\t\tif (nodeNearMouse && this.isConnectionAllowedToNearbyNode(d3Event, nodeNearMouse)) {\n\t\t\tif (!this.dragNewLinkOverNode) {\n\t\t\t\tthis.dragNewLinkOverNode = nodeNearMouse;\n\t\t\t\tthis.setNewLinkOverNodeHighlighting(this.dragNewLinkOverNode, true);\n\n\t\t\t} else if (nodeNearMouse.id !== this.dragNewLinkOverNode.id) {\n\t\t\t\tthis.setNewLinkOverNodeHighlighting(this.dragNewLinkOverNode, false);\n\t\t\t\tthis.dragNewLinkOverNode = nodeNearMouse;\n\t\t\t\tthis.setNewLinkOverNodeHighlighting(this.dragNewLinkOverNode, true);\n\t\t\t}\n\n\t\t} else {\n\t\t\tif (this.dragNewLinkOverNode) {\n\t\t\t\tthis.setNewLinkOverNodeHighlighting(this.dragNewLinkOverNode, false);\n\t\t\t\tthis.dragNewLinkOverNode = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tisConnectionAllowedToNearbyNode(d3Event, nodeNearMouse) {\n\t\tif (this.drawingNewLinkData) {\n\t\t\tif (this.drawingNewLinkData.action === NODE_LINK) {\n\t\t\t\tconst srcNode = this.drawingNewLinkData.srcNode;\n\t\t\t\tconst trgNode = nodeNearMouse;\n\t\t\t\tconst srcNodePortId = this.drawingNewLinkData.srcNodePortId;\n\t\t\t\tconst trgNodePortId = CanvasUtils.getDefaultInputPortId(trgNode); // TODO - make specific to nodes.\n\t\t\t\treturn CanvasUtils.isDataConnectionAllowed(srcNodePortId, trgNodePortId, srcNode, trgNode, this.activePipeline.links);\n\n\t\t\t} else if (this.drawingNewLinkData.action === ASSOCIATION_LINK) {\n\t\t\t\tconst srcNode = this.drawingNewLinkData.srcNode;\n\t\t\t\tconst trgNode = nodeNearMouse;\n\t\t\t\treturn CanvasUtils.isAssocConnectionAllowed(srcNode, trgNode, this.activePipeline.links);\n\n\t\t\t} else if (this.drawingNewLinkData.action === COMMENT_LINK) {\n\t\t\t\tconst srcObjId = this.drawingNewLinkData.srcObjId;\n\t\t\t\tconst trgNodeId = nodeNearMouse.id;\n\t\t\t\treturn CanvasUtils.isCommentLinkConnectionAllowed(srcObjId, trgNodeId, this.activePipeline.links);\n\t\t\t}\n\t\t} else if (this.draggingLinkData) {\n\t\t\tconst newLink = this.getNewLinkOnDrag(d3Event, this.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// Switches on or off the input-port highlighting on the node passed in.\n\t// This is called when the user drags a new link towards a target node.\n\tsetNewLinkOverNodeHighlighting(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\tsetNewLinkOverNodeCancel() {\n\t\tthis.setNewLinkOverNodeHighlighting(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 explicitely 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\t// Returns true if the current drag 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 dragged.\n\tisExistingNodeInsertableIntoLink() {\n\t\treturn (this.config.enableInsertNodeDroppedOnLink &&\n\t\t\tthis.dragObjects.length === 1 &&\n\t\t\tCanvasUtils.isNode(this.dragObjects[0]) &&\n\t\t\tCanvasUtils.hasInputAndOutputPorts(this.dragObjects[0]) &&\n\t\t\t!CanvasUtils.isNodeDefaultPortsCardinalityAtMax(this.dragObjects[0], this.activePipeline.links));\n\t}\n\n\t// Returns true if the current drag 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 dragged.\n\tisExistingNodeAttachableToDetachedLinks() {\n\t\treturn (this.config.enableLinkSelection === LINK_SELECTION_DETACHABLE &&\n\t\t\tthis.dragObjects.length === 1 &&\n\t\t\tCanvasUtils.isNode(this.dragObjects[0]));\n\t}\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\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\tconst newMaxExtent = this.maxScaleExtent * factor;\n\n\t\t\tthis.zoom.scaleExtent([this.minScaleExtent, newMaxExtent]);\n\t\t} else {\n\t\t\tconst newFactor = Number(factor) * 1 / this.zoomTransform.k;\n\t\t\tthis.supernodeInfo.renderer.setMaxZoomExtent(newFactor);\n\t\t}\n\t}\n\n\tcreateCanvasSVG() {\n\t\tthis.logger.log(\"Create Canvas SVG.\");\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 object and set width and height to fill the\n\t\t// containing Div.\n\t\tlet parentObject = this.canvasDiv;\n\t\tlet dims = {\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tx: 0,\n\t\t\ty: 0\n\t\t};\n\n\t\t// When rendering supernode contents we use the parent supernode as the\n\t\t// parent for the svg object.\n\t\tif (this.dispUtils.isDisplayingSubFlowInPlace()) {\n\t\t\tparentObject = this.supernodeInfo.d3Selection;\n\t\t\tdims = this.getParentSupernodeSVGDimensions();\n\t\t}\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(\"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.zoomTransform.k);\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\t// This rectangle is added for two reasons:\n\t\t// 1. On Safari, wheel events will not go to the SVG unless there is an\n\t\t// SVG object under the mouse pointer. Therefore we open this rectangle\n\t\t// to fill the SVG area to catch those events in Safari. See this stack\n\t\t// overflow issue for details:\n\t\t// https://stackoverflow.com/questions/40887193/d3-js-zoom-is-not-working-with-mousewheel-in-safari\n\t\t// 2. If we're displaying a sub-flow inside a supernode (on any browser)\n\t\t// we need a background rectangle to display the same color as\n\t\t// the background of the main canvas.\n\t\t// So this rectangle is not needed on Chrome and Firefox with full page\n\t\t// display but we open it anyway, for consistency.\n\t\tcanvasSVG\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(\"class\", \"d3-svg-background\")\n\t\t\t.attr(\"pointer-events\", \"all\")\n\t\t\t.style(\"cursor\", \"default\");\n\n\t\t// Only attach the 'defs' to the top most SVG area when we are displaying\n\t\t// either the primary pipeline full page or a sub-pipeline full page.\n\t\tif (this.dispUtils.isDisplayingFullPage()) {\n\t\t\t// Add defs element to allow a filter for the drop shadow\n\t\t\t// This only needs to be done once for the whole page.\n\t\t\tvar defs = canvasSVG.append(\"defs\");\n\t\t\tthis.createDropShadow(defs);\n\t\t}\n\n\t\treturn canvasSVG;\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.canvasSVG.on(\".zoom\", null);\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 behaviour 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\n\t\t\t\t.call(this.zoom);\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.on(\"mousemove.zoom\", (d3Event) => {\n\t\t\t\t// this.logger.log(\"Zoom - mousemove - drawingNewLink = \" + this.drawingNewLinkData ? \"yes\" : \"no\");\n\t\t\t\tif (this.drawingNewLinkData) {\n\t\t\t\t\tthis.drawNewLink(d3Event);\n\t\t\t\t}\n\t\t\t\tif (this.draggingLinkData) {\n\t\t\t\t\tthis.dragLinkHandle(d3Event);\n\t\t\t\t}\n\t\t\t})\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 inplace 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(\"mouseup.zoom\", (d3Event) => {\n\t\t\t\tthis.logger.log(\"Canvas - mouseup-zoom\");\n\t\t\t\tif (this.drawingNewLinkData) {\n\t\t\t\t\tthis.completeNewLink(d3Event);\n\t\t\t\t}\n\t\t\t\tif (this.draggingLinkData) {\n\t\t\t\t\tthis.completeDraggedLink(d3Event);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"click.zoom\", (d3Event) => {\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// 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.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.getCanvasDimensionsAdjustedForScale(1, this.getZoomToFitPadding());\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\taddBackToParentFlowArrow(canvasSVG) {\n\t\tconst g = canvasSVG\n\t\t\t.append(\"g\")\n\t\t\t.attr(\"transform\", \"translate(15, 15)\")\n\t\t\t.on(\"mouseenter\", function(d3Event, d) { // Use function keyword so 'this' pointer references the DOM text object\n\t\t\t\td3.select(this).select(\"rect\")\n\t\t\t\t\t.attr(\"data-pointer-hover\", \"yes\");\n\t\t\t})\n\t\t\t.on(\"mouseleave\", function(d3Event, d) { // Use function keyword so 'this' pointer references the DOM text object\n\t\t\t\td3.select(this).select(\"rect\")\n\t\t\t\t\t.attr(\"data-pointer-hover\", \"no\");\n\t\t\t})\n\t\t\t.on(\"mousedown mouseup\", (d3Event) => {\n\t\t\t\t// Prevent mouse events going through to the canvas. This prevents\n\t\t\t\t// a drag gesture on the button activating the canvas drag action.\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t})\n\t\t\t.on(\"click\", (d3Event) => {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\tthis.canvasController.displayPreviousPipeline();\n\t\t\t});\n\n\t\tg.append(\"rect\")\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", 0)\n\t\t\t.attr(\"width\", 210)\n\t\t\t.attr(\"height\", 40)\n\t\t\t.attr(\"class\", \"d3-back-to-previous-flow-box\");\n\n\t\tg.append(\"svg\")\n\t\t\t.attr(\"x\", 16)\n\t\t\t.attr(\"y\", 11)\n\t\t\t.attr(\"width\", 16)\n\t\t\t.attr(\"height\", 16)\n\t\t\t.html(LEFT_ARROW_ICON)\n\t\t\t.attr(\"class\", \"d3-back-to-previous-flow-text\");\n\n\t\tg.append(\"text\")\n\t\t\t.attr(\"x\", 40)\n\t\t\t.attr(\"y\", 24)\n\t\t\t.attr(\"class\", \"d3-back-to-previous-flow-text\")\n\t\t\t.text(\"Return to previous flow\");\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\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\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// 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.canvasController.getSavedZoom(this.pipelineId);\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.config.enablePanIntoViewOnOpen) {\n\t\t\tconst canvWithPadding = this.getCanvasDimensionsAdjustedForScale(1, this.getZoomToFitPadding());\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.canvasLayout.initialPanX && this.canvasLayout.initialPanY) {\n\t\t\tnewZoom = { x: this.canvasLayout.initialPanX, y: this.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 amount specified in zoomTransform. Zooming the canvas\n\t// in this way will invoke the zoom behavior methods (zoomStart, zoomAction\n\t// and zoomEnd).\n\tzoomCanvasInvokeZoomBehavior(newZoomTransform, animateTime) {\n\t\tif (isFinite(newZoomTransform.x) &&\n\t\t\t\tisFinite(newZoomTransform.y) &&\n\t\t\t\tisFinite(newZoomTransform.k)) {\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.canvasSVG.call(this.zoom).transition()\n\t\t\t\t\t.duration(animateTime)\n\t\t\t\t\t.call(this.zoom.transform, zoomTransform);\n\t\t\t} else {\n\t\t\t\tthis.canvasSVG.call(this.zoom.transform, zoomTransform);\n\t\t\t}\n\t\t\tthis.zoomingAction = false;\n\t\t}\n\t}\n\n\tzoomToFit() {\n\t\tconst padding = this.getZoomToFitPadding();\n\t\tconst canvasDimensions = this.getCanvasDimensionsAdjustedForScale(1, padding);\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\tthis.zoomCanvasInvokeZoomBehavior({ x: x, y: y, k: newScale });\n\t\t}\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.canvasLayout.zoomToFitPadding;\n\n\t\tif (this.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.canvasLayout.supernodeBindingPortRadius);\n\t\t\tpadding = Math.max(padding, newPadding);\n\t\t}\n\t\treturn padding;\n\t}\n\n\tzoomTo(zoomObject) {\n\t\tconst animateTime = 500;\n\t\tthis.zoomCanvasInvokeZoomBehavior(zoomObject, animateTime);\n\t}\n\n\tgetZoom() {\n\t\treturn { x: this.zoomTransform.x, y: this.zoomTransform.y, k: this.zoomTransform.k };\n\t}\n\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\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.canvasSVG.call(this.zoom.scaleTo, newScale);\n\t\t}\n\t}\n\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.canvasSVG.call(this.zoom.scaleTo, newScale);\n\t\t}\n\t}\n\n\tisZoomedToMax() {\n\t\treturn this.zoomTransform ? this.zoomTransform.k === this.maxScaleExtent : false;\n\t}\n\n\tisZoomedToMin() {\n\t\treturn this.zoomTransform ? this.zoomTransform.k === this.minScaleExtent : false;\n\t}\n\n\tgetZoomToReveal(objectIDs, xPos, yPos) {\n\t\tconst transformedSVGRect = this.getTransformedViewportDimensions();\n\t\tconst nodes = this.activePipeline.getNodes(objectIDs);\n\t\tconst comments = this.activePipeline.getComments(objectIDs);\n\t\tconst links = this.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.convertCanvasDimensionsAdjustedForScaleWithPadding(canvasDimensions, 1, 10);\n\t\t\tconst xPosInt = parseInt(xPos, 10);\n\t\t\tconst yPosInt = typeof yPos === \"undefined\" ? xPosInt : parseInt(yPos, 10);\n\n\t\t\tif (canv) {\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 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.dispUtils.isDisplayingSubFlowInPlace()) {\n\t\t\tconst dims = this.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.canvasSVG && this.canvasSVG.node()) {\n\t\t\t\tviewportDimensions = this.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\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.canvasController.closeTip();\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.dispUtils.isDisplayingSubFlowInPlace()\n\t\tif (this.canvasController.isContextMenuDisplayed() &&\n\t\t\t\t!this.dispUtils.isDisplayingSubFlowInPlace()) {\n\t\t\tthis.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.svgCanvasTextArea.isEditingText()) {\n\t\t\tthis.textEditingClosedOnZoom = true;\n\t\t}\n\n\t\tthis.regionSelect = this.shouldDoRegionSelect(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.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.addTempCursorOverlay(\"grabbing\"), 200);\n\t\t\t} else {\n\t\t\t\tthis.addingCursorOverlay = setTimeout(() => this.addTempCursorOverlay(\"default\"), 200);\n\t\t\t}\n\t\t}\n\n\t\tconst transPos = this.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 = { x: d3Event.transform.x, y: d3Event.transform.y, k: d3Event.transform.k };\n\t\t// Calculate the canvas dimensions here, so we don't have to recalculate\n\t\t// them for every zoom action event.\n\t\tthis.zoomCanvasDimensions = CanvasUtils.getCanvasDimensions(\n\t\t\tthis.activePipeline.nodes, this.activePipeline.comments,\n\t\t\tthis.activePipeline.links, this.canvasLayout.commentHighlightGap);\n\t}\n\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.addTempCursorOverlay(\"default\");\n\t\t\tthis.zoomCanvasBackground(d3Event);\n\t\t\tthis.zoomCommentToolbar();\n\t\t}\n\t}\n\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.getTransformedMousePos(d3Event);\n\n\t\tif (this.drawingNewLinkData) {\n\t\t\tthis.stopDrawingNewLink();\n\n\t\t} else if (this.draggingLinkData) {\n\t\t\tthis.stopDraggingLink();\n\n\t\t// The user just clicked -- with no drag.\n\t\t} else if (transPos.x === this.zoomStartPoint.startX &&\n\t\t\t\t\t\t\ttransPos.y === this.zoomStartPoint.startY &&\n\t\t\t\t\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.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.resetCanvasCursor(d3Event);\n\t\tthis.removeTempCursorOverlay();\n\t\tthis.contextMenuClosedOnZoom = false;\n\t\tthis.textEditingClosedOnZoom = false;\n\t\tthis.regionSelect = false;\n\t}\n\n\t// Returns true if the region select gesture is requested by the user.\n\tshouldDoRegionSelect(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.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.config.enableInteractionType === INTERACTION_CARBON &&\n\t\t\t\t\t\t\t!this.isSpaceKeyPressed(d3Event)) {\n\t\t\treturn true;\n\n\t\t} else if (this.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.spaceKeyPressed) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn 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\tzoomCanvasBackground(d3Event) {\n\t\tthis.regionSelect = false;\n\n\t\tif (this.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.canvasGrp.attr(\"transform\", this.zoomTransform);\n\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\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// 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.dispUtils.isDisplayingCurrentPipeline() &&\n\t\t\t\t!this.contextMenuClosedOnZoom &&\n\t\t\t\t!this.textEditingClosedOnZoom &&\n\t\t\t\t(this.config.enableEditingActions ||\n\t\t\t\td3Event.sourceEvent.target.classList.contains(\"d3-svg-background\"))) {\n\t\t\tthis.canvasController.clearSelections();\n\t\t}\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\tconst { startX, startY, width, height } = this.getRegionDimensions(d3Event);\n\n\t\tconst region = { x1: startX, y1: startY, x2: startX + width, y2: startY + height };\n\t\tconst selections =\n\t\t\tCanvasUtils.selectInRegion(region, this.activePipeline,\n\t\t\t\tthis.config.enableLinkSelection !== LINK_SELECTION_NONE,\n\t\t\t\tthis.config.enableLinkType,\n\t\t\t\tthis.config.enableAssocLinkType);\n\t\tthis.canvasController.setSelections(selections, this.activePipeline.id);\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.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.activePipeline.id\n\t\t};\n\t\tthis.canvasController.editActionHandler(data);\n\n\t}\n\n\t// Repositions the comment toolbar so it is always over the top of the\n\t// comment being edited.\n\tzoomCommentToolbar() {\n\t\tif (this.config.enableMarkdownInComments &&\n\t\t\t\tthis.dispUtils.isDisplayingFullPage() &&\n\t\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) {\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.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 a new zoom which is the result of incrementing the current zoom\n\t// by the amount since the previous d3Event transform amount.\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 constraind 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 = { x: d3Event.transform.x, y: d3Event.transform.y, k: d3Event.transform.k };\n\t\treturn newTransform;\n\t}\n\n\t// Returns a modifed 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.convertCanvasDimensionsAdjustedForScaleWithPadding(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// 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// are scaled by k and padded by pad (if provided).\n\tgetCanvasDimensionsAdjustedForScale(k, pad) {\n\t\tconst gap = this.canvasLayout.commentHighlightGap;\n\t\tconst canvasDimensions = this.activePipeline.getCanvasDimensions(gap);\n\t\treturn this.convertCanvasDimensionsAdjustedForScaleWithPadding(canvasDimensions, k, pad);\n\t}\n\n\tconvertCanvasDimensionsAdjustedForScaleWithPadding(canv, k, pad) {\n\t\tconst padding = pad || 0;\n\t\tif (canv) {\n\t\t\treturn {\n\t\t\t\tleft: (canv.left * k) - padding,\n\t\t\t\ttop: (canv.top * k) - padding,\n\t\t\t\tright: (canv.right * k) + padding,\n\t\t\t\tbottom: (canv.bottom * k) + padding,\n\t\t\t\twidth: (canv.width * k) + (2 * padding),\n\t\t\t\theight: (canv.height * k) + (2 * padding)\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\tdrawRegionSelector(d3Event) {\n\t\tthis.removeRegionSelector();\n\t\tconst { startX, startY, width, height } = this.getRegionDimensions(d3Event);\n\n\t\tthis.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\", startX)\n\t\t\t.attr(\"y\", startY)\n\t\t\t.attr(\"class\", \"d3-region-selector\");\n\t}\n\n\tremoveRegionSelector() {\n\t\tthis.canvasGrp.selectAll(\".d3-region-selector\").remove();\n\t}\n\n\t// Returns the startX, startY, width and height of the selection region\n\t// where startX and startY 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.getTransformedMousePos(d3Event);\n\t\tlet startX = this.zoomStartPoint.startX;\n\t\tlet startY = this.zoomStartPoint.startY;\n\t\tlet width = transPos.x - startX;\n\t\tlet height = transPos.y - startY;\n\n\t\tif (width < 0) {\n\t\t\twidth = Math.abs(width);\n\t\t\tstartX -= width;\n\t\t}\n\t\tif (height < 0) {\n\t\t\theight = Math.abs(height);\n\t\t\tstartY -= height;\n\t\t}\n\n\t\treturn { startX, startY, width, height };\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// Returns an array of objects to drag. If enableDragWithoutSelect is true,\n\t// and the object on which this drag start has initiated is not in the\n\t// set of selected objects, then just that object is to be dragged. Otherwise,\n\t// the selected objects are the objects to be dragged.\n\tgetDragObjects(d) {\n\t\tconst selectedObjects = this.activePipeline.getSelectedNodesAndComments();\n\n\t\tif (this.config.enableDragWithoutSelect &&\n\t\t\t\tselectedObjects.findIndex((o) => o.id === d.id) === -1) {\n\t\t\treturn [d];\n\t\t}\n\n\t\treturn selectedObjects;\n\t}\n\n\tdragStart(d3Event, d) {\n\t\tthis.logger.logStartTimer(\"dragStart\");\n\n\t\tthis.closeContextMenuIfOpen();\n\n\t\tif (this.config.enableContextToolbar) {\n\t\t\tthis.removeContextToolbar();\n\t\t}\n\n\n\t\t// Note: Comment and Node resizing is started by the comment/node highlight rectangle.\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.dragObjectsStart(d3Event, d);\n\t\t}\n\t\tthis.logger.logEndTimer(\"dragStart\", true);\n\t}\n\n\tdragMove(d3Event, d) {\n\t\tthis.logger.logStartTimer(\"dragMove\");\n\t\tif (this.commentSizing) {\n\t\t\tthis.resizeComment(d3Event, d);\n\t\t} else if (this.nodeSizing) {\n\t\t\tthis.resizeNode(d3Event, d);\n\t\t} else {\n\t\t\tthis.dragObjectsAction(d3Event);\n\t\t}\n\n\t\tthis.logger.logEndTimer(\"dragMove\", true);\n\t}\n\n\tdragEnd(d3Event, d) {\n\t\tthis.logger.logStartTimer(\"dragEnd\");\n\n\t\tthis.removeTempCursorOverlay();\n\n\t\tif (this.commentSizing) {\n\t\t\tthis.endCommentSizing(d);\n\n\t\t} else if (this.nodeSizing) {\n\t\t\tthis.endNodeSizing(d);\n\n\t\t} else if (this.dragging) {\n\t\t\tthis.dragObjectsEnd(d3Event, d);\n\t\t}\n\n\t\tthis.logger.logEndTimer(\"dragEnd\", true);\n\t}\n\n\t// Starts the dragging action for canvas objects (nodes and comments).\n\tdragObjectsStart(d3Event, d) {\n\t\t// Ensure flags are false before staring a new drag.\n\t\tthis.existingNodeInsertableIntoLink = false;\n\t\tthis.existingNodeAttachableToDetachedLinks = false;\n\n\t\tthis.dragging = true;\n\t\tthis.dragOffsetX = 0;\n\t\tthis.dragOffsetY = 0;\n\t\tthis.dragRunningX = 0;\n\t\tthis.dragRunningY = 0;\n\t\tthis.dragObjects = this.getDragObjects(d);\n\t\tif (this.dragObjects && this.dragObjects.length > 0) {\n\t\t\tthis.dragStartX = this.dragObjects[0].x_pos;\n\t\t\tthis.dragStartY = this.dragObjects[0].y_pos;\n\t\t}\n\n\t\t// If we are dragging an 'insertable' node, set it to be translucent so\n\t\t// that, when it is dragged over a link line, the highlightd 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.dragObjects[0].id, true);\n\t\t\t\tthis.setDataLinkSelectionAreaWider(true);\n\t\t\t}, 200);\n\t\t}\n\n\t\t// If we are dragging an 'attachable' node, set it to be translucent so\n\t\t// that, when it is dragged over link lines, the highlightd 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 when the user is only selecting it.\n\t\t\tthis.startNodeAttachingToDetachedLinks = setTimeout(() => {\n\t\t\t\tthis.existingNodeAttachableToDetachedLinks = true;\n\t\t\t\tconst mousePos = this.getTransformedMousePos(d3Event);\n\t\t\t\tthis.dragPointerOffsetInNode = {\n\t\t\t\t\tx: mousePos.x - this.dragObjects[0].x_pos,\n\t\t\t\t\ty: mousePos.y - this.dragObjects[0].y_pos\n\t\t\t\t};\n\t\t\t\tthis.setNodeTranslucentState(this.dragObjects[0].id, true);\n\t\t\t}, 200);\n\t\t}\n\t}\n\n\t// Performs the dragging action for canvas objects (nodes and comments).\n\tdragObjectsAction(d3Event) {\n\t\tthis.dragOffsetX += d3Event.dx;\n\t\tthis.dragOffsetY += d3Event.dy;\n\n\t\t// Limit the size a drag can be so, when the user is dragging objects in\n\t\t// an in-place subflow they do not drag them too far.\n\t\t// this.logger.log(\"Drag offset X = \" + this.dragOffsetX + \" y = \" + this.dragOffsetY);\n\t\tif (this.dispUtils.isDisplayingSubFlowInPlace() &&\n\t\t\t\t(this.dragOffsetX > 1000 || this.dragOffsetX < -1000 ||\n\t\t\t\t\tthis.dragOffsetY > 1000 || this.dragOffsetY < -1000)) {\n\t\t\tthis.dragOffsetX -= d3Event.dx;\n\t\t\tthis.dragOffsetY -= d3Event.dy;\n\n\t\t} else {\n\t\t\tlet\tincrement = { x: 0, y: 0 };\n\n\t\t\tif (this.config.enableSnapToGridType === SNAP_TO_GRID_DURING) {\n\t\t\t\tconst stgPos = this.snapToGridDraggedNode();\n\n\t\t\t\tincrement = {\n\t\t\t\t\tx: stgPos.x - this.dragObjects[0].x_pos,\n\t\t\t\t\ty: stgPos.y - this.dragObjects[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: d3Event.dx,\n\t\t\t\t\ty: d3Event.dy\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.dragRunningX += increment.x;\n\t\t\tthis.dragRunningY += increment.y;\n\n\t\t\tthis.dragObjects.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.config.enableLinkSelection === LINK_SELECTION_DETACHABLE) {\n\t\t\t\tthis.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\tthis.displayMovedComments();\n\t\tthis.displayMovedNodes();\n\t\tthis.displayMovedLinks();\n\t\tthis.displayCanvasAccoutrements();\n\n\t\tif (this.dispUtils.isDisplayingSubFlowInPlace()) {\n\t\t\tthis.displaySVGToFitSupernode();\n\t\t}\n\n\n\t\tif (this.existingNodeInsertableIntoLink) {\n\t\t\tconst link = this.getLinkAtMousePos(d3Event.sourceEvent.clientX, d3Event.sourceEvent.clientY);\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 dragged (which is possible in\n\t\t\t// some odd situations).\n\t\t\tif (!link ||\n\t\t\t\t\t(this.isLinkFullyAttached(link) &&\n\t\t\t\t\t\tthis.dragObjects[0].id !== link.srcNodeId &&\n\t\t\t\t\t\tthis.dragObjects[0].id !== link.trgNodeId)) {\n\t\t\t\tthis.setInsertNodeIntoLinkHighlighting(link);\n\t\t\t}\n\t\t}\n\n\t\tif (this.existingNodeAttachableToDetachedLinks) {\n\t\t\tconst mousePos = this.getTransformedMousePos(d3Event);\n\t\t\tconst node = this.dragObjects[0];\n\t\t\tconst ghostArea = {\n\t\t\t\tx1: mousePos.x - this.dragPointerOffsetInNode.x,\n\t\t\t\ty1: mousePos.y - this.dragPointerOffsetInNode.y,\n\t\t\t\tx2: mousePos.x - this.dragPointerOffsetInNode.x + node.width,\n\t\t\t\ty2: mousePos.y - this.dragPointerOffsetInNode.y + node.height\n\t\t\t};\n\t\t\tconst links = this.getAttachableLinksForNodeAtPos(node, ghostArea);\n\t\t\tthis.setDetachedLinkHighlighting(links);\n\t\t}\n\t}\n\n\t// Ends the dragging action for canvas objects (nodes and comments).\n\tdragObjectsEnd(d3Event, d) {\n\t\t// Set to false before updating object model so main body of displayNodes is run.\n\t\tthis.dragging = false;\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// If the pointer hasn't moved and enableDragWithoutSelect we interpret\n\t\t// that as a select on the object.\n\t\tif (this.dragOffsetX === 0 &&\n\t\t\t\tthis.dragOffsetY === 0 &&\n\t\t\t\tthis.config.enableDragWithoutSelect) {\n\t\t\tthis.selectObjectSourceEvent(d3Event, d);\n\n\t\t} else {\n\t\t\tif (this.dragRunningX !== 0 ||\n\t\t\t\t\tthis.dragRunningY !== 0) {\n\t\t\t\tlet dragFinalOffset = null;\n\t\t\t\tif (this.config.enableSnapToGridType === SNAP_TO_GRID_AFTER) {\n\t\t\t\t\tconst stgPos = this.snapToGridDraggedNode();\n\t\t\t\t\tdragFinalOffset = {\n\t\t\t\t\t\tx: stgPos.x - this.dragStartX,\n\t\t\t\t\t\ty: stgPos.y - this.dragStartY\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tdragFinalOffset = { x: this.dragRunningX, y: this.dragRunningY };\n\t\t\t\t}\n\n\t\t\t\tif (this.existingNodeInsertableIntoLink &&\n\t\t\t\t\t\tthis.dragOverLink) {\n\t\t\t\t\tthis.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: this.dragObjects[0],\n\t\t\t\t\t\tlink: this.dragOverLink,\n\t\t\t\t\t\toffsetX: dragFinalOffset.x,\n\t\t\t\t\t\toffsetY: dragFinalOffset.y,\n\t\t\t\t\t\tpipelineId: this.activePipeline.id });\n\n\t\t\t\t} else if (this.existingNodeAttachableToDetachedLinks &&\n\t\t\t\t\t\t\t\t\t\tthis.dragOverDetachedLinks.length > 0) {\n\t\t\t\t\tthis.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: this.dragObjects[0],\n\t\t\t\t\t\tdetachedLinks: this.dragOverDetachedLinks,\n\t\t\t\t\t\toffsetX: dragFinalOffset.x,\n\t\t\t\t\t\toffsetY: dragFinalOffset.y,\n\t\t\t\t\t\tpipelineId: this.activePipeline.id });\n\n\t\t\t\t} else {\n\t\t\t\t\tthis.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: this.dragObjects.map((o) => o.id),\n\t\t\t\t\t\tlinks: this.activePipeline.getSelectedDetachedLinks(),\n\t\t\t\t\t\toffsetX: dragFinalOffset.x,\n\t\t\t\t\t\toffsetY: dragFinalOffset.y,\n\t\t\t\t\t\tpipelineId: this.activePipeline.id });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Switch off any drag highlighting\n\t\tthis.setDataLinkSelectionAreaWider(false);\n\t\tthis.unsetNodeTranslucentState();\n\t\tthis.unsetInsertNodeIntoLinkHighlighting();\n\t\tthis.unsetDetachedLinkHighlighting();\n\t}\n\n\tdragStartLinkHandle(d3Event, d) {\n\t\tthis.logger.logStartTimer(\"dragStartLinkHandle\");\n\n\t\tthis.closeContextMenuIfOpen();\n\n\t\tthis.draggingLinkHandle = true;\n\n\t\tconst handleSelection = d3.select(d3Event.sourceEvent.currentTarget);\n\t\tconst link = this.activePipeline.getLink(d.id);\n\t\tconst oldLink = cloneDeep(link);\n\n\t\tconst linkGrpSelector = this.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.config.enableHighlightUnavailableNodes) {\n\t\t\tif (this.draggingLinkData.endBeingDragged === \"end\") {\n\t\t\t\tconst links = this.activePipeline.links.filter((lnk) => lnk.id !== link.id);\n\t\t\t\tthis.setUnavailableTargetNodesHighlighting(\n\t\t\t\t\tthis.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.activePipeline.links.filter((lnk) => lnk.id !== link.id);\n\t\t\t\tthis.setUnavailableSourceNodesHighlighting(\n\t\t\t\t\tthis.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\n\t\tthis.dragLinkHandle(d3Event);\n\t\tthis.logger.logEndTimer(\"dragStartLinkHandle\", true);\n\t}\n\n\tdragMoveLinkHandle(d3Event) {\n\t\tthis.logger.logStartTimer(\"dragMoveLinkHandle\");\n\t\tthis.dragLinkHandle(d3Event);\n\t\tthis.logger.logEndTimer(\"dragMoveLinkHandle\", true);\n\t}\n\n\tdragEndLinkHandle(d3Event) {\n\t\tthis.logger.logStartTimer(\"dragEndLinkHandle\");\n\t\tthis.completeDraggedLink(d3Event);\n\t\tthis.draggingLinkHandle = false;\n\t\tthis.logger.logEndTimer(\"dragEndLinkHandle\", true);\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 dragged on\n\t// the canvas. It makes is easier for the user to see the highlighted link\n\t// when the node is dragged over it.\n\tsetNodeTranslucentState(nodeId, state) {\n\t\tthis.getNodeGroupSelectionById(nodeId).classed(\"d3-node-group-translucent\", state);\n\t}\n\n\t// Switched off the translucent state of the objects being dragged (if\n\t// there are any).\n\tunsetNodeTranslucentState() {\n\t\tif (this.dragObjects && this.dragObjects.length > 0) {\n\t\t\tthis.setNodeTranslucentState(this.dragObjects[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.dragStartX and this.dragStartY after applying the current offset of\n\t// this.dragOffsetX and this.dragOffsetY.\n\tsnapToGridDraggedNode() {\n\t\tconst objPosX = this.dragStartX + this.dragOffsetX;\n\t\tconst objPosY = this.dragStartY + this.dragOffsetY;\n\n\t\treturn this.snapToGridPosition({ x: objPosX, y: objPosY });\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}\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.updatePortArrowPath(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\tselection\n\t\t\t.data(data, (d) => d.id)\n\t\t\t.join(\n\t\t\t\t(enter) => this.createNodes(enter),\n\t\t\t\tnull,\n\t\t\t\t(remove) => this.removeNodes(remove)\n\t\t\t)\n\t\t\t.attr(\"transform\", (d) => `translate(${d.x_pos}, ${d.y_pos})`)\n\t\t\t.attr(\"class\", (d) => this.getNodeGroupClass(d))\n\t\t\t.attr(\"style\", (d) => this.getNodeGrpStyle(d))\n\t\t\t.call((joinedNodeGrps) => this.updateNodes(joinedNodeGrps));\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\tif (this.config.enableEditingActions) {\n\t\t\tnewNodeGroups\n\t\t\t\t.call(this.drag);\t // Must put drag after mousedown listener so mousedown gets called first.\n\t\t}\n\n\t\t// Node Sizing Area.\n\t\tnewNodeGroups.filter((d) => this.shouldDisplayNodeSizingArea(d))\n\t\t\t.append(\"path\")\n\t\t\t.attr(\"class\", \"d3-node-sizing\")\n\t\t\t.call(this.attachNodeSizingListeners.bind(this));\n\n\t\t// Node Selection Highlighting Outline.\n\t\tnewNodeGroups.filter((d) => !CanvasUtils.isSuperBindingNode(d))\n\t\t\t.append(\"path\")\n\t\t\t.attr(\"class\", \"d3-node-selection-highlight\");\n\n\t\t// Node Body\n\t\tnewNodeGroups.filter((d) => !CanvasUtils.isSuperBindingNode(d) && d.layout.nodeShapeDisplay)\n\t\t\t.append(\"path\")\n\t\t\t.attr(\"class\", \"d3-node-body-outline\");\n\n\t\t// Optional foreign object to contain a React object\n\t\tnewNodeGroups.filter((d) => d.layout.nodeExternalObject)\n\t\t\t.append(\"foreignObject\")\n\t\t\t.attr(\"class\", \"d3-foreign-object-external-node\");\n\n\t\t// Node Image\n\t\tnewNodeGroups.filter((d) => !CanvasUtils.isSuperBindingNode(d) && d.layout.imageDisplay)\n\t\t\t.each((node, i, nodeGrps) => {\n\t\t\t\tconst nodeImage = this.getNodeImage(node);\n\t\t\t\tconst nodeImageType = this.getImageType(nodeImage);\n\t\t\t\td3.select(nodeGrps[i])\n\t\t\t\t\t.append(nodeImageType)\n\t\t\t\t\t.attr(\"class\", (d) => this.nodeUtils.getNodeImageClass(d));\n\t\t\t});\n\n\t\t// Node Label\n\t\tnewNodeGroups.filter((d) => !CanvasUtils.isSuperBindingNode(d) && d.layout.labelDisplay)\n\t\t\t.append(\"foreignObject\")\n\t\t\t.attr(\"class\", \"d3-foreign-object-node-label\")\n\t\t\t.call(this.attachNodeLabelListeners.bind(this))\n\t\t\t.append(\"xhtml:div\") // Provide a namespace when div is inside foreignObject\n\t\t\t.append(\"xhtml:span\") // Provide a namespace when span is inside foreignObject\n\t\t\t.call(this.attachNodeLabelSpanListeners.bind(this));\n\n\t\tthis.logger.logEndTimer(\"createNodes\");\n\n\t\treturn newNodeGroups;\n\t}\n\n\tupdateNodes(joinedNodeGrps) {\n\t\tthis.logger.logStartTimer(\"updateNodes\");\n\n\t\t// Node Sizing Area\n\t\tjoinedNodeGrps.selectChildren(\".d3-node-sizing\")\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\tjoinedNodeGrps.selectChildren(\".d3-node-selection-highlight\")\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\tjoinedNodeGrps.selectChildren(\".d3-node-body-outline\")\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\tjoinedNodeGrps.selectChildren(\".d3-foreign-object-external-node\")\n\t\t\t.datum((d) => this.activePipeline.getNode(d.id))\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(addNodeExternalObject.bind(this));\n\n\t\t// Node Image\n\t\tjoinedNodeGrps.selectChildren(\".d3-node-image\")\n\t\t\t.datum((d) => this.activePipeline.getNode(d.id))\n\t\t\t.each((d, i, nodeGrps) => this.setNodeImageContent(nodeGrps[i], d))\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\tjoinedNodeGrps.selectChildren(\".d3-foreign-object-node-label\")\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\tjoinedNodeGrps.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\tjoinedNodeGrps.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\t\tthis.logger.logEndTimer(\"updateNodes\");\n\t}\n\n\tremoveNodes(removeSel) {\n\t\t// Remove any foreign objects for react nodes, if necessary.\n\t\tremoveSel\n\t\t\t.selectChildren(\".d3-foreign-object-external-node\")\n\t\t\t.each(removeExternalObject.bind(this));\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);\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)\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.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.call(this.attachInputPortListeners.bind(this), node);\n\n\t\tinputPortGroups\n\t\t\t.append(node.layout.inputPortObject)\n\t\t\t.attr(\"class\", \"d3-node-port-input-main\");\n\n\t\t// Don't show the port arrow when we are supporting association\n\t\t// link creation\n\t\tif (!this.config.enableAssocLinkCreation &&\n\t\t\t\tnode.layout.inputPortObject === \"circle\" &&\n\t\t\t\t!CanvasUtils.isSuperBindingNode(node)) {\n\t\t\t// Input port arrow in circle for nodes which are not supernode binding nodes.\n\t\t\tinputPortGroups\n\t\t\t\t.append(\"path\")\n\t\t\t\t.attr(\"class\", \"d3-node-port-input-arrow\");\n\t\t}\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\tif (node.layout.inputPortObject === PORT_OBJECT_IMAGE) {\n\t\t\t\t\tobj\n\t\t\t\t\t\t.attr(\"xlink:href\", node.layout.inputPortImage)\n\t\t\t\t\t\t.attr(\"x\", port.cx - (node.layout.inputPortWidth / 2))\n\t\t\t\t\t\t.attr(\"y\", port.cy - (node.layout.inputPortHeight / 2))\n\t\t\t\t\t\t.attr(\"width\", node.layout.inputPortWidth)\n\t\t\t\t\t\t.attr(\"height\", node.layout.inputPortHeight);\n\t\t\t\t} else {\n\t\t\t\t\tobj\n\t\t\t\t\t\t.attr(\"r\", this.getPortRadius(node))\n\t\t\t\t\t\t.attr(\"cx\", port.cx)\n\t\t\t\t\t\t.attr(\"cy\", port.cy);\n\t\t\t\t}\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\tif (node.layout.inputPortObject !== PORT_OBJECT_IMAGE) {\n\t\t\t\t\tobj\n\t\t\t\t\t\t.attr(\"d\", this.getPortArrowPath(port))\n\t\t\t\t\t\t.attr(\"transform\", this.getPortArrowPathTransform(port));\n\t\t\t\t}\n\t\t\t});\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)\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.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.call(this.attachOutputPortListeners.bind(this), node);\n\n\t\toutputPortGroups\n\t\t\t.append(node.layout.outputPortObject)\n\t\t\t.attr(\"class\", \"d3-node-port-output-main\");\n\n\t\treturn outputPortGroups;\n\t}\n\n\tupdateOutputPorts(joinedOutputPortGroups, node) {\n\t\tjoinedOutputPortGroups.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\tif (node.layout.outputPortObject === PORT_OBJECT_IMAGE) {\n\t\t\t\t\tobj\n\t\t\t\t\t\t.attr(\"xlink:href\", node.layout.outputPortImage)\n\t\t\t\t\t\t.attr(\"x\", port.cx - (node.layout.outputPortWidth / 2))\n\t\t\t\t\t\t.attr(\"y\", port.cy - (node.layout.outputPortHeight / 2))\n\t\t\t\t\t\t.attr(\"width\", node.layout.outputPortWidth)\n\t\t\t\t\t\t.attr(\"height\", node.layout.outputPortHeight);\n\t\t\t\t} else {\n\t\t\t\t\tobj\n\t\t\t\t\t\t.attr(\"r\", this.getPortRadius(node))\n\t\t\t\t\t\t.attr(\"cx\", port.cx)\n\t\t\t\t\t\t.attr(\"cy\", port.cy);\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t// Attaches the appropriate listeners to the node groups.\n\tattachNodeGroupListeners(nodeGrps) {\n\t\tnodeGrps\n\t\t\t.on(\"mouseenter\", (d3Event, d) => {\n\t\t\t\tconst nodeGrp = d3.select(d3Event.currentTarget);\n\t\t\t\tthis.raiseNodeToTop(nodeGrp);\n\t\t\t\tthis.setNodeStyles(d, \"hover\", nodeGrp);\n\t\t\t\tif (this.config.enableContextToolbar) {\n\t\t\t\t\tthis.addContextToolbar(d3Event, d, \"node\");\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\tif (this.canOpenTip(TIP_TYPE_NODE)) {\n\t\t\t\t\tthis.canvasController.closeTip(); // Ensure existing tip is removed when moving pointer within an in-place supernode\n\t\t\t\t\tthis.canvasController.openTip({\n\t\t\t\t\t\tid: this.getId(\"node_tip\", d.id),\n\t\t\t\t\t\ttype: TIP_TYPE_NODE,\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: d\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\tif (this.svgCanvasTextArea.isEditingText()) {\n\t\t\t\t\tthis.svgCanvasTextArea.completeEditing();\n\t\t\t\t}\n\t\t\t\tif (!this.config.enableDragWithoutSelect) {\n\t\t\t\t\tthis.selectObjectD3Event(d3Event, d, \"node\");\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(\"mousemove\", (d3Event, d) => {\n\t\t\t\t// this.logger.log(\"Node Group - mouse move\");\n\t\t\t\t// Don't stop propogation. Mouse move messages must be allowed to\n\t\t\t\t// propagate to canvas zoom operation.\n\t\t\t})\n\t\t\t.on(\"mouseup\", (d3Event, d) => {\n\t\t\t\td3Event.stopPropagation();\n\t\t\t\tthis.logger.log(\"Node Group - mouse up\");\n\t\t\t\tif (this.drawingNewLinkData) {\n\t\t\t\t\tthis.completeNewLink(d3Event);\n\t\t\t\t}\n\t\t\t\tif (this.draggingLinkData) {\n\t\t\t\t\tthis.completeDraggedLink(d3Event, d);\n\t\t\t\t}\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 implicitely selected.\n\t\t\t\t\tif (this.config.enableDragWithoutSelect) {\n\t\t\t\t\t\tthis.selectObjectD3Event(d3Event, d, \"node\");\n\t\t\t\t\t}\n\t\t\t\t\tthis.openContextMenu(d3Event, \"node\", d);\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tattachNodeSizingListeners(nodeGrps) {\n\t\tnodeGrps\n\t\t\t.on(\"mousedown\", (d3Event, d) => {\n\t\t\t\tif (this.isNodeResizable(d)) {\n\t\t\t\t\tthis.nodeSizing = true;\n\t\t\t\t\t// Note - node resizing and finalization of size is handled by drag functions.\n\t\t\t\t\tthis.addTempCursorOverlay(this.nodeSizingCursor);\n\t\t\t\t}\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\tif (this.isNodeResizable(d) &&\n\t\t\t\t\t\t!this.isRegionSelectOrSizingInProgress()) { // Don't switch sizing direction if we are already sizing\n\t\t\t\t\tlet cursorType = \"default\";\n\t\t\t\t\tif (!this.isPointerCloseToBodyEdge(d3Event, d)) {\n\t\t\t\t\t\tthis.nodeSizingDirection = this.getSizingDirection(d3Event, d, d.layout.nodeCornerResizeArea);\n\t\t\t\t\t\tthis.nodeSizingCursor = this.getCursorBasedOnDirection(this.nodeSizingDirection);\n\t\t\t\t\t\tcursorType = this.nodeSizingCursor;\n\t\t\t\t\t}\n\t\t\t\t\td3.select(d3Event.currentTarget).style(\"cursor\", cursorType);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseleave\", (d3Event, d) => {\n\t\t\t\td3.select(d3Event.currentTarget).style(\"cursor\", \"default\");\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.zoomTransform.k));\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.displayNodeLabelTextArea(d, d3Event.currentTarget.parentNode);\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\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(\"mousedown\", (d3Event, port) => {\n\t\t\t\tif (!this.config.enableEditingActions) {\n\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (this.config.enableAssocLinkCreation) {\n\t\t\t\t\t// Make sure this is just a left mouse button click - we don't want context menu click starting a line being drawn\n\t\t\t\t\tif (d3Event.button === 0) {\n\t\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event); // Stops the node drag behavior when clicking on the handle/circle\n\t\t\t\t\t\tconst srcNode = this.activePipeline.getNode(node.id);\n\t\t\t\t\t\tthis.drawingNewLinkData = {\n\t\t\t\t\t\t\tsrcObjId: node.id,\n\t\t\t\t\t\t\tsrcPortId: port.id,\n\t\t\t\t\t\t\taction: this.config.enableAssocLinkCreation ? ASSOCIATION_LINK : NODE_LINK,\n\t\t\t\t\t\t\tsrcNode: srcNode,\n\t\t\t\t\t\t\tstartPos: { x: srcNode.x_pos + port.cx, y: srcNode.y_pos + port.cy },\n\t\t\t\t\t\t\tportType: \"input\",\n\t\t\t\t\t\t\tportObject: node.layout.inputPortObject,\n\t\t\t\t\t\t\tportImage: node.layout.inputPortImage,\n\t\t\t\t\t\t\tportWidth: node.layout.inputPortWidth,\n\t\t\t\t\t\t\tportHeight: node.layout.inputPortHeight,\n\t\t\t\t\t\t\tportRadius: this.getPortRadius(srcNode),\n\t\t\t\t\t\t\tminInitialLine: srcNode.layout.minInitialLine,\n\t\t\t\t\t\t\tguideObject: node.layout.inputPortGuideObject,\n\t\t\t\t\t\t\tguideImage: node.layout.inputPortGuideImage,\n\t\t\t\t\t\t\tlinkArray: []\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.drawNewLink(d3Event);\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 implicitely selected.\n\t\t\t\tif (this.config.enableDragWithoutSelect) {\n\t\t\t\t\tthis.selectObjectD3Event(d3Event, node, \"node\");\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(\"mousedown\", (d3Event, port) => {\n\t\t\t\tif (!this.config.enableEditingActions) {\n\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Make sure this is just a left mouse button click - we don't want context menu click starting a line being drawn\n\t\t\t\tif (d3Event.button === 0) {\n\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event); // Stops the node drag behavior when clicking on the handle/circle\n\t\t\t\t\tconst srcNode = this.activePipeline.getNode(node.id);\n\t\t\t\t\tif (!CanvasUtils.isSrcCardinalityAtMax(port.id, srcNode, this.activePipeline.links)) {\n\t\t\t\t\t\tthis.drawingNewLinkData = {\n\t\t\t\t\t\t\tsrcObjId: node.id,\n\t\t\t\t\t\t\tsrcPortId: port.id,\n\t\t\t\t\t\t\taction: this.config.enableAssocLinkCreation ? ASSOCIATION_LINK : NODE_LINK,\n\t\t\t\t\t\t\tsrcNode: srcNode,\n\t\t\t\t\t\t\tstartPos: { x: srcNode.x_pos + port.cx, y: srcNode.y_pos + port.cy },\n\t\t\t\t\t\t\tportType: \"output\",\n\t\t\t\t\t\t\tportObject: node.layout.outputPortObject,\n\t\t\t\t\t\t\tportImage: node.layout.outputPortImage,\n\t\t\t\t\t\t\tportWidth: node.layout.outputPortWidth,\n\t\t\t\t\t\t\tportHeight: node.layout.outputPortHeight,\n\t\t\t\t\t\t\tportRadius: this.getPortRadius(srcNode),\n\t\t\t\t\t\t\tminInitialLine: srcNode.layout.minInitialLine,\n\t\t\t\t\t\t\tguideObject: node.layout.outputPortGuideObject,\n\t\t\t\t\t\t\tguideImage: node.layout.outputPortGuideImage,\n\t\t\t\t\t\t\tlinkArray: []\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (this.config.enableHighlightUnavailableNodes) {\n\t\t\t\t\t\t\tthis.setUnavailableTargetNodesHighlighting(srcNode, port.id, this.activePipeline.links);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.drawNewLink(d3Event);\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 implicitely selected.\n\t\t\t\tif (this.config.enableDragWithoutSelect) {\n\t\t\t\t\tthis.selectObjectD3Event(d3Event, node, \"node\");\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\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.zoomTransform.k, this.config.enableDisplayFullLabelOnHover);\n\n\t\tthis.displayEditIcon(spanObj, nodeGrpSel, transform,\n\t\t\t(d3Event, d) => this.displayNodeLabelTextArea(d, d3Event.currentTarget.parentNode));\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.zoomTransform.k);\n\n\t\tthis.displayEditIcon(spanObj, decGrpSel, transform,\n\t\t\t(d3Event, d) => this.displayDecLabelTextArea(dec, obj, objType, d3Event.currentTarget.parentNode));\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\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(\"click\", function(d3Event, d) {\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(\"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\tconst foreignObj = labelObj.parentElement;\n\t\t\tconst nodeObj = foreignObj.parentElement;\n\t\t\tconst nodeGrpSel = d3.select(nodeObj);\n\t\t\tnodeGrpSel.selectAll(\".d3-label-edit-icon-group\").remove();\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, objType) {\n\t\tthis.selectObject(\n\t\t\td,\n\t\t\td3Event.type,\n\t\t\td3Event.shiftKey,\n\t\t\tCanvasUtils.isCmndCtrlPressed(d3Event));\n\t\t// If the selection has changed we need to recreate any currently displayed\n\t\t// context toolbar because the context actions may have changed based on\n\t\t// the new selection.\n\t\tthis.recreateContextToolbar(d3Event, d, objType);\n\t}\n\n\t// Adds the object passed in to the set of selected objects using\n\t// the d3Event object's sourceEvent object.\n\tselectObjectSourceEvent(d3Event, d) {\n\t\tthis.selectObject(\n\t\t\td,\n\t\t\td3Event.type,\n\t\t\td3Event.sourceEvent.shiftKey,\n\t\t\tCanvasUtils.isCmndCtrlPressed(d3Event.sourceEvent));\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 sends a SINGLE_CLICK action to the\n\t// clickActionHandler callback in the host application.\n\tselectObject(d, d3EventType, isShiftKeyPressed, isCmndCtrlPressed) {\n\t\tthis.canvasController.selectObject(d.id, isShiftKeyPressed, isCmndCtrlPressed, this.activePipeline.id);\n\n\t\t// Even though the single click message below should be emitted\n\t\t// from common canvas for comments, if we uncomment this line it prevents\n\t\t// the double click event going to the comment group object. This seems\n\t\t// to be a timing issue since the same problem is not evident with the\n\t\t// similar code for the node group object.\n\t\t// TODO - Issue 2465 - Find out why this problem occurs.\n\t\tconst objectTypeName = this.activePipeline.getObjectTypeName(d);\n\t\tif (objectTypeName === \"node\" || objectTypeName === \"link\") {\n\t\t\tthis.canvasController.clickActionHandler({\n\t\t\t\tclickType: d3EventType === \"contextmenu\" || this.ellipsisClicked ? \"SINGLE_CLICK_CONTEXTMENU\" : \"SINGLE_CLICK\",\n\t\t\t\tobjectType: objectTypeName,\n\t\t\t\tid: d.id,\n\t\t\t\tselectedObjectIds: this.activePipeline.getSelectedObjectIds(),\n\t\t\t\tpipelineId: this.activePipeline.id });\n\t\t\tthis.ellipsisClicked = false;\n\t\t}\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, objType, decGrpClassName)\n\t\t\t)\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, 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));\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} 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.each(() => this.setImageContent(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 (dec.label) {\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.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.call(this.attachDecLabelListeners.bind(this, d, objType));\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(addDecExternalObject.bind(this));\n\t\t} else {\n\t\t\textSel.each(removeExternalObject.bind(this));\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\tthis.displayDecLabelTextArea(dec, obj, objType, d3Event.currentTarget.parentNode);\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(decGrps) {\n\t\tdecGrps\n\t\t\t.on(\"mouseenter\", (d3Event, dec) => {\n\t\t\t\tif (this.canOpenTip(TIP_TYPE_DEC)) {\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, d) => {\n\t\t\t\tthis.canvasController.closeTip();\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.\n\tsetNodeImageContent(imageObj, node) {\n\t\tconst nodeImage = this.getNodeImage(node);\n\t\tconst imageSel = d3.select(imageObj);\n\t\tthis.setImageContent(imageSel, nodeImage);\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) {\n\t\tif (image !== imageSel.attr(\"data-image\")) {\n\t\t\tconst nodeImageType = this.getImageType(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 (nodeImageType === \"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\timageSel.node().append(data.documentElement);\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\". This will\n\t// be used to append an svg or image element to the DOM.\n\tgetImageType(nodeImage) {\n\t\treturn nodeImage && nodeImage.endsWith(\".svg\") && this.config.enableImageDisplay !== \"SVGAsImage\" ? \"svg\" : \"image\";\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.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\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.activePipeline.nodes.filter((n) => n.isSupernodeInputBinding);\n\n\t\tinputBindingNodes.forEach((n) => {\n\t\t\tconst nodePadding = CanvasUtils.getNodePaddingToTargetNodes(n, this.activePipeline.nodes,\n\t\t\t\tthis.activePipeline.links, this.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.activePipeline.nodes.filter((n) => n.isSupernodeOutputBinding);\n\n\t\tthis.activePipeline.nodes.forEach((n) => {\n\t\t\tconst nodePadding = CanvasUtils.getNodePaddingToTargetNodes(n, outputBindingNodes,\n\t\t\t\tthis.activePipeline.links, this.canvasLayout.linkType);\n\t\t\tmaxPadding = Math.max(maxPadding, nodePadding);\n\t\t});\n\n\t\treturn maxPadding;\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.zoomTransform.k;\n\t}\n\n\taddDynamicNodeIcons(d3Event, d, nodeGrp) {\n\t\tif (!this.nodeSizing && !CanvasUtils.isSuperBindingNode(d)) {\n\t\t\tthis.addEllipsisIcon(d, nodeGrp);\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\tgetContextToolbarPos(objType, d) {\n\t\tif (objType === \"link\") {\n\t\t\treturn d.pathInfo.centerPoint;\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) {\n\t\tif (!this.nodeSizing && !this.dragging && !this.draggingLinkData &&\n\t\t\t\t!this.svgCanvasTextArea.isEditingText() && !CanvasUtils.isSuperBindingNode(d)) {\n\t\t\tthis.canvasController.setMouseInObject(true);\n\t\t\tlet pos = this.getContextToolbarPos(objType, d);\n\t\t\tpos = this.unTransformPos(pos);\n\t\t\tthis.openContextMenu(d3Event, objType, d, null, pos);\n\t\t}\n\t}\n\n\tremoveContextToolbar() {\n\t\tthis.canvasController.setMouseInObject(false);\n\t\tsetTimeout(() => this.canvasController.closeContextToolbar(), 200);\n\t}\n\n\trecreateContextToolbar(d3Event, d, objType) {\n\t\tif (this.config.enableContextToolbar) {\n\t\t\tthis.removeContextToolbar();\n\t\t\tthis.addContextToolbar(d3Event, d, objType);\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.filter(() => d.layout.ellipsisDisplay)\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\t\t\t\tthis.ellipsisClicked = true;\n\t\t\t\tthis.selectObjectD3Event(d3Event, d, \"node\");\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.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 (managd 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\tupdatePortArrowPath(nodeObj, portArrowClassName) {\n\t\tconst nodeGrp = d3.select(nodeObj);\n\t\tnodeGrp.selectAll(\".\" + portArrowClassName)\n\t\t\t.attr(\"d\", (port) => this.getPortArrowPath(port))\n\t\t\t.attr(\"transform\", (port) => this.getPortArrowPathTransform(port));\n\t}\n\n\t// Returns true if the port (from a node template) passed in has a max\n\t// cardinaility 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\tisMouseOverContextToolbar(d3Event) {\n\t\treturn this.getElementWithClassAtMousePos(d3Event, \"context-toolbar\");\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 referencd 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\topenContextMenu(d3Event, type, d, port, pos) {\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 puposes, 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.zoomTransform.k });\n\t}\n\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\tdrawNewLink(d3Event) {\n\t\tif (this.config.enableEditingActions === false) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.closeContextMenuIfOpen();\n\n\t\tconst transPos = this.getTransformedMousePos(d3Event);\n\n\t\tif (this.drawingNewLinkData.action === COMMENT_LINK) {\n\t\t\tthis.drawNewCommentLinkForPorts(transPos);\n\t\t} else {\n\t\t\tthis.drawNewNodeLinkForPorts(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.config.enableHighlightNodeOnNewLinkDrag) {\n\t\t\tthis.setNewLinkOverNode(d3Event);\n\t\t}\n\t}\n\n\tdrawNewNodeLinkForPorts(transPos) {\n\t\tvar that = this;\n\t\tconst linkType = this.config.enableAssocLinkCreation ? ASSOCIATION_LINK : NODE_LINK;\n\n\t\tlet startPos;\n\t\tif (this.canvasLayout.linkType === LINK_TYPE_STRAIGHT) {\n\t\t\tstartPos = this.linkUtils.getNewStraightNodeLinkStartPos(this.drawingNewLinkData.srcNode, transPos);\n\t\t} else {\n\t\t\tstartPos = {\n\t\t\t\tx: this.drawingNewLinkData.startPos.x,\n\t\t\t\ty: this.drawingNewLinkData.startPos.y };\n\t\t}\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\"originX\": startPos.originX,\n\t\t\t\"originY\": startPos.originY,\n\t\t\t\"type\": linkType }];\n\n\t\tif (this.config.enableAssocLinkCreation) {\n\t\t\tthis.drawingNewLinkData.linkArray[0].assocLinkVariation =\n\t\t\t\tthis.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.portType);\n\t\t}\n\n\t\tconst pathInfo = this.linkUtils.getConnectorPathInfo(\n\t\t\tthis.drawingNewLinkData.linkArray[0], this.drawingNewLinkData.minInitialLine);\n\n\t\tconst connectionLineSel = this.nodesLinksGrp.selectAll(\".d3-new-connection-line\");\n\t\tconst connectionStartSel = this.nodesLinksGrp.selectAll(\".d3-new-connection-start\");\n\t\tconst connectionGuideSel = this.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\n\t\t// icon or object is inside the node boundary.\n\t\tif (linkType === NODE_LINK &&\n\t\t\t\tthis.canvasLayout.linkType === LINK_TYPE_STRAIGHT &&\n\t\t\t\tthis.nodeUtils.isPointInNodeBoundary(transPos, this.drawingNewLinkData.srcNode)) {\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\", linkType)\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\tif (this.canvasLayout.linkType !== LINK_TYPE_STRAIGHT) {\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(this.drawingNewLinkData.portObject)\n\t\t\t\t.attr(\"class\", \"d3-new-connection-start\")\n\t\t\t\t.attr(\"linkType\", linkType)\n\t\t\t\t.merge(connectionStartSel)\n\t\t\t\t.each(function(d) {\n\t\t\t\t\t// No need to draw the starting object of the new line if it is an image.\n\t\t\t\t\tif (that.drawingNewLinkData.portObject === PORT_OBJECT_CIRCLE) {\n\t\t\t\t\t\td3.select(this)\n\t\t\t\t\t\t\t.attr(\"cx\", d.x1)\n\t\t\t\t\t\t\t.attr(\"cy\", d.y1)\n\t\t\t\t\t\t\t.attr(\"r\", that.drawingNewLinkData.portRadius);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\n\t\tconnectionGuideSel\n\t\t\t.data(this.drawingNewLinkData.linkArray)\n\t\t\t.enter()\n\t\t\t.append(this.drawingNewLinkData.guideObject)\n\t\t\t.attr(\"class\", \"d3-new-connection-guide\")\n\t\t\t.attr(\"linkType\", linkType)\n\t\t\t.on(\"mouseup\", (d3Event) => {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\tthis.completeNewLink(d3Event);\n\t\t\t})\n\t\t\t.merge(connectionGuideSel)\n\t\t\t.each(function(d) {\n\t\t\t\tif (that.drawingNewLinkData.guideObject === PORT_OBJECT_IMAGE) {\n\t\t\t\t\td3.select(this)\n\t\t\t\t\t\t.attr(\"xlink:href\", that.drawingNewLinkData.guideImage)\n\t\t\t\t\t\t.attr(\"x\", d.x2 - (that.drawingNewLinkData.portWidth / 2))\n\t\t\t\t\t\t.attr(\"y\", d.y2 - (that.drawingNewLinkData.portHeight / 2))\n\t\t\t\t\t\t.attr(\"width\", that.drawingNewLinkData.portWidth)\n\t\t\t\t\t\t.attr(\"height\", that.drawingNewLinkData.portHeight)\n\t\t\t\t\t\t.attr(\"transform\", that.getLinkImageTransform(d));\n\t\t\t\t} else {\n\t\t\t\t\td3.select(this)\n\t\t\t\t\t\t.attr(\"cx\", d.x2)\n\t\t\t\t\t\t.attr(\"cy\", d.y2)\n\t\t\t\t\t\t.attr(\"r\", that.drawingNewLinkData.portRadius);\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tgetLinkImageTransform(d) {\n\t\tlet angle = 0;\n\t\tif (this.canvasLayout.linkType === LINK_TYPE_STRAIGHT) {\n\t\t\tconst adjacent = d.x2 - (d.originX || d.x1);\n\t\t\tconst opposite = d.y2 - (d.originY || d.y1);\n\t\t\tif (adjacent === 0 && opposite === 0) {\n\t\t\t\tangle = 0;\n\t\t\t} else {\n\t\t\t\tangle = Math.atan(opposite / adjacent) * (180 / Math.PI);\n\t\t\t\tangle = adjacent >= 0 ? angle : angle + 180;\n\t\t\t\tif (this.canvasLayout.linkDirection === LINK_DIR_TOP_BOTTOM) {\n\t\t\t\t\tangle -= 90;\n\t\t\t\t} else if (this.canvasLayout.linkDirection === LINK_DIR_BOTTOM_TOP) {\n\t\t\t\t\tangle += 90;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn `rotate(${angle},${d.x2},${d.y2})`;\n\t\t}\n\t\treturn null;\n\t}\n\n\tdrawNewCommentLinkForPorts(transPos) {\n\t\tconst that = this;\n\t\tconst srcComment = this.activePipeline.getComment(this.drawingNewLinkData.srcObjId);\n\t\tconst startPos = this.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.nodesLinksGrp.selectAll(\".d3-new-connection-line\");\n\t\tconst connectionGuideSel = this.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) => that.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.on(\"mouseup\", (d3Event) => {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\tthis.completeNewLink(d3Event);\n\t\t\t})\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.canvasLayout.commentPortRadius);\n\n\t\tif (this.canvasLayout.commentLinkArrowHead) {\n\t\t\tconst connectionArrowHeadSel = this.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.on(\"mouseup\", (d3Event) => {\n\t\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event);\n\t\t\t\t\tthis.completeNewLink(d3Event);\n\t\t\t\t})\n\t\t\t\t.merge(connectionArrowHeadSel)\n\t\t\t\t.attr(\"d\", (d) => this.getArrowHead(d))\n\t\t\t\t.attr(\"transform\", (d) => this.getArrowHeadTransform(d));\n\t\t}\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.config.enableEditingActions === false) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.config.enableHighlightUnavailableNodes) {\n\t\t\tthis.unsetUnavailableNodesHighlighting();\n\t\t}\n\t\tvar trgNode = this.getNodeAtMousePos(d3Event);\n\t\tif (trgNode !== null) {\n\t\t\tthis.completeNewLinkOnNode(d3Event, trgNode);\n\t\t} else {\n\t\t\tif (this.config.enableLinkSelection === LINK_SELECTION_DETACHABLE &&\n\t\t\t\t\tthis.drawingNewLinkData.action === NODE_LINK &&\n\t\t\t\t\t!this.config.enableAssocLinkCreation) {\n\t\t\t\tthis.completeNewDetachedLink(d3Event);\n\t\t\t} else {\n\t\t\t\tthis.stopDrawingNewLink();\n\t\t\t}\n\t\t}\n\t}\n\n\t// Handles the completion of a new link when the end is dropped on a node.\n\tcompleteNewLinkOnNode(d3Event, trgNode) {\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.config.enableHighlightNodeOnNewLinkDrag) {\n\t\t\tthis.setNewLinkOverNodeCancel();\n\t\t}\n\n\t\tif (trgNode !== null) {\n\t\t\tconst type = this.drawingNewLinkData.action;\n\t\t\tif (type === NODE_LINK) {\n\t\t\t\tconst srcNode = this.activePipeline.getNode(this.drawingNewLinkData.srcObjId);\n\t\t\t\tconst srcPortId = this.drawingNewLinkData.srcPortId;\n\t\t\t\tconst trgPortId = this.getInputNodePortId(d3Event, trgNode);\n\n\t\t\t\tif (CanvasUtils.isDataConnectionAllowed(srcPortId, trgPortId, srcNode, trgNode, this.activePipeline.links)) {\n\t\t\t\t\tthis.canvasController.editActionHandler({\n\t\t\t\t\t\teditType: \"linkNodes\",\n\t\t\t\t\t\teditSource: \"canvas\",\n\t\t\t\t\t\tnodes: [{ \"id\": this.drawingNewLinkData.srcObjId, \"portId\": this.drawingNewLinkData.srcPortId }],\n\t\t\t\t\t\ttargetNodes: [{ \"id\": trgNode.id, \"portId\": trgPortId }],\n\t\t\t\t\t\ttype: type,\n\t\t\t\t\t\tlinkType: \"data\", // Added for historical purposes - for WML Canvas support\n\t\t\t\t\t\tpipelineId: this.pipelineId });\n\n\t\t\t\t} else if (this.config.enableLinkReplaceOnNewConnection &&\n\t\t\t\t\t\t\t\t\t\tCanvasUtils.isDataLinkReplacementAllowed(srcPortId, trgPortId, srcNode, trgNode, this.activePipeline.links)) {\n\t\t\t\t\tconst linksToTrgPort = CanvasUtils.getDataLinksConnectedTo(trgPortId, trgNode, this.activePipeline.links);\n\t\t\t\t\t// We only replace a link to a maxed out cardinality port if there\n\t\t\t\t\t// is only one link. i.e. the input port cardinality is 0:1\n\t\t\t\t\tif (linksToTrgPort.length === 1) {\n\t\t\t\t\t\tthis.canvasController.editActionHandler({\n\t\t\t\t\t\t\teditType: \"linkNodesAndReplace\",\n\t\t\t\t\t\t\teditSource: \"canvas\",\n\t\t\t\t\t\t\tnodes: [{ \"id\": this.drawingNewLinkData.srcObjId, \"portId\": this.drawingNewLinkData.srcPortId }],\n\t\t\t\t\t\t\ttargetNodes: [{ \"id\": trgNode.id, \"portId\": trgPortId }],\n\t\t\t\t\t\t\ttype: type,\n\t\t\t\t\t\t\tpipelineId: this.pipelineId,\n\t\t\t\t\t\t\treplaceLink: linksToTrgPort[0]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t} else if (type === ASSOCIATION_LINK) {\n\t\t\t\tconst srcNode = this.activePipeline.getNode(this.drawingNewLinkData.srcObjId);\n\n\t\t\t\tif (CanvasUtils.isAssocConnectionAllowed(srcNode, trgNode, this.activePipeline.links)) {\n\t\t\t\t\tthis.canvasController.editActionHandler({\n\t\t\t\t\t\teditType: \"linkNodes\",\n\t\t\t\t\t\teditSource: \"canvas\",\n\t\t\t\t\t\tnodes: [{ \"id\": this.drawingNewLinkData.srcObjId }],\n\t\t\t\t\t\ttargetNodes: [{ \"id\": trgNode.id }],\n\t\t\t\t\t\ttype: type,\n\t\t\t\t\t\tpipelineId: this.pipelineId });\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tif (CanvasUtils.isCommentLinkConnectionAllowed(this.drawingNewLinkData.srcObjId, trgNode.id, this.activePipeline.links)) {\n\t\t\t\t\tthis.canvasController.editActionHandler({\n\t\t\t\t\t\teditType: \"linkComment\",\n\t\t\t\t\t\teditSource: \"canvas\",\n\t\t\t\t\t\tnodes: [this.drawingNewLinkData.srcObjId],\n\t\t\t\t\t\ttargetNodes: [trgNode.id],\n\t\t\t\t\t\ttype: COMMENT_LINK,\n\t\t\t\t\t\tlinkType: \"comment\", // Added for historical purposes - for WML Canvas support\n\t\t\t\t\t\tpipelineId: this.pipelineId });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.drawingNewLinkData = null;\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) {\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.config.enableHighlightNodeOnNewLinkDrag) {\n\t\t\tthis.setNewLinkOverNodeCancel();\n\t\t}\n\n\t\tconst endPoint = this.getTransformedMousePos(d3Event);\n\t\tthis.canvasController.editActionHandler({\n\t\t\teditType: \"createDetachedLink\",\n\t\t\teditSource: \"canvas\",\n\t\t\tsrcNodeId: this.drawingNewLinkData.srcObjId,\n\t\t\tsrcNodePortId: this.drawingNewLinkData.srcPortId,\n\t\t\ttrgPos: endPoint,\n\t\t\ttype: NODE_LINK,\n\t\t\tpipelineId: this.pipelineId });\n\n\t\tthis.drawingNewLinkData = null;\n\t}\n\n\tstopDrawingNewLink() {\n\t\t// Switch 'new link over node' highlighting off\n\t\tif (this.config.enableHighlightNodeOnNewLinkDrag) {\n\t\t\tthis.setNewLinkOverNodeCancel();\n\t\t}\n\n\t\tthis.stopDrawingNewLinkForPorts();\n\t\tthis.drawingNewLinkData = null;\n\t}\n\n\tstopDrawingNewLinkForPorts() {\n\t\tconst saveX1 = this.drawingNewLinkData.linkArray[0].x1;\n\t\tconst saveY1 = this.drawingNewLinkData.linkArray[0].y1;\n\t\tconst saveX2 = this.drawingNewLinkData.linkArray[0].x2;\n\t\tconst saveY2 = this.drawingNewLinkData.linkArray[0].y2;\n\n\t\tconst saveNewLinkData = Object.assign({}, this.drawingNewLinkData);\n\n\t\tthis.drawingNewLinkData = null;\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.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.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.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.nodesLinksGrp.selectAll(\".d3-new-connection-arrow\").remove();\n\n\t\t\t\tthis.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.portWidth / 2))\n\t\t\t\t\t.attr(\"y\", saveY1 - (saveNewLinkData.portHeight / 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.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\tthis.nodesLinksGrp.selectAll(\".d3-new-connection-line\").remove();\n\t\tthis.nodesLinksGrp.selectAll(\".d3-new-connection-start\").remove();\n\t\tthis.nodesLinksGrp.selectAll(\".d3-new-connection-guide\").remove();\n\t\tthis.nodesLinksGrp.selectAll(\".d3-new-connection-arrow\").remove();\n\t}\n\n\tremoveNewLinkLine() {\n\t\tthis.nodesLinksGrp.selectAll(\".d3-new-connection-line\").remove();\n\t}\n\n\tdragLinkHandle(d3Event) {\n\t\tconst transPos = this.getTransformedMousePos(d3Event);\n\t\tconst link = this.draggingLinkData.link;\n\n\t\tif (this.draggingLinkData.endBeingDragged === \"start\") {\n\t\t\tlink.srcPos = { x_pos: transPos.x, y_pos: transPos.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: transPos.x, y_pos: transPos.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.displayLinks();\n\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.config.enableHighlightNodeOnNewLinkDrag) {\n\t\t\tthis.setNewLinkOverNode(d3Event);\n\t\t}\n\t}\n\n\tcompleteDraggedLink(d3Event) {\n\t\tconst newLink = this.getNewLinkOnDrag(d3Event);\n\n\t\tif (newLink) {\n\t\t\tthis.canvasController.editActionHandler({\n\t\t\t\teditType: \"updateLink\",\n\t\t\t\teditSource: \"canvas\",\n\t\t\t\tnewLink: newLink,\n\t\t\t\tpipelineId: this.pipelineId });\n\t\t} else {\n\t\t\tthis.activePipeline.replaceLink(this.draggingLinkData.oldLink);\n\t\t\tthis.displayLinks();\n\t\t}\n\n\t\t// Switch 'new link over node' highlighting off\n\t\tif (this.config.enableHighlightNodeOnNewLinkDrag) {\n\t\t\tthis.setNewLinkOverNodeCancel();\n\t\t}\n\n\t\tthis.unsetUnavailableNodesHighlighting();\n\t\tthis.stopDraggingLink();\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\tgetNewLinkOnDrag(d3Event, nodeProximity) {\n\t\tconst oldLink = this.draggingLinkData.oldLink;\n\t\tconst newLink = cloneDeep(oldLink);\n\n\t\tif (this.draggingLinkData.endBeingDragged === \"start\") {\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.getNodeNearMousePos(d3Event, nodeProximity)\n\t\t\t\t: this.getNodeAtMousePos(d3Event);\n\n\t\t\tif (srcNode) {\n\t\t\t\tnewLink.srcNodeId = srcNode.id;\n\t\t\t\tnewLink.srcNodePortId = nodeProximity\n\t\t\t\t\t? this.getNodePortIdNearMousePos(d3Event, OUTPUT_TYPE, srcNode)\n\t\t\t\t\t: this.getOutputNodePortId(d3Event, 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.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.getNodeNearMousePos(d3Event, nodeProximity)\n\t\t\t\t: this.getNodeAtMousePos(d3Event);\n\n\t\t\tif (trgNode) {\n\t\t\t\tnewLink.trgNodeId = trgNode.id;\n\t\t\t\tnewLink.trgNodePortId = nodeProximity\n\t\t\t\t\t? this.getNodePortIdNearMousePos(d3Event, INPUT_TYPE, trgNode)\n\t\t\t\t\t: this.getInputNodePortId(d3Event, 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.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.canExecuteUpdateLinkCommand(newLink, oldLink)) {\n\t\t\treturn newLink;\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Returns true if the update command for a dragged link can be executed.\n\t// It might be prevented from executing if either the course\n\tcanExecuteUpdateLinkCommand(newLink, oldLink) {\n\t\tconst srcNode = this.activePipeline.getNode(newLink.srcNodeId);\n\t\tconst trgNode = this.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.activePipeline.links;\n\t\tlet executeCommand = true;\n\n\t\tif (linkSrcChanged && srcNode &&\n\t\t\t\t!CanvasUtils.isSrcConnectionAllowedWithDetachedLinks(newLink.srcNodePortId, srcNode, links)) {\n\t\t\texecuteCommand = false;\n\t\t}\n\t\tif (linkTrgChanged && trgNode &&\n\t\t\t\t!CanvasUtils.isTrgConnectionAllowedWithDetachedLinks(newLink.trgNodePortId, trgNode, links)) {\n\t\t\texecuteCommand = false;\n\t\t}\n\t\tif (srcNode && trgNode &&\n\t\t\t\t!CanvasUtils.isConnectionAllowedWithDetachedLinks(newLink.srcNodePortId, newLink.trgNodePortId, srcNode, trgNode, links)) {\n\t\t\texecuteCommand = false;\n\t\t}\n\t\treturn executeCommand;\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\tstopDraggingLink() {\n\t\tthis.draggingLinkData = null;\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 indicated by\n\t// the clientX and clientY coordinates in the d3Event.\n\tgetNodeAtMousePos(d3Event) {\n\t\tconst nodeGrpElement = this.getElementWithClassAtMousePos(d3Event, \"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 mouse\n\t// position described by d3Event or, if the mouse is not over a port, the\n\t// ID of the default port for the node provided.\n\tgetInputNodePortId(d3Event, trgNode) {\n\t\tlet inputPortId = this.getInputNodePortIdAtMousePos(d3Event);\n\t\tif (!inputPortId) {\n\t\t\tinputPortId = CanvasUtils.getDefaultInputPortId(trgNode);\n\t\t}\n\t\treturn inputPortId;\n\t}\n\n\t// Returns a node input port ID, if one can be found, at the position\n\t// indicated by the clientX and clientY coordinates in the d3Event.\n\tgetInputNodePortIdAtMousePos(d3Event) {\n\t\tconst portElement = this.getElementWithClassAtMousePos(d3Event, this.getNodeInputPortClassName());\n\t\treturn this.getNodePortIdForElement(portElement);\n\t}\n\n\t// Returns an output node port ID for either, the port that is under the mouse\n\t// position described by d3Event or, if the mouse is not over a port, the\n\t// ID of the default port for the node provided.\n\tgetOutputNodePortId(d3Event, srcNode) {\n\t\tlet outputPortId = this.getOutputNodePortIdAtMousePos(d3Event);\n\t\tif (!outputPortId) {\n\t\t\toutputPortId = CanvasUtils.getDefaultOutputPortId(srcNode);\n\t\t}\n\t\treturn outputPortId;\n\t}\n\n\t// Returns a node output port ID, if one can be found, at the position\n\t// indicated by the clientX and clientY coordinates in the d3Event.\n\tgetOutputNodePortIdAtMousePos(d3Event) {\n\t\tconst portElement = this.getElementWithClassAtMousePos(d3Event, this.getNodeOutputPortClassName());\n\t\treturn this.getNodePortIdForElement(portElement);\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\n\t// indicated by the clientX and clientY coordinates in the d3Event.\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\tgetElementWithClassAtMousePos(d3Event, className) {\n\t\tconst posX = d3Event.clientX ? d3Event.clientX : d3Event.sourceEvent.clientX;\n\t\tconst posY = d3Event.clientY ? d3Event.clientY : d3Event.sourceEvent.clientY;\n\t\treturn this.getElementWithClassAtPosition(posX, posY, className);\n\t}\n\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 lement 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\tvar node = null;\n\t\tconst prox = nodeProximity || 0;\n\t\tthis.getAllNodeGroupsSelection()\n\t\t\t.each((d) => {\n\t\t\t\tlet portRadius = d.layout.portRadius;\n\t\t\t\tif (CanvasUtils.isSuperBindingNode(d)) {\n\t\t\t\t\tportRadius = this.canvasLayout.supernodeBindingPortRadius / this.zoomTransform.k;\n\t\t\t\t}\n\n\t\t\t\tif (pos.x >= d.x_pos - portRadius - prox && // Target port sticks out by its radius so need to allow for it.\n\t\t\t\t\t\tpos.x <= d.x_pos + d.width + portRadius + 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\tgetNodePortIdNearMousePos(d3Event, portType, node) {\n\t\tconst pos = this.getTransformedMousePos(d3Event);\n\t\tlet portId = null;\n\t\tlet defaultPortId = null;\n\n\t\tif (node) {\n\t\t\tif (portType === OUTPUT_TYPE) {\n\t\t\t\tconst portObjs = this.getAllNodeGroupsSelection()\n\t\t\t\t\t.selectChildren(\".\" + this.getNodeOutputPortClassName())\n\t\t\t\t\t.selectChildren(\".d3-node-port-output-main\");\n\n\t\t\t\tportId = this.searchForPortNearMouse(\n\t\t\t\t\tnode, pos, portObjs,\n\t\t\t\t\tnode.layout.outputPortObject,\n\t\t\t\t\tnode.width);\n\t\t\t\tdefaultPortId = CanvasUtils.getDefaultOutputPortId(node);\n\n\t\t\t} else {\n\t\t\t\tconst portObjs = this.getAllNodeGroupsSelection()\n\t\t\t\t\t.selectChildren(\".\" + this.getNodeInputPortClassName())\n\t\t\t\t\t.selectChildren(\".d3-node-port-input-main\");\n\n\t\t\t\tportId = this.searchForPortNearMouse(\n\t\t\t\t\tnode, pos, portObjs,\n\t\t\t\t\tnode.layout.inputPortObject,\n\t\t\t\t\t0);\n\t\t\t\tdefaultPortId = CanvasUtils.getDefaultInputPortId(node);\n\t\t\t}\n\t\t}\n\n\t\tif (!portId) {\n\t\t\tportId = defaultPortId;\n\t\t}\n\t\treturn portId;\n\t}\n\n\t// Returns a port ID for the port identified by the position (pos) on the\n\t// node (node) further specified by the other parameters.\n\tsearchForPortNearMouse(node, pos, portObjs, portObjectType, nodeWidthOffset) {\n\t\tlet portId = null;\n\t\tportObjs\n\t\t\t.each((p, i, portGrps) => {\n\t\t\t\tconst portSel = d3.select(portGrps[i]);\n\t\t\t\tif (portObjectType === PORT_OBJECT_IMAGE) {\n\t\t\t\t\tconst xx = node.x_pos + Number(portSel.attr(\"x\"));\n\t\t\t\t\tconst yy = node.y_pos + Number(portSel.attr(\"y\"));\n\t\t\t\t\tconst wd = Number(portSel.attr(\"width\"));\n\t\t\t\t\tconst ht = Number(portSel.attr(\"height\"));\n\t\t\t\t\tif (pos.x >= xx &&\n\t\t\t\t\t\t\tpos.x <= xx + nodeWidthOffset + wd &&\n\t\t\t\t\t\t\tpos.y >= yy &&\n\t\t\t\t\t\t\tpos.y <= yy + ht) {\n\t\t\t\t\t\tportId = portGrps[i].getAttribute(\"data-port-id\");\n\t\t\t\t\t}\n\t\t\t\t} else { // Port must be a circle\n\t\t\t\t\tconst cx = node.x_pos + Number(portSel.attr(\"cx\"));\n\t\t\t\t\tconst cy = node.y_pos + Number(portSel.attr(\"cy\"));\n\t\t\t\t\tif (pos.x >= cx - node.layout.portRadius && // Target port sticks out by its radius so need to allow for it.\n\t\t\t\t\t\t\tpos.x <= cx + node.layout.portRadius &&\n\t\t\t\t\t\t\tpos.y >= cy - node.layout.portRadius &&\n\t\t\t\t\t\t\tpos.y <= cy + node.layout.portRadius) {\n\t\t\t\t\t\tportId = portGrps[i].getAttribute(\"data-port-id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\treturn portId;\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 a 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 === \"port-arcs\") {\n\t\t\treturn this.getPortArcsNodeShapePath(data); // Port-arc outline does not have a highlight gap\n\n\t\t}\n\t\treturn this.getRectangleNodeShapePath(data, data.layout.nodeHighlightGap);\n\t}\n\n\t// Returns a 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 === \"port-arcs\") {\n\t\t\treturn this.getPortArcsNodeShapePath(data);\n\n\t\t}\n\t\treturn this.getRectangleNodeShapePath(data);\n\t}\n\n\t// Returns a path that will draw the shape for the 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) {\n\t\tconst gap = highlightGap ? highlightGap : 0;\n\t\tconst x = 0 - gap;\n\t\tconst y = 0 - gap;\n\t\tconst width = data.width + gap;\n\t\tconst height = data.height + gap;\n\n\t\tlet path = \"M \" + x + \" \" + y + \" L \" + width + \" \" + y;\n\t\tpath += \" L \" + width + \" \" + height;\n\t\tpath += \" L \" + x + \" \" + height;\n\t\tpath += \" Z\"; // Draw a straight line back to origin.\n\n\t\treturn path;\n\t}\n\n\t// Returns a path that will draw the outline shape for the 'port-arcs' display\n\t// 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}\n\n\t\treturn this.getPortArcsNodeShapePathLeftRight(data);\n\t}\n\n\t// Returns a path that will draw the outline shape for the 'port-arcs' display\n\t// which shows arcs around each of the node circles for left to right link direction.\n\tgetPortArcsNodeShapePathLeftRight(data) {\n\t\tlet path = \"M 0 0 L \" + data.width + \" 0 \"; // Draw line across the top of the node\n\n\t\tif (data.outputs && data.outputs.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 (data.outputPortsHeight < data.height) {\n\t\t\t\tendPoint = data.outputs[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\tdata.outputs.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 < data.outputs.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 output 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 (data.inputs && data.inputs.length > 0) {\n\t\t\tlet endPoint2 = data.height - data.layout.portArcOffset;\n\n\t\t\tif (data.inputPortsHeight < data.height) {\n\t\t\t\tendPoint2 = data.inputs[data.inputs.length - 1].cy + data.layout.portArcRadius;\n\t\t\t}\n\n\t\t\tpath += \" L 0 \" + endPoint2;\n\n\t\t\tdata.inputs.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 < data.inputs.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 input ports just draw a straight line.\n\t\t}\n\t\treturn path;\n\t}\n\n\t// Returns a path that will draw the outline shape for the 'port-arcs' display\n\t// which shows arcs around each of the node circles for vertical link 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 output 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 input 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\tthis.setPortPositionsVertical(node, node.inputs, node.inputPortsWidth, node.layout.inputPortTopPosX, node.layout.inputPortTopPosY);\n\t\t\tthis.setPortPositionsVertical(node, node.outputs, node.outputPortsWidth, node.layout.outputPortBottomPosX, this.getOutputPortBottomPosY(node));\n\t\t} else if (this.canvasLayout.linkDirection === LINK_DIR_BOTTOM_TOP) {\n\t\t\tthis.setPortPositionsVertical(node, node.inputs, node.inputPortsWidth, node.layout.inputPortBottomPosX, this.getInputPortBottomPosY(node));\n\t\t\tthis.setPortPositionsVertical(node, node.outputs, node.outputPortsWidth, node.layout.outputPortTopPosX, node.layout.outputPortTopPosY);\n\t\t} else {\n\t\t\tthis.setPortPositionsLeftRight(node, node.inputs, node.inputPortsHeight, node.layout.inputPortLeftPosX, node.layout.inputPortLeftPosY);\n\t\t\tthis.setPortPositionsLeftRight(node, node.outputs, node.outputPortsHeight,\n\t\t\t\tthis.nodeUtils.getNodeOutputPortRightPosX(node),\n\t\t\t\tthis.nodeUtils.getNodeOutputPortRightPosY(node),\n\t\t\t\tthis.config.enableSingleOutputPortDisplay);\n\t\t}\n\t}\n\n\tgetOutputPortBottomPosY(node) {\n\t\treturn node.height + node.layout.outputPortBottomPosY;\n\t}\n\n\tgetInputPortBottomPosY(node) {\n\t\treturn node.height + node.layout.inputPortBottomPosY;\n\t}\n\n\tsetPortPositionsVertical(data, ports, portsWidth, xPos, yPos) {\n\t\tif (ports && ports.length > 0) {\n\t\t\tif (data.width <= data.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} else {\n\t\t\t\tlet xPosition = 0;\n\n\t\t\t\tif (CanvasUtils.isExpandedSupernode(data)) {\n\t\t\t\t\tconst widthSvgArea = data.width - (2 * this.canvasLayout.supernodeSVGAreaPadding);\n\t\t\t\t\tconst remainingSpace = widthSvgArea - portsWidth;\n\t\t\t\t\txPosition = (2 * this.canvasLayout.supernodeSVGAreaPadding) + (remainingSpace / 2);\n\n\t\t\t\t} else if (portsWidth < data.width) {\n\t\t\t\t\txPosition = (data.width - portsWidth) / 2;\n\t\t\t\t}\n\n\t\t\t\txPosition += data.layout.portArcOffset;\n\n\t\t\t\t// Sub-flow binding node ports need to be spaced by the inverse of the\n\t\t\t\t// zoom amount so that, after zoomToFit on the in-place sub-flow the\n\t\t\t\t// binding node ports line up with those on the supernode. This is only\n\t\t\t\t// necessary with binding nodes with mutiple ports.\n\t\t\t\tlet multiplier = 1;\n\t\t\t\tif (CanvasUtils.isSuperBindingNode(data)) {\n\t\t\t\t\tmultiplier = 1 / this.zoomTransform.k;\n\t\t\t\t}\n\n\t\t\t\tports.forEach((p) => {\n\t\t\t\t\txPosition += (data.layout.portArcRadius * multiplier);\n\t\t\t\t\tp.cx = xPosition;\n\t\t\t\t\tp.cy = yPos;\n\t\t\t\t\txPosition += ((data.layout.portArcRadius + data.layout.portArcSpacing) * multiplier);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tsetPortPositionsLeftRight(data, ports, portsHeight, xPos, yPos, displaySinglePort = false) {\n\t\tif (ports && ports.length > 0) {\n\t\t\tif (data.height <= data.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} else {\n\t\t\t\t// If we are only going to display a single port, we can 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.setPortPositionsLeftRightSinglePort(data, ports, xPos, yPos);\n\t\t\t\t} else {\n\t\t\t\t\tthis.setPortPositionsLeftRightAllPorts(data, ports, portsHeight, xPos, yPos);\n\t\t\t\t}\n\t\t\t}\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\tsetPortPositionsLeftRightAllPorts(data, ports, portsHeight, xPos, yPos) {\n\t\tlet yPosition = 0;\n\n\t\tif (CanvasUtils.isExpandedSupernode(data)) {\n\t\t\tconst heightSvgArea = data.height - this.canvasLayout.supernodeTopAreaHeight - this.canvasLayout.supernodeSVGAreaPadding;\n\t\t\tconst remainingSpace = heightSvgArea - portsHeight;\n\t\t\tyPosition = this.canvasLayout.supernodeTopAreaHeight + this.canvasLayout.supernodeSVGAreaPadding + (remainingSpace / 2);\n\n\t\t} else if (portsHeight < data.height) {\n\t\t\tyPosition = (data.height - portsHeight) / 2;\n\t\t}\n\n\t\tyPosition += data.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 mutiple ports.\n\t\tlet multiplier = 1;\n\t\tif (CanvasUtils.isSuperBindingNode(data)) {\n\t\t\tmultiplier = 1 / this.zoomTransform.k;\n\t\t}\n\t\tports.forEach((p) => {\n\t\t\tyPosition += (data.layout.portArcRadius * multiplier);\n\t\t\tp.cx = xPos;\n\t\t\tp.cy = yPosition;\n\t\t\tyPosition += ((data.layout.portArcRadius + data.layout.portArcSpacing) * multiplier);\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\tsetPortPositionsLeftRightSinglePort(data, ports, xPos, yPos) {\n\t\tlet yPosition = 0;\n\t\tif (CanvasUtils.isExpandedSupernode(data)) {\n\t\t\tconst heightSvgArea = data.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});\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(\"class\", (c) => this.getCommentGroupClass(c))\n\t\t\t.call((joinedCommentGrps) => this.updateComments(joinedCommentGrps));\n\t}\n\n\tcreateComments(enter) {\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\tif (this.config.enableEditingActions) {\n\t\t\tnewCommentGroups\n\t\t\t\t.call(this.drag);\t // Must put drag after mousedown listener so mousedown gets called first.\n\t\t}\n\n\t\t// Comment Sizing Area\n\t\tnewCommentGroups\n\t\t\t.append(\"rect\")\n\t\t\t.attr(\"class\", \"d3-comment-sizing\")\n\t\t\t.call(this.attachCommentSizingListeners.bind(this));\n\n\t\t// Comment Selection Highlighting Outline\n\t\tnewCommentGroups\n\t\t\t.append(\"rect\")\n\t\t\t.attr(\"class\", \"d3-comment-selection-highlight\");\n\n\t\t// Background Rectangle\n\t\tnewCommentGroups\n\t\t\t.append(\"rect\")\n\t\t\t.attr(\"width\", (c) => c.width)\n\t\t\t.attr(\"height\", (c) => c.height)\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", 0)\n\t\t\t.attr(\"class\", \"d3-comment-rect\");\n\n\t\t// Comment Text\n\t\tnewCommentGroups\n\t\t\t.append(\"foreignObject\")\n\t\t\t.attr(\"class\", \"d3-foreign-object-comment-text\")\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", 0)\n\t\t\t.append(\"xhtml:div\") // Provide a namespace when div is inside foreignObject\n\t\t\t.attr(\"class\", \"d3-comment-text\");\n\n\t\treturn newCommentGroups;\n\t}\n\n\tupdateComments(joinedCommentGrps) {\n\t\tjoinedCommentGrps\n\t\t\t.attr(\"transform\", (c) => `translate(${c.x_pos}, ${c.y_pos})`)\n\t\t\t.attr(\"class\", (c) => this.getCommentGroupClass(c));\n\n\t\t// Comment Sizing Area\n\t\tjoinedCommentGrps.selectChildren(\".d3-comment-sizing\")\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.selectChildren(\".d3-comment-selection-highlight\")\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 Body\n\t\tjoinedCommentGrps.selectChildren(\".d3-comment-rect\")\n\t\t\t.datum((c) => this.activePipeline.getComment(c.id))\n\t\t\t.attr(\"height\", (c) => c.height)\n\t\t\t.attr(\"width\", (c) => c.width)\n\t\t\t.attr(\"class\", \"d3-comment-rect\")\n\t\t\t.attr(\"style\", (c) => this.getCommentBodyStyle(c, \"default\"));\n\n\t\t// Comment Text\n\t\tjoinedCommentGrps.selectChildren(\".d3-foreign-object-comment-text\")\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\t\t\t.select(\"div\")\n\t\t\t.attr(\"style\", (c) => this.getNodeLabelStyle(c, \"default\"))\n\t\t\t.html((c) => (\n\t\t\t\tthis.config.enableMarkdownInComments\n\t\t\t\t\t? markdownIt.render(c.content)\n\t\t\t\t\t: escapeText(c.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(\"mouseenter\", (d3Event, d) => {\n\t\t\t\tthis.setCommentStyles(d, \"hover\", d3.select(d3Event.currentTarget));\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\");\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on(\"mouseleave\", (d3Event, d) => {\n\t\t\t\tthis.setCommentStyles(d, \"default\", d3.select(d3Event.currentTarget));\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\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\t\t\t\tif (this.svgCanvasTextArea.isEditingText()) {\n\t\t\t\t\tthis.svgCanvasTextArea.completeEditing();\n\t\t\t\t}\n\t\t\t\tif (!this.config.enableDragWithoutSelect) {\n\t\t\t\t\tthis.selectObjectD3Event(d3Event, d, \"comment\");\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.displayCommentTextArea(d, d3Event.currentTarget);\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\t// With enableDragWithoutSelect set to true, the object for which the\n\t\t\t\t// context menu is being requested needs to be implicitely selected.\n\t\t\t\tif (this.config.enableDragWithoutSelect) {\n\t\t\t\t\tthis.selectObjectD3Event(d3Event, d, \"comment\");\n\t\t\t\t}\n\t\t\t\tthis.openContextMenu(d3Event, \"comment\", d);\n\t\t\t});\n\t}\n\n\tattachCommentSizingListeners(commentGrps) {\n\t\tcommentGrps\n\t\t\t.on(\"mousedown\", (d3Event, d) => {\n\t\t\t\tthis.commentSizing = true;\n\t\t\t\t// Note - comment resizing and finalization of size is handled by drag functions.\n\t\t\t\tthis.addTempCursorOverlay(this.commentSizingCursor);\n\t\t\t})\n\t\t\t// Use mousemove here rather than 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\tif (this.config.enableEditingActions && // Only set cursor when we are able to edit comments\n\t\t\t\t\t!this.isRegionSelectOrSizingInProgress()) // Don't switch sizing direction if we are already sizing\n\t\t\t\t{\n\t\t\t\t\tlet cursorType = \"default\";\n\t\t\t\t\tif (!this.isPointerCloseToBodyEdge(d3Event, d)) {\n\t\t\t\t\t\tthis.commentSizingDirection = this.getSizingDirection(d3Event, d, this.canvasLayout.commentCornerResizeArea);\n\t\t\t\t\t\tthis.commentSizingCursor = this.getCursorBasedOnDirection(this.commentSizingDirection);\n\t\t\t\t\t\tcursorType = this.commentSizingCursor;\n\t\t\t\t\t}\n\t\t\t\t\td3.select(d3Event.currentTarget).style(\"cursor\", cursorType);\n\t\t\t\t}\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 asscoiated with\n\t// the comment group object passed in.\n\tcreateCommentPort(commentObj, d) {\n\t\tconst commentGrp = d3.select(commentObj);\n\n\t\tcommentGrp\n\t\t\t.append(\"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\t\t\t.on(\"mousedown\", (d3Event, cd) => {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(d3Event); // Stops the node drag behavior when clicking on the handle/circle\n\t\t\t\tthis.drawingNewLinkData = {\n\t\t\t\t\tsrcObjId: d.id,\n\t\t\t\t\taction: COMMENT_LINK,\n\t\t\t\t\tstartPos: {\n\t\t\t\t\t\tx: d.x_pos - this.canvasLayout.commentHighlightGap,\n\t\t\t\t\t\ty: d.y_pos - this.canvasLayout.commentHighlightGap\n\t\t\t\t\t},\n\t\t\t\t\tlinkArray: []\n\t\t\t\t};\n\t\t\t\tthis.drawNewLink(d3Event);\n\t\t\t});\n\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-rect\").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\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.nodeSizing || this.commentSizing) {\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// 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.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.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 currect 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// 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 retunred.\n\tgetMinHeight(node) {\n\t\tif (CanvasUtils.isSupernode(node)) {\n\t\t\tconst minHt = Math.max(node.inputPortsHeight, node.outputPortsHeight) +\n\t\t\t\tthis.canvasLayout.supernodeTopAreaHeight + this.canvasLayout.supernodeSVGAreaPadding;\n\t\t\treturn Math.max(this.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.isSupernode(node)) {\n\t\t\treturn this.canvasLayout.supernodeMinWidth;\n\t\t}\n\t\treturn node.layout.defaultNodeWidth;\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(d3Event, resizeObj) {\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(d3Event, resizeObj,\n\t\t\tthis.nodeSizingDirection, 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.isSupernode(resizeObj) &&\n\t\t\t\t\tthis.config.enableMoveNodesOnSupernodeResize) {\n\t\t\t\tconst objectsInfo = CanvasUtils.moveSurroundingObjects(\n\t\t\t\t\toldSupernode,\n\t\t\t\t\tthis.activePipeline.getNodesAndComments(),\n\t\t\t\t\tthis.nodeSizingDirection,\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.activePipeline.links,\n\t\t\t\t\tthis.nodeSizingDirection,\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.displayMovedComments();\n\t\t\tthis.displayMovedNodes();\n\t\t\tthis.displaySingleNode(resizeObj);\n\t\t\tthis.displayMovedLinks();\n\t\t\tthis.displayCanvasAccoutrements();\n\n\t\t\tif (CanvasUtils.isSupernode(resizeObj)) {\n\t\t\t\tif (this.dispUtils.isDisplayingSubFlow()) {\n\t\t\t\t\tthis.displayBindingNodesToFitSVG();\n\t\t\t\t}\n\t\t\t\tthis.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(d3Event, resizeObj) {\n\t\tthis.resizeObject(d3Event, resizeObj, this.commentSizingDirection, 20, 20);\n\t\tthis.displaySingleComment(resizeObj);\n\t\tthis.displayMovedLinks();\n\t\tthis.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(d3Event, 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 += d3Event.dx;\n\t\t}\n\t\tif (direction.indexOf(\"s\") > -1) {\n\t\t\tincrementHeight += d3Event.dy;\n\t\t}\n\t\tif (direction.indexOf(\"n\") > -1) {\n\t\t\tincrementY += d3Event.dy;\n\t\t\tincrementHeight -= d3Event.dy;\n\t\t}\n\t\tif (direction.indexOf(\"w\") > -1) {\n\t\t\tincrementX += d3Event.dx;\n\t\t\tincrementWidth -= d3Event.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.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.canvasLayout.snapToGridXPx);\n\t\t\tyPos = CanvasUtils.snapToGrid(this.notSnappedYPos, this.canvasLayout.snapToGridYPx);\n\t\t\twidth = CanvasUtils.snapToGrid(this.notSnappedWidth, this.canvasLayout.snapToGridXPx);\n\t\t\theight = CanvasUtils.snapToGrid(this.notSnappedHeight, this.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// Finalises 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.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 retunred 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.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.pipelineId\n\t\t\t});\n\t\t}\n\t\tthis.nodeSizing = false;\n\t\tthis.nodeSizingObjectsInfo = {};\n\t\tthis.nodeSizingDetLinksInfo = {};\n\t}\n\n\t// Finalises 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.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.pipelineId\n\t\t\t};\n\t\t\tthis.canvasController.editActionHandler(data);\n\t\t}\n\t\tthis.commentSizing = false;\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// 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(\"style\", (d) => this.getLinkGrpStyle(d))\n\t\t\t.attr(\"data-selected\", (d) => (this.activePipeline.isSelected(d.id) ? true : null))\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\t// Add groups for links\n\t\tconst newLinkGrps = enter.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\t\t\t\t(d.type === COMMENT_LINK && this.canvasLayout.commentLinkArrowHead) ||\n\t\t\t\t\t\t\t\t\t\t\t(d.type === NODE_LINK && this.canvasLayout.linkType === LINK_TYPE_STRAIGHT))\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. Adding this here ensures the decorations\n\t\t// are always under the link handles whose group is added next.\n\t\tnewLinkGrps\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 handles, if needed.\n\t\tif (this.config.enableLinkSelection === LINK_SELECTION_HANDLES ||\n\t\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_DETACHABLE) {\n\t\t\tnewLinkGrps\n\t\t\t\t.append(\"g\")\n\t\t\t\t.attr(\"class\", \"d3-link-handles-group\")\n\t\t\t\t.each((d, i, linkGrps) => {\n\t\t\t\t\tif (d.type === NODE_LINK) {\n\t\t\t\t\t\t// Since there are always just two handles we create the here.\n\t\t\t\t\t\tthis.createNewHandles(d3.select(linkGrps[i]));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\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\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\t\t\t\t(d.type === COMMENT_LINK && this.canvasLayout.commentLinkArrowHead) ||\n\t\t\t\t\t\t\t\t\t\t\t(d.type === NODE_LINK && this.canvasLayout.linkType === LINK_TYPE_STRAIGHT))\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\tthis.displayDecorations(d, DEC_LINK, linkGrp, d.decorations);\n\t\t\t}\n\t\t});\n\n\t\t// Add link line handles at start and end of line, if required\n\t\tif (this.config.enableLinkSelection === LINK_SELECTION_HANDLES ||\n\t\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_DETACHABLE) {\n\t\t\tjoinedLinkGrps.each((d, i, linkGrps) => {\n\t\t\t\tif (d.type === NODE_LINK) {\n\t\t\t\t\t// We only need to update handles since they were created in the create link step\n\t\t\t\t\tthis.updateHandles(d3.select(linkGrps[i]).selectAll(\".d3-link-handles-group\"), lineArray);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (!this.dragging) {\n\t\t\tthis.setDisplayOrder(joinedLinkGrps);\n\t\t}\n\t}\n\n\tattachLinkGroupListeners(linkGrps) {\n\t\tlinkGrps\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();\n\t\t\t\t}\n\t\t\t\tif (this.config.enableLinkSelection !== LINK_SELECTION_NONE) {\n\t\t\t\t\tthis.selectObjectD3Event(d3Event, d, \"link\");\n\t\t\t\t}\n\t\t\t\td3Event.stopPropagation();\n\t\t\t})\n\t\t\t.on(\"mouseup\", () => {\n\t\t\t\tthis.logger.log(\"Link Group - mouse up\");\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(\"contextmenu\", (d3Event, d) => {\n\t\t\t\tthis.logger.log(\"Link Group - context menu\");\n\t\t\t\tif (this.config.enableLinkSelection !== LINK_SELECTION_NONE) {\n\t\t\t\t\tthis.selectObjectD3Event(d3Event, d, \"link\");\n\t\t\t\t}\n\t\t\t\tthis.openContextMenu(d3Event, \"link\", d);\n\t\t\t})\n\t\t\t.on(\"mouseenter\", (d3Event, link) => {\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\t\tthis.config.enableLinkSelection === LINK_SELECTION_DETACHABLE) {\n\t\t\t\t\tthis.raiseLinkToTop(targetObj);\n\t\t\t\t}\n\t\t\t\tthis.setLinkLineStyles(targetObj, link, \"hover\");\n\n\t\t\t\tif (this.config.enableContextToolbar) {\n\t\t\t\t\tthis.addContextToolbar(d3Event, link, \"link\");\n\t\t\t\t}\n\n\t\t\t\tif (this.canOpenTip(TIP_TYPE_LINK) &&\n\t\t\t\t\t\t!this.draggingLinkData) {\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(\"link_tip\", link.id),\n\t\t\t\t\t\ttype: TIP_TYPE_LINK,\n\t\t\t\t\t\ttargetObj: targetObj,\n\t\t\t\t\t\tmousePos: { x: d3Event.clientX, y: d3Event.clientY },\n\t\t\t\t\t\tpipelineId: this.activePipeline.id,\n\t\t\t\t\t\tlink: link\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 (!targetObj.getAttribute(\"data-selected\")) {\n\t\t\t\t\tthis.lowerLinkToBottom(targetObj);\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}\n\n\t// Creates a new start handle and a new end handle for the link groups\n\t// passed in.\n\tcreateNewHandles(handlesGrp) {\n\t\tconst startHandle = handlesGrp\n\t\t\t.append(this.canvasLayout.linkStartHandleObject)\n\t\t\t.attr(\"class\", (d) => \"d3-link-handle-start\")\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 start handle - mouse down\");\n\t\t\t\tif (!this.config.enableDragWithoutSelect) {\n\t\t\t\t\tthis.selectObjectD3Event(d3Event, d, \"link\");\n\t\t\t\t}\n\t\t\t\tthis.logger.log(\"Link end handle - finished mouse down\");\n\t\t\t});\n\n\t\tif (this.config.enableEditingActions) {\n\t\t\tstartHandle.call(this.dragSelectionHandle);\n\t\t}\n\n\t\tconst endHandle = handlesGrp\n\t\t\t.append(this.canvasLayout.linkEndHandleObject)\n\t\t\t.attr(\"class\", (d) => \"d3-link-handle-end\")\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 end handle - mouse down\");\n\t\t\t\tif (!this.config.enableDragWithoutSelect) {\n\t\t\t\t\tthis.selectObjectD3Event(d3Event, d, \"link\");\n\t\t\t\t}\n\t\t\t\tthis.logger.log(\"Link end handle - finished mouse down\");\n\t\t\t});\n\n\t\tif (this.config.enableEditingActions) {\n\t\t\tendHandle.call(this.dragSelectionHandle);\n\t\t}\n\t}\n\n\t// Updates the start and end link handles for the handle groups passed in.\n\tupdateHandles(handlesGrp, lineArray) {\n\t\thandlesGrp\n\t\t\t.selectAll(\".d3-link-handle-start\")\n\t\t\t.datum((d) => this.activePipeline.getLink(d.id))\n\t\t\t.each((datum, index, linkHandles) => {\n\t\t\t\tconst obj = d3.select(linkHandles[index]);\n\t\t\t\tif (this.canvasLayout.linkStartHandleObject === \"image\") {\n\t\t\t\t\tobj\n\t\t\t\t\t\t.attr(\"xlink:href\", this.canvasLayout.linkStartHandleImage)\n\t\t\t\t\t\t.attr(\"x\", (d) => d.x1 - (this.canvasLayout.linkStartHandleWidth / 2))\n\t\t\t\t\t\t.attr(\"y\", (d) => d.y1 - (this.canvasLayout.linkStartHandleHeight / 2))\n\t\t\t\t\t\t.attr(\"width\", this.canvasLayout.linkStartHandleWidth)\n\t\t\t\t\t\t.attr(\"height\", this.canvasLayout.linkStartHandleHeight);\n\n\t\t\t\t} else if (this.canvasLayout.linkStartHandleObject === \"circle\") {\n\t\t\t\t\tobj\n\t\t\t\t\t\t.attr(\"r\", this.canvasLayout.linkStartHandleRadius)\n\t\t\t\t\t\t.attr(\"cx\", (d) => d.x1)\n\t\t\t\t\t\t.attr(\"cy\", (d) => d.y1);\n\t\t\t\t}\n\t\t\t});\n\n\t\thandlesGrp\n\t\t\t.selectAll(\".d3-link-handle-end\")\n\t\t\t.datum((d) => this.activePipeline.getLink(d.id))\n\t\t\t.each((datum, index, linkHandles) => {\n\t\t\t\tconst obj = d3.select(linkHandles[index]);\n\t\t\t\tif (this.canvasLayout.linkEndHandleObject === \"image\") {\n\t\t\t\t\tobj\n\t\t\t\t\t\t.attr(\"xlink:href\", this.canvasLayout.linkEndHandleImage)\n\t\t\t\t\t\t.attr(\"x\", (d) => d.x2 - (this.canvasLayout.linkEndHandleWidth / 2))\n\t\t\t\t\t\t.attr(\"y\", (d) => d.y2 - (this.canvasLayout.linkEndHandleHeight / 2))\n\t\t\t\t\t\t.attr(\"width\", this.canvasLayout.linkEndHandleWidth)\n\t\t\t\t\t\t.attr(\"height\", this.canvasLayout.linkEndHandleHeight)\n\t\t\t\t\t\t.attr(\"transform\", (d) => this.getLinkImageTransform(d));\n\n\t\t\t\t} else if (this.canvasLayout.linkEndHandleObject === \"circle\") {\n\t\t\t\t\tobj\n\t\t\t\t\t\t.attr(\"r\", this.canvasLayout.linkEndHandleRadius)\n\t\t\t\t\t\t.attr(\"cx\", (d) => d.x2)\n\t\t\t\t\t\t.attr(\"cy\", (d) => d.y2);\n\t\t\t\t}\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 appled 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 appled to the link group object.\n\tgetLinkGroupClass(d) {\n\t\treturn \"d3-link-group \" + this.getLinkTypeClass(d) + \" \" + this.getLinkCustomClass(d);\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 appled 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\") {\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 appled 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\treturn \"d3-node-group\" + supernodeClass + resizeClass + draggableClass + customClass;\n\t}\n\n\t// Pushes the links to be below nodes within the nodesLinksGrp group.\n\tsetDisplayOrder(linkGroup) {\n\t\t// Force those links without decorations to be behind those with decorations\n\t\t// in case the links overlap we don't want the decorations to be overwritten.\n\t\tlinkGroup.filter((lnk) => this.hasOneDecorationOrMore(lnk)).lower();\n\t\tlinkGroup.filter((lnk) => !this.hasOneDecorationOrMore(lnk)).lower();\n\n\t\tif (this.config.enableLinkSelection === LINK_SELECTION_HANDLES ||\n\t\t\t\tthis.config.enableLinkSelection === LINK_SELECTION_DETACHABLE) {\n\t\t\tthis.raiseSelectedLinksToTop();\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// * We are currently drawing a new link\n\t// * We are dragging some object(s) around\n\t// * There are one or more selected links\n\t// * We are editing text\n\traiseNodeToTop(nodeGrp) {\n\t\tif (this.drawingNewLinkData === null && !this.dragging && this.activePipeline.getSelectedLinksCount() === 0 && !this.isEditingText()) {\n\t\t\tnodeGrp.raise();\n\t\t}\n\t}\n\n\t// Moves any selected links to the top of the display order. This is necessary\n\t// when selection handles are being displayed on selected links because the\n\t// handles may be in the same positions as port circles on the nodes.\n\traiseSelectedLinksToTop() {\n\t\tthis.nodesLinksGrp\n\t\t\t.selectAll(\".d3-link-group[data-selected]\")\n\t\t\t.raise();\n\t}\n\n\traiseLinkToTop(obj) {\n\t\td3.select(obj)\n\t\t\t.raise();\n\t}\n\n\tlowerLinkToBottom(obj) {\n\t\td3.select(obj)\n\t\t\t.lower();\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\tisLinkBeingDragged(link) {\n\t\treturn this.draggingLinkData && this.draggingLinkData.link.id === link.id;\n\t}\n\n\tbuildLinksArray() {\n\t\tlet linksArray = [];\n\n\t\tif (this.canvasLayout.linkType === LINK_TYPE_STRAIGHT) {\n\t\t\tthis.updateLinksForNodes();\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 && this.isLinkBeingDragged(link)) ||\n\t\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.getDetachedLineObj(link);\n\n\t\t\t} else {\n\t\t\t\tlinkObj = this.getAttachedLineObj(link);\n\t\t\t}\n\t\t\tif (linkObj) {\n\t\t\t\tlinksArray.push(linkObj);\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\treturn linksArray;\n\t}\n\n\tgetAttachedLineObj(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 = this.getSourcePortId(link, srcObj);\n\t\t\tconst trgPortId = this.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\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\n\t\t\tlink.assocLinkVariation = assocLinkVariation;\n\t\t\tlink.srcPortId = srcPortId;\n\t\t\tlink.trgPortId = trgPortId;\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\treturn link;\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Returns a line object describing the detached (or semi-detached) link\n\t// passed in. This will only ever be called when either srcNode OR trgNode\n\t// are null (indicating a semi-detached link) or when both are null indicating\n\t// a fully-detached link.\n\tgetDetachedLineObj(link) {\n\t\tconst srcObj = link.srcObj;\n\t\tconst trgNode = link.trgNode;\n\n\t\tlet srcPortId = null;\n\t\tlet trgPortId = null;\n\t\tconst coords = {};\n\n\t\tif (!srcObj) {\n\t\t\tcoords.x1 = link.srcPos.x_pos;\n\t\t\tcoords.y1 = link.srcPos.y_pos;\n\n\t\t} else {\n\t\t\tif (this.canvasLayout.linkType === LINK_TYPE_STRAIGHT) {\n\t\t\t\tconst endPos = { x: link.trgPos.x_pos, y: link.trgPos.y_pos };\n\t\t\t\tconst startPos = this.linkUtils.getNewStraightNodeLinkStartPos(srcObj, endPos, link.srcOriginInfo);\n\t\t\t\tcoords.x1 = startPos.x;\n\t\t\t\tcoords.y1 = startPos.y;\n\t\t\t\tcoords.originX = startPos.originX;\n\t\t\t\tcoords.originY = startPos.originY;\n\n\t\t\t} else {\n\t\t\t\tsrcPortId = this.getSourcePortId(link, srcObj);\n\t\t\t\tconst port = this.getOutputPort(srcObj, srcPortId);\n\t\t\t\tif (port) {\n\t\t\t\t\tcoords.x1 = srcObj.x_pos + port.cx;\n\t\t\t\t\tcoords.y1 = srcObj.y_pos + port.cy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!trgNode) {\n\t\t\tcoords.x2 = link.trgPos.x_pos;\n\t\t\tcoords.y2 = link.trgPos.y_pos;\n\n\t\t} else {\n\t\t\tif (this.canvasLayout.linkType === LINK_TYPE_STRAIGHT) {\n\t\t\t\tconst endPos = { x: link.srcPos.x_pos, y: link.srcPos.y_pos };\n\t\t\t\tconst startPos = this.linkUtils.getNewStraightNodeLinkStartPos(trgNode, endPos, link.trgOriginInfo);\n\t\t\t\tcoords.x2 = startPos.x;\n\t\t\t\tcoords.y2 = startPos.y;\n\n\t\t\t} else {\n\t\t\t\ttrgPortId = this.getTargetPortId(link, trgNode);\n\t\t\t\tconst port = this.getInputPort(trgNode, trgPortId);\n\t\t\t\tif (port) {\n\t\t\t\t\tcoords.x2 = trgNode.x_pos + port.cx;\n\t\t\t\t\tcoords.y2 = trgNode.y_pos + port.cy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\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\tlink.srcPortId = srcPortId;\n\t\tlink.trgPortId = trgPortId;\n\t\tlink.x1 = coords.x1;\n\t\tlink.y1 = coords.y1;\n\t\tlink.x2 = coords.x2;\n\t\tlink.y2 = coords.y2;\n\t\tlink.originX = coords.originX;\n\t\tlink.originY = coords.originY;\n\n\t\treturn link;\n\t}\n\n\tgetOutputPort(srcNode, srcPortId) {\n\t\tif (srcNode && srcNode.outputs) {\n\t\t\treturn srcNode.outputs.find((p) => p.id === srcPortId);\n\t\t}\n\t\treturn null;\n\t}\n\n\tgetInputPort(trgNode, trgPortId) {\n\t\tif (trgNode && trgNode.inputs) {\n\t\t\treturn trgNode.inputs.find((p) => p.id === trgPortId);\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Returns a source port Id if one exists in the link, otherwise defaults\n\t// to the first available port on the source node.\n\tgetSourcePortId(link, srcNode) {\n\t\tvar srcPortId;\n\t\tif (link.srcNodePortId) {\n\t\t\tsrcPortId = link.srcNodePortId;\n\t\t} else if (srcNode.outputs && srcNode.outputs.length > 0) {\n\t\t\tsrcPortId = srcNode.outputs[0].id;\n\t\t} else {\n\t\t\tsrcPortId = null;\n\t\t}\n\t\treturn srcPortId;\n\t}\n\n\t// Returns a target port Id if one exists in the link, otherwise defaults\n\t// to the first available port on the target node.\n\tgetTargetPortId(link, trgNode) {\n\t\tvar trgPortId;\n\t\tif (link.trgNodePortId) {\n\t\t\ttrgPortId = link.trgNodePortId;\n\t\t} else if (trgNode.inputs && trgNode.inputs.length > 0) {\n\t\t\ttrgPortId = trgNode.inputs[0].id;\n\t\t} else {\n\t\t\ttrgPortId = null;\n\t\t}\n\t\treturn trgPortId;\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, emantating 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 srcOriginInfo and trgOriginInfo) 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 straight line links.\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 straight lines are drawn between nodes.\n\tupdateLinksForNodes() {\n\t\tthis.activePipeline.nodes.forEach((n) => this.updateLinksForNode(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 srcOriginInfo and trgOriginInfo).\n\tupdateLinksForNode(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\tif (link.trgNode && link.trgNode.id === node.id) {\n\t\t\t\t\tif (link.srcObj) {\n\t\t\t\t\t\tconst dir = this.getDirAdjusted(link.trgNode, link.srcObj);\n\t\t\t\t\t\tlinksInfo[dir].push({ type: \"in\", 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({ type: \"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.getDirAdjusted(link.srcObj, link.trgNode);\n\t\t\t\t\t\tlinksInfo[dir].push({ type: \"out\", 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({ type: \"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\tlinksInfo.n = this.sortLinksInfo(linksInfo.n, NORTH);\n\t\tlinksInfo.s = this.sortLinksInfo(linksInfo.s, SOUTH);\n\t\tlinksInfo.e = this.sortLinksInfo(linksInfo.e, EAST);\n\t\tlinksInfo.w = this.sortLinksInfo(linksInfo.w, WEST);\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 of a link from the start node to the end node\n\t// as either NORTH, SOUTH, EAST or WEST. Some direction combinations\n\t// have to be overriden to prevent link lines overlapping.\n\tgetDirAdjusted(startNode, endNode) {\n\t\tlet dir = this.getDirToNode(startNode, endNode);\n\n\t\t// When start -> end is SOUTH and end -> start is WEST the returned direction\n\t\t// becomes EAST instead of SOUTH to prevent link lines overlapping.\n\t\tif (dir === SOUTH) {\n\t\t\tconst dir2 = this.getDirToNode(endNode, startNode);\n\t\t\tif (dir2 === WEST) {\n\t\t\t\tdir = EAST;\n\t\t\t}\n\n\t\t// When start -> end is NORTH and end -> start is EAST the returned direction\n\t\t// becomes WEST instead of NORTH to prevent link lines overlapping.\n\t\t} else if (dir === NORTH) {\n\t\t\tconst dir2 = this.getDirToNode(endNode, startNode);\n\t\t\tif (dir2 === EAST) {\n\t\t\t\tdir = WEST;\n\t\t\t}\n\t\t}\n\t\treturn dir;\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 position of the end of each link line, depending on\n\t// the direction (dir) of the lines. This is achieved by spliting the links\n\t// into groups where links in the same group go to/from the same node.\n\tsortLinksInfo(linksDirArrayIn, dir) {\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});\n\t\t\t});\n\n\t\t\t// For NORTH and SOUTH links we sort linksDirArray by the x coordinate\n\t\t\t// of the end of each link. For EAST and WEST we sort by the y\n\t\t\t// coordinate.\n\t\t\tif (dir === NORTH || dir === SOUTH) {\n\t\t\t\tlinksDirArray = linksDirArray.sort((a, b) => (a.x > b.x ? 1 : -1));\n\t\t\t} else {\n\t\t\t\tlinksDirArray = linksDirArray.sort((a, b) => (a.y > b.y ? 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 index by a node ID and\n\t// contains an array of linkInfo objects that go to/from the node.\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.type === \"out\") {\n\t\t\t\tli.link.srcOriginInfo = {\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.trgOriginInfo = {\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, portType) {\n\t\tif (portType === \"input\" && startX > endX) {\n\t\t\treturn ASSOC_VAR_CURVE_LEFT;\n\n\t\t} else if (portType === \"output\" && 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 input 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(port) {\n\t\treturn \"M -2 3 L 2 0 -2 -3\";\n\t}\n\n\t// Returns the transform to position and, if ncessecary, rotate the port\n\t// circle arrow.\n\tgetPortArrowPathTransform(port) {\n\t\tconst angle = this.getAngleBasedOnLinkDirection();\n\t\treturn `translate(${port.cx}, ${port.cy}) rotate(${angle})`;\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 end of a link line.\n\t// If the linkType is Elbow, it makes sure the arrow head is either\n\t// horizontal for left-right or vertical for top-bottom/bottom-top link\n\t// directions, because the end of elbow lines are always at the same angle as\n\t// the elbow lines. Otherwise it returns an angle so the arrow head is\n\t// relevant to the slope of the straight link being drawn.\n\t// TODO -- This doesn't handle \"Curve\" link types very well (in fact for\n\t// curves it returns the same as for \"Straight\" links) becauset it is very\n\t// difficult to write an algorithm that gives the correct angle for a\n\t// \"Curve\" link to make it look presentable. I know, I tried!\n\tgetArrowHeadTransform(d) {\n\t\tconst angle =\n\t\t\tthis.canvasLayout.linkType === LINK_TYPE_ELBOW ||\n\t\t\tthis.canvasLayout.linkType === LINK_TYPE_CURVE\n\t\t\t\t? this.getAngleBasedOnLinkDirection()\n\t\t\t\t: Math.atan2((d.y2 - d.y1), (d.x2 - d.x1)) * (180 / Math.PI);\n\n\t\treturn `translate(${d.x2}, ${d.y2}) rotate(${angle})`;\n\t}\n\n\t// Returns the angle for the arrow head when perpndicular arrows are in\n\t// us such as when a the link type is \"Elbow\" or when we are displaying an\n\t// arrow head inside a port circle.\n\tgetAngleBasedOnLinkDirection() {\n\t\tif (this.canvasLayout.linkDirection === LINK_DIR_TOP_BOTTOM) {\n\t\t\treturn NINETY_DEGREES;\n\n\t\t} else if (this.canvasLayout.linkDirection === LINK_DIR_BOTTOM_TOP) {\n\t\t\treturn -NINETY_DEGREES;\n\t\t}\n\t\treturn 0;\n\t}\n\n\tcanOpenTip(tipType) {\n\t\treturn this.canvasController.isTipEnabled(tipType) &&\n\t\t\t!this.regionSelect && !this.dragging &&\n\t\t\t!this.commentSizing && !this.nodeSizing && !this.drawingNewLinkData;\n\t}\n\n\t// Return the x,y coordinates of the svg group relative to the window's viewport\n\t// This is used when a new comment is created from the toolbar to make sure the\n\t// new comment always appears in the view port.\n\tgetDefaultCommentOffset() {\n\t\tlet xPos = this.canvasLayout.addCommentOffsetX;\n\t\tlet yPos = this.canvasLayout.addCommentOffsetY;\n\n\t\tif (this.zoomTransform) {\n\t\t\txPos = this.zoomTransform.x / this.zoomTransform.k;\n\t\t\tyPos = this.zoomTransform.y / this.zoomTransform.k;\n\n\t\t\t// The window's viewport is in the opposite direction of zoomTransform\n\t\t\txPos = -xPos + this.canvasLayout.addCommentOffsetX;\n\t\t\tyPos = -yPos + 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.dragging) {\n\t\t\tstr += \" dragging = true\";\n\t\t}\n\t\tif (this.nodeSizing) {\n\t\t\tstr += \" nodeSizing = true\";\n\t\t}\n\t\tif (this.commentSizing) {\n\t\t\tstr += \" commentSizing = 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","/*\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.renderer.setCanvasInfoRenderer(this.canvasInfo, selectionInfo, breadcrumbs, nodeLayout, canvasLayout);\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.isEditingText();\n\t}\n\n\tisDragging() {\n\t\treturn this.renderer.isDragging();\n\t}\n\n\tconvertPageCoordsToSnappedCanvasCoords(pos) {\n\t\tlet positon = this.renderer.convertPageCoordsToCanvasCoords(pos.x, pos.y);\n\t\tpositon = this.renderer.getMousePosSnapToGrid(positon);\n\t\treturn positon;\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) {\n\t\tthis.renderer.zoomTo(zoomObject);\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() {\n\t\tthis.renderer.zoomToFit();\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\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","/*\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-shadow: [\"error\", { \"allow\": [\"Node\", \"Comment\"] }] */\n\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport ReactResizeDetector from \"react-resize-detector\";\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 { FlowData16 } from \"@carbon/icons-react\";\nimport { DND_DATA_TEXT, STATE_TAG_LOCKED, STATE_TAG_READ_ONLY } from \"./constants/canvas-constants\";\n\nimport Logger from \"../logging/canvas-logger.js\";\nimport SVGCanvasD3 from \"./svg-canvas-d3.js\";\n\nconst BACKSPACE_KEY = 8;\nconst DELETE_KEY = 46;\nconst SPACE_KEY = 32;\nconst A_KEY = 65;\nconst C_KEY = 67;\nconst P_KEY = 80;\nconst V_KEY = 86;\nconst X_KEY = 88;\nconst Y_KEY = 89;\nconst Z_KEY = 90;\n\n// TODO - Implement nudge behavior for moving nodes and comments\n// const LEFT_ARROW_KEY = 37;\n// const UP_ARROW_KEY = 38;\n// const RIGHT_ARROW_KEY = 39;\n// const DOWN_ARROW_KEY = 40;\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// 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 = { x: 0, y: 0 };\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\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\tthis.svgCanvasD3 =\n\t\t\tnew SVGCanvasD3(this.props.canvasInfo.id,\n\t\t\t\tthis.svgCanvasDivSelector,\n\t\t\t\tthis.props.canvasController);\n\t\tthis.setCanvasInfo();\n\n\t\tif (this.props.canvasConfig.enableBrowserEditMenu) {\n\t\t\tthis.addEventListeners();\n\t\t}\n\t\tthis.focusOnCanvas();\n\t}\n\n\tcomponentDidUpdate(prevProps) {\n\t\tthis.logger.log(\"componentDidUpdate\");\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}\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}\n\n\tonCut(evt) {\n\t\tif (evt.currentTarget.activeElement.id === this.svgCanvasDivId &&\n\t\t\t\tthis.props.canvasConfig.enableEditingActions) {\n\t\t\tevt.preventDefault();\n\t\t\tthis.props.canvasController.cutToClipboard();\n\t\t}\n\t}\n\n\tonCopy(evt) {\n\t\tif (evt.currentTarget.activeElement.id === this.svgCanvasDivId &&\n\t\t\t\tthis.props.canvasConfig.enableEditingActions) {\n\t\t\tevt.preventDefault();\n\t\t\tthis.props.canvasController.copyToClipboard();\n\t\t}\n\t}\n\n\tonPaste(evt) {\n\t\tif (evt.currentTarget.activeElement.id === this.svgCanvasDivId &&\n\t\t\t\tthis.props.canvasConfig.enableEditingActions) {\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\t\t// We don't handle key presses when:\n\t\t// 1. We are editng 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() ||\n\t\t\t\tthis.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 ((evt.keyCode === BACKSPACE_KEY || evt.keyCode === DELETE_KEY) && 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.keyboardActionHandler(\"deleteSelectedObjects\");\n\n\t\t\t} else if (CanvasUtils.isCmndCtrlPressed(evt) &&\n\t\t\t\t\t!evt.shiftKey && evt.keyCode === Z_KEY && actions.undo) {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\t\tthis.props.canvasController.keyboardActionHandler(\"undo\");\n\n\t\t\t} else if (CanvasUtils.isCmndCtrlPressed(evt) &&\n\t\t\t\t\t((evt.shiftKey && evt.keyCode === Z_KEY) || evt.keyCode === Y_KEY && actions.redo)) {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\t\tthis.props.canvasController.keyboardActionHandler(\"redo\");\n\n\t\t\t} else if (CanvasUtils.isCmndCtrlPressed(evt) && evt.keyCode === C_KEY && actions.copyToClipboard) {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\t\tthis.props.canvasController.keyboardActionHandler(\"copy\");\n\n\t\t\t} else if (CanvasUtils.isCmndCtrlPressed(evt) && evt.keyCode === X_KEY && actions.cutToClipboard) {\n\t\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\t\tthis.props.canvasController.keyboardActionHandler(\"cut\");\n\n\t\t\t} else if (CanvasUtils.isCmndCtrlPressed(evt) && evt.keyCode === V_KEY && 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 last three 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 (CanvasUtils.isCmndCtrlPressed(evt) && evt.keyCode === A_KEY && actions.selectAll) {\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\tthis.props.canvasController.keyboardActionHandler(\"selectAll\");\n\n\t\t} else if (evt.keyCode === SPACE_KEY) {\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 (CanvasUtils.isCmndCtrlPressed(evt) && evt.shiftKey && evt.altKey && evt.keyCode === P_KEY) {\n\t\t\tCanvasUtils.stopPropagationAndPreventDefault(evt);\n\t\t\tLogger.switchLoggingState(); // Switch the logging on and off\n\t\t}\n\t}\n\n\tonKeyUp() {\n\t\tthis.svgCanvasD3.setSpaceKeyPressed(false);\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 &&\n\t\t\te.target.className &&\n\t\t\t(\n\t\t\t\te.target.className.baseVal === \"svg-area\" ||\n\t\t\t\te.target.className.baseVal === \"d3-svg-background\"\n\t\t\t)) {\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\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\"><FlowData16 /></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\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/>);\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\tgetSVGCanvasDiv() {\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 (<div tabIndex=\"-1\" className=\"d3-svg-canvas-div\" id={this.svgCanvasDivId} onKeyDown={this.onKeyDown} onKeyUp={this.onKeyUp} />);\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\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\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\tfocusOnCanvas() {\n\t\tif (document.getElementById(this.svgCanvasDivId)) {\n\t\t\tdocument.getElementById(this.svgCanvasDivId).focus(); // Set focus on div so keybord events go there.\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 contextMenu = this.getContextMenu();\n\t\tconst textToolbar = this.getTextToolbar();\n\t\tconst dropZoneCanvas = this.getDropZone();\n\t\tconst svgCanvasDiv = this.getSVGCanvasDiv();\n\n\t\tconst mainClassName = this.props.canvasConfig.enableRightFlyoutUnderToolbar\n\t\t\t? \"common-canvas-main\"\n\t\t\t: null;\n\n\t\tlet dropDivClassName = this.props.canvasConfig.enableRightFlyoutUnderToolbar\n\t\t\t? \"common-canvas-drop-div-under-toolbar\"\n\t\t\t: \"common-canvas-drop-div\";\n\n\t\tdropDivClassName = this.props.canvasConfig.enableToolbarLayout === \"None\"\n\t\t\t? dropDivClassName + \" common-canvas-toolbar-none\"\n\t\t\t: dropDivClassName;\n\n\t\tdropDivClassName = this.props.bottomPanelIsOpen\n\t\t\t? dropDivClassName + \" common-canvas-bottom-panel-is-open\"\n\t\t\t: dropDivClassName;\n\n\t\treturn (\n\t\t\t<main aria-label={this.getLabel(\"canvas.label\")} role=\"main\" className={mainClassName}>\n\t\t\t\t<ReactResizeDetector handleWidth handleHeight onResize={this.refreshOnSizeChange}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tid={this.mainCanvasDivId}\n\t\t\t\t\t\tclassName={dropDivClassName}\n\t\t\t\t\t\tonDrop={this.drop}\n\t\t\t\t\t\tonDragOver={this.dragOver}\n\t\t\t\t\t\tonDragEnter={this.dragEnter}\n\t\t\t\t\t\tonDragLeave={this.dragLeave}\n\t\t\t\t\t>\n\t\t\t\t\t\t{emptyCanvas}\n\t\t\t\t\t\t{svgCanvasDiv}\n\t\t\t\t\t\t{contextMenu}\n\t\t\t\t\t\t{textToolbar}\n\t\t\t\t\t\t{dropZoneCanvas}\n\t\t\t\t\t\t{stateTag}\n\t\t\t\t\t</div>\n\t\t\t\t</ReactResizeDetector>\n\t\t\t</main>\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\tbottomPanelIsOpen: PropTypes.bool,\n\tselectionInfo: PropTypes.object,\n\tbreadcrumbs: PropTypes.array\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\tcanvasInfo: state.canvasinfo,\n\tcanvasConfig: state.canvasconfig,\n\tbottomPanelIsOpen: state.bottompanel.isOpen,\n\tselectionInfo: state.selectioninfo,\n\tbreadcrumbs: state.breadcrumbs\n});\n\nexport default connect(mapStateToProps)(injectIntl(CanvasContents));\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 { 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 { ERROR, WARNING, SUCCESS, INFO, PALETTE_LAYOUT_NONE,\n\tNOTIFICATION_ICON_CLASS, TOOLBAR_TOGGLE_NOTIFICATION_PANEL, TOOLBAR_LAYOUT_TOP }\n\tfrom \"../common-canvas/constants/canvas-constants\";\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\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}\n\n\t\tconfig = Object.assign({}, config,\n\t\t\t{ leftBar: this.optionallyAddPaletteTool(config.leftBar || []) },\n\t\t\t{ rightBar: this.optionallyAddNotificationTool(config.rightBar || []) }\n\t\t);\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\treturn config;\n\t}\n\n\ttoolbarActionHandler(action) {\n\t\tthis.props.canvasController.toolbarActionHandler(action);\n\t}\n\n\toptionallyAddPaletteTool(leftBar) {\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 the new togglePalette icon if the palette is enabled.\n\t\tif (this.props.isPaletteEnabled) {\n\t\t\tconst paletteOpenClose = this.props.isPaletteOpen\n\t\t\t\t? { action: \"paletteClose\", label: paletteLabel, enable: true }\n\t\t\t\t: { action: \"paletteOpen\", label: paletteLabel, enable: true };\n\n\t\t\tconst paletteTools = [\n\t\t\t\tpaletteOpenClose,\n\t\t\t\t{ divider: true }\n\t\t\t];\n\t\t\treturn paletteTools.concat(newLeftBar);\n\t\t}\n\t\treturn newLeftBar;\n\t}\n\n\toptionallyAddNotificationTool(rightBar) {\n\t\tif (this.props.notificationConfig &&\n\t\t\ttypeof this.props.notificationConfig.action !== \"undefined\" &&\n\t\t\ttypeof this.props.notificationConfig.enable !== \"undefined\") {\n\t\t\tconst notificationCount = this.props.notificationMessages.length;\n\t\t\tconst notificationTools = [\n\t\t\t\t{ divider: true },\n\t\t\t\t{ action: TOOLBAR_TOGGLE_NOTIFICATION_PANEL,\n\t\t\t\t\tlabel: this.props.notificationConfig.label,\n\t\t\t\t\tenable: this.props.notificationConfig.enable,\n\t\t\t\t\tisSelected: this.props.isNotificationOpen,\n\t\t\t\t\tclassName: this.getNotificationClassName(),\n\t\t\t\t\ttextContent: (notificationCount > 9) ? \"9+\" : notificationCount.toString()\n\t\t\t\t}\n\t\t\t];\n\t\t\treturn rightBar.concat(notificationTools);\n\t\t}\n\t\treturn rightBar;\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\tcanvasToolbar = (\n\t\t\t\t<div aria-label={this.getLabel(\"toolbar.label\")} role=\"navigation\" className={\"common-canvas-toolbar\"} >\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\ttoolbarActionHandler={this.toolbarActionHandler}\n\t\t\t\t\t\tadditionalText={{ overflowMenuLabel: this.getLabel(\"toolbar.overflowMenu\") }}\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\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\tnotificationConfig: PropTypes.object,\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\tnotificationConfig: state.notificationpanel.config,\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 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 Logger from \"../logging/canvas-logger.js\";\n\nclass CommonCanvasRightFlyout extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.logger = new Logger(\"CC-RightFlyout\");\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\tlet rightFlyout = (<div className=\"right-flyout-panel\" />);\n\n\t\tif (this.props.content && this.props.isOpen) {\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\t\t\trightFlyout = (\n\t\t\t\t<div className={rfClass}>\n\t\t\t\t\t{this.props.content}\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 Redux\n\tisOpen: PropTypes.bool,\n\tcontent: PropTypes.object,\n\tenableRightFlyoutUnderToolbar: PropTypes.bool\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\tisOpen: state.rightflyout.isOpen,\n\tcontent: state.rightflyout.content,\n\tenableRightFlyoutUnderToolbar: state.canvasconfig.enableRightFlyoutUnderToolbar\n});\n\nexport default connect(mapStateToProps)(CommonCanvasRightFlyout);\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 Logger from \"../logging/canvas-logger.js\";\n\nconst MARGIN_TOP = 100;\nconst MIN_HEIGHT = 75;\n\nclass CanvasBottomPanel extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.logger = new Logger(\"CC-Bottom-Panel\");\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\tonMouseDown(e) {\n\t\tif (e.button === 0) {\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\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\t// Returns a new height for the bottom panel limited by the need to enforce\n\t// a minimum and maximum height.\n\tlimitHeight(ht) {\n\t\tconst canvasContainer = document.getElementById(this.props.containingDivId);\n\t\tlet height = ht;\n\n\t\t// canvasContainer may not be available in some test situations\n\t\tif (canvasContainer) {\n\t\t\tconst canvasHeight = canvasContainer.getBoundingClientRect().height;\n\t\t\tconst maxHeight = canvasHeight - MARGIN_TOP;\n\t\t\theight = Math.min(Math.max(height, MIN_HEIGHT), maxHeight);\n\t\t}\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\tbottomPanel = (\n\t\t\t\t<div className=\"bottom-panel\" style={{ height: heightPx }} >\n\t\t\t\t\t<div className=\"bottom-panel-drag\" 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\tcontainingDivId: PropTypes.string,\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 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\tlet className = \"top-panel\";\n\t\tif (this.props.toolbarIsOpen) {\n\t\t\tclassName += \" common-canvas-toolbar-none\";\n\t\t}\n\n\t\tif (this.props.topPanelIsOpen) {\n\t\t\ttopPanel = (\n\t\t\t\t<div className={className} >\n\t\t\t\t\t{this.props.topPanelContent}\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\ttoolbarIsOpen: PropTypes.bool\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\ttopPanelIsOpen: state.toppanel.isOpen,\n\ttopPanelContent: state.toppanel.content,\n\ttoolbarIsOpen: (state.canvasconfig.enableToolbarLayout === \"None\")\n});\nexport default connect(mapStateToProps)(CanvasTopPanel);\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 { injectIntl } from \"react-intl\";\nimport Icon from \"./../icons/icon.jsx\";\nimport { Button } from \"carbon-components-react\";\nimport { Close16 } from \"@carbon/icons-react\";\nimport Logger from \"../logging/canvas-logger.js\";\nimport { DEFAULT_NOTIFICATION_HEADER, NOTIFICATION_ICON_CLASS } from \"./../common-canvas/constants/canvas-constants.js\";\nimport defaultMessages from \"../../locales/notification-panel/locales/en.json\";\n\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\t\tthis.logger = new Logger(\"NotificationPanel\");\n\t\tthis.handleNotificationPanelClickOutside = this.handleNotificationPanelClickOutside.bind(this);\n\t\tthis.closeNotificationPanel = this.closeNotificationPanel.bind(this);\n\t}\n\n\tcomponentDidMount() {\n\t\tdocument.addEventListener(\"click\", this.handleNotificationPanelClickOutside, true);\n\t}\n\n\tcomponentWillUnmount() {\n\t\tdocument.removeEventListener(\"click\", this.handleNotificationPanelClickOutside, true);\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\t<hr />\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? (<div className = \"notification-message-close\" onClick={this.deleteNotification.bind(this, message.id)}>\n\t\t\t\t\t{message.closeMessage}\n\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\tnotifications.push(<div className=\"notifications-button-container\" key={index + \"-\" + message.id} >\n\t\t\t\t<div\n\t\t\t\t\tclassName={\"notifications \" + className + message.type}\n\t\t\t\t\tonClick={this.notificationCallback.bind(this, message.id, message.callback)}\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</div>\n\t\t\t</div>);\n\t\t}\n\n\t\treturn notifications;\n\t}\n\n\thandleNotificationPanelClickOutside(e) {\n\t\tif (this.props.isNotificationOpen &&\n\t\t\t\tthis.props.notificationConfig &&\n\t\t\t\t!this.props.notificationConfig.keepOpen) {\n\t\t\tconst notificationIcon = document.getElementsByClassName(NOTIFICATION_ICON_CLASS)[0];\n\t\t\tconst notificationHeader = document.getElementsByClassName(\"notification-panel-header\")[0];\n\t\t\tconst notificationMessages = document.getElementsByClassName(\"notification-panel-messages-container\")[0];\n\n\t\t\tif (notificationIcon && !notificationIcon.contains(e.target) &&\n\t\t\t\t\tnotificationHeader && !notificationHeader.contains(e.target) &&\n\t\t\t\t\tnotificationMessages && !notificationMessages.contains(e.target)) {\n\t\t\t\tthis.props.canvasController.toolbarActionHandler(\"closeNotificationPanel\");\n\t\t\t\te.stopPropagation(); // Prevent D3 canvas code from clearing the selections.\n\t\t\t}\n\t\t}\n\t}\n\n\tnotificationCallback(id, messageCallback) {\n\t\tif (messageCallback) {\n\t\t\tmessageCallback(id);\n\t\t}\n\t}\n\n\tdeleteNotification(id) {\n\t\tthis.props.canvasController.deleteNotificationMessages(id);\n\t}\n\n\tclearNotificationMessages() {\n\t\tthis.props.canvasController.clearNotificationMessages();\n\t\tif (typeof this.props.notificationConfig.clearAllCallback === \"function\") {\n\t\t\tthis.props.notificationConfig.clearAllCallback();\n\t\t}\n\t}\n\n\tcloseNotificationPanel() {\n\t\tthis.props.canvasController.toolbarActionHandler(\"closeNotificationPanel\");\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\tif (!this.props.notificationConfig) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst notificationPanelClassName = this.props.isNotificationOpen ? \"\" : \"panel-hidden\";\n\t\tconst notificationHeader = this.props.notificationConfig && this.props.notificationConfig.notificationHeader\n\t\t\t? this.props.notificationConfig.notificationHeader\n\t\t\t: DEFAULT_NOTIFICATION_HEADER;\n\n\t\tconst notificationSubtitle = this.props.notificationConfig && this.props.notificationConfig.notificationSubtitle\n\t\t\t? (<div className=\"notification-panel-subtitle\">\n\t\t\t\t{this.props.notificationConfig.notificationSubtitle}\n\t\t\t</div>)\n\t\t\t: null;\n\n\t\tconst notificationPanelMessages = this.props.messages.length > 0\n\t\t\t? this.getNotifications()\n\t\t\t: (<div className=\"notification-panel-empty-message-container\">\n\t\t\t\t<div className=\"notification-panel-empty-message\">\n\t\t\t\t\t{this.props.notificationConfig && this.props.notificationConfig.emptyMessage ? this.props.notificationConfig.emptyMessage : null}\n\t\t\t\t</div>\n\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\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=\"small\"\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\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=\"small\"\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 (<div className={\"notification-panel-container \" + notificationPanelClassName} >\n\t\t\t<div className=\"notification-panel\">\n\t\t\t\t<div className=\"notification-panel-header-container\">\n\t\t\t\t\t<div className=\"notification-panel-header\">\n\t\t\t\t\t\t{notificationHeader}\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tclassName=\"notification-panel-close-button\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tkind=\"ghost\"\n\t\t\t\t\t\t\trenderIcon={Close16}\n\t\t\t\t\t\t\thasIconOnly\n\t\t\t\t\t\t\ticonDescription={this.props.intl.formatMessage({\n\t\t\t\t\t\t\t\tid: \"notification.panel.close.button.description\",\n\t\t\t\t\t\t\t\tdefaultMessage: defaultMessages[\"notification.panel.close.button.description\"]\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\tonClick={this.closeNotificationPanel}\n\t\t\t\t\t\t\ttooltipAlignment=\"end\"\n\t\t\t\t\t\t\ttooltipPosition=\"bottom\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t{notificationSubtitle}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"notification-panel-messages-container\">\n\t\t\t\t\t<div className=\"notification-panel-messages\">\n\t\t\t\t\t\t{notificationPanelMessages}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"notification-panel-button-container\">\n\t\t\t\t\t\t{clearAll}\n\t\t\t\t\t\t{secondaryButton}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>);\n\t}\n}\n\nNotificationPanel.propTypes = {\n\t// Provided by CommonCanvas\n\tcanvasController: 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\tisNotificationOpen: 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\tisNotificationOpen: state.notificationpanel.isOpen,\n\tmessages: state.notifications\n});\n\nexport default connect(mapStateToProps)(injectIntl(NotificationPanel));\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 CanvasContents from \"./cc-contents.jsx\";\nimport CommonCanvasToolbar from \"./cc-toolbar.jsx\";\nimport CommonCanvasRightFlyout from \"./cc-right-flyout.jsx\";\nimport CanvasBottomPanel from \"./cc-bottom-panel.jsx\";\nimport CanvasTopPanel from \"./cc-top-panel.jsx\";\nimport NotificationPanel from \"../notification-panel/notification-panel.jsx\";\nimport Logger from \"../logging/canvas-logger.js\";\n\nclass CommonCanvasCentralItems extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.logger = new Logger(\"CC-CentralItems\");\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\tconst rightFlyout = (<CommonCanvasRightFlyout />);\n\t\tconst canvasToolbar = (<CommonCanvasToolbar canvasController={this.props.canvasController} />);\n\t\tconst notificationPanel = (<NotificationPanel canvasController={this.props.canvasController} />);\n\t\tconst canvasContents = (<CanvasContents canvasController={this.props.canvasController} />);\n\t\tconst bottomPanel = (<CanvasBottomPanel canvasController={this.props.canvasController} containingDivId={this.props.containingDivId} />);\n\t\tconst topPanel = (<CanvasTopPanel canvasController={this.props.canvasController} containingDivId={this.props.containingDivId} />);\n\n\t\tlet centralItems = null;\n\t\tif (this.props.enableRightFlyoutUnderToolbar) {\n\t\t\tcentralItems = (\n\t\t\t\t<div className=\"common-canvas-right-side-items-under-toolbar\">\n\t\t\t\t\t{canvasToolbar}\n\t\t\t\t\t<div id={this.props.containingDivId} className=\"common-canvas-items-container-under-toolbar\">\n\t\t\t\t\t\t<div className=\"common-canvas-with-bottom-panel\">\n\t\t\t\t\t\t\t{canvasContents}\n\t\t\t\t\t\t\t{topPanel}\n\t\t\t\t\t\t\t{bottomPanel}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{rightFlyout}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{notificationPanel}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\n\t\t} else {\n\t\t\tcentralItems = (\n\t\t\t\t<div className=\"common-canvas-right-side-items\">\n\t\t\t\t\t<div id={this.props.containingDivId} className=\"common-canvas-items-container\">\n\t\t\t\t\t\t{canvasToolbar}\n\t\t\t\t\t\t{canvasContents}\n\t\t\t\t\t\t{topPanel}\n\t\t\t\t\t\t{bottomPanel}\n\t\t\t\t\t\t{notificationPanel}\n\t\t\t\t\t</div>\n\t\t\t\t\t{rightFlyout}\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn centralItems;\n\t}\n}\n\nCommonCanvasCentralItems.propTypes = {\n\t// Provided by CommonCanvas\n\tcanvasController: PropTypes.object.isRequired,\n\tcontainingDivId: PropTypes.string.isRequired,\n\n\t// Provided by Redux\n\tenableRightFlyoutUnderToolbar: PropTypes.bool\n};\n\nconst mapStateToProps = (state, ownProps) => ({\n\tenableRightFlyoutUnderToolbar: state.canvasconfig.enableRightFlyoutUnderToolbar\n});\n\nexport default connect(mapStateToProps)(CommonCanvasCentralItems);\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 { Provider } from \"react-redux\";\nimport { injectIntl } from \"react-intl\";\nimport PropTypes from \"prop-types\";\nimport Palette from \"../palette/palette.jsx\";\nimport CommonCanvasTooltip from \"./cc-tooltip.jsx\";\nimport CommonCanvasCentralItems from \"./cc-central-items.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\t\tthis.containingDivId = \"common-canvas-items-container-\" + props.canvasController.getInstanceId();\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\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 overriden 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 overriden 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\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.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\tgenerateClass() {\n\t\tlet className = \"common-canvas\";\n\n\t\tclassName += (\n\t\t\t!this.isEditingAllowed()\n\t\t\t\t? \" config-editing-actions-false\"\n\t\t\t\t: \"\");\n\n\t\tclassName += (\n\t\t\tthis.props.config && this.props.config.enableParentClass\n\t\t\t\t? \" \" + this.props.config.enableParentClass\n\t\t\t\t: \"\");\n\n\t\treturn className;\n\t}\n\n\tisEditingAllowed() {\n\t\treturn this.props.config &&\n\t\t\t(typeof this.props.config.enableEditingActions === \"undefined\" ||\n\t\t\t\tthis.props.config.enableEditingActions === true);\n\t}\n\n\trender() {\n\t\tthis.logger.log(\"render\");\n\n\t\tconst tip = (<CommonCanvasTooltip canvasController={this.props.canvasController} />);\n\t\tconst palette = (<Palette canvasController={this.props.canvasController} containingDivId={this.containingDivId} />);\n\t\tconst centralItems = (<CommonCanvasCentralItems canvasController={this.props.canvasController} containingDivId={this.containingDivId} />);\n\n\t\tconst className = this.generateClass();\n\n\t\treturn (\n\t\t\t<Provider store={this.props.canvasController.getStore()}>\n\t\t\t\t<div className={className} onDragOver={this.onDragOver} onDrop={this.onDrop}>\n\t\t\t\t\t{palette}\n\t\t\t\t\t{centralItems}\n\t\t\t\t\t{tip}\n\t\t\t\t</div>\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};\n\nexport default injectIntl(CommonCanvas);\n"],"names":["_React$Component","_inherits","PaletteDialogTopbarThreeWayIcon","_super","_createSuper","props","_this","_classCallCheck","call","state","hover","iconClicked","bind","_assertThisInitialized","mouseEnter","mouseLeave","mouseDown","_createClass","key","value","this","iconClickedMethod","setState","mouseDownEvent","stopPropagation","icon","selectedIconName","isSelected","hoverIconName","deselectedIconName","React","createElement","draggable","className","src","onClick","onMouseEnter","onMouseLeave","onMouseDown","Component","PaletteDialogTopbar","doubleClick","close","gridViewSelected","listViewSelected","mouseDownMethod","doubleClickEvent","windowMaximizeMethod","closeEvent","canvasController","closePalette","showGridMethod","onDoubleClick","showGrid","PaletteDialogContentCategory","categorySelected","catSelEvent","categorySelectedMethod","style","selectedCategory","category","label","id","PaletteDialogContentCategories","catDivs","idx","categories","length","push","PaletteDialogContentGridNode","ghostData","onDragStart","onDragEnd","onMouseOver","closeTip","getGhostNode","nodeTemplate","ev","nodeTemplateDragStart","dataTransfer","setData","DND_DATA_TEXT","setDragImage","element","centerX","centerY","nodeTemplateDragEnd","createAutoNode","convertNodeTemplate","buttons","empty_text","app_data","ui_data","openTip","op","type","TIP_TYPE_PALETTE_ITEM","targetObj","currentTarget","_has","image","USE_DEFAULT_ICON","SUPERNODE_ICON","USE_DEFAULT_EXT_ICON","SUPERNODE_EXT_ICON","endsWith","SVG","alt","isEditingEnabled","txtClassName","node_types","Icon","CANVAS_CARBON_ICONS","WARNING_UNFILLED","PaletteDialogContentGrid","gridNodes","nodeTypes","width","PaletteContentListItem","showFullDescription","showShortDescription","onKeyPress","nodeTypeInfo","nodeType","e","code","keyCode","isDisplaySearchResult","getHighlightedText","occurrenceInfo","catLabelOccurrences","labelText","nodeLabelOccurrences","desc","description","nodeDescOccurrences","isLongDescription","_this$getAbbreviatedD","getAbbreviatedDescription","abbrDesc","occurrences","elements","less","intl","formatMessage","defaultMessage","defaultMessages","more","displayLen","substring","firstOccurrenceStart","start","remainder","offset","map","occ","end","textToHighlight","highlightedElements","index","text","forEach","i","itemText","_get","palette_image","isPaletteOpen","getHighlightedLabel","ranking","isShowRanking","mainDivClass","categoryLabel","getHighlightedCategoryLabel","getHighlightedDesc","nodeLabel","tabIndex","role","injectIntl","PaletteContentList","contentItems","nodeTypeInfos","itemKey","PaletteDialogContent","getUniqueCategories","getSelectedCategory","out","indexOf","target","firstChild","data","cats","paletteJSON","nt","content","ref","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","hoizontalSizingHover","savedWidth","savedLeft","savedHeight","savedTop","hoverZoneSize","totalHoverZoneSize","adjustedWidth","adjustedHeight","adjustedScrollBarWidth","isMaximized","paletteNodes","hackPaletteOffset","hackPaletteTopOffset","window","addEventListener","removeEventListener","canvasDiv","eventClientY","clientY","offsetTop","offsetHeight","eventClientX","clientX","offsetLeft","offsetWidth","refs","palette","classOrId","property","firstChar","charAt","remaining","elem","document","getElementById","getElementsByClassName","getComputedStyle","getPropertyValue","paletteDiv","horizontalSizingHover","cursor","newHeight","newContentHeight","getStyleProperty","contentDiv","childNodes","height","newWidth","scrollDiv","clientHeight","scrollHeight","oldHeight","setContentDivHeight","parentDivId","newLeft","newTop","left","top","styleDimension","parseInt","minWidth","minHeight","getAdjustedMousePositionLeft","getAdjustedMousePositionRight","getAdjustedMousePositionTop","getAdjustedMousePositionBottom","gridNodeWidth","Math","round","gridHeight","displayValue","showPalette","display","root","require$$0","isObject","now","Date","toNumber","require$$2","nativeMax","max","nativeMin","min","debounce_1","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","invokeFunc","time","args","thisArg","undefined","apply","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","setTimeout","timeWaiting","remainingWait","debounced","isInvoking","arguments","leadingEdge","clearTimeout","cancel","flush","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","minLen","_arrayLikeToArray","n","Object","prototype","toString","slice","constructor","name","from","test","_unsupportedIterableToArray","F","s","done","_e","f","err","normalCompletion","didErr","step","next","_e2","arr","len","arr2","getFilteredNodeTypeInfosByCategory","filterStrings","filteredNodeTypeInfos","_step","_iterator","getOccurrences","_getCategoryLabelInfo","catLabel","toLowerCase","_wordOccurrences","wordOccurrences","hitCounts","catLabelHitCounts","getCategoryLabelInfo","_getNodeLabelInfo","_wordOccurrences2","nodeLabelHitCounts","getNodeLabelInfo","_getNodeDescInfo","_wordOccurrences3","nodeDescHitCounts","getNodeDescInfo","descHitCounts","filterStringsLength","multiStringHits","calcRanking","mainString","newOccurrences","searchString","count","wordOccurrencesByString","addOccurrences","newOcc","handled","outOccurrences","concat","sort","occ1","occ2","joinOccurrences","PaletteFlyoutContentCategory","categoryClicked","TIP_TYPE_PALETTE_CATEGORY","substr","loading_text","titleLoadingObj","InlineLoading","onSuccess","status","successDelay","AccordionItem","title","titleObj","getTitleObj","getContent","open","is_open","itemImage","getItemImage","getItemText","getDisplayLabel","_this2","evt","closePaletteCategory","openPaletteCategory","getInlineLoadingRenderCategory","getRenderCategory","PaletteFlyoutContentSearch","searchOnClick","handleSearchStringChange","openPalette","placeHolder","Search","placeholder","onChange","size","PaletteFlyoutContentFilteredList","noResultsFound","adjustSearch","isNodeTypeInfosArrayTruncated","resultsRestricted","getNoResultsDiv","getContentListDiv","logger","Logger","PaletteFlyoutContent","setSearchString","setSearchStringThrottled","_debounce","contentDivs","Accordion","logStartTimer","split","filter","kw","_toConsumableArray","e1","e2","getFilteredNodeTypeInfos","logEndTimer","ss","getFilteredContentDivs","getContentDivs","contentCategories","contentSearch","PaletteFlyout","enableNarrowPalette","Palette","log","enablePaletteLayout","PALETTE_LAYOUT_FLYOUT","PALETTE_LAYOUT_MODAL","containingDivId","connect","ownProps","canvasconfig","enableEditingActions","isOpen","CommonCanvasTooltip","handleClick","direction","customContent","TIP_TYPE_NODE","getObjectModel","hasErrorMessage","node","ERROR","hasWarningMessage","WARNING","getPaletteNode","nodeTypeLabel","TIP_TYPE_PORT","_isEmpty","port","TIP_TYPE_DEC","decoration","tooltip","TIP_TYPE_LINK","TIP_TYPE_STATE_TAG","stateTagText","Tooltip","tip","mousePos","includes","CommonCanvasContextMenu","contextMenu","showContextMenu","ContextMenuWrapper","contextMenuDef","contextMenuActionHandler","contextMenuPos","closeContextMenu","contextmenu","menuDef","source","cmPos","x","y","baseFindIndex","baseIteratee","require$$1","toInteger","findLastIndex_1","array","predicate","fromIndex","CommonCanvasContextToolbar","toolbarActionHandler","colorClicked","setMouseInContextToolbar","closeContextToolbar","_ref","_this3","toolbarItems","overflowMenuItems","leftBar","item","getMenuItem","rightBar","menuItem","divider","subPanel","getSubPanel","subMenu","menu","getSubMenu","action","enable","getEnable","iconEnabled","buildColorPicker","_this4","_typeof","option","overflowItemCount","items","findIndex","_findLastIndex","trimmedItems","outItems","previousDivider","editParam","color","ColorPicker","clickActionHandler","objType","contextSource","targetObject","layout","contextToolbarPosition","is_expanded","contextToolbar","cmItem","toolbarItem","removeUnnecessaryDividers","toolbarConfig","getToolbarConfig","toolbarWidth","getContextToolbarWidth","pos","shouldCenterJustifyToolbar","Toolbar","config","instanceId","getInstanceId","tooltipDirection","CommonCanvasTextToolbar","getLabel","labelId","substituteObj","defaultToolbarMessages","shortcutSuffix","shortcutSuffix2","osKey","CanvasUtils","isMacintosh","shortCut","shortCut2","headerLabel","getJsxLabel","boldLabel","italicsLabel","strikethroughLabel","codeLabel","linkLabel","quoteLabel","numberedListLabel","bulletedListLabel","closeSubAreaOnClick","TextScale32","TextBold32","TextItalic32","TextStrikethrough32","Code32","Link32","TextIndentMore32","ListNumbered32","ListBulleted32","textToolbar","pos_x","pos_y","onBlur","blurHandler","getTextToolbar","actionHandler","texttoolbar","CommonCanvasStateTag","tipText","stateTagType","STATE_TAG_LOCKED","STATE_TAG_READ_ONLY","stateTag","getStateTag","Locked16","EditOff16","xhtml","svg","xlink","xml","xmlns","prefix","namespaces","hasOwnProperty","space","local","creatorInherit","ownerDocument","uri","namespaceURI","documentElement","createElementNS","creatorFixed","fullname","namespace","none","selector","querySelector","empty","querySelectorAll","matches","childMatcher","find","childFirst","firstElementChild","children","update","EnterNode","parent","datum","_next","_parent","__data__","bindIndex","group","enter","exit","groupLength","dataLength","bindKey","keyValue","nodeByKeyValue","Map","keyValues","has","set","get","delete","arraylike","ascending","a","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","onAdd","event","contextListener","dispatchEvent","params","CustomEvent","createEvent","initEvent","bubbles","cancelable","detail","dispatchConstant","dispatchFunction","child","join","splice","contains","Selection","groups","parents","_groups","_parents","selection","select","subgroups","subnode","subgroup","selectAll","arrayAll","selectorAll","selectChild","match","childFind","selectChildren","childrenFilter","matcher","enterGroup","updateGroup","previous","i0","i1","_enter","_exit","sparse","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","creator","insert","before","deep","t","typenames","parseTypenames","dispatch","nextId","Local","_","sourceEvent","ownerSVGElement","createSVGPoint","point","matrixTransform","getScreenCTM","inverse","getBoundingClientRect","rect","clientLeft","clientTop","pageX","pageY","events","touches","pointer","baseForOwn","castFunction","forOwn_1","object","iteratee","_basePropertyOf","escapeHtmlChar","reUnescapedHtml","reHasUnescapedHtml","RegExp","_escape","replace","noop","Error","Dispatch","c","types","T","copy","that","nonpassive","passive","nonpassivecapture","capture","nopropagation","stopImmediatePropagation","preventDefault","view","noevent","__noselect","MozUserSelect","yesdrag","noclick","DragEvent","subject","identifier","active","dx","dy","defineProperties","enumerable","configurable","defaultFilter","ctrlKey","button","defaultContainer","defaultSubject","d","defaultTouchable","navigator","maxTouchPoints","mousedownx","mousedowny","mousemoving","touchending","container","touchable","gestures","listeners","clickDistance2","drag","mousedowned","touchstarted","touchmoved","touchended","gesture","beforestart","mousemoved","mouseupped","nodrag","mouse","changedTouches","touch","p","p0","constant","clickDistance","sqrt","quadInOut","cubicInOut","polyIn","custom","pow","exponent","polyOut","polyInOut","pi","PI","halfPi","sinInOut","cos","tpmt","expInOut","circleInOut","b1","b2","b3","b4","b5","b6","b7","b8","b9","b0","bounceOut","overshoot","backIn","backOut","backInOut","tau","elasticIn","asin","sin","amplitude","period","elasticOut","elasticInOut","responseBlob","response","ok","statusText","blob","responseArrayBuffer","arrayBuffer","EOL","EOF","QUOTE","NEWLINE","RETURN","objectConverter","columns","Function","JSON","stringify","inferColumns","rows","columnSet","row","column","pad","formatDate","date","year","hours","getUTCHours","minutes","getUTCMinutes","seconds","getUTCSeconds","milliseconds","getUTCMilliseconds","isNaN","getUTCFullYear","getUTCMonth","getUTCDate","delimiter","reFormat","DELIMITER","charCodeAt","parseRows","N","I","eof","eol","token","preformatBody","formatValue","formatRow","parse","convert","customConverter","format","formatBody","formatRows","csvParse","dsv","tsvParse","responseText","input","init","fetch","then","dsvParse","csv","tsv","responseJson","json","parser","DOMParser","parseFromString","dsvFormat","Promise","resolve","reject","Image","onerror","onload","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","r","g","opacity","rgb_formatHex","hex","rgb_formatRgb","clampa","clampi","h","Hsl","hslConvert","clamph","clampt","hsl2rgb","m2","define","channels","assign","displayable","formatHex8","formatHsl","k","clamp","gamma","nogamma","exponential","linear","rgbGamma","colorRgb","reA","reB","am","bm","bs","bi","lastIndex","q","number","one","zero","svgNode","degrees","identity","translateX","translateY","rotate","skewX","scaleX","scaleY","atan2","atan","interpolateTransform","pxComma","pxParen","degParen","pop","xa","ya","xb","yb","translate","scale","interpolateTransformCss","DOMMatrix","WebKitCSSMatrix","isIdentity","decompose","interpolateTransformSvg","transform","baseVal","consolidate","matrix","cosh","exp","taskHead","taskTail","zoomRho","rho","rho2","rho4","zoom","p1","S","ux0","uy0","w0","ux1","uy1","w1","d2","d1","r0","r1","coshr0","u","sinh","duration","SQRT2","_1","_2","frame","timeout","interval","pokeDelay","clockLast","clockNow","clockSkew","clock","performance","setFrame","requestAnimationFrame","clearNow","Timer","_call","_time","timer","delay","restart","wake","timerFlush","t0","t2","t1","Infinity","sleep","nap","poke","clearInterval","setInterval","elapsed","stop","emptyOn","emptyTween","CREATED","SCHEDULED","STARTING","STARTED","RUNNING","ENDING","ENDED","timing","schedules","__transition","self","tween","schedule","tick","ease","tweenRemove","tween0","tween1","tweenFunction","tweenValue","transition","_id","interpolateNumber","interpolateRgb","interpolateString","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","every","onFunction","styleTween","styleNull","listener0","styleMaybeRemove","styleInterpolate","textTween","textInterpolate","removeFunction","easeConstant","easeVarying","interrupt","defaultTiming","easeCubicInOut","ZoomEvent","Transform","applyX","applyY","invert","location","invertX","invertY","rescaleX","domain","range","rescaleY","__zoom","defaultExtent","SVGElement","hasAttribute","viewBox","clientWidth","defaultTransform","defaultWheelDelta","deltaY","deltaMode","defaultConstrain","extent","translateExtent","dx0","dx1","dy0","dy1","touchstarting","touchfirst","constrain","wheelDelta","scaleExtent","interpolateZoom","touchDelay","wheelDelay","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","dragDisable","_len3","_key3","k1","shiftKey","_len4","_key4","started","touch0","touch1","_len5","_key5","l0","l1","dp","dl","_len6","_key6","hypot","collection","scaleBy","scaleTo","translateBy","translateTo","emit","addNodeExternalObject","foreignObjects","ReactDOM","render","nodeExternalObject","nodeData","addDecExternalObject","dec","jsx","removeExternalObject","obj","unmountComponentAtNode","SvgCanvasDisplay","isSubflow","pipelineId","breadcrumbs","isDisplayingCurrentPipeline","displayState","SvgCanvasNodes","canvasLayout","x_pos","y_pos","isExpandedSupernode","getMessageLabelClass","messages","lineTypeClass","labelSingleLine","justificationClass","labelAlign","iconPath","getMessageLevel","NODE_ERROR_ICON","NODE_WARNING_ICON","messageLevel","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","inputPortLeftPosX","inputPortLeftPosition","inputPortLeftPosY","outputPortRightPosX","outputPortRightPosition","outputPortRightPosY","xOffset","position","Number","yOffset","startsWith","nodeId","ports","subflow_node_ref","cx","supernodeSVGAreaPadding","cy","SvgCanvasUtilsComments","com","CLOCKWISE","ANTI_CLOCKWISE","ONE_EIGHTY_DEGREES_IN_RADIANS","SvgCanvasLinks","nodeUtils","commentUtils","srcComment","endPos","getOuterCoord","linkGap","getCommentCenterPosX","getCommentCenterPosY","originInfo","originX","originY","drawNodeLinkLineFromTo","isExpanded","_this$getCenterOffset","getCenterOffset","getNodeCenterPosX","getNodeCenterPosY","getNodeImageCenterPosX","getNodeImageCenterPosY","links","link","coordsUpdated","pathInfo","getConnectorPathInfo","drawingNewLinkMinInitialLine","minInitialLine","getMinInitialLine","abs","x1","x2","y1","y2","getStraightPath","NODE_LINK","linkType","LINK_TYPE_CURVE","LINK_TYPE_ELBOW","getPortLinkPath","ASSOCIATION_LINK","enableAssocLinkType","ASSOC_RIGHT_SIDE_CURVE","getAssociationCurvePath","COMMENT_LINK","minInitialLineForElbow","srcObj","srcPortId","trgNode","trgPortId","assocLinkVariation","LINK_TYPE_STRAIGHT","getNodeLinkCoordsForStraightLine","getNodeLinkCoordsForPorts","getAssociationCurveLinkCoords","getCommentLinkCoords","srcNode","srcCenterX","srcCenterY","trgCenterX","trgCenterY","srcOriginInfo","_this$getCenterOffset2","trgOriginInfo","_this$getCenterOffset3","startPos","parts","dir","NORTH","SOUTH","EAST","WEST","srcX","srcY","trgX","trgY","linkDirection","LINK_DIR_TOP_BOTTOM","outputPortBottomPosX","outputPortBottomPosY","inputPortTopPosX","inputPortTopPosY","LINK_DIR_BOTTOM_TOP","outputs","srcPort","inputs","trgPort","ASSOC_VAR_CURVE_RIGHT","ASSOC_VAR_CURVE_LEFT","ASSOC_VAR_DOUBLE_BACK_LEFT","drawCommentLinkLineTo","topSrc","topTrg","bottomSrc","bottomTrg","newData","rotateData90Degrees","getElbowPathInfo","getCurvePathInfo","rotateElements90Degrees","centerPoint","rotatePoint90Degrees","path","createPath","xDiff","wrapAroundNodePadding","corner1X","corner1Y","corner2X","corner2Y","x3","y3","yDiff","midY","calculateMidY","offsetForStraightLine","offsetForFirstCorner","corner4X","corner4Y","corner4aX","corner4aY","corner4bX","corner4bY","corner5X","corner5Y","corner6X","corner6Y","elbowYOffset","minFinalLine","elbowSize","elbowXOffset","extraSegments","corner2Ya","corner2Yb","maxBottom","srcBottomInc","trgBottomInc","minTop","wrapAroundSpacing","antiClockwise","newPoint1","newPoint2","newPoint","el","angle","getCurveLeftPath","getDoubleBackLeft","ASSOC_VAR_DOUBLE_BACK_RIGHT","getDoubleBackRight","getCurveRightPath","getCurveOutPath","getDoubleBack","calcCenterPoint","c1","c2","c3","c4","SvgCanvasDecs","decorations","nd","label_single_line","label_align","getDecClass","getDecPosX","getDecPosY","DEC_LINK","getLinkDecPosX","getNodeDecPosX","decoratorLeftX","decoratorCenterX","decoratorRightX","sourcePoint","targetPoint","distance","getDecWidth","getLinkDecPosY","getNodeDecPosY","decoratorTopY","decoratorMiddleY","decoratorBottomY","outline","linkDecoratorPadding","decoratorPadding","linkDecoratorWidth","decoratorWidth","linkDecoratorHeight","decoratorHeight","inClassName","class_name","getDecLabelEditIconPosX","getDecLabelEditIconPosY","getDecLabelWidth","linkDecoratorLabelWidth","decoratorLabelWidth","linkDecoratorLabelHeight","decoratorLabelHeight","getDecLabelHeight","unescapeHtmlChar","reEscapedHtml","reHasEscapedHtml","_unescape","inStart","inEnd","mdObj","findFirstSpace","findLastSpace","allWhiteSpace","findFirstNonSpace","findLastNonSpace","processHeaderCommand","processWrapCommand","processCodeCommand","processLinkCommand","processMultiLineCommand","processReturnCommand","spacePos","lastIndexOf","newLinePos","newStart","newEnd","findPrecedingNewLine","findSuceedingNewLine","startText","selectedText","endText","newText","tempText","hashCount","getHashCount","firstSpace","headerSyntax","getHeaderSyntax","chars","charsCount","processTripleBackTicks","isMultiLineMarkdown","removeMultiLineMarkdown","addMultiLineMarkdown","line","isMultiLineItem","getPrefixNumber","firstText","lines","newLine","removeListPrefix","getListPrefix","suffixText","preStart","sucEnd","originalStart","originalEnd","isCursorAtBeginningOfLine","insertMultiLineItem","newEndText","renumberEndText","char","startIndex","finished","renumberLine","d3","d3Selection","SvgCanvasTextArea","dispUtils","decUtils","activePipeline","displayCommentsCallback","displayLinksCallback","getCommentToolbarPosCallback","editingText","editingTextId","addingTextToTextArea","textAreaHeight","parentDomObj","editingTextData","singleLine","maxCharacters","allowReturnKey","textCanBeEmpty","keyboardInputCallback","enableMarkdownInComments","commentKeyboardHandler","autoSizeCallback","autoSizeComment","saveTextChangesCallback","saveCommentChanges","closeTextAreaCallback","closeCommentTextArea","displayTextArea","isDisplayingFullPage","openTextToolbar","markdownActionHandler","blurInTextToolbar","d3Event","getMarkdownAction","stopPropagationAndPreventDefault","relatedTarget","getParentElementWithClass","completeEditing","isCmndCtrlPressed","commentEntryElement","selectionStart","selectionEnd","SvgCanvasMarkdown","processMarkdownAction","addTextToTextArea","focus","execCommand","setSelectionRange","textArea","foreignObject","getComment","comment","editType","editSource","editActionHandler","closeTextToolbar","displayDiv","displayDivStyle","labelMaxCharacters","labelAllowReturnKey","getNodeLabelTextAreaPosX","getNodeLabelTextAreaPosY","getNodeLabelTextAreaWidth","getNodeLabelTextAreaHeight","getNodeLabelTextAreaClass","autoSizeMultiLineLabel","saveNodeLabelChanges","closeEntryTextArea","taData","label_max_characters","label_allow_return_key","getDecLabelTextAreaPosX","getDecLabelTextAreaPosY","getDecLabelTextAreaWidth","getDecLabelTextAreaHeight","getDecLabelTextAreaClass","objId","saveDecLabelChanges","decId","textContentSaved","saveAndCloseTextArea","textAreaEscKeyPressed","closeTextArea","textAreaAllowedKeys","newValue","SVGCanvasPipeline","canvasInfo","selectionInfo","initialize","selections","pipeline","getPipeline","comments","mappedNodes","getMappedArray","mappedComments","mappedLinks","preProcessPipeline","gap","getCanvasDimensions","getNode","nodeIds","nId","isSupernode","containsOnlyBindingNodes","isSuperBindingNode","commentId","commentIds","cId","linkId","linkIds","lId","getLink","oldLink","pipelines","setAllPortsDisconnected","srcNodeId","trgNodeId","setOutputPortConnected","srcNodePortId","setInputPortConnected","trgNodePortId","inp","isConnected","inPortId","portId","getDefaultInputPortId","outPortId","getDefaultOutputPortId","reduce","_this5","objs","getSelectedNodes","getSelectedObjectIds","_this6","_this7","getSelectedLinks","srcPos","trgPos","d3Drag","d3Ease","d3Fetch","d3Zoom","markdownIt","require","linkify","typographer","OUTPUT_TYPE","SVGCanvasRenderer","nodeLayout","supernodeInfo","superRenderers","SvgCanvasComments","linkUtils","svgCanvasTextArea","displayComments","displayLinks","getCommentToolbarPos","setDisplayState","getDisplayStateMsg","initializeZoomVariables","minScaleExtent","maxScaleExtent","commentSizing","commentSizingDirection","nodeSizing","nodeSizingDirection","nodeSizingObjectsInfo","nodeSizingDetLinksInfo","resizeObjInitialInfo","notSnappedXPos","notSnappedYPos","notSnappedWidth","notSnappedHeight","dragRunningX","dragRunningY","dragObjects","dragStartX","dragStartY","dragOverLink","dragOverDetachedLinks","dragPointerOffsetInNode","dragNewLinkOverNode","existingNodeInsertableIntoLink","existingNodeAttachableToDetachedLinks","spaceKeyPressed","zoomingAction","contextMenuClosedOnZoom","textEditingClosedOnZoom","regionSelect","zoomStartPoint","startX","startY","regionStartTransformX","regionStartTransformY","drawingNewLinkData","dragStart","dragMove","dragEnd","draggingLinkData","dragSelectionHandle","dragStartLinkHandle","dragMoveLinkHandle","dragEndLinkHandle","enableInteractionType","INTERACTION_TRACKPAD","zoomStart","zoomAction","zoomEnd","initializeGhostDiv","canvasSVG","createCanvasSVG","canvasDefs","canvasGrp","createCanvasGroup","canvasUnderlay","createCanvasUnderlay","commentsGrp","nodesLinksGrp","boundingRectsGrp","createBoundingRectanglesGrp","resetCanvasSVGBehaviors","displayCanvas","restoreZoom","isDisplayingSubFlowFullPage","alwaysDisplayBackToParentFlow","addBackToParentFlowArrow","getSavedZoom","zoomToFit","isDisplayingSubFlowInPlace","resetCanvasCursor","INTERACTION_CARBON","isSpaceKeyPressed","zoomTransform","zoomIdentity","cleanUpSuperRenderers","displayCommentsSelectionStatus","displayNodesSelectionStatus","displayLinksSelectionStatus","renderer","setSelectionInfo","newSuperRenderers","getSupernodes","supernode","ren","getRendererForSupernode","getDiscardedRenderersForSupernode","dr","displayBindingNodesToFitSVG","enableBoundingRectangles","displayBoundingRectangles","enablePositionNodeOnRightFlyoutOpen","isRightFlyoutOpen","posInfo","selNodeIds","getSelectedNodeIds","getZoomToReveal","zoomTo","displayNodes","displaySVGToFitSupernode","displayPortsForSubFlowFullPage","displayCanvasAccoutrements","enableCanvasUnderlay","isDisplayingPrimaryFlowFullPage","setCanvasUnderlaySize","setPortPositionsForNode","getParentSupernodeDatum","dims","getParentSupernodeSVGDimensions","background","setPortPositionsAllNodes","moveSuperBindingNodes","displayMovedNodes","displayMovedLinks","supernodeTopAreaHeight","transformedSVGRect","getTransformedViewportDimensions","supernodeDatum","svgWid","isSupernodeInputBinding","getSupernodePortXOffset","isSupernodeOutputBinding","topAreaHeight","svgHt","getSupernodePortYOffset","svgRect","getViewportDimensions","getTransformedRect","canv","getCanvasDimensionsAdjustedForScale","canvWithPadding","getZoomToFitPadding","grp","sr","isEditingText","superRen","isCollapsedSupernode","enableResizableNodes","nodeGrpSelector","getSelectorForId","linkGrpSelector","comId","nodeSel","getNodeGroupSelectionById","linkSel","getLinkGroupSelectionById","suffix","suffix2","getId","transPos","enableSnapToGridType","SNAP_TO_GRID_DURING","SNAP_TO_GRID_AFTER","snapToGridPosition","inResizeObj","resizeObj","snapToGrid","snapToGridXPx","snapToGridYPx","transformPos","getMousePos","svgSel","transPad","getGhostDivSel","ghostDivSel","ghostAreaWidth","ghostGrp","nodeImage","getNodeImage","nodeImageType","getImageType","setNodeImageContent","getNodeImagePosX","getNodeImagePosY","getNodeImageWidth","getNodeImageHeight","fObject","fObjectDiv","getNodeLabelClass","labelSpanWidth","nodeLabelWidth","labelDisplayLength","labelDiff","browserZoom","getBrowserZoom","devicePixelRatio","userAgent","outerWidth","innerWidth","isNodeTemplateInsertableIntoLink","setDataLinkSelectionAreaWider","getLinkAtMousePos","isLinkFullyAttached","setInsertNodeIntoLinkHighlighting","isNodeTemplateAttachableToDetachedLinks","convertPageCoordsToCanvasCoords","ghostArea","template","getAttachableLinksForNodeAtPos","setDetachedLinkHighlighting","unsetInsertNodeIntoLinkHighlighting","setNodeDragOverLinkHighlighting","unsetDetachedLinkHighlighting","nodeNearMouse","getNodeNearMousePos","nodeProximity","isConnectionAllowedToNearbyNode","setNewLinkOverNodeHighlighting","isDataConnectionAllowed","isAssocConnectionAllowed","srcObjId","isCommentLinkConnectionAllowed","getNewLinkOnDrag","transformMousePosForNode","createNodeFromTemplateOnLinkAt","createNodeFromTemplateAttachLinks","createNodeFromTemplateAt","dropData","createDroppedExternalObject","defaultNodeWidth","defaultNodeHeight","getMousePosSnapToGrid","enableInsertNodeDroppedOnLink","hasInputAndOutputPorts","isPortMaxCardinalityZero","isNode","isNodeDefaultPortsCardinalityAtMax","enableLinkSelection","LINK_SELECTION_DETACHABLE","nodeHasInputs","nodeHasOutputs","attachableLinks","isPosInArea","ghostAreaPadding","nodeOverSrcPos","nodeOverTrgPos","getDetachedLinksToUpdate","oldLinks","factor","newMaxExtent","newFactor","setMaxZoomExtent","_this8","parentObject","enableZoomIntoSubFlows","defs","createDropShadow","_this9","isEmptyOrBindingsOnly","drawNewLink","dragLinkHandle","CONTEXT_MENU_BUTTON","completeNewLink","completeDraggedLink","clickType","objectType","selectedObjectIds","openContextMenu","isDragActivated","canvasObj","_this10","displayPreviousPipeline","LEFT_ARROW_ICON","dropShadowFilter","feMerge","comDomObj","getCommentGroupSelectionById","displayCommentTextArea","setCommentEditingMode","labelEditable","nodeDomObj","displayNodeLabelTextArea","setNodeLabelEditingMode","label_editable","nodeDecDomObj","getNodeDecSelectionById","displayDecLabelTextArea","setLinkDecorationLabelEditingMode","linkDecDomObj","getLinkDecSelectionById","newZoom","enablePanIntoViewOnOpen","initialPanX","initialPanY","zoomCanvasInvokeZoomBehavior","newZoomTransform","animateTime","isFinite","padding","canvasDimensions","viewPortDimensions","xRatio","yRatio","newScale","zoomToFitPadding","isDisplayingSubFlow","newPadding","getMaxZoomToFitPaddingForConnections","supernodeBindingPortRadius","zoomObject","z","getZoomTransform","objectIDs","getNodes","getComments","getLinks","convertCanvasDimensionsAdjustedForScaleWithPadding","xPosInt","yPosInt","right","bottom","viewportDimensions","_this11","isContextMenuDisplayed","shouldDoRegionSelect","addingCursorOverlay","addTempCursorOverlay","getTransformedMousePos","previousD3Event","zoomCanvasDimensions","commentHighlightGap","drawRegionSelector","zoomCanvasBackground","zoomCommentToolbar","stopDrawingNewLink","stopDraggingLink","zoomChanged","zoomEndRegionSelect","zoomSave","zoomClick","removeTempCursorOverlay","INTERACTION_MOUSE","incTransform","getTransformIncrement","zoomConstrainRegular","clearSelections","removeRegionSelector","_this$getRegionDimens","getRegionDimensions","region","selectInRegion","LINK_SELECTION_NONE","enableLinkType","setSelections","getEditingTextId","moveTextToolbar","unTransformPos","commentToolbarPosX","commentToolbarPosY","xInc","yInc","newTransform","viewPort","rightOffsetLimit","leftOffsetLimit","bottomOffsetLimit","topOffsetLimit","_this$getRegionDimens2","selectedObjects","getSelectedNodesAndComments","enableDragWithoutSelect","closeContextMenuIfOpen","enableContextToolbar","removeContextToolbar","initializeResizeVariables","dragObjectsStart","resizeComment","resizeNode","dragObjectsAction","endCommentSizing","endNodeSizing","dragObjectsEnd","_this12","getDragObjects","isExistingNodeInsertableIntoLink","startNodeInsertingInLink","setNodeTranslucentState","isExistingNodeAttachableToDetachedLinks","startNodeAttachingToDetachedLinks","increment","stgPos","snapToGridDraggedNode","displayMovedComments","selectObjectSourceEvent","dragFinalOffset","offsetX","offsetY","detachedLinks","getSelectedDetachedLinks","unsetNodeTranslucentState","draggingLinkHandle","handleSelection","_cloneDeep","lineInfo","linkGrpSelection","endBeingDragged","enableHighlightUnavailableNodes","lnk","setUnavailableTargetNodesHighlighting","setUnavailableSourceNodesHighlighting","objPosX","objPosY","objPos","getFlags","sel","getAllNodeGroupsSelection","displayNodesSubset","_this13","nodeGroupSel","nodeGrps","updatePortRadiusAndPos","updatePortArrowPath","_this14","_this15","createNodes","removeNodes","getNodeGroupClass","getNodeGrpStyle","joinedNodeGrps","updateNodes","_this16","newNodeGroups","attachNodeGroupListeners","shouldDisplayNodeSizingArea","attachNodeSizingListeners","nodeShapeDisplay","imageDisplay","getNodeImageClass","labelDisplay","attachNodeLabelListeners","attachNodeLabelSpanListeners","_this17","getNodeShapePathSizing","getNodeSelectionOutline","getNodeSelectionOutlineStyle","getNodeShapePath","getNodeBodyStyle","getNodeImageStyle","getNodeLabelStyle","getNodeEllipsisTranslate","getNodeExpansionIconTranslate","grps","nodeGrp","displayPorts","displaySupernodeContents","addErrorMarker","getCombinedDecorations","displayDecorations","DEC_NODE","removeSel","supernodeD3Object","setCanvasInfoRenderer","createSupernodeRenderer","hideCanvas","displayInputPorts","displayOutputPorts","_this18","inSelector","getNodeInputPortClassName","inputPortDisplay","createInputPorts","joinedInputPortGrps","updateInputPorts","inputPortGroups","attachInputPortListeners","inputPortObject","enableAssocLinkCreation","_this19","inputPorts","PORT_OBJECT_IMAGE","inputPortImage","inputPortWidth","inputPortHeight","getPortRadius","getPortArrowPath","getPortArrowPathTransform","_this20","outSelector","getNodeOutputPortClassName","outputPortDisplay","enableSingleOutputPortDisplay","createOutputPorts","joinedOutputPortGrps","updateOutputPorts","outputPortGroups","attachOutputPortListeners","outputPortObject","joinedOutputPortGroups","_this21","outputPorts","outputPortImage","outputPortWidth","outputPortHeight","_this22","raiseNodeToTop","setNodeStyles","addContextToolbar","addDynamicNodeIcons","canOpenTip","removeDynamicNodeIcons","selectObjectD3Event","_this23","isNodeResizable","nodeSizingCursor","isRegionSelectOrSizingInProgress","cursorType","isPointerCloseToBodyEdge","getSizingDirection","nodeCornerResizeArea","getCursorBasedOnDirection","nodeLabels","_this24","labelSel","enableDisplayFullLabelOnHover","spanSel","getNodeLabelHoverHeight","nodeLabelSpans","_this25","displayNodeLabelEditIcon","hideEditIconPending","hideEditIcon","_this26","portType","portObject","portImage","portWidth","portHeight","portRadius","guideObject","inputPortGuideObject","guideImage","inputPortGuideImage","linkArray","_this27","isSrcCardinalityAtMax","outputPortGuideObject","outputPortGuideImage","isTrgNodeAvailable","isSrcNodeAvailable","_this28","nodeObj","parentElement","nodeGrpSel","getNodeLabelEditIconTranslate","displayEditIcon","_this29","decObj","decGrpSel","getDecLabelEditIconTranslate","grpSel","editIconGrpSel","mouseOverLabelEditIcon","EDIT_ICON","EDIT_ICON_X_OFFSET","EDIT_ICON_Y_OFFSET","selectObject","recreateContextToolbar","d3EventType","isShiftKeyPressed","objectTypeName","getObjectTypeName","ellipsisClicked","trgGrp","decs","_this30","decGrpClassName","decGrpSelector","createDecorations","getDecTransform","hotspot","callDecoratorCallback","updateDecoration","_this31","attachDecGroupListeners","decSel","updateDecOutlines","updateDecPaths","updateDecImages","updateDecLabels","updateDecJsxObjs","outlnSel","getDecHeight","pathSel","_this32","imageSel","getDecPadding","setImageContent","attachDecLabelListeners","attachDecLabelSpanListeners","getDecLabelClass","extSel","decLabels","_this33","decLabelSpans","_this34","displayDecLabelEditIcon","decGrps","_this35","_this36","errorMarkerSelection","getErrorMarkerClass","getErrorMarkerIcon","getNodeErrorWidth","getNodeErrorHeight","getNodeErrorPosX","getNodeErrorPosY","imageObj","enableImageDisplay","loadSVGToDefs","cache","_this37","symbolId","replaceAll","symbolSelector","setNodeBodyStyles","setNodeSelectionOutlineStyles","setNodeImageStyles","setNodeLabelStyles","getObjectStyle","dropShadow","style_temp","subdueStyle","doesExpandedSupernodeHaveStyledNodes","_this38","expandedSupernodeHaveStyledNodes","subflow_ref","pipeline_id_ref","paddingForInputBinding","getMaxPaddingForConnectionsFromInputBindingNodes","paddingForOutputBinding","getMaxPaddingForConnectionsToOutputBindingNodes","_this39","maxPadding","nodePadding","getNodePaddingToTargetNodes","_this40","outputBindingNodes","getBindingPortRadius","addEllipsisIcon","addSuperNodeFullPageIcon","setMouseInObject","getContextToolbarPos","_this41","_this42","ellipsisGrp","ellipsisDisplay","rect2","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","getElementWithClassAtMousePos","contextMenuHandler","addBreadcrumbs","SUPER_NODE","decorationActionHandler","drawNewCommentLinkForPorts","drawNewNodeLinkForPorts","enableHighlightNodeOnNewLinkDrag","setNewLinkOverNode","_this46","getNewStraightNodeLinkStartPos","getNewLinkAssocVariation","connectionLineSel","connectionStartSel","connectionGuideSel","isPointInNodeBoundary","removeNewLinkLine","PORT_OBJECT_CIRCLE","getLinkImageTransform","adjacent","opposite","_this47","getNewStraightCommentLinkStartPos","commentPortRadius","commentLinkArrowHead","connectionArrowHeadSel","getArrowHead","getArrowHeadTransform","unsetUnavailableNodesHighlighting","getNodeAtMousePos","completeNewLinkOnNode","completeNewDetachedLink","removeNewLink","setNewLinkOverNodeCancel","getInputNodePortId","targetNodes","enableLinkReplaceOnNewConnection","isDataLinkReplacementAllowed","linksToTrgPort","getDataLinksConnectedTo","replaceLink","endPoint","stopDrawingNewLinkForPorts","_this48","saveX1","saveY1","saveX2","saveY2","saveNewLinkData","newPath","easeElastic","newLink","getNodePortIdNearMousePos","getOutputNodePortId","canExecuteUpdateLinkCommand","linkSrcChanged","hasLinkSrcChanged","linkTrgChanged","hasLinkTrgChanged","executeCommand","isSrcConnectionAllowedWithDetachedLinks","isTrgConnectionAllowedWithDetachedLinks","isConnectionAllowedWithDetachedLinks","linkUpdated","getElementWithClassAtPosition","getNodeLinkForElement","foundLink","nodeGrpElement","getNodeForElement","inputPortId","getInputNodePortIdAtMousePos","portElement","getNodePortIdForElement","outputPortId","getOutputNodePortIdAtMousePos","posY","elementsFromPoint","foundElement","nodeName","_this49","prox","defaultPortId","portObjs","searchForPortNearMouse","portObjectType","nodeWidthOffset","portGrps","portSel","xx","yy","wd","ht","getRectangleNodeShapePath","nodeSizingArea","selectionPath","nodeShape","getPortArcsNodeShapePath","nodeHighlightGap","bodyPath","highlightGap","getPortArcsNodeShapePathVertical","inputPortsWidth","outputPortsWidth","getPortArcsNodeShapePathLeftRight","portArcOffset","outputPortsHeight","portArcRadius","portArcSpacing","endPoint2","inputPortsHeight","topPorts","topPortsWidth","bottomPorts","bottomPortsWidth","_this50","setPortPositionsVertical","getOutputPortBottomPosY","inputPortBottomPosX","getInputPortBottomPosY","outputPortTopPosX","outputPortTopPosY","setPortPositionsLeftRight","getNodeOutputPortRightPosX","getNodeOutputPortRightPosY","inputPortBottomPosY","portsWidth","xPosition","remainingSpace","multiplier","portsHeight","displaySinglePort","setPortPositionsLeftRightSinglePort","setPortPositionsLeftRightAllPorts","yPosition","heightSvgArea","getAllCommentGroupsSelection","displayCommentsSubset","_this51","_this52","_this53","hideComments","createComments","getCommentGroupClass","joinedCommentGrps","updateComments","_this54","newCommentGroups","attachCommentGroupListeners","attachCommentSizingListeners","_this55","commentSizingArea","getCommentBodyStyle","commentGrps","_this56","setCommentStyles","createCommentPort","deleteCommentPort","_this57","commentSizingCursor","commentCornerResizeArea","commentObj","_this58","cd","comGrp","setCommentSelectionOutlineStyles","setCommentBodyStyles","setCommentTextStyles","getCommentSelectionOutlineStyle","getCommentTextStyle","cursorStyle","rightEdge","bottomEdge","rightEdgeState","bottomEdgeState","cornerResizeArea","xPart","yPart","minHt","supernodeMinHeight","supernodeMinWidth","oldSupernode","getMinHeight","getMinWidth","delta","resizeObject","enableMoveNodesOnSupernodeResize","objectsInfo","moveSurroundingObjects","getNodesAndComments","linksInfo","moveSurroundingDetachedLinks","displaySingleNode","displaySingleComment","incrementX","incrementY","incrementWidth","incrementHeight","snapToGridObject","restrictNodeSizingToMinimums","isResized","resizeWidth","resizeHeight","detachedLinksInfo","commentSizingObjectsInfo","linksArray","buildLinksArray","getAllLinkGroupsSelection","displayLinksSubset","_this59","_this60","displaySingleLink","_this61","createLinks","getLinkGroupClass","getLinkGrpStyle","joinedLinkGrps","updateLinks","_this62","newLinkGrps","attachLinkGroupListeners","getLinkSelectionAreaClass","dataLinkArrowHead","LINK_SELECTION_HANDLES","linkGrps","createNewHandles","lineArray","_this63","linkGrp","updateHandles","setDisplayOrder","_this64","raiseLinkToTop","setLinkLineStyles","lowerLinkToBottom","handlesGrp","_this65","startHandle","linkStartHandleObject","endHandle","linkEndHandleObject","_this66","linkHandles","linkStartHandleImage","linkStartHandleWidth","linkStartHandleHeight","linkStartHandleRadius","linkEndHandleImage","linkEndHandleWidth","linkEndHandleHeight","linkEndHandleRadius","linkObj","getLinkTypeClass","getLinkCustomClass","customClass","supernodeClass","draggableClass","linkGroup","_this67","hasOneDecorationOrMore","raiseSelectedLinksToTop","getSelectedLinksCount","_this68","updateLinksForNodes","isLinkBeingDragged","getAttachedLineObj","getDetachedLineObj","addMinInitialLineForElbow","addConnectionPaths","error","shouldDisplayLink","getSourcePortId","getTargetPortId","getAssocLinkVariation","coords","getLinkCoords","getOutputPort","getInputPort","displayLinkOnOverlap","areLinkedObjectsOverlapping","srcHighlightGap","trgHighlightGap","srcLeft","srcRight","trgLeft","trgRight","srcTop","srcBottom","trgTop","trgBottom","_this69","nodeLinks","getNodeOutputLinks","sortedNodeLinks","sortNodeOutputLinks","applyMinInitialLine","outArray","_this70","nodeLineData1","nodeLineData2","first","second","LINK_DIR_LEFT_RIGHT","runningInitialLine","lineData","minInitialLineIncrement","_this71","updateLinksForNode","_this72","getDirAdjusted","endNode","getDirToEndPos","sortLinksInfo","updateLinksInfo","startNode","getDirToNode","endX","endY","getDir","linksDirArrayIn","_this73","linksDirArray","getLinkInfoGroups","_forOwn","li","getAngleBasedOnLinkDirection","tipType","isTipEnabled","addCommentOffsetX","addCommentOffsetY","str","SVGCanvasD3","canvasInfoId","canvasDivSelector","getCurrentBreadcrumb","ConfigUtils","compareCanvasConfigsOmitFields","cloneCanvasInfo","cloneConfig","clearCanvas","currentBreadcrumb","supernodeId","supernodeParentPipelineId","isDragging","positon","nodeTemplateDragOver","nodeTemplateDropped","externalObjectDropped","zoomIn","zoomOut","isZoomedToMax","isZoomedToMin","objectIds","getZoom","setNodeDecorationLabelEditingMode","refreshOnSizeChange","getDefaultCommentOffset","setSpaceKeyPressed","CanvasContents","isDropZoneDisplayed","mainCanvasDivId","svgCanvasDivId","svgCanvasDivSelector","dragX","dragY","eventListenersAdded","drop","focusOnCanvas","setIsDropZoneDisplayed","dragOver","dragEnter","dragLeave","onCut","onCopy","onPaste","onKeyDown","onKeyUp","onMouseMove","afterUpdateCallbacks","setCanvasContents","svgCanvasD3","setCanvasInfo","canvasConfig","enableBrowserEditMenu","addEventListeners","prevProps","afterUpdate","removeEventListeners","activeElement","cutToClipboard","copyToClipboard","pasteFromClipboard","actions","getKeyboardConfig","undo","keyboardActionHandler","redo","convertPageCoordsToSnappedCanvasCoords","altKey","switchLoggingState","objectModel","getNodeLayout","getCanvasLayout","getData","warn","enableStateTag","emptyCanvas","isPrimaryPipelineEmpty","emptyCanvasContent","FlowData16","dropZoneCanvas","dropZoneCanvasContent","enableDropZoneOnExternalDrag","cb","getDragNodeTemplate","getDNDJson","operation","isDataTypeBeingDraggedFile","getEmptyCanvas","getContextMenu","getDropZone","svgCanvasDiv","getSVGCanvasDiv","mainClassName","enableRightFlyoutUnderToolbar","dropDivClassName","enableToolbarLayout","bottomPanelIsOpen","ReactResizeDetector","handleWidth","handleHeight","onResize","onDrop","onDragOver","onDragEnter","onDragLeave","canvasinfo","bottompanel","selectioninfo","CommonCanvasToolbar","leftBarItems","getDefaultRightBar","maxMessageType","getNotificationMessagesMaxType","NOTIFICATION_ICON_CLASS","SUCCESS","INFO","copyConfig","getConvertedLegacyToolbar","getDefaultToolbar","optionallyAddPaletteTool","optionallyAddNotificationTool","overrideAutoEnableDisable","paletteLabel","newLeftBar","isPaletteEnabled","notificationConfig","notificationCount","notificationMessages","notificationTools","TOOLBAR_TOGGLE_NOTIFICATION_PANEL","isNotificationOpen","getNotificationClassName","enableInternalObjectModel","editingAllowed","applyToolState","canUndo","canRedo","canCutCopy","canPaste","canDelete","canZoomIn","canZoomOut","canZoomToFit","undoLabel","redoLabel","undoTool","findTool","undo_command","redoTool","redo_command","tool","generateToolbarConfig","configureToolbarButtonsState","addUndoRedoCommandLabels","canvasToolbar","TOOLBAR_LAYOUT_TOP","additionalText","overflowMenuLabel","canvastoolbar","PALETTE_LAYOUT_NONE","notificationpanel","notifications","getUndoLabel","getRedoLabel","CommonCanvasRightFlyout","rightFlyout","rfClass","rightflyout","CanvasBottomPanel","onMouseUp","onMouseMoveY","diff","panelHeight","setBottomPanelHeight","limitHeight","canvasContainer","maxHeight","bottomPanel","heightPx","bottomPanelContent","CanvasTopPanel","topPanel","toolbarIsOpen","topPanelIsOpen","topPanelContent","toppanel","NotificationPanel","handleNotificationPanelClickOutside","closeNotificationPanel","iconType","subtitle","closeMessage","deleteNotification","timestamp","notificationCallback","keepOpen","notificationIcon","notificationHeader","messageCallback","deleteNotificationMessages","clearNotificationMessages","clearAllCallback","notificationPanelClassName","DEFAULT_NOTIFICATION_HEADER","notificationSubtitle","notificationPanelMessages","getNotifications","emptyMessage","clearAll","clearAllMessage","Button","kind","disabled","secondaryButton","secondaryButtonLabel","secondaryButtonCallback","secondaryButtonDisabled","renderIcon","Close16","hasIconOnly","iconDescription","tooltipAlignment","tooltipPosition","CommonCanvasCentralItems","notificationPanel","canvasContents","CommonCanvas","initializeController","setIntl","setCanvasConfig","setContextMenuConfig","contextMenuConfig","setKeyboardConfig","keyboardConfig","setToolbarConfig","setNotificationPanelConfig","setRightFlyoutConfig","rightFlyoutContent","showRightFlyout","setBottomPanelConfig","showBottomPanel","setTopPanelConfig","showTopPanel","setHandlers","beforeEditActionHandler","tipHandler","layoutHandler","idGeneratorHandler","selectionChangeHandler","actionLabelHandler","isEditingAllowed","enableParentClass","centralItems","generateClass","Provider","store","getStore"],"mappings":"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"}