@rh-support/troubleshoot 2.6.361 → 2.6.364

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 (364) hide show
  1. package/lib/esm/components/AccountInfo/AccountSelector.d.ts.map +1 -1
  2. package/lib/esm/components/AccountInfo/AccountSelector.js +29 -19
  3. package/lib/esm/components/AccountInfo/OwnerSelector.d.ts.map +1 -1
  4. package/lib/esm/components/AccountInfo/OwnerSelector.js +17 -92
  5. package/lib/esm/components/CaseEditView/ActiveCustomerEscalation/ActiveCustomerEscalation.d.ts.map +1 -1
  6. package/lib/esm/components/CaseEditView/ActiveCustomerEscalation/ActiveCustomerEscalation.js +2 -6
  7. package/lib/esm/components/CaseEditView/ActiveCustomerEscalation/RequestEscalationModal.d.ts.map +1 -1
  8. package/lib/esm/components/CaseEditView/ActiveCustomerEscalation/RequestEscalationModal.js +32 -61
  9. package/lib/esm/components/CaseEditView/Case.d.ts.map +1 -1
  10. package/lib/esm/components/CaseEditView/Case.js +33 -60
  11. package/lib/esm/components/CaseEditView/CaseDetailsAside.d.ts.map +1 -1
  12. package/lib/esm/components/CaseEditView/CaseDetailsAside.js +9 -19
  13. package/lib/esm/components/CaseEditView/CaseDetailsErrorMessage.d.ts.map +1 -1
  14. package/lib/esm/components/CaseEditView/CaseDetailsErrorMessage.js +7 -28
  15. package/lib/esm/components/CaseEditView/CaseDetailsTabs.d.ts.map +1 -1
  16. package/lib/esm/components/CaseEditView/CaseDetailsTabs.js +57 -88
  17. package/lib/esm/components/CaseEditView/CaseOverview/CaseOwnerInfo.d.ts +0 -2
  18. package/lib/esm/components/CaseEditView/CaseOverview/CaseOwnerInfo.d.ts.map +1 -1
  19. package/lib/esm/components/CaseEditView/CaseOverview/CaseOwnerInfo.js +3 -3
  20. package/lib/esm/components/CaseEditView/CaseOverview/CaseStatus.d.ts +2 -3
  21. package/lib/esm/components/CaseEditView/CaseOverview/CaseStatus.d.ts.map +1 -1
  22. package/lib/esm/components/CaseEditView/CaseOverview/CaseStatus.js +11 -24
  23. package/lib/esm/components/CaseEditView/CaseOverview/index.d.ts.map +1 -1
  24. package/lib/esm/components/CaseEditView/CaseOverview/index.js +57 -92
  25. package/lib/esm/components/CaseEditView/CaseSolutions/CaseSolutions.d.ts.map +1 -1
  26. package/lib/esm/components/CaseEditView/CaseSolutions/CaseSolutions.js +109 -203
  27. package/lib/esm/components/CaseEditView/CaseSolutions/CaseSolutionsItem.d.ts +1 -0
  28. package/lib/esm/components/CaseEditView/CaseSolutions/CaseSolutionsItem.d.ts.map +1 -1
  29. package/lib/esm/components/CaseEditView/CaseSolutions/CaseSolutionsItem.js +5 -5
  30. package/lib/esm/components/CaseEditView/ConfirmationModals/ReopenCaseModal.d.ts +3 -1
  31. package/lib/esm/components/CaseEditView/ConfirmationModals/ReopenCaseModal.d.ts.map +1 -1
  32. package/lib/esm/components/CaseEditView/ConfirmationModals/ReopenCaseModal.js +9 -5
  33. package/lib/esm/components/CaseEditView/RequestRemoteSession/ESSRemoteSessionModal.d.ts.map +1 -1
  34. package/lib/esm/components/CaseEditView/RequestRemoteSession/ESSRemoteSessionModal.js +17 -18
  35. package/lib/esm/components/CaseEditView/RequestRemoteSession/NewEssTermsModal.d.ts.map +1 -1
  36. package/lib/esm/components/CaseEditView/RequestRemoteSession/NewEssTermsModal.js +49 -55
  37. package/lib/esm/components/CaseEditView/RequestRemoteSession/RemoteSessionAgreementModal.d.ts.map +1 -1
  38. package/lib/esm/components/CaseEditView/RequestRemoteSession/RemoteSessionAgreementModal.js +46 -53
  39. package/lib/esm/components/CaseEditView/Tabs/CaseActionPlan/CaseActionPlan.d.ts.map +1 -1
  40. package/lib/esm/components/CaseEditView/Tabs/CaseActionPlan/CaseActionPlan.js +3 -6
  41. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseContactPhoneNumber.d.ts.map +1 -1
  42. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseContactPhoneNumber.js +46 -52
  43. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseDetailsManagement.d.ts.map +1 -1
  44. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseDetailsManagement.js +17 -63
  45. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseHostname.js +2 -2
  46. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseInformation.d.ts.map +1 -1
  47. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseInformation.js +2 -0
  48. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseInternalStatus.d.ts.map +1 -1
  49. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseInternalStatus.js +3 -4
  50. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseOpenshiftClusterId/CaseOpenshiftClusterId.d.ts.map +1 -1
  51. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseOpenshiftClusterId/CaseOpenshiftClusterId.js +56 -131
  52. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CasePhoneNumberConfirmAlert.js +1 -1
  53. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseReferenceNumber.d.ts.map +1 -1
  54. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseReferenceNumber.js +6 -11
  55. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseSbrGroups.d.ts.map +1 -1
  56. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseSbrGroups.js +1 -3
  57. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/ProductVersion.d.ts.map +1 -1
  58. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/ProductVersion.js +71 -111
  59. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/Summary.d.ts.map +1 -1
  60. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/Summary.js +10 -17
  61. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/useCustomEmails.d.ts.map +1 -1
  62. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/useCustomEmails.js +2 -4
  63. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/AsaCommentFeedbackModal.d.ts +25 -0
  64. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/AsaCommentFeedbackModal.d.ts.map +1 -0
  65. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/AsaCommentFeedbackModal.js +102 -0
  66. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseAttachment.d.ts.map +1 -1
  67. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseAttachment.js +26 -42
  68. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseComments.d.ts +4 -2
  69. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseComments.d.ts.map +1 -1
  70. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseComments.js +148 -152
  71. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseDiscussion.d.ts +2 -10
  72. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseDiscussion.d.ts.map +1 -1
  73. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseDiscussion.js +146 -252
  74. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CommentSearch.d.ts.map +1 -1
  75. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CommentSearch.js +9 -22
  76. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/DiscussionItemLink.d.ts.map +1 -1
  77. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/DiscussionItemLink.js +2 -9
  78. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/JumpAndCopyLink.d.ts.map +1 -1
  79. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/JumpAndCopyLink.js +1 -8
  80. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment/useMarkdownFileUploader.d.ts +2 -2
  81. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment/useMarkdownFileUploader.d.ts.map +1 -1
  82. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment/useMarkdownFileUploader.js +7 -18
  83. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment.d.ts +3 -9
  84. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment.d.ts.map +1 -1
  85. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment.js +271 -215
  86. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/VerifyCaseStatusModal/VerifyCaseStatusModal.d.ts.map +1 -1
  87. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/VerifyCaseStatusModal/VerifyCaseStatusModal.js +4 -6
  88. package/lib/esm/components/CaseEditView/Tabs/CaseHistory/CaseHistory.d.ts.map +1 -1
  89. package/lib/esm/components/CaseEditView/Tabs/CaseHistory/CaseHistory.js +2 -7
  90. package/lib/esm/components/CaseEditView/Tabs/CaseHistory/Timeline.css +4 -4
  91. package/lib/esm/components/CaseEditView/Tabs/CaseHistory/Timeline.d.ts +3 -36
  92. package/lib/esm/components/CaseEditView/Tabs/CaseHistory/Timeline.d.ts.map +1 -1
  93. package/lib/esm/components/CaseEditView/Tabs/CaseHistory/Timeline.js +230 -62
  94. package/lib/esm/components/CaseEditView/Tabs/CasePrivateNotes/CasePrivateNotes.d.ts +5 -4
  95. package/lib/esm/components/CaseEditView/Tabs/CasePrivateNotes/CasePrivateNotes.d.ts.map +1 -1
  96. package/lib/esm/components/CaseEditView/Tabs/CasePrivateNotes/CasePrivateNotes.js +8 -24
  97. package/lib/esm/components/CaseEditView/Tabs/CaseSummary/CaseSummary.d.ts.map +1 -1
  98. package/lib/esm/components/CaseEditView/Tabs/CaseSummary/CaseSummary.js +2 -8
  99. package/lib/esm/components/CaseEditView/Tabs/RMEEscalations/RMEEscalationList.d.ts.map +1 -1
  100. package/lib/esm/components/CaseEditView/Tabs/RMEEscalations/RMEEscalationList.js +52 -38
  101. package/lib/esm/components/CaseInformation/CaseGroup.d.ts.map +1 -1
  102. package/lib/esm/components/CaseInformation/CaseGroup.js +62 -173
  103. package/lib/esm/components/CaseInformation/CaseInformation.d.ts.map +1 -1
  104. package/lib/esm/components/CaseInformation/CaseInformation.js +9 -10
  105. package/lib/esm/components/CaseInformation/ContactPhoneNumber.d.ts.map +1 -1
  106. package/lib/esm/components/CaseInformation/ContactPhoneNumber.js +31 -108
  107. package/lib/esm/components/CaseInformation/ContactPhoneNumberPopOver.js +2 -2
  108. package/lib/esm/components/CaseInformation/Description.js +1 -1
  109. package/lib/esm/components/CaseInformation/FileDiag.d.ts.map +1 -1
  110. package/lib/esm/components/CaseInformation/FileDiag.js +5 -2
  111. package/lib/esm/components/CaseInformation/Fts.d.ts.map +1 -1
  112. package/lib/esm/components/CaseInformation/Fts.js +19 -33
  113. package/lib/esm/components/CaseInformation/Severity.d.ts.map +1 -1
  114. package/lib/esm/components/CaseInformation/Severity.js +24 -33
  115. package/lib/esm/components/CaseInformation/SupportLevel.d.ts.map +1 -1
  116. package/lib/esm/components/CaseInformation/SupportLevel.js +55 -36
  117. package/lib/esm/components/CaseManagement/CaseLanguageSelector.d.ts.map +1 -1
  118. package/lib/esm/components/CaseManagement/CaseLanguageSelector.js +8 -2
  119. package/lib/esm/components/CaseManagement/CaseManagement.d.ts.map +1 -1
  120. package/lib/esm/components/CaseManagement/CaseManagement.js +10 -13
  121. package/lib/esm/components/CaseManagement/Cep.d.ts.map +1 -1
  122. package/lib/esm/components/CaseManagement/Cep.js +10 -12
  123. package/lib/esm/components/CaseManagement/NoClusterIDReasonSelector.d.ts +1 -2
  124. package/lib/esm/components/CaseManagement/NoClusterIDReasonSelector.d.ts.map +1 -1
  125. package/lib/esm/components/CaseManagement/NoClusterIDReasonSelector.js +3 -20
  126. package/lib/esm/components/CaseManagement/OpenShiftClusterId.d.ts.map +1 -1
  127. package/lib/esm/components/CaseManagement/OpenShiftClusterId.js +6 -6
  128. package/lib/esm/components/CaseManagement/OpenshiftDropdownV4.d.ts +1 -0
  129. package/lib/esm/components/CaseManagement/OpenshiftDropdownV4.d.ts.map +1 -1
  130. package/lib/esm/components/CaseManagement/OpenshiftDropdownV4.js +32 -19
  131. package/lib/esm/components/CaseManagement/RHAssociatesSelector.d.ts.map +1 -1
  132. package/lib/esm/components/CaseManagement/RHAssociatesSelector.js +2 -4
  133. package/lib/esm/components/CaseManagement/SendNotifications/CaseContactSelector.d.ts.map +1 -1
  134. package/lib/esm/components/CaseManagement/SendNotifications/CaseContactSelector.js +2 -4
  135. package/lib/esm/components/CaseManagement/SendNotifications/NonOrgCaseNotifyeesSelector.d.ts.map +1 -1
  136. package/lib/esm/components/CaseManagement/SendNotifications/NonOrgCaseNotifyeesSelector.js +40 -34
  137. package/lib/esm/components/ConfirmationModals/NoAttachmentSelectedModal.d.ts.map +1 -1
  138. package/lib/esm/components/ConfirmationModals/NoAttachmentSelectedModal.js +4 -8
  139. package/lib/esm/components/EditDescription/EditDescription.d.ts.map +1 -1
  140. package/lib/esm/components/EditDescription/EditDescription.js +2 -4
  141. package/lib/esm/components/IdeaInformation/IdeaInformation.d.ts.map +1 -1
  142. package/lib/esm/components/IdeaInformation/IdeaInformation.js +17 -23
  143. package/lib/esm/components/OpenCase/SupportTypeSelectorPage.d.ts.map +1 -1
  144. package/lib/esm/components/OpenCase/SupportTypeSelectorPage.js +2 -4
  145. package/lib/esm/components/ProductSelector/AllProductsSelector.d.ts +1 -0
  146. package/lib/esm/components/ProductSelector/AllProductsSelector.d.ts.map +1 -1
  147. package/lib/esm/components/ProductSelector/AllProductsSelector.js +15 -3
  148. package/lib/esm/components/ProductSelector/NewProductDropdownSelector.d.ts.map +1 -1
  149. package/lib/esm/components/ProductSelector/NewProductDropdownSelector.js +37 -13
  150. package/lib/esm/components/ProductSelector/NewProductVersionSelector.d.ts.map +1 -1
  151. package/lib/esm/components/ProductSelector/NewProductVersionSelector.js +50 -37
  152. package/lib/esm/components/ProductSelector/ProductSelector.d.ts.map +1 -1
  153. package/lib/esm/components/ProductSelector/ProductSelector.js +3 -1
  154. package/lib/esm/components/ProductSelector/ProductVersionDropdownSelector.d.ts.map +1 -1
  155. package/lib/esm/components/ProductSelector/ProductVersionDropdownSelector.js +1 -9
  156. package/lib/esm/components/Recommendations/AsideResults.d.ts.map +1 -1
  157. package/lib/esm/components/Recommendations/AsideResults.js +3 -4
  158. package/lib/esm/components/Recommendations/ClusterRecommendationToast.d.ts.map +1 -1
  159. package/lib/esm/components/Recommendations/ClusterRecommendationToast.js +4 -1
  160. package/lib/esm/components/Recommendations/ClusterRecommendations.d.ts.map +1 -1
  161. package/lib/esm/components/Recommendations/ClusterRecommendations.js +4 -1
  162. package/lib/esm/components/Recommendations/InsightsResults.js +3 -3
  163. package/lib/esm/components/Recommendations/Recommendations.d.ts.map +1 -1
  164. package/lib/esm/components/Recommendations/Recommendations.js +9 -3
  165. package/lib/esm/components/RemoteRider/RemoteRiderAcceptanceModal.d.ts.map +1 -1
  166. package/lib/esm/components/RemoteRider/RemoteRiderAcceptanceModal.js +8 -10
  167. package/lib/esm/components/Review/Review.d.ts.map +1 -1
  168. package/lib/esm/components/Review/Review.js +19 -25
  169. package/lib/esm/components/SessionRestore/SessionRestore.d.ts.map +1 -1
  170. package/lib/esm/components/SessionRestore/SessionRestore.js +1 -3
  171. package/lib/esm/components/SubmitCase/SubmitCase.d.ts.map +1 -1
  172. package/lib/esm/components/SubmitCase/SubmitCase.js +1 -1
  173. package/lib/esm/components/TroubleshootSection/TroubleshootSection.js +2 -2
  174. package/lib/esm/components/UpdateSeverityModal/UpdateSeverityModal.d.ts.map +1 -1
  175. package/lib/esm/components/UpdateSeverityModal/UpdateSeverityModal.js +93 -141
  176. package/lib/esm/components/shared/Constants.d.ts +0 -5
  177. package/lib/esm/components/shared/Constants.d.ts.map +1 -1
  178. package/lib/esm/components/shared/Constants.js +0 -5
  179. package/lib/esm/components/shared/fileUpload/FileLister.d.ts.map +1 -1
  180. package/lib/esm/components/shared/fileUpload/FileLister.js +3 -3
  181. package/lib/esm/components/shared/fileUpload/FileUpload.js +3 -2
  182. package/lib/esm/components/shared/fileUpload/FileUploader.d.ts.map +1 -1
  183. package/lib/esm/components/shared/fileUpload/FileUploader.js +1 -3
  184. package/lib/esm/components/shared/fileUpload/WidgetFileUploader.d.ts +0 -1
  185. package/lib/esm/components/shared/fileUpload/WidgetFileUploader.d.ts.map +1 -1
  186. package/lib/esm/components/shared/fileUpload/WidgetFileUploader.js +3 -4
  187. package/lib/esm/components/shared/fileUpload/fileSelectors/FileSelectorButton.d.ts +1 -1
  188. package/lib/esm/components/shared/fileUpload/fileSelectors/FileSelectorButton.d.ts.map +1 -1
  189. package/lib/esm/components/shared/fileUpload/reducer/AttachmentHelper.d.ts +5 -22
  190. package/lib/esm/components/shared/fileUpload/reducer/AttachmentHelper.d.ts.map +1 -1
  191. package/lib/esm/components/shared/fileUpload/reducer/AttachmentHelper.js +59 -307
  192. package/lib/esm/components/shared/fileUpload/reducer/AttachmentReducer.d.ts +1 -5
  193. package/lib/esm/components/shared/fileUpload/reducer/AttachmentReducer.d.ts.map +1 -1
  194. package/lib/esm/components/shared/fileUpload/reducer/AttachmentReducer.js +1 -36
  195. package/lib/esm/components/shared/fileUpload/types/index.d.ts +1 -5
  196. package/lib/esm/components/shared/fileUpload/types/index.d.ts.map +1 -1
  197. package/lib/esm/components/shared/fileUpload/useFileUploader.d.ts +2 -2
  198. package/lib/esm/components/shared/fileUpload/useFileUploader.d.ts.map +1 -1
  199. package/lib/esm/components/shared/fileUpload/useFileUploader.js +47 -119
  200. package/lib/esm/components/shared/useIsSectionValid.d.ts.map +1 -1
  201. package/lib/esm/components/shared/useIsSectionValid.js +57 -22
  202. package/lib/esm/components/shared/usePostComment.d.ts.map +1 -1
  203. package/lib/esm/components/shared/usePostComment.js +28 -16
  204. package/lib/esm/components/shared/utils.d.ts +0 -1
  205. package/lib/esm/components/shared/utils.d.ts.map +1 -1
  206. package/lib/esm/components/shared/utils.js +3 -9
  207. package/lib/esm/components/wizardLayout/GlobalTroubleshootEffects.d.ts.map +1 -1
  208. package/lib/esm/components/wizardLayout/GlobalTroubleshootEffects.js +38 -178
  209. package/lib/esm/components/wizardLayout/MainSection.d.ts.map +1 -1
  210. package/lib/esm/components/wizardLayout/MainSection.js +1 -2
  211. package/lib/esm/components/wizardLayout/WizardAside.d.ts.map +1 -1
  212. package/lib/esm/components/wizardLayout/WizardAside.js +4 -2
  213. package/lib/esm/components/wizardLayout/WizardLayout.d.ts.map +1 -1
  214. package/lib/esm/components/wizardLayout/WizardLayout.js +13 -12
  215. package/lib/esm/components/wizardLayout/WizardMain.d.ts.map +1 -1
  216. package/lib/esm/components/wizardLayout/WizardMain.js +0 -7
  217. package/lib/esm/components/wizardLayout/WizardNavigation.d.ts.map +1 -1
  218. package/lib/esm/components/wizardLayout/WizardNavigation.js +11 -14
  219. package/lib/esm/constants/caseDetailsConstants.d.ts +0 -5
  220. package/lib/esm/constants/caseDetailsConstants.d.ts.map +1 -1
  221. package/lib/esm/constants/caseDetailsConstants.js +0 -5
  222. package/lib/esm/context/CaseContext.d.ts.map +1 -1
  223. package/lib/esm/css/app.css +0 -28
  224. package/lib/esm/css/case.css +212 -209
  225. package/lib/esm/hooks/useAB.d.ts.map +1 -1
  226. package/lib/esm/hooks/useAB.js +23 -45
  227. package/lib/esm/hooks/useCaseUpdateErrorMessage.d.ts +1 -9
  228. package/lib/esm/hooks/useCaseUpdateErrorMessage.d.ts.map +1 -1
  229. package/lib/esm/hooks/useCaseUpdateErrorMessage.js +11 -108
  230. package/lib/esm/hooks/useResetCaseCreate.d.ts.map +1 -1
  231. package/lib/esm/hooks/useResetCaseCreate.js +11 -18
  232. package/lib/esm/hooks/useS3Upload.d.ts +4 -5
  233. package/lib/esm/hooks/useS3Upload.d.ts.map +1 -1
  234. package/lib/esm/hooks/useS3Upload.js +30 -28
  235. package/lib/esm/i18n/template-de.d.ts +2 -2
  236. package/lib/esm/i18n/template-de.js +2 -2
  237. package/lib/esm/i18n/template-es.d.ts +2 -2
  238. package/lib/esm/i18n/template-es.js +2 -2
  239. package/lib/esm/i18n/template-fr.d.ts +2 -2
  240. package/lib/esm/i18n/template-fr.js +2 -2
  241. package/lib/esm/i18n/template-it.d.ts +2 -2
  242. package/lib/esm/i18n/template-it.js +2 -2
  243. package/lib/esm/i18n/template-jp.d.ts +2 -2
  244. package/lib/esm/i18n/template-jp.js +2 -2
  245. package/lib/esm/i18n/template-ko.d.ts +2 -2
  246. package/lib/esm/i18n/template-ko.js +2 -2
  247. package/lib/esm/i18n/template-pt.d.ts +2 -2
  248. package/lib/esm/i18n/template-pt.js +2 -2
  249. package/lib/esm/i18n/template-ru.d.ts +2 -2
  250. package/lib/esm/i18n/template-ru.js +2 -2
  251. package/lib/esm/i18n/template-zh.d.ts +2 -2
  252. package/lib/esm/i18n/template-zh.js +2 -2
  253. package/lib/esm/index.js +0 -1
  254. package/lib/esm/models/cache.d.ts +2 -0
  255. package/lib/esm/models/cache.d.ts.map +1 -1
  256. package/lib/esm/reducers/CaseConstNTypes.d.ts +9 -123
  257. package/lib/esm/reducers/CaseConstNTypes.d.ts.map +1 -1
  258. package/lib/esm/reducers/CaseConstNTypes.js +7 -31
  259. package/lib/esm/reducers/CaseDetailsPageReducer.d.ts +5 -7
  260. package/lib/esm/reducers/CaseDetailsPageReducer.d.ts.map +1 -1
  261. package/lib/esm/reducers/CaseDetailsPageReducer.js +26 -58
  262. package/lib/esm/reducers/CaseDiscussionTabReducer.d.ts +12 -12
  263. package/lib/esm/reducers/CaseDiscussionTabReducer.d.ts.map +1 -1
  264. package/lib/esm/reducers/CaseDiscussionTabReducer.js +73 -88
  265. package/lib/esm/reducers/CaseHelpers.d.ts +1 -11
  266. package/lib/esm/reducers/CaseHelpers.d.ts.map +1 -1
  267. package/lib/esm/reducers/CaseHelpers.js +17 -119
  268. package/lib/esm/reducers/CaseOverviewReducer.d.ts +1 -3
  269. package/lib/esm/reducers/CaseOverviewReducer.d.ts.map +1 -1
  270. package/lib/esm/reducers/CaseOverviewReducer.js +5 -7
  271. package/lib/esm/reducers/CaseReducer.d.ts +11 -56
  272. package/lib/esm/reducers/CaseReducer.d.ts.map +1 -1
  273. package/lib/esm/reducers/CaseReducer.js +100 -284
  274. package/lib/esm/reducers/RecommendationsReducer.d.ts.map +1 -1
  275. package/lib/esm/reducers/RecommendationsReducer.js +18 -15
  276. package/lib/esm/scss/_main.scss +0 -9
  277. package/lib/esm/utils/caseOpenshiftClusterIdUtils.d.ts +2 -1
  278. package/lib/esm/utils/caseOpenshiftClusterIdUtils.d.ts.map +1 -1
  279. package/lib/esm/utils/caseOpenshiftClusterIdUtils.js +4 -4
  280. package/package.json +8 -10
  281. package/lib/esm/components/CaseEditView/ArchivedCaseBanner.d.ts +0 -8
  282. package/lib/esm/components/CaseEditView/ArchivedCaseBanner.d.ts.map +0 -1
  283. package/lib/esm/components/CaseEditView/ArchivedCaseBanner.js +0 -18
  284. package/lib/esm/components/CaseEditView/RequestRemoteSession/remoteSessionUtils.d.ts +0 -10
  285. package/lib/esm/components/CaseEditView/RequestRemoteSession/remoteSessionUtils.d.ts.map +0 -1
  286. package/lib/esm/components/CaseEditView/RequestRemoteSession/remoteSessionUtils.js +0 -31
  287. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment/useAttachmentUploadCompletion.d.ts +0 -29
  288. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment/useAttachmentUploadCompletion.d.ts.map +0 -1
  289. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment/useAttachmentUploadCompletion.js +0 -29
  290. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment/useCommentDrafts.d.ts +0 -17
  291. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment/useCommentDrafts.d.ts.map +0 -1
  292. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment/useCommentDrafts.js +0 -62
  293. package/lib/esm/components/CaseInformation/CaseLabels.d.ts +0 -3
  294. package/lib/esm/components/CaseInformation/CaseLabels.d.ts.map +0 -1
  295. package/lib/esm/components/CaseInformation/CaseLabels.js +0 -108
  296. package/lib/esm/components/CaseManagement/CaseLabelsCreate.d.ts +0 -4
  297. package/lib/esm/components/CaseManagement/CaseLabelsCreate.d.ts.map +0 -1
  298. package/lib/esm/components/CaseManagement/CaseLabelsCreate.js +0 -141
  299. package/lib/esm/components/ProductSelector/ProductNotEntitledWarning.d.ts +0 -3
  300. package/lib/esm/components/ProductSelector/ProductNotEntitledWarning.d.ts.map +0 -1
  301. package/lib/esm/components/ProductSelector/ProductNotEntitledWarning.js +0 -9
  302. package/lib/esm/graphql/index.d.ts +0 -4
  303. package/lib/esm/graphql/index.d.ts.map +0 -1
  304. package/lib/esm/graphql/index.js +0 -3
  305. package/lib/esm/graphql/mutations/createRMECaseEscalation.d.ts +0 -2
  306. package/lib/esm/graphql/mutations/createRMECaseEscalation.d.ts.map +0 -1
  307. package/lib/esm/graphql/mutations/createRMECaseEscalation.js +0 -24
  308. package/lib/esm/graphql/mutations/index.d.ts +0 -2
  309. package/lib/esm/graphql/mutations/index.d.ts.map +0 -1
  310. package/lib/esm/graphql/mutations/index.js +0 -1
  311. package/lib/esm/graphql/queries/getEscalationDetails.d.ts +0 -2
  312. package/lib/esm/graphql/queries/getEscalationDetails.d.ts.map +0 -1
  313. package/lib/esm/graphql/queries/getEscalationDetails.js +0 -36
  314. package/lib/esm/graphql/queries/index.d.ts +0 -2
  315. package/lib/esm/graphql/queries/index.d.ts.map +0 -1
  316. package/lib/esm/graphql/queries/index.js +0 -1
  317. package/lib/esm/graphql/schemas/escalation.d.ts +0 -66
  318. package/lib/esm/graphql/schemas/escalation.d.ts.map +0 -1
  319. package/lib/esm/graphql/schemas/escalation.js +0 -1
  320. package/lib/esm/graphql/schemas/index.d.ts +0 -2
  321. package/lib/esm/graphql/schemas/index.d.ts.map +0 -1
  322. package/lib/esm/graphql/schemas/index.js +0 -1
  323. package/lib/esm/hooks/useCaseComments/caseCommentsQuery.d.ts +0 -4
  324. package/lib/esm/hooks/useCaseComments/caseCommentsQuery.d.ts.map +0 -1
  325. package/lib/esm/hooks/useCaseComments/caseCommentsQuery.js +0 -57
  326. package/lib/esm/hooks/useCaseComments/index.d.ts +0 -8
  327. package/lib/esm/hooks/useCaseComments/index.d.ts.map +0 -1
  328. package/lib/esm/hooks/useCaseComments/index.js +0 -5
  329. package/lib/esm/hooks/useCaseComments/mapCaseComment.d.ts +0 -25
  330. package/lib/esm/hooks/useCaseComments/mapCaseComment.d.ts.map +0 -1
  331. package/lib/esm/hooks/useCaseComments/mapCaseComment.js +0 -75
  332. package/lib/esm/hooks/useCaseComments/types.d.ts +0 -93
  333. package/lib/esm/hooks/useCaseComments/types.d.ts.map +0 -1
  334. package/lib/esm/hooks/useCaseComments/types.js +0 -1
  335. package/lib/esm/hooks/useCaseComments/useCaseComments.d.ts +0 -26
  336. package/lib/esm/hooks/useCaseComments/useCaseComments.d.ts.map +0 -1
  337. package/lib/esm/hooks/useCaseComments/useCaseComments.js +0 -113
  338. package/lib/esm/hooks/useCaseComments/useCreateCaseComment.d.ts +0 -19
  339. package/lib/esm/hooks/useCaseComments/useCreateCaseComment.d.ts.map +0 -1
  340. package/lib/esm/hooks/useCaseComments/useCreateCaseComment.js +0 -33
  341. package/lib/esm/hooks/useCaseGroupUiState.d.ts +0 -3
  342. package/lib/esm/hooks/useCaseGroupUiState.d.ts.map +0 -1
  343. package/lib/esm/hooks/useCaseGroupUiState.js +0 -10
  344. package/lib/esm/hooks/useCaseHistory.d.ts +0 -26
  345. package/lib/esm/hooks/useCaseHistory.d.ts.map +0 -1
  346. package/lib/esm/hooks/useCaseHistory.js +0 -107
  347. package/lib/esm/hooks/useCaseLabelLinkMutations.d.ts +0 -23
  348. package/lib/esm/hooks/useCaseLabelLinkMutations.d.ts.map +0 -1
  349. package/lib/esm/hooks/useCaseLabelLinkMutations.js +0 -84
  350. package/lib/esm/models/caseHistory.d.ts +0 -86
  351. package/lib/esm/models/caseHistory.d.ts.map +0 -1
  352. package/lib/esm/models/caseHistory.js +0 -1
  353. package/lib/esm/utils/TimelineUtils.d.ts +0 -41
  354. package/lib/esm/utils/TimelineUtils.d.ts.map +0 -1
  355. package/lib/esm/utils/TimelineUtils.js +0 -135
  356. package/lib/esm/utils/caseHistoryUtils.d.ts +0 -85
  357. package/lib/esm/utils/caseHistoryUtils.d.ts.map +0 -1
  358. package/lib/esm/utils/caseHistoryUtils.js +0 -196
  359. package/lib/esm/utils/caseSeverityFtsGraphQLUtils.d.ts +0 -6
  360. package/lib/esm/utils/caseSeverityFtsGraphQLUtils.d.ts.map +0 -1
  361. package/lib/esm/utils/caseSeverityFtsGraphQLUtils.js +0 -26
  362. package/lib/esm/utils/linkifyHtmlTextNodes.d.ts +0 -8
  363. package/lib/esm/utils/linkifyHtmlTextNodes.d.ts.map +0 -1
  364. package/lib/esm/utils/linkifyHtmlTextNodes.js +0 -37
