@eccenca/gui-elements 22.0.0-rc.7 → 22.1.0-rc.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 (378) hide show
  1. package/CHANGELOG.md +36 -4
  2. package/README.md +21 -7
  3. package/dist/cjs/cmem/ActivityControl/ActivityControlWidget.js +23 -15
  4. package/dist/cjs/cmem/ActivityControl/ActivityControlWidget.js.map +1 -1
  5. package/dist/cjs/cmem/ActivityControl/ActivityExecutionErrorReportModal.js +23 -6
  6. package/dist/cjs/cmem/ActivityControl/ActivityExecutionErrorReportModal.js.map +1 -1
  7. package/dist/cjs/cmem/ActivityControl/SilkActivityControl.js +59 -31
  8. package/dist/cjs/cmem/ActivityControl/SilkActivityControl.js.map +1 -1
  9. package/dist/cjs/cmem/ActivityControl/index.js +11 -0
  10. package/dist/cjs/cmem/ActivityControl/index.js.map +1 -0
  11. package/dist/cjs/cmem/ContentBlobToggler/index.js +8 -0
  12. package/dist/cjs/cmem/ContentBlobToggler/index.js.map +1 -0
  13. package/dist/cjs/cmem/index.js +14 -13
  14. package/dist/cjs/cmem/index.js.map +1 -1
  15. package/dist/cjs/cmem/react-flow/ReactFlow/ReactFlow.js +57 -0
  16. package/dist/cjs/cmem/react-flow/ReactFlow/ReactFlow.js.map +1 -0
  17. package/dist/cjs/cmem/react-flow/configuration/_colors-graph.module.scss +35 -0
  18. package/dist/cjs/cmem/react-flow/configuration/_colors-linking.module.scss +29 -0
  19. package/dist/cjs/cmem/react-flow/configuration/_colors-workflow.module.scss +22 -0
  20. package/dist/cjs/cmem/react-flow/configuration/graph.js +31 -0
  21. package/dist/cjs/cmem/react-flow/configuration/graph.js.map +1 -0
  22. package/dist/cjs/cmem/react-flow/configuration/linking.js +29 -0
  23. package/dist/cjs/cmem/react-flow/configuration/linking.js.map +1 -0
  24. package/dist/cjs/cmem/react-flow/configuration/unspecified.js +15 -0
  25. package/dist/cjs/cmem/react-flow/configuration/unspecified.js.map +1 -0
  26. package/dist/cjs/cmem/react-flow/configuration/workflow.js +27 -0
  27. package/dist/cjs/cmem/react-flow/configuration/workflow.js.map +1 -0
  28. package/dist/cjs/common/utils/stringUtils.js +7 -0
  29. package/dist/cjs/common/utils/stringUtils.js.map +1 -0
  30. package/dist/cjs/components/Application/ApplicationContent.js +1 -7
  31. package/dist/cjs/components/Application/ApplicationContent.js.map +1 -1
  32. package/dist/cjs/components/Application/ApplicationTitle.js +1 -7
  33. package/dist/cjs/components/Application/ApplicationTitle.js.map +1 -1
  34. package/dist/cjs/components/AutoSuggestion/AutoSuggestion.js +284 -0
  35. package/dist/cjs/components/AutoSuggestion/AutoSuggestion.js.map +1 -0
  36. package/dist/cjs/components/AutoSuggestion/AutoSuggestionList.js +81 -0
  37. package/dist/cjs/components/AutoSuggestion/AutoSuggestionList.js.map +1 -0
  38. package/dist/cjs/components/AutoSuggestion/SingleLineCodeEditor.js +46 -0
  39. package/dist/cjs/components/AutoSuggestion/SingleLineCodeEditor.js.map +1 -0
  40. package/dist/cjs/components/AutocompleteField/AutoCompleteField.js +12 -15
  41. package/dist/cjs/components/AutocompleteField/AutoCompleteField.js.map +1 -1
  42. package/dist/cjs/components/Breadcrumb/BreadcrumbItem.js +1 -1
  43. package/dist/cjs/components/Button/Button.js +1 -1
  44. package/dist/cjs/components/Button/Button.js.map +1 -1
  45. package/dist/cjs/components/Card/Card.js +18 -3
  46. package/dist/cjs/components/Card/Card.js.map +1 -1
  47. package/dist/cjs/components/ContextOverlay/ContextMenu.js +1 -1
  48. package/dist/cjs/components/ContextOverlay/ContextMenu.js.map +1 -1
  49. package/dist/cjs/components/Dialog/Modal.js +2 -2
  50. package/dist/cjs/components/Dialog/Modal.js.map +1 -1
  51. package/dist/cjs/components/Dialog/SimpleDialog.js.map +1 -1
  52. package/dist/cjs/components/Form/FieldItemRow.js +2 -3
  53. package/dist/cjs/components/Form/FieldItemRow.js.map +1 -1
  54. package/dist/cjs/components/Icon/Icon.js.map +1 -1
  55. package/dist/cjs/components/Icon/canonicalIconNames.js +30 -0
  56. package/dist/cjs/components/Icon/canonicalIconNames.js.map +1 -1
  57. package/dist/cjs/components/MultiSelect/MultiSelect.js +212 -0
  58. package/dist/cjs/components/MultiSelect/MultiSelect.js.map +1 -0
  59. package/dist/cjs/components/Notification/Notification.js +8 -2
  60. package/dist/cjs/components/Notification/Notification.js.map +1 -1
  61. package/dist/cjs/components/OverviewItem/OverviewItemList.js +1 -1
  62. package/dist/cjs/components/OverviewItem/OverviewItemList.js.map +1 -1
  63. package/dist/cjs/components/Spinner/Spinner.js +1 -1
  64. package/dist/cjs/components/Spinner/Spinner.js.map +1 -1
  65. package/dist/cjs/components/Tabs/Tab.js +94 -0
  66. package/dist/cjs/components/Tabs/Tab.js.map +1 -0
  67. package/dist/cjs/components/Tabs/TabTitle.js +20 -0
  68. package/dist/cjs/components/Tabs/TabTitle.js.map +1 -0
  69. package/dist/cjs/components/Tabs/Tabs.js +26 -19
  70. package/dist/cjs/components/Tabs/Tabs.js.map +1 -1
  71. package/dist/cjs/components/Tag/Tag.js +7 -1
  72. package/dist/cjs/components/Tag/Tag.js.map +1 -1
  73. package/dist/cjs/components/Typography/HtmlContentBlock.js +6 -6
  74. package/dist/cjs/components/Typography/HtmlContentBlock.js.map +1 -1
  75. package/dist/cjs/components/Typography/classnames.js +2 -1
  76. package/dist/cjs/components/Typography/classnames.js.map +1 -1
  77. package/dist/cjs/extensions/react-flow/edges/EdgeDefault.js.map +1 -1
  78. package/dist/cjs/extensions/react-flow/edges/getSmoothStepPath.js +98 -0
  79. package/dist/cjs/extensions/react-flow/edges/getSmoothStepPath.js.map +1 -0
  80. package/dist/cjs/extensions/react-flow/edges/utils.js +97 -4
  81. package/dist/cjs/extensions/react-flow/edges/utils.js.map +1 -1
  82. package/dist/cjs/extensions/react-flow/index.js +5 -1
  83. package/dist/cjs/extensions/react-flow/index.js.map +1 -1
  84. package/dist/cjs/extensions/react-flow/minimap/utils.js +2 -2
  85. package/dist/cjs/extensions/react-flow/nodes/NodeContent.js +141 -0
  86. package/dist/cjs/extensions/react-flow/nodes/NodeContent.js.map +1 -0
  87. package/dist/cjs/extensions/react-flow/nodes/NodeContentExtension.js +41 -0
  88. package/dist/cjs/extensions/react-flow/nodes/NodeContentExtension.js.map +1 -0
  89. package/dist/cjs/extensions/react-flow/nodes/NodeDefault.js +3 -130
  90. package/dist/cjs/extensions/react-flow/nodes/NodeDefault.js.map +1 -1
  91. package/dist/cjs/extensions/react-flow/nodes/NodeTools.js +11 -9
  92. package/dist/cjs/extensions/react-flow/nodes/NodeTools.js.map +1 -1
  93. package/dist/cjs/index.js +17 -2
  94. package/dist/cjs/index.js.map +1 -1
  95. package/dist/cjs/legacy-replacements/Button/AffirmativeButton.js +25 -0
  96. package/dist/cjs/legacy-replacements/Button/AffirmativeButton.js.map +1 -0
  97. package/dist/cjs/legacy-replacements/Button/Button.js +61 -0
  98. package/dist/cjs/legacy-replacements/Button/Button.js.map +1 -0
  99. package/dist/cjs/legacy-replacements/Button/DismissiveButton.js +25 -0
  100. package/dist/cjs/legacy-replacements/Button/DismissiveButton.js.map +1 -0
  101. package/dist/cjs/legacy-replacements/Button/DisruptiveButton.js +25 -0
  102. package/dist/cjs/legacy-replacements/Button/DisruptiveButton.js.map +1 -0
  103. package/dist/cjs/legacy-replacements/Checkbox/Checkbox.js +55 -0
  104. package/dist/cjs/legacy-replacements/Checkbox/Checkbox.js.map +1 -0
  105. package/dist/cjs/legacy-replacements/Radio/RadioButton.js +48 -0
  106. package/dist/cjs/legacy-replacements/Radio/RadioButton.js.map +1 -0
  107. package/dist/cjs/legacy-replacements/Tabs/Tabs.js +36 -0
  108. package/dist/cjs/legacy-replacements/Tabs/Tabs.js.map +1 -0
  109. package/dist/cjs/legacy-replacements/TextField/TextField.js +75 -0
  110. package/dist/cjs/legacy-replacements/TextField/TextField.js.map +1 -0
  111. package/dist/cjs/legacy-replacements/index.js +22 -0
  112. package/dist/cjs/legacy-replacements/index.js.map +1 -0
  113. package/dist/es5/cmem/ActivityControl/ActivityControlWidget.js +23 -15
  114. package/dist/es5/cmem/ActivityControl/ActivityControlWidget.js.map +1 -1
  115. package/dist/es5/cmem/ActivityControl/ActivityExecutionErrorReportModal.js +21 -4
  116. package/dist/es5/cmem/ActivityControl/ActivityExecutionErrorReportModal.js.map +1 -1
  117. package/dist/es5/cmem/ActivityControl/SilkActivityControl.js +57 -31
  118. package/dist/es5/cmem/ActivityControl/SilkActivityControl.js.map +1 -1
  119. package/dist/es5/cmem/ActivityControl/index.js +4 -0
  120. package/dist/es5/cmem/ActivityControl/index.js.map +1 -0
  121. package/dist/es5/cmem/ContentBlobToggler/index.js +3 -0
  122. package/dist/es5/cmem/ContentBlobToggler/index.js.map +1 -0
  123. package/dist/es5/cmem/index.js +6 -8
  124. package/dist/es5/cmem/index.js.map +1 -1
  125. package/dist/es5/cmem/react-flow/ReactFlow/ReactFlow.js +43 -0
  126. package/dist/es5/cmem/react-flow/ReactFlow/ReactFlow.js.map +1 -0
  127. package/dist/es5/cmem/react-flow/configuration/_colors-graph.module.scss +35 -0
  128. package/dist/es5/cmem/react-flow/configuration/_colors-linking.module.scss +29 -0
  129. package/dist/es5/cmem/react-flow/configuration/_colors-workflow.module.scss +22 -0
  130. package/dist/es5/cmem/react-flow/configuration/graph.js +23 -0
  131. package/dist/es5/cmem/react-flow/configuration/graph.js.map +1 -0
  132. package/dist/es5/cmem/react-flow/configuration/linking.js +21 -0
  133. package/dist/es5/cmem/react-flow/configuration/linking.js.map +1 -0
  134. package/dist/es5/cmem/react-flow/configuration/unspecified.js +12 -0
  135. package/dist/es5/cmem/react-flow/configuration/unspecified.js.map +1 -0
  136. package/dist/es5/cmem/react-flow/configuration/workflow.js +19 -0
  137. package/dist/es5/cmem/react-flow/configuration/workflow.js.map +1 -0
  138. package/dist/es5/common/utils/stringUtils.js +3 -0
  139. package/dist/es5/common/utils/stringUtils.js.map +1 -0
  140. package/dist/es5/components/Application/ApplicationContent.js +1 -7
  141. package/dist/es5/components/Application/ApplicationContent.js.map +1 -1
  142. package/dist/es5/components/Application/ApplicationTitle.js +1 -7
  143. package/dist/es5/components/Application/ApplicationTitle.js.map +1 -1
  144. package/dist/es5/components/AutoSuggestion/AutoSuggestion.js +346 -0
  145. package/dist/es5/components/AutoSuggestion/AutoSuggestion.js.map +1 -0
  146. package/dist/es5/components/AutoSuggestion/AutoSuggestionList.js +93 -0
  147. package/dist/es5/components/AutoSuggestion/AutoSuggestionList.js.map +1 -0
  148. package/dist/es5/components/AutoSuggestion/SingleLineCodeEditor.js +42 -0
  149. package/dist/es5/components/AutoSuggestion/SingleLineCodeEditor.js.map +1 -0
  150. package/dist/es5/components/AutocompleteField/AutoCompleteField.js +12 -15
  151. package/dist/es5/components/AutocompleteField/AutoCompleteField.js.map +1 -1
  152. package/dist/es5/components/Breadcrumb/BreadcrumbItem.js +1 -1
  153. package/dist/es5/components/Button/Button.js +1 -1
  154. package/dist/es5/components/Button/Button.js.map +1 -1
  155. package/dist/es5/components/Card/Card.js +18 -3
  156. package/dist/es5/components/Card/Card.js.map +1 -1
  157. package/dist/es5/components/ContextOverlay/ContextMenu.js +1 -1
  158. package/dist/es5/components/ContextOverlay/ContextMenu.js.map +1 -1
  159. package/dist/es5/components/Dialog/Modal.js +2 -2
  160. package/dist/es5/components/Dialog/Modal.js.map +1 -1
  161. package/dist/es5/components/Dialog/SimpleDialog.js.map +1 -1
  162. package/dist/es5/components/Form/FieldItemRow.js +2 -3
  163. package/dist/es5/components/Form/FieldItemRow.js.map +1 -1
  164. package/dist/es5/components/Icon/Icon.js.map +1 -1
  165. package/dist/es5/components/Icon/canonicalIconNames.js +30 -0
  166. package/dist/es5/components/Icon/canonicalIconNames.js.map +1 -1
  167. package/dist/es5/components/MultiSelect/MultiSelect.js +290 -0
  168. package/dist/es5/components/MultiSelect/MultiSelect.js.map +1 -0
  169. package/dist/es5/components/Notification/Notification.js +10 -3
  170. package/dist/es5/components/Notification/Notification.js.map +1 -1
  171. package/dist/es5/components/OverviewItem/OverviewItemList.js +1 -1
  172. package/dist/es5/components/OverviewItem/OverviewItemList.js.map +1 -1
  173. package/dist/es5/components/Spinner/Spinner.js +2 -2
  174. package/dist/es5/components/Spinner/Spinner.js.map +1 -1
  175. package/dist/es5/components/Tabs/Tab.js +97 -0
  176. package/dist/es5/components/Tabs/Tab.js.map +1 -0
  177. package/dist/es5/components/Tabs/TabTitle.js +16 -0
  178. package/dist/es5/components/Tabs/TabTitle.js.map +1 -0
  179. package/dist/es5/components/Tabs/Tabs.js +8 -21
  180. package/dist/es5/components/Tabs/Tabs.js.map +1 -1
  181. package/dist/es5/components/Tag/Tag.js +7 -1
  182. package/dist/es5/components/Tag/Tag.js.map +1 -1
  183. package/dist/es5/components/Typography/HtmlContentBlock.js +17 -8
  184. package/dist/es5/components/Typography/HtmlContentBlock.js.map +1 -1
  185. package/dist/es5/components/Typography/classnames.js +1 -0
  186. package/dist/es5/components/Typography/classnames.js.map +1 -1
  187. package/dist/es5/extensions/react-flow/edges/EdgeDefault.js.map +1 -1
  188. package/dist/es5/extensions/react-flow/edges/getSmoothStepPath.js +119 -0
  189. package/dist/es5/extensions/react-flow/edges/getSmoothStepPath.js.map +1 -0
  190. package/dist/es5/extensions/react-flow/edges/utils.js +100 -5
  191. package/dist/es5/extensions/react-flow/edges/utils.js.map +1 -1
  192. package/dist/es5/extensions/react-flow/index.js +2 -0
  193. package/dist/es5/extensions/react-flow/index.js.map +1 -1
  194. package/dist/es5/extensions/react-flow/minimap/utils.js +1 -1
  195. package/dist/es5/extensions/react-flow/nodes/NodeContent.js +162 -0
  196. package/dist/es5/extensions/react-flow/nodes/NodeContent.js.map +1 -0
  197. package/dist/es5/extensions/react-flow/nodes/NodeContentExtension.js +45 -0
  198. package/dist/es5/extensions/react-flow/nodes/NodeContentExtension.js.map +1 -0
  199. package/dist/es5/extensions/react-flow/nodes/NodeDefault.js +2 -129
  200. package/dist/es5/extensions/react-flow/nodes/NodeDefault.js.map +1 -1
  201. package/dist/es5/extensions/react-flow/nodes/NodeTools.js +12 -10
  202. package/dist/es5/extensions/react-flow/nodes/NodeTools.js.map +1 -1
  203. package/dist/es5/index.js +9 -4
  204. package/dist/es5/index.js.map +1 -1
  205. package/dist/es5/legacy-replacements/Button/AffirmativeButton.js +29 -0
  206. package/dist/es5/legacy-replacements/Button/AffirmativeButton.js.map +1 -0
  207. package/dist/es5/legacy-replacements/Button/Button.js +65 -0
  208. package/dist/es5/legacy-replacements/Button/Button.js.map +1 -0
  209. package/dist/es5/legacy-replacements/Button/DismissiveButton.js +29 -0
  210. package/dist/es5/legacy-replacements/Button/DismissiveButton.js.map +1 -0
  211. package/dist/es5/legacy-replacements/Button/DisruptiveButton.js +29 -0
  212. package/dist/es5/legacy-replacements/Button/DisruptiveButton.js.map +1 -0
  213. package/dist/es5/legacy-replacements/Checkbox/Checkbox.js +59 -0
  214. package/dist/es5/legacy-replacements/Checkbox/Checkbox.js.map +1 -0
  215. package/dist/es5/legacy-replacements/Radio/RadioButton.js +52 -0
  216. package/dist/es5/legacy-replacements/Radio/RadioButton.js.map +1 -0
  217. package/dist/es5/legacy-replacements/Tabs/Tabs.js +40 -0
  218. package/dist/es5/legacy-replacements/Tabs/Tabs.js.map +1 -0
  219. package/dist/es5/legacy-replacements/TextField/TextField.js +81 -0
  220. package/dist/es5/legacy-replacements/TextField/TextField.js.map +1 -0
  221. package/dist/es5/legacy-replacements/index.js +10 -0
  222. package/dist/es5/legacy-replacements/index.js.map +1 -0
  223. package/dist/types/cmem/ActivityControl/ActivityControlTypes.d.ts +2 -1
  224. package/dist/types/cmem/ActivityControl/ActivityControlWidget.d.ts +48 -2
  225. package/dist/types/cmem/ActivityControl/SilkActivityControl.d.ts +18 -3
  226. package/dist/types/cmem/ActivityControl/index.d.ts +3 -0
  227. package/dist/types/cmem/ContentBlobToggler/index.d.ts +2 -0
  228. package/dist/types/cmem/index.d.ts +8 -8
  229. package/dist/types/cmem/react-flow/ReactFlow/ReactFlow.d.ts +14 -0
  230. package/dist/types/cmem/react-flow/configuration/graph.d.ts +21 -0
  231. package/dist/types/cmem/react-flow/configuration/linking.d.ts +19 -0
  232. package/dist/types/cmem/react-flow/configuration/unspecified.d.ts +9 -0
  233. package/dist/types/cmem/react-flow/configuration/workflow.d.ts +17 -0
  234. package/dist/types/common/utils/stringUtils.d.ts +2 -0
  235. package/dist/types/components/AutoSuggestion/AutoSuggestion.d.ts +67 -0
  236. package/dist/types/components/AutoSuggestion/AutoSuggestionList.d.ts +13 -0
  237. package/dist/types/components/AutoSuggestion/SingleLineCodeEditor.d.ts +25 -0
  238. package/dist/types/components/AutocompleteField/AutoCompleteField.d.ts +8 -7
  239. package/dist/types/components/Button/Button.d.ts +3 -2
  240. package/dist/types/components/Card/Card.d.ts +9 -4
  241. package/dist/types/components/ContextOverlay/ContextMenu.d.ts +6 -1
  242. package/dist/types/components/Dialog/Modal.d.ts +4 -3
  243. package/dist/types/components/Dialog/SimpleDialog.d.ts +2 -0
  244. package/dist/types/components/Form/FieldItemRow.d.ts +1 -0
  245. package/dist/types/components/Icon/Icon.d.ts +2 -2
  246. package/dist/types/components/Icon/IconButton.d.ts +1 -1
  247. package/dist/types/components/Icon/canonicalIconNames.d.ts +1 -1
  248. package/dist/types/components/MultiSelect/MultiSelect.d.ts +86 -0
  249. package/dist/types/components/Notification/Notification.d.ts +55 -2
  250. package/dist/types/components/OverviewItem/OverviewItemList.d.ts +1 -1
  251. package/dist/types/components/Spinner/Spinner.d.ts +1 -1
  252. package/dist/types/components/Tabs/Tab.d.ts +549 -0
  253. package/dist/types/components/Tabs/TabTitle.d.ts +38 -0
  254. package/dist/types/components/Tabs/Tabs.d.ts +14 -20
  255. package/dist/types/components/Tag/Tag.d.ts +1 -1
  256. package/dist/types/components/Typography/HtmlContentBlock.d.ts +15 -5
  257. package/dist/types/components/Typography/classnames.d.ts +1 -0
  258. package/dist/types/extensions/react-flow/edges/getSmoothStepPath.d.ts +18 -0
  259. package/dist/types/extensions/react-flow/edges/utils.d.ts +1 -1
  260. package/dist/types/extensions/react-flow/index.d.ts +4 -0
  261. package/dist/types/extensions/react-flow/nodes/NodeContent.d.ts +127 -0
  262. package/dist/types/extensions/react-flow/nodes/NodeContentExtension.d.ts +34 -0
  263. package/dist/types/extensions/react-flow/nodes/NodeDefault.d.ts +4 -121
  264. package/dist/types/extensions/react-flow/nodes/NodeTools.d.ts +9 -2
  265. package/dist/types/extensions/react-flow/nodes/nodeTypes.d.ts +10 -10
  266. package/dist/types/index.d.ts +9 -4
  267. package/dist/types/legacy-replacements/Button/AffirmativeButton.d.ts +2 -0
  268. package/dist/types/legacy-replacements/Button/Button.d.ts +5 -0
  269. package/dist/types/legacy-replacements/Button/DismissiveButton.d.ts +2 -0
  270. package/dist/types/legacy-replacements/Button/DisruptiveButton.d.ts +2 -0
  271. package/dist/types/legacy-replacements/Checkbox/Checkbox.d.ts +2 -0
  272. package/dist/types/legacy-replacements/Radio/RadioButton.d.ts +2 -0
  273. package/dist/types/legacy-replacements/Tabs/Tabs.d.ts +22 -0
  274. package/dist/types/legacy-replacements/TextField/TextField.d.ts +2 -0
  275. package/dist/types/legacy-replacements/index.d.ts +10 -0
  276. package/package.json +48 -20
  277. package/src/cmem/ActivityControl/ActivityControlTypes.ts +3 -1
  278. package/src/cmem/ActivityControl/ActivityControlWidget.stories.tsx +98 -0
  279. package/src/cmem/ActivityControl/ActivityControlWidget.tsx +144 -89
  280. package/src/cmem/ActivityControl/ActivityExecutionErrorReportModal.tsx +11 -3
  281. package/src/cmem/ActivityControl/SilkActivityControl.tsx +182 -120
  282. package/src/cmem/ActivityControl/index.ts +3 -0
  283. package/src/cmem/ContentBlobToggler/index.ts +2 -0
  284. package/src/cmem/_index.scss +6 -0
  285. package/src/cmem/index.ts +10 -23
  286. package/src/cmem/react-flow/ReactFlow/ReactFlow.stories.tsx +222 -0
  287. package/src/cmem/react-flow/ReactFlow/ReactFlow.tsx +40 -0
  288. package/src/cmem/react-flow/_edges.scss +23 -0
  289. package/src/cmem/react-flow/_handles.scss +34 -0
  290. package/src/cmem/react-flow/_index.scss +5 -0
  291. package/src/cmem/react-flow/_minimap.scss +33 -0
  292. package/src/cmem/react-flow/_nodes.scss +66 -0
  293. package/src/cmem/react-flow/configuration/_colors-graph.module.scss +35 -0
  294. package/src/cmem/react-flow/configuration/_colors-linking.module.scss +29 -0
  295. package/src/cmem/react-flow/configuration/_colors-workflow.module.scss +22 -0
  296. package/src/cmem/react-flow/configuration/_colors.scss +3 -0
  297. package/src/cmem/react-flow/configuration/graph.ts +29 -0
  298. package/src/cmem/react-flow/configuration/linking.ts +28 -0
  299. package/src/cmem/react-flow/configuration/unspecified.ts +13 -0
  300. package/src/cmem/react-flow/configuration/workflow.ts +25 -0
  301. package/src/common/utils/stringUtils.ts +2 -0
  302. package/src/components/Application/ApplicationContent.tsx +0 -5
  303. package/src/components/Application/ApplicationTitle.tsx +0 -5
  304. package/src/components/AutoSuggestion/AutoSuggestion.scss +100 -0
  305. package/src/components/AutoSuggestion/AutoSuggestion.tsx +446 -0
  306. package/src/components/AutoSuggestion/AutoSuggestionList.tsx +170 -0
  307. package/src/components/AutoSuggestion/SingleLineCodeEditor.tsx +97 -0
  308. package/src/components/AutoSuggestion/tests/AutoSuggestion.test.tsx +37 -0
  309. package/src/components/AutoSuggestion/tests/AutoSuggestionList.test.tsx +124 -0
  310. package/src/components/AutoSuggestion/tests/SingleLineCodeEditor.test.tsx +55 -0
  311. package/src/components/AutocompleteField/AutoCompleteField.tsx +24 -23
  312. package/src/components/AutocompleteField/autoCompleteFieldUtils.tsx +2 -1
  313. package/src/components/Breadcrumb/BreadcrumbItem.tsx +5 -5
  314. package/src/components/Breadcrumb/BreadcrumbList.tsx +1 -1
  315. package/src/components/Button/Button.stories.tsx +1 -1
  316. package/src/components/Button/Button.tsx +4 -3
  317. package/src/components/Card/Card.tsx +23 -4
  318. package/src/components/Card/card.scss +4 -0
  319. package/src/components/Checkbox/checkbox.scss +4 -0
  320. package/src/components/ContextOverlay/ContextMenu.tsx +8 -2
  321. package/src/components/Dialog/Modal.tsx +9 -2
  322. package/src/components/Dialog/SimpleDialog.tsx +2 -0
  323. package/src/components/Form/FieldItem.tsx +3 -3
  324. package/src/components/Form/FieldItemRow.tsx +2 -4
  325. package/src/components/Icon/Icon.tsx +4 -4
  326. package/src/components/Icon/IconButton.tsx +3 -3
  327. package/src/components/Icon/canonicalIconNames.tsx +39 -2
  328. package/src/components/Menu/MenuItem.tsx +1 -1
  329. package/src/components/MultiSelect/MultiSelect.stories.tsx +71 -0
  330. package/src/components/MultiSelect/MultiSelect.tsx +373 -0
  331. package/src/components/Notification/Notification.stories.tsx +82 -0
  332. package/src/components/Notification/Notification.tsx +62 -4
  333. package/src/components/Notification/notification.scss +2 -1
  334. package/src/components/OverviewItem/OverviewItemList.tsx +2 -2
  335. package/src/components/RadioButton/radiobutton.scss +4 -0
  336. package/src/components/Spinner/Spinner.tsx +1 -1
  337. package/src/components/Switch/switch.scss +1 -0
  338. package/src/components/Tabs/Tab.tsx +111 -0
  339. package/src/components/Tabs/TabTitle.tsx +71 -0
  340. package/src/components/Tabs/Tabs.tsx +22 -90
  341. package/src/components/Tabs/stories/Tab.stories.tsx +65 -0
  342. package/src/components/Tabs/stories/TabTitle.stories.tsx +35 -0
  343. package/src/components/Tabs/stories/Tabs.stories.tsx +98 -0
  344. package/src/components/Tabs/tabs.scss +11 -4
  345. package/src/components/Tag/Tag.tsx +10 -3
  346. package/src/components/Tag/tag.scss +2 -2
  347. package/src/components/TextField/TextField.tsx +1 -1
  348. package/src/components/Toolbar/toolbar.scss +1 -1
  349. package/src/components/Typography/HtmlContentBlock.tsx +27 -4
  350. package/src/components/Typography/classnames.ts +1 -0
  351. package/src/components/Typography/typography.scss +8 -0
  352. package/src/configuration/_variables.scss +3 -3
  353. package/src/extensions/react-flow/_config.scss +2 -2
  354. package/src/extensions/react-flow/_react-flow.scss +4 -0
  355. package/src/extensions/react-flow/edges/EdgeDefault.tsx +0 -1
  356. package/src/extensions/react-flow/edges/_edges.scss +3 -28
  357. package/src/extensions/react-flow/edges/getSmoothStepPath.ts +118 -0
  358. package/src/extensions/react-flow/edges/utils.ts +131 -4
  359. package/src/extensions/react-flow/handles/_handles.scss +4 -58
  360. package/src/extensions/react-flow/index.ts +4 -0
  361. package/src/extensions/react-flow/minimap/_minimap.scss +0 -45
  362. package/src/extensions/react-flow/minimap/utils.ts +1 -1
  363. package/src/extensions/react-flow/nodes/NodeContent.tsx +336 -0
  364. package/src/extensions/react-flow/nodes/NodeContentExtension.tsx +17 -10
  365. package/src/extensions/react-flow/nodes/NodeDefault.tsx +4 -326
  366. package/src/extensions/react-flow/nodes/NodeTools.tsx +27 -10
  367. package/src/extensions/react-flow/nodes/_nodes.scss +61 -196
  368. package/src/extensions/react-flow/nodes/{NodeContent.stories.tsx → stories/NodeContent.stories.tsx} +14 -5
  369. package/src/extensions/react-flow/nodes/stories/NodeContentExtension.stories.tsx +59 -0
  370. package/src/extensions/react-flow/nodes/{NodeDefault.stories.tsx → stories/NodeDefault.stories.tsx} +5 -3
  371. package/src/index.scss +1 -0
  372. package/src/index.ts +19 -4
  373. package/src/legacy-replacements/Tabs/Tabs.stories.tsx +46 -0
  374. package/src/legacy-replacements/Tabs/Tabs.tsx +84 -0
  375. package/src/legacy-replacements/index.ts +11 -0
  376. package/src/test/setupTests.js +19 -0
  377. package/src/components/Icon/canonicalIconNames.json +0 -120
  378. package/src/extensions/react-flow/nodes/NodeContentExtension.stories.tsx +0 -36
