@elyra/canvas 12.39.1 → 12.40.1

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 (133) hide show
  1. package/dist/_baseIteratee-05ccf6a8.js +7 -0
  2. package/dist/_baseIteratee-05ccf6a8.js.map +1 -0
  3. package/dist/{_baseIteratee-64ab55d0.js → _baseIteratee-2b75d27c.js} +3 -3
  4. package/dist/_baseIteratee-2b75d27c.js.map +1 -0
  5. package/dist/canvas-constants-079172c0.js +2 -0
  6. package/dist/canvas-constants-079172c0.js.map +1 -0
  7. package/dist/canvas-constants-ff5cf88e.js +2 -0
  8. package/dist/canvas-constants-ff5cf88e.js.map +1 -0
  9. package/dist/canvas-controller-1e71b405.js +2 -0
  10. package/dist/{canvas-controller-c8b0d574.js.map → canvas-controller-1e71b405.js.map} +1 -1
  11. package/dist/canvas-controller-4bed5320.js +2 -0
  12. package/dist/{canvas-controller-ad1c218a.js.map → canvas-controller-4bed5320.js.map} +1 -1
  13. package/dist/common-canvas-318df796.js +2 -0
  14. package/dist/{common-canvas-c16aeb7c.js.map → common-canvas-318df796.js.map} +1 -1
  15. package/dist/common-canvas-d41ba910.js +2 -0
  16. package/dist/{common-canvas-891b7b38.js.map → common-canvas-d41ba910.js.map} +1 -1
  17. package/dist/common-canvas.es.js +1 -1
  18. package/dist/common-canvas.es.js.map +1 -1
  19. package/dist/common-canvas.js +1 -1
  20. package/dist/common-canvas.js.map +1 -1
  21. package/dist/common-properties-6e904e3b.js +2 -0
  22. package/dist/common-properties-6e904e3b.js.map +1 -0
  23. package/dist/common-properties-c91bfb31.js +2 -0
  24. package/dist/common-properties-c91bfb31.js.map +1 -0
  25. package/dist/context-menu-wrapper-3a7fdec8.js +2 -0
  26. package/dist/context-menu-wrapper-3a7fdec8.js.map +1 -0
  27. package/dist/context-menu-wrapper-fc85d853.js +2 -0
  28. package/dist/context-menu-wrapper-fc85d853.js.map +1 -0
  29. package/dist/datarecord-metadata-v3-schema-59505bc5.js +2 -0
  30. package/dist/{datarecord-metadata-v3-schema-618b308b.js.map → datarecord-metadata-v3-schema-59505bc5.js.map} +1 -1
  31. package/dist/datarecord-metadata-v3-schema-dba0b214.js +2 -0
  32. package/dist/{datarecord-metadata-v3-schema-ee0f5c4c.js.map → datarecord-metadata-v3-schema-dba0b214.js.map} +1 -1
  33. package/dist/defineProperty-3dc7d8d0.js +2 -0
  34. package/dist/defineProperty-3dc7d8d0.js.map +1 -0
  35. package/dist/defineProperty-6d406743.js +2 -0
  36. package/dist/defineProperty-6d406743.js.map +1 -0
  37. package/dist/flexible-table-562ae288.js +2 -0
  38. package/dist/flexible-table-562ae288.js.map +1 -0
  39. package/dist/flexible-table-5ee2a42b.js +2 -0
  40. package/dist/flexible-table-5ee2a42b.js.map +1 -0
  41. package/dist/icon-0390f1fe.js +2 -0
  42. package/dist/{icon-630b5bba.js.map → icon-0390f1fe.js.map} +1 -1
  43. package/dist/icon-e622f99b.js +2 -0
  44. package/dist/{icon-86ee98d5.js.map → icon-e622f99b.js.map} +1 -1
  45. package/dist/index-8e8b8729.js +2 -0
  46. package/dist/{index-7bf8508e.js.map → index-8e8b8729.js.map} +1 -1
  47. package/dist/index-fe8d4201.js +2 -0
  48. package/dist/{index-11b62489.js.map → index-fe8d4201.js.map} +1 -1
  49. package/dist/inherits-226dfdb2.js +2 -0
  50. package/dist/inherits-226dfdb2.js.map +1 -0
  51. package/dist/{getPrototypeOf-d346567e.js → inherits-41673c87.js} +2 -2
  52. package/dist/inherits-41673c87.js.map +1 -0
  53. package/dist/{isArrayLikeObject-0cd02b77.js → isArrayLikeObject-04f333a5.js} +2 -2
  54. package/dist/{isArrayLikeObject-0cd02b77.js.map → isArrayLikeObject-04f333a5.js.map} +1 -1
  55. package/dist/{isArrayLikeObject-9104c690.js → isArrayLikeObject-36898fcb.js} +2 -2
  56. package/dist/{isArrayLikeObject-9104c690.js.map → isArrayLikeObject-36898fcb.js.map} +1 -1
  57. package/dist/lib/canvas-controller.es.js +1 -1
  58. package/dist/lib/canvas-controller.js +1 -1
  59. package/dist/lib/canvas.es.js +1 -1
  60. package/dist/lib/canvas.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.es.js.map +1 -1
  71. package/dist/lib/tooltip.js +1 -1
  72. package/dist/lib/tooltip.js.map +1 -1
  73. package/dist/styles/common-canvas.min.css +1 -1
  74. package/dist/styles/common-canvas.min.css.map +1 -1
  75. package/dist/toolbar-b01e6749.js +2 -0
  76. package/dist/{toolbar-d69430a2.js.map → toolbar-b01e6749.js.map} +1 -1
  77. package/dist/toolbar-fd4e4a3a.js +2 -0
  78. package/dist/{toolbar-b1b9f37d.js.map → toolbar-fd4e4a3a.js.map} +1 -1
  79. package/locales/common-properties/locales/en.json +1 -0
  80. package/package.json +1 -1
  81. package/src/color-picker/color-picker.scss +1 -1
  82. package/src/common-canvas/canvas-controller-menu-utils.js +2 -2
  83. package/src/common-canvas/canvas-controller.js +34 -28
  84. package/src/common-canvas/constants/canvas-constants.js +0 -5
  85. package/src/common-canvas/svg-canvas-d3.scss +56 -17
  86. package/src/common-canvas/svg-canvas-renderer.js +9 -2
  87. package/src/common-properties/components/flexible-table/flexible-table.jsx +15 -2
  88. package/src/common-properties/components/virtualized-table/virtualized-table.jsx +1 -1
  89. package/src/common-properties/constants/constants.js +1 -0
  90. package/src/common-properties/controls/expression/expression-builder/expression-select-field-function.jsx +86 -28
  91. package/src/common-properties/controls/expression/expressionInfo-parser.js +0 -1
  92. package/src/common-properties/properties-controller.js +19 -8
  93. package/src/context-menu/common-context-menu.jsx +15 -1
  94. package/src/object-model/object-model.js +12 -0
  95. package/src/object-model/redux/reducers/canvasinfo.js +13 -1
  96. package/src/object-model/redux/reducers/comments.js +0 -1
  97. package/src/object-model/redux/reducers/links.js +16 -0
  98. package/src/object-model/redux/reducers/nodes.js +16 -0
  99. package/stats.html +1 -1
  100. package/dist/_baseIteratee-64ab55d0.js.map +0 -1
  101. package/dist/_baseIteratee-82d2e94c.js +0 -7
  102. package/dist/_baseIteratee-82d2e94c.js.map +0 -1
  103. package/dist/canvas-constants-45f5f039.js +0 -2
  104. package/dist/canvas-constants-45f5f039.js.map +0 -1
  105. package/dist/canvas-constants-be5521b9.js +0 -2
  106. package/dist/canvas-constants-be5521b9.js.map +0 -1
  107. package/dist/canvas-controller-ad1c218a.js +0 -2
  108. package/dist/canvas-controller-c8b0d574.js +0 -2
  109. package/dist/common-canvas-891b7b38.js +0 -2
  110. package/dist/common-canvas-c16aeb7c.js +0 -2
  111. package/dist/common-properties-9cfe3daa.js +0 -2
  112. package/dist/common-properties-9cfe3daa.js.map +0 -1
  113. package/dist/common-properties-bbe82be2.js +0 -2
  114. package/dist/common-properties-bbe82be2.js.map +0 -1
  115. package/dist/context-menu-wrapper-4dc8d351.js +0 -2
  116. package/dist/context-menu-wrapper-4dc8d351.js.map +0 -1
  117. package/dist/context-menu-wrapper-5b795ee5.js +0 -2
  118. package/dist/context-menu-wrapper-5b795ee5.js.map +0 -1
  119. package/dist/datarecord-metadata-v3-schema-618b308b.js +0 -2
  120. package/dist/datarecord-metadata-v3-schema-ee0f5c4c.js +0 -2
  121. package/dist/flexible-table-41beff38.js +0 -2
  122. package/dist/flexible-table-41beff38.js.map +0 -1
  123. package/dist/flexible-table-52f85f0b.js +0 -2
  124. package/dist/flexible-table-52f85f0b.js.map +0 -1
  125. package/dist/getPrototypeOf-11f2726a.js +0 -2
  126. package/dist/getPrototypeOf-11f2726a.js.map +0 -1
  127. package/dist/getPrototypeOf-d346567e.js.map +0 -1
  128. package/dist/icon-630b5bba.js +0 -2
  129. package/dist/icon-86ee98d5.js +0 -2
  130. package/dist/index-11b62489.js +0 -2
  131. package/dist/index-7bf8508e.js +0 -2
  132. package/dist/toolbar-b1b9f37d.js +0 -2
  133. package/dist/toolbar-d69430a2.js +0 -2