@@ -7,17 +7,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { useApolloClient } from '@apollo/client/react';
10
+ import { caseAttachments, kase } from '@cee-eng/hydrajs';
11
11
  import { Button, ButtonVariant, Icon, Tooltip, TooltipPosition } from '@patternfly/react-core';
12
12
  import PaperclipIcon from '@patternfly/react-icons/dist/js/icons/paperclip-icon';
13
13
  import { InlineEdit, LoadingIndicator, ToastNotification, useConfirmation, useCopyToClipboard, useFetch, } from '@rh-support/components';
14
14
  import { GlobalMetadataStateContext, useCanEditCase } from '@rh-support/react-context';
15
15
  import { ability, CaseDiscussionFields, resourceActions, resources } from '@rh-support/user-permissions';
16
- import { deleteCaseAttachment, formatDateTime, humanizeSize, updateCaseAttachmentDescriptionByGraphQL, } from '@rh-support/utils';
16
+ import { formatDateTime, humanizeSize } from '@rh-support/utils';
17
17
  import isEmpty from 'lodash/isEmpty';
18
18
  import React, { useContext, useRef, useState } from 'react';
19
19
  import { Trans, useTranslation } from 'react-i18next';
20
- import { useCaseUpdateErrorMessage } from '../../../../hooks/useCaseUpdateErrorMessage';
21
20
  import { ATTACHMENT_DESCRIPTION_LENGTH_LIMIT } from '../../../../reducers/CaseConstNTypes';
