@elyra/canvas 12.10.2 → 12.11.2

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 (205) hide show
  1. package/dist/canvas-constants-7f93e705.js +2 -0
  2. package/dist/canvas-constants-7f93e705.js.map +1 -0
  3. package/dist/canvas-constants-ac5daafb.js +2 -0
  4. package/dist/canvas-constants-ac5daafb.js.map +1 -0
  5. package/dist/canvas-controller-190542a6.js +2 -0
  6. package/dist/canvas-controller-190542a6.js.map +1 -0
  7. package/dist/canvas-controller-cbee8dd7.js +2 -0
  8. package/dist/canvas-controller-cbee8dd7.js.map +1 -0
  9. package/dist/canvas-logger-815781bb.js +2 -0
  10. package/dist/canvas-logger-815781bb.js.map +1 -0
  11. package/dist/canvas-logger-a0f1beaa.js +2 -0
  12. package/dist/canvas-logger-a0f1beaa.js.map +1 -0
  13. package/dist/common-canvas-8d2ddc6b.js +2 -0
  14. package/dist/common-canvas-8d2ddc6b.js.map +1 -0
  15. package/dist/common-canvas-e0a57cdb.js +2 -0
  16. package/dist/common-canvas-e0a57cdb.js.map +1 -0
  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-09ec10eb.js +2 -0
  22. package/dist/common-properties-09ec10eb.js.map +1 -0
  23. package/dist/common-properties-f1b96e0f.js +2 -0
  24. package/dist/common-properties-f1b96e0f.js.map +1 -0
  25. package/dist/datarecord-metadata-v3-schema-bda88f2e.js +2 -0
  26. package/dist/datarecord-metadata-v3-schema-bda88f2e.js.map +1 -0
  27. package/dist/datarecord-metadata-v3-schema-d7ad05cd.js +2 -0
  28. package/dist/datarecord-metadata-v3-schema-d7ad05cd.js.map +1 -0
  29. package/dist/en-2ed89528.js +2 -0
  30. package/dist/en-2ed89528.js.map +1 -0
  31. package/dist/en-e93855cc.js +2 -0
  32. package/dist/en-e93855cc.js.map +1 -0
  33. package/dist/extends-39f57612.js +7 -0
  34. package/dist/extends-39f57612.js.map +1 -0
  35. package/dist/extends-51d9ddcc.js +7 -0
  36. package/dist/extends-51d9ddcc.js.map +1 -0
  37. package/dist/flexible-table-154a3359.js +2 -0
  38. package/dist/flexible-table-154a3359.js.map +1 -0
  39. package/dist/flexible-table-5e4a1e6d.js +2 -0
  40. package/dist/flexible-table-5e4a1e6d.js.map +1 -0
  41. package/dist/icon-811ffddd.js +2 -0
  42. package/dist/icon-811ffddd.js.map +1 -0
  43. package/dist/icon-d6909a68.js +2 -0
  44. package/dist/icon-d6909a68.js.map +1 -0
  45. package/dist/index-4fd90a14.js +2 -0
  46. package/dist/index-4fd90a14.js.map +1 -0
  47. package/dist/index-6d138021.js +2 -0
  48. package/dist/index-6d138021.js.map +1 -0
  49. package/dist/isArrayLikeObject-31e5e646.js +2 -0
  50. package/dist/isArrayLikeObject-31e5e646.js.map +1 -0
  51. package/dist/isArrayLikeObject-7c33c7fd.js +2 -0
  52. package/dist/isArrayLikeObject-7c33c7fd.js.map +1 -0
  53. package/dist/lib/canvas-controller.es.js +1 -1
  54. package/dist/lib/canvas-controller.js +1 -1
  55. package/dist/lib/canvas.es.js +1 -1
  56. package/dist/lib/canvas.js +1 -1
  57. package/dist/lib/context-menu.es.js +1 -1
  58. package/dist/lib/context-menu.es.js.map +1 -1
  59. package/dist/lib/context-menu.js +1 -1
  60. package/dist/lib/context-menu.js.map +1 -1
  61. package/dist/lib/properties/field-picker.es.js +1 -1
  62. package/dist/lib/properties/field-picker.js +1 -1
  63. package/dist/lib/properties/flexible-table.es.js +1 -1
  64. package/dist/lib/properties/flexible-table.js +1 -1
  65. package/dist/lib/properties.es.js +1 -1
  66. package/dist/lib/properties.js +1 -1
  67. package/dist/lib/tooltip.es.js +1 -1
  68. package/dist/lib/tooltip.es.js.map +1 -1
  69. package/dist/lib/tooltip.js +1 -1
  70. package/dist/lib/tooltip.js.map +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-335252dd.js +2 -0
  74. package/dist/toolbar-335252dd.js.map +1 -0
  75. package/dist/toolbar-85e6c77b.js +2 -0
  76. package/dist/toolbar-85e6c77b.js.map +1 -0
  77. package/locales/command-actions/locales/en.json +7 -1
  78. package/locales/command-actions/locales/eo.json +7 -1
  79. package/locales/command-actions/locales/index.js +3 -1
  80. package/locales/command-actions/locales/ko.json +9 -0
  81. package/locales/common-canvas/locales/en.json +3 -0
  82. package/locales/common-canvas/locales/eo.json +3 -0
  83. package/locales/common-canvas/locales/index.js +3 -1
  84. package/locales/common-canvas/locales/ko.json +32 -0
  85. package/locales/common-properties/locales/index.js +3 -1
  86. package/locales/common-properties/locales/ko.json +93 -0
  87. package/locales/palette/locales/index.js +3 -1
  88. package/locales/palette/locales/ko.json +10 -0
  89. package/locales/toolbar/locales/index.js +3 -1
  90. package/locales/toolbar/locales/ko.json +8 -0
  91. package/package.json +2 -1
  92. package/src/color-picker/color-picker-panel.jsx +61 -0
  93. package/src/color-picker/color-picker.jsx +37 -0
  94. package/src/color-picker/color-picker.scss +46 -0
  95. package/src/command-actions/colorSelectedObjectsAction.js +72 -0
  96. package/src/command-actions/deleteObjectsAction.js +16 -11
  97. package/src/command-actions/pasteAction.js +50 -21
  98. package/src/common-canvas/canvas-controller.js +32 -5
  99. package/src/common-canvas/cc-bottom-panel.jsx +15 -9
  100. package/src/common-canvas/cc-contents.jsx +115 -8
  101. package/src/common-canvas/cc-toolbar.jsx +7 -6
  102. package/src/common-canvas/common-canvas-utils.js +73 -90
  103. package/src/common-canvas/common-canvas.scss +5 -5
  104. package/src/common-canvas/constants/canvas-constants.js +17 -16
  105. package/src/common-canvas/label-util.js +1 -1
  106. package/src/common-canvas/svg-canvas-d3.js +20 -107
  107. package/src/common-canvas/svg-canvas-d3.scss +66 -4
  108. package/src/common-canvas/svg-canvas-pipeline.js +201 -0
  109. package/src/common-canvas/svg-canvas-renderer.js +325 -339
  110. package/src/common-canvas/svg-canvas-utils-links.js +3 -3
  111. package/src/common-canvas/svg-canvas-utils-nodes.js +22 -44
  112. package/src/common-properties/actions.js +4 -0
  113. package/src/common-properties/components/field-picker/field-picker.jsx +33 -36
  114. package/src/common-properties/components/field-picker/field-picker.scss +20 -23
  115. package/src/common-properties/components/flexible-table/flexible-table.jsx +46 -31
  116. package/src/common-properties/components/flexible-table/flexible-table.scss +14 -17
  117. package/src/common-properties/components/properties-buttons/properties-buttons.jsx +28 -21
  118. package/src/common-properties/components/table-buttons/table-buttons.jsx +3 -1
  119. package/src/common-properties/components/table-buttons/table-buttons.scss +8 -8
  120. package/src/common-properties/components/title-editor/title-editor.jsx +31 -4
  121. package/src/common-properties/components/title-editor/title-editor.scss +30 -5
  122. package/src/common-properties/components/virtualized-table/virtualized-table.jsx +119 -27
  123. package/src/common-properties/components/virtualized-table/virtualized-table.scss +72 -8
  124. package/src/common-properties/constants/constants.js +5 -1
  125. package/src/common-properties/constants/form-constants.js +1 -0
  126. package/src/common-properties/controls/abstract-table.jsx +12 -11
  127. package/src/common-properties/controls/abstract-table.scss +6 -2
  128. package/src/common-properties/controls/dropdown/dropdown.scss +4 -0
  129. package/src/common-properties/controls/expression/expression-builder/expression-select-field-function.jsx +2 -2
  130. package/src/common-properties/controls/expression/expression.scss +1 -1
  131. package/src/common-properties/controls/passwordfield/passwordfield.jsx +2 -2
  132. package/src/common-properties/controls/readonlytable/readonlytable.jsx +4 -2
  133. package/src/common-properties/controls/selectcolumns/selectcolumns.scss +0 -19
  134. package/src/common-properties/controls/someofselect/someofselect.scss +2 -2
  135. package/src/common-properties/form/ControlInfo.js +8 -0
  136. package/src/common-properties/form/EditorForm.js +4 -0
  137. package/src/common-properties/form/ParameterInfo.js +4 -0
  138. package/src/common-properties/panels/sub-panel/cell.jsx +18 -23
  139. package/src/common-properties/panels/sub-panel/sub-panel.scss +5 -22
  140. package/src/common-properties/properties-controller.js +18 -0
  141. package/src/common-properties/properties-main/properties-main.jsx +15 -9
  142. package/src/common-properties/properties-main/properties-main.scss +9 -2
  143. package/src/common-properties/properties-store.js +27 -1
  144. package/src/common-properties/reducers/properties-settings.js +17 -1
  145. package/src/context-menu/common-context-menu.jsx +74 -29
  146. package/src/context-menu/context-menu-wrapper.jsx +2 -2
  147. package/src/icons/icon.jsx +5 -46
  148. package/src/index.scss +1 -0
  149. package/src/object-model/api-pipeline.js +18 -7
  150. package/src/object-model/object-model.js +27 -3
  151. package/src/object-model/redux/reducers/canvasinfo.js +36 -0
  152. package/src/object-model/redux/reducers/comments.js +58 -10
  153. package/src/object-model/redux/reducers/externalpipelineflows.js +1 -0
  154. package/src/object-model/redux/reducers/links.js +9 -7
  155. package/src/object-model/redux/reducers/selectioninfo.js +2 -1
  156. package/src/palette/palette-content-list-item.jsx +8 -1
  157. package/src/palette/palette-dialog-content-grid-node.jsx +8 -1
  158. package/src/toolbar/toolbar-action-item.jsx +75 -11
  159. package/src/toolbar/toolbar-overflow-item.jsx +2 -3
  160. package/src/tooltip/tooltip.jsx +4 -1
  161. package/stats.html +1 -1
  162. package/dist/canvas-constants-af93267a.js +0 -2
  163. package/dist/canvas-constants-af93267a.js.map +0 -1
  164. package/dist/canvas-constants-ffce3b78.js +0 -2
  165. package/dist/canvas-constants-ffce3b78.js.map +0 -1
  166. package/dist/canvas-controller-3f67c4fb.js +0 -2
  167. package/dist/canvas-controller-3f67c4fb.js.map +0 -1
  168. package/dist/canvas-controller-cee447d2.js +0 -2
  169. package/dist/canvas-controller-cee447d2.js.map +0 -1
  170. package/dist/common-canvas-e212a9c1.js +0 -2
  171. package/dist/common-canvas-e212a9c1.js.map +0 -1
  172. package/dist/common-canvas-e98191b3.js +0 -2
  173. package/dist/common-canvas-e98191b3.js.map +0 -1
  174. package/dist/common-properties-653e50e3.js +0 -2
  175. package/dist/common-properties-653e50e3.js.map +0 -1
  176. package/dist/common-properties-e2c6def7.js +0 -2
  177. package/dist/common-properties-e2c6def7.js.map +0 -1
  178. package/dist/datarecord-metadata-v3-schema-10ddafaf.js +0 -2
  179. package/dist/datarecord-metadata-v3-schema-10ddafaf.js.map +0 -1
  180. package/dist/datarecord-metadata-v3-schema-1504c843.js +0 -2
  181. package/dist/datarecord-metadata-v3-schema-1504c843.js.map +0 -1
  182. package/dist/en-517f38fc.js +0 -2
  183. package/dist/en-517f38fc.js.map +0 -1
  184. package/dist/en-dc6f2e9f.js +0 -2
  185. package/dist/en-dc6f2e9f.js.map +0 -1
  186. package/dist/extends-5a45f92e.js +0 -7
  187. package/dist/extends-5a45f92e.js.map +0 -1
  188. package/dist/extends-a52336ca.js +0 -8
  189. package/dist/extends-a52336ca.js.map +0 -1
  190. package/dist/flexible-table-e6ccbe58.js +0 -2
  191. package/dist/flexible-table-e6ccbe58.js.map +0 -1
  192. package/dist/flexible-table-f60c1680.js +0 -2
  193. package/dist/flexible-table-f60c1680.js.map +0 -1
  194. package/dist/index-567978da.js +0 -2
  195. package/dist/index-567978da.js.map +0 -1
  196. package/dist/index-59486e9a.js +0 -2
  197. package/dist/index-59486e9a.js.map +0 -1
  198. package/dist/isEmpty-def8f509.js +0 -2
  199. package/dist/isEmpty-def8f509.js.map +0 -1
  200. package/dist/isEmpty-e171b734.js +0 -2
  201. package/dist/isEmpty-e171b734.js.map +0 -1
  202. package/dist/toolbar-404bf690.js +0 -2
  203. package/dist/toolbar-404bf690.js.map +0 -1
  204. package/dist/toolbar-611d8ab9.js +0 -2
  205. package/dist/toolbar-611d8ab9.js.map +0 -1
