@elyra/canvas 12.23.1 → 12.24.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 (195) hide show
  1. package/dist/canvas-constants-07dbe4b7.js +2 -0
  2. package/dist/{canvas-constants-ab55d0fd.js.map → canvas-constants-07dbe4b7.js.map} +1 -1
  3. package/dist/canvas-constants-ba465147.js +2 -0
  4. package/dist/canvas-constants-ba465147.js.map +1 -0
  5. package/dist/canvas-controller-60ed1f25.js +2 -0
  6. package/dist/canvas-controller-60ed1f25.js.map +1 -0
  7. package/dist/canvas-controller-6239cacc.js +2 -0
  8. package/dist/canvas-controller-6239cacc.js.map +1 -0
  9. package/dist/{canvas-logger-fa8cef5b.js → canvas-logger-27d3180d.js} +2 -2
  10. package/dist/{canvas-logger-fa8cef5b.js.map → canvas-logger-27d3180d.js.map} +1 -1
  11. package/dist/{canvas-logger-3459dfc2.js → canvas-logger-bb537fb3.js} +2 -2
  12. package/dist/{canvas-logger-3459dfc2.js.map → canvas-logger-bb537fb3.js.map} +1 -1
  13. package/dist/common-canvas-4ae99af6.js +2 -0
  14. package/dist/common-canvas-4ae99af6.js.map +1 -0
  15. package/dist/common-canvas-86633e44.js +2 -0
  16. package/dist/common-canvas-86633e44.js.map +1 -0
  17. package/dist/common-canvas.es.js +1 -1
  18. package/dist/common-canvas.js +1 -1
  19. package/dist/common-properties-2bc0b14a.js +2 -0
  20. package/dist/common-properties-2bc0b14a.js.map +1 -0
  21. package/dist/common-properties-56bf68a6.js +2 -0
  22. package/dist/common-properties-56bf68a6.js.map +1 -0
  23. package/dist/createClass-826941b3.js +2 -0
  24. package/dist/createClass-826941b3.js.map +1 -0
  25. package/dist/createClass-be661622.js +2 -0
  26. package/dist/createClass-be661622.js.map +1 -0
  27. package/dist/{datarecord-metadata-v3-schema-03db5d5d.js → datarecord-metadata-v3-schema-3323a91e.js} +2 -2
  28. package/dist/{datarecord-metadata-v3-schema-03db5d5d.js.map → datarecord-metadata-v3-schema-3323a91e.js.map} +1 -1
  29. package/dist/{datarecord-metadata-v3-schema-07d7682c.js → datarecord-metadata-v3-schema-93ec5562.js} +2 -2
  30. package/dist/{datarecord-metadata-v3-schema-07d7682c.js.map → datarecord-metadata-v3-schema-93ec5562.js.map} +1 -1
  31. package/dist/en-7201b548.js +2 -0
  32. package/dist/{en-8647c347.js.map → en-7201b548.js.map} +1 -1
  33. package/dist/en-a08356c8.js +2 -0
  34. package/dist/{en-7a0f1db1.js.map → en-a08356c8.js.map} +1 -1
  35. package/dist/extends-11efb86b.js +7 -0
  36. package/dist/extends-11efb86b.js.map +1 -0
  37. package/dist/extends-bb395e42.js +7 -0
  38. package/dist/extends-bb395e42.js.map +1 -0
  39. package/dist/flexible-table-989859ec.js +2 -0
  40. package/dist/flexible-table-989859ec.js.map +1 -0
  41. package/dist/flexible-table-d51a7d72.js +2 -0
  42. package/dist/flexible-table-d51a7d72.js.map +1 -0
  43. package/dist/getPrototypeOf-1e698126.js +2 -0
  44. package/dist/getPrototypeOf-1e698126.js.map +1 -0
  45. package/dist/getPrototypeOf-3751add9.js +2 -0
  46. package/dist/getPrototypeOf-3751add9.js.map +1 -0
  47. package/dist/icon-037ad6d1.js +2 -0
  48. package/dist/{icon-816af0e7.js.map → icon-037ad6d1.js.map} +1 -1
  49. package/dist/icon-b619470c.js +2 -0
  50. package/dist/{icon-2c16236a.js.map → icon-b619470c.js.map} +1 -1
  51. package/dist/{index-2f6be19d.js → index-46a80c08.js} +2 -2
  52. package/dist/{index-2f6be19d.js.map → index-46a80c08.js.map} +1 -1
  53. package/dist/index-b527a82d.js +2 -0
  54. package/dist/{index-6f739fa1.js.map → index-b527a82d.js.map} +1 -1
  55. package/dist/isArrayLikeObject-a9c7973b.js +1 -1
  56. package/dist/isArrayLikeObject-a9c7973b.js.map +1 -1
  57. package/dist/isArrayLikeObject-f3b27f64.js +1 -1
  58. package/dist/isArrayLikeObject-f3b27f64.js.map +1 -1
  59. package/dist/lib/canvas-controller.es.js +1 -1
  60. package/dist/lib/canvas-controller.js +1 -1
  61. package/dist/lib/canvas.es.js +1 -1
  62. package/dist/lib/canvas.js +1 -1
  63. package/dist/lib/command-stack.es.js +1 -1
  64. package/dist/lib/command-stack.js +1 -1
  65. package/dist/lib/context-menu.es.js +1 -1
  66. package/dist/lib/context-menu.js +1 -1
  67. package/dist/lib/properties/field-picker.es.js +1 -1
  68. package/dist/lib/properties/field-picker.js +1 -1
  69. package/dist/lib/properties/flexible-table.es.js +1 -1
  70. package/dist/lib/properties/flexible-table.js +1 -1
  71. package/dist/lib/properties.es.js +1 -1
  72. package/dist/lib/properties.js +1 -1
  73. package/dist/lib/tooltip.es.js +1 -1
  74. package/dist/lib/tooltip.js +1 -1
  75. package/dist/styles/common-canvas.min.css +1 -1
  76. package/dist/styles/common-canvas.min.css.map +1 -1
  77. package/dist/toolbar-3f93ec4b.js +2 -0
  78. package/dist/toolbar-3f93ec4b.js.map +1 -0
  79. package/dist/toolbar-e4c551ae.js +2 -0
  80. package/dist/toolbar-e4c551ae.js.map +1 -0
  81. package/locales/command-actions/locales/en.json +1 -1
  82. package/locales/command-actions/locales/eo.json +41 -41
  83. package/locales/common-canvas/locales/en.json +1 -0
  84. package/locales/common-canvas/locales/eo.json +1 -0
  85. package/locales/common-properties/locales/de.json +10 -1
  86. package/locales/common-properties/locales/en.json +4 -1
  87. package/locales/common-properties/locales/eo.json +23 -18
  88. package/locales/common-properties/locales/es.json +10 -1
  89. package/locales/common-properties/locales/fr.json +10 -1
  90. package/locales/common-properties/locales/it.json +10 -1
  91. package/locales/common-properties/locales/ja.json +10 -1
  92. package/locales/common-properties/locales/ko.json +10 -1
  93. package/locales/common-properties/locales/pt-br.json +10 -1
  94. package/locales/common-properties/locales/sv.json +10 -1
  95. package/locales/common-properties/locales/zh-CN.json +10 -1
  96. package/locales/common-properties/locales/zh-TW.json +10 -1
  97. package/package.json +1 -1
  98. package/src/common-canvas/canvas-controller.js +38 -4
  99. package/src/common-canvas/svg-canvas-d3.js +12 -0
  100. package/src/common-canvas/svg-canvas-renderer.js +244 -66
  101. package/src/common-canvas/svg-canvas-utils-links.js +37 -7
  102. package/src/common-canvas/svg-canvas-utils-markdown.js +0 -2
  103. package/src/common-canvas/svg-canvas-utils-textarea.js +56 -43
  104. package/src/common-properties/components/editor-form/editor-form.jsx +19 -5
  105. package/src/common-properties/components/editor-form/editor-form.scss +30 -3
  106. package/src/common-properties/components/field-picker/field-picker.jsx +18 -59
  107. package/src/common-properties/components/field-picker/field-picker.scss +15 -24
  108. package/src/common-properties/components/flexible-table/flexible-table.jsx +32 -16
  109. package/src/common-properties/components/flexible-table/flexible-table.scss +6 -12
  110. package/src/common-properties/components/properties-modal/properties-modal.jsx +3 -1
  111. package/src/common-properties/components/properties-modal/properties-modal.scss +1 -0
  112. package/src/common-properties/components/table-buttons/table-buttons.jsx +1 -0
  113. package/src/common-properties/components/table-buttons/table-buttons.scss +4 -26
  114. package/src/common-properties/components/virtualized-table/virtualized-table.jsx +6 -5
  115. package/src/common-properties/constants/constants.js +11 -2
  116. package/src/common-properties/controls/abstract-table.jsx +12 -4
  117. package/src/common-properties/controls/datefield/datefield.jsx +1 -1
  118. package/src/common-properties/controls/dropdown/dropdown.jsx +3 -3
  119. package/src/common-properties/controls/expression/expression-builder/expression-select-field-function.jsx +11 -2
  120. package/src/common-properties/controls/expression/expression-toggle/expression-toggle.jsx +5 -6
  121. package/src/common-properties/controls/expression/expression.jsx +3 -1
  122. package/src/common-properties/controls/expression/expression.scss +1 -2
  123. package/src/common-properties/controls/list/list.jsx +1 -1
  124. package/src/common-properties/controls/multiselect/multiselect.jsx +2 -2
  125. package/src/common-properties/controls/numberfield/numberfield.jsx +30 -6
  126. package/src/common-properties/controls/passwordfield/passwordfield.jsx +13 -2
  127. package/src/common-properties/controls/radioset/radioset.scss +1 -5
  128. package/src/common-properties/controls/selectcolumns/selectcolumns.jsx +1 -1
  129. package/src/common-properties/controls/someofselect/someofselect.jsx +1 -1
  130. package/src/common-properties/controls/textarea/textarea.jsx +2 -2
  131. package/src/common-properties/controls/textfield/textfield.jsx +1 -1
  132. package/src/common-properties/controls/timefield/timefield.jsx +1 -1
  133. package/src/common-properties/form/ControlInfo.js +3 -1
  134. package/src/common-properties/form/EditorForm.js +11 -11
  135. package/src/common-properties/index.scss +2 -4
  136. package/src/common-properties/panels/control/control.jsx +1 -0
  137. package/src/common-properties/panels/control/control.scss +12 -0
  138. package/src/common-properties/panels/sub-panel/invoker.jsx +2 -0
  139. package/src/common-properties/panels/sub-panel/sub-panel.scss +6 -0
  140. package/src/common-properties/panels/subtabs/subtabs.jsx +13 -3
  141. package/src/common-properties/panels/subtabs/subtabs.scss +62 -0
  142. package/src/common-properties/panels/tearsheet/tearsheet.jsx +64 -7
  143. package/src/common-properties/panels/tearsheet/tearsheet.scss +84 -18
  144. package/src/common-properties/properties-controller.js +4 -0
  145. package/src/common-properties/properties-main/properties-main.jsx +17 -1
  146. package/src/object-model/api-pipeline.js +1 -6
  147. package/src/object-model/canvas-in-handler.js +6 -3
  148. package/src/object-model/layout-dimensions.js +12 -0
  149. package/src/object-model/object-model.js +7 -39
  150. package/src/object-model/redux/canvas-store.js +55 -0
  151. package/src/toolbar/toolbar-action-item.jsx +3 -1
  152. package/src/toolbar/toolbar-overflow-item.jsx +3 -1
  153. package/src/toolbar/toolbar.jsx +6 -2
  154. package/src/toolbar/toolbar.scss +21 -0
  155. package/stats.html +1 -1
  156. package/dist/canvas-constants-09ffa4d4.js +0 -2
  157. package/dist/canvas-constants-09ffa4d4.js.map +0 -1
  158. package/dist/canvas-constants-ab55d0fd.js +0 -2
  159. package/dist/canvas-controller-3a399ae6.js +0 -2
  160. package/dist/canvas-controller-3a399ae6.js.map +0 -1
  161. package/dist/canvas-controller-c046093c.js +0 -2
  162. package/dist/canvas-controller-c046093c.js.map +0 -1
  163. package/dist/common-canvas-088c1a4b.js +0 -2
  164. package/dist/common-canvas-088c1a4b.js.map +0 -1
  165. package/dist/common-canvas-7676cc1b.js +0 -2
  166. package/dist/common-canvas-7676cc1b.js.map +0 -1
  167. package/dist/common-properties-9d77f8e1.js +0 -2
  168. package/dist/common-properties-9d77f8e1.js.map +0 -1
  169. package/dist/common-properties-a31de521.js +0 -2
  170. package/dist/common-properties-a31de521.js.map +0 -1
  171. package/dist/createClass-72b049bc.js +0 -2
  172. package/dist/createClass-72b049bc.js.map +0 -1
  173. package/dist/createClass-d5cac0b7.js +0 -2
  174. package/dist/createClass-d5cac0b7.js.map +0 -1
  175. package/dist/en-7a0f1db1.js +0 -2
  176. package/dist/en-8647c347.js +0 -2
  177. package/dist/extends-87da7df3.js +0 -7
  178. package/dist/extends-87da7df3.js.map +0 -1
  179. package/dist/extends-dc95dba8.js +0 -7
  180. package/dist/extends-dc95dba8.js.map +0 -1
  181. package/dist/flexible-table-59ad2c83.js +0 -2
  182. package/dist/flexible-table-59ad2c83.js.map +0 -1
  183. package/dist/flexible-table-5c4fbb7b.js +0 -2
  184. package/dist/flexible-table-5c4fbb7b.js.map +0 -1
  185. package/dist/getPrototypeOf-4e282dd3.js +0 -2
  186. package/dist/getPrototypeOf-4e282dd3.js.map +0 -1
  187. package/dist/getPrototypeOf-b3806813.js +0 -2
  188. package/dist/getPrototypeOf-b3806813.js.map +0 -1
  189. package/dist/icon-2c16236a.js +0 -2
  190. package/dist/icon-816af0e7.js +0 -2
  191. package/dist/index-6f739fa1.js +0 -2
  192. package/dist/toolbar-2ef99bd8.js +0 -2
  193. package/dist/toolbar-2ef99bd8.js.map +0 -1
  194. package/dist/toolbar-cb967e26.js +0 -2
  195. package/dist/toolbar-cb967e26.js.map +0 -1