@@ -0,0 +1,100 @@
1
+ //@import "~@eccenca/gui-elements/src/configuration.default";
2
+
3
+ .ecc-auto-suggestion-box {
4
+ position: relative;
5
+
6
+ &__dropdown {
7
+ transition: all 300ms;
8
+ // TODO: Replace by variable
9
+ background-color: #fff;
10
+ position: absolute;
11
+ top: $eccgui-size-textfield-height-regular;
12
+ z-index:2;
13
+ display: flex;
14
+ flex-flow: column wrap;
15
+ margin-top: 0;
16
+ max-width: 25rem;
17
+ max-height: 30rem;
18
+ // TODO: was: 1px solid $list-container-item-border-color
19
+ border: 1px solid;
20
+ border-radius: 0.3rem;
21
+ overflow-x:hidden;
22
+ overflow-y: auto;
23
+
24
+ .#{$ns}-menu, .#{$eccgui}-overviewitem__item {
25
+ max-width: 24rem;
26
+ box-sizing: border-box;
27
+ }
28
+ }
29
+ }
30
+
31
+ .ecc-input-editor {
32
+ position: relative;
33
+
34
+ .CodeMirror {
35
+ height: calc(#{$eccgui-size-textfield-height-regular} - 4px);
36
+ margin: 0;
37
+ padding: 0;
38
+ top: 2px;
39
+ overflow: hidden;
40
+ }
41
+
42
+ .CodeMirror-scroll {
43
+ margin: 0;
44
+ padding: 0;
45
+ overflow-y: hidden !important;
46
+ overflow-x: auto !important;
47
+ }
48
+
49
+ .CodeMirror-vscrollbar {
50
+ display: none !important;
51
+ }
52
+
53
+ .CodeMirror-sizer {
54
+ border: none;
55
+ }
56
+
57
+ .CodeMirror-lines {
58
+ padding: 0;
59
+ line-height: calc(#{$eccgui-size-textfield-height-regular} - 4px - 6px);
60
+ }
61
+
62
+ pre.CodeMirror-line {
63
+ font-family: $eccgui-font-family-monospace;
64
+ font-size: 0.9em;
65
+ padding: 3px 0;
66
+ height: calc(#{$eccgui-size-textfield-height-regular} - 4px - 6px);
67
+ box-sizing: content-box;
68
+ }
69
+
70
+ .CodeMirror-cursor {
71
+ border: none;
72
+ margin: 0;
73
+ width: 1px;
74
+ background-color: transparent;
75
+
76
+ &::after {
77
+ content: " ";
78
+ height: 1rem;
79
+ width: 1px;
80
+ overflow: hidden;
81
+ background-color: black;
82
+ position: absolute;
83
+ top: 50%;
84
+ right: 0;
85
+ margin-top: -0.5rem;
86
+ }
87
+ }
88
+ }
89
+
90
+ .ecc-text-highlighting {
91
+ display: inline-block;
92
+ background-color: $eccgui-color-warning-background;
93
+ color:$eccgui-color-warning-text;
94
+ }
95
+
96
+ .ecc-text-error-highlighting {
97
+ background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==");
98
+ background-position: left bottom;
99
+ background-repeat: repeat-x;
100
+ }
@@ -0,0 +1,446 @@
1
+ import React, {useCallback, useEffect, useState} from "react";
2
+ import CodeMirror from "codemirror";
3
+ import {FieldItem, IconButton, Spinner, Toolbar, ToolbarSection} from "./../../";
4
+ import {Classes as BlueprintClassNames} from "@blueprintjs/core";
5
+
6
+ //custom components
7
+ import SingleLineCodeEditor, {IRange} from "./SingleLineCodeEditor";
8
+ import {AutoSuggestionList} from "./AutoSuggestionList";
9
+ import {debounce} from "lodash";
10
+
11
+ export enum OVERWRITTEN_KEYS {
12
+ ArrowUp = "ArrowUp",
13
+ ArrowDown = "ArrowDown",
14
+ Enter = "Enter",
15
+ Tab = "Tab",
16
+ }
17
+ export type OverwrittenKeyTypes = typeof OVERWRITTEN_KEYS[keyof typeof OVERWRITTEN_KEYS];
18
+
19
+ /** A single suggestion. */
20
+ export interface ISuggestionBase {
21
+ // The actual value
22
+ value: string
23
+ // Optional human-readable label
24
+ label?: string
25
+ // Optional description of the value.
26
+ description?: string
27
+ }
28
+
29
+ /** Same as ISuggestionBase, but with the query that was used to fetch this suggestion. */
30
+ export interface ISuggestionWithReplacementInfo extends ISuggestionBase {
31
+ // The query this result was filtered by
32
+ query: string
33
+ // The offset of the original string that should be replaced
34
+ from: number
35
+ // The length of the original string that should be replaced
36
+ length: number
37
+ }
38
+
39
+ /** The suggestions for a specific substring of the given input string. */
40
+ export interface IReplacementResult {
41
+ // The range of the input string that should be replaced
42
+ replacementInterval: {
43
+ from: number
44
+ length: number
45
+ }
46
+ // The extracted query from the local value at the cursor position of the path that was used to retrieve the suggestions.
47
+ extractedQuery: string
48
+ // The suggested replacements for the substring that should be replaced.
49
+ replacements: ISuggestionBase[]
50
+ }
51
+
52
+ export interface IPartialAutoCompleteResult {
53
+ // Repeats the input string from the corresponding request
54
+ inputString: string
55
+ // Repeats the cursor position from the corresponding request
56
+ cursorPosition: number
57
+ replacementResults: IReplacementResult[]
58
+ }
59
+
60
+ /** Validation result */
61
+ export interface IValidationResult {
62
+ // If the input value is valid or not
63
+ valid: boolean,
64
+ parseError?: {
65
+ // Detail error message
66
+ message: string
67
+ // Start of the parse error in the input string
68
+ start: number
69
+ // End of the parse error in the input string
70
+ end: number
71
+ }
72
+ }
73
+
74
+ export interface IProps {
75
+ // Optional label to be shown for the input (above). This will create a FieldItem around the input.
76
+ label?: string
77
+ // The value the component is initialized with, do not use this to control value changes.
78
+ initialValue: string
79
+ // Callback on value change
80
+ onChange: (currentValue: string) => any
81
+ // Fetches the suggestions
82
+ fetchSuggestions: (inputString: string, cursorPosition: number) => (IPartialAutoCompleteResult | undefined) | Promise<IPartialAutoCompleteResult | undefined>
83
+ // Checks if the input is valid
84
+ checkInput?: (inputString: string) => IValidationResult | Promise<IValidationResult | undefined>
85
+ // Called with the input validation result
86
+ onInputChecked?: (validInput: boolean) => any
87
+ // Text that should be shown if the input validation failed.
88
+ validationErrorText?: string
89
+ // Text that should be shown when hovering over the clear icon
90
+ clearIconText?: string
91
+ // Called when focus status changes
92
+ onFocusChange?: (hasFocus: boolean) => any
93
+ // Optional ID to attach to the outer element
94
+ id?: string
95
+ // If the <Tab> key should be used for auto-completing items. Else it will have its default behavior.
96
+ useTabForCompletions?: boolean
97
+ /** An additional element that is put to the left side of the input field */
98
+ leftElement?: JSX.Element | null
99
+ // An additional element that is put to the right side of the input field
100
+ rightElement?: JSX.Element | null
101
+ /** Placeholder tobe shown when no text has been entered, yet. */
102
+ placeholder?: string
103
+ /** If the horizontal scrollbars should be shown. */
104
+ showScrollBar?: boolean
105
+ }
106
+
107
+ /** Input component that allows partial, fine-grained auto-completion, i.e. of sub-strings of the input string.
108
+ * This is comparable to a one line code editor. */
109
+ const AutoSuggestion = ({
110
+ label,
111
+ initialValue,
112
+ onChange,
113
+ fetchSuggestions,
114
+ checkInput,
115
+ validationErrorText = "Invalid value",
116
+ clearIconText = "Clear",
117
+ onFocusChange,
118
+ id,
119
+ onInputChecked,
120
+ leftElement,
121
+ rightElement,
122
+ useTabForCompletions = false,
123
+ placeholder,
124
+ showScrollBar = true
125
+ }: IProps) => {
126
+ const [value, setValue] = React.useState(initialValue);
127
+ const [cursorPosition, setCursorPosition] = React.useState(0);
128
+ const [coords, setCoords] = React.useState({left: 0});
129
+ const [shouldShowDropdown, setShouldShowDropdown] = React.useState(false);
130
+ const [suggestions, setSuggestions] = React.useState<ISuggestionWithReplacementInfo[]>([]);
131
+ const [suggestionsPending, setSuggestionsPending] = React.useState(false);
132
+ const [pathValidationPending, setPathValidationPending] = React.useState(false)
133
+ const [, setErrorMarkers] = React.useState<CodeMirror.TextMarker[]>([]);
134
+ const [validationResponse, setValidationResponse] = useState<IValidationResult | undefined>(undefined)
135
+ const [suggestionResponse, setSuggestionResponse] = useState<IPartialAutoCompleteResult | undefined>(undefined)
136
+ // The element that should be used for replacement highlighting
137
+ const [highlightedElement, setHighlightedElement] = useState<ISuggestionWithReplacementInfo | undefined>(undefined)
138
+ const [editorInstance, setEditorInstance] = React.useState<CodeMirror.Editor>();
139
+ const [isFocused, setIsFocused] = React.useState(false);
140
+ /** Mutable editor state, since this needs to be current in scope of the SingleLineEditorComponent. */
141
+ const [editorState] = React.useState<{
142
+ index: number,
143
+ suggestions: ISuggestionWithReplacementInfo[],
144
+ editorInstance?: CodeMirror.Editor,
145
+ dropdownShown: boolean
146
+ }>({index: 0, suggestions: [], dropdownShown: false})
147
+ /** This is for the AutoSuggestionList component in order to re-render. */
148
+ const [focusedIndex, setFocusedIndex] = React.useState(0)
149
+ const [selectedTextRanges, setSelectedTextRanges] = useState<IRange[]>([])
150
+
151
+ const pathIsValid = validationResponse?.valid ?? true;
152
+
153
+ const setCurrentIndex = (newIndex: number) => {
154
+ editorState.index = newIndex
155
+ setFocusedIndex(newIndex)
156
+ }
157
+ const currentIndex = () => editorState.index
158
+
159
+ React.useEffect(() => {
160
+ editorState.editorInstance = editorInstance
161
+ }, [editorInstance, editorState])
162
+
163
+ React.useEffect(() => {
164
+ setValue(initialValue)
165
+ }, [initialValue])
166
+
167
+ React.useEffect(() => {
168
+ editorState.dropdownShown = shouldShowDropdown
169
+ }, [shouldShowDropdown, editorState])
170
+
171
+ // Handle replacement highlighting
172
+ useEffect(() => {
173
+ if (highlightedElement && editorInstance) {
174
+ const { from, length } = highlightedElement;
175
+ if(length > 0 && selectedTextRanges.length === 0) {
176
+ const to = from + length;
177
+ const marker = editorInstance.markText(
178
+ {line: 0, ch: from},
179
+ {line: 0, ch: to},
180
+ {className: "ecc-text-highlighting"}
181
+ );
182
+ return () => marker.clear()
183
+ }
184
+ }
185
+ }, [highlightedElement, selectedTextRanges, editorInstance])
186
+
187
+ //handle linting
188
+ React.useEffect(() => {
189
+ const parseError = validationResponse?.parseError;
190
+ if (parseError && editorInstance) {
191
+ const { message, start, end } = parseError;
192
+ editorInstance.getDoc().getEditor()
193
+ const marker = editorInstance.markText(
194
+ { line: 0, ch: start },
195
+ { line: 0, ch: end },
196
+ { className: "ecc-text-error-highlighting", title: message }
197
+ );
198
+ setErrorMarkers((previousMarkers) => {
199
+ previousMarkers.forEach(marker => marker.clear())
200
+ return [marker]
201
+ });
202
+ } else {
203
+ // Valid, clear all error markers
204
+ setErrorMarkers((previous) => {
205
+ previous.forEach(marker => marker.clear())
206
+ return []
207
+ })
208
+ }
209
+ onInputChecked && onInputChecked(!!validationResponse?.valid)
210
+ }, [validationResponse?.valid, validationResponse?.parseError, editorInstance, onInputChecked]);
211
+
212
+ /** generate suggestions and also populate the replacement indexes dict */
213
+ React.useEffect(() => {
214
+ let newSuggestions: ISuggestionWithReplacementInfo[] = [];
215
+ if (
216
+ suggestionResponse?.replacementResults?.length === 1 &&
217
+ !suggestionResponse?.replacementResults[0]?.replacements?.length
218
+ ) {
219
+ setShouldShowDropdown(false);
220
+ }
221
+ if (suggestionResponse?.replacementResults?.length) {
222
+ suggestionResponse.replacementResults.forEach(
223
+ ({ replacements, replacementInterval: { from, length }, extractedQuery }) => {
224
+ const replacementsWithMetaData = replacements.map(r => ({...r, query: extractedQuery, from, length}))
225
+ newSuggestions = [...newSuggestions, ...replacementsWithMetaData];
226
+ }
227
+ );
228
+ editorState.suggestions = newSuggestions
229
+ setSuggestions(newSuggestions);
230
+ } else {
231
+ editorState.suggestions = []
232
+ setSuggestions([])
233
+ }
234
+ editorState.index = 0
235
+ }, [suggestionResponse, editorState]);
236
+
237
+ const asyncCheckInput = async (inputString: string) => {
238
+ if(!checkInput) {
239
+ return
240
+ }
241
+ setPathValidationPending(true)
242
+ try {
243
+ const result: IValidationResult | undefined = await checkInput(inputString)
244
+ setValidationResponse(result)
245
+ } catch(e) {
246
+ setValidationResponse(undefined)
247
+ // TODO: Error handling
248
+ } finally {
249
+ setPathValidationPending(false)
250
+ }
251
+ }
252
+
253
+ const checkValuePathValidity = useCallback(
254
+ debounce((inputString: string) => asyncCheckInput(inputString), 200),
255
+ [checkInput]
256
+ )
257
+
258
+ const handleEditorInputChange = useCallback(
259
+ debounce((inputString: string, cursorPosition: number) => asyncHandleEditorInputChange(inputString, cursorPosition), 200),
260
+ [fetchSuggestions]
261
+ )
262
+
263
+ React.useEffect(() => {
264
+ if (isFocused) {
265
+ setShouldShowDropdown(true);
266
+ handleEditorInputChange(value, cursorPosition)
267
+ return handleEditorInputChange.cancel
268
+ }
269
+ }, [cursorPosition, value, isFocused, handleEditorInputChange]);
270
+
271
+ // Trigger input validation
272
+ useEffect(() => {
273
+ checkValuePathValidity(value)
274
+ return checkValuePathValidity.cancel
275
+ }, [value, checkValuePathValidity])
276
+
277
+ const asyncHandleEditorInputChange = async (inputString: string, cursorPosition: number) => {
278
+ setSuggestionsPending(true)
279
+ try {
280
+ const result: IPartialAutoCompleteResult | undefined = await fetchSuggestions(inputString, cursorPosition)
281
+ setSuggestionResponse(result)
282
+ } catch(e) {
283
+ setSuggestionResponse(undefined)
284
+ // TODO: Error handling
285
+ } finally {
286
+ setSuggestionsPending(false)
287
+ }
288
+ }
289
+
290
+ const handleChange = (val: string) => {
291
+ setValue(val);
292
+ onChange(val)
293
+ };
294
+
295
+ const handleCursorChange = (pos: any, coords: any) => {
296
+ setCursorPosition(pos.ch);
297
+ setCoords(() => coords);
298
+ };
299
+
300
+ const handleInputEditorKeyPress = (event: KeyboardEvent) => {
301
+ const overWrittenKeys: Array<string> = Object.values(OVERWRITTEN_KEYS);
302
+ if (overWrittenKeys.includes(event.key) && (useTabForCompletions || event.key !== OVERWRITTEN_KEYS.Tab)) {
303
+ event.preventDefault();
304
+ makeDropDownRespondToKeyPress(OVERWRITTEN_KEYS[event.key as keyof typeof OVERWRITTEN_KEYS]);
305
+ }
306
+ };
307
+
308
+ const closeDropDown = () => {
309
+ setHighlightedElement(undefined)
310
+ setShouldShowDropdown(false)
311
+ }
312
+
313
+ const handleDropdownChange = (selectedSuggestion: ISuggestionWithReplacementInfo) => {
314
+ if (selectedSuggestion && editorState.editorInstance) {
315
+ const { from, length, value } = selectedSuggestion;
316
+ const to = from + length;
317
+ editorState.editorInstance.replaceRange(selectedSuggestion.value, {line: 0, ch: from}, {line: 0, ch: to})
318
+ closeDropDown()
319
+ editorState.editorInstance.setCursor({ line: 0, ch: from + value.length });
320
+ editorState.editorInstance.focus();
321
+ }
322
+ };
323
+
324
+ const handleInputEditorClear = () => {
325
+ handleChange("");
326
+ setValue("")
327
+ editorInstance?.focus();
328
+ };
329
+
330
+ const handleInputFocus = (focusState: boolean) => {
331
+ onFocusChange && onFocusChange(focusState)
332
+ setIsFocused(focusState)
333
+ focusState ? setShouldShowDropdown(true) : closeDropDown()
334
+ };
335
+
336
+ //keyboard handlers
337
+ const handleArrowDown = () => {
338
+ const lastSuggestionIndex = editorState.suggestions.length - 1;
339
+ setCurrentIndex(currentIndex() === lastSuggestionIndex ? 0 : currentIndex() + 1)
340
+ };
341
+
342
+ const handleArrowUp = () => {
343
+ const lastSuggestionIndex = editorState.suggestions.length - 1;
344
+ setCurrentIndex(currentIndex() === 0 ? lastSuggestionIndex : currentIndex() - 1)
345
+ };
346
+
347
+ const handleEnterPressed = () => {
348
+ handleDropdownChange(editorState.suggestions[currentIndex()]);
349
+ setCurrentIndex(0);
350
+ };
351
+
352
+ const handleTabPressed = () => {
353
+ handleDropdownChange(editorState.suggestions[currentIndex()]);
354
+ };
355
+
356
+ const makeDropDownRespondToKeyPress = (keyPressedFromInput: OverwrittenKeyTypes) => {
357
+ // React state unknown
358
+ if (editorState.dropdownShown) {
359
+ switch (keyPressedFromInput) {
360
+ case OVERWRITTEN_KEYS.ArrowUp:
361
+ handleArrowUp();
362
+ break;
363
+ case OVERWRITTEN_KEYS.ArrowDown:
364
+ handleArrowDown();
365
+ break;
366
+ case OVERWRITTEN_KEYS.Enter:
367
+ handleEnterPressed();
368
+ break;
369
+ case OVERWRITTEN_KEYS.Tab:
370
+ handleTabPressed();
371
+ break;
372
+ default:
373
+ //do nothing
374
+ }
375
+ }
376
+ };
377
+
378
+ const handleItemHighlighting = React.useCallback((item: ISuggestionWithReplacementInfo | undefined) => {
379
+ setHighlightedElement(item)
380
+ }, [])
381
+
382
+ const hasError = !!value && !pathIsValid && !pathValidationPending;
383
+ const autoSuggestionInput = <div id={id} className="ecc-auto-suggestion-box">
384
+ <div className={`ecc-auto-suggestion-box__editor-box ${BlueprintClassNames.INPUT_GROUP} ${BlueprintClassNames.FILL} ${hasError ? BlueprintClassNames.INTENT_DANGER : ""}`}>
385
+ <SingleLineCodeEditor
386
+ mode="null"
387
+ setEditorInstance={setEditorInstance}
388
+ onChange={handleChange}
389
+ onCursorChange={handleCursorChange}
390
+ initialValue={value}
391
+ onFocusChange={handleInputFocus}
392
+ onKeyDown={handleInputEditorKeyPress}
393
+ enableTab={useTabForCompletions}
394
+ placeholder={placeholder}
395
+ onSelection={setSelectedTextRanges}
396
+ showScrollBar={showScrollBar}
397
+ />
398
+ {!!value && (
399
+ <span className={BlueprintClassNames.INPUT_ACTION}>
400
+ <IconButton
401
+ data-test-id={"value-path-clear-btn"}
402
+ name="operation-clear"
403
+ text={clearIconText}
404
+ onClick={handleInputEditorClear}
405
+ />
406
+ </span>
407
+ )}
408
+ </div>
409
+ {shouldShowDropdown ? <AutoSuggestionList
410
+ left={coords.left}
411
+ loading={suggestionsPending}
412
+ options={suggestions}
413
+ isOpen={!suggestionsPending && shouldShowDropdown}
414
+ onItemSelectionChange={handleDropdownChange}
415
+ currentlyFocusedIndex={focusedIndex}
416
+ itemToHighlight={handleItemHighlighting}
417
+ /> : null}
418
+ </div>
419
+
420
+ const withRightElement = rightElement || leftElement ? <Toolbar noWrap={true}>
421
+ {leftElement && <ToolbarSection>{leftElement}</ToolbarSection>}
422
+ <ToolbarSection canGrow={true}>{autoSuggestionInput}</ToolbarSection>
423
+ {rightElement && <ToolbarSection>{rightElement}</ToolbarSection>}
424
+ </Toolbar> : autoSuggestionInput
425
+
426
+ return label ? (
427
+ <FieldItem
428
+ labelAttributes={{
429
+ text: (
430
+ <>
431
+ {label}
432
+ &nbsp;
433
+ {(pathValidationPending || suggestionsPending) && (
434
+ <Spinner size="tiny" position="inline" description="Validating value path" />
435
+ )}
436
+ </>)
437
+ }}
438
+ hasStateDanger={hasError}
439
+ messageText={hasError ? validationErrorText : undefined}
440
+ >
441
+ {withRightElement}
442
+ </FieldItem>
443
+ ) : withRightElement
444
+ };
445
+
446
+ export default AutoSuggestion;