@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,170 @@
1
+ import React from "react";
2
+ import computeScrollIntoView from "compute-scroll-into-view";
3
+ import {
4
+ Menu,
5
+ MenuItem,
6
+ Highlighter,
7
+ OverviewItem,
8
+ OverviewItemDescription,
9
+ OverviewItemLine,
10
+ OverflowText,
11
+ Spinner,
12
+ Spacing,
13
+ Tooltip,
14
+ } from "./../../";
15
+ import { ISuggestionWithReplacementInfo } from "./AutoSuggestion";
16
+
17
+ export interface IDropdownProps {
18
+ // The options of the drop down
19
+ options: Array<ISuggestionWithReplacementInfo>;
20
+ // Called when an item has been selected from the drop down
21
+ onItemSelectionChange: (item: ISuggestionWithReplacementInfo) => any;
22
+ // If the drop down is visible
23
+ isOpen: boolean;
24
+ // If the drop down should show a loading state
25
+ loading?: boolean;
26
+ left?: number;
27
+ // The item from the drop down that is active
28
+ currentlyFocusedIndex: number;
29
+ // Callback indicating what item should currently being highlighted, i.e. is either active or is hovered over
30
+ itemToHighlight: (item: ISuggestionWithReplacementInfo | undefined) => any;
31
+ }
32
+
33
+ const ListItem = ({ item }: any, ref: any) => {
34
+ const listItem = (
35
+ <OverviewItem densityHigh={true}>
36
+ <OverviewItemDescription>
37
+ <OverviewItemLine>
38
+ <OverflowText ellipsis="reverse">
39
+ <Highlighter
40
+ label={item.value}
41
+ searchValue={item.query}
42
+ />
43
+ </OverflowText>
44
+ </OverviewItemLine>
45
+ {item.description ? (
46
+ <OverviewItemLine small={true}>
47
+ <OverflowText>
48
+ <Highlighter
49
+ label={item.description}
50
+ searchValue={item.query}
51
+ />
52
+ </OverflowText>
53
+ </OverviewItemLine>
54
+ ) : null}
55
+ </OverviewItemDescription>
56
+ </OverviewItem>
57
+ );
58
+
59
+ return (
60
+ <div ref={ref}>
61
+ {!!item.description && item.description.length > 50 ? (
62
+ <Tooltip content={item.description}>{listItem}</Tooltip>
63
+ ) : (
64
+ <>{listItem}</>
65
+ )}
66
+ </div>
67
+ );
68
+ };
69
+
70
+ const Item = React.forwardRef(ListItem);
71
+
72
+ /** A drop-down-like list that can be used in combination with other components to show and select items. */
73
+ export const AutoSuggestionList = ({
74
+ isOpen,
75
+ options,
76
+ loading,
77
+ onItemSelectionChange,
78
+ left,
79
+ currentlyFocusedIndex,
80
+ itemToHighlight,
81
+ }: IDropdownProps) => {
82
+ const [hoveredItem, setHoveredItem] = React.useState<
83
+ ISuggestionWithReplacementInfo | undefined
84
+ >(undefined);
85
+ // Refs of list items
86
+ const [refs] = React.useState<React.RefObject<Element>[]>([])
87
+ const dropdownRef = React.useRef<HTMLDivElement>(null);
88
+ const generateRef = (index: number) => {
89
+ if (!refs[index]) {
90
+ refs[index] = React.createRef();
91
+ }
92
+ return refs[index];
93
+ };
94
+
95
+ React.useEffect(() => {
96
+ const listIndexNode = refs[currentlyFocusedIndex];
97
+ if (dropdownRef?.current && listIndexNode?.current) {
98
+ const actions = computeScrollIntoView(listIndexNode.current, {
99
+ boundary: dropdownRef.current,
100
+ block: "nearest",
101
+ scrollMode: "if-needed",
102
+ });
103
+ actions.forEach(({ el, top, left }) => {
104
+ el.scrollTop = top;
105
+ el.scrollLeft = left;
106
+ });
107
+ }
108
+ }, [currentlyFocusedIndex, refs]);
109
+
110
+ const focusedItem = options[currentlyFocusedIndex]
111
+
112
+ // Decide which item to highlight
113
+ React.useEffect(() => {
114
+ itemToHighlight(!isOpen ? undefined : hoveredItem || focusedItem);
115
+ }, [
116
+ currentlyFocusedIndex,
117
+ itemToHighlight,
118
+ focusedItem,
119
+ isOpen,
120
+ hoveredItem,
121
+ ]);
122
+
123
+ const Loader = (
124
+ <OverviewItem hasSpacing>
125
+ <OverviewItemLine>Fetching suggestions</OverviewItemLine>
126
+ <Spacing size="tiny" vertical={true} />
127
+ <Spinner position="inline" description="" />
128
+ </OverviewItem>
129
+ );
130
+
131
+ const loadingOrHasSuggestions = loading || options.length;
132
+ if (!loadingOrHasSuggestions || !isOpen) return null;
133
+ return (
134
+ <div
135
+ className="ecc-auto-suggestion-box__dropdown"
136
+ style={{ left }}
137
+ ref={dropdownRef}
138
+ >
139
+ {loading ? (
140
+ Loader
141
+ ) : (
142
+ <Menu>
143
+ {options.map((item, index) => (
144
+ <MenuItem
145
+ key={index}
146
+ internalProps={{
147
+ active: currentlyFocusedIndex === index,
148
+ onMouseDown: (e) => e.preventDefault(),
149
+ onClick: () => onItemSelectionChange(item),
150
+ text: (
151
+ <Item
152
+ ref={generateRef(index)}
153
+ item={item}
154
+ />
155
+ ),
156
+ onMouseEnter: () => setHoveredItem(item),
157
+ onMouseLeave: () => setHoveredItem(undefined),
158
+ onMouseOver: () => {
159
+ if (item.value !== hoveredItem?.value) {
160
+ setHoveredItem(item);
161
+ }
162
+ },
163
+ }}
164
+ />
165
+ ))}
166
+ </Menu>
167
+ )}
168
+ </div>
169
+ );
170
+ };
@@ -0,0 +1,97 @@
1
+ import "codemirror/addon/display/placeholder"
2
+ import "codemirror/mode/sparql/sparql.js";
3
+ import React from "react";
4
+ import { Controlled as ControlledEditor } from "react-codemirror2";
5
+ import { Classes as BlueprintClassNames } from "@blueprintjs/core";
6
+ import {Editor as CodeMirrorEditor} from "codemirror";
7
+
8
+ export interface IEditorProps {
9
+ // Is called with the editor instance that allows access via the CodeMirror API
10
+ setEditorInstance: (editor: CodeMirrorEditor) => any
11
+ // Called whenever the editor content changes
12
+ onChange: (value: string) => any
13
+ // Called when the cursor position changes
14
+ onCursorChange: (pos: any, coords: any) => any
15
+ // The editor theme, e.g. "sparql"
16
+ mode?: string
17
+ // The initial value of the editor
18
+ initialValue: string
19
+ // Called when the focus status changes
20
+ onFocusChange: (focused: boolean) => any
21
+ // Called when the user presses a key
22
+ onKeyDown: (event: KeyboardEvent) => any
23
+ // Called when the user selects text
24
+ onSelection: (ranges: IRange[]) => any
25
+ // If the <Tab> key is enabled as normal input, i.e. it won't have the behavior of changing to the next input element, expected in a web app.
26
+ enableTab?: boolean
27
+ /** Placeholder tobe shown when no text has been entered, yet. */
28
+ placeholder?: string
29
+ showScrollBar?: boolean
30
+ }
31
+
32
+ export interface IRange {
33
+ from: number
34
+ to: number
35
+ }
36
+
37
+ /** A single-line code editor. */
38
+ const SingleLineCodeEditor = ({
39
+ setEditorInstance,
40
+ onChange,
41
+ onCursorChange,
42
+ mode,
43
+ initialValue,
44
+ onFocusChange,
45
+ onKeyDown,
46
+ onSelection,
47
+ enableTab = false,
48
+ placeholder,
49
+ showScrollBar = true
50
+ }: IEditorProps) => {
51
+ return (
52
+ <div className={"ecc-input-editor " + BlueprintClassNames.INPUT}>
53
+ <ControlledEditor
54
+ editorDidMount={(editor) => {
55
+ editor.on("beforeChange", (_, change) => {
56
+ // Prevent the user from entering new-line characters, since this is supposed to be a one-line editor.
57
+ const newText = change.text.join("").replace(/\n/g, "");
58
+ //failing unexpectedly during undo and redo
59
+ if (change.update && typeof change.update === "function") {
60
+ change.update(change.from, change.to, [newText]);
61
+ }
62
+ return true;
63
+ });
64
+ setEditorInstance(editor);
65
+ }}
66
+ value={initialValue}
67
+ onFocus={() => onFocusChange(true)}
68
+ onBlur={() => onFocusChange(false)}
69
+ options={{
70
+ mode: mode,
71
+ lineNumbers: false,
72
+ theme: "xq-light",
73
+ extraKeys: enableTab ? undefined : {Tab: false},
74
+ placeholder,
75
+ scrollbarStyle: showScrollBar ? "native" : "null"
76
+ }}
77
+ onSelection={(editor, data) => {
78
+ if(Array.isArray(data?.ranges)) {
79
+ onSelection(data.ranges
80
+ .map((r: any) => ({from: r.from().ch, to: r.to().ch}))
81
+ .filter((r: any) => r.from !== r.to))
82
+ }
83
+ }}
84
+ onCursor={(editor, data) => {
85
+ onCursorChange(data, editor.cursorCoords(true, "div"));
86
+ }}
87
+ onBeforeChange={(editor, data, value) => {
88
+ const trimmedValue = value.replace(/\n/g, "");
89
+ onChange(trimmedValue);
90
+ }}
91
+ onKeyDown={(_, event) => onKeyDown(event)}
92
+ />
93
+ </div>
94
+ );
95
+ };
96
+
97
+ export default SingleLineCodeEditor;
@@ -0,0 +1,37 @@
1
+ import React from "react";
2
+ import "@testing-library/jest-dom";
3
+ import {render} from "@testing-library/react";
4
+ import AutoSuggestion, {IProps} from "../AutoSuggestion"
5
+
6
+ describe("AutoSuggestion", () => {
7
+ let props: IProps
8
+ beforeEach(() => {
9
+ props = {
10
+ label: "test value path",
11
+ initialValue: "",
12
+ onChange: jest.fn((value) => {
13
+ }),
14
+ fetchSuggestions: jest.fn((inputString, cursorPosition) => undefined),
15
+ checkInput: jest.fn(inputString => ({
16
+ valid: true
17
+ })),
18
+ onInputChecked: jest.fn(validInput => {
19
+ }),
20
+ validationErrorText: "",
21
+ clearIconText: "",
22
+ onFocusChange: jest.fn(hasFocus => {
23
+ }),
24
+ id: "test-auto-suggestion"
25
+ }
26
+ })
27
+
28
+ it("should render properly", () => {
29
+ const {container} = render(<AutoSuggestion {...props} />)
30
+ expect(container).not.toBeEmptyDOMElement()
31
+ })
32
+
33
+ it("should set label prop properly", () => {
34
+ const {getByText} = render(<AutoSuggestion {...props}/>)
35
+ expect(getByText(props.label!!)).toBeTruthy()
36
+ })
37
+ })
@@ -0,0 +1,124 @@
1
+ import React from 'react';
2
+ import '@testing-library/jest-dom'
3
+ import {fireEvent, render} from '@testing-library/react'
4
+ import {CLASSPREFIX as eccgui} from "../../../configuration/constants";
5
+ import {AutoSuggestionList, IDropdownProps} from '../AutoSuggestionList'
6
+
7
+ describe("Dropdown list", () => {
8
+ let props:IDropdownProps, mockOptions
9
+ beforeEach(() => {
10
+ props = {
11
+ currentlyFocusedIndex: 0,
12
+ loading: false,
13
+ left:0,
14
+ isOpen: false,
15
+ options: [],
16
+ itemToHighlight: () => {},
17
+ onItemSelectionChange: () => {}
18
+ }
19
+
20
+ mockOptions = [
21
+ {
22
+ query:"organizations",
23
+ from: 0,
24
+ length: 13,
25
+ value:"organizations/name"
26
+ },
27
+ {
28
+ query:"",
29
+ from: 13,
30
+ length:0,
31
+ value:"/"
32
+ }
33
+ ]
34
+ })
35
+
36
+
37
+ it("doesn't render when not focused", () => {
38
+ const {container} = render(<AutoSuggestionList {...props} />)
39
+ expect(container).toBeEmptyDOMElement()
40
+ })
41
+
42
+ it("should be able to display loading state, when fetching suggestions", () => {
43
+ props = {
44
+ ...props,
45
+ loading: true,
46
+ isOpen: true
47
+ }
48
+ const {getByText} = render(<AutoSuggestionList {...props} />)
49
+ expect(getByText("Fetching suggestions")).toBeTruthy()
50
+ })
51
+
52
+ it("should render list when suggestions are fetched", () => {
53
+ props = {
54
+ ...props,
55
+ loading: false,
56
+ isOpen:true,
57
+ options: mockOptions
58
+ }
59
+ const {container} = render(<AutoSuggestionList {...props} />)
60
+ const dropdownItems = container.getElementsByTagName("li")
61
+ expect(container).not.toBeEmptyDOMElement()
62
+ expect(dropdownItems.length).toBe(2)
63
+ })
64
+
65
+ it("should move horizontally for every cursor movement", () => {
66
+ props = {
67
+ ...props,
68
+ options: mockOptions,
69
+ loading: false,
70
+ isOpen: true,
71
+ left: 10
72
+ }
73
+ const {container} = render(<AutoSuggestionList {...props} />)
74
+ const parentDiv:HTMLElement = container.querySelector(".ecc-auto-suggestion-box__dropdown")!!
75
+ const leftOffset = Number(parentDiv.style.left.replace(/px$/,""));
76
+ expect(leftOffset).toBe(props.left)
77
+ })
78
+
79
+ it("should have one active item at a time", () => {
80
+ props = {
81
+ ...props,
82
+ loading: false,
83
+ isOpen:true,
84
+ options: mockOptions
85
+ }
86
+ const {container} = render(<AutoSuggestionList {...props} />)
87
+ const activeListItems = Array.from(container.querySelectorAll("li .bp3-menu-item.bp3-active"))
88
+ expect(activeListItems.length).toBe(1)
89
+ })
90
+
91
+ it("should respond to click on each item and pass the clicked item to autosuggestion", () => {
92
+ const mockOnItemSelection = jest.fn((item) => {})
93
+ props = {
94
+ ...props,
95
+ loading: false,
96
+ isOpen:true,
97
+ options: mockOptions,
98
+ onItemSelectionChange: mockOnItemSelection
99
+ }
100
+ const {getByText} = render(<AutoSuggestionList {...props}/>)
101
+ const dropdownListItem = getByText(props.options[0].query).closest(`.${eccgui}-menu__item`);
102
+ fireEvent.click(dropdownListItem!!)
103
+ expect(mockOnItemSelection).toHaveBeenCalledTimes(1)
104
+ expect(mockOnItemSelection).toHaveBeenCalledWith(props.options[0])
105
+ })
106
+
107
+ it("should call highlight function when list item is mouse hovered",() => {
108
+ const mockItemToHighlight = jest.fn((item) => {})
109
+ props = {
110
+ ...props,
111
+ loading: false,
112
+ isOpen:true,
113
+ options: mockOptions,
114
+ itemToHighlight: mockItemToHighlight
115
+ }
116
+ const {container} = render(<AutoSuggestionList {...props}/>)
117
+ const firstItem = container.querySelector("li");
118
+ fireEvent.mouseEnter(firstItem!!)
119
+ expect(mockItemToHighlight).toHaveBeenCalledWith(props.options[0])
120
+ expect(mockItemToHighlight).toHaveBeenCalledTimes(1)
121
+ fireEvent.mouseLeave(firstItem!!)
122
+ expect(mockItemToHighlight).toHaveBeenCalledTimes(1)
123
+ })
124
+ })
@@ -0,0 +1,55 @@
1
+ import React from "react";
2
+ import "@testing-library/jest-dom";
3
+ import { render } from "@testing-library/react";
4
+ import SingleLineEditor, {
5
+ IEditorProps,
6
+ } from "../SingleLineCodeEditor";
7
+ import CodeMirror from "codemirror";
8
+
9
+ describe("SingleLineCodeEditor", () => {
10
+ let props: IEditorProps,
11
+ codeMirrorEditorInstance: CodeMirror.Editor = null as any;
12
+ beforeEach(() => {
13
+ props = {
14
+ setEditorInstance: jest.fn((editor) => {
15
+ codeMirrorEditorInstance = editor;
16
+ }),
17
+ onChange: jest.fn((value) => {}),
18
+ onCursorChange: jest.fn((pos, coords) => {}),
19
+ mode: null,
20
+ initialValue: "",
21
+ onFocusChange: jest.fn((focused) => {}),
22
+ onKeyDown: jest.fn((event) => {}),
23
+ onSelection: jest.fn((ranges) => {}),
24
+ };
25
+ });
26
+
27
+ it("should render properly", () => {
28
+ const { container } = render(<SingleLineEditor {...props} />);
29
+ expect(container.querySelector(".ecc-input-editor")).not.toBeNull();
30
+ });
31
+
32
+ it("should set the editorInstance immediately it's mounted", () => {
33
+ render(<SingleLineEditor {...props} />);
34
+ expect(props.setEditorInstance).toHaveBeenCalledTimes(1);
35
+ expect(codeMirrorEditorInstance).not.toBeNull();
36
+ });
37
+
38
+ it("should set the default value on the editor input", () => {
39
+ props = {
40
+ ...props,
41
+ initialValue: "This is the initial input",
42
+ };
43
+ const { getByText } = render(<SingleLineEditor {...props} />);
44
+ expect(codeMirrorEditorInstance.getValue()).toBe(props.initialValue);
45
+ expect(getByText(props.initialValue)).toBeTruthy();
46
+ });
47
+
48
+ it("should not allow user to create new lines", () => {
49
+ render(<SingleLineEditor {...props} />);
50
+ codeMirrorEditorInstance
51
+ .getDoc()
52
+ .setValue("I'm entering a new line \n character");
53
+ expect(codeMirrorEditorInstance.lineCount()).toBe(1);
54
+ });
55
+ });
@@ -17,10 +17,9 @@ export interface IRenderModifiers {
17
17
  /**
18
18
  * Parameters for the auto-complete field parameterized by T and U.
19
19
  * @param T is the input data structure/type of the items that can be selected.
20
- * @param U is the output data structure/type that is output on changes of the selected item, i.e. it may get converted first
21
- * before onChange is called.
20
+ * @param UPDATE_VALUE The value type that will be pushed into the onChange callback.
22
21
  */
23
- export interface IAutoCompleteFieldProps<T extends any, U extends any> {
22
+ export interface IAutoCompleteFieldProps<T extends any, UPDATE_VALUE extends any> {
24
23
  /**
25
24
  * Fired when text is typed into the input field. Returns a list of items of type T.
26
25
  */
@@ -31,7 +30,7 @@ export interface IAutoCompleteFieldProps<T extends any, U extends any> {
31
30
  * @param value The value that has been converted with itemValueSelector.
32
31
  * @param e The event
33
32
  */
34
- onChange?(value: U, e?: React.SyntheticEvent<HTMLElement>): any;
33
+ onChange?(value: UPDATE_VALUE, e?: React.SyntheticEvent<HTMLElement>): any;
35
34
 
36
35
  /**
37
36
  * The initial value for the auto-complete input field
@@ -58,7 +57,10 @@ export interface IAutoCompleteFieldProps<T extends any, U extends any> {
58
57
  * Selects the part from the auto-completion item that is called with the onChange callback.
59
58
  * @param item The selected item that should be converted to the value that onChange is called with.
60
59
  */
61
- itemValueSelector(item: T): U;
60
+ itemValueSelector(item: T): UPDATE_VALUE;
61
+
62
+ /** The string representation of the actual value, i.e. without meta data etc. This will be used to compare if values are equal. */
63
+ itemValueString(item: T): string
62
64
 
63
65
  /** The text that should be displayed when no search result has been found and no custom entry can be created. */
64
66
  noResultText: string
@@ -84,7 +86,7 @@ export interface IAutoCompleteFieldProps<T extends any, U extends any> {
84
86
  resettableValue(value: T): boolean;
85
87
 
86
88
  /** The value onChange is called with when a reset action is triggered. */
87
- resetValue: U;
89
+ resetValue: UPDATE_VALUE;
88
90
 
89
91
  /** The reset button text that is shown on hovering over the reset icon. */
90
92
  resetButtonText: string
@@ -143,7 +145,7 @@ const elementWidth = (elRef: IRefObject<HTMLInputElement> | null): IElementWidth
143
145
  }
144
146
 
145
147
  /** Auto-complete input widget. */
146
- export function AutoCompleteField<T extends any, U extends any>(props: IAutoCompleteFieldProps<T, U>) {
148
+ export function AutoCompleteField<T extends any, UPDATE_VALUE extends any>(props: IAutoCompleteFieldProps<T, UPDATE_VALUE>) {
147
149
  const {
148
150
  reset,
149
151
  noResultText,
@@ -157,6 +159,7 @@ export function AutoCompleteField<T extends any, U extends any>(props: IAutoComp
157
159
  createNewItem,
158
160
  itemValueRenderer,
159
161
  resetQueryToValue,
162
+ itemValueString,
160
163
  ...otherProps
161
164
  } = props;
162
165
  const [selectedItem, setSelectedItem] = useState<T | undefined>(initialValue);
@@ -177,8 +180,8 @@ export function AutoCompleteField<T extends any, U extends any>(props: IAutoComp
177
180
  if (item) {
178
181
  // If new values can be created, always reset the query value to the actual value of the selected item.
179
182
  // This e.g. prevents that the "create new" option will be shown, since an item with the same value already exists.
180
- const defaultResetValue: string = createNewItem && typeof itemValueSelector(item) === "string" ? (
181
- itemValueSelector(item) as string
183
+ const defaultResetValue: string = createNewItem ? (
184
+ itemValueString(item) as string
182
185
  ) : itemValueRenderer(item)
183
186
  const resetVal = resetQueryToValue ? resetQueryToValue(item) : defaultResetValue
184
187
  setQuery(resetVal)
@@ -189,11 +192,7 @@ export function AutoCompleteField<T extends any, U extends any>(props: IAutoComp
189
192
 
190
193
  // The key for the option elements
191
194
  const itemKey = (item: T): string => {
192
- let itemValue: U | string = itemValueSelector(item);
193
- if (typeof itemValue !== "string") {
194
- itemValue = itemValueRenderer(item);
195
- }
196
- return itemValue;
195
+ return itemValueString(item);
197
196
  };
198
197
 
199
198
  useEffect(() => {
@@ -250,9 +249,9 @@ export function AutoCompleteField<T extends any, U extends any>(props: IAutoComp
250
249
  // Return the index of the item in the array based on the itemValueRenderer value
251
250
  const itemIndexOf = (arr: T[], searchItem: T): number => {
252
251
  let idx = -1;
253
- const searchItemString = itemValueSelector(searchItem);
252
+ const searchItemString = itemValueString(searchItem);
254
253
  arr.forEach((v, i) => {
255
- if (itemValueSelector(v) === searchItemString) {
254
+ if (itemValueString(v) === searchItemString) {
256
255
  idx = i;
257
256
  }
258
257
  });
@@ -265,7 +264,7 @@ export function AutoCompleteField<T extends any, U extends any>(props: IAutoComp
265
264
  try {
266
265
  let result = await onSearch(input);
267
266
  const onlySelectItemReturned = result.length <= 1 && selectedItem && input.length > 0 &&
268
- (itemValueRenderer(selectedItem) === input || itemValueSelector(selectedItem) === input)
267
+ (itemValueRenderer(selectedItem) === input || itemValueString(selectedItem) === input)
269
268
  let enableHighlighting = true;
270
269
  if (onlySelectItemReturned) {
271
270
  // If the auto-completion only returns no suggestion or the selected item itself, query with empty string.
@@ -273,7 +272,8 @@ export function AutoCompleteField<T extends any, U extends any>(props: IAutoComp
273
272
  // Disable highlighting, since we used empty string search
274
273
  enableHighlighting = false;
275
274
  // Put selected item at the top if it is not in the result list
276
- if (!!selectedItem && itemIndexOf(emptyStringResults, selectedItem) === -1) {
275
+ if (!!selectedItem && itemIndexOf(emptyStringResults, selectedItem) > -1) {
276
+ emptyStringResults.splice(itemIndexOf(emptyStringResults, selectedItem), 1)
277
277
  result = [selectedItem, ...emptyStringResults];
278
278
  } else {
279
279
  result = emptyStringResults;
@@ -319,7 +319,7 @@ export function AutoCompleteField<T extends any, U extends any>(props: IAutoComp
319
319
  }
320
320
  };
321
321
  // Resets the selection
322
- const clearSelection = (resetValue: U) => () => {
322
+ const clearSelection = (resetValue: UPDATE_VALUE) => () => {
323
323
  setSelectedItem(undefined);
324
324
  onChange?.(resetValue);
325
325
  setQuery("");
@@ -347,9 +347,10 @@ export function AutoCompleteField<T extends any, U extends any>(props: IAutoComp
347
347
  };
348
348
  const updatedPopOverProps: Partial<IPopoverProps> = {
349
349
  minimal: true,
350
- position: "bottom",
350
+ position: "bottom-left",
351
351
  popoverClassName: `${eccgui}-autocompletefield__options`,
352
352
  wrapperTagName: "div",
353
+ boundary: "window",
353
354
  onClosed: onPopoverClose,
354
355
  ...otherProps.popoverProps,
355
356
  }
@@ -362,7 +363,7 @@ export function AutoCompleteField<T extends any, U extends any>(props: IAutoComp
362
363
  const createNewItemProps = createNewItem ? {
363
364
  createNewItemFromQuery: createNewItem.itemFromQuery,
364
365
  createNewItemRenderer: (query: string, active: boolean, handleClick: React.MouseEventHandler<HTMLElement>) => {
365
- if(selectedItem && query === itemValueSelector(selectedItem)) {
366
+ if(selectedItem && query === itemValueString(selectedItem)) {
366
367
  // Never show create new item option if the same item is already selected
367
368
  return undefined
368
369
  } else {
@@ -385,12 +386,12 @@ export function AutoCompleteField<T extends any, U extends any>(props: IAutoComp
385
386
  onQueryChange={(q) => setQuery(q)}
386
387
  closeOnSelect={true}
387
388
  query={query}
388
- // FIXME: This leads to odd compile errors without "as any"
389
+ // This leads to odd compile errors without "as any"
389
390
  popoverProps={updatedPopOverProps as any}
390
391
  selectedItem={selectedItem}
391
392
  fill
392
393
  {...createNewItemProps}
393
- // FIXME: This leads to odd compile errors without "as any"
394
+ // This leads to odd compile errors without "as any"
394
395
  inputProps={updatedInputProps as any}
395
396
  itemListRenderer={listLoading ? () => <Menu><MenuItem disabled={true} text={<Spinner position={"inline"} />} style={fieldWidthLimits} /></Menu> : undefined}
396
397
  />
@@ -2,6 +2,7 @@ import React from "react";
2
2
  import {IElementWidth, IRenderModifiers} from "./AutoCompleteField";
3
3
  import OverflowText from "../Typography/OverflowText";
4
4
  import MenuItem from "../Menu/MenuItem";
5
+ import {ValidIconName} from "../Icon/canonicalIconNames";
5
6
 
6
7
  /** Returns a function to be used in an AutoComplete widget for rendering custom elements based on the query string.
7
8
  *
@@ -10,7 +11,7 @@ import MenuItem from "../Menu/MenuItem";
10
11
  */
11
12
  export const createNewItemRendererFactory = (
12
13
  itemTextRenderer: (query: string, styleWidth: IElementWidth) => string | JSX.Element,
13
- iconName?: string) => {
14
+ iconName?: ValidIconName) => {
14
15
  // Return custom render function
15
16
  return (query: string, modifiers: IRenderModifiers, handleClick: React.MouseEventHandler<HTMLElement>) => {
16
17
  let textElement = itemTextRenderer(query, modifiers.styleWidth)