@rh-support/troubleshoot 2.7.1 → 2.32.2-prodBackup

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 (219) hide show
  1. package/lib/esm/components/AccountInfo/AccountSelector.js +4 -4
  2. package/lib/esm/components/AccountInfo/ManagedAccountsDropdown.js +1 -1
  3. package/lib/esm/components/CaseEditView/ActiveCustomerEscalation/ActiveCustomerEscalation.d.ts.map +1 -1
  4. package/lib/esm/components/CaseEditView/ActiveCustomerEscalation/ActiveCustomerEscalation.js +38 -33
  5. package/lib/esm/components/CaseEditView/ActiveCustomerEscalation/RequestEscalationModal.d.ts.map +1 -1
  6. package/lib/esm/components/CaseEditView/ActiveCustomerEscalation/RequestEscalationModal.js +70 -58
  7. package/lib/esm/components/CaseEditView/Case.d.ts.map +1 -1
  8. package/lib/esm/components/CaseEditView/Case.js +50 -14
  9. package/lib/esm/components/CaseEditView/CaseDetailsAside.d.ts.map +1 -1
  10. package/lib/esm/components/CaseEditView/CaseDetailsAside.js +45 -30
  11. package/lib/esm/components/CaseEditView/CaseDetailsErrorMessage.js +1 -1
  12. package/lib/esm/components/CaseEditView/CaseDetailsTabs.d.ts.map +1 -1
  13. package/lib/esm/components/CaseEditView/CaseDetailsTabs.js +7 -16
  14. package/lib/esm/components/CaseEditView/CaseOverview/CaseOwnerInfo.js +1 -1
  15. package/lib/esm/components/CaseEditView/CaseOverview/DateTime.d.ts.map +1 -1
  16. package/lib/esm/components/CaseEditView/CaseOverview/DateTime.js +1 -1
  17. package/lib/esm/components/CaseEditView/CaseOverview/index.d.ts.map +1 -1
  18. package/lib/esm/components/CaseEditView/CaseOverview/index.js +10 -9
  19. package/lib/esm/components/CaseEditView/CaseSolutions/CaseSolutions.d.ts.map +1 -1
  20. package/lib/esm/components/CaseEditView/CaseSolutions/CaseSolutions.js +28 -23
  21. package/lib/esm/components/CaseEditView/CaseSolutions/CaseSolutionsItem.d.ts.map +1 -1
  22. package/lib/esm/components/CaseEditView/CaseSolutions/CaseSolutionsItem.js +5 -5
  23. package/lib/esm/components/CaseEditView/CaseSolutions/HandpicketItem.js +3 -3
  24. package/lib/esm/components/CaseEditView/CaseSubscriptionAbuseAlert.js +1 -1
  25. package/lib/esm/components/CaseEditView/ConfirmationModals/ReopenCaseModal.d.ts.map +1 -1
  26. package/lib/esm/components/CaseEditView/ConfirmationModals/ReopenCaseModal.js +51 -35
  27. package/lib/esm/components/CaseEditView/PDFContainer.js +19 -15
  28. package/lib/esm/components/CaseEditView/RequestRemoteSession/ESSRemoteSession.d.ts.map +1 -1
  29. package/lib/esm/components/CaseEditView/RequestRemoteSession/ESSRemoteSession.js +33 -16
  30. package/lib/esm/components/CaseEditView/RequestRemoteSession/ESSRemoteSessionModal.d.ts.map +1 -1
  31. package/lib/esm/components/CaseEditView/RequestRemoteSession/ESSRemoteSessionModal.js +13 -16
  32. package/lib/esm/components/CaseEditView/RequestRemoteSession/NewEssTermsModal.d.ts.map +1 -1
  33. package/lib/esm/components/CaseEditView/RequestRemoteSession/NewEssTermsModal.js +50 -42
  34. package/lib/esm/components/CaseEditView/RequestRemoteSession/RemoteSessionAgreement.d.ts.map +1 -1
  35. package/lib/esm/components/CaseEditView/RequestRemoteSession/RemoteSessionAgreement.js +33 -16
  36. package/lib/esm/components/CaseEditView/RequestRemoteSession/RemoteSessionAgreementModal.d.ts.map +1 -1
  37. package/lib/esm/components/CaseEditView/RequestRemoteSession/RemoteSessionAgreementModal.js +53 -48
  38. package/lib/esm/components/CaseEditView/Tabs/CaseActionPlan/CaseActionPlan.d.ts.map +1 -1
  39. package/lib/esm/components/CaseEditView/Tabs/CaseActionPlan/CaseActionPlan.js +3 -3
  40. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseContactPhoneNumber.js +2 -2
  41. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseHostname.d.ts.map +1 -1
  42. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseHostname.js +7 -7
  43. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseOpenshiftClusterId/CaseOpenShiftPopover.js +1 -1
  44. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseOpenshiftClusterId/CaseOpenShiftV3Popover.js +1 -1
  45. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseOpenshiftClusterId/CaseOpenshiftClusterId.js +1 -1
  46. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CasePhoneNumberConfirmAlert.d.ts.map +1 -1
  47. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CasePhoneNumberConfirmAlert.js +5 -8
  48. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseReferenceNumber.d.ts.map +1 -1
  49. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseReferenceNumber.js +3 -3
  50. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/ProductVersion.d.ts.map +1 -1
  51. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/ProductVersion.js +2 -2
  52. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/SFDCUrl.d.ts.map +1 -1
  53. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/SFDCUrl.js +3 -4
  54. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/Summary.js +2 -2
  55. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/useCustomEmails.d.ts +1 -2
  56. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/useCustomEmails.d.ts.map +1 -1
  57. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/useCustomEmails.js +2 -3
  58. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseAttachment.js +2 -2
  59. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseChat.js +1 -1
  60. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseComments.d.ts.map +1 -1
  61. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseComments.js +19 -2
  62. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseDiscussion.js +2 -2
  63. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseExternalTrackerUpdate.js +1 -1
  64. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CommentSearch.d.ts.map +1 -1
  65. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CommentSearch.js +2 -3
  66. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment.d.ts.map +1 -1
  67. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment.js +6 -6
  68. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/VerifyCaseStatusModal/VerifyCaseStatusModal.d.ts.map +1 -1
  69. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/VerifyCaseStatusModal/VerifyCaseStatusModal.js +26 -18
  70. package/lib/esm/components/CaseEditView/Tabs/CaseHistory/Timeline.css +27 -4
  71. package/lib/esm/components/CaseEditView/Tabs/CaseHistory/Timeline.d.ts.map +1 -1
  72. package/lib/esm/components/CaseEditView/Tabs/CaseHistory/Timeline.js +5 -8
  73. package/lib/esm/components/CaseEditView/Tabs/CasePrivateNotes/CasePrivateNotes.d.ts.map +1 -1
  74. package/lib/esm/components/CaseEditView/Tabs/CasePrivateNotes/CasePrivateNotes.js +5 -4
  75. package/lib/esm/components/CaseEditView/Tabs/CaseSummary/CaseSummary.d.ts.map +1 -1
  76. package/lib/esm/components/CaseEditView/Tabs/CaseSummary/CaseSummary.js +4 -6
  77. package/lib/esm/components/CaseEditView/Tabs/CaseSummary/CaseSummaryErrorMessage.d.ts.map +1 -1
  78. package/lib/esm/components/CaseEditView/Tabs/CaseSummary/CaseSummaryErrorMessage.js +4 -6
  79. package/lib/esm/components/CaseEditView/Tabs/RMEEscalations/RMEEscalationList.js +1 -1
  80. package/lib/esm/components/CaseEditView/Tabs/RelatedTasks/RelatedTasks.d.ts.map +1 -1
  81. package/lib/esm/components/CaseEditView/Tabs/RelatedTasks/RelatedTasks.js +2 -3
  82. package/lib/esm/components/CaseInformation/CaseGroup.d.ts.map +1 -1
  83. package/lib/esm/components/CaseInformation/CaseGroup.js +1 -2
  84. package/lib/esm/components/CaseInformation/CaseInformation.js +3 -3
  85. package/lib/esm/components/CaseInformation/ContactPhoneNumberPopOver.d.ts.map +1 -1
  86. package/lib/esm/components/CaseInformation/ContactPhoneNumberPopOver.js +1 -1
  87. package/lib/esm/components/CaseInformation/Description.js +4 -4
  88. package/lib/esm/components/CaseInformation/Fts.d.ts.map +1 -1
  89. package/lib/esm/components/CaseInformation/Fts.js +8 -8
  90. package/lib/esm/components/CaseInformation/OpenCaseIssue.js +2 -2
  91. package/lib/esm/components/CaseInformation/Severity.js +1 -1
  92. package/lib/esm/components/CaseInformation/SupportLevel.d.ts.map +1 -1
  93. package/lib/esm/components/CaseInformation/SupportLevel.js +16 -10
  94. package/lib/esm/components/CaseManagement/CaseLanguageSelector.d.ts.map +1 -1
  95. package/lib/esm/components/CaseManagement/CaseLanguageSelector.js +14 -11
  96. package/lib/esm/components/CaseManagement/CaseManagement.js +4 -4
  97. package/lib/esm/components/CaseManagement/Cep.d.ts.map +1 -1
  98. package/lib/esm/components/CaseManagement/Cep.js +44 -41
  99. package/lib/esm/components/CaseManagement/ESSRemoteSessionCheckBox.d.ts.map +1 -1
  100. package/lib/esm/components/CaseManagement/ESSRemoteSessionCheckBox.js +50 -42
  101. package/lib/esm/components/CaseManagement/NoClusterIDReasonSelector.d.ts.map +1 -1
  102. package/lib/esm/components/CaseManagement/NoClusterIDReasonSelector.js +39 -63
  103. package/lib/esm/components/CaseManagement/OpenShiftClusterId.js +1 -1
  104. package/lib/esm/components/CaseManagement/OpenshiftDropdownV4.d.ts +0 -3
  105. package/lib/esm/components/CaseManagement/OpenshiftDropdownV4.d.ts.map +1 -1
  106. package/lib/esm/components/CaseManagement/OpenshiftDropdownV4.js +80 -46
  107. package/lib/esm/components/CaseManagement/RHAssociatesSelector.d.ts.map +1 -1
  108. package/lib/esm/components/CaseManagement/RHAssociatesSelector.js +8 -6
  109. package/lib/esm/components/CaseManagement/SendNotifications/AddContactToGroupModal.d.ts.map +1 -1
  110. package/lib/esm/components/CaseManagement/SendNotifications/AddContactToGroupModal.js +8 -8
  111. package/lib/esm/components/CaseManagement/SendNotifications/AddCustomEmailToAccountModal.d.ts.map +1 -1
  112. package/lib/esm/components/CaseManagement/SendNotifications/AddCustomEmailToAccountModal.js +19 -21
  113. package/lib/esm/components/CaseManagement/SendNotifications/CaseContactSelector.d.ts.map +1 -1
  114. package/lib/esm/components/CaseManagement/SendNotifications/CaseContactSelector.js +11 -8
  115. package/lib/esm/components/CaseManagement/SendNotifications/NonOrgCaseNotifyeesSelector.d.ts.map +1 -1
  116. package/lib/esm/components/CaseManagement/SendNotifications/NonOrgCaseNotifyeesSelector.js +55 -21
  117. package/lib/esm/components/ConfirmationModals/NoAttachmentSelectedModal.d.ts.map +1 -1
  118. package/lib/esm/components/ConfirmationModals/NoAttachmentSelectedModal.js +12 -27
  119. package/lib/esm/components/ConfirmationModals/PreferredSecureSupportModal.d.ts.map +1 -1
  120. package/lib/esm/components/ConfirmationModals/PreferredSecureSupportModal.js +1 -1
  121. package/lib/esm/components/Cve/CveItem.d.ts.map +1 -1
  122. package/lib/esm/components/Cve/CveItem.js +10 -11
  123. package/lib/esm/components/Cve/CveModal.d.ts.map +1 -1
  124. package/lib/esm/components/Cve/CveModal.js +11 -11
  125. package/lib/esm/components/Cve/CvePanel.d.ts.map +1 -1
  126. package/lib/esm/components/Cve/CvePanel.js +3 -3
  127. package/lib/esm/components/Cve/CveSidebar.js +2 -2
  128. package/lib/esm/components/IdeaInformation/IdeaInformation.js +7 -7
  129. package/lib/esm/components/ImproveCase/KtQuestions.js +6 -6
  130. package/lib/esm/components/OpenCase/SupportTypeSelectorPage.d.ts.map +1 -1
  131. package/lib/esm/components/OpenCase/SupportTypeSelectorPage.js +6 -13
  132. package/lib/esm/components/ProductSelector/AllProductsSelector.d.ts.map +1 -1
  133. package/lib/esm/components/ProductSelector/AllProductsSelector.js +12 -8
  134. package/lib/esm/components/ProductSelector/NewProductDropdownSelector.d.ts +1 -1
  135. package/lib/esm/components/ProductSelector/NewProductDropdownSelector.d.ts.map +1 -1
  136. package/lib/esm/components/ProductSelector/NewProductDropdownSelector.js +83 -47
  137. package/lib/esm/components/ProductSelector/NewProductVersionSelector.d.ts.map +1 -1
  138. package/lib/esm/components/ProductSelector/NewProductVersionSelector.js +14 -10
  139. package/lib/esm/components/ProductSelector/ProductSelector.js +1 -1
  140. package/lib/esm/components/ProductSelector/ProductVersionDropdownSelector.js +4 -4
  141. package/lib/esm/components/Recommendations/AsideResults.d.ts.map +1 -1
  142. package/lib/esm/components/Recommendations/AsideResults.js +6 -4
  143. package/lib/esm/components/Recommendations/ClusterRecommendationItems.js +1 -1
  144. package/lib/esm/components/Recommendations/ClusterRecommendations.js +1 -1
  145. package/lib/esm/components/Recommendations/ClusterRecommendationsModal.d.ts.map +1 -1
  146. package/lib/esm/components/Recommendations/ClusterRecommendationsModal.js +10 -11
  147. package/lib/esm/components/Recommendations/EARules/EARuleInfoAccordion.d.ts.map +1 -1
  148. package/lib/esm/components/Recommendations/EARules/EARuleInfoAccordion.js +6 -4
  149. package/lib/esm/components/Recommendations/EARules/EARuleInfoInline.js +7 -7
  150. package/lib/esm/components/Recommendations/InsightsResults.js +2 -2
  151. package/lib/esm/components/Recommendations/InsightsRuleInfo.d.ts.map +1 -1
  152. package/lib/esm/components/Recommendations/InsightsRuleInfo.js +23 -16
  153. package/lib/esm/components/Recommendations/RecommendationFeedbackModal.d.ts.map +1 -1
  154. package/lib/esm/components/Recommendations/RecommendationFeedbackModal.js +7 -7
  155. package/lib/esm/components/Recommendations/RecommendationInfoBox.d.ts.map +1 -1
  156. package/lib/esm/components/Recommendations/RecommendationInfoBox.js +7 -7
  157. package/lib/esm/components/Recommendations/Recommendations.d.ts.map +1 -1
  158. package/lib/esm/components/Recommendations/Recommendations.js +23 -20
  159. package/lib/esm/components/Recommendations/RecommendationsLoader.js +1 -1
  160. package/lib/esm/components/Recommendations/RulesModal.d.ts.map +1 -1
  161. package/lib/esm/components/Recommendations/RulesModal.js +10 -12
  162. package/lib/esm/components/Recommendations/WatsonxAiIcon.d.ts.map +1 -1
  163. package/lib/esm/components/Recommendations/WatsonxAiIcon.js +9 -10
  164. package/lib/esm/components/RemoteRider/RemoteRiderBanner.js +1 -1
  165. package/lib/esm/components/Review/Review.js +4 -4
  166. package/lib/esm/components/SessionRestore/RestoreLastSessionModal.d.ts.map +1 -1
  167. package/lib/esm/components/SessionRestore/RestoreLastSessionModal.js +7 -5
  168. package/lib/esm/components/SessionRestore/SessionRestore.js +1 -1
  169. package/lib/esm/components/SessionRestore/SessionRestoreCard.js +1 -1
  170. package/lib/esm/components/SubmitCase/SubmitCase.d.ts.map +1 -1
  171. package/lib/esm/components/SubmitCase/SubmitCase.js +21 -21
  172. package/lib/esm/components/Suggestions/Suggestions.d.ts.map +1 -1
  173. package/lib/esm/components/Suggestions/Suggestions.js +19 -14
  174. package/lib/esm/components/Suggestions/TopContent.d.ts.map +1 -1
  175. package/lib/esm/components/Suggestions/TopContent.js +16 -16
  176. package/lib/esm/components/TroubleshootSection/TroubleshootSection.d.ts.map +1 -1
  177. package/lib/esm/components/TroubleshootSection/TroubleshootSection.js +13 -14
  178. package/lib/esm/components/UpdateSeverityModal/UpdateSeverityModal.d.ts.map +1 -1
  179. package/lib/esm/components/UpdateSeverityModal/UpdateSeverityModal.js +20 -16
  180. package/lib/esm/components/shared/Rule.js +6 -6
  181. package/lib/esm/components/shared/fileUpload/FileLister.js +6 -6
  182. package/lib/esm/components/shared/fileUpload/WidgetFileUploader.d.ts.map +1 -1
  183. package/lib/esm/components/shared/fileUpload/WidgetFileUploader.js +7 -6
  184. package/lib/esm/components/shared/fileUpload/common/FileUploaderInfoIcon.js +1 -1
  185. package/lib/esm/components/shared/fileUpload/css/fileSelector.css +2 -0
  186. package/lib/esm/components/shared/fileUpload/fileSelectors/FileSelectorButton.js +1 -1
  187. package/lib/esm/components/shared/fileUpload/fileSelectors/WidgetFileSelector.d.ts.map +1 -1
  188. package/lib/esm/components/shared/fileUpload/fileSelectors/WidgetFileSelector.js +4 -4
  189. package/lib/esm/components/shared/fileUpload/fileSelectors/WidgetFileSelectorImage.js +2 -2
  190. package/lib/esm/components/shared/input/ContactSelectorInternal.d.ts +16 -6
  191. package/lib/esm/components/shared/input/ContactSelectorInternal.d.ts.map +1 -1
  192. package/lib/esm/components/shared/input/ContactSelectorInternal.js +133 -23
  193. package/lib/esm/components/shared/useIsSectionValid.d.ts.map +1 -1
  194. package/lib/esm/components/shared/useIsSectionValid.js +60 -4
  195. package/lib/esm/components/wizardLayout/GlobalTroubleshootEffects.d.ts.map +1 -1
  196. package/lib/esm/components/wizardLayout/GlobalTroubleshootEffects.js +8 -2
  197. package/lib/esm/components/wizardLayout/MainSection.js +2 -2
  198. package/lib/esm/components/wizardLayout/NewFeatureModal.d.ts.map +1 -1
  199. package/lib/esm/components/wizardLayout/NewFeatureModal.js +6 -6
  200. package/lib/esm/components/wizardLayout/WizardAside.js +3 -3
  201. package/lib/esm/components/wizardLayout/WizardMain.d.ts.map +1 -1
  202. package/lib/esm/components/wizardLayout/WizardMain.js +62 -19
  203. package/lib/esm/components/wizardLayout/WizardNavigation.d.ts +2 -2
  204. package/lib/esm/components/wizardLayout/WizardNavigation.d.ts.map +1 -1
  205. package/lib/esm/components/wizardLayout/WizardNavigation.js +21 -22
  206. package/lib/esm/css/app.css +18 -17
  207. package/lib/esm/css/case.css +62 -22
  208. package/lib/esm/css/results.css +2 -2
  209. package/lib/esm/hooks/useWizard.d.ts.map +1 -1
  210. package/lib/esm/hooks/useWizard.js +1 -3
  211. package/lib/esm/reducers/CaseReducer.d.ts.map +1 -1
  212. package/lib/esm/reducers/CaseReducer.js +2 -2
  213. package/lib/esm/reducers/RouteConstNTypes.d.ts +1 -2
  214. package/lib/esm/reducers/RouteConstNTypes.d.ts.map +1 -1
  215. package/lib/esm/reducers/RouteConstNTypes.js +2 -0
  216. package/lib/esm/reducers/RulesReducer.d.ts.map +1 -1
  217. package/lib/esm/scss/_main.scss +251 -94
  218. package/lib/esm/scss/_pf-overrides.scss +186 -149
  219. package/package.json +11 -11