@@ -58,8 +58,6 @@ import SvgCanvasDecs from "./svg-canvas-utils-decs.js";
58
58
  import SvgCanvasTextArea from "./svg-canvas-utils-textarea.js";
59
59
  import SVGCanvasPipeline from "./svg-canvas-pipeline";
60
60
 
61
- const showLinksTime = false;
62
-
63
61
  const NINETY_DEGREES = 90;
64
62
 
65
63
  const INPUT_TYPE = "input_type";
@@ -184,13 +182,14 @@ export default class SVGCanvasRenderer {
184
182
  // Flag to indicate when a zoom is invoked programmatically.
185
183
  this.zoomingAction = false;
186
184
 
187
- // Allows us to track when the binding nodes in a subflow are being moved.
188
- this.movingBindingNodes = false;
189
-
190
- // Keep track of when the context menu has been closed so we don't remove
185
+ // Keep track of when the context menu has been closed, so we don't remove
191
186
  // selections when a context menu is closed during a zoom gesture.
192
187
  this.contextMenuClosedOnZoom = false;
193
188
 
189
+ // Keep track of when text editing has been closed, so we don't remove
190
+ // selections when that happens during a zoom gesture.
191
+ this.textEditingClosedfOnZoom = false;
192
+
194
193
  // Used to monitor the region selection rectangle.
195
194
  this.regionSelect = false;
196
195
 
@@ -419,7 +418,7 @@ export default class SVGCanvasRenderer {
419
418
  // Ensure the SVG area is displayed, incase it was previously hidden.
420
419
  this.canvasSVG.style("display", "inherit");
421
420
 
422
- this.displayComments(); // Show comments first so they appear under nodes, if there is overlap.
421
+ this.displayComments();
423
422
  this.displayNodes();
424
423
  this.displayLinks();
425
424
 
@@ -433,6 +432,12 @@ export default class SVGCanvasRenderer {
433
432
  this.displayPortsForSubFlowFullPage();
434
433
  }
435
434
 
435
+ this.displayCanvasAccoutrements();
436
+
437
+ this.logger.logEndTimer("displayCanvas");
438
+ }
439
+
440
+ displayCanvasAccoutrements() {
436
441
  if (this.config.enableBoundingRectangles) {
437
442
  this.displayBoundingRectangles();
438
443
  }
@@ -440,8 +445,6 @@ export default class SVGCanvasRenderer {
440
445
  if (this.config.enableCanvasUnderlay !== "None" && this.dispUtils.isDisplayingPrimaryFlowFullPage()) {
441
446
  this.setCanvasUnderlaySize();
442
447
  }
443
-
444
- this.logger.logEndTimer("displayCanvas");
445
448
  }
446
449
 
447
450
  // Ensures the binding ports for a full-page sub-flow are calculated
@@ -477,10 +480,10 @@ export default class SVGCanvasRenderer {
477
480
  // moved to the right place.
478
481
  this.setPortPositionsAllNodes();
479
482
  this.moveSuperBindingNodes();
480
- this.movingBindingNodes = true;
481
- this.displayNodes();
482
- this.displayLinks();
483
- this.movingBindingNodes = false;
483
+
484
+ this.displayMovedNodes();
485
+ this.displayMovedLinks();
486
+
484
487
  this.logger.log("displayBindingNodesToFitSVG - end");
485
488
  }
486
489
 
@@ -680,11 +683,28 @@ export default class SVGCanvasRenderer {
680
683
  return this.nodesLinksGrp.selectChildren(nodeGrpSelector);
681
684
  }
682
685
 
683
- getLinkGroupSelectionById(nodeId) {
684
- const linkGrpSelector = this.getSelectorForId("link_grp", nodeId);
686
+ getLinkGroupSelectionById(linkId) {
687
+ const linkGrpSelector = this.getSelectorForId("link_grp", linkId);
685
688
  return this.nodesLinksGrp.selectChildren(linkGrpSelector);
686
689
  }
687
690
 
691
+ getCommentGroupSelectionById(comId) {
692
+ const selector = this.getSelectorForId("comment_grp", comId);
693
+ return this.commentsGrp.selectChildren(selector);
694
+ }
695
+
696
+ getNodeDecSelectionById(decId, nodeId) {
697
+ const nodeSel = this.getNodeGroupSelectionById(nodeId);
698
+ const selector = this.getSelectorForId("node_dec_group", decId);
699
+ return nodeSel.selectAll(selector);
700
+ }
701
+
702
+ getLinkDecSelectionById(decId, linkId) {
703
+ const linkSel = this.getLinkGroupSelectionById(linkId);
704
+ const selector = this.getSelectorForId("link_dec_group", decId);
705
+ return linkSel.selectAll(selector);
706
+ }
707
+
688
708
  // Returns a selector for the ID string like one of the following:
689
709
  // * [data-id='prefix_instanceID']
690
710
  // * [data-id='prefix_instanceID_suffix']
@@ -961,13 +981,13 @@ export default class SVGCanvasRenderer {
961
981
  // the Chrome browser userAgent contains the words "Chrome and "Safari"!
962
982
  // However, with the Safari browser, userAgent only contains the word "Safari".
963
983
  if (navigator.userAgent.includes("Chrome")) {
964
- browserZoom = window.devicePixelRatio; // This works for Chrome
984
+ browserZoom = 1; // This works for Chrome
965
985
 
966
986
  } else if (navigator.userAgent.includes("Safari")) {
967
987
  browserZoom = (window.outerWidth - 8) / window.innerWidth; // This works for Safari
968
988
 
969
989
  } else if (navigator.userAgent.includes("Firefox")) {
970
- browserZoom = window.devicePixelRatio / 2; // This works for Firefox
990
+ browserZoom = 1; // This works for Firefox
971
991
  }
972
992
 
973
993
  return browserZoom;
@@ -1597,6 +1617,57 @@ export default class SVGCanvasRenderer {
1597
1617
  feMerge.append("feMergeNode").attr("in", "SourceGraphic");
1598
1618
  }
1599
1619
 
1620
+ setNodeLabelEditingMode(nodeId, pipelineId) {
1621
+ if (this.pipelineId === pipelineId) {
1622
+ const node = this.activePipeline.getNode(nodeId);
1623
+ if (node && node.layout.labelEditable && this.config.enableEditingActions) {
1624
+ const nodeSel = this.getNodeGroupSelectionById(nodeId);
1625
+ const nodeDomObj = nodeSel.node();
1626
+ this.displayNodeLabelTextArea(node, nodeDomObj);
1627
+ }
1628
+ } else {
1629
+ this.superRenderers.forEach((renderer) => {
1630
+ renderer.setNodeLabelEditingMode(nodeId, pipelineId);
1631
+ });
1632
+ }
1633
+ }
1634
+
1635
+ setNodeDecorationLabelEditingMode(decId, nodeId, pipelineId) {
1636
+ if (this.pipelineId === pipelineId) {
1637
+ const node = this.activePipeline.getNode(nodeId);
1638
+ if (node && node.decorations) {
1639
+ const dec = node.decorations.find((d) => d.id === decId);
1640
+ if (dec && typeof dec.label !== "undefined" && dec.label_editable && this.config.enableEditingActions) {
1641
+ const nodeDecSel = this.getNodeDecSelectionById(decId, nodeId);
1642
+ const nodeDecDomObj = nodeDecSel.node();
1643
+ this.displayDecLabelTextArea(dec, node, "node", nodeDecDomObj);
1644
+ }
1645
+ }
1646
+ } else {
1647
+ this.superRenderers.forEach((renderer) => {
1648
+ renderer.setLinkDecorationLabelEditingMode(decId, nodeId, pipelineId);
1649
+ });
1650
+ }
1651
+ }
1652
+
1653
+ setLinkDecorationLabelEditingMode(decId, linkId, pipelineId) {
1654
+ if (this.pipelineId === pipelineId) {
1655
+ const link = this.activePipeline.getLink(linkId);
1656
+ if (link && link.decorations) {
1657
+ const dec = link.decorations.find((d) => d.id === decId);
1658
+ if (dec && typeof dec.label !== "undefined" && dec.label_editable && this.config.enableEditingActions) {
1659
+ const linkDecSel = this.getLinkDecSelectionById(decId, linkId);
1660
+ const linkDecDomObj = linkDecSel.node();
1661
+ this.displayDecLabelTextArea(dec, link, "link", linkDecDomObj);
1662
+ }
1663
+ }
1664
+ } else {
1665
+ this.superRenderers.forEach((renderer) => {
1666
+ renderer.setLinkDecorationLabelEditingMode(decId, linkId, pipelineId);
1667
+ });
1668
+ }
1669
+ }
1670
+
1600
1671
  // Restores the zoom of the canvas, if it has changed, based on the type
1601
1672
  // of 'save zoom' specified in the configuration and, if no saved zoom, was
1602
1673
  // provided pans the canvas area so it is always visible.
@@ -1806,6 +1877,13 @@ export default class SVGCanvasRenderer {
1806
1877
  this.contextMenuClosedOnZoom = true;
1807
1878
  }
1808
1879
 
1880
+ // Any text editing in progress will be closed by the textarea's blur event
1881
+ // if the user clicks on the canvas background. So we set this flag to
1882
+ // prevent the selection being lost in the zoomEnd (mouseup) event.
1883
+ if (this.svgCanvasTextArea.isEditingText()) {
1884
+ this.textEditingClosedfOnZoom = true;
1885
+ }
1886
+
1809
1887
  this.regionSelect = this.shouldDoRegionSelect(d3Event);
1810
1888
 
1811
1889
  if (this.regionSelect) {
@@ -1883,6 +1961,7 @@ export default class SVGCanvasRenderer {
1883
1961
  this.resetCanvasCursor(d3Event);
1884
1962
  this.removeTempCursorOverlay();
1885
1963
  this.contextMenuClosedOnZoom = false;
1964
+ this.textEditingClosedfOnZoom = false;
1886
1965
  this.regionSelect = false;
1887
1966
  }
1888
1967
 
@@ -1950,7 +2029,9 @@ export default class SVGCanvasRenderer {
1950
2029
  zoomClick() {
1951
2030
  // Only clear selections if clicked on the canvas of the current active pipeline.
1952
2031
  // Clicking the canvas of an expanded supernode will select that node.
1953
- if (this.dispUtils.isDisplayingCurrentPipeline() && !this.contextMenuClosedOnZoom) {
2032
+ // Also, don't clear selections if we have closed a context menu or
2033
+ // closed text editing.
2034
+ if (this.dispUtils.isDisplayingCurrentPipeline() && !this.contextMenuClosedOnZoom && !this.textEditingClosedfOnZoom) {
1954
2035
  this.selecting = true;
1955
2036
  this.canvasController.clearSelections();
1956
2037
  this.selecting = false;
@@ -2315,7 +2396,15 @@ export default class SVGCanvasRenderer {
2315
2396
  }
2316
2397
  }
2317
2398
 
2318
- this.displayCanvas();
2399
+ this.displayMovedComments();
2400
+ this.displayMovedNodes();
2401
+ this.displayMovedLinks();
2402
+ this.displayCanvasAccoutrements();
2403
+
2404
+ if (this.dispUtils.isDisplayingSubFlowInPlace()) {
2405
+ this.displaySVGToFitSupernode();
2406
+ }
2407
+
2319
2408
 
2320
2409
  if (this.existingNodeInsertableIntoLink) {
2321
2410
  const link = this.getLinkAtMousePos(d3Event.sourceEvent.clientX, d3Event.sourceEvent.clientY);
@@ -2524,15 +2613,7 @@ export default class SVGCanvasRenderer {
2524
2613
  // redrawn which will need port positions to be set appropriately.
2525
2614
  this.setPortPositionsAllNodes();
2526
2615
 
2527
- // For any of these activities we don't need to do anything to the nodes.
2528
- if (this.commentSizing) {
2529
- this.logger.logEndTimer("displayNodes " + this.getFlags());
2530
- return;
2531
-
2532
- } else if ((this.dragging && !this.nodeSizing && !this.commentSizing) || this.movingBindingNodes) {
2533
- this.displayMovedNodes();
2534
-
2535
- } else if (this.selecting) {
2616
+ if (this.selecting) {
2536
2617
  this.displayNodesSelectionStatus();
2537
2618
 
2538
2619
  } else {
@@ -2542,6 +2623,7 @@ export default class SVGCanvasRenderer {
2542
2623
  }
2543
2624
 
2544
2625
  displayMovedNodes() {
2626
+ this.logger.logStartTimer("displayMovedNodes");
2545
2627
  const nodeGroupSel = this.getAllNodeGroupsSelection();
2546
2628
 
2547
2629
  nodeGroupSel
@@ -2560,6 +2642,7 @@ export default class SVGCanvasRenderer {
2560
2642
  }
2561
2643
  });
2562
2644
  }
2645
+ this.logger.logEndTimer("displayMovedNodes");
2563
2646
  }
2564
2647
 
2565
2648
  displayNodesSelectionStatus(nodeGroupSel) {
@@ -2577,8 +2660,25 @@ export default class SVGCanvasRenderer {
2577
2660
  // Displays all the nodes on the canvas either by creating new nodes,
2578
2661
  // updating existing nodes or removing unwanted nodes.
2579
2662
  displayAllNodes() {
2580
- this.getAllNodeGroupsSelection()
2581
- .data(this.activePipeline.nodes, (d) => d.id)
2663
+ this.logger.log("displayAllNodes");
2664
+ const sel = this.getAllNodeGroupsSelection();
2665
+ this.displayNodesSubset(sel, this.activePipeline.nodes);
2666
+ }
2667
+
2668
+ displaySingleNode(d) {
2669
+ this.logger.logStartTimer("displaySingleNode " + this.getFlags());
2670
+
2671
+ this.setPortPositionsForNode(d);
2672
+
2673
+ const selection = this.getNodeGroupSelectionById(d.id);
2674
+ this.displayNodesSubset(selection, [d]);
2675
+
2676
+ this.logger.logEndTimer("displaySingleNode " + this.getFlags());
2677
+ }
2678
+
2679
+ displayNodesSubset(selection, data) {
2680
+ selection
2681
+ .data(data, (d) => d.id)
2582
2682
  .join(
2583
2683
  (enter) => this.createNodes(enter)
2584
2684
  )
@@ -2896,11 +2996,14 @@ export default class SVGCanvasRenderer {
2896
2996
  })
2897
2997
  // Use mouse down instead of click because it gets called before drag start.
2898
2998
  .on("mousedown", (d3Event, d) => {
2899
- this.logger.log("Node Group - mouse down");
2999
+ this.logger.logStartTimer("Node Group - mouse down");
3000
+ if (this.svgCanvasTextArea.isEditingText()) {
3001
+ this.svgCanvasTextArea.completeEditing();
3002
+ }
2900
3003
  if (!this.config.enableDragWithoutSelect) {
2901
3004
  this.selectObjectD3Event(d3Event, d);
2902
3005
  }
2903
- this.logger.log("Node Group - finished mouse down");
3006
+ this.logger.logEndTimer("Node Group - mouse down");
2904
3007
  })
2905
3008
  .on("mousemove", (d3Event, d) => {
2906
3009
  // this.logger.log("Node Group - mouse move");
@@ -3715,7 +3818,14 @@ export default class SVGCanvasRenderer {
3715
3818
  if (!this.config.enableDragWithoutSelect) {
3716
3819
  this.selectObjectD3Event(d3Event, d);
3717
3820
  }
3718
- this.openContextMenu(d3Event, "node", d);
3821
+ if (this.canvasController.isContextMenuDisplayed()) {
3822
+ this.canvasController.closeContextMenu();
3823
+ } else {
3824
+ const rect = ellipsisGrp.node().getBoundingClientRect();
3825
+ const rect2 = this.canvasSVG.node().getBoundingClientRect();
3826
+ const pos = { x: rect.left - rect2.left, y: rect.bottom - rect2.top };
3827
+ this.openContextMenu(d3Event, "node", d, null, pos);
3828
+ }
3719
3829
  });
3720
3830
 
3721
3831
  ellipsisGrp
@@ -3873,14 +3983,16 @@ export default class SVGCanvasRenderer {
3873
3983
 
3874
3984
  }
3875
3985
 
3876
- openContextMenu(d3Event, type, d, port) {
3986
+ openContextMenu(d3Event, type, d, port, pos) {
3877
3987
  CanvasUtils.stopPropagationAndPreventDefault(d3Event); // Stop the browser context menu appearing
3878
3988
  this.canvasController.contextMenuHandler({
3879
3989
  type: type,
3880
3990
  targetObject: type === "canvas" ? null : d,
3881
3991
  id: type === "canvas" ? null : d.id, // For historical puposes, we pass d.id as well as d as targetObject.
3882
3992
  pipelineId: this.activePipeline.id,
3883
- cmPos: this.getMousePos(d3Event, this.canvasDiv.selectAll("svg")), // Get mouse pos relative to top most SVG area even in a subflow.
3993
+ cmPos: pos
3994
+ ? pos
3995
+ : this.getMousePos(d3Event, this.canvasDiv.selectAll("svg")), // Get mouse pos relative to top most SVG area even in a subflow.
3884
3996
  mousePos: this.getMousePosSnapToGrid(this.getTransformedMousePos(d3Event)),
3885
3997
  selectedObjectIds: this.objectModel.getSelectedObjectIds(),
3886
3998
  addBreadcrumbs: (d && d.type === SUPER_NODE) ? this.getSupernodeBreadcrumbs(d3Event.currentTarget) : null,
@@ -4733,6 +4845,9 @@ export default class SVGCanvasRenderer {
4733
4845
  // Returns a path string that will draw the selection outline shape of the node.
4734
4846
  getNodeSelectionOutline(data) {
4735
4847
  if (data.layout.selectionPath && !CanvasUtils.isExpanded(data)) {
4848
+ if (typeof data.layout.selectionPath === "function") {
4849
+ return data.layout.selectionPath(data);
4850
+ }
4736
4851
  return data.layout.selectionPath;
4737
4852
 
4738
4853
  } else if (data.layout.nodeShape === "port-arcs") {
@@ -4745,6 +4860,10 @@ export default class SVGCanvasRenderer {
4745
4860
  // Returns a path string that will draw the body shape of the node.
4746
4861
  getNodeShapePath(data) {
4747
4862
  if (data.layout.bodyPath && !CanvasUtils.isExpanded(data)) {
4863
+ if (typeof data.layout.bodyPath === "function") {
4864
+ return data.layout.bodyPath(data);
4865
+ }
4866
+
4748
4867
  return data.layout.bodyPath;
4749
4868
 
4750
4869
  } else if (data.layout.nodeShape === "port-arcs") {
@@ -5047,10 +5166,7 @@ export default class SVGCanvasRenderer {
5047
5166
  displayComments() {
5048
5167
  this.logger.logStartTimer("displayComments " + this.getFlags());
5049
5168
 
5050
- if (this.dragging && !this.commentSizing && !this.nodeSizing && !this.isCommentBeingUpdated) {
5051
- this.displayMovedComments();
5052
-
5053
- } else if (this.selecting) {
5169
+ if (this.selecting) {
5054
5170
  this.displayCommentsSelectionStatus();
5055
5171
 
5056
5172
  } else {
@@ -5061,9 +5177,13 @@ export default class SVGCanvasRenderer {
5061
5177
  }
5062
5178
 
5063
5179
  displayMovedComments() {
5180
+ this.logger.logStartTimer("displayMovedComments");
5181
+
5064
5182
  this.getAllCommentGroupsSelection()
5065
5183
  .attr("transform", (c) => `translate(${c.x_pos}, ${c.y_pos})`)
5066
5184
  .datum((d) => this.activePipeline.getComment(d.id));
5185
+
5186
+ this.logger.logEndTimer("displayMovedComments");
5067
5187
  }
5068
5188
 
5069
5189
  displayCommentsSelectionStatus() {
@@ -5078,9 +5198,19 @@ export default class SVGCanvasRenderer {
5078
5198
  });
5079
5199
  }
5080
5200
 
5201
+ displaySingleComment(comment) {
5202
+ const selection = this.getCommentGroupSelectionById(comment.id);
5203
+ this.displayCommentsSubset(selection, [comment]);
5204
+ }
5205
+
5081
5206
  displayAllComments() {
5082
- this.getAllCommentGroupsSelection()
5083
- .data(this.activePipeline.comments, (c) => c.id)
5207
+ const selection = this.getAllCommentGroupsSelection();
5208
+ this.displayCommentsSubset(selection, this.activePipeline.comments);
5209
+ }
5210
+
5211
+ displayCommentsSubset(selection, data) {
5212
+ selection
5213
+ .data(data, (c) => c.id)
5084
5214
  .join(
5085
5215
  (enter) => this.createComments(enter)
5086
5216
  )
@@ -5194,11 +5324,14 @@ export default class SVGCanvasRenderer {
5194
5324
  })
5195
5325
  // Use mouse down instead of click because it gets called before drag start.
5196
5326
  .on("mousedown", (d3Event, d) => {
5197
- this.logger.log("Comment Group - mouse down");
5327
+ this.logger.logStartTimer("Comment Group - mouse down");
5328
+ if (this.svgCanvasTextArea.isEditingText()) {
5329
+ this.svgCanvasTextArea.completeEditing();
5330
+ }
5198
5331
  if (!this.config.enableDragWithoutSelect) {
5199
5332
  this.selectObjectD3Event(d3Event, d);
5200
5333
  }
5201
- this.logger.log("Comment Group - finished mouse down");
5334
+ this.logger.logEndTimer("Comment Group - mouse down");
5202
5335
  })
5203
5336
  .on("click", (d3Event, d) => {
5204
5337
  this.logger.log("Comment Group - click");
@@ -5521,9 +5654,13 @@ export default class SVGCanvasRenderer {
5521
5654
  this.nodeSizingDetLinksInfo = Object.assign(this.nodeSizingDetLinksInfo, linksInfo);
5522
5655
  }
5523
5656
 
5524
- this.displayComments();
5525
- this.displayNodes();
5526
- this.displayLinks();
5657
+ this.logger.logStartTimer("displayObjects");
5658
+
5659
+ this.displayMovedComments();
5660
+ this.displayMovedNodes();
5661
+ this.displaySingleNode(resizeObj);
5662
+ this.displayMovedLinks();
5663
+ this.displayCanvasAccoutrements();
5527
5664
 
5528
5665
  if (CanvasUtils.isSupernode(resizeObj)) {
5529
5666
  if (this.dispUtils.isDisplayingSubFlow()) {
@@ -5531,6 +5668,7 @@ export default class SVGCanvasRenderer {
5531
5668
  }
5532
5669
  this.superRenderers.forEach((renderer) => renderer.displaySVGToFitSupernode());
5533
5670
  }
5671
+ this.logger.logEndTimer("displayObjects");
5534
5672
  }
5535
5673
  }
5536
5674
 
@@ -5541,8 +5679,9 @@ export default class SVGCanvasRenderer {
5541
5679
  resizeComment(d3Event, d) {
5542
5680
  const resizeObj = this.activePipeline.getComment(d.id);
5543
5681
  this.resizeObject(d3Event, resizeObj, this.commentSizingDirection, 20, 20);
5544
- this.displayComments();
5545
- this.displayLinks();
5682
+ this.displaySingleComment(resizeObj);
5683
+ this.displayMovedLinks();
5684
+ this.displayCanvasAccoutrements();
5546
5685
  }
5547
5686
 
5548
5687
  // Sets the size and position of the object in the canvasInfo
@@ -5586,6 +5725,9 @@ export default class SVGCanvasRenderer {
5586
5725
  width = CanvasUtils.snapToGrid(this.notSnappedWidth, this.canvasLayout.snapToGridXPx);
5587
5726
  height = CanvasUtils.snapToGrid(this.notSnappedHeight, this.canvasLayout.snapToGridYPx);
5588
5727
 
5728
+ width = Math.max(width, minWidth);
5729
+ height = Math.max(height, minHeight);
5730
+
5589
5731
  } else {
5590
5732
  xPos = canvasObj.x_pos + incrementX;
5591
5733
  yPos = canvasObj.y_pos + incrementY;
@@ -5622,9 +5764,10 @@ export default class SVGCanvasRenderer {
5622
5764
  let resizeObj = this.activePipeline.getNode(node.id);
5623
5765
  if (this.config.enableSnapToGridType === SNAP_TO_GRID_AFTER) {
5624
5766
  resizeObj = this.snapToGridObject(resizeObj);
5767
+ resizeObj = this.restrictNodeSizingToMinimums(resizeObj);
5625
5768
  }
5626
5769
 
5627
- // If the dimensions or position has changed, issue the command.
5770
+ // If the dimensions or position has changed, issue the "resizeObjects" command.
5628
5771
  // Note: x_pos or y_pos might change on resize if the node is sized
5629
5772
  // upwards or to the left.
5630
5773
  if (this.resizeObjInitialInfo.x_pos !== resizeObj.x_pos ||
@@ -5697,6 +5840,16 @@ export default class SVGCanvasRenderer {
5697
5840
  this.commentSizing = false;
5698
5841
  }
5699
5842
 
5843
+ // Ensure the snap-to-grid does not make the width or height smaller than
5844
+ // the minimums allowed.
5845
+ restrictNodeSizingToMinimums(resizeObj) {
5846
+ const minHeight = this.getMinHeight(resizeObj);
5847
+ const minWidth = this.getMinWidth(resizeObj);
5848
+ resizeObj.width = Math.max(resizeObj.width, minWidth);
5849
+ resizeObj.height = Math.max(resizeObj.height, minHeight);
5850
+ return resizeObj;
5851
+ }
5852
+
5700
5853
  displayLinks() {
5701
5854
  this.logger.logStartTimer("displayLinks " + this.getFlags());
5702
5855
 
@@ -5724,13 +5877,31 @@ export default class SVGCanvasRenderer {
5724
5877
  }
5725
5878
 
5726
5879
  displayAllLinks() {
5727
- var startTimeDrawingLines = Date.now();
5880
+ const linksArray = this.buildLinksArray();
5881
+ const selection = this.getAllLinkGroupsSelection();
5882
+ this.displayLinksSubset(selection, linksArray);
5883
+ }
5884
+
5885
+ displayMovedLinks() {
5886
+ this.logger.logStartTimer("displayMovedLinks");
5728
5887
 
5729
- const timeAfterDelete = Date.now();
5730
5888
  const linksArray = this.buildLinksArray();
5731
- const afterLineArray = Date.now();
5889
+ const movedLinks = linksArray.filter((l) => l.coordsUpdated);
5890
+
5891
+ movedLinks.forEach((l) => {
5892
+ this.displaySingleLink(l);
5893
+ });
5894
+
5895
+ this.logger.logEndTimer("displayMovedLinks");
5896
+ }
5732
5897
 
5733
- this.getAllLinkGroupsSelection()
5898
+ displaySingleLink(link) {
5899
+ const selection = this.getLinkGroupSelectionById(link.id);
5900
+ this.displayLinksSubset(selection, [link]);
5901
+ }
5902
+
5903
+ displayLinksSubset(selection, linksArray) {
5904
+ selection
5734
5905
  .data(linksArray, (link) => link.id)
5735
5906
  .join(
5736
5907
  (enter) => this.createLinks(enter)
@@ -5741,13 +5912,6 @@ export default class SVGCanvasRenderer {
5741
5912
  .call((joinedLinkGrps) => {
5742
5913
  this.updateLinks(joinedLinkGrps, linksArray);
5743
5914
  });
5744
-
5745
- var endTimeDrawingLines = Date.now();
5746
-
5747
- if (showLinksTime) {
5748
- this.logger.log("displayLinks R " + (timeAfterDelete - startTimeDrawingLines) +
5749
- " B " + (afterLineArray - timeAfterDelete) + " D " + (endTimeDrawingLines - afterLineArray));
5750
- }
5751
5915
  }
5752
5916
 
5753
5917
  // Creates all newly created links specified in the enter selection.
@@ -5831,7 +5995,8 @@ export default class SVGCanvasRenderer {
5831
5995
  // Update decorations on the node-node or association links.
5832
5996
  joinedLinkGrps.each((d, i, linkGrps) => {
5833
5997
  if (d.type === NODE_LINK || d.type === ASSOCIATION_LINK) {
5834
- this.displayDecorations(d, DEC_LINK, d3.select(linkGrps[i]).selectAll(".d3-link-decorations-group"), d.decorations);
5998
+ const linkGrp = d3.select(linkGrps[i]).selectAll(".d3-link-decorations-group");
5999
+ this.displayDecorations(d, DEC_LINK, linkGrp, d.decorations);
5835
6000
  }
5836
6001
  });
5837
6002
 
@@ -5855,6 +6020,9 @@ export default class SVGCanvasRenderer {
5855
6020
  linkGrps
5856
6021
  .on("mousedown", (d3Event, d, index, links) => {
5857
6022
  this.logger.log("Link Group - mouse down");
6023
+ if (this.svgCanvasTextArea.isEditingText()) {
6024
+ this.svgCanvasTextArea.completeEditing();
6025
+ }
5858
6026
  if (this.config.enableLinkSelection !== LINK_SELECTION_NONE) {
5859
6027
  this.selectObjectD3Event(d3Event, d);
5860
6028
  }
@@ -6067,7 +6235,8 @@ export default class SVGCanvasRenderer {
6067
6235
 
6068
6236
  // Returns the class string to be appled to the node group object.
6069
6237
  getNodeGroupClass(d) {
6070
- let customClass = "";
6238
+ let customClass = " " + d.layout.className || "";
6239
+
6071
6240
  // If the node has a classname that isn't the default use it!
6072
6241
  if (d.class_name &&
6073
6242
  d.class_name !== "canvas-node" &&
@@ -6110,7 +6279,7 @@ export default class SVGCanvasRenderer {
6110
6279
  // the side of the node and where those nodes may be positioned close to each
6111
6280
  // other so it makes the ports appear on top of any adjacent node.
6112
6281
  raiseNodeToTop(nodeGrp) {
6113
- if (this.drawingNewLinkData === null && !this.dragging && this.getSelectedLinks().length === 0) {
6282
+ if (this.drawingNewLinkData === null && !this.dragging && this.getSelectedLinks().length === 0 && !this.isEditingText()) {
6114
6283
  nodeGrp.raise();
6115
6284
  }
6116
6285
  }
@@ -6205,6 +6374,12 @@ export default class SVGCanvasRenderer {
6205
6374
  : null;
6206
6375
  const coords = this.linkUtils.getLinkCoords(link, srcObj, srcPortId, trgNode, trgPortId, assocLinkVariation);
6207
6376
 
6377
+ link.coordsUpdated =
6378
+ link.x1 !== coords.x1 ||
6379
+ link.y1 !== coords.y1 ||
6380
+ link.x2 !== coords.x2 ||
6381
+ link.y2 !== coords.y2;
6382
+
6208
6383
  link.assocLinkVariation = assocLinkVariation;
6209
6384
  link.srcPortId = srcPortId;
6210
6385
  link.trgPortId = trgPortId;
@@ -6275,6 +6450,12 @@ export default class SVGCanvasRenderer {
6275
6450
  }
6276
6451
  }
6277
6452
 
6453
+ link.coordsUpdated =
6454
+ link.x1 !== coords.x1 ||
6455
+ link.y1 !== coords.y1 ||
6456
+ link.x2 !== coords.x2 ||
6457
+ link.y2 !== coords.y2;
6458
+
6278
6459
  link.srcPortId = srcPortId;
6279
6460
  link.trgPortId = trgPortId;
6280
6461
  link.x1 = coords.x1;
@@ -6778,9 +6959,6 @@ export default class SVGCanvasRenderer {
6778
6959
  if (this.commentSizing) {
6779
6960
  str += " commentSizing = true";
6780
6961
  }
6781
- if (this.movingBindingNodes) {
6782
- str += " movingBindingNodes = true";
6783
- }
6784
6962
  if (this.selecting) {
6785
6963
  str += " selecting = true";
6786
6964
  }