22
21
  import { DiscussionType } from '../../../../reducers/CaseDiscussionTabReducer';
23
22
  import { PDFContext } from '../../PDFContainer';
@@ -26,35 +25,20 @@ import { JumpAndCopyLink } from './JumpAndCopyLink';
26
25
  const CaseAttachment = React.forwardRef((props, ref) => {
27
26
  var _a;
28
27
  const { t } = useTranslation();
29
- const caseUpdateError = useCaseUpdateErrorMessage();
30
28
  const clipboardRef = useRef(null);
31
29
  const { clipboardText, copyToClipboard } = useCopyToClipboard(clipboardRef);
32
- const { request, isFetching: isDeleting } = useFetch(deleteCaseAttachment, { propgateErrors: true });
30
+ const { request, isFetching: isDeleting } = useFetch(caseAttachments.deleteAttachment, { propgateErrors: true });
33
31
  const canSeePrivateAttachments = ability.can(resourceActions.PATCH, resources.CASE_COMMENTS, CaseDiscussionFields.VIEW_PRIVATE_ATTACHMENT);
34
32
  const { globalMetadataState: { loggedInUsersAccount }, } = useContext(GlobalMetadataStateContext);
35
33
  const [isCardIsDeleted, setIsCardIsDeleted] = useState(false); // adds a class name needed for anim when card is removed
36
34
  const { isExportingPDF } = useContext(PDFContext);
37
35
  const confirm = useConfirmation();
38
36
  const [attachmentDescription, setAttachmentDescription] = useState(props.attachment.description);
39
- const [isUpdating, setIsUpdating] = useState(false);
40
- const apolloClient = useApolloClient();
37
+ const { request: updateDescriptionRequest, isFetching: isUpdating } = useFetch(kase.updateAttachment);
41
38
  const canEditCase = useCanEditCase();
42
39
  const onDescriptionSave = () => __awaiter(void 0, void 0, void 0, function* () {
43
- if (!apolloClient.mutate) {
44
- caseUpdateError.showFieldError({}, t('Attachment description'));
45
- return;
46
- }
47
- setIsUpdating(true);
48
- try {
49
- const updatedAttachment = yield updateCaseAttachmentDescriptionByGraphQL(apolloClient, props.attachment, attachmentDescription);
50
- props.onMetadataUpdate && props.onMetadataUpdate(props.attachment.uuid, updatedAttachment);
51
- }
52
- catch (e) {
53
- caseUpdateError.showFieldError(e, t('Attachment description'), onDescriptionSave);
54
- }
55
- finally {
56
- setIsUpdating(false);
57
- }
40
+ const updatedAttachment = yield updateDescriptionRequest(props.attachment.caseNumber, props.attachment.uuid, [{ path: 'description', op: 'update', value: attachmentDescription }], loggedInUsersAccount.data.secureSupport);
41
+ props.onMetadataUpdate && props.onMetadataUpdate(props.attachment.uuid, updatedAttachment);
58
42
  });
59
43
  const onDescriptionChange = (event) => {
60
44
  if (canEditCase.alert())
@@ -77,9 +61,7 @@ const CaseAttachment = React.forwardRef((props, ref) => {
77
61
  "?")),
78
62
  });
79
63
  try {
80
- // TODO: Re-enable when delete API accepts isSecureSupport again
81
- // await request!(attachment.caseNumber!, attachment.uuid!, loggedInUsersAccount.data.secureSupport);
82
- yield request(attachment.caseNumber, attachment.uuid);
64
+ yield request(attachment.caseNumber, attachment.uuid, loggedInUsersAccount.data.secureSupport);
83
65
  ToastNotification.addSuccessMessage(t('Successfully deleted attachment: {{file}}', { file: attachment.fileName }));
84
66
  setIsCardIsDeleted(true);
85
67
  window.setTimeout(() => {
@@ -103,27 +85,29 @@ const CaseAttachment = React.forwardRef((props, ref) => {
103
85
  name: fileName,
104
86
  });
105
87
  };
106
- // Prefer size (bytes); fall back to sizeKB when GraphQL only populated the KB field.
107
- const attachmentSizeBytes = props.attachment.size > 0
108
- ? props.attachment.size
109
- : props.attachment.sizeKB > 0
110
- ? props.attachment.sizeKB * 1024
111
- : 0;
112
- const attachmentSizeLabel = attachmentSizeBytes > 0 ? humanizeSize(attachmentSizeBytes) : '';
113
- const attachmentLinkLabel = attachmentSizeLabel
114
- ? `${props.attachment.fileName} (${attachmentSizeLabel})`
115
- : props.attachment.fileName;
116
88
  const renderAttachmentLink = () => {
117
89
  if (!loggedInUsersAccount.data.secureSupport) {
118
90
  if (isExportingPDF) {
119
91
  return (React.createElement("a", { href: props.attachment.link },
120
- React.createElement("span", null, attachmentLinkLabel)));
92
+ React.createElement("span", null,
93
+ props.attachment.fileName,
94
+ " (",
95
+ humanizeSize(props.attachment.size),
96
+ ")")));
121
97
  }
122
- return (React.createElement(Button, { className: "attachment-download-btn", title: t('Download {{fileName}}', { fileName: props.attachment.fileName }), variant: ButtonVariant.link, isInline: true, onClick: onAttachmentDownloadClick, "data-tracking-id": "attachment-download-button" },
123
- React.createElement("span", null, attachmentLinkLabel)));
98
+ return (React.createElement(Button, { className: "attachment-download-btn", title: t('Download {{fileName}}', { fileName: props.attachment.fileName }), variant: ButtonVariant.link, onClick: onAttachmentDownloadClick, "data-tracking-id": "attachment-download-button" },
99
+ React.createElement("span", null,
100
+ props.attachment.fileName,
101
+ " (",
102
+ humanizeSize(props.attachment.size),
103
+ ")")));
124
104
  }
125
105
  return (React.createElement(Tooltip, { position: TooltipPosition.top, content: t(`You don't have appropriate permissions to download the attachment`) },
126
- React.createElement("strong", null, attachmentLinkLabel)));
106
+ React.createElement("strong", null,
107
+ props.attachment.fileName,
108
+ " (",
109
+ humanizeSize(props.attachment.size),
110
+ ")")));
127
111
  };