@@ -8,20 +8,23 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import { contacts } from '@cee-eng/hydrajs';
11
+ import { Button, Label, LabelGroup, MenuToggle, Select, SelectList, SelectOption, Spinner, TextInputGroup, TextInputGroupMain, TextInputGroupUtilities, } from '@patternfly/react-core';
12
+ import TimesCircleIcon from '@patternfly/react-icons/dist/esm/icons/times-circle-icon';
13
+ import { haltEvent } from '@rh-support/utils';
11
14
  import assign from 'lodash/assign';
12
15
  import differenceBy from 'lodash/differenceBy';
13
16
  import filter from 'lodash/filter';
14
17
  import isEmpty from 'lodash/isEmpty';
15
18
  import unionBy from 'lodash/unionBy';
16
19
  import React from 'react';
17
- import { AsyncTypeahead, Highlighter } from 'react-bootstrap-typeahead';
18
- // https://github.com/ericgio/react-bootstrap-typeahead/blob/master/docs/Props.md
19
20
  export class ContactSelectorInternal extends React.Component {
20
21
  constructor(props) {
21
22
  super(props);
23
+ this.searchTimeout = null;
24
+ this.inputRef = React.createRef();
22
25
  this.getSelectedLabel = (contact) => {
23
26
  if (!contact) {
24
- return undefined;
27
+ return '';
25
28
  }
26
29
  const userName = contact.internalSso || contact.ssoUsername || '';
27
30
  const fullName = contact.fullNameCustom
@@ -31,7 +34,7 @@ export class ContactSelectorInternal extends React.Component {
31
34
  };
32
35
  this.getContactsSelected = (contacts) => {
33
36
  if (!contacts)
34
- return undefined;
37
+ return [];
35
38
  return filter(contacts, (c) => this.isValidContactForQuery(c));
36
39
  };
37
40
  this.isValidContactForQuery = (c) => {
@@ -43,11 +46,6 @@ export class ContactSelectorInternal extends React.Component {
43
46
  this.props.onSelect(contacts);
44
47
  }
45
48
  });
46
- this.onFocus = (event) => {
47
- if (!this.state.selectedContacts && isEmpty(this.state.options) && this.props.contactListParams) {
48
- this.handleSearch('');
49
- }
50
- };
51
49
  this.handleSearch = (query) => __awaiter(this, void 0, void 0, function* () {
52
50
  if (query == null) {
53
51
  return;
@@ -73,7 +71,7 @@ export class ContactSelectorInternal extends React.Component {
73
71
  const response = yield contacts.getSFDCContacts(queryParams, this.controller.signal);
74
72
  const options = response && response.items && response.items.length ? this.getContactsSelected(response.items) : [];
75
73
  this.setState({
76
- options: differenceBy(options, this.props.contactsToExclude, 'ssoUsername'),
74
+ options: differenceBy(options, this.props.contactsToExclude || [], 'ssoUsername'),
77
75
  isLoading: false,
78
76
  });
79
77
  }
@@ -85,35 +83,147 @@ export class ContactSelectorInternal extends React.Component {
85
83
  });
86
84
  }
87
85
  });
88
- this.renderMenuItemChildren = (option, p) => (React.createElement(Highlighter, { key: option.ssoUsername, search: p.text }, this.getSelectedLabel(option)));
89
- this.typeahead = React.createRef();
86
+ this.handleInputChange = (value) => {
87
+ this.setState({ searchValue: value });
88
+ // Clear existing timeout
89
+ if (this.searchTimeout) {
90
+ clearTimeout(this.searchTimeout);
91
+ }
92
+ // Set new timeout for debounced search
93
+ this.searchTimeout = setTimeout(() => {
94
+ if (value.length >= (this.props.minLength || 0)) {
95
+ this.handleSearch(value);
96
+ this.setState({ isOpen: true });
97
+ }
98
+ else if (value.length === 0) {
99
+ this.setState({ options: [], isOpen: false });
100
+ }
101
+ }, this.props.debounceDelay || 300);
102
+ };
103
+ this.handleSelect = (event, selection) => {
104
+ if (this.props.multiple) {
105
+ const currentSelected = this.state.selectedContacts || [];
106
+ const isAlreadySelected = currentSelected.some((c) => c.ssoUsername === selection.ssoUsername);
107
+ if (isAlreadySelected) {
108
+ const newSelected = currentSelected.filter((c) => c.ssoUsername !== selection.ssoUsername);
109
+ this.onChange(newSelected);
110
+ }
111
+ else {
112
+ const newSelected = [...currentSelected, selection];
113
+ this.onChange(newSelected);
114
+ }
115
+ // Clear search value after selection in multiple mode
116
+ this.setState({ searchValue: '' });
117
+ }
118
+ else {
119
+ this.onChange([selection]);
120
+ this.setState({ isOpen: false, searchValue: '' });
121
+ }
122
+ };
123
+ this.handleRemoveContact = (contactToRemove) => {
124
+ const currentSelected = this.state.selectedContacts || [];
125
+ const newSelected = currentSelected.filter((c) => c.ssoUsername !== contactToRemove.ssoUsername);
126
+ this.onChange(newSelected);
127
+ };
128
+ this.handleKeyDown = (event) => {
129
+ const { options, focusedItemIndex, isOpen } = this.state;
130
+ if (!isOpen || options.length === 0)
131
+ return;
132
+ switch (event.key) {
133
+ case 'ArrowDown':
134
+ event.preventDefault();
135
+ this.setState((prevState) => ({
136
+ focusedItemIndex: prevState.focusedItemIndex === null || prevState.focusedItemIndex >= options.length - 1
137
+ ? 0
138
+ : prevState.focusedItemIndex + 1,
139
+ }));
140
+ break;
141
+ case 'ArrowUp':
142
+ event.preventDefault();
143
+ this.setState((prevState) => ({
144
+ focusedItemIndex: prevState.focusedItemIndex === null || prevState.focusedItemIndex <= 0
145
+ ? options.length - 1
146
+ : prevState.focusedItemIndex - 1,
147
+ }));
148
+ break;
149
+ case 'Enter':
150
+ event.preventDefault();
151
+ if (focusedItemIndex !== null && options[focusedItemIndex]) {
152
+ this.handleSelect(null, options[focusedItemIndex]);
153
+ }
154
+ break;
155
+ case 'Escape':
156
+ this.setState({ isOpen: false, focusedItemIndex: null });
157
+ break;
158
+ }
159
+ };
160
+ this.handleFocus = () => {
161
+ if (this.state.searchValue.length >= (this.props.minLength || 0)) {
162
+ this.setState({ isOpen: true });
163
+ }
164
+ };
165
+ this.handleBlur = () => {
166
+ // Delay closing to allow for clicks on menu items
167
+ setTimeout(() => {
168
+ this.setState({ isOpen: false, focusedItemIndex: null });
169
+ }, 150);
170
+ };
171
+ this.handleClear = () => {
172
+ this.setState({ searchValue: '', options: [], isOpen: false });
173
+ this.onChange([]);
174
+ };
175
+ this.onToggle = () => {
176
+ this.setState((prevState) => ({ isOpen: !prevState.isOpen }));
177
+ };
90
178
  this.state = {
91
179
  isLoading: false,
92
- selectedContacts: this.getContactsSelected(props.selectedContacts),
180
+ selectedContacts: this.getContactsSelected(props.selectedContacts || []),
93
181
  options: [],
182
+ isOpen: false,
183
+ searchValue: '',
184
+ focusedItemIndex: null,
94
185
  };
95
186
  }
