@boomerang-io/carbon-addons-boomerang-react 4.6.11-beta.27 → 4.6.11-beta.28

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 (255) hide show
  1. package/README.md +162 -162
  2. package/dist/cjs/components/AboutPlatform/AboutPlatform.js +50 -50
  3. package/dist/cjs/components/AdvantageSideNav/AdvantageSideNav.js +222 -211
  4. package/dist/cjs/components/AutoSuggest/AutoSuggest.js +101 -101
  5. package/dist/cjs/components/Avatar/Avatar.js +18 -18
  6. package/dist/cjs/components/CheckboxList/CheckboxList.js +34 -34
  7. package/dist/cjs/components/ComboBox/ComboBox.js +103 -103
  8. package/dist/cjs/components/ComboBoxMultiSelect/ComboBoxMultiSelect.js +32 -32
  9. package/dist/cjs/components/ComboBoxMultiSelect/MultiSelect.js +208 -208
  10. package/dist/cjs/components/ComposedModal/ComposedModal.js +80 -80
  11. package/dist/cjs/components/ConfirmModal/ConfirmModal.js +43 -43
  12. package/dist/cjs/components/Creatable/Creatable.js +137 -137
  13. package/dist/cjs/components/DataDrivenInput/DataDrivenInput.js +226 -226
  14. package/dist/cjs/components/DateInput/DateInput.js +35 -35
  15. package/dist/cjs/components/DecisionButtons/DecisionButtons.js +61 -61
  16. package/dist/cjs/components/DelayedRender/DelayedRender.js +17 -17
  17. package/dist/cjs/components/DynamicFormik/DynamicFormik.js +578 -578
  18. package/dist/cjs/components/Error403/Error403.js +13 -13
  19. package/dist/cjs/components/Error403/ForbiddenErrorBackground.js +113 -113
  20. package/dist/cjs/components/Error403/GraphicWrangler/GraphicWrangler.js +62 -62
  21. package/dist/cjs/components/Error404/Error404.js +13 -13
  22. package/dist/cjs/components/Error404/GraphicLoch/GraphicLoch.js +17 -17
  23. package/dist/cjs/components/Error404/NotFoundErrorBackground.js +129 -129
  24. package/dist/cjs/components/ErrorBoundary/ErrorBoundary.js +32 -32
  25. package/dist/cjs/components/ErrorDragon/ErrorDragon.js +13 -13
  26. package/dist/cjs/components/ErrorDragon/assets/ErrorGraphic.js +35 -35
  27. package/dist/cjs/components/ErrorFullPage/ErrorFullPage.js +10 -10
  28. package/dist/cjs/components/ErrorMessage/ErrorMessage.js +22 -22
  29. package/dist/cjs/components/ErrorPage/ErrorPage.js +11 -11
  30. package/dist/cjs/components/ErrorPageCore/ErrorPageCore.js +15 -15
  31. package/dist/cjs/components/ErrorPageCore/GenericErrorBackground.js +124 -124
  32. package/dist/cjs/components/FeatureHeader/FeatureHeader.js +29 -29
  33. package/dist/cjs/components/FeatureNavTab/FeatureNavTab.js +12 -12
  34. package/dist/cjs/components/FeatureNavTabs/FeatureNavTabs.js +12 -12
  35. package/dist/cjs/components/FeatureSideNav/FeatureSideNav.js +12 -12
  36. package/dist/cjs/components/FeatureSideNav/FeatureSideNavFooter.js +8 -8
  37. package/dist/cjs/components/FeatureSideNav/FeatureSideNavHeader.js +8 -8
  38. package/dist/cjs/components/FeatureSideNav/FeatureSideNavLinks.js +14 -14
  39. package/dist/cjs/components/FeatureSideNavLink/FeatureSideNavLink.js +12 -12
  40. package/dist/cjs/components/Feedback/Feedback.js +40 -40
  41. package/dist/cjs/components/FlowModal/FlowModal.js +141 -141
  42. package/dist/cjs/components/FlowModal/FlowModalForm.js +12 -12
  43. package/dist/cjs/components/Header/Header.js +179 -179
  44. package/dist/cjs/components/Header/HeaderAppSwitcher.js +94 -94
  45. package/dist/cjs/components/Header/HeaderMenu.js +7 -7
  46. package/dist/cjs/components/Header/HeaderMenuItem.js +52 -52
  47. package/dist/cjs/components/Header/HeaderTeamSwitcher.js +303 -305
  48. package/dist/cjs/components/Header/UserRequests.js +29 -29
  49. package/dist/cjs/components/ImageModal/ImageModal.js +17 -17
  50. package/dist/cjs/components/Loading/Loading.js +8 -8
  51. package/dist/cjs/components/MemberBar/MemberBar.js +20 -20
  52. package/dist/cjs/components/Modal/Modal.js +20 -20
  53. package/dist/cjs/components/ModalConfirmEdit/ModalConfirmArray.js +14 -14
  54. package/dist/cjs/components/ModalConfirmEdit/ModalConfirmDetails.js +11 -11
  55. package/dist/cjs/components/ModalConfirmEdit/ModalConfirmEdit.js +17 -17
  56. package/dist/cjs/components/ModalForm/ModalForm.js +9 -9
  57. package/dist/cjs/components/Notifications/NotificationsContainer.js +22 -22
  58. package/dist/cjs/components/Notifications/ToastNotification.js +21 -21
  59. package/dist/cjs/components/Notifications/notify.js +17 -17
  60. package/dist/cjs/components/PlatformBanner/PlatformBanner.js +8 -8
  61. package/dist/cjs/components/PlatformNotifications/PlatformNotification.js +17 -17
  62. package/dist/cjs/components/PlatformNotifications/PlatformNotificationsContainer.js +136 -136
  63. package/dist/cjs/components/Portal/Portal.js +14 -14
  64. package/dist/cjs/components/PrivacyRedirect/PrivacyRedirect.js +30 -30
  65. package/dist/cjs/components/PrivacyStatement/PrivacyStatement.js +90 -90
  66. package/dist/cjs/components/ProfileSettings/ProfileSettings.js +124 -124
  67. package/dist/cjs/components/ProtectedRoute/ProtectedRoute.js +13 -13
  68. package/dist/cjs/components/RadioGroup/RadioGroup.js +33 -33
  69. package/dist/cjs/components/RichTextArea/RichTextArea.js +142 -142
  70. package/dist/cjs/components/SignOut/SignOut.js +27 -27
  71. package/dist/cjs/components/SupportCenter/SupportCenter.js +65 -65
  72. package/dist/cjs/components/TextArea/TextArea.js +16 -16
  73. package/dist/cjs/components/TextInput/TextInput.js +13 -13
  74. package/dist/cjs/components/Toggle/Toggle.js +22 -22
  75. package/dist/cjs/components/TooltipHover/TooltipHover.js +39 -39
  76. package/dist/cjs/components/UIShell/UIShell.js +94 -94
  77. package/dist/cjs/config/servicesConfig.js +21 -21
  78. package/dist/cjs/constants/DataDrivenInputTypes.js +74 -74
  79. package/dist/cjs/constants/UserType.js +13 -13
  80. package/dist/cjs/hooks/useHeaderMenu.js +49 -49
  81. package/dist/cjs/hooks/usePortal.js +74 -74
  82. package/dist/cjs/hooks/useWindowSize.js +33 -33
  83. package/dist/cjs/internal/ListBox/ListBox.js +41 -41
  84. package/dist/cjs/internal/ListBox/ListBoxField.js +19 -19
  85. package/dist/cjs/internal/ListBox/ListBoxMenu.js +19 -19
  86. package/dist/cjs/internal/ListBox/ListBoxMenuIcon.js +31 -31
  87. package/dist/cjs/internal/ListBox/ListBoxMenuItem.js +38 -38
  88. package/dist/cjs/internal/ListBox/ListBoxSelection.js +64 -64
  89. package/dist/cjs/internal/ListBox/index.js +10 -10
  90. package/dist/cjs/internal/keyboard/keys.js +16 -16
  91. package/dist/cjs/internal/keyboard/match.js +67 -67
  92. package/dist/cjs/internal/settings.js +5 -5
  93. package/dist/cjs/tools/accessibility.js +13 -13
  94. package/dist/cjs/tools/createPropAdapter.js +44 -44
  95. package/dist/cjs/tools/isUrl.js +39 -39
  96. package/dist/cjs/tools/setupGetInstanceId.js +20 -20
  97. package/dist/cjs/tools/useSetState.js +12 -12
  98. package/dist/cjs/tools/yupAst/astGenerator.js +212 -212
  99. package/dist/cjs/tools/yupAst/customValidators.js +17 -17
  100. package/dist/esm/components/AboutPlatform/AboutPlatform.js +50 -50
  101. package/dist/esm/components/AdvantageSideNav/AdvantageSideNav.js +222 -211
  102. package/dist/esm/components/AutoSuggest/AutoSuggest.js +101 -101
  103. package/dist/esm/components/Avatar/Avatar.js +18 -18
  104. package/dist/esm/components/CheckboxList/CheckboxList.js +34 -34
  105. package/dist/esm/components/ComboBox/ComboBox.js +103 -103
  106. package/dist/esm/components/ComboBoxMultiSelect/ComboBoxMultiSelect.js +32 -32
  107. package/dist/esm/components/ComboBoxMultiSelect/MultiSelect.js +208 -208
  108. package/dist/esm/components/ComposedModal/ComposedModal.js +80 -80
  109. package/dist/esm/components/ConfirmModal/ConfirmModal.js +43 -43
  110. package/dist/esm/components/Creatable/Creatable.js +137 -137
  111. package/dist/esm/components/DataDrivenInput/DataDrivenInput.js +226 -226
  112. package/dist/esm/components/DateInput/DateInput.js +35 -35
  113. package/dist/esm/components/DecisionButtons/DecisionButtons.js +61 -61
  114. package/dist/esm/components/DelayedRender/DelayedRender.js +17 -17
  115. package/dist/esm/components/DynamicFormik/DynamicFormik.js +578 -578
  116. package/dist/esm/components/Error403/Error403.js +13 -13
  117. package/dist/esm/components/Error403/ForbiddenErrorBackground.js +113 -113
  118. package/dist/esm/components/Error403/GraphicWrangler/GraphicWrangler.js +62 -62
  119. package/dist/esm/components/Error404/Error404.js +13 -13
  120. package/dist/esm/components/Error404/GraphicLoch/GraphicLoch.js +17 -17
  121. package/dist/esm/components/Error404/NotFoundErrorBackground.js +129 -129
  122. package/dist/esm/components/ErrorBoundary/ErrorBoundary.js +32 -32
  123. package/dist/esm/components/ErrorDragon/ErrorDragon.js +13 -13
  124. package/dist/esm/components/ErrorDragon/assets/ErrorGraphic.js +35 -35
  125. package/dist/esm/components/ErrorFullPage/ErrorFullPage.js +10 -10
  126. package/dist/esm/components/ErrorMessage/ErrorMessage.js +22 -22
  127. package/dist/esm/components/ErrorPage/ErrorPage.js +11 -11
  128. package/dist/esm/components/ErrorPageCore/ErrorPageCore.js +15 -15
  129. package/dist/esm/components/ErrorPageCore/GenericErrorBackground.js +124 -124
  130. package/dist/esm/components/FeatureHeader/FeatureHeader.js +29 -29
  131. package/dist/esm/components/FeatureNavTab/FeatureNavTab.js +12 -12
  132. package/dist/esm/components/FeatureNavTabs/FeatureNavTabs.js +12 -12
  133. package/dist/esm/components/FeatureSideNav/FeatureSideNav.js +12 -12
  134. package/dist/esm/components/FeatureSideNav/FeatureSideNavFooter.js +8 -8
  135. package/dist/esm/components/FeatureSideNav/FeatureSideNavHeader.js +8 -8
  136. package/dist/esm/components/FeatureSideNav/FeatureSideNavLinks.js +14 -14
  137. package/dist/esm/components/FeatureSideNavLink/FeatureSideNavLink.js +12 -12
  138. package/dist/esm/components/Feedback/Feedback.js +40 -40
  139. package/dist/esm/components/FlowModal/FlowModal.js +141 -141
  140. package/dist/esm/components/FlowModal/FlowModalForm.js +12 -12
  141. package/dist/esm/components/Header/Header.js +179 -179
  142. package/dist/esm/components/Header/HeaderAppSwitcher.js +94 -94
  143. package/dist/esm/components/Header/HeaderMenu.js +7 -7
  144. package/dist/esm/components/Header/HeaderMenuItem.js +52 -52
  145. package/dist/esm/components/Header/HeaderTeamSwitcher.js +303 -305
  146. package/dist/esm/components/Header/UserRequests.js +29 -29
  147. package/dist/esm/components/ImageModal/ImageModal.js +17 -17
  148. package/dist/esm/components/Loading/Loading.js +8 -8
  149. package/dist/esm/components/MemberBar/MemberBar.js +20 -20
  150. package/dist/esm/components/Modal/Modal.js +20 -20
  151. package/dist/esm/components/ModalConfirmEdit/ModalConfirmArray.js +14 -14
  152. package/dist/esm/components/ModalConfirmEdit/ModalConfirmDetails.js +11 -11
  153. package/dist/esm/components/ModalConfirmEdit/ModalConfirmEdit.js +17 -17
  154. package/dist/esm/components/ModalForm/ModalForm.js +9 -9
  155. package/dist/esm/components/Notifications/NotificationsContainer.js +22 -22
  156. package/dist/esm/components/Notifications/ToastNotification.js +21 -21
  157. package/dist/esm/components/Notifications/notify.js +17 -17
  158. package/dist/esm/components/PlatformBanner/PlatformBanner.js +8 -8
  159. package/dist/esm/components/PlatformNotifications/PlatformNotification.js +17 -17
  160. package/dist/esm/components/PlatformNotifications/PlatformNotificationsContainer.js +136 -136
  161. package/dist/esm/components/Portal/Portal.js +14 -14
  162. package/dist/esm/components/PrivacyRedirect/PrivacyRedirect.js +30 -30
  163. package/dist/esm/components/PrivacyStatement/PrivacyStatement.js +90 -90
  164. package/dist/esm/components/ProfileSettings/ProfileSettings.js +124 -124
  165. package/dist/esm/components/ProtectedRoute/ProtectedRoute.js +13 -13
  166. package/dist/esm/components/RadioGroup/RadioGroup.js +33 -33
  167. package/dist/esm/components/RichTextArea/RichTextArea.js +142 -142
  168. package/dist/esm/components/SignOut/SignOut.js +27 -27
  169. package/dist/esm/components/SupportCenter/SupportCenter.js +65 -65
  170. package/dist/esm/components/TextArea/TextArea.js +16 -16
  171. package/dist/esm/components/TextInput/TextInput.js +13 -13
  172. package/dist/esm/components/Toggle/Toggle.js +22 -22
  173. package/dist/esm/components/TooltipHover/TooltipHover.js +39 -39
  174. package/dist/esm/components/UIShell/UIShell.js +94 -94
  175. package/dist/esm/config/servicesConfig.js +21 -21
  176. package/dist/esm/constants/DataDrivenInputTypes.js +74 -74
  177. package/dist/esm/constants/UserType.js +13 -13
  178. package/dist/esm/hooks/useHeaderMenu.js +49 -49
  179. package/dist/esm/hooks/usePortal.js +74 -74
  180. package/dist/esm/hooks/useWindowSize.js +33 -33
  181. package/dist/esm/internal/ListBox/ListBox.js +41 -41
  182. package/dist/esm/internal/ListBox/ListBoxField.js +19 -19
  183. package/dist/esm/internal/ListBox/ListBoxMenu.js +19 -19
  184. package/dist/esm/internal/ListBox/ListBoxMenuIcon.js +31 -31
  185. package/dist/esm/internal/ListBox/ListBoxMenuItem.js +38 -38
  186. package/dist/esm/internal/ListBox/ListBoxSelection.js +64 -64
  187. package/dist/esm/internal/ListBox/index.js +10 -10
  188. package/dist/esm/internal/keyboard/keys.js +16 -16
  189. package/dist/esm/internal/keyboard/match.js +67 -67
  190. package/dist/esm/internal/settings.js +5 -5
  191. package/dist/esm/tools/accessibility.js +13 -13
  192. package/dist/esm/tools/createPropAdapter.js +44 -44
  193. package/dist/esm/tools/isUrl.js +39 -39
  194. package/dist/esm/tools/setupGetInstanceId.js +20 -20
  195. package/dist/esm/tools/useSetState.js +12 -12
  196. package/dist/esm/tools/yupAst/astGenerator.js +212 -212
  197. package/dist/esm/tools/yupAst/customValidators.js +17 -17
  198. package/dist/types/index.d.ts +1335 -1420
  199. package/package.json +167 -167
  200. package/scss/components/AboutPlatform/_aboutPlatform.scss +139 -139
  201. package/scss/components/AdvantageSideNav/_advantageSideNav.scss +261 -261
  202. package/scss/components/AutoSuggest/_autoSuggest.scss +62 -62
  203. package/scss/components/Avatar/_avatar.scss +32 -32
  204. package/scss/components/CheckboxList/_checkboxList.scss +26 -26
  205. package/scss/components/ComboBox/_combobox.scss +23 -23
  206. package/scss/components/ComboBoxMultiSelect/_comboBoxMultiSelect.scss +53 -53
  207. package/scss/components/ConfirmModal/_confirmModal.scss +12 -12
  208. package/scss/components/Creatable/_creatable.scss +48 -48
  209. package/scss/components/DateInput/_dateInput.scss +36 -36
  210. package/scss/components/DecisionButtons/_decisionButtons.scss +132 -132
  211. package/scss/components/DynamicFormik/_dynamicFormik.scss +17 -17
  212. package/scss/components/ErrorBoundary/_errorBoundary.scss +12 -12
  213. package/scss/components/ErrorDragon/_errorDragon.scss +55 -55
  214. package/scss/components/ErrorMessage/_errorMessage.scss +43 -43
  215. package/scss/components/ErrorPage/_errorPage.scss +66 -66
  216. package/scss/components/ErrorPageCore/_errorPageCore.scss +73 -73
  217. package/scss/components/FeatureHeader/_featureHeader.scss +67 -67
  218. package/scss/components/FeatureNavTab/_featureNavTab.scss +27 -27
  219. package/scss/components/FeatureSideNav/_featureSideNav.scss +76 -76
  220. package/scss/components/FeatureSideNavLink/_featureSideNavLink.scss +49 -49
  221. package/scss/components/Feedback/_feedback.scss +46 -46
  222. package/scss/components/Header/_header.scss +179 -179
  223. package/scss/components/Header/_headerAppSwitcher.scss +117 -117
  224. package/scss/components/Header/_headerMenu.scss +30 -30
  225. package/scss/components/Header/_headerMenuItem.scss +65 -65
  226. package/scss/components/Header/_headerTeamSwitcher.scss +195 -195
  227. package/scss/components/Header/_userRequests.scss +36 -36
  228. package/scss/components/ImageModal/_imageModal.scss +51 -51
  229. package/scss/components/MemberBar/_memberBar.scss +99 -99
  230. package/scss/components/Modal/_modal.scss +163 -163
  231. package/scss/components/ModalConfirmEdit/_modalConfirmEdit.scss +113 -113
  232. package/scss/components/Notifications/_notifications.scss +57 -57
  233. package/scss/components/PlatformBanner/_platformBanner.scss +30 -30
  234. package/scss/components/PlatformNotifications/_platformNotifications.scss +230 -230
  235. package/scss/components/PrivacyRedirect/_privacyRedirect.scss +43 -43
  236. package/scss/components/PrivacyStatement/_privacyStatement.scss +137 -137
  237. package/scss/components/ProfileSettings/_profileSettings.scss +117 -117
  238. package/scss/components/ProtectedRoute/_protectedRoute.scss +32 -32
  239. package/scss/components/RadioGroup/_radioGroup.scss +46 -46
  240. package/scss/components/RichTextArea/_richTextArea.scss +82 -82
  241. package/scss/components/SignOut/_signOut.scss +51 -51
  242. package/scss/components/SupportCenter/_supportCenter.scss +16 -16
  243. package/scss/components/TextArea/_textArea.scss +19 -19
  244. package/scss/components/TextInput/_textInput.scss +26 -26
  245. package/scss/components/Toggle/_toggle.scss +80 -80
  246. package/scss/components/TooltipHover/_tooltip.scss +48 -48
  247. package/scss/global/_config.scss +14 -14
  248. package/scss/global/_tippy.scss +49 -49
  249. package/scss/global/index.scss +401 -401
  250. package/scss/global/themes/_boomerang.scss +184 -184
  251. package/scss/global/themes/_default.scss +79 -79
  252. package/scss/global/themes/_shell-tokens.scss +42 -42
  253. package/scss/global/utils/_animations.scss +15 -15
  254. package/scss/global/utils/_mixins.scss +67 -67
  255. package/scss/global/utils/index.scss +10 -10