128
112
  const onJumpToComment = (attachmentId) => () => props.showJumpToComment && props.onJumpToComment && props.onJumpToComment(attachmentId);
129
113
  if (((_a = props.attachment) === null || _a === void 0 ? void 0 : _a.isPrivate) && !canSeePrivateAttachments)
@@ -141,7 +125,7 @@ const CaseAttachment = React.forwardRef((props, ref) => {
141
125
  React.createElement("h4", null,
142
126
  React.createElement(Icon, { className: "pf-v6-u-mr-xs" },
143
127
  React.createElement(PaperclipIcon, null)),
144
- props.attachment.createdBy),
128
+ props.attachment.modifiedBy),
145
129
  React.createElement("time", { className: "text-right" }, formatDateTime(props.attachment.lastModifiedDate))),
146
130
  React.createElement("div", { className: "comment-body" },
147
131
  React.createElement(Trans, null, "Attached file"),
@@ -157,7 +141,7 @@ const CaseAttachment = React.forwardRef((props, ref) => {
157
141
  React.createElement("code", { ref: clipboardRef }, props.attachment.checksum)),
158
142
  React.createElement(Tooltip, { position: TooltipPosition.top, content: clipboardText, trigger: "click" },
159
143
  React.createElement("button", { "aria-label": "Copy to clipboard", className: "nimbus-icon-clipboard clip-code-raw-btn xs-icon", onClick: copyToClipboard, type: "button" }))))),