@@ -77,8 +77,8 @@ $node-port-input-arrow-connected-fill-color: transparent;
77
77
  // Comment colors
78
78
  $comment-outline-color: $active-light-ui;
79
79
  $comment-outline-hover-color: $inverse-hover-ui;
80
- $comment-fill-color: $white-0;
81
- $comment-text-color: $gray-100;
80
+ $comment-fill-color: $ui-01;
81
+ $comment-text-color: $text-01;
82
82
 
83
83
  // Comment properties
84
84
  $comment-text-font-size: 12px;
@@ -261,7 +261,7 @@ $link-highlight-color: $support-04;
261
261
  }
262
262
  }
263
263
 
264
- /* Node highlight when end of new link line is over, or approaching, the node */
264
+ /* Node selection highlight when end of new link line is over, or approaching, the node */
265
265
 
266
266
  .d3-node-group[data-new-link-over="yes"] {
267
267
  .d3-node-selection-highlight {
@@ -273,6 +273,28 @@ $link-highlight-color: $support-04;
273
273
  }
274
274
  }
275
275
 
276
+ /* Node branch highlight styles */
277
+
278
+ .d3-node-group.d3-branch-highlight {
279
+ .d3-node-body-outline {
280
+ stroke: $ui-05;
281
+ stroke-width: 2px;
282
+ fill: $highlight;
283
+ }
284
+
285
+ .d3-node-label {
286
+ color: $text-01;
287
+ }
288
+ }
289
+
290
+ .d3-node-group.d3-branch-highlight:hover {
291
+ .d3-node-body-outline {
292
+ stroke: $ui-05;
293
+ stroke-width: 2px;
294
+ fill: $hover-primary;
295
+ }
296
+ }
297
+
276
298
  /* Node styles - Error indication */