@@ -20,6 +20,7 @@ import PropTypes from "prop-types";
20
20
  import { MenuItem, SubMenu } from "react-contextmenu";
21
21
  import Icon from "../icons/icon.jsx";
22
22
  import { CONTEXT_MENU_CARBON_ICONS } from "../common-canvas/constants/canvas-constants";
23
+ import ColorPickerPanel from "../color-picker/color-picker-panel.jsx";
23
24
 
24
25
  // context-menu sizing
25
26
  const CONTEXT_MENU_WIDTH = 160; // see context-menu.css .react-context-menu margin
@@ -33,6 +34,7 @@ class CommonContextMenu extends React.Component {
33
34
  super(props);
34
35
  this.state = {};
35
36
  this.itemSelected = this.itemSelected.bind(this);
37
+ this.colorClicked = this.colorClicked.bind(this);
36
38
  }
37
39
 
38
40
  onContextMenu(e) {
@@ -48,6 +50,10 @@ class CommonContextMenu extends React.Component {
48
50
  }
49
51
  }
50
52
 
53
+ colorClicked(color) {
54
+ this.props.contextHandler("colorSelectedObjects", { color });
55
+ }
56
+
51
57
  calculateMenuSize(menu) {
52
58
  var numDividers = 0;
53
59
  for (let i = 0; i < menu.length; ++i) {
@@ -129,40 +135,28 @@ class CommonContextMenu extends React.Component {
129
135
 
130
136
  } else if (submenu) {
131
137
  previousDivider = false;
132
- const submenuItems = this.buildMenu(menuDefinition[i].menu, menuSize, menuPos, canvasRect);
133
- const disabled = { disabled: this.areAllSubmenuItemsDisabled(menuDefinition[i].menu) };
134
- const submenuSize = this.calculateMenuSize(menuDefinition[i].menu);
135
- let rtl = false;
136
-
137
- // Ensure that the combined menu position, plus the menu width,
138
- // plus the submenu width, does not exceed the viewport bounds.
139
- if (menuPos.x + menuSize.width + submenuSize.width > canvasRect.right) {
140
- rtl = true;
141
- }
138
+ if (menuDefinition[i].menu === "colorPicker") {
139
+ const disabled = false;
140
+ const subMenuSize = { width: CONTEXT_MENU_WIDTH, height: 50 };
141
+ const subMenuContent = this.buildColorPickerPanel();
142
142
 
143
- // Does the submenu go below the bottom of the viewport?
144
- const y = canvasRect.bottom - (menuPos.y + runningYPos + submenuSize.height);
143
+ const subMenu = this.buildSubMenu(
144
+ menuDefinition, i, subMenuContent, runningYPos, menuPos, menuSize, subMenuSize, canvasRect, disabled);
145
+ menuItems.push(subMenu);
145
146
 
146
- // If submenu is not below the viewport bottom set offset to 0 so the
147
- // submenu will not be moved. Otherwise, y will be used to move the
148
- // submenu up fully into the view port.
149
- const offset = (y > 0) ? 0 : y - EXTRA_OFFSET;
147
+ runningYPos += CONTEXT_MENU_LINK_HEIGHT;
150
148
 
151
- const subMenuPosStyle = {
152
- top: offset + "px" // Use negative to push the menu up
153
- };
149
+ } else {
150
+ const disabled = { disabled: this.areAllSubmenuItemsDisabled(menuDefinition[i].menu) };
151
+ const subMenuSize = this.calculateMenuSize(menuDefinition[i].menu);
152
+ const subMenuContent = this.buildMenu(menuDefinition[i].menu, menuSize, menuPos, canvasRect);
154
153
 
155
- const icon = <Icon type={CONTEXT_MENU_CARBON_ICONS.CHEVRONARROWS.RIGHT} disabled={false} className={"react-contextmenu-submenu-icon"} />;
156
- const menuItem = <div>{menuDefinition[i].label}{icon} </div>;
154
+ const subMenu = this.buildSubMenu(
155
+ menuDefinition, i, subMenuContent, runningYPos, menuPos, menuSize, subMenuSize, canvasRect, disabled);
156
+ menuItems.push(subMenu);
157
157
 
158
- menuItems.push(
159
- <SubMenu title={menuItem} key={i + 1} className="contextmenu-submenu" rtl={rtl} {...disabled}>
160
- <div key={i + 1} style={subMenuPosStyle} className="context-menu-popover">
161
- {submenuItems}
162
- </div>
163
- </SubMenu>
164
- );
165
- runningYPos += CONTEXT_MENU_LINK_HEIGHT;
158
+ runningYPos += CONTEXT_MENU_LINK_HEIGHT;
159
+ }
166
160
 
167
161
  } else {
168
162
  previousDivider = false;
@@ -178,6 +172,57 @@ class CommonContextMenu extends React.Component {
178
172
  return menuItems;
179
173
  }
180
174
 
175
+ buildColorPickerPanel() {
176
+ return (
177
+ <ColorPickerPanel clickActionHandler={this.colorPickHandler} clickActionHandler={this.colorClicked} />
178
+ );
179
+ }
180
+
181
+ buildSubMenu(menuDefinition, index, subMenuContent, runningYPos, menuPos,
182
+ menuSize, subMenuSize, canvasRect, disabled) {
183
+ const rtl = this.buildRtlState(menuPos, menuSize, subMenuSize, canvasRect);
184
+ const subMenuPosStyle = this.buildSubMenuPosStyle(runningYPos, menuPos, subMenuSize, canvasRect);
185
+
186
+ const icon = <Icon type={CONTEXT_MENU_CARBON_ICONS.CHEVRONARROWS.RIGHT} disabled={false} className={"react-contextmenu-submenu-icon"} />;
187
+ const menuItem = <div>{menuDefinition[index].label}{icon} </div>;
188
+
189
+ return (
190
+ <SubMenu title={menuItem} key={index + 1} className="contextmenu-submenu" rtl={rtl} {...disabled}>
191
+ <div key={index + 1} style={subMenuPosStyle} className="context-menu-popover">
192
+ {subMenuContent}
193
+ </div>
194
+ </SubMenu>
195
+ );
196
+ }
197
+
198
+ // Returns a boolean to indicate whether the submenu should appear on the
199
+ // right of the context menu (rtl === false) or on the left of the context
200
+ // menu (rtl === true).
201
+ buildRtlState(menuPos, menuSize, subMenuSize, canvasRect) {
202
+ // Ensure that the combined menu position, plus the menu width,
203
+ // plus the submenu width, does not exceed the viewport bounds.
204
+ return (menuPos.x + menuSize.width + subMenuSize.width > canvasRect.right);
205
+
206
+ }
207
+
208
+ // Returns a style object that can be applied to the sub-menu to adjust
209
+ // its vertical (y) position. This may be necessary if the submenu is tall
210
+ // enough that it would be displayed off the bottom of the canvas area.
211
+ buildSubMenuPosStyle(runningYPos, menuPos, subMenuSize, canvasRect) {
212
+ // Does the submenu go below the bottom of the viewport?
213
+ const y = canvasRect.bottom - (menuPos.y + runningYPos + subMenuSize.height);
214
+
215
+ // If submenu is not below the viewport bottom set offset to 0 so the
216
+ // submenu will not be moved. Otherwise, y will be used to move the
217
+ // submenu up fully into the view port.
218
+ const offset = (y > 0) ? 0 : y - EXTRA_OFFSET;
219
+
220
+ const subMenuPosStyle = {
221
+ top: offset + "px" // Use negative to push the menu up
222
+ };
223
+ return subMenuPosStyle;
224
+ }
225
+
181
226
  render() {
182
227
  // Reposition contextMenu so that it does not show off the screen
183
228
  const menuSize = this.calculateMenuSize(this.props.menuDefinition);
@@ -83,8 +83,8 @@ export default class ContextMenuWrapper extends React.Component {
83
83
  }
84
84
  }
85
85
 
86
- contextMenuClicked(action) {
87
- this.props.contextMenuActionHandler(action);
86
+ contextMenuClicked(action, param) {
87
+ this.props.contextMenuActionHandler(action, param);
88
88
  }
89
89
 
90
90
  render() {
@@ -19,30 +19,21 @@ import PropTypes from "prop-types";
19
19
  import classNames from "classnames";
20
20
  import SVG from "react-inlinesvg";
21
21
 
22
- import ArrangeHorizontally from "./../../assets/images/arrange_horizontally.svg";
23
- import ArrangeVertically from "./../../assets/images/arrange_vertically.svg";
24
22
  import Double from "./../../assets/images/double.svg";
25
23
  import Integer from "./../../assets/images/integer.svg";
26
24
  import StringIcon from "./../../assets/images/string.svg";
27
- import ToggleNotificationPanel from "./../../assets/images/notification_counter_icon.svg";
28
- import PaletteClose from "./../../assets/images/palette/palette_close.svg";
29
- import PaletteOpen from "./../../assets/images/palette/palette_open.svg";
30
- import ZoomToFit from "./../../assets/images/zoom_to_fit.svg";
31
25
 
32
26
  import { WarningFilled16, ErrorFilled16, CheckmarkFilled16, InformationFilled16, Information16,
33
27
  ChevronDown16, ChevronUp16, ChevronLeft16, ChevronRight16,
34
- OverflowMenuVertical16,
35
28
  AddAlt16,
36
29
  Settings16,
37
30
  Search16,
38
31
  Warning16,
39
32
  Edit16,
40
- StopFilledAlt16, Play16, Undo16, Redo16, Cut16, Copy16, Paste16, AddComment16, TrashCan16,
41
- ZoomIn16, ZoomOut16,
42
33
  CircleDash16, RulerAlt16, ListNumbered16, ListBulleted16, Flag16, ChartVennDiagram16,
43
34
  Calendar16, Time16, EventSchedule16 } from "@carbon/icons-react";
44
35
 
45
- import { ERROR, WARNING, INFO, SUCCESS, CANVAS_CARBON_ICONS, CONTEXT_MENU_CARBON_ICONS, TOOLBAR_ACTIONS } from "../common-canvas/constants/canvas-constants";
36
+ import { ERROR, WARNING, INFO, SUCCESS, CANVAS_CARBON_ICONS, CONTEXT_MENU_CARBON_ICONS } from "../common-canvas/constants/canvas-constants";
46
37
  import { CONDITION_MESSAGE_TYPE, CARBON_ICONS, DATA_TYPE } from "../common-properties/constants/constants";
47
38
 
48
39
  const iconClassName = "properties-icon";
@@ -51,20 +42,14 @@ export default class Icon extends React.Component {
51
42
  constructor() {
52
43
  super();
53
44
  this.canvasIcons = {
54
- arrangeHorizontally: ArrangeHorizontally,
55
- arrangeVertically: ArrangeVertically,
56
45
  double: Double,
57
46
  integer: Integer,
58
- string: StringIcon,
59
- toggleNotificationPanel: ToggleNotificationPanel,
60
- paletteClose: PaletteClose,
61
- paletteOpen: PaletteOpen,
62
- zoomToFit: ZoomToFit
47
+ string: StringIcon
63
48
  };
64
49
  }
65
50
 
66
51
  getCarbonIcon(type, customClassName) {
67
- const className = this.props.noAddedClasses ? null : iconClassName + " " + customClassName;
52
+ const className = iconClassName + " " + customClassName;
68
53
 
69
54
  switch (type) {
70
55
  case (ERROR):
@@ -97,8 +82,6 @@ export default class Icon extends React.Component {
97
82
  case (CARBON_ICONS.EDIT):
98
83
  return <Edit16 className={className} disabled={this.props.disabled} />;
99
84
 
100
- case (CANVAS_CARBON_ICONS.OVERFLOWMENU):
101
- return <OverflowMenuVertical16 className={className} disabled={this.props.disabled} />;
102
85
  case (CANVAS_CARBON_ICONS.SEARCH):
103
86
  return <Search16 className={className} disabled={this.props.disabled} />;
104
87
  case (CANVAS_CARBON_ICONS.WARNING_UNFILLED):
@@ -107,29 +90,6 @@ export default class Icon extends React.Component {
107
90
  case (CONTEXT_MENU_CARBON_ICONS.CHEVRONARROWS.RIGHT):
108
91
  return <ChevronRight16 className={className} disabled={this.props.disabled} />;
109
92
 
110
- case (TOOLBAR_ACTIONS.TOOLBAR_STOP):
111
- return <StopFilledAlt16 className={className} disabled={this.props.disabled} />;
112
- case (TOOLBAR_ACTIONS.TOOLBAR_RUN):
113
- return <Play16 className={className} disabled={this.props.disabled} />;
114
- case (TOOLBAR_ACTIONS.TOOLBAR_UNDO):
115
- return <Undo16 className={className} disabled={this.props.disabled} />;
116
- case (TOOLBAR_ACTIONS.TOOLBAR_REDO):
117
- return <Redo16 className={className} disabled={this.props.disabled} />;
118
- case (TOOLBAR_ACTIONS.TOOLBAR_CUT):
119
- return <Cut16 className={className} disabled={this.props.disabled} />;
120
- case (TOOLBAR_ACTIONS.TOOLBAR_COPY):
121
- return <Copy16 className={className} disabled={this.props.disabled} />;
122
- case (TOOLBAR_ACTIONS.TOOLBAR_PASTE):
123
- return <Paste16 className={className} disabled={this.props.disabled} />;
124
- case (TOOLBAR_ACTIONS.TOOLBAR_CREATE_AUTO_COMMENT):
125
- return <AddComment16 className={className} disabled={this.props.disabled} />;
126
- case (TOOLBAR_ACTIONS.TOOLBAR_DELETE_SELECTED_OBJECTS):
127
- return <TrashCan16 className={className} disabled={this.props.disabled} />;
128
- case (TOOLBAR_ACTIONS.TOOLBAR_ZOOM_IN):
129
- return <ZoomIn16 className={className} disabled={this.props.disabled} />;
130
- case (TOOLBAR_ACTIONS.TOOLBAR_ZOOM_OUT):
131
- return <ZoomOut16 className={className} disabled={this.props.disabled} />;
132
-
133
93
  case (CARBON_ICONS.MEASUREMENTS.EMPTY):
134
94
  return <CircleDash16 className={className} disabled={this.props.disabled} />;
135
95
  case (CARBON_ICONS.MEASUREMENTS.SCALE):
@@ -163,7 +123,7 @@ export default class Icon extends React.Component {
163
123
  if (!icon) {
164
124
  icon = this.getCanvasIcon(this.props.type);
165
125
  if (typeof icon !== "undefined") {
166
- const className = this.props.noAddedClasses ? null : classNames("canvas-icon", iconClassName, this.props.className);
126
+ const className = classNames("canvas-icon", iconClassName, this.props.className);
167
127
  icon = <SVG src={icon} className={className} disabled={this.props.disabled} />;
168
128
  } else {
169
129
  icon = <div />;
@@ -181,6 +141,5 @@ Icon.defaultProps = {
181
141
  Icon.propTypes = {
182
142
  type: PropTypes.string.isRequired,
183
143
  className: PropTypes.string,
184
- disabled: PropTypes.bool,
185
- noAddedClasses: PropTypes.bool
144
+ disabled: PropTypes.bool
186
145
  };
package/src/index.scss CHANGED
@@ -26,3 +26,4 @@
26
26
  @import "./palette/palette.scss";
27
27
  @import "./common-canvas/common-canvas.scss";
28
28
  @import "./common-canvas/svg-canvas-d3.scss";
29
+ @import "./color-picker/color-picker.scss";
@@ -100,6 +100,18 @@ export default class APIPipeline {
100
100
  }, data);
101
101
  }
102
102
 
103
+ addPastedObjects(data) {
104
+ this.objectModel.executeWithSelectionChange((inData) => {
105
+ this.store.dispatch({ type: "ADD_PASTED_OBJECTS", data: inData, pipelineId: this.pipelineId });
106
+ }, data);
107
+ }
108
+
109
+ deletePastedObjects(data) {
110
+ this.objectModel.executeWithSelectionChange((inData) => {
111
+ this.store.dispatch({ type: "DELETE_PASTED_OBJECTS", data: inData, pipelineId: this.pipelineId });
112
+ }, data);
113
+ }
114
+
103
115
  // Returns an object containing and array of nodes and an array of comments
104
116
  // that match the array of objectIds passed in.
105
117
  filterNodesAndComments(objectIds) {
@@ -128,6 +140,10 @@ export default class APIPipeline {
128
140
  this.store.dispatch({ type: "SET_OBJECTS_CLASS_NAME", data: { objIds: objectIds, newClassName: newClassName }, pipelineId: this.pipelineId });
129
141
  }
130
142
 
143
+ setObjectsColorClassName(objectIds, newColorClass) {
144
+ this.store.dispatch({ type: "SET_OBJECTS_COLOR_CLASS_NAME", data: { objIds: objectIds, newColorClass: newColorClass }, pipelineId: this.pipelineId });
145
+ }
146
+
131
147
  disconnectObjects(objectIds) {
132
148
  let linksToDelete = [];
133
149
  objectIds.forEach((id) => {
@@ -291,7 +307,7 @@ export default class APIPipeline {
291
307
  createNode(data) {
292
308
  let nodeTemplate = data.nodeTemplate;
293
309
  // If the nodeTemplate has app_data.ui_data field then it will be a
294
- // teamplate that conforms to the pipelineFlow schema and needs to be
310
+ // template that conforms to the pipelineFlow schema and needs to be
295
311
  // converted to the internal format for a node.
296
312
  if (has(data.nodeTemplate, "app_data.ui_data")) {
297
313
  nodeTemplate = this.objectModel.convertNodeTemplate(nodeTemplate);
@@ -624,8 +640,7 @@ export default class APIPipeline {
624
640
  }
625
641
 
626
642
  isDataNode(objId) {
627
- const node = this.getNode(objId);
628
- return (typeof node !== "undefined"); // node will be undefined if objId references a comment
643
+ return this.getNode(objId);
629
644
  }
630
645
 
631
646
  sizeAndPositionObjects(objectsInfo, linksInfo) {
@@ -977,7 +992,6 @@ export default class APIPipeline {
977
992
  createComment(source) {
978
993
  let comment = {
979
994
  id: this.objectModel.getUniqueId(CREATE_COMMENT),
980
- class_name: "d3-comment-rect",
981
995
  content: "",
982
996
  height: 42,
983
997
  width: 175,
@@ -1001,9 +1015,6 @@ export default class APIPipeline {
1001
1015
  }
1002
1016
 
1003
1017
  addComment(data) {
1004
- if (typeof data.selectedObjectIds === "undefined") {
1005
- data.selectedObjectIds = [];
1006
- }
1007
1018
  this.store.dispatch({ type: "ADD_COMMENT", data: data, pipelineId: this.pipelineId });
1008
1019
  }
1009
1020
 
@@ -246,6 +246,7 @@ export default class ObjectModel {
246
246
  : PipelineInHandler.convertPipelinesToCanvasInfoPipelines(pd, this.getCanvasLayout());
247
247
  // Need to make sure pipeline IDs are unique.
248
248
  newPd = this.cloneSupernodeContents(supernode, newPd);
249
+ newPd = this.prepareNodes(newPd, this.getNodeLayout(), this.getCanvasLayout(), supernode);
249
250
 
250
251
  } else {
251
252
  const newPipeline = this.createEmptyPipeline();
@@ -256,6 +257,28 @@ export default class ObjectModel {
256
257
  return supernode;
257
258
  }
258
259
 
260
+ // Returns an object containing nodes and pipelines. The nodes are the
261
+ // same as the array of nodes passed in except that, any supernodes within
262
+ // the array will have their app_data.pipeline_data fields removed. The
263
+ // pipelines returned will be any pipelines that were contained within the
264
+ // app_data.pipeline_data fields.
265
+ extractAddDataPipelines(inNodes) {
266
+ const pipelines = [];
267
+ const nodes = [];
268
+ inNodes.forEach((n) => {
269
+ if (CanvasUtils.isSupernode(n)) {
270
+ const pDataArray = get(n, "app_data.pipeline_data");
271
+ if (pDataArray) {
272
+ pipelines.push(...pDataArray);
273
+ delete n.app_data.pipeline_data;
274
+ }
275
+ }
276
+ nodes.push(n);
277
+ });
278
+
279
+ return { nodes, pipelines };
280
+ }
281
+
259
282
  getPaletteNode(nodeOpIdRef) {
260
283
  let outNodeType = null;
261
284
  if (nodeOpIdRef && !isEmpty(this.getPaletteData())) {
@@ -1636,7 +1659,9 @@ export default class ObjectModel {
1636
1659
  setSelections(newSelections, pipelineId) {
1637
1660
  // This will return the default API pipeline if a pipelineId is not provided.
1638
1661
  const selPipelineId = this.getAPIPipeline(pipelineId).pipelineId;
1639
- this.executeWithSelectionChange(this.store.dispatch, { type: "SET_SELECTIONS", data: { pipelineId: selPipelineId, selections: newSelections } });
1662
+ this.executeWithSelectionChange(
1663
+ this.store.dispatch, { type: "SET_SELECTIONS", data: { selections: newSelections }, pipelineId: selPipelineId }
1664
+ );
1640
1665
  }
1641
1666
 
1642
1667
  deleteSelectedObjects() {
@@ -1732,11 +1757,10 @@ export default class ObjectModel {
1732
1757
  return connectedNodesIdsGroup.length === nodeIds.length;
1733
1758
  }
1734
1759
 
1735
- // Returns true if all the selected objcts are links.
1760
+ // Returns true if all the selected objects are links.
1736
1761
  areAllSelectedObjectsLinks() {
1737
1762
  const nonLinkIndex = this.getSelectedObjects().findIndex((selObj) => !this.isLink(selObj));
1738
1763
  return nonLinkIndex === -1;
1739
-
1740
1764
  }
1741
1765
 
1742
1766
  // Recursive function to add all connected nodes into the group.
@@ -162,6 +162,7 @@ export default (state = {}, action) => {
162
162
  case "REMOVE_NODE_ATTR":
163
163
  case "SET_NODE_LABEL":
164
164
  case "SET_OBJECTS_CLASS_NAME":
165
+ case "SET_OBJECTS_COLOR_CLASS_NAME":
165
166
  case "SET_INPUT_PORT_LABEL":
166
167
  case "SET_OUTPUT_PORT_LABEL":
167
168
  case "SET_INPUT_PORT_SUBFLOW_NODE_REF":
@@ -236,6 +237,7 @@ export default (state = {}, action) => {
236
237
  return Object.assign({}, state, { pipelines: canvasInfoPipelines });
237
238
  }
238
239
 
240
+ case "ADD_PASTED_OBJECTS":
239
241
  case "ADD_AND_UPDATE_OBJECTS": {
240
242
  let canvasInfoPipelines = state.pipelines
241
243
  .map((pipeline) => {
@@ -277,6 +279,36 @@ export default (state = {}, action) => {
277
279
  return Object.assign({}, state, { pipelines: canvasInfoPipelines });
278
280
  }
279
281
 
282
+ case "DELETE_PASTED_OBJECTS": {
283
+ const canvasInfoPipelines = state.pipelines
284
+ // Filter out the pipelines to delete
285
+ .filter((pipeline) => (!isPipelineToDelete(pipeline, action.data.pipelinesToDelete)))
286
+ // Modify the pipeline to remove nodes, comments and links
287
+ .map((pipeline) => {
288
+ if (pipeline.id === action.pipelineId) {
289
+ // Remove pasted nodes
290
+ const newNodes = nodes(pipeline.nodes,
291
+ { type: "DELETE_NODES", data: action.data });
292
+
293
+ // Remove pasted comments
294
+ const newComments = comments(pipeline.comments,
295
+ { type: "DELETE_COMMENTS", data: action.data });
296
+
297
+ // Remove pasted links
298
+ const newLinks = links(pipeline.links,
299
+ { type: "REMOVE_LINKS", data: action.data });
300
+
301
+ return Object.assign({}, pipeline, {
302
+ nodes: newNodes,
303
+ comments: newComments,
304
+ links: newLinks });
305
+ }
306
+ return pipeline;
307
+ });
308
+
309
+ return Object.assign({}, state, { pipelines: canvasInfoPipelines });
310
+ }
311
+
280
312
  case "SET_SUPERNODE_EXPAND_STATE": {
281
313
  const canvasInfoPipelines = state.pipelines
282
314
  .map((pipeline) => {
@@ -476,3 +508,7 @@ export default (state = {}, action) => {
476
508
  return state;
477
509
  }
478
510
  };
511
+
512
+ function isPipelineToDelete(pipeline, pipelinesToDelete) {
513
+ return (pipelinesToDelete.some((p) => p.id === pipeline.id));
514
+ }
@@ -15,6 +15,9 @@
15
15
  */
16
16
  /* eslint arrow-body-style: ["off"] */
17
17
 
18
+
19
+ import CanvasUtils from "../../../common-canvas/common-canvas-utils.js";
20
+
18
21
  export default (state = [], action) => {
19
22
  switch (action.type) {
20
23
  case "MOVE_OBJECTS":
@@ -53,15 +56,7 @@ export default (state = [], action) => {
53
56
 
54
57
 
55
58
  case "ADD_COMMENT": {
56
- const newComment = {
57
- id: action.data.id,
58
- class_name: action.data.class_name,
59
- content: action.data.content,
60
- height: action.data.height,
61
- width: action.data.width,
62
- x_pos: action.data.x_pos,
63
- y_pos: action.data.y_pos
64
- };
59
+ const newComment = getCommentFromData(action.data);
65
60
  return [
66
61
  ...state,
67
62
  newComment
@@ -69,9 +64,10 @@ export default (state = [], action) => {
69
64
  }
70
65
 
71
66
  case "ADD_COMMENTS": {
67
+ const comments = action.data.commentsToAdd.map((cd) => getCommentFromData(cd));
72
68
  return [
73
69
  ...state,
74
- ...action.data.commentsToAdd
70
+ ...comments
75
71
  ];
76
72
  }
77
73
 
@@ -139,6 +135,20 @@ export default (state = [], action) => {
139
135
  return comment;
140
136
  });
141
137
 
138
+ case "SET_OBJECTS_COLOR_CLASS_NAME":
139
+ return state.map((comment) => {
140
+ const idx = action.data.objIds.indexOf(comment.id);
141
+ if (idx > -1) {
142
+ const newColorClass =
143
+ Array.isArray(action.data.newColorClass) ? (action.data.newColorClass[idx] || null) : action.data.newColorClass;
144
+ const className = replaceColorClass(comment.class_name, newColorClass);
145
+ const newComment = Object.assign({}, comment, { class_name: className });
146
+ return newComment;
147
+ }
148
+ return comment;
149
+ });
150
+
151
+
142
152
  case "SET_OBJECTS_CLASS_NAME":
143
153
  return state.map((comment) => {
144
154
  const idx = action.data.objIds.indexOf(comment.id);
@@ -201,3 +211,41 @@ export default (state = [], action) => {
201
211
  return state;
202
212
  }
203
213
  };
214
+
215
+ function replaceColorClass(className, newColorClass) {
216
+ let cn = "";
217
+ if (className) {
218
+ cn = removeCurrentColorClass(className);
219
+ cn = addNewColorClass(cn, newColorClass);
220
+ } else {
221
+ cn = newColorClass;
222
+ }
223
+ return cn;
224
+ }
225
+
226
+ function removeCurrentColorClass(className) {
227
+ const cn = className
228
+ .split(" ")
229
+ .filter((tok) => !CanvasUtils.getBkgColorClass(tok))
230
+ .join(" ");
231
+ return cn;
232
+ }
233
+
234
+ function addNewColorClass(className, newColorClass) {
235
+ return className ? className + " " + newColorClass : newColorClass;
236
+ }
237
+
238
+ function getCommentFromData(data) {
239
+ const newComment = {
240
+ id: data.id,
241
+ content: data.content,
242
+ height: data.height,
243
+ width: data.width,
244
+ x_pos: data.x_pos,
245
+ y_pos: data.y_pos
246
+ };
247
+ if (typeof data.class_name !== "undefined") {
248
+ newComment.class_name = data.class_name;
249
+ }
250
+ return newComment;
251
+ }
@@ -46,6 +46,7 @@ export default (state = [], action) => {
46
46
  return [...state, ...action.data.extPipelineFlowsToAdd];
47
47
  }
48
48
 
49
+ case "DELETE_PASTED_OBJECTS":
49
50
  case "DELETE_OBJECTS_AND_UPDATE":
50
51
  case "DELETE_SUPERNODES": {
51
52
  return state.filter((epf) => {
@@ -287,14 +287,16 @@ export default (state = [], action) => {
287
287
  // to each of the selected nodes.
288
288
  case "ADD_COMMENT": {
289
289
  const createdLinks = [];
290
- action.data.selectedObjectIds.forEach((objId, i) => {
291
- createdLinks.push({
292
- id: action.data.linkIds[i],
293
- srcNodeId: action.data.id,
294
- trgNodeId: action.data.selectedObjectIds[i],
295
- type: COMMENT_LINK
290
+ if (action.data.selectedObjectIds) {
291
+ action.data.selectedObjectIds.forEach((objId, i) => {
292
+ createdLinks.push({
293
+ id: action.data.linkIds[i],
294
+ srcNodeId: action.data.id,
295
+ trgNodeId: action.data.selectedObjectIds[i],
296
+ type: COMMENT_LINK
297
+ });
296
298
  });
297
- });
299
+ }
298
300
  return [
299
301
  ...state,
300
302
  ...createdLinks
@@ -29,9 +29,10 @@ export default (state = {}, action) => {
29
29
  case "CLEAR_SELECTIONS":
30
30
  return {};
31
31
 
32
+ case "ADD_PASTED_OBJECTS":
32
33
  case "SET_SELECTIONS":
33
34
  return {
34
- pipelineId: action.data.pipelineId,
35
+ pipelineId: action.pipelineId,
35
36
  selections: [...action.data.selections]
36
37
  };
37
38
 
@@ -42,6 +42,7 @@ class PaletteContentListItem extends React.Component {
42
42
  this.showShortDescription = this.showShortDescription.bind(this);
43
43
 
44
44
  this.onDragStart = this.onDragStart.bind(this);
45
+ this.onDragEnd = this.onDragEnd.bind(this);
45
46
  this.onDoubleClick = this.onDoubleClick.bind(this);
46
47
  this.onMouseOver = this.onMouseOver.bind(this);
47
48
  this.onMouseLeave = this.onMouseLeave.bind(this);
@@ -61,7 +62,7 @@ class PaletteContentListItem extends React.Component {
61
62
  // We cannot use the dataTransfer object for the nodeTemplate because
62
63
  // the dataTransfer data is not available during dragOver events so we set
63
64
  // the nodeTemplate into the canvas controller.
64
- this.props.canvasController.setDragNodeTemplate(this.props.nodeTypeInfo.nodeType);
65
+ this.props.canvasController.nodeTemplateDragStart(this.props.nodeTypeInfo.nodeType);
65
66
 
66
67
  // On firefox, the drag will not start unless something is written to
67
68
  // the dataTransfer object so just write an empty string
@@ -72,6 +73,11 @@ class PaletteContentListItem extends React.Component {
72
73
  }
73
74
  }
74
75
 
76
+ // This is needed in-case the drag ends somewhere other than the canvas area.
77
+ onDragEnd() {
78
+ this.props.canvasController.nodeTemplateDragEnd();
79
+ }
80
+
75
81
  onDoubleClick() {
76
82
  if (this.props.canvasController.createAutoNode) {
77
83
  this.props.canvasController.createAutoNode(this.props.nodeTypeInfo.nodeType);
@@ -295,6 +301,7 @@ class PaletteContentListItem extends React.Component {
295
301
  onMouseLeave={this.onMouseLeave}
296
302
  onMouseDown={this.props.isEditingEnabled ? this.onMouseDown : null}
297
303
  onDragStart={this.props.isEditingEnabled ? this.onDragStart : null}
304
+ onDragEnd={this.props.isEditingEnabled ? this.onDragEnd : null}
298
305
  onDoubleClick={this.props.isEditingEnabled ? this.onDoubleClick : null}
299
306
  >
300
307
  {categoryLabel}
@@ -36,6 +36,7 @@ class PaletteDialogContentGridNode extends React.Component {
36
36
  this.ghostData = null;
37
37
 
38
38
  this.onDragStart = this.onDragStart.bind(this);
39
+ this.onDragEnd = this.onDragEnd.bind(this);
39
40
  this.onDoubleClick = this.onDoubleClick.bind(this);
40
41
  this.onMouseOver = this.onMouseOver.bind(this);
41
42
  this.onMouseLeave = this.onMouseLeave.bind(this);
@@ -55,7 +56,7 @@ class PaletteDialogContentGridNode extends React.Component {
55
56
  // We cannot use the dataTransfer object for the nodeTemplate because
56
57
  // the dataTransfer data is not available during dragOver events so we set
57
58
  // the nodeTemplate into the canvas controller.
58
- this.props.canvasController.setDragNodeTemplate(this.props.nodeTemplate);
59
+ this.props.canvasController.nodeTemplateDragStart(this.props.nodeTemplate);
59
60
 
60
61
  // On firefox, the drag will not start unless something is written to
61
62
  // the dataTransfer object so just write an empty string
@@ -66,6 +67,11 @@ class PaletteDialogContentGridNode extends React.Component {
66
67
  }
67
68
  }
68
69
 
70
+ // This is needed in-case the drag ends somewhere other than the canvas area.
71
+ onDragEnd() {
72
+ this.props.canvasController.nodeTemplateDragEnd();
73
+ }
74
+
69
75
  onDoubleClick() {
70
76
  if (this.props.canvasController.createAutoNode) {
71
77
  this.props.canvasController.createAutoNode(this.props.nodeTemplate);
@@ -134,6 +140,7 @@ class PaletteDialogContentGridNode extends React.Component {
134
140
  onMouseLeave={this.onMouseLeave}
135
141
  onMouseDown={this.props.isEditingEnabled ? this.onMouseDown : null}
136
142
  onDragStart={this.props.isEditingEnabled ? this.onDragStart : null}
143
+ onDragEnd={this.props.isEditingEnabled ? this.onDragEnd : null}
137
144
  onDoubleClick={this.props.isEditingEnabled ? this.onDoubleClick : null}
138
145
  className="palette-dialog-grid-node-outer"
139
146
  >