160
- React.createElement(InlineEdit, { labelProps: { htmlFor: `case-details-file-description-${props.attachment.id}` }, allowInlineEdit: !canEditCase.isCaseNotEditable, labelContent: React.createElement(Trans, null, "Description"), content: React.createElement("div", { className: "clip-content-wrapper code-block" }, props.attachment.description), hideSaveCancel: false, onSave: onDescriptionSave, onCancel: onDescriptionCancel, dataTrackingId: "case-details-file-description", initialIsEditing: props.attachment.description ? false : true, saveDisabled: isCaseAttachmentDescriptionLengthy ||
144
+ React.createElement(InlineEdit, { labelProps: { htmlFor: `case-details-file-description-${props.attachment.id}` }, allowInlineEdit: true, labelContent: React.createElement(Trans, null, "Description"), content: React.createElement("div", { className: "clip-content-wrapper code-block" }, props.attachment.description), hideSaveCancel: false, onSave: onDescriptionSave, onCancel: onDescriptionCancel, dataTrackingId: "case-details-file-description", initialIsEditing: props.attachment.description ? false : true, saveDisabled: isCaseAttachmentDescriptionLengthy ||
161
145
  isCaseAttachmentDescription ||
162
146
  attachmentDescription === props.attachment.description ||
163
147
  isUpdating, loadingIndicator: isUpdating ? React.createElement(LoadingIndicator, { isInline: true }) : undefined, isExportingPDF: isExportingPDF },
@@ -169,7 +153,7 @@ const CaseAttachment = React.forwardRef((props, ref) => {
169
153
  React.createElement("span", { className: "pull-right pf-v6-l-flex pf-m-align-items-center" },
170
154
  props.showJumpToComment && (React.createElement(DiscussionItemLink, { onClick: onJumpToComment(props.attachment.id), discussionType: DiscussionType.ATTACHMENT, itemId: props.attachment.id, caseNumber: props.attachment.caseNumber, isCopyLink: false },
171
155
  React.createElement(Trans, null, "Jump to attachment"))),
172
- React.createElement("button", { className: `btn btn-app btn-link text-danger ${isExportingPDF ? 'hide-in-pdf' : ''}`, title: "Delete attachment", onClick: deleteAttachment(props.attachment), "data-tracking-id": "delete-attachmentid-button", type: "button", disabled: canEditCase.isCaseNotEditable },
156
+ React.createElement("button", { className: `btn btn-app btn-link text-danger ${isExportingPDF ? 'hide-in-pdf' : ''}`, title: "Delete attachment", onClick: deleteAttachment(props.attachment), "data-tracking-id": "delete-attachmentid-button", type: "button" },
173
157
  React.createElement(Trans, null, "Delete")),
174
158
  React.createElement(JumpAndCopyLink, { caseNumber: props.attachment.caseNumber, cardId: props.attachment.id, discussionType: DiscussionType.ATTACHMENT })))));
175
159
  });
@@ -1,12 +1,14 @@
1
1
  import { ICaseComment } from '@cee-eng/hydrajs/@types/api/public/case';
2
2
  import React from 'react';
3
+ export declare const AUTOMATED_SUPPORT_ASSISTANT = "Support AI Assistant";
3
4
  interface IProps {
4
5
  caseNumber: string;
5
6
  comment: ICaseComment;
6
7
  feedback: number;
7
- onFeedBackUpdate: (id: string, feedback: number) => void;
8
+ feedbackReason?: string;
9
+ onFeedBackUpdate: (id: string, feedback: number, feedbackReason?: string) => void;
8
10
  accountNumber: string;
9
- onReply: (author: string, commentId: string, timestamp: string) => void;
11
+ onReply: (commentText: string, commentCreator: string, isPublic: boolean) => void;
10
12
  showJumpToComment?: boolean;
11
13
  onJumpToComment?: (commentId: string) => void;
12
14
  downloadAttachment: ({ caseNumber, uuid, name }: {
@@ -1 +1 @@
1
- {"version":3,"file":"CaseComments.d.ts","sourceRoot":"","sources":["../../../../../../src/components/CaseEditView/Tabs/CaseDiscussion/CaseComments.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AA2BvE,OAAO,KAAwC,MAAM,OAAO,CAAC;AAW7D,UAAU,MAAM;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACxE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,kBAAkB,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAChH;AAED,QAAA,MAAM,YAAY,4EAgXhB,CAAC;AAEH,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"CaseComments.d.ts","sourceRoot":"","sources":["../../../../../../src/components/CaseEditView/Tabs/CaseDiscussion/CaseComments.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AA+BvE,OAAO,KAAkD,MAAM,OAAO,CAAC;AASvE,eAAO,MAAM,2BAA2B,yBAAyB,CAAC;AAElE,UAAU,MAAM;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAClF,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAClF,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,kBAAkB,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAChH;AAED,QAAA,MAAM,YAAY,4EAochB,CAAC;AAEH,eAAe,YAAY,CAAC"}
@@ -1,105 +1,122 @@
1
- // TODO: Re-enable after GraphQL migration of feedback (Allowed Regression #5)
2
- // import { ICommentFeedback } from '@cee-eng/hydrajs/@types/api/public/commentFeedback';
3
- import { EventTypes, linkifyBZIDs, linkifyWithCaseIDs, processRME } from '@cee-eng/ui-toolkit';
4
- import { Icon } from '@patternfly/react-core';
5
- // TODO: Re-enable after GraphQL migration of feedback (Allowed Regression #5)
6
- // import { Tooltip, TooltipPosition } from '@patternfly/react-core';
7
- // import FrownIcon from '@patternfly/react-icons/dist/js/icons/frown-icon';
8
- // import MehIcon from '@patternfly/react-icons/dist/js/icons/meh-icon';
9
- // import OutlinedFrownIcon from '@patternfly/react-icons/dist/js/icons/outlined-frown-icon';
10
- // import OutlinedMehIcon from '@patternfly/react-icons/dist/js/icons/outlined-meh-icon';
11
- // import OutlinedSmileIcon from '@patternfly/react-icons/dist/js/icons/outlined-smile-icon';
12
- // import SmileIcon from '@patternfly/react-icons/dist/js/icons/smile-icon';
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 { publicApi } from '@cee-eng/hydrajs';
11
+ import { encodeAngularBrackets, EventTypes, htmlEntitiesEncode, linkifyBZIDs, linkifyWithCaseIDs, parseCommentMarkdown, processRME, } from '@cee-eng/ui-toolkit';
12
+ import { Alert, Button, ButtonVariant, Icon, Tooltip, TooltipPosition } from '@patternfly/react-core';
13
+ import FrownIcon from '@patternfly/react-icons/dist/js/icons/frown-icon';
14
+ import MehIcon from '@patternfly/react-icons/dist/js/icons/meh-icon';
15
+ import OutlinedFrownIcon from '@patternfly/react-icons/dist/js/icons/outlined-frown-icon';
16
+ import OutlinedMehIcon from '@patternfly/react-icons/dist/js/icons/outlined-meh-icon';
17
+ import OutlinedSmileIcon from '@patternfly/react-icons/dist/js/icons/outlined-smile-icon';
18
+ import SmileIcon from '@patternfly/react-icons/dist/js/icons/smile-icon';
13
19
  import UserCircleIcon from '@patternfly/react-icons/dist/js/icons/user-circle-icon';
14
- // TODO: Re-enable after GraphQL migration of feedback (Allowed Regression #5)
15
- // import { LoadingIndicator, ToastNotification } from '@rh-support/components';
16
- import { AbilityContext,
17
- // CaseDetailsFields, // TODO: Re-enable after GraphQL migration of feedback
18
- CaseDiscussionFields, resourceActions, resources, } from '@rh-support/user-permissions';
20
+ import { EditorMode, LoadingIndicator, ToastNotification } from '@rh-support/components';
21
+ import { AbilityContext, CaseDetailsFields, CaseDiscussionFields, resourceActions, resources, } from '@rh-support/user-permissions';
19
22
  import { formatDateTime, linkifyLinks } from '@rh-support/utils';
20
23
  import DOMPurify from 'dompurify';
21
24
  import isEmpty from 'lodash/isEmpty';
22
25
  import isEqual from 'lodash/isEqual';
23
- import React, { useContext, useEffect, useRef } from 'react';
24
- import { Trans } from 'react-i18next';
25
- // TODO: Re-enable after GraphQL migration of feedback
26
- // import { useTranslation } from 'react-i18next';
26
+ import React, { useContext, useEffect, useRef, useState } from 'react';
27
+ import { Trans, useTranslation } from 'react-i18next';
27
28
  import { DiscussionType } from '../../../../reducers/CaseDiscussionTabReducer';
28
- import { linkifyHtmlTextNodes } from '../../../../utils/linkifyHtmlTextNodes';
29
29
  import { PDFContext } from '../../PDFContainer';
30
+ import { AsaCommentFeedbackModal } from './AsaCommentFeedbackModal';
30
31
  import { DiscussionItemLink } from './DiscussionItemLink';
31
32
  import { JumpAndCopyLink } from './JumpAndCopyLink';
33
+ export const AUTOMATED_SUPPORT_ASSISTANT = 'Support AI Assistant';
32
34
  const CaseComments = React.forwardRef((props, ref) => {
33
- var _a;
35
+ var _a, _b;
34
36
  const { caseNumber } = props;
35
37
  const markdownRef = useRef(null);
36
- // TODO: Re-enable `t` after GraphQL migration of feedback (Allowed Regression #5)
37
- // const { t } = useTranslation();
38
+ const { t } = useTranslation();
38
39
  const ability = useContext(AbilityContext);
39
40
  const canSeePrivateComments = ability.can(resourceActions.PATCH, resources.CASE_COMMENTS, CaseDiscussionFields.VIEW_PRIVATE_COMMENT);
40
- // TODO: Re-enable after GraphQL migration of feedback (Allowed Regression #5)
41
- // const canSeeFeedbackButtons =
42
- // ability.can(resourceActions.PATCH, resources.CASE_DETAILS, CaseDetailsFields.CASE_DETAILS_FEEDBACK_BUTTONS) &&
43
- // props.comment.isPublic &&
44
- // props.comment.createdBy !== 'Automated Support Assistant';
45
- // TODO: Re-enable after GraphQL migration of feedback (Allowed Regression #5)
46
- // const [isFeedbackUpdating, setIsFeedbackUpdating] = useState(false);
41
+ const isAsaComment = props.comment.createdBy === AUTOMATED_SUPPORT_ASSISTANT;
42
+ const canGiveCommentFeedback = ability.can(resourceActions.PATCH, resources.CASE_DETAILS, CaseDetailsFields.CASE_DETAILS_FEEDBACK_BUTTONS);
43
+ const canSeeFeedbackButtons = canGiveCommentFeedback && props.comment.isPublic && !isAsaComment;
44
+ const [isFeedbackUpdating, setIsFeedbackUpdating] = useState(false);
45
+ const [isAsaFeedbackModalOpen, setIsAsaFeedbackModalOpen] = useState(false);
46
+ const [savedFeedbackValue, setSavedFeedbackValue] = useState(props.feedback);
47
+ const [savedFeedbackReason, setSavedFeedbackReason] = useState((_a = props.feedbackReason) !== null && _a !== void 0 ? _a : '');
47
48
  const { isExportingPDF } = useContext(PDFContext);
49
+ useEffect(() => {
50
+ setSavedFeedbackValue(props.feedback);
51
+ }, [props.feedback]);
52
+ useEffect(() => {
53
+ var _a;
54
+ setSavedFeedbackReason((_a = props.feedbackReason) !== null && _a !== void 0 ? _a : '');
55
+ }, [props.feedbackReason]);
56
+ const commentReply = (comment) => () => {
57
+ props.onReply(comment.commentBody, comment.createdBy, comment.isPublic);
58
+ };
48
59
  const onJumpToComment = (commentId) => () => props.showJumpToComment && props.onJumpToComment && props.onJumpToComment(commentId);
49
- // TODO: Re-enable after GraphQL migration of feedback (Allowed Regression #5)
50
- // const applyCommentFeedback = (comment: ICaseComment, feedback) => async (e) => {
51
- // e.preventDefault();
52
- // if (props.feedback === feedback) return;
53
- // const commJson: ICommentFeedback = {
54
- // feedback,
55
- // accountNumber: props.accountNumber,
56
- // commentId: comment.id,
57
- // commentCreatedBy: comment.createdBy,
58
- // };
59
- // try {
60
- // setIsFeedbackUpdating(true);
61
- // if (props.feedback !== undefined) {
62
- // await publicApi.commentFeedback.updateCommentFeedback(caseNumber, commJson);
63
- // } else {
64
- // await publicApi.commentFeedback.createCommentFeedback(caseNumber, commJson);
65
- // }
66
- // setIsFeedbackUpdating(false);
67
- // props.onFeedBackUpdate(comment.id, feedback);
68
- // ToastNotification.addSuccessMessage(t(`Comment feedback has been successfully updated`));
69
- // } catch (e) {
70
- // setIsFeedbackUpdating(false);
71
- // ToastNotification.addDangerMessage(t(`Comment feedback failed to update`));
72
- // }
73
- // };
74
- // TODO: Re-enable after GraphQL migration of feedback (Allowed Regression #5)
75
- // const commentFeedbackButtons = (comment: ICaseComment, feedback: number) => (
76
- // <span className="comment-feedback-buttons">
77
- // <LoadingIndicator isInline={true} show={isFeedbackUpdating} />
78
- // <Tooltip position={TooltipPosition.top} content={t('Positive feedback')}>
79
- // <button className="btn btn-app btn-link" onClick={applyCommentFeedback(comment, 1)}
80
- // data-tracking-id="case-comment-feedback-up" type="button">
81
- // {feedback === 1 ? <SmileIcon title={t('Remove positive feedback')} />
82
- // : <OutlinedSmileIcon title={t('Leave positive feedback')} />}
83
- // </button>
84
- // </Tooltip>
85
- // <Tooltip position={TooltipPosition.top} content={t('Neutral feedback')}>
86
- // <button className="btn btn-app btn-link" onClick={applyCommentFeedback(comment, 0)}
87
- // data-tracking-id="case-comment-feedback-neutral" type="button">
88
- // {feedback === 0 ? <MehIcon title={t('Remove neutral feedback')} />
89
- // : <OutlinedMehIcon title={t('Leave neutral feedback')} />}
90
- // </button>
91
- // </Tooltip>
92
- // <Tooltip position={TooltipPosition.top} content={t('Negative feedback')}>
93
- // <button className="btn btn-app btn-link" onClick={applyCommentFeedback(comment, -1)}
94
- // data-tracking-id="case-comment-feedback-down" type="button">
95
- // {feedback === -1 ? <FrownIcon title={t('Remove negative feedback')} aria-label={t('Remove negative feedback')} />
96
- // : <OutlinedFrownIcon title={t('Leave negative feedback')} aria-label={t('Leave negative feedback')} />}
97
- // </button>
98
- // </Tooltip>
99
- // </span>
100
- // );
60
+ const applyCommentFeedback = (comment, feedback) => (e) => __awaiter(void 0, void 0, void 0, function* () {
61
+ e.preventDefault();
62
+ if (props.feedback === feedback) {
63
+ return;
64
+ }
65
+ yield submitCommentFeedback(comment, feedback);
66
+ });
67
+ const submitCommentFeedback = (comment, feedback, feedbackReason) => __awaiter(void 0, void 0, void 0, function* () {
68
+ var _a;
69
+ const commJson = Object.assign({ feedback, accountNumber: props.accountNumber, commentId: comment.id, commentCreatedBy: comment.createdBy }, (feedbackReason !== undefined ? { feedbackReason } : {}));
70
+ try {
71
+ setIsFeedbackUpdating(true);
72
+ const hasExistingFeedback = savedFeedbackValue !== undefined;
73
+ const response = hasExistingFeedback
74
+ ? yield publicApi.commentFeedback.updateCommentFeedback(caseNumber, commJson)
75
+ : yield publicApi.commentFeedback.createCommentFeedback(caseNumber, commJson);
76
+ setIsFeedbackUpdating(false);
77
+ const responseFeedback = (response === null || response === void 0 ? void 0 : response.feedback) !== undefined && (response === null || response === void 0 ? void 0 : response.feedback) !== null && `${response.feedback}` !== ''
78
+ ? parseInt(String(response.feedback), 10)
79
+ : feedback;
80
+ const savedFeedback = Number.isNaN(responseFeedback) ? feedback : responseFeedback;
81
+ const savedReason = (_a = response === null || response === void 0 ? void 0 : response.feedbackReason) !== null && _a !== void 0 ? _a : feedbackReason;
82
+ setSavedFeedbackValue(savedFeedback);
83
+ if (feedbackReason !== undefined) {
84
+ setSavedFeedbackReason(savedReason !== null && savedReason !== void 0 ? savedReason : '');
85
+ props.onFeedBackUpdate(comment.id, savedFeedback, savedReason !== null && savedReason !== void 0 ? savedReason : '');
86
+ }
87
+ else {
88
+ props.onFeedBackUpdate(comment.id, savedFeedback);
89
+ }
90
+ ToastNotification.addSuccessMessage(t(`Comment feedback has been successfully updated`));
91
+ return true;
92
+ }
93
+ catch (e) {
94
+ setIsFeedbackUpdating(false);
95
+ ToastNotification.addDangerMessage(t(`Comment feedback failed to update`));
96
+ return false;
97
+ }
98
+ });
99
+ const openAsaFeedbackModal = (e) => {
100
+ e === null || e === void 0 ? void 0 : e.preventDefault();
101
+ setIsAsaFeedbackModalOpen(true);
102
+ };
103
+ const onSubmitAsaFeedback = (feedback, feedbackReason) => __awaiter(void 0, void 0, void 0, function* () {
104
+ const didSubmit = yield submitCommentFeedback(props.comment, feedback, feedbackReason);
105
+ if (didSubmit) {
106
+ setIsAsaFeedbackModalOpen(false);
107
+ }
108
+ return didSubmit;
109
+ });
110
+ const commentFeedbackButtons = (comment, feedback) => (React.createElement("span", { className: "comment-feedback-buttons" },
111
+ React.createElement(LoadingIndicator, { isInline: true, show: isFeedbackUpdating }),
112
+ React.createElement(Tooltip, { position: TooltipPosition.top, content: t('Positive feedback') },
113
+ React.createElement("button", { className: "btn btn-app btn-link", onClick: applyCommentFeedback(comment, 1), "data-tracking-id": "case-comment-feedback-up", type: "button" }, feedback === 1 ? (React.createElement(SmileIcon, { title: t('Remove positive feedback') })) : (React.createElement(OutlinedSmileIcon, { title: t('Leave positive feedback') })))),
114
+ React.createElement(Tooltip, { position: TooltipPosition.top, content: t('Neutral feedback') },
115
+ React.createElement("button", { className: "btn btn-app btn-link", onClick: applyCommentFeedback(comment, 0), "data-tracking-id": "case-comment-feedback-neutral", type: "button" }, feedback === 0 ? (React.createElement(MehIcon, { title: t('Remove neutral feedback') })) : (React.createElement(OutlinedMehIcon, { title: t('Leave neutral feedback') })))),
116
+ React.createElement(Tooltip, { position: TooltipPosition.top, content: t('Negative feedback') },
117
+ React.createElement("button", { className: "btn btn-app btn-link", onClick: applyCommentFeedback(comment, -1), "data-tracking-id": "case-comment-feedback-down", type: "button" }, feedback === -1 ? (React.createElement(FrownIcon, { title: t('Remove negative feedback'), "aria-label": t('Remove negative feedback') })) : (React.createElement(OutlinedFrownIcon, { title: t('Leave negative feedback'), "aria-label": t('Leave negative feedback') }))))));
101
118
  const computeDiscussionCardCalss = (comment) => {
102
- if (comment.createdByType === 'Associate' && comment.createdBy === 'Automated Support Assistant') {
119
+ if (comment.createdByType === 'Associate' && comment.createdBy === AUTOMATED_SUPPORT_ASSISTANT) {
103
120
  return 'comment-automated';
104
121
  }
105
122
  else if (comment.createdByType === 'Associate') {
@@ -124,8 +141,9 @@ const CaseComments = React.forwardRef((props, ref) => {
124
141
  }
125
142
  };
126
143
  const computeCommentAuthorIcon = (comment) => {
127
- if (comment.createdByType === 'Associate' && comment.createdBy === 'Automated support assistant') {
128
- return (React.createElement("img", { src: "https://static.redhat.com/libs/redhat/brand-assets/2/corp/logo--hat-only.svg", height: "18", width: "18", "aria-hidden": "true", alt: "Automated support assistant comment", title: "Automated support assistant", style: { verticalAlign: '-0.125em', marginRight: '6px' } }));
144
+ if (comment.createdByType === 'Associate' && comment.createdBy === AUTOMATED_SUPPORT_ASSISTANT) {
145
+ return (React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1rem", height: "1rem", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", className: "asa-comment-author-icon" },
146
+ React.createElement("path", { d: "M6.12402 2.4082C6.35218 2.4082 6.55997 2.60182 6.57812 2.8291C6.78299 5.41264 8.80708 7.4365 11.3906 7.6416C11.6179 7.65955 11.8115 7.86755 11.8115 8.0957C11.8115 8.32428 11.6179 8.53142 11.3906 8.5498C8.8071 8.75486 6.78376 10.7792 6.5791 13.3623C6.56075 13.5894 6.35227 13.7832 6.12402 13.7832C5.89623 13.783 5.68905 13.5895 5.6709 13.3623C5.46602 10.7788 3.44185 8.75501 0.858398 8.5498C0.63091 8.53187 0.43752 8.32385 0.4375 8.0957C0.4375 7.86636 0.632444 7.65796 0.861328 7.6416C3.44144 7.43655 5.46526 5.41223 5.66992 2.8291C5.68823 2.60207 5.89611 2.4084 6.12402 2.4082ZM6.125 4.69824C5.5068 6.24907 4.27802 7.47745 2.72656 8.0957C4.27872 8.71393 5.50601 9.94227 6.12402 11.4932C6.74225 9.94227 7.97113 8.71393 9.52246 8.0957C7.9703 7.47747 6.74301 6.24914 6.125 4.69824ZM10.9385 0.875C11.0648 0.875158 11.1728 0.966445 11.1963 1.09277C11.3749 2.06984 12.1518 2.84681 13.1289 3.02539C13.2552 3.04901 13.3467 3.15687 13.3467 3.2832C13.3467 3.40957 13.2552 3.51741 13.1289 3.54102C12.1518 3.7196 11.3749 4.49653 11.1963 5.47363C11.1728 5.6 11.0648 5.69125 10.9385 5.69141C10.812 5.69141 10.7032 5.60007 10.6797 5.47363C10.5015 4.49667 9.72542 3.71971 8.74805 3.54102C8.62158 3.51752 8.52931 3.40962 8.5293 3.2832C8.5293 3.15677 8.62157 3.04888 8.74805 3.02539C9.7254 2.8467 10.5015 2.06971 10.6797 1.09277C10.7032 0.966292 10.812 0.875 10.9385 0.875Z", fill: "#1F1F1F", stroke: "#1F1F1F", strokeWidth: "0.6", strokeLinejoin: "round" })));
129
147
  }
130
148
  else if (comment.createdByType === 'Associate') {
131
149
  return (React.createElement("img", { src: "https://static.redhat.com/libs/redhat/brand-assets/2/corp/logo--hat-only.svg", height: "18", width: "18", "aria-hidden": "true", alt: "Red Hat associate comment", title: "Red Hat associate", style: { verticalAlign: '-0.125em', marginRight: '6px' } }));
@@ -150,47 +168,8 @@ const CaseComments = React.forwardRef((props, ref) => {
150
168
  return React.createElement(Trans, null, "Automated comment");
151
169
  }
152
170
  };
153
- // Tags the Quill RTE legitimately produces — everything else was typed
154
- // literally by the user or injected from an external source (SFDC) and
155
- // should render as visible text, not interpreted as HTML formatting.
156
- const QUILL_TAGS = new Set([
157
- 'p',
158
- 'br',
159
- 'strong',
160
- 'em',
161
- 'u',
162
- 's',
163
- 'ul',
164
- 'ol',
165
- 'li',
166
- 'a',
167
- 'img',
168
- 'h1',
169
- 'h2',
170
- 'h3',
171
- 'h4',
172
- 'h5',
173
- 'h6',
174
- 'span',
175
- 'pre',
176
- 'blockquote',
177
- 'sub',
178
- 'sup',
179
- ]);
180
- const escapeNonQuillTags = (html) => html.replace(/<(\/?)([\w-]+)([^>]*)>/g, (match, slash, tag, attrs) => QUILL_TAGS.has(tag.toLowerCase()) ? match : `&lt;${slash}${tag}${attrs}&gt;`);
181
- const sanitizeHtml = (html) => {
182
- DOMPurify.addHook('afterSanitizeAttributes', (node) => {
183
- if (node.tagName === 'A') {
184
- node.setAttribute('target', '_blank');
185
- node.setAttribute('rel', 'noopener noreferrer');
186
- }
187
- });
188
- const clean = DOMPurify.sanitize(escapeNonQuillTags(html), { ADD_ATTR: ['target', 'rel'] });
189
- DOMPurify.removeHook('afterSanitizeAttributes');
190
- return clean;
191
- };
192
171
  const commentText = (text) => {
193
- return { __html: sanitizeHtml(text) };
172
+ return { __html: DOMPurify.sanitize(text) };
194
173
  };
195
174
  // Transforms <strong> and <em> tags in HTML string to styled <span> tags to fix incorrect bold/italic rendering in exported PDF
196
175
  function formatMarkdownHtmlForPDF(htmlString) {
@@ -206,6 +185,15 @@ const CaseComments = React.forwardRef((props, ref) => {
206
185
  // Remove <ul> and </ul> tags completely
207
186
  .replace(/<\/?ul>/gi, ''));
208
187
  }
188
+ const commentMarkdown = (markdown) => {
189
+ let htmlString = parseCommentMarkdown(markdown, { showButtonForAttachmentLink: true, disableImagePreview: isExportingPDF },
190
+ // @ts-ignore
191
+ { openLinksInNewTab: true, gfm: true, breaks: true });
192
+ if (isExportingPDF) {
193
+ htmlString = formatMarkdownHtmlForPDF(htmlString);
194
+ }
195
+ return { __html: DOMPurify.sanitize(htmlString) };
196
+ };
209
197
  const onCommentAreaClick = (e) => {
210
198
  let { event } = e.target['dataset'];
211
199
  if (!event) {
@@ -221,13 +209,11 @@ const CaseComments = React.forwardRef((props, ref) => {
221
209
  };
222
210
  const parseCommentHtml = (commentText, contentType) => {
223
211
  let text = commentText;
224
- if (contentType === 'plaintext') {
225
- // Legacy plain-text comments: normalize SFDC HTML line breaks
226
- text = text
227
- .replace(/<br\s*\/?>/gi, '\n')
228
- .replace(/<\/p>/gi, '\n')
229
- .replace(/<p>/gi, '');
230
- text = text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
212
+ if (contentType === EditorMode.PLAIN) {
213
+ text = HTMLEntityChecker(commentText);
214
+ // fix issue something like this <h1>ajhdjaj<d</h1>
215
+ text = htmlEntitiesEncode(text);
216
+ text = encodeAngularBrackets(text);
231
217
  text = linkifyLinks(text);
232
218
  text = linkifyWithCaseIDs(text);
233
219
  text = linkifyBZIDs(text);
@@ -235,21 +221,28 @@ const CaseComments = React.forwardRef((props, ref) => {
235
221
  }
236
222
  return text;
237
223
  };
224
+ /* Purpose of this method is to break the default HTML Entity rendering on the UI when in plaintext mode.
225
+ This is achieved by directly swapping the '&' in any html entity to `&amp` in e.g. &euro swaps to &ampeuro
226
+ so it is rendered -> &euro on the UI instead of '€' */
227
+ //PCM-10968
228
+ const HTMLEntityChecker = (comment) => {
229
+ if (comment.includes('&')) {
230
+ return comment.replace(/&/g, '&amp;');
231
+ }
232
+ else
233
+ return comment;
234
+ };
238
235
  const computeCommentText = (comment) => {
239
- if (isEmpty(comment.commentBody))
240
- return null;
241
- // Legacy plain-text comments still need escaping and linkification
242
- if (comment.contentType === 'plaintext') {
243
- const parseComment = parseCommentHtml(comment.commentBody, comment.contentType);
236
+ const parseComment = parseCommentHtml(comment.commentBody, comment.contentType);
237
+ if (!isEmpty(comment.commentBody) && comment.contentType === EditorMode.MARKDOWN) {
238
+ return (React.createElement("div", { className: "push-top-narrow comment-markdown-text", dangerouslySetInnerHTML: commentMarkdown(comment.commentBody) }));
239
+ }
240
+ else if (!isEmpty(comment.commentBody) && comment.contentType === EditorMode.PLAIN) {
244
241
  return (React.createElement("pre", { className: "push-top-narrow comment-plaintext reset-pre-text", dangerouslySetInnerHTML: commentText(parseComment), style: { fontFamily: isExportingPDF ? 'DejaVu Sans' : '' } }));
245
242
  }
246
- // HTML comments (new rich text or legacy markdown — both stored as HTML)
247
- let htmlString = comment.commentBody;
248
- htmlString = linkifyHtmlTextNodes(htmlString);
249
- if (isExportingPDF) {
250
- htmlString = formatMarkdownHtmlForPDF(htmlString);
243
+ else {
244
+ return (React.createElement("pre", { className: "push-top-narrow comment-plaintext reset-pre-text", dangerouslySetInnerHTML: commentText(parseComment), style: { fontFamily: isExportingPDF ? 'DejaVu Sans' : '' } }));
251
245
  }
252
- return (React.createElement("div", { className: "push-top-narrow comment-richtext", dangerouslySetInnerHTML: { __html: sanitizeHtml(htmlString) }, style: { fontFamily: isExportingPDF ? 'DejaVu Sans' : '' } }));
253
246
  };
254
247
  useEffect(() => {
255
248
  if ((markdownRef === null || markdownRef === void 0 ? void 0 : markdownRef.current) && isExportingPDF) {
@@ -261,28 +254,31 @@ const CaseComments = React.forwardRef((props, ref) => {
261
254
  });
262
255
  }
263
256
  }, [props.comment, isExportingPDF]);
264
- if (!((_a = props.comment) === null || _a === void 0 ? void 0 : _a.isPublic) && !canSeePrivateComments)
257
+ if (!((_b = props.comment) === null || _b === void 0 ? void 0 : _b.isPublic) && !canSeePrivateComments)
265
258
  return React.createElement(React.Fragment, null);
266
- return (React.createElement("article", { ref: ref, id: props.comment.id, "aria-label": `Comment by ${props.comment.lastModifiedById}`, className: `prevent-split ${computePrivateComment(props.comment)} support-comment ${computeDiscussionCardCalss(props.comment)} ${ref ? 'selected-case-comment' : ''}` },
259
+ return (React.createElement("section", { ref: ref, id: props.comment.id, className: `prevent-split ${computePrivateComment(props.comment)} support-comment ${computeDiscussionCardCalss(props.comment)} ${ref ? 'selected-case-comment' : ''}` },
267
260
  React.createElement("header", null,
268
261
  React.createElement("h4", null,
269
262
  computeCommentAuthorIcon(props.comment),
270
- " ",
271
- props.comment.lastModifiedById,
263
+ props.comment.createdBy,
272
264
  props.comment.createdByType === 'Partner' && (React.createElement("span", null,
273
265
  ' ',
274
266
  "(",
275
267
  React.createElement(Trans, null, "Partner"),
276
268
  ")"))),
277
269
  React.createElement("time", null, formatDateTime(props.comment.lastModifiedDate))),
270
+ isAsaComment && (React.createElement(Alert, { className: `asa-comment-alert ${isExportingPDF ? 'hide-in-pdf' : ''}`, isInline: true, variant: "custom", title: t('Always review AI-Generated content prior to use') })),
278
271
  React.createElement("div", { className: "comment-body", onClick: onCommentAreaClick, ref: markdownRef }, computeCommentText(props.comment)),
279
272
  React.createElement("footer", null,
280
273
  React.createElement("span", { className: "comment-note" }, computeCommentFooter(props.comment)),
274
+ canSeeFeedbackButtons && commentFeedbackButtons(props.comment, props.feedback),
281
275
  React.createElement("span", { className: "pull-right pf-v6-l-flex pf-m-align-items-center" },
282
276
  props.showJumpToComment && (React.createElement(DiscussionItemLink, { onClick: onJumpToComment(props.comment.id), discussionType: DiscussionType.COMMENT, itemId: props.comment.id, caseNumber: caseNumber, isCopyLink: false },
283
277
  React.createElement(Trans, null, "Jump to comment"))),
284
- React.createElement("button", { onClick: () => props.onReply(props.comment.lastModifiedById, props.comment.id, props.comment.lastModifiedDate), className: `btn btn-app btn-link case-reply-button ${isExportingPDF ? 'hide-in-pdf' : ''}`, "data-tracking-id": "case-comment-reply", type: "button" },
285
- React.createElement(Trans, null, "Reply")),
286
- React.createElement(JumpAndCopyLink, { caseNumber: caseNumber, cardId: props.comment.id, discussionType: DiscussionType.COMMENT })))));
278
+ isAsaComment ? (React.createElement(Button, { variant: ButtonVariant.link, isInline: true, className: `asa-send-feedback-link ${isExportingPDF ? 'hide-in-pdf' : ''}`, onClick: openAsaFeedbackModal, "data-tracking-id": "case-asa-comment-send-feedback-footer" },
279
+ React.createElement(Trans, null, "Send feedback"))) : (React.createElement("button", { onClick: commentReply(props.comment), className: `btn btn-app btn-link case-reply-button ${isExportingPDF ? 'hide-in-pdf' : ''}`, "data-tracking-id": "case-comment-reply", type: "button" },
280
+ React.createElement(Trans, null, "Reply"))),
281
+ React.createElement(JumpAndCopyLink, { caseNumber: caseNumber, cardId: props.comment.id, discussionType: DiscussionType.COMMENT }))),
282
+ isAsaComment && (React.createElement(AsaCommentFeedbackModal, { isOpen: isAsaFeedbackModalOpen, isSubmitting: isFeedbackUpdating, initialFeedback: savedFeedbackValue, initialFeedbackReason: savedFeedbackReason, onClose: () => setIsAsaFeedbackModalOpen(false), onSubmit: onSubmitAsaFeedback }))));
287
283
  });
288
284
  export default CaseComments;
@@ -1,20 +1,12 @@
1
- import { ICaseComment } from '@cee-eng/hydrajs/@types/api/public/case';
1
+ import { ICaseChat, ICaseComment } from '@cee-eng/hydrajs/@types/api/public/case';
2
2
  import React from 'react';
3
3
  interface IProps {
4
4
  caseNumber: string;
5
5
  caseComments: ICaseComment[];
6
- commentsLoading?: boolean;
7
- commentsError?: unknown;
6
+ caseChats: ICaseChat[];
8
7
  accountNumber: string;
9
8
  tabRef: React.MutableRefObject<HTMLDivElement>;
10
9
  isDiscussionTab: boolean;
11
- refetchComments: () => Promise<unknown> | void;
12
- fetchMore?: () => Promise<unknown> | void;
13
- hasNextPage?: boolean;
14
- isLoadingMore?: boolean;
15
- loadMoreError?: boolean;
16
- loadMoreRetryCount?: number;
17
- retryLoadMore?: () => Promise<unknown> | void;
18
10
  }
19
11
  export default function CaseDiscussion(props: IProps): React.JSX.Element;
20
12
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"CaseDiscussion.d.ts","sourceRoot":"","sources":["../../../../../../src/components/CaseEditView/Tabs/CaseDiscussion/CaseDiscussion.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAoBvE,OAAO,KAA6E,MAAM,OAAO,CAAC;AAwClG,UAAU,MAAM;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAC/C,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CACjD;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,KAAK,EAAE,MAAM,qBAyzBnD"}
1
+ {"version":3,"file":"CaseDiscussion.d.ts","sourceRoot":"","sources":["../../../../../../src/components/CaseEditView/Tabs/CaseDiscussion/CaseDiscussion.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,YAAY,EAA0B,MAAM,yCAAyC,CAAC;AAkB1G,OAAO,KAAoE,MAAM,OAAO,CAAC;AAyCzF,UAAU,MAAM;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAC/C,eAAe,EAAE,OAAO,CAAC;CAC5B;AAOD,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,KAAK,EAAE,MAAM,qBAsqBnD"}