277
299
 
278
300
  .d3-node-error-label {
@@ -609,10 +631,13 @@ $link-highlight-color: $support-04;
609
631
  user-select: none;
610
632
  }
611
633
 
612
- @mixin d3-comment-color-overrides($background-color) {
634
+ @mixin d3-comment-color-overrides($background-color, $text-color) {
613
635
  .d3-comment-rect {
614
636
  fill: $background-color;
615
637
  }
638
+ .d3-comment-text {
639
+ color: $text-color;
640
+ }
616
641
  .d3-comment-entry {
617
642
  background-color: $background-color;
618
643
  color: $gray-100;
@@ -625,40 +650,41 @@ $link-highlight-color: $support-04;
625
650
  // assumption is, the user would prefer the color they set in the UI to
626
651
  // override any color provided by the host app.
627
652
  g.bkg-col-white-0 {
628
- @include d3-comment-color-overrides($white-0);
653
+ // In dark-mode, white-0 will be interpreted as black background with white text.
654
+ @include d3-comment-color-overrides($ui-01, $text-01);
629
655
  }
630
656
  g.bkg-col-yellow-20 {
631
- @include d3-comment-color-overrides($yellow-20);
657
+ @include d3-comment-color-overrides($yellow-20, $gray-100);
632
658
  }
633
659
  g.bkg-col-gray-20 {
634
- @include d3-comment-color-overrides($gray-20);
660
+ @include d3-comment-color-overrides($gray-20, $gray-100);
635
661
  }
636
662
  g.bkg-col-green-20 {
637
- @include d3-comment-color-overrides($green-20);
663
+ @include d3-comment-color-overrides($green-20, $gray-100);
638
664
  }
639
665
  g.bkg-col-teal-20 {
640
- @include d3-comment-color-overrides($teal-20);
666
+ @include d3-comment-color-overrides($teal-20, $gray-100);
641
667
  }
642
668
  g.bkg-col-cyan-20 {
643
- @include d3-comment-color-overrides($cyan-20);
669
+ @include d3-comment-color-overrides($cyan-20, $gray-100);
644
670
  }
645
671
  g.bkg-col-red-50 {
646
- @include d3-comment-color-overrides($red-50);
672
+ @include d3-comment-color-overrides($red-50, $gray-100);
647
673
  }
648
674
  g.bkg-col-orange-40 {
649
- @include d3-comment-color-overrides($orange-40);
675
+ @include d3-comment-color-overrides($orange-40, $gray-100);
650
676
  }
651
677
  g.bkg-col-gray-50 {
652
- @include d3-comment-color-overrides($gray-50);
678
+ @include d3-comment-color-overrides($gray-50, $gray-100);
653
679
  }
654
680
  g.bkg-col-green-50 {
655
- @include d3-comment-color-overrides($green-50);
681
+ @include d3-comment-color-overrides($green-50, $gray-100);
656
682
  }
657
683
  g.bkg-col-teal-50 {
658
- @include d3-comment-color-overrides($teal-50);
684
+ @include d3-comment-color-overrides($teal-50, $gray-100);
659
685
  }
660
686
  g.bkg-col-cyan-50 {
661
- @include d3-comment-color-overrides($cyan-50);
687
+ @include d3-comment-color-overrides($cyan-50, $gray-100);
662
688
  }
663
689
 
664
690
  .d3-comment-selection-highlight {
@@ -865,7 +891,20 @@ g.bkg-col-cyan-50 {
865
891
  }
866
892
  }
867
893
 
868
- /* Link styles */
894
+ /* Link styles for branch highlighting */
895
+
896
+ .d3-link-group.d3-branch-highlight {
897
+ .d3-link-line {
898
+ stroke: $inverse-02;
899
+ }
900
+ }
901
+
902
+ .d3-link-group.d3-branch-highlight:hover {
903
+ .d3-link-line {
904
+ stroke: $inverse-02;
905
+ stroke-width: 3px;
906
+ }
907
+ }
869
908
 
870
909
  // Common styles for all links
871
910
  .d3-link-line,
@@ -4204,7 +4204,12 @@ export default class SVGCanvasRenderer {
4204
4204
 
4205
4205
  // Returns the class string to be appled to the link group object.
4206
4206
  getLinkGroupClass(d) {
4207
- return "d3-link-group " + this.getLinkTypeClass(d) + " " + this.getLinkCustomClass(d);
4207
+ return "d3-link-group " + this.getLinkTypeClass(d) + " " + this.getLinkBranchHighlightCLass(d) + " " + this.getLinkCustomClass(d);
4208
+ }
4209
+
4210
+ // Returns the class to be used for branch highlighting if the branchHighlight flag id set for the link.
4211
+ getLinkBranchHighlightCLass(d) {
4212
+ return (d.branchHighlight ? "d3-branch-highlight" : "");
4208
4213
  }
4209
4214
 
4210
4215
  // Returns the custom class string for the link object passed in.
@@ -4282,7 +4287,9 @@ export default class SVGCanvasRenderer {
4282
4287
  ? " d3-resized"
4283
4288
  : "";
4284
4289
 
4285
- return "d3-node-group" + supernodeClass + resizeClass + draggableClass + customClass;
4290
+ const branchHighlightClass = d.branchHighlight ? " d3-branch-highlight" : "";
4291
+
4292
+ return "d3-node-group" + supernodeClass + resizeClass + draggableClass + branchHighlightClass + customClass;
4286
4293
  }
4287
4294
 
4288
4295
  // Pushes the links to be below nodes within the nodesLinksGrp group.
@@ -61,6 +61,7 @@ class FlexibleTable extends React.Component {
61
61
  this.onSort = this.onSort.bind(this);
62
62
  this.sortHeaderClick = this.sortHeaderClick.bind(this);
63
63
  this._updateTableWidth = this._updateTableWidth.bind(this);
64
+ this._updateRows = this._updateRows.bind(this);
64
65
  this._adjustTableHeight = this._adjustTableHeight.bind(this);
65
66
  this.handleCheckedRow = this.handleCheckedRow.bind(this);
66
67
  this.handleCheckedAllRows = this.handleCheckedAllRows.bind(this);
@@ -74,8 +75,11 @@ class FlexibleTable extends React.Component {
74
75
  }
75
76
 
76
77
  componentDidUpdate(prevProps, prevState) {
77
- if (prevProps.rows !== this.props.rows ||
78
- prevProps.columns !== this.props.columns ||
78
+ if (prevProps.rows !== this.props.rows) {
79
+ this._updateRows();
80
+ }
81
+
82
+ if (prevProps.columns !== this.props.columns ||
79
83
  prevProps.noAutoSize !== this.props.noAutoSize) {
80
84
  this._adjustTableHeight();
81
85
  }
@@ -243,10 +247,19 @@ class FlexibleTable extends React.Component {
243
247
  }
244
248
  }
245
249
 
250
+ _updateRows() {
251
+ if (this.props.rows && this.props.rows !== this.state.rows) {
252
+ this.setState({ rows: this.props.rows }, () => {
253
+ this._adjustTableHeight();
254
+ });
255
+ }
256
+ }
257
+
246
258
  _adjustTableHeight() {
247
259
  if (this.props.noAutoSize) {
248
260
  return;
249
261
  }
262
+
250
263
  let newHeight = this.state.tableHeight;
251
264
  let dynamicH = this.state.dynamicHeight;
252
265
  const multiSelectTableHeight = REM_ROW_HEIGHT + REM_HEADER_HEIGHT;
@@ -380,7 +380,7 @@ class VirtualizedTable extends React.Component {
380
380
  }
381
381
 
382
382
  if (this.props.selectable) {
383
- const rowSelected = this.isRowSelected(rowData.originalRowIndex);
383
+ const rowSelected = this.props.sortDirection ? this.isRowSelected(rowData.index) : this.isRowSelected(rowData.originalRowIndex); // use current row index when Sorted
384
384
  selectedRow = this.props.selectable && rowSelected;
385
385
  if (this.props.rowSelection !== ROW_SELECTION.SINGLE) {
386
386
  const translatedRowCheckboxLabel = this.props.intl.formatMessage(
@@ -73,6 +73,7 @@ export const MESSAGE_KEYS = {
73
73
  EXPRESSION_FIELDS_TITLE: "expression.fields.title",
74
74
  EXPRESSION_VALUES_TITLE: "expression.values.title",
75
75
  EXPRESSION_FIELD_COLUMN: "expression.field.column",
76
+ EXPRESSION_ADD_COLUMN: "expression.add.column",
76
77
  EXPRESSION_FIELD_COLUMN_DESCRIPTION: "expression.field.column.description",
77
78
  EXPRESSION_STORAGE_COLUMN: "expression.storage.column",
78
79
  EXPRESSION_VALUE_COLUMN: "expression.value.column",
@@ -16,6 +16,8 @@
16
16
 
17
17
  import React from "react";
18
18
  import PropTypes from "prop-types";
19
+ import { Add16 } from "@carbon/icons-react";
20
+ import { Button } from "carbon-components-react";
19
21
  import { Switch, ContentSwitcher, Dropdown } from "carbon-components-react";
20
22
  import FlexibleTable from "./../../../components/flexible-table/flexible-table";
21
23
  import TruncatedContentTooltip from "./../../../components/truncated-content-tooltip";
@@ -38,6 +40,9 @@ export default class ExpressionSelectFieldOrFunction extends React.Component {
38
40
  id: this.recentUseCat,
39
41
  locLabel: this.recentUseCat,
40
42
  field_columns: {
43
+ add_column_info: {
44
+ locLabel: formatMessage(this.reactIntl, MESSAGE_KEYS.EXPRESSION_ADD_COLUMN)
45
+ },
41
46
  field_column_info: {
42
47
  locLabel: formatMessage(this.reactIntl, MESSAGE_KEYS.EXPRESSION_RECENTLY_USED_COLUMN)
43
48
  },
@@ -71,11 +76,11 @@ export default class ExpressionSelectFieldOrFunction extends React.Component {
71
76
  this.language = props.language;
72
77
 
73
78
  this.onFieldTableClick = this.onFieldTableClick.bind(this);
74
- this.onFieldTableDblClick = this.onFieldTableDblClick.bind(this);
79
+ this.onAddFieldClick = this.onAddFieldClick.bind(this);
75
80
  this.onFunctionTableClick = this.onFunctionTableClick.bind(this);
76
- this.onFunctionTableDblClick = this.onFunctionTableDblClick.bind(this);
81
+ this.onAddFunctionClick = this.onAddFunctionClick.bind(this);
77
82
  this.onValueTableClick = this.onValueTableClick.bind(this);
78
- this.onValueTableDblClick = this.onValueTableDblClick.bind(this);
83
+ this.onAddValueClick = this.onAddValueClick.bind(this);
79
84
 
80
85
  this.sortTableRows = this.sortTableRows.bind(this);
81
86
  this.shouldQuoteField = this.shouldQuoteField.bind(this);
@@ -120,7 +125,7 @@ export default class ExpressionSelectFieldOrFunction extends React.Component {
120
125
 
121
126
  }
122
127
 
123
- onFieldTableDblClick(evt, rowKey, index) {
128
+ onAddFieldClick(rowKey) {
124
129
  const field = this.state.currentFieldDataset[rowKey];
125
130
  let value = field.id;
126
131
  if (this.state.fieldCategory !== this.recentUseCat) {
@@ -145,7 +150,7 @@ export default class ExpressionSelectFieldOrFunction extends React.Component {
145
150
  });
146
151
  }
147
152
 
148
- onValueTableDblClick(evt, rowKey, index) {
153
+ onAddValueClick(rowKey) {
149
154
  if (this.props.onChange) {
150
155
  const field = this.state.currentFieldDataset[this.state.fieldSelected];
151
156
  const quote = "\"";
@@ -174,7 +179,7 @@ export default class ExpressionSelectFieldOrFunction extends React.Component {
174
179
  });
175
180
  }
176
181
 
177
- onFunctionTableDblClick(evt, rowKey, index) {
182
+ onAddFunctionClick(rowKey) {
178
183
  let field;
179
184
  if (this.state.functionCategory === this.recentUseCat) {
180
185
  field = this.props.controller.getExpressionRecentlyUsed()[rowKey];
@@ -265,7 +270,40 @@ export default class ExpressionSelectFieldOrFunction extends React.Component {
265
270
  return contentObject;
266
271
  }
267
272
 
273
+ createAddButtonContent(index, tableType) {
274
+ const addValueButtonContent = (
275
+ <Button
276
+ className="expression-add-field-button properties-expr-table-cell"
277
+ onClick={this.handleAddButtonClick.bind(this, index, tableType)}
278
+ kind="ghost"
279
+ size="small"
280
+ >
281
+ <Add16 aria-label={formatMessage(this.reactIntl, MESSAGE_KEYS.EXPRESSION_ADD_COLUMN)} />
282
+ </Button>
283
+ );
284
+ return addValueButtonContent;
285
+ }
286
+
287
+ handleAddButtonClick(index, tableType) {
288
+ switch (tableType) {
289
+ case "value": {
290
+ this.onAddValueClick(index);
291
+ break;
292
+ }
293
+ case "field": {
294
+ this.onAddFieldClick(index);
295
+ break;
296
+ }
297
+ case "function": {
298
+ this.onAddFunctionClick(index);
299
+ break;
300
+ }
301
+ default:
302
+ }
303
+ }
304
+
268
305
  _makeDatasetFields(dataset, fieldDataset) {
306
+ const addNewColumn = formatMessage(this.reactIntl, MESSAGE_KEYS.EXPRESSION_ADD_COLUMN);
269
307
  const fieldColumn = formatMessage(this.reactIntl, MESSAGE_KEYS.EXPRESSION_FIELD_COLUMN);
270
308
  const fieldColumnDesc = formatMessage(this.reactIntl, MESSAGE_KEYS.EXPRESSION_FIELD_COLUMN_DESCRIPTION);
271
309
  const storageColumn = formatMessage(this.reactIntl, MESSAGE_KEYS.EXPRESSION_STORAGE_COLUMN);
@@ -274,6 +312,9 @@ export default class ExpressionSelectFieldOrFunction extends React.Component {
274
312
  id: "fields",
275
313
  locLabel: dropdownLabel,
276
314
  field_columns: {
315
+ add_column_info: {
316
+ locLabel: addNewColumn
317
+ },
277
318
  field_column_info: {
278
319
  locLabel: fieldColumn,
279
320
  descLabel: fieldColumnDesc
@@ -377,17 +418,31 @@ export default class ExpressionSelectFieldOrFunction extends React.Component {
377
418
  }
378
419
 
379
420
  if (categoryInfo) {
380
- fieldHeaders.push({
381
- key: "fieldName",
382
- label: categoryInfo.field_columns.field_column_info.locLabel,
383
- description: categoryInfo.field_columns.field_column_info.descLabel,
384
- resizable: true
385
- });
386
- valueHeader.push({
387
- key: "values",
388
- label: categoryInfo.field_columns.value_column_info.locLabel,
389
- description: categoryInfo.field_columns.value_column_info.descLabel
390
- });
421
+ fieldHeaders.push(
422
+ {
423
+ key: "addColumn",
424
+ label: formatMessage(this.reactIntl, MESSAGE_KEYS.EXPRESSION_ADD_COLUMN),
425
+ width: "50px",
426
+ staticWidth: true
427
+ },
428
+ {
429
+ key: "fieldName",
430
+ label: categoryInfo.field_columns.field_column_info.locLabel,
431
+ description: categoryInfo.field_columns.field_column_info.descLabel,
432
+ resizable: true
433
+ });
434
+ valueHeader.push(
435
+ {
436
+ key: "addColumn",
437
+ label: formatMessage(this.reactIntl, MESSAGE_KEYS.EXPRESSION_ADD_COLUMN),
438
+ width: "50px",
439
+ staticWidth: true
440
+ },
441
+ {
442
+ key: "values",
443
+ label: categoryInfo.field_columns.value_column_info.locLabel,
444
+ description: categoryInfo.field_columns.value_column_info.descLabel
445
+ });
391
446
  if (categoryInfo.field_columns.additional_column_info) {
392
447
  for (let i = 0; i < categoryInfo.field_columns.additional_column_info.length; i++) {
393
448
  sortable.push(categoryInfo.field_columns.additional_column_info[i].id);
@@ -404,8 +459,9 @@ export default class ExpressionSelectFieldOrFunction extends React.Component {
404
459
  const field = tableContents.field_value_groups[index];
405
460
  const fieldColumns = [];
406
461
  if (!this.state.fieldFilterText || this.state.fieldFilterText.length === 0 ||
407
- (field.id.toLowerCase().indexOf(this.state.fieldFilterText.toLowerCase()) > -1)) {
408
- fieldColumns.push({ column: "fieldName", content: this.createContentObject(field.id), value: field.id });
462
+ (field.id.toLowerCase().indexOf(this.state.fieldFilterText.toLowerCase()) > -1)) {
463
+ fieldColumns.push({ column: "addColumn", content: this.createAddButtonContent(index, "field"), value: field.id },
464
+ { column: "fieldName", content: this.createContentObject(field.id), value: field.id });
409
465
  if (field.additional_column_entries) {
410
466
  this._makeAdditionalColumnsContent(field, fieldColumns);
411
467
  }
@@ -453,7 +509,6 @@ export default class ExpressionSelectFieldOrFunction extends React.Component {
453
509
  rowSelection={ROW_SELECTION.SINGLE}
454
510
  updateRowSelections={this.onFieldTableClick}
455
511
  selectedRows={[selectedField]}
456
- onRowDoubleClick={this.onFieldTableDblClick}
457
512
  onSort={this.setSortColumn.bind(this, "fieldTable")}
458
513
  light={this.props.controller.getLight()}
459
514
  emptyTablePlaceholder={emptyFieldsLabel}
@@ -471,7 +526,6 @@ export default class ExpressionSelectFieldOrFunction extends React.Component {
471
526
  rowSelection={ROW_SELECTION.SINGLE}
472
527
  updateRowSelections={this.onValueTableClick}
473
528
  selectedRows={[selectedValue]}
474
- onRowDoubleClick={this.onValueTableDblClick}
475
529
  onSort={this.setSortColumn.bind(this, "valuesTable")}
476
530
  light={this.props.controller.getLight()}
477
531
  emptyTablePlaceholder={emptyValuesLabel}
@@ -504,9 +558,11 @@ export default class ExpressionSelectFieldOrFunction extends React.Component {
504
558
 
505
559
  _addValueRow(content, index, valuesTableData) {
506
560
  if (!this.state.valueFilterText || this.state.valueFilterText.length === 0 ||
507
- (String(content).toLowerCase()
508
- .indexOf(this.state.valueFilterText.toLowerCase()) > -1)) {
509
- const valueColumns = [{ column: "values", content: this.createContentObject(content), value: content }];
561
+ (String(content).toLowerCase()
562
+ .indexOf(this.state.valueFilterText.toLowerCase()) > -1)) {
563
+ const valueColumns = [
564
+ { column: "addColumn", content: this.createAddButtonContent(index, "value"), value: content },
565
+ { column: "values", content: this.createContentObject(content), value: content }];
510
566
  valuesTableData.push({ columns: valueColumns, rowKey: index });
511
567
  }
512
568
  }
@@ -597,10 +653,12 @@ export default class ExpressionSelectFieldOrFunction extends React.Component {
597
653
  MESSAGE_KEYS.EXPRESSION_FUNCTION_COLUMN);
598
654
  const returnColumn = formatMessage(this.reactIntl,
599
655
  MESSAGE_KEYS.EXPRESSION_RETURN_COLUMN);
656
+ const addNewColumn = formatMessage(this.reactIntl,
657
+ MESSAGE_KEYS.EXPRESSION_ADD_COLUMN);
600
658
 
601
-
602
- headers.push({ key: "function", label: functionColumn, width: 73, resizable: true });
603
- headers.push({ key: "return", label: returnColumn, width: 27 });
659
+ headers.push({ key: "addColumn", label: addNewColumn, width: "50px", staticWidth: true });
660
+ headers.push({ key: "function", label: functionColumn, width: 50, resizable: true });
661
+ headers.push({ key: "return", label: returnColumn, width: 30 });
604
662
  const table = this._buildFunctionTable(this.state.functionCategory);
605
663
 
606
664
  let data = table.rows;
@@ -627,7 +685,6 @@ export default class ExpressionSelectFieldOrFunction extends React.Component {
627
685
  rowSelection={ROW_SELECTION.SINGLE}
628
686
  updateRowSelections={this.onFunctionTableClick}
629
687
  selectedRows={[selectedFunction]}
630
- onRowDoubleClick={this.onFunctionTableDblClick}
631
688
  onSort={this.setSortColumn.bind(this, "functionTable")}
632
689
  light={this.props.controller.getLight()}
633
690
  emptyTablePlaceholder={functionsEmptyLabel}
@@ -650,6 +707,7 @@ export default class ExpressionSelectFieldOrFunction extends React.Component {
650
707
  if (!this.state.functionFilterText || this.state.functionFilterText.length === 0 ||
651
708
  (catFunction.locLabel.toLowerCase().indexOf(this.state.functionFilterText.toLowerCase()) > -1)) {
652
709
  const returnType = catFunction.locReturnType ? catFunction.locReturnType : catFunction.return_type;
710
+ columns.push({ column: "addColumn", content: this.createAddButtonContent(index, "function"), value: catFunction.id });
653
711
  columns.push({ column: "function", content: this.createContentObject(catFunction.locLabel), value: catFunction.locLabel });
654
712
  columns.push({ column: "return", content: this.createContentObject(returnType), value: returnType });
655
713
  table.rows.push({ columns: columns, rowKey: index });
@@ -57,7 +57,6 @@ function setExpressionInfo(inExpressionInfo) {
57
57
  if (inExpressionInfo.fields.field_categories) {
58
58
  inExpressionInfo.fields.field_categories.forEach((fieldCat) => {
59
59
  fieldCat.locLabel = l10nProvider.l10nLabel(fieldCat, fieldCat.id);
60
-
61
60
  fieldCat.field_columns.field_column_info.locLabel = l10nProvider.l10nLabel(fieldCat.field_columns.field_column_info, fieldCat.id + ".field_column_info");
62
61
  fieldCat.field_columns.value_column_info.locLabel = l10nProvider.l10nLabel(fieldCat.field_columns.value_column_info, fieldCat.id + ".value_column_info");
63
62
 
@@ -28,7 +28,7 @@ import { STATES, ACTIONS, CONDITION_TYPE, PANEL_TREE_ROOT, CONDITION_MESSAGE_TYP
28
28
  import CommandStack from "../command-stack/command-stack.js";
29
29
  import ControlFactory from "./controls/control-factory";
30
30
  import { Type, ParamRole, ControlType, ItemType } from "./constants/form-constants";
31
- import { has, cloneDeep, assign, isEmpty, isEqual, isUndefined, get, difference } from "lodash";
31
+ import { has, cloneDeep, assign, isEmpty, isEqual, isUndefined, get, difference, merge } from "lodash";
32
32
  import Form from "./form/Form";
33
33
  import { getConditionOps } from "./ui-conditions/condition-ops/condition-ops";
34
34
  import { DEFAULT_LOCALE } from "./constants/constants";
@@ -395,7 +395,8 @@ export default class PropertiesController {
395
395
  parseUiContent(this.panelTree, this.form, PANEL_TREE_ROOT);
396
396
  }
397
397
 
398
- _addToControlValues(sameParameterDefRendered, resolveParameterRefs) {
398
+ _addToControlValues(sameParameterDefRendered, resolveParameterRefs, setDefaultValues) {
399
+ const defaultControlValues = {};
399
400
  for (const keyName in this.controls) {
400
401
  if (!has(this.controls, keyName)) {
401
402
  continue;
@@ -421,8 +422,11 @@ export default class PropertiesController {
421
422
  controlValue = PropertyUtils.convertObjectStructureToArray(control.valueDef.isList, control.subControls, controlValue);
422
423
  }
423
424
 
424
- // When parameterDef is dynamically updated, don't set INITIAL_LOAD on pre-existing properties
425
- if (sameParameterDefRendered && !this.differentProperties.includes(control.name)) {
425
+ if (setDefaultValues) {
426
+ // When setDefaultValues is set, update all default values in a single call
427
+ defaultControlValues[control.name] = controlValue;
428
+ } else if (sameParameterDefRendered && !this.differentProperties.includes(control.name)) {
429
+ // When parameterDef is dynamically updated, don't set INITIAL_LOAD on pre-existing properties
426
430
  this.updatePropertyValue(propertyId, controlValue, true);
427
431
  } else {
428
432
  this.updatePropertyValue(propertyId, controlValue, true, UPDATE_TYPE.INITIAL_LOAD);
@@ -435,6 +439,12 @@ export default class PropertiesController {
435
439
  }
436
440
  }
437
441
  }
442
+
443
+ if (setDefaultValues) {
444
+ return defaultControlValues;
445
+ }
446
+
447
+ return null;
438
448
  }
439
449
 
440
450
  _populateFieldData(controlValue, control) {
@@ -1232,6 +1242,11 @@ export default class PropertiesController {
1232
1242
  }
1233
1243
  }
1234
1244
 
1245
+ if (options && options.setDefaultValues) {
1246
+ const defaultValues = this._addToControlValues(false, false, true);
1247
+ inValues = merge(defaultValues, inValues);
1248
+ }
1249
+
1235
1250
  this.propertiesStore.setPropertyValues(inValues);
1236
1251
 
1237
1252
  if (options && options.isInitProps) {
@@ -1269,10 +1284,6 @@ export default class PropertiesController {
1269
1284
  }
1270
1285
  );
1271
1286
  }
1272
-
1273
- if (options && options.setDefaultValues) {
1274
- this._addToControlValues(true);
1275
- }
1276
1287
  }
1277
1288
 
1278
1289
  /**
@@ -258,6 +258,19 @@ class CommonContextMenu extends React.Component {
258
258
  return subMenuPosStyle;
259
259
  }
260
260
 
261
+ // Returns the menu definition array passed in making sure any
262
+ // submenu items have an action. Note: some applications forget
263
+ // to do provide an action because for the submenu it is only
264
+ // used by the context menu code.
265
+ ensureAllSubMenuItemsHaveAction(menuDef) {
266
+ return menuDef.map((item, index) => {
267
+ if (item.submenu && typeof item.action === "undefined") {
268
+ return { ...item, action: "submenu_" + index };
269
+ }
270
+ return item;
271
+ });
272
+ }
273
+
261
274
  render() {
262
275
  // Reposition contextMenu so that it does not show off the screen
263
276
  const menuSize = this.calculateMenuSize(this.props.menuDefinition);
@@ -267,7 +280,8 @@ class CommonContextMenu extends React.Component {
267
280
  top: menuPos.y + "px"
268
281
  };
269
282
 
270
- const menuItems = this.buildMenu(this.props.menuDefinition, menuSize, menuPos, this.props.canvasRect);
283
+ const menuDefinition = this.ensureAllSubMenuItemsHaveAction(this.props.menuDefinition);
284
+ const menuItems = this.buildMenu(menuDefinition, menuSize, menuPos, this.props.canvasRect);
271
285
 
272
286
  return (
273
287
  <div id="context-menu-popover" className="context-menu-popover" style={posStyle} onContextMenu={this.onContextMenu}>
@@ -2302,6 +2302,18 @@ export default class ObjectModel {
2302
2302
  return port;
2303
2303
  }
2304
2304
 
2305
+ setObjectsBranchHighlight(pipelineObjIds) {
2306
+ this.store.dispatch({ type: "SET_OBJECTS_BRANCH_HIGHLIGHT", data: { pipelineObjIds: pipelineObjIds } });
2307
+ }
2308
+
2309
+ setLinksBranchHighlight(pipelineLinkIds) {
2310
+ this.store.dispatch({ type: "SET_LINKS_BRANCH_HIGHLIGHT", data: { pipelineObjIds: pipelineLinkIds } });
2311
+ }
2312
+
2313
+ unsetAllBranchHighlight() {
2314
+ this.store.dispatch({ type: "UNSET_OBJECTS_BRANCH_HIGHLIGHT" });
2315
+ }
2316
+
2305
2317
  // ---------------------------------------------------------------------------
2306
2318
  // Clipboard methods
2307
2319
  // ---------------------------------------------------------------------------
@@ -445,7 +445,9 @@ export default (state = {}, action) => {
445
445
  }
446
446
 
447
447
  case "SET_OBJECTS_STYLE":
448
- case "SET_LINKS_STYLE": {
448
+ case "SET_LINKS_STYLE":
449
+ case "SET_OBJECTS_BRANCH_HIGHLIGHT":
450
+ case "SET_LINKS_BRANCH_HIGHLIGHT": {
449
451
  const pipelineIds = Object.keys(action.data.pipelineObjIds);
450
452
  const canvasInfoPipelines = state.pipelines.map((pipeline) => {
451
453
  if (pipelineIds.indexOf(pipeline.id) > -1) {
@@ -461,6 +463,16 @@ export default (state = {}, action) => {
461
463
  return Object.assign({}, state, { pipelines: canvasInfoPipelines });
462
464
  }
463
465
 
466
+ case "UNSET_OBJECTS_BRANCH_HIGHLIGHT": {
467
+ const canvasInfoPipelines = state.pipelines.map((pipeline) => {
468
+ return Object.assign({}, pipeline, {
469
+ nodes: nodes(pipeline.nodes, action),
470
+ comments: comments(pipeline.comments, action),
471
+ links: links(pipeline.links, action) });
472
+ });
473
+ return Object.assign({}, state, { pipelines: canvasInfoPipelines });
474
+ }
475
+
464
476
  case "SET_OBJECTS_MULTI_STYLE":
465
477
  case "SET_LINKS_MULTI_STYLE": {
466
478
  const canvasInfoPipelines = state.pipelines.map((pipeline) => {
@@ -206,7 +206,6 @@ export default (state = [], action) => {
206
206
  return comment;
207
207
  });
208
208
 
209
-
210
209
  default:
211
210
  return state;
212
211
  }
@@ -251,6 +251,22 @@ export default (state = [], action) => {
251
251
  return link;
252
252
  });
253
253
 
254
+ case "SET_LINKS_BRANCH_HIGHLIGHT":
255
+ return state.map((link) => {
256
+ if (action.data.objIds.indexOf(link.id) > -1) {
257
+ return Object.assign({}, link, { branchHighlight: true });
258
+ }
259
+ return link;
260
+ });
261
+
262
+ case "UNSET_OBJECTS_BRANCH_HIGHLIGHT":
263
+ return state.map((link) => {
264
+ if (link.branchHighlight) {
265
+ return Object.assign({}, link, { branchHighlight: false });
266
+ }
267
+ return link;
268
+ });
269
+
254
270
  case "SET_LINK_DECORATIONS":
255
271
  return state.map((link, index) => {
256
272
  if (action.data.linkId === link.id) {
@@ -287,6 +287,22 @@ export default (state = [], action) => {
287
287
  return node;
288
288
  });
289
289
 
290
+ case "SET_OBJECTS_BRANCH_HIGHLIGHT":
291
+ return state.map((node) => {
292
+ if (action.data.objIds.indexOf(node.id) > -1) {
293
+ return Object.assign({}, node, { branchHighlight: true });
294
+ }
295
+ return node;
296
+ });
297
+
298
+ case "UNSET_OBJECTS_BRANCH_HIGHLIGHT":
299
+ return state.map((node) => {
300
+ if (node.branchHighlight) {
301
+ return Object.assign({}, node, { branchHighlight: false });
302
+ }
303
+ return node;
304
+ });
305
+
290
306
  case "SET_INPUT_PORT_LABEL":
291
307
  case "SET_INPUT_PORT_SUBFLOW_NODE_REF":
292
308
  return state.map((node, index) => {