96
187
  componentDidUpdate(prevProps) {
97
- if (!isEmpty(prevProps.selectedContacts) && isEmpty(this.props.selectedContacts)) {
188
+ if (!isEmpty(prevProps.selectedContacts || []) && isEmpty(this.props.selectedContacts || [])) {
98
189
  this.setState({ selectedContacts: [], options: [] });
99
- this.typeahead.current.clear();
100
190
  }
101
191
  if (this.props.showSelectedContacts) {
102
- if (prevProps.selectedContacts.length !== this.props.selectedContacts.length) {
103
- this.setState({ selectedContacts: this.getContactsSelected(this.props.selectedContacts) });
192
+ const prevSelected = prevProps.selectedContacts || [];
193
+ const currentSelected = this.props.selectedContacts || [];
194
+ if (prevSelected.length !== currentSelected.length) {
195
+ this.setState({ selectedContacts: this.getContactsSelected(currentSelected) });
104
196
  }
105
197
  else {
106
- const unionOldNew = unionBy(prevProps.selectedContacts, this.props.selectedContacts, 'ssoUsername');
107
- if (unionOldNew.length !== this.props.selectedContacts.length ||
108
- prevProps.selectedContacts.length !== this.props.selectedContacts.length) {
109
- this.setState({ selectedContacts: this.getContactsSelected(this.props.selectedContacts) });
198
+ const unionOldNew = unionBy(prevSelected, currentSelected, 'ssoUsername');
199
+ if (unionOldNew.length !== currentSelected.length || prevSelected.length !== currentSelected.length) {
200
+ this.setState({ selectedContacts: this.getContactsSelected(currentSelected) });
110
201
  }
111
202
  }
112
203
  }
113
204
  }
114
205
  render() {
115
- const conditionalProps = Object.assign({}, (this.props.renderToken ? { renderToken: this.props.renderToken } : undefined));
116
- return (React.createElement(AsyncTypeahead, Object.assign({ id: this.props.id + '-contact-select', className: `${this.props.className} contact-select`, defaultInputValue: "", autoFocus: this.props.autoFocus, clearButton: this.props.clearButton, isLoading: this.state.isLoading || this.props.isUpdating, options: this.state.options, selected: !isEmpty(this.state.selectedContacts) ? this.state.selectedContacts : [], onChange: this.onChange, onFocus: this.onFocus, labelKey: this.getSelectedLabel, onSearch: this.handleSearch, delay: this.props.debounceDelay, maxResults: this.props.maxResults, placeholder: this.props.placeholder, ref: this.typeahead, renderMenuItemChildren: this.renderMenuItemChildren, size: this.props.typeAheadSize, useCache: this.props.useCache, minLength: this.props.minLength, disabled: this.props.disabled || this.props.isUpdating, multiple: this.props.multiple }, conditionalProps)));
206
+ const { selectedContacts = [], options, isLoading, isOpen, searchValue, focusedItemIndex } = this.state;
207
+ // For multiple selection, always show the search value so typed text is visible
208
+ // For single selection, show selected contact label or search value
209
+ const displayValue = this.props.multiple
210
+ ? searchValue
211
+ : selectedContacts[0]
212
+ ? this.getSelectedLabel(selectedContacts[0])
213
+ : searchValue;
214
+ const toggle = (toggleRef) => (React.createElement(MenuToggle, { ref: toggleRef, variant: "typeahead", onClick: this.onToggle, isExpanded: isOpen, isDisabled: this.props.disabled || this.props.isUpdating, isFullWidth: true },
215
+ React.createElement(TextInputGroup, { isPlain: true },
216
+ React.createElement(TextInputGroupMain, { value: displayValue, onChange: (_, value) => this.handleInputChange(value), onFocus: this.handleFocus, onBlur: this.handleBlur, onKeyDown: this.handleKeyDown, placeholder: this.props.placeholder || 'Search contact by name or username', ref: this.inputRef, autoComplete: "off", isExpanded: isOpen, role: "combobox" }, this.props.multiple && selectedContacts.length > 0 && (React.createElement(LabelGroup, { "aria-label": "Selected contacts" }, selectedContacts.map((contact, index) => {
217
+ var _a, _b;
218
+ const isDisabled = !!((_b = (_a = this.props) === null || _a === void 0 ? void 0 : _a.disableContactRemoval) === null || _b === void 0 ? void 0 : _b.find((v) => v.ssoUsername === contact.ssoUsername));
219
+ return (React.createElement(Label, { key: contact.ssoUsername, variant: "outline", color: "blue", onClick: haltEvent, onClose: () => this.handleRemoveContact(contact), isDisabled: isDisabled }, this.getSelectedLabel(contact)));
220
+ })))),
221
+ React.createElement(TextInputGroupUtilities, null,
222
+ isLoading && React.createElement(Spinner, { size: "sm" }),
223
+ this.props.clearButton && (searchValue || selectedContacts.length > 0) && (React.createElement(Button, { variant: "plain", icon: React.createElement(TimesCircleIcon, null), onClick: this.handleClear, "aria-label": "Clear input" }))))));
224
+ return (React.createElement("div", { className: `${this.props.className} contact-select` },
225
+ React.createElement(Select, { id: this.props.id + '-contact-select', isOpen: isOpen, selected: this.props.multiple ? selectedContacts : selectedContacts[0] || null, onSelect: this.handleSelect, onOpenChange: (isOpen) => this.setState({ isOpen }), toggle: toggle, shouldFocusFirstItemOnOpen: false, shouldFocusToggleOnSelect: false, popperProps: { direction: 'down', enableFlip: false }, isScrollable: true, onBlur: this.handleBlur, "data-tracking-id": "external-case-contact-selector" },
226
+ React.createElement(SelectList, { isAriaMultiselectable: this.props.multiple }, options.length > 0 ? (options.map((contact, index) => (React.createElement(SelectOption, { key: contact.ssoUsername, value: contact, isFocused: focusedItemIndex === index, isSelected: selectedContacts.some((c) => c.ssoUsername === contact.ssoUsername) }, this.getSelectedLabel(contact))))) : (React.createElement(SelectOption, { isDisabled: true }, isLoading ? 'Searching...' : searchValue ? 'No matches found.' : 'Type to search...'))))));
117
227
  }
118
228
  }
119
229
  ContactSelectorInternal.defaultProps = {
@@ -1 +1 @@
1
- {"version":3,"file":"useIsSectionValid.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/useIsSectionValid.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAuB1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAKnE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,gBAAgB;;;;;EAgR9D"}
1
+ {"version":3,"file":"useIsSectionValid.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/useIsSectionValid.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAuB/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAKnE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,gBAAgB;;;;;EAmU9D"}
@@ -1,8 +1,18 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { contacts } from '@cee-eng/hydrajs';
1
11
  import { GlobalMetadataStateContext } from '@rh-support/react-context';
2
12
  import find from 'lodash/find';
3
13
  import isEmpty from 'lodash/isEmpty';
4
14
  import isEqual from 'lodash/isEqual';
5
- import React, { useContext } from 'react';
15
+ import React, { useContext, useEffect, useState } from 'react';
6
16
  import { Trans } from 'react-i18next';
7
17
  import { useCaseSelector } from '../../context/CaseContext';
8
18
  import { RecommendationStateContext } from '../../context/RecommendationContext';
@@ -14,7 +24,7 @@ import { AppRouteSections } from '../../reducers/RouteConstNTypes';
14
24
  import { AttachmentStateContext } from './fileUpload/reducer/AttachmentReducerContext';
15
25
  export function useIsSectionValid(sectionName) {
16
26
  var _a, _b;
17
- const { caseState, caseType, product, version, contactSSOName, accountNumber, summary, hostname, contactInfo24x7, alternateId, selectedAccountDetails, issue, environment, timeFramesAndUrgency, periodicityOfIssue, ABTestVariation, } = useCaseSelector((state) => ({
27
+ const { caseState, caseType, product, version, contactSSOName, accountNumber, summary, hostname, contactInfo24x7, alternateId, selectedAccountDetails, issue, environment, timeFramesAndUrgency, periodicityOfIssue, ABTestVariation, ssoUsername, manageSupportCases, } = useCaseSelector((state) => ({
18
28
  caseState: state,
19
29
  caseType: state.caseDetails.caseType,
20
30
  product: state.caseDetails.product,
@@ -31,7 +41,26 @@ export function useIsSectionValid(sectionName) {
31
41
  timeFramesAndUrgency: state.caseDetails.timeFramesAndUrgency,
32
42
  periodicityOfIssue: state.caseDetails.periodicityOfIssue,
33
43
  ABTestVariation: state.ABTestVariation,
44
+ ssoUsername: state.selectedOwner.data.ssoUsername,
45
+ manageSupportCases: state.selectedOwner.data.manageSupportCases,
34
46
  }), isEqual);
47
+ const [isEntitlement, setIsEntitlement] = useState(null);
48
+ useEffect(() => {
49
+ const fetchContactDetails = () => __awaiter(this, void 0, void 0, function* () {
50
+ var _a;
51
+ if (ssoUsername) {
52
+ try {
53
+ const response = yield contacts.getSFDCContactBySso(ssoUsername);
54
+ setIsEntitlement((_a = response === null || response === void 0 ? void 0 : response.isEntitled) !== null && _a !== void 0 ? _a : null);
55
+ }
56
+ catch (error) {
57
+ console.error('Error fetching contact details:', error);
58
+ setIsEntitlement(null);
59
+ }
60
+ }
61
+ });
62
+ fetchContactDetails();
63
+ }, [ssoUsername]);
35
64
  //&seSessionId=8e8960ac-680b-443e-bf67-9e13f2acd64e
36
65
  const isATestvariation = ABTestVariation === 'A';
37
66
  const isBTestvariation = ABTestVariation === 'B' || isEmpty(ABTestVariation);
@@ -57,7 +86,9 @@ export function useIsSectionValid(sectionName) {
57
86
  let isValid = !isEmpty(caseType) &&
58
87
  !isEmpty(accountNumber) &&
59
88
  !isEmpty(contactSSOName) &&
60
- !selectedAccountDetails.data.subscriptionAbuse;
89
+ !selectedAccountDetails.data.subscriptionAbuse &&
90
+ (manageSupportCases !== null && manageSupportCases !== void 0 ? manageSupportCases : true) &&
91
+ (isEntitlement !== null && isEntitlement !== void 0 ? isEntitlement : true);
61
92
  if (isATestvariation) {
62
93
  isValid = isValid && !isEmpty(product) && !isEmpty(version);
63
94
  }
@@ -130,6 +161,7 @@ export function useIsSectionValid(sectionName) {
130
161
  !isEmpty(version) &&
131
162
  !isEmpty(summary) &&
132
163
  !isEmpty(issue) &&
164
+ isEntitlement === true &&
133
165
  isClusterIDValid(caseState, (_a = allProducts.data) === null || _a === void 0 ? void 0 : _a.productsResult);
134
166
  return isValid;
135
167
  }
@@ -199,12 +231,36 @@ export function useIsSectionValid(sectionName) {
199
231
  React.createElement("a", { href: "/support/contact/customerService" }, "Customer Service"),
200
232
  " for assistance.")) : ('');
201
233
  };
234
+ const getSupportSectionError = () => {
235
+ if (manageSupportCases === false) {
236
+ return (React.createElement(Trans, { i18nKey: "i18ManageCaseContactCustomerService" },
237
+ "You need additional access to manage cases.\u00A0 Please contact",
238
+ ' ',
239
+ React.createElement("a", { href: "/support/contact/customerService" }, "Customer Service"),
240
+ " for assistance."));
241
+ }
242
+ if (isEntitlement === false) {
243
+ return (React.createElement(Trans, { i18nKey: "i18ValidEntitlementContactCustomerService" },
244
+ "You need a valid entitlement to create a case.\u00A0 Please contact",
245
+ ' ',
246
+ React.createElement("a", { href: "/support/contact/customerService" }, "Customer Service"),
247
+ " for assistance."));
248
+ }
249
+ return '';
250
+ };
202
251
  const activeSectionError = (sectionNameLocal) => {
203
252
  if (!sectionNameLocal)
204
253
  return '';
205
254
  switch (sectionNameLocal) {
206
255
  case AppRouteSections.RESOURCES:
207
- return recommendationSectionError();
256
+ if (isCaseCreate === false) {
257
+ return getSupportSectionError();
258
+ }
259
+ else {
260
+ return recommendationSectionError();
261
+ }
262
+ case AppRouteSections.GET_SUPPORT:
263
+ return getSupportSectionError();
208
264
  default:
209
265
  return '';
210
266
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalTroubleshootEffects.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/GlobalTroubleshootEffects.tsx"],"names":[],"mappings":"AASA,OAAO,KAAkD,MAAM,OAAO,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAWvD,OAAO,EAAqB,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAQrF,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;CACpD;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,qBAgTtD"}
1
+ {"version":3,"file":"GlobalTroubleshootEffects.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/GlobalTroubleshootEffects.tsx"],"names":[],"mappings":"AASA,OAAO,KAAkD,MAAM,OAAO,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAWvD,OAAO,EAAuC,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAYvG,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;CACpD;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,qBAuTtD"}
@@ -24,7 +24,8 @@ import { useResetCaseCreate } from '../../hooks/useResetCaseCreate';
24
24
  import { CASE_DEATILS_SOURCE_REFERRER_LIMIT } from '../../reducers/CaseConstNTypes';
25
25
  import { getDescriptionWOQues } from '../../reducers/CaseHelpers';
26
26
  import { setCaseAccountNumber, setCaseDetails, setCaseOwner } from '../../reducers/CaseReducer';
27
- import { setRouteFlags } from '../../reducers/RouteReducer';
27
+ import { AppRouteSections } from '../../reducers/RouteConstNTypes';
28
+ import { setActiveSectionChanged, setRouteFlags, updateisNextBtnClickedToShowValidationError, } from '../../reducers/RouteReducer';
28
29
  import { fetchEdmundAbbottRules } from '../../reducers/RulesReducer';
29
30
  import { fetchTopContent } from '../../reducers/TopContentReducer';
30
31
  import RouteUtils from '../../utils/routeUtils';
@@ -117,6 +118,8 @@ export function GlobalTroubleshootEffects(props) {
117
118
  }, [allProducts.data.productsResult, caseDispatch, props.routeProps]);
118
119
  // if you want to hide any section on page load then the logic will go here..
119
120
  useEffect(() => {
121
+ // Reset validation error state when the troubleshoot app loads freshly
122
+ updateisNextBtnClickedToShowValidationError(dispatchToRouteReducer, false);
120
123
  if (!isFirstMount.current && loggedInUser.data && managedAccounts.data)
121
124
  return;
122
125
  if (isFirstMount.current) {
@@ -143,11 +146,14 @@ export function GlobalTroubleshootEffects(props) {
143
146
  */
144
147
  useEffect(() => {
145
148
  if (props.routeProps.location.pathname === RouteUtils.seBasePath) {
149
+ // Set the active section to the default section when navigating to base path
150
+ const defaultSection = isCaseCreate ? AppRouteSections.GET_SUPPORT : AppRouteSections.TROUBLESHOOT;
151
+ setActiveSectionChanged(dispatchToRouteReducer, defaultSection, '');
146
152
  RouteUtils.navigateToDefaltSection(props.routeProps, isCaseCreate, isSearchIntent, false);
147
153
  !isSearchIntent && resetCaseCreateState();
148
154
  }
149
155
  // eslint-disable-next-line react-hooks/exhaustive-deps
150
- }, [dispatchToRouteReducer, props.routeProps, isCaseCreate, isSearchIntent]);
156
+ }, [dispatchToRouteReducer, props.routeProps.location.pathname, isCaseCreate, isSearchIntent]);
151
157
  /**
152
158
  * Setting Default AccountNumber and ContactSsoUsername from loggedInUsersAccount
153
159
  * Disabling exhaustive-deps rule as we don't want to reset default values if user manually clears these from UI.
@@ -21,7 +21,7 @@ const MainSection = (props) => {
21
21
  React.createElement("section", { id: `${props.section}-section`, tabIndex: -1, "aria-labelledby": `${props.section}-heading`, "aria-describedby": `${props.section}-description`, className: `main-step-content ${props.className ? props.className : ''}` },
22
22
  isConfirmedStateSideSupport && props.section !== AppRouteSections.SUBMIT_CASE && (React.createElement(Alert, { isInline: true, variant: "warning", title: ((_c = loggedInUsersAccount === null || loggedInUsersAccount === void 0 ? void 0 : loggedInUsersAccount.data) === null || _c === void 0 ? void 0 : _c.hasConfirmedStatesideSupport)
23
23
  ? 'You have a confirmed stateside support account'
24
- : 'This is a confirmed stateside support account', className: "pf-v5-u-mb-lg" },
24
+ : 'This is a confirmed stateside support account', className: "pf-v6-u-mb-lg" },
25
25
  React.createElement("p", null,
26
26
  "To adhere to data regulations, open this case through",
27
27
  ' ',
@@ -31,7 +31,7 @@ const MainSection = (props) => {
31
31
  "instead of traditional support."))),
32
32
  React.createElement(LoadingIndicator, { show: props.isLoading, size: "lg" }),
33
33
  !props.isLoading && (React.createElement(React.Fragment, null,
34
- React.createElement("header", { className: "pf-v5-u-display-none-on-sm" },
34
+ React.createElement("header", { className: "pf-v6-u-display-none-on-sm" },
35
35
  props.title && (React.createElement("h2", { "aria-label": props.stepNumber &&
36
36
  `Step ${props.stepNumber} of ${props.totalSteps}: ${props.section}`, id: `${props.section}-heading` }, props.title)),
37
37
  props.description && (React.createElement("p", { id: `${props.section}-description`, className: `${props.descriptionClassName ? props.descriptionClassName : ''}` }, props.description))),
@@ -1 +1 @@
1
- {"version":3,"file":"NewFeatureModal.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/NewFeatureModal.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAK/D,QAAA,MAAM,eAAe,yBA8EpB,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"NewFeatureModal.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/NewFeatureModal.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAK/D,QAAA,MAAM,eAAe,yBA6EpB,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1,4 +1,4 @@
1
- import { Button, Checkbox, Modal, Title } from '@patternfly/react-core';
1
+ import { Button, Checkbox, Modal, ModalFooter, Title } from '@patternfly/react-core';
2
2
  import { useLocalStorage, useSessionStorage } from '@rh-support/components';
3
3
  import { GlobalMetadataStateContext } from '@rh-support/react-context';
4
4
  import { getConfigField, PCM_CONFIG_FIELD_TYPE } from '@rh-support/utils';
@@ -27,12 +27,12 @@ const NewFeatureModal = () => {
27
27
  const onBannerCheckboxChange = () => {
28
28
  setCheckedToNotShowModal(!checkedToNotShowModal);
29
29
  };
30
- return (React.createElement(React.Fragment, null, !shouldNotShowModal && isNewFeatureBannerVisible && showModal && (React.createElement(Modal, { className: "newFeatureModal", width: "45%", "aria-label": t('New feature modal'), isOpen: showModal, onClose: handleModalToggle, actions: [
31
- React.createElement(Button, { key: "close", variant: "primary", "data-tracking-id": "new-feature-modal-close", onClick: handleModalToggle }, t('Close')),
32
- ], showClose: false },
30
+ return (React.createElement(React.Fragment, null, !shouldNotShowModal && isNewFeatureBannerVisible && showModal && (React.createElement(Modal, { className: "newFeatureModal", width: "45%", "aria-label": t('New feature modal'), isOpen: showModal, onClose: handleModalToggle },
33
31
  React.createElement(RedHatCustomerPortalIcon, null),
34
- React.createElement(Title, { headingLevel: "h2", className: "pf-v5-u-font-weight-bold" }, t('Change: Application Announcement For KT Question Update')),
32
+ React.createElement(Title, { headingLevel: "h2", className: "pf-v6-u-font-weight-bold" }, t('Change: Application Announcement For KT Question Update')),
35
33
  React.createElement(Trans, null, "Welcome back! To improve your troubleshooting experience, we've updated how you create cases, changed the questions we ask, and given you more chances to edit your problem. We want to help you solve your technical challenges quickly."),
36
- React.createElement(Checkbox, { className: "pf-v5-u-mt-md", id: "new-feature-modal-checkbox", label: t(`I don't want to see this modal again`), isChecked: checkedToNotShowModal, onChange: onBannerCheckboxChange, "data-tracking-id": "new-feature-modal-checkbox" })))));
34
+ React.createElement(Checkbox, { className: "pf-v6-u-mt-md", id: "new-feature-modal-checkbox", label: t(`I don't want to see this modal again`), isChecked: checkedToNotShowModal, onChange: onBannerCheckboxChange, "data-tracking-id": "new-feature-modal-checkbox" }),
35
+ React.createElement(ModalFooter, null,
36
+ React.createElement(Button, { key: "close", variant: "primary", "data-tracking-id": "new-feature-modal-close", onClick: handleModalToggle }, t('Close')))))));
37
37
  };
38
38
  export default NewFeatureModal;
@@ -39,14 +39,14 @@ function WizardAside(props) {
39
39
  React.createElement("section", { className: "grid-aside-content" },
40
40
  canUseSessionManagement && !isCreatingCase && activeSection !== AppRouteSections.SUBMIT_CASE && (React.createElement(SessionRestore, { routeProps: props.routeProps })),
41
41
  canShowFileUploadWidget() && React.createElement(InsightsResults, null),
42
- canShowFileUploadWidget() && React.createElement(FileDiag, { className: "pf-v5-u-mb-md" }),
42
+ canShowFileUploadWidget() && React.createElement(FileDiag, { className: "pf-v6-u-mb-lg" }),
43
43
  activeSection === (isCaseCreate ? AppRouteSections.SUMMARIZE : AppRouteSections.TROUBLESHOOT) &&
44
44
  !isCveModalOpened && React.createElement(CveSidebar, null),
45
45
  activeSection === AppRouteSections.RESOURCES && React.createElement(CveSidebar, null),
46
46
  canShowEARuleWidget && React.createElement(EARuleWidget, null),
47
- !(isIdea && activeSection === 'submit-case') && (React.createElement(AsideResults, { routeProps: props.routeProps, className: "pf-v5-u-mb-md pf-v5-u-mt-0" })),
47
+ !(isIdea && activeSection === 'submit-case') && (React.createElement(AsideResults, { routeProps: props.routeProps, className: "pf-v6-u-mb-lg pf-v6-u-mt-0" })),
48
48
  canShowFileRecommendationSectionsWidget && React.createElement(InsightsResults, { isDisplayOnMain: true }),
49
- React.createElement(ClusterRecommendations, { showClusterRecommendationsList: canShowClusterIdReportWidget, className: "pf-v5-u-mb-md pf-v5-u-mt-0" }))));
49
+ React.createElement(ClusterRecommendations, { showClusterRecommendationsList: canShowClusterIdReportWidget, className: "pf-v6-u-mb-lg pf-v6-u-mt-0" }))));
50
50
  }
51
51
  WizardAside.defaultProps = defaultProps;
52
52
  export default WizardAside;
@@ -1 +1 @@
1
- {"version":3,"file":"WizardMain.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/WizardMain.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAiD,MAAM,OAAO,CAAC;AAEtE,OAAO,EAAS,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAO9D,OAAO,EAAoB,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAQpF,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjD,qBAAqB,EAAE,CAAC,cAAc,EAAE,OAAO,KAAK,IAAI,CAAC;IACzD,mBAAmB,EAAE,CAAC,gCAAgC,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5E;AAED,iBAAS,UAAU,CAAC,KAAK,EAAE,MAAM,qBAgJhC;AACD,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"WizardMain.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/WizardMain.tsx"],"names":[],"mappings":"AAUA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAEjF,OAAO,EAAS,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAO9D,OAAO,EAAoB,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAOpF,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjD,qBAAqB,EAAE,CAAC,cAAc,EAAE,OAAO,KAAK,IAAI,CAAC;IACzD,mBAAmB,EAAE,CAAC,gCAAgC,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5E;AAED,iBAAS,UAAU,CAAC,KAAK,EAAE,MAAM,qBAwMhC;AACD,eAAe,UAAU,CAAC"}
@@ -1,12 +1,23 @@
1
- import { Wizard, WizardContextConsumer, WizardFooter } from '@patternfly/react-core/deprecated';
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { Wizard, WizardNav, WizardNavItem, WizardStep, } from '@patternfly/react-core';
2
13
  import { LoadingIndicator } from '@rh-support/components';
3
14
  import isEqual from 'lodash/isEqual';
4
- import React, { Suspense, useContext, useRef, useState } from 'react';
15
+ import React, { Suspense, useContext, useEffect, useRef, useState } from 'react';
5
16
  import { useTranslation } from 'react-i18next';
6
17
  import { Route } from 'react-router-dom';
7
18
  import { useCaseSelector } from '../../context/CaseContext';
8
19
  import { RecommendationDispatchContext } from '../../context/RecommendationContext';
9
- import { RouteDispatchContext } from '../../context/RouteContext';
20
+ import { RouteContext, RouteDispatchContext } from '../../context/RouteContext';
10
21
  import { useWizard } from '../../hooks/useWizard';
11
22
  import { RecommendationsConstants } from '../../reducers/RecommendationsReducer';
12
23
  import { AppRouteSections } from '../../reducers/RouteConstNTypes';
@@ -22,10 +33,15 @@ function WizardMain(props) {
22
33
  const { isCreatingCase } = useCaseSelector((state) => ({
23
34
  isCreatingCase: state.isCreatingCase,
24
35
  }), isEqual);
36
+ const { routeState: { isCaseCreate }, } = useContext(RouteContext);
25
37
  const [userSeenRecommendations, setUserSeenRecommendations] = useState(false);
26
38
  const [userClickedNextonRecommendations, setUserClickedNextonRecommendations] = useState(false);
27
39
  const [userScrolledLabel, setUserScrolledLabel] = useState(false);
28
40
  const [userCanNavigateToTroubleshoot, setUserCanNavigateToTroubleshoot] = useState(false);
41
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
42
+ const [isNextButtonClicked, setIsNextButtonClicked] = useState(false);
43
+ const isNextButtonClickedRef = useRef(false);
44
+ const isBackButtonClickedRef = useRef(false);
29
45
  const resultsRowRef = useRef(null);
30
46
  const { getStepsSequece } = useWizard(props.routeProps, {
31
47
  userSeenRecommendationsfn: setUserSeenRecommendations,
@@ -37,6 +53,9 @@ function WizardMain(props) {
37
53
  });
38
54
  const dispatchToRouteReducer = useContext(RouteDispatchContext);
39
55
  const { t } = useTranslation();
56
+ useEffect(() => {
57
+ setActiveSectionChanged(dispatchToRouteReducer, isCaseCreate ? AppRouteSections.GET_SUPPORT : AppRouteSections.TROUBLESHOOT, '');
58
+ }, [isCaseCreate, dispatchToRouteReducer]);
40
59
  const renderSubmitCasePage = () => (React.createElement(MainSection, { section: AppRouteSections.SUBMIT_CASE, title: t('Case has been submitted'), isLoading: isCreatingCase, description: t("We'll be in contact with you shortly. Look for updates on this case."), className: "case-submit-page" },
41
60
  React.createElement(Suspense, { fallback: React.createElement(LoadingIndicator, { size: "sm" }) },
42
61
  React.createElement(SubmitCase, { routeProps: props.routeProps }))));
@@ -54,13 +73,13 @@ function WizardMain(props) {
54
73
  // isLoadingRecommendations needs to be set to false on back when the previous step is the summary
55
74
  // step because it can cause the next button to be permanently disabled if the debounce is not called
56
75
  // before going back a step. This can be caused if navigating quickly to then away from the recommendations page.
57
- if (prevStep.prevId === AppRouteSections.SUMMARIZE) {
76
+ if (prevStep.id === AppRouteSections.SUMMARIZE) {
58
77
  recommendationDispatch({
59
78
  type: RecommendationsConstants.setIsLoadingRecommendations,
60
79
  payload: { isLoadingRecommendations: false },
61
80
  });
62
81
  }
63
- var regex = new RegExp('/' + prevStep.prevId + '$');
82
+ var regex = new RegExp('/' + prevStep.id + '$');
64
83
  RouteUtils.navigateToSection(props.routeProps, props.routeProps.location.pathname.replace(regex, ''), false);
65
84
  };
66
85
  const onSubmit = () => {
@@ -68,26 +87,50 @@ function WizardMain(props) {
68
87
  props.submitCaseAndNavigate(false);
69
88
  return;
70
89
  };
71
- const onCurrentStepChanged = (step) => {
72
- setActiveSectionChanged(dispatchToRouteReducer, step.id, step.name);
90
+ const onCurrentStepChanged = (event, currentStep, prevStep, scope) => {
91
+ if (isNextButtonClickedRef.current) {
92
+ onNext(currentStep);
93
+ }
94
+ if (isBackButtonClickedRef.current) {
95
+ onBack(currentStep, prevStep);
96
+ }
97
+ setActiveSectionChanged(dispatchToRouteReducer, currentStep.id, currentStep.name);
73
98
  updateisNextBtnClickedToShowValidationError(dispatchToRouteReducer, false);
99
+ isNextButtonClickedRef.current = false;
100
+ isBackButtonClickedRef.current = false;
101
+ setIsNextButtonClicked(false);
102
+ };
103
+ const customNav = (isExpanded, steps, activeStep, goToStepByIndex) => (React.createElement(WizardNav, { isExpanded: isExpanded }, steps.map((step) => {
104
+ return (React.createElement(WizardNavItem, { key: step.id, id: step.id, content: step.name, isCurrent: activeStep.id === step.id, isDisabled: !step.canJumpTo, stepIndex: step.index, onClick: () => goToStepByIndex(step.index) }));
105
+ })));
106
+ const CustomFooter = (activeStep, goToNextStep, goToPrevStep) => {
107
+ useEffect(() => {
108
+ if (steps.length > 2 && (activeStep === null || activeStep === void 0 ? void 0 : activeStep.index) === 2 && isNextButtonClicked) {
109
+ goToNextStep({});
110
+ }
111
+ // eslint-disable-next-line react-hooks/exhaustive-deps
112
+ }, [activeStep, steps.length, isNextButtonClicked, goToNextStep]);
113
+ return (React.createElement(WizardNavigation, { routeProps: props.routeProps, onNext: (e) => {
114
+ isNextButtonClickedRef.current = true;
115
+ setIsNextButtonClicked(true);
116
+ goToNextStep(e);
117
+ focusWizardMainPanel();
118
+ }, onBack: (e) => {
119
+ isBackButtonClickedRef.current = true;
120
+ goToPrevStep(e);
121
+ focusWizardMainPanel();
122
+ }, activeStep: activeStep, onSubmit: onSubmit, confirmSupportModal: props.confirmSupportModal, onShowRestUpdate: (flag) => setShowRestFlag(flag), userSeenRecommendations: userSeenRecommendations, setUserSeenRecommendations: setUserSeenRecommendations, userClickedNextonRecommendationsFn: setUserClickedNextonRecommendations, userClickedNextonRecommendationsValue: userClickedNextonRecommendations, setUserCanNavigateToTroubleshoot: setUserCanNavigateToTroubleshoot, resultsRowRef: resultsRowRef, setUserScrolledLabel: setUserScrolledLabel }));
74
123
  };
75
- const CustomFooter = (React.createElement(WizardFooter, null,
76
- React.createElement(WizardContextConsumer, null, ({ activeStep, onNext, onBack }) => {
77
- return (React.createElement(WizardNavigation, { routeProps: props.routeProps, onNext: () => {
78
- onNext();
79
- focusWizardMainPanel();
80
- }, onBack: () => {
81
- onBack();
82
- focusWizardMainPanel();
83
- }, activeStep: activeStep, onSubmit: onSubmit, confirmSupportModal: props.confirmSupportModal, onShowRestUpdate: (flag) => setShowRestFlag(flag), userSeenRecommendations: userSeenRecommendations, setUserSeenRecommendations: setUserSeenRecommendations, userClickedNextonRecommendationsFn: setUserClickedNextonRecommendations, userClickedNextonRecommendationsValue: userClickedNextonRecommendations, setUserCanNavigateToTroubleshoot: setUserCanNavigateToTroubleshoot, resultsRowRef: resultsRowRef, setUserScrolledLabel: setUserScrolledLabel }));
84
- })));
124
+ const steps = getStepsSequece(showRestFlag);
125
+ const wizardSteps = steps.map((step) => {
126
+ const { component } = step, rest = __rest(step, ["component"]);
127
+ return (React.createElement(WizardStep, Object.assign({ key: step.id }, rest), component));
128
+ });
85
129
  // To add a new step to wizard first need to add the component to appRouteConfugurations
86
130
  // in useWizard file then add it to step squences in RouteConstNTypes
87
- const steps = getStepsSequece(showRestFlag);
88
131
  return (React.createElement(React.Fragment, null,
89
132
  React.createElement(NewFeatureModal, null),
90
- steps.length !== 0 && (React.createElement(Route, { path: `${RouteUtils.seBasePath}/(${steps[0].id}|describe-issue|open-case)`, render: () => (React.createElement(Wizard, { navAriaLabel: ` navAriaLabel steps `, mainAriaLabel: ` mainAriaLabel content `, steps: steps, footer: CustomFooter, onNext: onNext, onBack: onBack, hideClose: true, backButtonText: t('Go back'), onCurrentStepChanged: onCurrentStepChanged })) })),
133
+ steps.length !== 0 && (React.createElement(Route, { path: `${RouteUtils.seBasePath}/(${steps[0].id}|describe-issue|open-case)`, render: () => (React.createElement(Wizard, { isVisitRequired: true, nav: customNav, navAriaLabel: ` navAriaLabel steps `, footer: CustomFooter, onStepChange: onCurrentStepChanged }, wizardSteps)) })),
91
134
  React.createElement(Route, { exact: true, path: `${RouteUtils.seBasePath}/${AppRouteSections.SUBMIT_CASE}`, render: () => renderSubmitCasePage() })));
92
135
  }
93
136
  export default WizardMain;
@@ -3,8 +3,8 @@ import { RouteComponentProps } from 'react-router-dom';
3
3
  import { IRouteUrlParams, ISectionConfiguration } from '../../reducers/RouteConstNTypes';
4
4
  interface IProps {
5
5
  routeProps: RouteComponentProps<IRouteUrlParams>;
6
- onNext: () => void;
7
- onBack: () => void;
6
+ onNext: (e: React.MouseEvent<HTMLButtonElement>) => void;
7
+ onBack: (e: React.MouseEvent<HTMLButtonElement>) => void;
8
8
  activeStep: Partial<ISectionConfiguration>;
9
9
  onSubmit: () => void;
10
10
  confirmSupportModal: (hasPreferredSecureSupportAccount: boolean) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"WizardNavigation.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/WizardNavigation.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAOvD,OAAO,EAAoB,eAAe,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAM3G,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjD,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC3C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,mBAAmB,EAAE,CAAC,gCAAgC,EAAE,OAAO,KAAK,IAAI,CAAC;IACzE,gBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,0BAA0B,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IAC5E,kCAAkC,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACpF,qCAAqC,CAAC,EAAE,OAAO,CAAC;IAChD,gCAAgC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACjF,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,oBAAoB,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;CACxE;AAGD,iBAAS,gBAAgB,CAAC,KAAK,EAAE,MAAM,qBA6UtC;kBA7UQ,gBAAgB;;;AA+UzB,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"WizardNavigation.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/WizardNavigation.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAOvD,OAAO,EAAoB,eAAe,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAM3G,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACzD,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACzD,UAAU,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC3C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,mBAAmB,EAAE,CAAC,gCAAgC,EAAE,OAAO,KAAK,IAAI,CAAC;IACzE,gBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,0BAA0B,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IAC5E,kCAAkC,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACpF,qCAAqC,CAAC,EAAE,OAAO,CAAC;IAChD,gCAAgC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACjF,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,oBAAoB,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;CACxE;AAGD,iBAAS,gBAAgB,CAAC,KAAK,EAAE,MAAM,qBA8UtC;kBA9UQ,gBAAgB;;;AAgVzB,eAAe,gBAAgB,CAAC"}