@@ -12,107 +12,107 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
12
  var React__default = /*#__PURE__*/_interopDefault(React);
13
13
  var AutoSuggest__default = /*#__PURE__*/_interopDefault(AutoSuggest);
14
14
 
15
- /*
16
- IBM Confidential
17
- 694970X, 69497O0
18
- © Copyright IBM Corp. 2022, 2024
19
- */
20
- const SELECT_METHODS = ["up", "down", "click"];
21
- class AutoSuggestBmrg extends React.Component {
22
- inputRef = React__default.default.createRef();
23
- state = {
24
- // Used if we want to have some of the functions external instead of
25
- // the default ones in the wrapper
26
- value: this.props.initialValue ?? "",
27
- caretIndex: 0,
28
- suggestions: [],
29
- };
30
- // Each time the component updates we want to refocus the input and keep the cursor in the correct place
31
- // Needed for when cycling through mutliple suggestions with the arrow keys and the cursor resets to the end of the input. We don't want that.
32
- componentDidUpdate(_, prevState) {
33
- if (this.state.value && prevState.value !== this.state.value) {
34
- // prevent it from focusing on initial render / empty
35
- this.inputRef.current?.focus();
36
- this.inputRef.current?.setSelectionRange(this.state.caretIndex, this.state.caretIndex);
37
- }
38
- }
39
- renderSuggestion = (suggestion) => suggestion.label;
40
- onSuggestionsFetchRequested = () => {
41
- this.setState(() => ({
42
- suggestions: this.getSuggestions(),
43
- }));
44
- };
45
- /**
46
- * More logic here for handling a user cycling through suggestions
47
- * Move the caret to the new suggestion location or use the reference to the DOM element.
48
- * Shift based on the change in length of the value b/c of different length suggestions
49
- */
50
- onInputChange = (event, { newValue, method }) => {
51
- this.setState((prevState) => ({
52
- value: newValue,
53
- caretIndex: SELECT_METHODS.includes(method)
54
- ? prevState.caretIndex + (newValue.length - prevState.value.length)
55
- : this.inputRef.current?.selectionStart ?? 0,
56
- }));
57
- this.props.onChange(newValue);
58
- };
59
- /**
60
- * Return the new value for the input
61
- * Find the current caret position
62
- * get the string up to that point
63
- * find the last word (space-delimited) and replace it in input
64
- */
65
- getSuggestionValue = (suggestion) => {
66
- const substringWordList = this.findWordsBeforeCurrentLocation();
67
- /*
68
- * Find the position of the caret, get the string up to that point
69
- * and find the index of the last word in that substring
70
- * This gives use the word to suggest matches for
71
- */
72
- const closestWord = substringWordList.at(-1);
73
- const position = this.state.value.slice(0, this.state.caretIndex).lastIndexOf(closestWord);
74
- // Sub in the new property suggestion
75
- return (this.state.value.substring(0, position) +
76
- suggestion.value +
77
- this.state.value.substring(position + closestWord.length));
78
- };
79
- getSuggestions = () => {
80
- const substringWordList = this.findWordsBeforeCurrentLocation();
81
- // Prevent empty string from matching everyhing
82
- const closestWord = substringWordList.at(-1);
83
- return !closestWord
84
- ? []
85
- : matchSorter.matchSorter(this.props.autoSuggestions, closestWord, {
86
- // Use match-sorter for matching inputs
87
- keys: [{ key: "value" }],
88
- });
89
- };
90
- // Get array of distinct words prior to the current location of entered text
91
- // Use the inputRef instead of state becuase of asnychronous updating of state and calling of these functions :(
92
- findWordsBeforeCurrentLocation = () => {
93
- return this.inputRef.current?.value
94
- .slice(0, this.inputRef.current?.selectionStart ?? undefined)
95
- .split(" ");
96
- };
97
- onSuggestionsClearRequested = () => {
98
- this.setState({
99
- suggestions: [],
100
- });
101
- };
102
- render() {
103
- const { inputProps, children, ...rest } = this.props;
104
- const finalInputProps = {
105
- ...inputProps,
106
- onChange: this.onInputChange,
107
- value: this.state.value,
108
- };
109
- return (React__default.default.createElement("div", { className: `${settings.prefix}--bmrg-auto-suggest` },
110
- React__default.default.createElement(AutoSuggest__default.default, { getSuggestionValue: this.getSuggestionValue, inputProps: finalInputProps, onSuggestionsClearRequested: this.onSuggestionsClearRequested, onSuggestionsFetchRequested: this.onSuggestionsFetchRequested, renderInputComponent: (props) => React__default.default.cloneElement(children, { ...props, ref: this.inputRef }), renderSuggestion: this.renderSuggestion, renderSuggestionsContainer: renderSuggestionsContainer, suggestions: this.state.suggestions, ...rest })));
111
- }
112
- }
113
- // Needed to add aria-label for a11y
114
- function renderSuggestionsContainer({ containerProps, children, ...rest }) {
115
- return (React__default.default.createElement("div", { "aria-label": "AutoSuggest listbox", ...containerProps, ...rest }, children));
15
+ /*
16
+ IBM Confidential
17
+ 694970X, 69497O0
18
+ © Copyright IBM Corp. 2022, 2024
19
+ */
20
+ const SELECT_METHODS = ["up", "down", "click"];
21
+ class AutoSuggestBmrg extends React.Component {
22
+ inputRef = React__default.default.createRef();
23
+ state = {
24
+ // Used if we want to have some of the functions external instead of
25
+ // the default ones in the wrapper
26
+ value: this.props.initialValue ?? "",
27
+ caretIndex: 0,
28
+ suggestions: [],
29
+ };
30
+ // Each time the component updates we want to refocus the input and keep the cursor in the correct place
31
+ // Needed for when cycling through mutliple suggestions with the arrow keys and the cursor resets to the end of the input. We don't want that.
32
+ componentDidUpdate(_, prevState) {
33
+ if (this.state.value && prevState.value !== this.state.value) {
34
+ // prevent it from focusing on initial render / empty
35
+ this.inputRef.current?.focus();
36
+ this.inputRef.current?.setSelectionRange(this.state.caretIndex, this.state.caretIndex);
37
+ }
38
+ }
39
+ renderSuggestion = (suggestion) => suggestion.label;
40
+ onSuggestionsFetchRequested = () => {
41
+ this.setState(() => ({
42
+ suggestions: this.getSuggestions(),
43
+ }));
44
+ };
45
+ /**
46
+ * More logic here for handling a user cycling through suggestions
47
+ * Move the caret to the new suggestion location or use the reference to the DOM element.
48
+ * Shift based on the change in length of the value b/c of different length suggestions
49
+ */
50
+ onInputChange = (event, { newValue, method }) => {
51
+ this.setState((prevState) => ({
52
+ value: newValue,
53
+ caretIndex: SELECT_METHODS.includes(method)
54
+ ? prevState.caretIndex + (newValue.length - prevState.value.length)
55
+ : this.inputRef.current?.selectionStart ?? 0,
56
+ }));
57
+ this.props.onChange(newValue);
58
+ };
59
+ /**
60
+ * Return the new value for the input
61
+ * Find the current caret position
62
+ * get the string up to that point
63
+ * find the last word (space-delimited) and replace it in input
64
+ */
65
+ getSuggestionValue = (suggestion) => {
66
+ const substringWordList = this.findWordsBeforeCurrentLocation();
67
+ /*
68
+ * Find the position of the caret, get the string up to that point
69
+ * and find the index of the last word in that substring
70
+ * This gives use the word to suggest matches for
71
+ */
72
+ const closestWord = substringWordList.at(-1);
73
+ const position = this.state.value.slice(0, this.state.caretIndex).lastIndexOf(closestWord);
74
+ // Sub in the new property suggestion
75
+ return (this.state.value.substring(0, position) +
76
+ suggestion.value +
77
+ this.state.value.substring(position + closestWord.length));
78
+ };
79
+ getSuggestions = () => {
80
+ const substringWordList = this.findWordsBeforeCurrentLocation();
81
+ // Prevent empty string from matching everyhing
82
+ const closestWord = substringWordList.at(-1);
83
+ return !closestWord
84
+ ? []
85
+ : matchSorter.matchSorter(this.props.autoSuggestions, closestWord, {
86
+ // Use match-sorter for matching inputs
87
+ keys: [{ key: "value" }],
88
+ });
89
+ };
90
+ // Get array of distinct words prior to the current location of entered text
91
+ // Use the inputRef instead of state becuase of asnychronous updating of state and calling of these functions :(
92
+ findWordsBeforeCurrentLocation = () => {
93
+ return this.inputRef.current?.value
94
+ .slice(0, this.inputRef.current?.selectionStart ?? undefined)
95
+ .split(" ");
96
+ };
97
+ onSuggestionsClearRequested = () => {
98
+ this.setState({
99
+ suggestions: [],
100
+ });
101
+ };
102
+ render() {
103
+ const { inputProps, children, ...rest } = this.props;
104
+ const finalInputProps = {
105
+ ...inputProps,
106
+ onChange: this.onInputChange,
107
+ value: this.state.value,
108
+ };
109
+ return (React__default.default.createElement("div", { className: `${settings.prefix}--bmrg-auto-suggest` },
110
+ React__default.default.createElement(AutoSuggest__default.default, { getSuggestionValue: this.getSuggestionValue, inputProps: finalInputProps, onSuggestionsClearRequested: this.onSuggestionsClearRequested, onSuggestionsFetchRequested: this.onSuggestionsFetchRequested, renderInputComponent: (props) => React__default.default.cloneElement(children, { ...props, ref: this.inputRef }), renderSuggestion: this.renderSuggestion, renderSuggestionsContainer: renderSuggestionsContainer, suggestions: this.state.suggestions, ...rest })));
111
+ }
112
+ }
113
+ // Needed to add aria-label for a11y
114
+ function renderSuggestionsContainer({ containerProps, children, ...rest }) {
115
+ return (React__default.default.createElement("div", { "aria-label": "AutoSuggest listbox", ...containerProps, ...rest }, children));
116
116
  }
117
117
 
118
118
  exports.default = AutoSuggestBmrg;
@@ -9,24 +9,24 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
9
 
10
10
  var React__default = /*#__PURE__*/_interopDefault(React);
11
11
 
12
- /*
13
- IBM Confidential
14
- 694970X, 69497O0
15
- © Copyright IBM Corp. 2022, 2024
16
- */
17
- const UserIcon = (props) => {
18
- const { description, userName, plainTooltip, ...rest } = props;
19
- return (React__default.default.createElement("svg", { version: "1.1", xmlns: "http://www.w3.org/2000/svg", x: "0px", y: "0px", width: "16px", height: "16px", viewBox: "0 0 16 16", role: "img", ...rest },
20
- React__default.default.createElement("title", null, plainTooltip || !userName ? "Profile Image" : `User icon for ${userName}`),
21
- description && React__default.default.createElement("desc", null, description),
22
- React__default.default.createElement("g", null,
23
- React__default.default.createElement("path", { fill: "currentColor", d: "M4,13.7C5.1,14.5,6.5,15,8,15s2.9-0.5,4-1.3v-1.2c0-0.8-0.7-1.5-1.5-1.5h-5C4.7,11,4,11.7,4,12.5V13.7\r\n\t\tz M3,12.9v-0.4C3,11.1,4.1,10,5.5,10h5c1.4,0,2.5,1.1,2.5,2.5v0.4c1.2-1.3,2-3,2-4.9c0-3.9-3.1-7-7-7S1,4.1,1,8\r\n\t\tC1,9.9,1.8,11.6,3,12.9z M8,16c-4.4,0-8-3.6-8-8s3.6-8,8-8s8,3.6,8,8S12.4,16,8,16z" }),
24
- React__default.default.createElement("path", { fill: "currentColor", d: "M8,8c1.1,0,2-0.9,2-2S9.1,4,8,4S6,4.9,6,6S6.9,8,8,8z M8,9C6.3,9,5,7.7,5,6s1.3-3,3-3s3,1.3,3,3S9.7,9,8,9z" }))));
25
- };
26
- function Avatar({ alt, className = `${settings.prefix}--bmrg-avatar`, size = "medium", src, style, title, userName, plainTooltip = false, ...rest }) {
27
- const [error, setError] = React.useState(false);
28
- const altText = plainTooltip || !userName ? "Profile Image" : `Avatar for ${userName}`;
29
- return error || !src ? (React__default.default.createElement(UserIcon, { userName: userName, plainTooltip: plainTooltip, className: `${className} --${size || ""}`, description: altText, style: style })) : (React__default.default.createElement("img", { alt: alt ?? altText, className: `${className} --${size || ""}`, src: src, style: style, title: title ?? altText, onError: () => setError(true), ...rest }));
12
+ /*
13
+ IBM Confidential
14
+ 694970X, 69497O0
15
+ © Copyright IBM Corp. 2022, 2024
16
+ */
17
+ const UserIcon = (props) => {
18
+ const { description, userName, plainTooltip, ...rest } = props;
19
+ return (React__default.default.createElement("svg", { version: "1.1", xmlns: "http://www.w3.org/2000/svg", x: "0px", y: "0px", width: "16px", height: "16px", viewBox: "0 0 16 16", role: "img", ...rest },
20
+ React__default.default.createElement("title", null, plainTooltip || !userName ? "Profile Image" : `User icon for ${userName}`),
21
+ description && React__default.default.createElement("desc", null, description),
22
+ React__default.default.createElement("g", null,
23
+ React__default.default.createElement("path", { fill: "currentColor", d: "M4,13.7C5.1,14.5,6.5,15,8,15s2.9-0.5,4-1.3v-1.2c0-0.8-0.7-1.5-1.5-1.5h-5C4.7,11,4,11.7,4,12.5V13.7\n\t\tz M3,12.9v-0.4C3,11.1,4.1,10,5.5,10h5c1.4,0,2.5,1.1,2.5,2.5v0.4c1.2-1.3,2-3,2-4.9c0-3.9-3.1-7-7-7S1,4.1,1,8\n\t\tC1,9.9,1.8,11.6,3,12.9z M8,16c-4.4,0-8-3.6-8-8s3.6-8,8-8s8,3.6,8,8S12.4,16,8,16z" }),
24
+ React__default.default.createElement("path", { fill: "currentColor", d: "M8,8c1.1,0,2-0.9,2-2S9.1,4,8,4S6,4.9,6,6S6.9,8,8,8z M8,9C6.3,9,5,7.7,5,6s1.3-3,3-3s3,1.3,3,3S9.7,9,8,9z" }))));
25
+ };
26
+ function Avatar({ alt, className = `${settings.prefix}--bmrg-avatar`, size = "medium", src, style, title, userName, plainTooltip = false, ...rest }) {
27
+ const [error, setError] = React.useState(false);
28
+ const altText = plainTooltip || !userName ? "Profile Image" : `Avatar for ${userName}`;
29
+ return error || !src ? (React__default.default.createElement(UserIcon, { userName: userName, plainTooltip: plainTooltip, className: `${className} --${size || ""}`, description: altText, style: style })) : (React__default.default.createElement("img", { alt: alt ?? altText, className: `${className} --${size || ""}`, src: src, style: style, title: title ?? altText, onError: () => setError(true), ...rest }));
30
30
  }
31
31
 
32
32
  exports.default = Avatar;
@@ -12,40 +12,40 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
12
 
13
13
  var React__default = /*#__PURE__*/_interopDefault(React);
14
14
 
15
- /*
16
- IBM Confidential
17
- 694970X, 69497O0
18
- © Copyright IBM Corp. 2022, 2024
19
- */
20
- function CheckboxListComponent({ checkboxProps, disabled, helperText, id, initialSelectedItems = [], label, labelText, onChange, options, selectedItems: propsSelectedItems, tooltipClassName = `${settings.prefix}--bmrg-checkbox-list__tooltip`, tooltipContent, tooltipProps = { direction: "top" }, }) {
21
- const [stateSelectedItems, setSelectedItems] = React.useState(initialSelectedItems);
22
- const selectedItems = propsSelectedItems || stateSelectedItems; // Externally controlled if selectedItems props exists
23
- const handleCheckboxChange = (event, { checked: value, id }) => {
24
- let newSelectedItems = [...stateSelectedItems];
25
- if (value) {
26
- newSelectedItems.push(id);
27
- }
28
- else {
29
- newSelectedItems = newSelectedItems.filter((item) => item !== id);
30
- }
31
- setSelectedItems(newSelectedItems);
32
- if (typeof onChange === "function") {
33
- onChange(value, id, event, newSelectedItems);
34
- }
35
- };
36
- const labelValue = label || labelText;
37
- const labelTextId = !labelValue ? undefined : `${id}-label`;
38
- return (React__default.default.createElement("div", { key: id, className: `${settings.prefix}--bmrg-checkbox-list` },
39
- labelValue && (React__default.default.createElement("div", { className: `${settings.prefix}--bmrg-checkbox-list__title` },
40
- React__default.default.createElement("div", { id: labelTextId, className: `${settings.prefix}--label`, style: { marginBottom: ".3125rem" } }, labelValue),
41
- tooltipContent && (React__default.default.createElement("div", { className: tooltipClassName },
42
- React__default.default.createElement(TooltipHover.default, { ...tooltipProps, tooltipText: tooltipContent },
43
- React__default.default.createElement(icons.Information, { size: 16, fill: "currentColor" })))))),
44
- helperText && React__default.default.createElement("div", { className: `${settings.prefix}--form__helper-text` }, helperText),
45
- React__default.default.createElement("div", { className: `${settings.prefix}--bmrg-checkbox-list__list` }, options.map((option) => {
46
- const checked = selectedItems.some((item) => item === option.id);
47
- return (React__default.default.createElement(react.Checkbox, { disabled: disabled, key: option.id, id: option.id, labelText: option.labelText, onChange: handleCheckboxChange, checked: checked, ...checkboxProps }));
48
- }))));
15
+ /*
16
+ IBM Confidential
17
+ 694970X, 69497O0
18
+ © Copyright IBM Corp. 2022, 2024
19
+ */
20
+ function CheckboxListComponent({ checkboxProps, disabled, helperText, id, initialSelectedItems = [], label, labelText, onChange, options, selectedItems: propsSelectedItems, tooltipClassName = `${settings.prefix}--bmrg-checkbox-list__tooltip`, tooltipContent, tooltipProps = { direction: "top" }, }) {
21
+ const [stateSelectedItems, setSelectedItems] = React.useState(initialSelectedItems);
22
+ const selectedItems = propsSelectedItems || stateSelectedItems; // Externally controlled if selectedItems props exists
23
+ const handleCheckboxChange = (event, { checked: value, id }) => {
24
+ let newSelectedItems = [...stateSelectedItems];
25
+ if (value) {
26
+ newSelectedItems.push(id);
27
+ }
28
+ else {
29
+ newSelectedItems = newSelectedItems.filter((item) => item !== id);
30
+ }
31
+ setSelectedItems(newSelectedItems);
32
+ if (typeof onChange === "function") {
33
+ onChange(value, id, event, newSelectedItems);
34
+ }
35
+ };
36
+ const labelValue = label || labelText;
37
+ const labelTextId = !labelValue ? undefined : `${id}-label`;
38
+ return (React__default.default.createElement("div", { key: id, className: `${settings.prefix}--bmrg-checkbox-list` },
39
+ labelValue && (React__default.default.createElement("div", { className: `${settings.prefix}--bmrg-checkbox-list__title` },
40
+ React__default.default.createElement("div", { id: labelTextId, className: `${settings.prefix}--label`, style: { marginBottom: ".3125rem" } }, labelValue),
41
+ tooltipContent && (React__default.default.createElement("div", { className: tooltipClassName },
42
+ React__default.default.createElement(TooltipHover.default, { ...tooltipProps, tooltipText: tooltipContent },
43
+ React__default.default.createElement(icons.Information, { size: 16, fill: "currentColor" })))))),
44
+ helperText && React__default.default.createElement("div", { className: `${settings.prefix}--form__helper-text` }, helperText),
45
+ React__default.default.createElement("div", { className: `${settings.prefix}--bmrg-checkbox-list__list` }, options.map((option) => {
46
+ const checked = selectedItems.some((item) => item === option.id);
47
+ return (React__default.default.createElement(react.Checkbox, { disabled: disabled, key: option.id, id: option.id, labelText: option.labelText, onChange: handleCheckboxChange, checked: checked, ...checkboxProps }));
48
+ }))));
49
49
  }
50
50
 
51
51
  exports.default = CheckboxListComponent;
@@ -14,109 +14,109 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
14
14
  var React__default = /*#__PURE__*/_interopDefault(React);
15
15
  var cx__default = /*#__PURE__*/_interopDefault(cx);
16
16
 
17
- /*
18
- IBM Confidential
19
- 694970X, 69497O0
20
- © Copyright IBM Corp. 2022, 2024
21
- */
22
- function ComboBoxComponent({ disableClear = false, id, label, labelText, titleText, tooltipClassName = `${settings.prefix}--bmrg-select__tooltip`, tooltipContent, tooltipProps = { direction: "top" }, onChange, onInputChange, shouldFilterItem, ...restComboBoxProps }) {
23
- // Set the initial selected item to the label or single value passed
24
- const selectedItemRef = React__default.default.useRef(restComboBoxProps.initialSelectedItem?.label ?? restComboBoxProps.initialSelectedItem);
25
- const queryRef = React__default.default.useRef(selectedItemRef.current);
26
- const [hasQuery, setHasQuery] = React__default.default.useState(false);
27
- // Support several props for the label text
28
- const labelValue = titleText || label || labelText;
29
- /**
30
- * The following three functions are to support a better ComboBox filtering experience
31
- * than the default or passing a `shouldFilterItem` function. With the latter, if you have a selected item
32
- * only that will be displayed if you do a naive filtering of the input.
33
- * We want to:
34
- * 1. Filter options based on the input text and plain value or label of the item
35
- * 2. After selecting a value, show all options when opening the combobox without having to clear the selection
36
- * 3. Filter the values when you enter a query with an item selected
37
- */
38
- /**
39
- * Keep track of the selected value with a ref so it doesn' re-render and to ensure that
40
- * onInputChange has a fresh value. `onChange` is called, then `onInputChange` when selecting an item
41
- */
42
- const defaultOnChange = React__default.default.useCallback(({ selectedItem }) => {
43
- if (!selectedItem) {
44
- selectedItemRef.current = selectedItem;
45
- }
46
- if (typeof selectedItem === "string" || typeof selectedItem === "number") {
47
- selectedItemRef.current = selectedItem;
48
- }
49
- else {
50
- selectedItemRef.current = selectedItem?.label;
51
- }
52
- // Additional check if the onInputChange function is not called
53
- // Isn't triggered if the query value matches the selected one
54
- if (queryRef.current === selectedItemRef.current) {
55
- setHasQuery(false);
56
- }
57
- // Call consumer
58
- if (onChange) {
59
- onChange({ selectedItem });
60
- }
61
- }, [onChange]);
62
- /**
63
- * When an item is selected, the `onInputChange` handler is called with the value selected
64
- * so it is difficult to disambiguate between a keydown event and a select event
65
- * Take a simple approach here. If the selectedItem and input values match, there isn't a query
66
- * If they don't, there is a query. We use this to determine if we should filter the values.
67
- */
68
- const defaultInputChange = (input) => {
69
- queryRef.current = input;
70
- if (input !== selectedItemRef.current) {
71
- setHasQuery(true);
72
- }
73
- else {
74
- setHasQuery(false);
75
- }
76
- // Call consumer
77
- if (onInputChange) {
78
- onInputChange(input);
79
- }
80
- };
81
- /**
82
- * Determine if I should filter the items or not
83
- * Selected value and no query means show everything, otherwise filter based on the input
84
- * No point in optimizing this because re-renders will only occur on query changes
85
- * and we need fresh values on those events to determine how to filter
86
- */
87
- const defaultShouldFilterItem = ({ item, inputValue }) => {
88
- if (selectedItemRef.current && !hasQuery) {
89
- return true;
90
- }
91
- if (typeof item === "string" || typeof item === "number") {
92
- return String(item).toLowerCase().includes(inputValue?.toLowerCase());
93
- }
94
- if (item && item.label) {
95
- return String(item.label).toLowerCase().includes(inputValue?.toLowerCase());
96
- }
97
- return item;
98
- };
99
- /**
100
- * If a function is passed, use that
101
- * If a false or null value is explicitely passed, then use default filtering behavior in component
102
- * Otherwise use our filtering logic as the new default
103
- */
104
- let finalShouldFilterItem;
105
- if (typeof shouldFilterItem === "function") {
106
- finalShouldFilterItem = shouldFilterItem;
107
- }
108
- else if (shouldFilterItem === false || shouldFilterItem === null) {
109
- finalShouldFilterItem = undefined;
110
- }
111
- else {
112
- finalShouldFilterItem = defaultShouldFilterItem;
113
- }
114
- return (React__default.default.createElement("div", { key: id, className: cx__default.default(`${settings.prefix}--bmrg-select`, { "--disableClear": disableClear }) },
115
- React__default.default.createElement(react.ComboBox, { id: id, titleText: labelValue && (React__default.default.createElement("div", { style: { display: "flex" } },
116
- React__default.default.createElement("div", null, titleText || labelText || label),
117
- tooltipContent && (React__default.default.createElement("div", { className: tooltipClassName },
118
- React__default.default.createElement(TooltipHover.default, { ...tooltipProps, tooltipText: tooltipContent },
119
- React__default.default.createElement(icons.Information, { size: 16, fill: "currentColor" })))))), onChange: defaultOnChange, onInputChange: defaultInputChange, shouldFilterItem: finalShouldFilterItem, ...restComboBoxProps })));
17
+ /*
18
+ IBM Confidential
19
+ 694970X, 69497O0
20
+ © Copyright IBM Corp. 2022, 2024
21
+ */
22
+ function ComboBoxComponent({ disableClear = false, id, label, labelText, titleText, tooltipClassName = `${settings.prefix}--bmrg-select__tooltip`, tooltipContent, tooltipProps = { direction: "top" }, onChange, onInputChange, shouldFilterItem, ...restComboBoxProps }) {
23
+ // Set the initial selected item to the label or single value passed
24
+ const selectedItemRef = React__default.default.useRef(restComboBoxProps.initialSelectedItem?.label ?? restComboBoxProps.initialSelectedItem);
25
+ const queryRef = React__default.default.useRef(selectedItemRef.current);
26
+ const [hasQuery, setHasQuery] = React__default.default.useState(false);
27
+ // Support several props for the label text
28
+ const labelValue = titleText || label || labelText;
29
+ /**
30
+ * The following three functions are to support a better ComboBox filtering experience
31
+ * than the default or passing a `shouldFilterItem` function. With the latter, if you have a selected item
32
+ * only that will be displayed if you do a naive filtering of the input.
33
+ * We want to:
34
+ * 1. Filter options based on the input text and plain value or label of the item
35
+ * 2. After selecting a value, show all options when opening the combobox without having to clear the selection
36
+ * 3. Filter the values when you enter a query with an item selected
37
+ */
38
+ /**
39
+ * Keep track of the selected value with a ref so it doesn' re-render and to ensure that
40
+ * onInputChange has a fresh value. `onChange` is called, then `onInputChange` when selecting an item
41
+ */
42
+ const defaultOnChange = React__default.default.useCallback(({ selectedItem }) => {
43
+ if (!selectedItem) {
44
+ selectedItemRef.current = selectedItem;
45
+ }
46
+ if (typeof selectedItem === "string" || typeof selectedItem === "number") {
47
+ selectedItemRef.current = selectedItem;
48
+ }
49
+ else {
50
+ selectedItemRef.current = selectedItem?.label;
51
+ }
52
+ // Additional check if the onInputChange function is not called
53
+ // Isn't triggered if the query value matches the selected one
54
+ if (queryRef.current === selectedItemRef.current) {
55
+ setHasQuery(false);
56
+ }
57
+ // Call consumer
58
+ if (onChange) {
59
+ onChange({ selectedItem });
60
+ }
61
+ }, [onChange]);
62
+ /**
63
+ * When an item is selected, the `onInputChange` handler is called with the value selected
64
+ * so it is difficult to disambiguate between a keydown event and a select event
65
+ * Take a simple approach here. If the selectedItem and input values match, there isn't a query
66
+ * If they don't, there is a query. We use this to determine if we should filter the values.
67
+ */
68
+ const defaultInputChange = (input) => {
69
+ queryRef.current = input;
70
+ if (input !== selectedItemRef.current) {
71
+ setHasQuery(true);
72
+ }
73
+ else {
74
+ setHasQuery(false);
75
+ }
76
+ // Call consumer
77
+ if (onInputChange) {
78
+ onInputChange(input);
79
+ }
80
+ };
81
+ /**
82
+ * Determine if I should filter the items or not
83
+ * Selected value and no query means show everything, otherwise filter based on the input
84
+ * No point in optimizing this because re-renders will only occur on query changes
85
+ * and we need fresh values on those events to determine how to filter
86
+ */
87
+ const defaultShouldFilterItem = ({ item, inputValue }) => {
88
+ if (selectedItemRef.current && !hasQuery) {
89
+ return true;
90
+ }
91
+ if (typeof item === "string" || typeof item === "number") {
92
+ return String(item).toLowerCase().includes(inputValue?.toLowerCase());
93
+ }
94
+ if (item && item.label) {
95
+ return String(item.label).toLowerCase().includes(inputValue?.toLowerCase());
96
+ }
97
+ return item;
98
+ };
99
+ /**
100
+ * If a function is passed, use that
101
+ * If a false or null value is explicitely passed, then use default filtering behavior in component
102
+ * Otherwise use our filtering logic as the new default
103
+ */
104
+ let finalShouldFilterItem;
105
+ if (typeof shouldFilterItem === "function") {
106
+ finalShouldFilterItem = shouldFilterItem;
107
+ }
108
+ else if (shouldFilterItem === false || shouldFilterItem === null) {
109
+ finalShouldFilterItem = undefined;
110
+ }
111
+ else {
112
+ finalShouldFilterItem = defaultShouldFilterItem;
113
+ }
114
+ return (React__default.default.createElement("div", { key: id, className: cx__default.default(`${settings.prefix}--bmrg-select`, { "--disableClear": disableClear }) },
115
+ React__default.default.createElement(react.ComboBox, { id: id, titleText: labelValue && (React__default.default.createElement("div", { style: { display: "flex" } },
116
+ React__default.default.createElement("div", null, titleText || labelText || label),
117
+ tooltipContent && (React__default.default.createElement("div", { className: tooltipClassName },
118
+ React__default.default.createElement(TooltipHover.default, { ...tooltipProps, tooltipText: tooltipContent },
119
+ React__default.default.createElement(icons.Information, { size: 16, fill: "currentColor" })))))), onChange: defaultOnChange, onInputChange: defaultInputChange, shouldFilterItem: finalShouldFilterItem, ...restComboBoxProps })));
120
120
  }
121
121
 
122
122
  exports.default = ComboBoxComponent;
@@ -14,38 +14,38 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
14
14
  var React__default = /*#__PURE__*/_interopDefault(React);
15
15
  var cx__default = /*#__PURE__*/_interopDefault(cx);
16
16
 
17
- /*
18
- IBM Confidential
19
- 694970X, 69497O0
20
- © Copyright IBM Corp. 2022, 2024
21
- */
22
- /**
23
- * For now we expect that if the prop value is a csv string,
24
- * then the items would be either in the key:value or value:label format.
25
- * The prop value would contain either the keys in the key:value or values in the value:label.
26
- */
27
- function getFilteredItems({ items, selectedItems }) {
28
- return items.filter((item) => selectedItems.some((selectedItem) => selectedItem === item.key || selectedItem === item.value));
29
- }
30
- function ComboBoxMultiSelect({ disableClear = false, id, initialSelectedItems, items, label, labelText, selectedItems, titleText, tooltipClassName = `${settings.prefix}--bmrg-multi-select__tooltip`, tooltipContent, tooltipProps = { direction: "top" }, ...multiSelectProps }) {
31
- const labelValue = titleText || label || labelText;
32
- let finalInitialSelectedItems = initialSelectedItems;
33
- let finalSelectedItems = selectedItems;
34
- /** Add support for csv strings */
35
- if (typeof finalInitialSelectedItems === "string") {
36
- const initialSelectedItemsArray = finalInitialSelectedItems.split(",");
37
- finalInitialSelectedItems = getFilteredItems({ items, selectedItems: initialSelectedItemsArray });
38
- }
39
- if (typeof finalSelectedItems === "string") {
40
- const selectedItemsArray = finalSelectedItems.split(",");
41
- finalSelectedItems = getFilteredItems({ items, selectedItems: selectedItemsArray });
42
- }
43
- return (React__default.default.createElement("div", { key: id, className: cx__default.default(`${settings.prefix}--bmrg-multi-select`, { "--disableClear": disableClear }) },
44
- React__default.default.createElement(MultiSelect.default, { id: id, titleText: labelValue && (React__default.default.createElement("div", { style: { display: "flex" } },
45
- React__default.default.createElement("div", null, titleText || labelText || label),
46
- tooltipContent && (React__default.default.createElement("div", { className: tooltipClassName },
47
- React__default.default.createElement(TooltipHover.default, { ...tooltipProps, tooltipText: tooltipContent },
48
- React__default.default.createElement(icons.Information, { size: 16, fill: "currentColor" })))))), initialSelectedItems: finalInitialSelectedItems, selectedItems: finalSelectedItems, items: items, ...multiSelectProps })));
17
+ /*
18
+ IBM Confidential
19
+ 694970X, 69497O0
20
+ © Copyright IBM Corp. 2022, 2024
21
+ */
22
+ /**
23
+ * For now we expect that if the prop value is a csv string,
24
+ * then the items would be either in the key:value or value:label format.
25
+ * The prop value would contain either the keys in the key:value or values in the value:label.
26
+ */
27
+ function getFilteredItems({ items, selectedItems }) {
28
+ return items.filter((item) => selectedItems.some((selectedItem) => selectedItem === item.key || selectedItem === item.value));
29
+ }
30
+ function ComboBoxMultiSelect({ disableClear = false, id, initialSelectedItems, items, label, labelText, selectedItems, titleText, tooltipClassName = `${settings.prefix}--bmrg-multi-select__tooltip`, tooltipContent, tooltipProps = { direction: "top" }, ...multiSelectProps }) {
31
+ const labelValue = titleText || label || labelText;
32
+ let finalInitialSelectedItems = initialSelectedItems;
33
+ let finalSelectedItems = selectedItems;
34
+ /** Add support for csv strings */
35
+ if (typeof finalInitialSelectedItems === "string") {
36
+ const initialSelectedItemsArray = finalInitialSelectedItems.split(",");
37
+ finalInitialSelectedItems = getFilteredItems({ items, selectedItems: initialSelectedItemsArray });
38
+ }
39
+ if (typeof finalSelectedItems === "string") {
40
+ const selectedItemsArray = finalSelectedItems.split(",");
41
+ finalSelectedItems = getFilteredItems({ items, selectedItems: selectedItemsArray });
42
+ }
43
+ return (React__default.default.createElement("div", { key: id, className: cx__default.default(`${settings.prefix}--bmrg-multi-select`, { "--disableClear": disableClear }) },
44
+ React__default.default.createElement(MultiSelect.default, { id: id, titleText: labelValue && (React__default.default.createElement("div", { style: { display: "flex" } },
45
+ React__default.default.createElement("div", null, titleText || labelText || label),
46
+ tooltipContent && (React__default.default.createElement("div", { className: tooltipClassName },
47
+ React__default.default.createElement(TooltipHover.default, { ...tooltipProps, tooltipText: tooltipContent },
48
+ React__default.default.createElement(icons.Information, { size: 16, fill: "currentColor" })))))), initialSelectedItems: finalInitialSelectedItems, selectedItems: finalSelectedItems, items: items, ...multiSelectProps })));
49
49
  }
50
50
 
51
51
  exports.default = ComboBoxMultiSelect;