@rh-support/troubleshoot 2.6.312 → 2.6.313

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 (38) hide show
  1. package/lib/esm/components/CaseEditView/ActiveCustomerEscalation/RequestEscalationModal.js +2 -2
  2. package/lib/esm/components/CaseEditView/CaseOverview/index.d.ts.map +1 -1
  3. package/lib/esm/components/CaseEditView/CaseOverview/index.js +2 -2
  4. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseDetailsManagement.d.ts.map +1 -1
  5. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseDetailsManagement.js +2 -2
  6. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/ProductVersion.d.ts.map +1 -1
  7. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/ProductVersion.js +30 -7
  8. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseAttachment.d.ts.map +1 -1
  9. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseAttachment.js +17 -20
  10. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CommentSearch.d.ts.map +1 -1
  11. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CommentSearch.js +7 -1
  12. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment.d.ts.map +1 -1
  13. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment.js +7 -8
  14. package/lib/esm/components/CaseInformation/CaseInformation.d.ts.map +1 -1
  15. package/lib/esm/components/CaseInformation/CaseInformation.js +3 -4
  16. package/lib/esm/components/CaseInformation/FileDiag.d.ts.map +1 -1
  17. package/lib/esm/components/CaseInformation/FileDiag.js +0 -4
  18. package/lib/esm/components/IdeaInformation/IdeaInformation.d.ts.map +1 -1
  19. package/lib/esm/components/IdeaInformation/IdeaInformation.js +3 -4
  20. package/lib/esm/components/shared/fileUpload/FileUpload.js +2 -3
  21. package/lib/esm/components/shared/fileUpload/reducer/AttachmentHelper.d.ts +1 -0
  22. package/lib/esm/components/shared/fileUpload/reducer/AttachmentHelper.d.ts.map +1 -1
  23. package/lib/esm/components/shared/fileUpload/reducer/AttachmentHelper.js +16 -8
  24. package/lib/esm/components/shared/fileUpload/useFileUploader.d.ts.map +1 -1
  25. package/lib/esm/components/shared/fileUpload/useFileUploader.js +26 -8
  26. package/lib/esm/components/shared/useIsSectionValid.d.ts.map +1 -1
  27. package/lib/esm/components/shared/useIsSectionValid.js +21 -42
  28. package/lib/esm/components/wizardLayout/GlobalTroubleshootEffects.d.ts.map +1 -1
  29. package/lib/esm/components/wizardLayout/GlobalTroubleshootEffects.js +1 -3
  30. package/lib/esm/components/wizardLayout/WizardAside.d.ts.map +1 -1
  31. package/lib/esm/components/wizardLayout/WizardAside.js +2 -4
  32. package/lib/esm/components/wizardLayout/WizardLayout.d.ts.map +1 -1
  33. package/lib/esm/components/wizardLayout/WizardLayout.js +1 -4
  34. package/lib/esm/css/case.css +6 -0
  35. package/lib/esm/reducers/CaseReducer.d.ts +3 -1
  36. package/lib/esm/reducers/CaseReducer.d.ts.map +1 -1
  37. package/lib/esm/reducers/CaseReducer.js +30 -37
  38. package/package.json +6 -6
@@ -98,9 +98,9 @@ export function RequestEscalationModal(props) {
98
98
  caseInput: {
99
99
  Subject: formState.subject,
100
100
  Description: formState.description,
101
- Status: 'New',
101
+ Status: 'In Progress',
102
102
  Origin: 'Portal ACE',
103
- Priority: props.severity ? `P${props.severity.charAt(0)}` : 'Medium',
103
+ Priority: props.severity || '3 (Medium)',
104
104
  Type: 'RME',
105
105
  RecordTypeId: '012Ek00000JUtx5IAD',
106
106
  ParentId: caseSalesforceId,
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/CaseEditView/CaseOverview/index.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAkD,MAAM,OAAO,CAAC;AA2BvE,UAAU,MAAM;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;CACnD;AAED,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,KAAK,EAAE,MAAM,qBAihBjD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/CaseEditView/CaseOverview/index.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAkD,MAAM,OAAO,CAAC;AA4BvE,UAAU,MAAM;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;CACnD;AAED,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,KAAK,EAAE,MAAM,qBAkhBjD"}
@@ -30,7 +30,8 @@ import { usePostComment } from '../../shared/usePostComment';
30
30
  import { ReopenCaseModal } from '../ConfirmationModals/ReopenCaseModal';
31
31
  import { PDFContext } from '../PDFContainer';
32
32
  import { CaseInformation } from '../Tabs/CaseDetails/CaseInformation';
33
- import { CaseContactPhoneNumberAlert } from '../Tabs/CaseDetails/CasePhoneNumberConfirmAlert';
33
+ // TODO: Re-enable once phone number verification flow is fully supported with GraphQL
34
+ // import { CaseContactPhoneNumberAlert } from '../Tabs/CaseDetails/CasePhoneNumberConfirmAlert';
34
35
  import Summary from '../Tabs/CaseDetails/Summary';
35
36
  import CaseOwnerInfo from './CaseOwnerInfo';
36
37
  import CaseStatus from './CaseStatus';
@@ -254,7 +255,6 @@ export default function CaseOverview(props) {
254
255
  React.createElement(Trans, null, "Case inactivity warning")),
255
256
  React.createElement("p", { className: "pf-v6-u-mb-sm" },
256
257
  React.createElement(Trans, null, "The customer has received two warnings regarding inactivity. This case will be closed soon if we don't receive any input."))) })))),
257
- React.createElement(CaseContactPhoneNumberAlert, { isReview: true, tabRef: props.tabsRef }),
258
258
  React.createElement("header", { className: "pf-v6-u-mb-sm pf-v6-u-mt-lg" },
259
259
  React.createElement("h2", { className: "case-ID" },
260
260
  React.createElement(Trans, null, "Case"),
@@ -1 +1 @@
1
- {"version":3,"file":"CaseDetailsManagement.d.ts","sourceRoot":"","sources":["../../../../../../src/components/CaseEditView/Tabs/CaseDetails/CaseDetailsManagement.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG5D,OAAO,KAA+B,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAmBvD,UAAU,MAAO,SAAQ,gBAAgB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,mBAAmB,CAAC;IAChC,MAAM,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;CAClD;AAED,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,KAAK,EAAE,MAAM,qBA0E1D"}
1
+ {"version":3,"file":"CaseDetailsManagement.d.ts","sourceRoot":"","sources":["../../../../../../src/components/CaseEditView/Tabs/CaseDetails/CaseDetailsManagement.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG5D,OAAO,KAA+B,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAoBvD,UAAU,MAAO,SAAQ,gBAAgB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,mBAAmB,CAAC;IAChC,MAAM,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;CAClD;AAED,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,KAAK,EAAE,MAAM,qBA2E1D"}
@@ -14,7 +14,8 @@ import { PartnerCaseHelper } from '../../ShareCase/PartnerCaseHelper';
14
14
  import { ShareWithPartner } from '../../ShareCase/PartnerShare';
15
15
  import { CaseContactPhoneNumber } from './CaseContactPhoneNumber';
16
16
  import CaseInternalStatus from './CaseInternalStatus';
17
- import { CaseContactPhoneNumberAlert } from './CasePhoneNumberConfirmAlert';
17
+ // TODO: Re-enable once phone number verification flow is fully supported with GraphQL
18
+ // import { CaseContactPhoneNumberAlert } from './CasePhoneNumberConfirmAlert';
18
19
  import CaseReferenceNumber from './CaseReferenceNumber';
19
20
  import CaseSbrGroups from './CaseSbrGroups';
20
21
  import SFDCUrl from './SFDCUrl';
@@ -43,7 +44,6 @@ export default function CaseDetailsManagement(props) {
43
44
  React.createElement(OwnerSelector, null)),
44
45
  React.createElement(FlexItem, { flex: { default: 'flex_1' } },
45
46
  React.createElement(CaseContactPhoneNumber, null))),
46
- React.createElement(CaseContactPhoneNumberAlert, { isConfirm: true }),
47
47
  canSeeInternalStatus && React.createElement(CaseInternalStatus, null),
48
48
  canSeeSBRGroups && React.createElement(CaseSbrGroups, null),
49
49
  React.createElement(Flex, { direction: { default: 'column', lg: 'row' } },
@@ -1 +1 @@
1
- {"version":3,"file":"ProductVersion.d.ts","sourceRoot":"","sources":["../../../../../../src/components/CaseEditView/Tabs/CaseDetails/ProductVersion.tsx"],"names":[],"mappings":"AAoCA,OAAO,KAAkD,MAAM,OAAO,CAAC;AASvE,UAAU,MAAM;IACZ,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,iBAAS,eAAe,CAAC,KAAK,EAAE,MAAM,qBAuUrC;AAED,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"ProductVersion.d.ts","sourceRoot":"","sources":["../../../../../../src/components/CaseEditView/Tabs/CaseDetails/ProductVersion.tsx"],"names":[],"mappings":"AA0CA,OAAO,KAAkD,MAAM,OAAO,CAAC;AASvE,UAAU,MAAM;IACZ,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,iBAAS,eAAe,CAAC,KAAK,EAAE,MAAM,qBAkXrC;AAED,eAAe,eAAe,CAAC"}
@@ -12,7 +12,7 @@ import { Alert, AlertVariant, Button, MenuToggle, Select, SelectList, SelectOpti
12
12
  import TimesIcon from '@patternfly/react-icons/dist/js/icons/times-icon';
13
13
  import { AlertMessage, AlertType, SingleSelectDropdown, ToastNotification, useSelectKeyboardNavigator, } from '@rh-support/components';
14
14
  import { fetchProducts, GlobalMetadataDispatchContext, GlobalMetadataStateContext, useCanEditCase, } from '@rh-support/react-context';
15
- import { haventLoadedMetadata, toOption } from '@rh-support/utils';
15
+ import { haventLoadedMetadata, resolveProductServiceLevelsForAccount, toOption, } from '@rh-support/utils';
16
16
  import isEmpty from 'lodash/isEmpty';
17
17
  import isEqual from 'lodash/isEqual';
18
18
  import isUndefined from 'lodash/isUndefined';
@@ -21,7 +21,7 @@ import React, { useContext, useEffect, useRef, useState } from 'react';
21
21
  import { Trans, useTranslation } from 'react-i18next';
22
22
  import { useCaseDispatch, useCaseSelector } from '../../../../context/CaseContext';
23
23
  import { useCaseUpdateErrorMessage } from '../../../../hooks/useCaseUpdateErrorMessage';
24
- import { getVersionsDetails, updateCaseDetailsGraphQL } from '../../../../reducers/CaseReducer';
24
+ import { getVersionsDetails, setCaseState, updateCaseDetailsGraphQL } from '../../../../reducers/CaseReducer';
25
25
  import { getProductObj } from '../../../shared/utils';
26
26
  import { PDFContext } from '../../PDFContainer';
27
27
  function ProductNVersion(props) {
@@ -32,13 +32,14 @@ function ProductNVersion(props) {
32
32
  const [isVersionUpdating, setIsVersionUpdating] = useState(false);
33
33
  const [isOpen, setIsOpen] = useState(false);
34
34
  const textInputRef = useRef();
35
- const { product, version, caseNumber, existingCaseDetails, versionsDetails, isCaseUpdating } = useCaseSelector((state) => ({
35
+ const { product, version, caseNumber, existingCaseDetails, versionsDetails, isCaseUpdating, selectedAccountDetails, } = useCaseSelector((state) => ({
36
36
  product: state.caseDetails.product,
37
37
  version: state.caseDetails.version,
38
38
  caseNumber: state.caseDetails.caseNumber,
39
39
  existingCaseDetails: state.caseDetails,
40
40
  versionsDetails: state.versionsDetails,
41
41
  isCaseUpdating: state.isCaseUpdating,
42
+ selectedAccountDetails: state.selectedAccountDetails,
42
43
  }), isEqual);
43
44
  const caseDispatch = useCaseDispatch();
44
45
  const dispatchToGlobalMetadataReducer = useContext(GlobalMetadataDispatchContext);
@@ -105,6 +106,7 @@ function ProductNVersion(props) {
105
106
  }
106
107
  };
107
108
  const updateProductVerstion = (selectedProduct, selectedVersion) => __awaiter(this, void 0, void 0, function* () {
109
+ var _a, _b;
108
110
  let onlyVersionChanged = false;
109
111
  try {
110
112
  if (product === selectedProduct) {
@@ -112,10 +114,31 @@ function ProductNVersion(props) {
112
114
  }
113
115
  setIsProductUpdating(true);
114
116
  setIsVersionUpdating(true);
115
- yield updateCaseDetailsGraphQL(caseDispatch, apolloClient, caseNumber, {
116
- product: selectedProduct,
117
- version: selectedVersion,
118
- }, false, { existingCaseDetails });
117
+ const selectedVersionId = (_b = (_a = versionsDetails.data) === null || _a === void 0 ? void 0 : _a.find((v) => v.name === selectedVersion)) === null || _b === void 0 ? void 0 : _b.id;
118
+ const serviceLevels = !onlyVersionChanged
119
+ ? resolveProductServiceLevelsForAccount(selectedAccountDetails.data, allProducts.data.productsResult, selectedProduct)
120
+ : undefined;
121
+ yield updateCaseDetailsGraphQL(caseDispatch, apolloClient, caseNumber, Object.assign(Object.assign(Object.assign({ product: selectedProduct, version: selectedVersion }, (selectedVersionId ? { productId: selectedVersionId } : {})), (!onlyVersionChanged && (serviceLevels === null || serviceLevels === void 0 ? void 0 : serviceLevels.defaultEntitlementId)
122
+ ? { entitlementId: serviceLevels.defaultEntitlementId }
123
+ : {})), (!onlyVersionChanged && (serviceLevels === null || serviceLevels === void 0 ? void 0 : serviceLevels.entitlementSla)
124
+ ? { entitlementSla: serviceLevels.entitlementSla }
125
+ : {})), false, { existingCaseDetails });
126
+ if (!onlyVersionChanged && (serviceLevels === null || serviceLevels === void 0 ? void 0 : serviceLevels.productServiceLevel)) {
127
+ setCaseState(caseDispatch, {
128
+ isProductNotEntitled: false,
129
+ productServiceLevel: serviceLevels.productServiceLevel,
130
+ otherServiceLevels: serviceLevels.otherServiceLevels,
131
+ selectedEntitlementId: serviceLevels.defaultEntitlementId,
132
+ });
133
+ }
134
+ else if (!onlyVersionChanged) {
135
+ setCaseState(caseDispatch, {
136
+ isProductNotEntitled: true,
137
+ productServiceLevel: undefined,
138
+ otherServiceLevels: [],
139
+ selectedEntitlementId: undefined,
140
+ });
141
+ }
119
142
  setIsProductUpdating(false);
120
143
  setIsVersionUpdating(false);
121
144
  if (onlyVersionChanged) {
@@ -1 +1 @@
1
- {"version":3,"file":"CaseAttachment.d.ts","sourceRoot":"","sources":["../../../../../../src/components/CaseEditView/Tabs/CaseDiscussion/CaseAttachment.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AAsBxE,OAAO,KAAuC,MAAM,OAAO,CAAC;AAS5D,UAAU,MAAM;IACZ,UAAU,EAAE,WAAW,CAAC;IACxB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,KAAK,IAAI,CAAC;IACzE,eAAe,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,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,cAAc,4EA8RlB,CAAC;AAEH,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"CaseAttachment.d.ts","sourceRoot":"","sources":["../../../../../../src/components/CaseEditView/Tabs/CaseDiscussion/CaseAttachment.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AAsBxE,OAAO,KAAuC,MAAM,OAAO,CAAC;AAS5D,UAAU,MAAM;IACZ,UAAU,EAAE,WAAW,CAAC;IACxB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,KAAK,IAAI,CAAC;IACzE,eAAe,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,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,cAAc,4EAkSlB,CAAC;AAEH,eAAe,cAAc,CAAC"}
@@ -106,15 +106,23 @@ const CaseAttachment = React.forwardRef((props, ref) => {
106
106
  name: fileName,
107
107
  });
108
108
  };
109
+ // Prefer size (bytes); fall back to sizeKB when GraphQL only populated the KB field.
110
+ const attachmentSizeBytes = props.attachment.size > 0
111
+ ? props.attachment.size
112
+ : props.attachment.sizeKB > 0
113
+ ? props.attachment.sizeKB * 1024
114
+ : 0;
115
+ const attachmentSizeLabel = attachmentSizeBytes > 0 ? humanizeSize(attachmentSizeBytes) : '';
116
+ const attachmentLinkLabel = attachmentSizeLabel
117
+ ? `${props.attachment.fileName} (${attachmentSizeLabel})`
118
+ : props.attachment.fileName;
109
119
  const renderAttachmentLink = () => {
110
120
  // TODO: Re-enable secure support download gating when needed again
111
121
  // if (!loggedInUsersAccount.data.secureSupport) {
112
122
  // if (isExportingPDF) {
113
123
  // return (
114
124
  // <a href={props.attachment.link}>
115
- // <span>
116
- // {props.attachment.fileName} ({humanizeSize(props.attachment.size)})
117
- // </span>
125
+ // <span>{attachmentLinkLabel}</span>
118
126
  // </a>
119
127
  // );
120
128
  // }
@@ -123,12 +131,11 @@ const CaseAttachment = React.forwardRef((props, ref) => {
123
131
  // className="attachment-download-btn"
124
132
  // title={t('Download {{fileName}}', { fileName: props.attachment.fileName })}
125
133
  // variant={ButtonVariant.link}
134
+ // isInline
126
135
  // onClick={onAttachmentDownloadClick}
127
136
  // data-tracking-id="attachment-download-button"
128
137
  // >
129
- // <span>
130
- // {props.attachment.fileName} ({humanizeSize(props.attachment.size)})
131
- // </span>
138
+ // <span>{attachmentLinkLabel}</span>
132
139
  // </Button>
133
140
  // );
134
141
  // }
@@ -137,25 +144,15 @@ const CaseAttachment = React.forwardRef((props, ref) => {
137
144
  // position={TooltipPosition.top}
138
145
  // content={t(`You don't have appropriate permissions to download the attachment`)}
139
146
  // >
140
- // <strong>
141
- // {props.attachment.fileName} ({humanizeSize(props.attachment.size)})
142
- // </strong>
147
+ // <strong>{attachmentLinkLabel}</strong>
143
148
  // </Tooltip>
144
149
  // );
145
150
  if (isExportingPDF) {
146
151
  return (React.createElement("a", { href: props.attachment.link },
147
- React.createElement("span", null,
148
- props.attachment.fileName,
149
- " (",
150
- humanizeSize(props.attachment.size),
151
- ")")));
152
+ React.createElement("span", null, attachmentLinkLabel)));
152
153
  }
153
- 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" },
154
- React.createElement("span", null,
155
- props.attachment.fileName,
156
- " (",
157
- humanizeSize(props.attachment.size),
158
- ")")));
154
+ 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" },
155
+ React.createElement("span", null, attachmentLinkLabel)));
159
156
  };
160
157
  const onJumpToComment = (attachmentId) => () => props.showJumpToComment && props.onJumpToComment && props.onJumpToComment(attachmentId);
161
158
  if (((_a = props.attachment) === null || _a === void 0 ? void 0 : _a.isPrivate) && !canSeePrivateAttachments)
@@ -1 +1 @@
1
- {"version":3,"file":"CommentSearch.d.ts","sourceRoot":"","sources":["../../../../../../src/components/CaseEditView/Tabs/CaseDiscussion/CommentSearch.tsx"],"names":[],"mappings":"AASA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,OAAO,EAAkB,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAE5F,UAAU,MAAM;IACZ,eAAe,EAAE,WAAW,EAAE,CAAC;IAC/B,eAAe,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACxE,sBAAsB,EAAE,OAAO,CAAC;CACnC;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,qBAsG1C"}
1
+ {"version":3,"file":"CommentSearch.d.ts","sourceRoot":"","sources":["../../../../../../src/components/CaseEditView/Tabs/CaseDiscussion/CommentSearch.tsx"],"names":[],"mappings":"AASA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,OAAO,EAAkB,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAE5F,UAAU,MAAM;IACZ,eAAe,EAAE,WAAW,EAAE,CAAC;IAC/B,eAAe,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACxE,sBAAsB,EAAE,OAAO,CAAC;CACnC;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,qBA6G1C"}
@@ -46,7 +46,13 @@ export function CommentSearch(props) {
46
46
  }
47
47
  else if (discussion.discussionType === DiscussionType.ATTACHMENT) {
48
48
  const caseAttachment = discussion.item;
49
- const caseAttachmentText = `delete ${caseAttachment.modifiedBy} ${caseAttachment.description || ''} ${caseAttachment.lastModifiedDate} ${caseAttachment.checksum || ''} Attached file ${caseAttachment.fileName} ${humanizeSize(caseAttachment.size)} to this case.`;
49
+ const attachmentSizeBytes = caseAttachment.size > 0
50
+ ? caseAttachment.size
51
+ : caseAttachment.sizeKB > 0
52
+ ? caseAttachment.sizeKB * 1024
53
+ : 0;
54
+ const attachmentSizeText = attachmentSizeBytes > 0 ? humanizeSize(attachmentSizeBytes) : '';
55
+ const caseAttachmentText = `delete ${caseAttachment.modifiedBy} ${caseAttachment.description || ''} ${caseAttachment.lastModifiedDate} ${caseAttachment.checksum || ''} Attached file ${caseAttachment.fileName}${attachmentSizeText ? ` ${attachmentSizeText}` : ''} to this case.`;
50
56
  searchApi.indexDocument(discussion.item.id, caseAttachmentText || '');
51
57
  }
52
58
  else if (discussion.discussionType === DiscussionType.CHAT) {
@@ -1 +1 @@
1
- {"version":3,"file":"PostComment.d.ts","sourceRoot":"","sources":["../../../../../../src/components/CaseEditView/Tabs/CaseDiscussion/PostComment.tsx"],"names":[],"mappings":"AAaA,OAAO,KAA+D,MAAM,OAAO,CAAC;AAMpF,OAAO,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAmB5E,UAAU,MAAM;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B;;;;;OAKG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,WAAW,EAAE,CAAC;CACjC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,qBAscxC"}
1
+ {"version":3,"file":"PostComment.d.ts","sourceRoot":"","sources":["../../../../../../src/components/CaseEditView/Tabs/CaseDiscussion/PostComment.tsx"],"names":[],"mappings":"AAOA,OAAO,KAA+D,MAAM,OAAO,CAAC;AAMpF,OAAO,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAmB5E,UAAU,MAAM;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B;;;;;OAKG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,WAAW,EAAE,CAAC;CACjC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,qBA+bxC"}
@@ -11,7 +11,7 @@ import { Alert, AlertVariant, Button, ButtonVariant, Checkbox } from '@patternfl
11
11
  import PlusIcon from '@patternfly/react-icons/dist/js/icons/plus-icon';
12
12
  import { EditorMode, LoadingIndicator, MarkdownEditor, ToastNotification, usePrevious } from '@rh-support/components';
13
13
  import { GlobalMetadataStateContext, useCanEditCase, useUserPreferences } from '@rh-support/react-context';
14
- import { ability, CaseDiscussionFields, CaseListFields, resourceActions, resources, } from '@rh-support/user-permissions';
14
+ import { ability, CaseDiscussionFields, resourceActions, resources } from '@rh-support/user-permissions';
15
15
  import isEmpty from 'lodash/isEmpty';
16
16
  import isEqual from 'lodash/isEqual';
17
17
  import React, { useCallback, useContext, useEffect, useRef, useState } from 'react';
@@ -33,7 +33,6 @@ export function PostComment(props) {
33
33
  const { t } = useTranslation();
34
34
  let { caseNumber } = props;
35
35
  const [isTextAreaFocused, setIsTextAreaFocused] = useState(false);
36
- const canAddAttachments = ability.can(resourceActions.PATCH, resources.CASE_CREATE, CaseListFields.ATTACHMENTS);
37
36
  const canPostPrivateComments = ability.can(resourceActions.PATCH, resources.CASE_COMMENTS, CaseDiscussionFields.POST_PRIVATE_COMMENT);
38
37
  const { createComment, loading: isPostingComment } = useCreateCaseComment();
39
38
  const dispatchToAttachmentReducer = useContext(AttachmentDispatchContext);
@@ -311,15 +310,15 @@ export function PostComment(props) {
311
310
  isModalOpen && loggedInUserRights.data.isInternal() && isPublic && (React.createElement(VerifyCaseStatusModal, { onClose: onCancel, onConfirm: onConfirm, isUpdating: isPostingComment, caseNumber: props.caseNumber })),
312
311
  React.createElement(Button, { "data-tracking-id": "postcomment-submit-button", type: "button", variant: ButtonVariant.primary, onClick: loggedInUser.data.isInternal && isPublic ? onBtnClick : isNotInternalConfirm, isDisabled: isSubmitDisabled, className: "postcomment-submit" },
313
312
  React.createElement(Trans, null, "Submit")),
314
- !isCommentEmpty && (React.createElement(Button, { className: "secondary-button-pill", "data-tracking-id": "postcomment-cancel-button", type: "button", variant: ButtonVariant.link, onClick: onCancelClick, isDisabled: isProcessing },
315
- React.createElement(Trans, null, "Cancel"))),
316
- canAddAttachments && (React.createElement(FileSelectorButton, { isSessionId: false, isDisabled: isFileUploadDisabled, buttonLabel: React.createElement(React.Fragment, null,
313
+ React.createElement(FileSelectorButton, { isSessionId: false, isDisabled: isFileUploadDisabled, buttonLabel: React.createElement(React.Fragment, null,
317
314
  React.createElement(PlusIcon, null),
318
315
  " ",
319
- React.createElement(Trans, null, "Attach a file")) })),
316
+ React.createElement(Trans, null, "Attach files")) }),
317
+ React.createElement(Button, { className: "secondary-button-pill", "data-tracking-id": "postcomment-cancel-button", type: "button", variant: ButtonVariant.link, onClick: onCancelClick, isDisabled: isCommentEmpty || isProcessing },
318
+ React.createElement(Trans, null, "Cancel")),
320
319
  canPostPrivateComments && (React.createElement("span", { className: "post-comment-checkbox" },
321
320
  React.createElement(Checkbox, { label: t('Private'), isChecked: !isPublic && canPostPrivateComments, onChange: handleCheckboxToggle, "aria-label": t('Private'), id: "private-comment", name: "private-comment", "data-tracking-id": "private-comment-checkbox" }))))),
322
- canAddAttachments && (React.createElement("div", Object.assign({}, getRootProps(), { className: "post-comment-dropzone" }),
321
+ React.createElement("div", Object.assign({}, getRootProps(), { className: "post-comment-dropzone" }),
323
322
  React.createElement("input", Object.assign({}, getInputProps())),
324
- React.createElement(FileUpload, { className: `file-upload-section ${hasSomeSelectedFilesLocal ? 'card card-white pf-v6-u-mt-lg pf-v6-u-p-lg' : ''}`, idToUploadTo: caseNumber, caseSalesforceId: caseSalesforceId, onUploadClick: onFileUploadClick, onCaseFileUploaded: onCaseFileUploaded, isSessionId: false, needsAnalyzing: false, autoUploadOnSelect: true, isPrivate: !isPublic, showDescriptionInfoMsg: true })))));
323
+ React.createElement(FileUpload, { className: `file-upload-section ${hasSomeSelectedFilesLocal ? 'card card-white pf-v6-u-mt-lg pf-v6-u-p-lg' : ''}`, idToUploadTo: caseNumber, caseSalesforceId: caseSalesforceId, onUploadClick: onFileUploadClick, onCaseFileUploaded: onCaseFileUploaded, isSessionId: false, needsAnalyzing: false, autoUploadOnSelect: true, isPrivate: !isPublic, showDescriptionInfoMsg: true }))));
325
324
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CaseInformation.d.ts","sourceRoot":"","sources":["../../../../src/components/CaseInformation/CaseInformation.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAErD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAQvD,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC;CACnC;AAED,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,KAAK,EAAE,MAAM,qBAoHpD"}
1
+ {"version":3,"file":"CaseInformation.d.ts","sourceRoot":"","sources":["../../../../src/components/CaseInformation/CaseInformation.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAErD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAQvD,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC;CACnC;AAED,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,KAAK,EAAE,MAAM,qBAmHpD"}
@@ -16,11 +16,10 @@ export default function CaseInformation(props) {
16
16
  const { globalMetadataState: { allCaseTypes, allCaseSeverities, caseLanguages, loggedInUser, loggedInUserJwtToken, loggedInUsersAccount, loggedInUserRights, }, } = useContext(GlobalMetadataStateContext);
17
17
  const dispatchToGlobalMetadataReducer = useContext(GlobalMetadataDispatchContext);
18
18
  const apolloClient = useApolloClient();
19
- const { contactSSOName, selectedAccountDetails, ownersCaseGroups, hasInvalidEntitlements } = useCaseSelector((state) => ({
19
+ const { contactSSOName, selectedAccountDetails, ownersCaseGroups } = useCaseSelector((state) => ({
20
20
  contactSSOName: state.caseDetails.contactSSOName,
21
21
  ownersCaseGroups: state.ownersCaseGroups,
22
22
  selectedAccountDetails: state.selectedAccountDetails,
23
- hasInvalidEntitlements: false, // TODO: remove this once we have a proper entitlement check
24
23
  }), isEqual);
25
24
  const isMetadataLoading = () => {
26
25
  return !isMetadataLoadingError() && (loggedInUser.isFetching || selectedAccountDetails.isFetching);
@@ -69,13 +68,13 @@ export default function CaseInformation(props) {
69
68
  ' ',
70
69
  React.createElement("a", { href: "/support/contact/customerService" }, "Customer Service"),
71
70
  " for assistance.")),
72
- React.createElement(AlertMessage, { show: hasInvalidEntitlements, variant: AlertType.DANGER, className: "pf-v6-u-mt-lg", isInline: true },
71
+ React.createElement(AlertMessage, { show: !loggedInUserRights.data.isEntitled(), variant: AlertType.DANGER, className: "pf-v6-u-mt-lg", isInline: true },
73
72
  React.createElement(Trans, { i18nKey: "i18ValidEntitlementContactCustomerService" },
74
73
  "You need a valid entitlement to create a case.\u00A0 Please contact",
75
74
  ' ',
76
75
  React.createElement("a", { href: "/support/contact/customerService" }, "Customer Service"),
77
76
  " for assistance.")),
78
- !hasInvalidEntitlements &&
77
+ loggedInUserRights.data.isEntitled() &&
79
78
  !isMetadataLoading() &&
80
79
  !isMetadataLoadingError() &&
81
80
  loggedInUserRights.data.canManageCases() && (React.createElement(React.Fragment, null,
@@ -1 +1 @@
1
- {"version":3,"file":"FileDiag.d.ts","sourceRoot":"","sources":["../../../../src/components/CaseInformation/FileDiag.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAQ/D,UAAU,MAAM;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,qBAuCrC"}
1
+ {"version":3,"file":"FileDiag.d.ts","sourceRoot":"","sources":["../../../../src/components/CaseInformation/FileDiag.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAQ/D,UAAU,MAAM;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,qBAqCrC"}
@@ -1,6 +1,5 @@
1
1
  // TODO: Re-enable when Hydra/GraphQL attachment APIs support secure support again
2
2
  // import { GlobalMetadataStateContext } from '@rh-support/react-context';
3
- import { ability, CaseListFields, resourceActions, resources } from '@rh-support/user-permissions';
4
3
  import { PreviousCaseTypes } from '@rh-support/utils';
5
4
  import isEqual from 'lodash/isEqual';
6
5
  import React, { useContext, useEffect, useState } from 'react';
@@ -11,7 +10,6 @@ import FileEARule, { getValidAttachmentRules } from '../ImproveCase/FileEARule';
11
10
  import { WidgetFileUploader } from '../shared/fileUpload/WidgetFileUploader';
12
11
  export function FileDiag(props) {
13
12
  const { sessionRestore: { activeSessionId }, } = useContext(SessionRestoreStateContext);
14
- const canAddAttachments = ability.can(resourceActions.PATCH, resources.CASE_CREATE, CaseListFields.ATTACHMENTS);
15
13
  // TODO: Re-enable when Hydra/GraphQL attachment APIs support secure support again
16
14
  // const {
17
15
  // globalMetadataState: { loggedInUsersAccount },
@@ -24,8 +22,6 @@ export function FileDiag(props) {
24
22
  useEffect(() => {
25
23
  setIsIdea(caseType === PreviousCaseTypes.FEATURE_ENHANCEMENT);
26
24
  }, [caseType]);
27
- if (!canAddAttachments)
28
- return null;
29
25
  return (React.createElement(WidgetFileUploader, { className: props.className, idToUploadTo: activeSessionId, isPrivate: false, needsAnalyzing: isIdea ? false : true, isSessionId: true,
30
26
  // isSecureSupport={loggedInUsersAccount.data.secureSupport!}
31
27
  // autoUploadOnSelect={loggedInUsersAccount.data.secureSupport ? false : true}
@@ -1 +1 @@
1
- {"version":3,"file":"IdeaInformation.d.ts","sourceRoot":"","sources":["../../../../src/components/IdeaInformation/IdeaInformation.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAkBrD,MAAM,CAAC,OAAO,UAAU,eAAe,sBAqJtC"}
1
+ {"version":3,"file":"IdeaInformation.d.ts","sourceRoot":"","sources":["../../../../src/components/IdeaInformation/IdeaInformation.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAkBrD,MAAM,CAAC,OAAO,UAAU,eAAe,sBAoJtC"}
@@ -26,11 +26,10 @@ export default function IdeaInformation() {
26
26
  const { globalMetadataState: { allCaseTypes, allCaseSeverities, caseLanguages, loggedInUser, loggedInUserJwtToken, loggedInUsersAccount, loggedInUserRights, }, } = useContext(GlobalMetadataStateContext);
27
27
  const dispatchToGlobalMetadataReducer = useContext(GlobalMetadataDispatchContext);
28
28
  const apolloClient = useApolloClient();
29
- const { contactSSOName, selectedAccountDetails, ownersCaseGroups, hasInvalidEntitlements } = useCaseSelector((state) => ({
29
+ const { contactSSOName, selectedAccountDetails, ownersCaseGroups } = useCaseSelector((state) => ({
30
30
  contactSSOName: state.caseDetails.contactSSOName,
31
31
  ownersCaseGroups: state.ownersCaseGroups,
32
32
  selectedAccountDetails: state.selectedAccountDetails,
33
- hasInvalidEntitlements: state.hasInvalidEntitlements,
34
33
  }), isEqual);
35
34
  const caseDispatch = useCaseDispatch();
36
35
  const isMetadataLoading = () => {
@@ -83,13 +82,13 @@ export default function IdeaInformation() {
83
82
  ' ',
84
83
  React.createElement("a", { href: "/support/contact/customerService" }, "Customer Service"),
85
84
  " for assistance.")),
86
- React.createElement(AlertMessage, { show: hasInvalidEntitlements, variant: AlertType.DANGER, className: "pf-v6-u-mb-md", isInline: true },
85
+ React.createElement(AlertMessage, { show: !loggedInUserRights.data.isEntitled(), variant: AlertType.DANGER, className: "pf-v6-u-mb-md", isInline: true },
87
86
  React.createElement(Trans, { i18nKey: "i18ValidEntitlementContactCustomerService" },
88
87
  "You need a valid entitlement to create a case.\u00A0 Please contact",
89
88
  ' ',
90
89
  React.createElement("a", { href: "/support/contact/customerService" }, "Customer Service"),
91
90
  " for assistance.")),
92
- !hasInvalidEntitlements &&
91
+ loggedInUserRights.data.isEntitled() &&
93
92
  !isMetadataLoading() &&
94
93
  !isMetadataLoadingError() &&
95
94
  loggedInUserRights.data.canManageCases() && (React.createElement(React.Fragment, null,
@@ -1,7 +1,7 @@
1
1
  import React, { useContext } from 'react';
2
2
  import { Trans } from 'react-i18next';
3
3
  import FileLister from './FileLister';
4
- import { isUploadingAttachment } from './reducer/AttachmentHelper';
4
+ import { hasSomeSelectedFiles, isUploadingAttachment } from './reducer/AttachmentHelper';
5
5
  import { AttachmentStateContext } from './reducer/AttachmentReducerContext';
6
6
  import { FileUploadButton } from './UploadButton';
7
7
  import { useFileUploader } from './useFileUploader';
@@ -14,12 +14,11 @@ const defaultProps = {
14
14
  showDescriptionInfoMsg: false,
15
15
  };
16
16
  function FileUpload(props) {
17
- var _a, _b, _c;
18
17
  // Attachment Reducer Related
19
18
  const { attachmentState } = useContext(AttachmentStateContext);
20
19
  const { editFile, removeFile, retryUpload, uploadAll, retryAnalysis } = useFileUploader(props);
21
20
  return (React.createElement("section", { className: `${props.className}`, id: `${props.id}` },
22
- ((_c = (_b = (_a = attachmentState === null || attachmentState === void 0 ? void 0 : attachmentState.caseFiles) === null || _a === void 0 ? void 0 : _a.selectedLocalFiles) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0) > 0 && (React.createElement(React.Fragment, null,
21
+ hasSomeSelectedFiles(attachmentState.caseFiles.selectedLocalFiles) && (React.createElement(React.Fragment, null,
23
22
  !props.isSessionId ? (React.createElement("h4", null,
24
23
  React.createElement(Trans, null, "Uploading attachment(s)"))) : null,
25
24
  React.createElement(FileLister, { onRetryAnalysis: retryAnalysis, selectedLocalFiles: attachmentState.caseFiles.selectedLocalFiles, onFileEdit: editFile, onFileRemove: removeFile, onRetry: retryUpload, isSessionId: props.isSessionId, showSlowUploadMsg: attachmentState.showUploadingOnSlowConnectionMsg }))),
@@ -34,6 +34,7 @@ export declare const hasSomeUnUploadedAttachments: (selectedLocalFiles: IFileLoc
34
34
  export declare const hasQueuedAttachmentUploads: (selectedLocalFiles: IFileLocal[]) => boolean;
35
35
  /** Aborted/failed rows should stay in the upload panel until the user clicks Remove. */
36
36
  export declare const hasAbortedOrFailedAttachments: (selectedLocalFiles: IFileLocal[]) => boolean;
37
+ /** True when at least one non-deleted file remains in the upload queue (UI visibility). */
37
38
  export declare const hasSomeSelectedFiles: (selectedLocalFiles: IFileLocal[]) => boolean;
38
39
  export declare const isUploadingAttachment: (selectedLocalFiles: IFileLocal[]) => boolean;
39
40
  export declare const isAnalysingAnyAttachment: (selectedLocalFiles: IFileLocal[]) => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"AttachmentHelper.d.ts","sourceRoot":"","sources":["../../../../../../src/components/shared/fileUpload/reducer/AttachmentHelper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AttachmentHelper.d.ts","sourceRoot":"","sources":["../../../../../../src/components/shared/fileUpload/reducer/AttachmentHelper.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import { Config, pcm, sessionAttachments } from '@cee-eng/hydrajs';
11
11
  import { ToastNotification } from '@rh-support/components';
12
- import { fetchCaseDetailsByCaseNumber, GET_CONTENT_DOCUMENT_IDS, getText, MultipartUploadError, pendoTrackEvent, pollAttachmentUploadStatus, pollContentVersionStatus, uploadCaseAttachment, } from '@rh-support/utils';
12
+ import { CaseAttachmentUploadError, fetchCaseDetailsByCaseNumber, GET_CONTENT_DOCUMENT_IDS, getText, MultipartUploadError, pendoTrackEvent, pollAttachmentUploadStatus, pollContentVersionStatus, uploadCaseAttachment, } from '@rh-support/utils';
13
13
  import find from 'lodash/find';
14
14
  import forEach from 'lodash/forEach';
15
15
  import includes from 'lodash/includes';
@@ -98,7 +98,8 @@ export const hasQueuedAttachmentUploads = (selectedLocalFiles) => !isEmpty(find(
98
98
  /** Aborted/failed rows should stay in the upload panel until the user clicks Remove. */
99
99
  export const hasAbortedOrFailedAttachments = (selectedLocalFiles) => !isEmpty(find(selectedLocalFiles, (localFile) => isUploadAborted(localFile.uploadProgress.uploadStatus) ||
100
100
  isUploadFailed(localFile.uploadProgress.uploadStatus)));
101
- export const hasSomeSelectedFiles = (selectedLocalFiles) => !isEmpty(selectedLocalFiles);
101
+ /** True when at least one non-deleted file remains in the upload queue (UI visibility). */
102
+ export const hasSomeSelectedFiles = (selectedLocalFiles) => !isEmpty(find(selectedLocalFiles, (localFile) => !isFileDeleted(localFile.uploadProgress.uploadStatus)));
102
103
  export const isUploadingAttachment = (selectedLocalFiles) => !isEmpty(find(selectedLocalFiles, (localFile) => isUploading(localFile.uploadProgress.uploadStatus)));
103
104
  export const isAnalysingAnyAttachment = (selectedLocalFiles) => !isEmpty(find(selectedLocalFiles, (localFile) => isAnalysingFile(localFile.analysisMetadata.analysisStatus)));
104
105
  export const canShowProgressBar = (file) => isUploading(file.uploadProgress.uploadStatus) || isAnalysingFile(file.analysisMetadata.analysisStatus);
@@ -106,6 +107,7 @@ export const shouldHideDescription = (file, isSessionUpload) => !file.uploadabil
106
107
  isUploading(file.uploadProgress.uploadStatus) ||
107
108
  (!isSessionUpload &&
108
109
  (isUploadAborted(file.uploadProgress.uploadStatus) ||
110
+ isUploadFailed(file.uploadProgress.uploadStatus) ||
109
111
  (file.uploadability.ableToUpload &&
110
112
  file.uploadProgress.percentUploaded > 0 &&
111
113
  (file.description || '').length === 0) ||
@@ -153,6 +155,7 @@ needsAnalyzing = false, isSessionId = false, slowUploadConfig = {}, apolloClient
153
155
  export const uploadFile = (_a) => __awaiter(void 0, [_a], void 0, function* ({ dispatch, idToUploadTo, localFile, originalFile, index,
154
156
  // isSecureSupport = false, // TODO: Re-enable when Hydra/GraphQL attachment APIs support secure support again
155
157
  needsAnalyzing = false, isSessionId = false, slowUploadConfig = {}, apolloClient, caseSalesforceId, onCaseFileUploaded, }) {
158
+ var _b;
156
159
  if (!localFile.uploadability.ableToUpload) {
157
160
  return;
158
161
  }
@@ -169,6 +172,8 @@ needsAnalyzing = false, isSessionId = false, slowUploadConfig = {}, apolloClient
169
172
  Metadata: Object.assign(Object.assign(Object.assign(Object.assign({}, (localFile.description && { 'x-amz-meta-description': localFile.description })), (localFile.name && { 'x-amz-meta-fileName': localFile.name })), (localFile.size && { 'x-amz-meta-byteLength': localFile.size.toString() })), (localFile.type && { 'x-amz-meta-content-type': localFile.type })),
170
173
  };
171
174
  let triggerTrackSlowUpload = true;
175
+ // Hoisted so catch can treat S3 403-after-abort as user cancel, not a hard failure.
176
+ let userAborted = false;
172
177
  try {
173
178
  const listener = (progress, abort, isUploadingWithSlowConfig) => {
174
179
  if (isUploadingWithSlowConfig && triggerTrackSlowUpload) {
@@ -224,7 +229,6 @@ needsAnalyzing = false, isSessionId = false, slowUploadConfig = {}, apolloClient
224
229
  else {
225
230
  // Mirror master Hydra listener behavior for circular progress + abort button.
226
231
  let abortUpload;
227
- let userAborted = false;
228
232
  const onAbort = (abortedFileIndex) => {
229
233
  userAborted = true;
230
234
  const abortPayload = {
@@ -309,11 +313,16 @@ needsAnalyzing = false, isSessionId = false, slowUploadConfig = {}, apolloClient
309
313
  }
310
314
  }
311
315
  catch (error) {
312
- if (error.message === 'Request aborted by user') {
316
+ const isUserAbort = userAborted || (error === null || error === void 0 ? void 0 : error.message) === 'Request aborted by user';
317
+ const attachmentIdFromError = (error instanceof MultipartUploadError && ((_b = error.resumeData) === null || _b === void 0 ? void 0 : _b.attachmentId)) ||
318
+ (error instanceof CaseAttachmentUploadError && error.attachmentId) ||
319
+ undefined;
320
+ if (attachmentIdFromError) {
321
+ updateAttachmentIdForFile(dispatch, attachmentIdFromError, index);
322
+ }
323
+ if (isUserAbort) {
313
324
  const resumeState = error instanceof MultipartUploadError ? error.resumeData : undefined;
314
- if (resumeState && resumeState.completedParts.length > 0) {
315
- updateUploadMetadata(dispatch, index, { multipartResumeState: resumeState });
316
- }
325
+ updateUploadMetadata(dispatch, index, Object.assign({ uploadStatus: UploadStatusConstants.aborted, uploadErrorMessage: '', onAbort: undefined, percentUploaded: 0 }, (resumeState && resumeState.completedParts.length > 0 ? { multipartResumeState: resumeState } : {})));
317
326
  }
318
327
  else {
319
328
  console.error(error);
@@ -328,7 +337,6 @@ needsAnalyzing = false, isSessionId = false, slowUploadConfig = {}, apolloClient
328
337
  if (!uploadErrorPayload.multipartResumeState) {
329
338
  uploadErrorPayload.percentUploaded = 0;
330
339
  }
331
- updateAttachmentIdForFile(dispatch, null, index);
332
340
  updateUploadMetadata(dispatch, index, uploadErrorPayload);
333
341
  }
334
342
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useFileUploader.d.ts","sourceRoot":"","sources":["../../../../../src/components/shared/fileUpload/useFileUploader.tsx"],"names":[],"mappings":"AAaA,OAAO,KAA8D,MAAM,OAAO,CAAC;AAenF,OAAO,EAAE,UAAU,EAAmD,MAAM,6BAA6B,CAAC;AAE1G,OAAO,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAEnD,wBAAgB,eAAe,CAAC,KAAK,EAAE,wBAAwB;gCA8EjB,MAAM;gCAYA,UAAU,mBAAmB,MAAM,WAAW,UAAU;oCAOpD,MAAM,QAAQ,UAAU;wBA8BzC,KAAK,CAAC,UAAU,CAAC,iBAAiB,EAAE,UAAU,CAAC;4BA+B3C,MAAM;kCA3EN,MAAM;EAqGhD"}
1
+ {"version":3,"file":"useFileUploader.d.ts","sourceRoot":"","sources":["../../../../../src/components/shared/fileUpload/useFileUploader.tsx"],"names":[],"mappings":"AAaA,OAAO,KAA8D,MAAM,OAAO,CAAC;AAgBnF,OAAO,EACH,UAAU,EAKb,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAEnD,wBAAgB,eAAe,CAAC,KAAK,EAAE,wBAAwB;gCA8EjB,MAAM;gCAYA,UAAU,mBAAmB,MAAM,WAAW,UAAU;oCAOpD,MAAM,QAAQ,UAAU;wBA4DzC,KAAK,CAAC,UAAU,CAAC,iBAAiB,EAAE,UAAU,CAAC;4BA+B3C,MAAM;kCAzGN,MAAM;EAmIhD"}
@@ -18,8 +18,8 @@ import { SessionRestoreDispatchContext, SessionRestoreStateContext } from '../..
18
18
  import { SESSION_REFERRER_URL_LIMIT } from '../../../reducers/CaseConstNTypes';
19
19
  import { getSessionDetailsFromCase } from '../../../reducers/CaseHelpers';
20
20
  import { createSession } from '../../../reducers/SessionRestoreReducer';
21
- import { doSosReportAnalysisForFile, isAnalysingAnyAttachment, isUploadedSuccessfully, isUploadingAttachment, updateUploadMetadata, uploadAllFiles, uploadFile, } from './reducer/AttachmentHelper';
22
- import { onFileEdit, onFileRemove, UploadStatusConstants } from './reducer/AttachmentReducer';
21
+ import { doSosReportAnalysisForFile, hasSomeSelectedFiles, isAnalysingAnyAttachment, isUploadedSuccessfully, isUploadingAttachment, updateUploadMetadata, uploadAllFiles, uploadFile, } from './reducer/AttachmentHelper';
22
+ import { onFileEdit, onFileRemove, resetAttachment, UploadStatusConstants, } from './reducer/AttachmentReducer';
23
23
  import { AttachmentDispatchContext, AttachmentStateContext } from './reducer/AttachmentReducerContext';
24
24
  export function useFileUploader(props) {
25
25
  const { attachmentState, attachmentState: { caseFiles }, } = useContext(AttachmentStateContext);
@@ -83,23 +83,41 @@ export function useFileUploader(props) {
83
83
  debounceSessionMetadataUpdate(editedLocalFile, changes);
84
84
  });
85
85
  const onFileRemoveLocal = (fileIndexToRemove, file) => __awaiter(this, void 0, void 0, function* () {
86
- var _a, _b;
86
+ var _a, _b, _c;
87
87
  // Stop in-flight S3 transfer if Remove is used while upload/verify is still active
88
88
  (_b = (_a = file.uploadProgress).onAbort) === null || _b === void 0 ? void 0 : _b.call(_a, fileIndexToRemove);
89
+ const attachmentIdToDelete = file.attachmentId || ((_c = file.uploadProgress.multipartResumeState) === null || _c === void 0 ? void 0 : _c.attachmentId);
89
90
  const selectedLocalFiles = attachmentState.caseFiles.selectedLocalFiles;
90
- if (!isUploadingAttachment(selectedLocalFiles) && !isAnalysingAnyAttachment(selectedLocalFiles)) {
91
+ const isBusy = isUploadingAttachment(selectedLocalFiles) || isAnalysingAnyAttachment(selectedLocalFiles);
92
+ let nextLocalFiles;
93
+ if (!isBusy) {
91
94
  onFileRemove(dispatch, fileIndexToRemove);
95
+ nextLocalFiles = selectedLocalFiles.filter((_, index) => index !== fileIndexToRemove);
92
96
  }
93
97
  else {
94
98
  updateUploadMetadata(dispatch, fileIndexToRemove, {
95
99
  uploadStatus: UploadStatusConstants.deleted,
96
100
  onAbort: undefined,
97
101
  });
102
+ nextLocalFiles = selectedLocalFiles.map((localFile, index) => index === fileIndexToRemove
103
+ ? Object.assign(Object.assign({}, localFile), { uploadProgress: Object.assign(Object.assign({}, localFile.uploadProgress), { uploadStatus: UploadStatusConstants.deleted, onAbort: undefined }) }) : localFile);
104
+ }
105
+ // Drop soft-deleted stubs so "Uploading attachment(s)" / Upload new file do not linger
106
+ if (!hasSomeSelectedFiles(nextLocalFiles)) {
107
+ resetAttachment(dispatch);
108
+ }
109
+ if (attachmentIdToDelete && isSessionId && isUploadedSuccessfully(file)) {
110
+ deleteSessionAttachment(idToUploadTo, attachmentIdToDelete);
111
+ }
112
+ // Abort/fail after Hydra init still has an attachmentId — clean up SFDC "In Progress" on Remove only
113
+ if (attachmentIdToDelete && !isSessionId) {
114
+ try {
115
+ yield deleteCaseAttachmentRequest(idToUploadTo, attachmentIdToDelete);
116
+ }
117
+ catch (_d) {
118
+ // Best-effort: row is already removed from the PCM queue
119
+ }
98
120
  }
99
- isUploadedSuccessfully(file) && isSessionId && deleteSessionAttachment(idToUploadTo, file.attachmentId);
100
- // TODO: Re-enable when delete API accepts isSecureSupport again
101
- // isUploadedSuccessfully(file) && !isSessionId && deleteCaseAttachment(idToUploadTo, file.attachmentId, isSecureSupport);
102
- isUploadedSuccessfully(file) && !isSessionId && deleteCaseAttachmentRequest(idToUploadTo, file.attachmentId);
103
121
  });
104
122
  const resolveCaseSalesforceId = () => __awaiter(this, void 0, void 0, function* () {
105
123
  if (caseSalesforceIdRef.current || isSessionId || !idToUploadTo || !apolloClient) {
@@ -1 +1 @@
1
- {"version":3,"file":"useIsSectionValid.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/useIsSectionValid.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAyB1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAKnE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,gBAAgB;;;;;EAuQ9D"}
1
+ {"version":3,"file":"useIsSectionValid.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/useIsSectionValid.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAuBrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAKnE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,gBAAgB;;;;;EAoP9D"}
@@ -1,19 +1,16 @@
1
- // import { contacts } from '@cee-eng/hydrajs';
2
1
  import { GlobalMetadataStateContext } from '@rh-support/react-context';
3
- // import find from 'lodash/find';
4
2
  import isEmpty from 'lodash/isEmpty';
5
3
  import isEqual from 'lodash/isEqual';
6
- import React, { useContext } from 'react';
7
- // import React, { useContext, useEffect, useState } from 'react';
4
+ import React, { useContext, useEffect } from 'react';
8
5
  import { Trans } from 'react-i18next';
9
6
  import { useCaseSelector } from '../../context/CaseContext';
10
- import { RouteContext } from '../../context/RouteContext';
11
- // import { RouteContext, useRouteDispatchContext } from '../../context/RouteContext';
7
+ import { RouteContext, useRouteDispatchContext } from '../../context/RouteContext';
12
8
  import { TCStateContext } from '../../context/TopContentContext';
13
9
  import { useAB } from '../../hooks/useAB';
14
10
  import { CASE_DEATILS_ENVIRONMENT_LIMIT, CASE_REFERENCE_NUMBER_LIMIT, CONTACT_INFO_24X7_LIMIT, HOSTNAME_LENGTH_LIMIT, ISSUE_SUMMARY_LENGTH_LIMIT, KTQUESTION_MAX_LIMIT, TITLE_SUMMARY_LENGTH_LIMIT, } from '../../reducers/CaseConstNTypes';
15
11
  import { isCaseInformationSectionValid, isCaseManagementStateValid, isCaseStateValid, isClusterIDValid, isIdeaCaseStateValid, } from '../../reducers/CaseHelpers';
16
12
  import { AppRouteSections } from '../../reducers/RouteConstNTypes';
13
+ import { setNoValidEntitlement } from '../../reducers/RouteReducer';
17
14
  import { AttachmentStateContext } from './fileUpload/reducer/AttachmentReducerContext';
18
15
  export function useIsSectionValid(sectionName) {
19
16
  const { isVariationA } = useAB();
@@ -36,34 +33,15 @@ export function useIsSectionValid(sectionName) {
36
33
  // ssoUsername: state.selectedOwner.data.ssoUsername,
37
34
  manageSupportCases: state.selectedOwner.data.manageSupportCases,
38
35
  }), isEqual);
39
- // const routeDispatch = useRouteDispatchContext();
40
- // const [isEntitlement, setIsEntitlement] = useState<boolean | null>(null);
41
- // useEffect(() => {
42
- // const fetchContactDetails = async () => {
43
- // if (ssoUsername) {
44
- // try {
45
- // const response = await contacts.getSFDCContactBySso(ssoUsername);
46
- // setIsEntitlement(response?.isEntitled ?? null);
47
- // setNoValidEntitlement(routeDispatch, !response?.isEntitled);
48
- // } catch (error) {
49
- // console.error('Error fetching contact details:', error);
50
- // setIsEntitlement(null);
51
- // setNoValidEntitlement(routeDispatch, null);
52
- // }
53
- // }
54
- // };
55
- // fetchContactDetails();
56
- // }, [ssoUsername, routeDispatch]);
57
- // Contact-level entitlement hardcoded to true — now resolved from SFDCProductJSON__c
58
- const isEntitlement = true;
36
+ const routeDispatch = useRouteDispatchContext();
59
37
  const { routeState: { isCaseCreate }, } = useContext(RouteContext);
60
38
  const { globalMetadataState: { allProducts, loggedInUserRights }, } = useContext(GlobalMetadataStateContext);
39
+ // Global entitlement from subscription GraphQL → loggedInUser.isEntitled → UserAuth.isEntitled()
40
+ const isEntitlement = loggedInUserRights.data.isEntitled();
41
+ useEffect(() => {
42
+ setNoValidEntitlement(routeDispatch, !isEntitlement);
43
+ }, [isEntitlement, routeDispatch]);
61
44
  const { topContentState: { topContent }, } = useContext(TCStateContext);
62
- // isEntitledProduct — commented out; product-level entitlement now resolved from SFDCProductJSON__c
63
- // const isEntitledProduct = find(
64
- // allProducts?.data?.productsResult,
65
- // (p) => p.product === caseState.caseDetails.product
66
- // )?.isEntitledProduct;
67
45
  const { routeState: { activeSection }, } = useContext(RouteContext);
68
46
  const { attachmentState } = useContext(AttachmentStateContext);
69
47
  const selectedLocalFiles = attachmentState.caseFiles.selectedLocalFiles;
@@ -143,7 +121,7 @@ export function useIsSectionValid(sectionName) {
143
121
  const isAdditionalInformationSectionValidLocal = () => {
144
122
  var _a;
145
123
  const hostnameIsValid = hostname ? (hostname === null || hostname === void 0 ? void 0 : hostname.length) <= HOSTNAME_LENGTH_LIMIT : true;
146
- return (!caseState.hasInvalidEntitlements &&
124
+ return (isEntitlement &&
147
125
  isClusterIDValid(caseState, (_a = allProducts.data) === null || _a === void 0 ? void 0 : _a.productsResult) &&
148
126
  isCaseInformationSectionValid(caseState, loggedInUserRights) &&
149
127
  hostnameIsValid &&
@@ -179,7 +157,7 @@ export function useIsSectionValid(sectionName) {
179
157
  // isEntitledProduct check removed — product-level entitlement now resolved from SFDCProductJSON__c
180
158
  return '';
181
159
  };
182
- const getSupportSectionError = () => {
160
+ const getEntitlementSectionError = () => {
183
161
  if (manageSupportCases === false) {
184
162
  return (React.createElement(Trans, { i18nKey: "i18ManageCaseContactCustomerService" },
185
163
  "You need additional access to manage cases.\u00A0 Please contact",
@@ -187,14 +165,13 @@ export function useIsSectionValid(sectionName) {
187
165
  React.createElement("a", { href: "/support/contact/customerService" }, "Customer Service"),
188
166
  " for assistance."));
189
167
  }
190
- // if (isEntitlement === false) {
191
- // return (
192
- // <Trans i18nKey="i18ValidEntitlementContactCustomerService">
193
- // You need a valid entitlement to create a case.&nbsp; Please contact{' '}
194
- // <a href="/support/contact/customerService">Customer Service</a> for assistance.
195
- // </Trans>
196
- // );
197
- // }
168
+ if (isEntitlement === false) {
169
+ return (React.createElement(Trans, { i18nKey: "i18ValidEntitlementContactCustomerService" },
170
+ "You need a valid entitlement to create a case.\u00A0 Please contact",
171
+ ' ',
172
+ React.createElement("a", { href: "/support/contact/customerService" }, "Customer Service"),
173
+ " for assistance."));
174
+ }
198
175
  return '';
199
176
  };
200
177
  const activeSectionError = (sectionNameLocal) => {
@@ -204,7 +181,9 @@ export function useIsSectionValid(sectionName) {
204
181
  case AppRouteSections.RESOURCES:
205
182
  return recommendationSectionError();
206
183
  case AppRouteSections.GET_SUPPORT:
207
- return getSupportSectionError();
184
+ case AppRouteSections.SUMMARIZE:
185
+ case AppRouteSections.TROUBLESHOOT:
186
+ return getEntitlementSectionError();
208
187
  default:
209
188
  return '';
210
189
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalTroubleshootEffects.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/GlobalTroubleshootEffects.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAkD,MAAM,OAAO,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAgBvD,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,qBAodtD"}
1
+ {"version":3,"file":"GlobalTroubleshootEffects.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/GlobalTroubleshootEffects.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAkD,MAAM,OAAO,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAgBvD,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,qBAidtD"}
@@ -10,7 +10,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  import { useApolloClient } from '@apollo/client/react';
11
11
  import { useDebounce } from '@rh-support/components';
12
12
  import { GlobalMetadataStateContext, useUserPreferences } from '@rh-support/react-context';
13
- import { ability, CaseListFields, resourceActions, resources } from '@rh-support/user-permissions';
14
13
  import { GET_ACCOUNT_CONTACTS, resolveProductServiceLevelsForAccount, } from '@rh-support/utils';
15
14
  import findIndex from 'lodash/findIndex';
16
15
  import includes from 'lodash/includes';
@@ -69,7 +68,6 @@ export function GlobalTroubleshootEffects(props) {
69
68
  const isFirstMountProduct = useRef(true);
70
69
  const { getPreferredLanguage } = useUserPreferences();
71
70
  const rulesDispatch = useContext(RulesDispatchContext);
72
- const canAddAttachments = ability.can(resourceActions.PATCH, resources.CASE_CREATE, CaseListFields.ATTACHMENTS);
73
71
  // top content state
74
72
  const { topContentState: { topContentPayload }, } = useContext(TCStateContext);
75
73
  const tcDispatch = useContext(TCDispatchContext);
@@ -338,7 +336,7 @@ export function GlobalTroubleshootEffects(props) {
338
336
  session_id: activeSessionId,
339
337
  }, accountType: {
340
338
  isSecure: selectedAccountDetails.data.securedEnvironment || false,
341
- }, userType: { canAddAttachments }, fields: ['title', 'cta', 'description', 'rule_type', 'rule_sub_type', 'rule_id'] }, ((selectedLocalFiles === null || selectedLocalFiles === void 0 ? void 0 : selectedLocalFiles.length) && {
339
+ }, fields: ['title', 'cta', 'description', 'rule_type', 'rule_sub_type', 'rule_id'] }, ((selectedLocalFiles === null || selectedLocalFiles === void 0 ? void 0 : selectedLocalFiles.length) && {
342
340
  attachment: selectedLocalFiles.map((file) => ({
343
341
  uuid: file.attachmentId,
344
342
  fileName: file.name,
@@ -1 +1 @@
1
- {"version":3,"file":"WizardAside.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/WizardAside.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,EAGH,eAAe,EAIlB,MAAM,iCAAiC,CAAC;AAWzC,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjD,2BAA2B,EAAE,OAAO,CAAC;CACxC;AAED,iBAAS,WAAW,CAAC,KAAK,EAAE,MAAM,qBA4EjC;kBA5EQ,WAAW;;;AA8EpB,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"WizardAside.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/WizardAside.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,EAGH,eAAe,EAIlB,MAAM,iCAAiC,CAAC;AAWzC,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjD,2BAA2B,EAAE,OAAO,CAAC;CACxC;AAED,iBAAS,WAAW,CAAC,KAAK,EAAE,MAAM,qBA0EjC;kBA1EQ,WAAW;;;AA4EpB,eAAe,WAAW,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { GlobalMetadataStateContext } from '@rh-support/react-context';
2
- import { ability, CaseListFields, resourceActions, resources } from '@rh-support/user-permissions';
2
+ import { ability, resourceActions, resources } from '@rh-support/user-permissions';
3
3
  import { PreviousCaseTypes } from '@rh-support/utils';
4
4
  import isEmpty from 'lodash/isEmpty';
5
5
  import isEqual from 'lodash/isEqual';
@@ -27,7 +27,6 @@ function WizardAside(props) {
27
27
  const { routeState: { activeSection, isCaseCreate }, } = useContext(RouteContext);
28
28
  const { topContentState: { topContent }, } = useContext(TCStateContext);
29
29
  const { globalMetadataState: { loggedInUsersAccount }, } = useContext(GlobalMetadataStateContext);
30
- const canAddAttachments = ability.can(resourceActions.PATCH, resources.CASE_CREATE, CaseListFields.ATTACHMENTS);
31
30
  const { isCreatingCase, caseType, isCveModalOpened, version, product } = useCaseSelector((state) => ({
32
31
  isCreatingCase: state.isCreatingCase,
33
32
  caseType: state.caseDetails.caseType,
@@ -39,8 +38,7 @@ function WizardAside(props) {
39
38
  const canUseSessionManagement = ability.can(resourceActions.CREATE, resources.SESSION_TRACKING);
40
39
  const isSecureSupportOrCSS = loggedInUsersAccount.data.hasConfirmedStatesideSupport || loggedInUsersAccount.data.secureSupport;
41
40
  const isOpenShiftProduct = (_a = product === null || product === void 0 ? void 0 : product.toLowerCase().includes('openshift')) !== null && _a !== void 0 ? _a : false;
42
- const canShowFileUploadWidget = () => canAddAttachments &&
43
- !props.isAttachmentUploadModalOpen &&
41
+ const canShowFileUploadWidget = () => !props.isAttachmentUploadModalOpen &&
44
42
  !isUndefined(activeSection) &&
45
43
  !hideFileUploadSidebarWidgetSections.includes(activeSection);
46
44
  const canShowEARuleWidget = activeSection
@@ -1 +1 @@
1
- {"version":3,"file":"WizardLayout.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/WizardLayout.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,EAAuC,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAevG,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;CACpD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,qBA+NzC"}
1
+ {"version":3,"file":"WizardLayout.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/WizardLayout.tsx"],"names":[],"mappings":"AASA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,EAAuC,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAevG,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;CACpD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,qBA4NzC"}
@@ -11,7 +11,6 @@ import { useApolloClient } from '@apollo/client/react';
11
11
  import { Grid, GridItem } from '@patternfly/react-core';
12
12
  import { SupportFeedbackForm } from '@rh-support/components';
13
13
  import { fetchProducts, GlobalMetadataDispatchContext, GlobalMetadataStateContext } from '@rh-support/react-context';
14
- import { ability, CaseListFields, resourceActions, resources } from '@rh-support/user-permissions';
15
14
  import { getVersionIfOnlyVersion, pendoTrackEvent, PreviousCaseTypes } from '@rh-support/utils';
16
15
  import findIndex from 'lodash/findIndex';
17
16
  import isEmpty from 'lodash/isEmpty';
@@ -76,7 +75,6 @@ export function WizardLayout(props) {
76
75
  clearTimeout(entitlementTimerRef.current);
77
76
  };
78
77
  }, [isProductNotEntitled, product, isAccountLoaded, entitlementWarningDismissedForProduct]);
79
- const canAddAttachments = ability.can(resourceActions.PATCH, resources.CASE_CREATE, CaseListFields.ATTACHMENTS);
80
78
  const { attachmentState } = useContext(AttachmentStateContext);
81
79
  const isAnyFileAttachedLocal = isAnyFileAttached(attachmentState.caseFiles.selectedLocalFiles);
82
80
  const [confirmationModalType, setConfirmationModalType] = useState(null);
@@ -102,8 +100,7 @@ export function WizardLayout(props) {
102
100
  viewedConfirmationModalsList.current.push(PreCaseConfirmationModalsEnum.ROCM_MODAL);
103
101
  isModalPresent = true;
104
102
  }
105
- else if (canAddAttachments &&
106
- !isAnyFileAttachedLocal &&
103
+ else if (!isAnyFileAttachedLocal &&
107
104
  !viewedConfirmationModalsList.current.includes(PreCaseConfirmationModalsEnum.NO_ATTACHMENT_MODAL)) {
108
105
  setConfirmationModalType(PreCaseConfirmationModalsEnum.NO_ATTACHMENT_MODAL);
109
106
  viewedConfirmationModalsList.current.push(PreCaseConfirmationModalsEnum.NO_ATTACHMENT_MODAL);
@@ -240,7 +240,13 @@ button,
240
240
  }
241
241
 
242
242
  .comment-body .attachment-download-btn {
243
+ --pf-v6-c-button--m-link--m-inline--TextDecorationLine: none;
244
+ --pf-v6-c-button--m-link--m-inline--hover--TextDecorationLine: none;
245
+ --pf-v6-c-button--TextDecorationLine: none;
246
+ --pf-v6-c-button--hover--TextDecorationLine: none;
243
247
  padding: 0px 3px;
248
+ white-space: nowrap;
249
+ text-decoration: none;
244
250
  }
245
251
 
246
252
  .downshift input[disabled] + label {
@@ -64,7 +64,9 @@ export declare const updateCaseDetailsGraphQL: (dispatch: CaseReducerDispatchTyp
64
64
  mutate: (options: any) => Promise<any>;
65
65
  }, caseNumber: string, caseUpdate: Partial<IGraphQLCaseUpdateInput>, dontSetDetails?: boolean, options?: UpdateCaseDetailsGraphQLOptions) => Promise<void>;
66
66
  export declare const getNotificationContacts4InternalUser: (dispatch: CaseReducerDispatchType, users: INotifiedUser[], caseOwnerSSO: string) => Promise<void>;
67
- export declare const getNotificationContacts4ExternalUser: (dispatch: CaseReducerDispatchType, users: any, loggedInUserRights: any, accountNumber: any, caseOwnerSSO: string, fullNameCustom: string) => Promise<void>;
67
+ export declare const getNotificationContacts4ExternalUser: (dispatch: CaseReducerDispatchType, users: any, loggedInUserRights: any, accountNumber: any, caseOwnerSSO: string, fullNameCustom: string, apolloClient?: {
68
+ query: (options: any) => Promise<any>;
69
+ }) => Promise<void>;
68
70
  export declare const checkForCaseStatusToggleOnAttachOrComment: (dispatch: CaseReducerDispatchType, isInternal: boolean, currentStatus: string) => void;
69
71
  export declare const setSelectedCaseGroupUsers: (dispatch: CaseReducerDispatchType, accountNumber: string, groupNumber: string, loggedInUserRights: UserAuth) => Promise<void>;
70
72
  export declare function getCustomNotificationEmails(dispatch: CaseReducerDispatchType, caseNumber: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"CaseReducer.d.ts","sourceRoot":"","sources":["../../../src/reducers/CaseReducer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CaseReducer.d.ts","sourceRoot":"","sources":["../../../src/reducers/CaseReducer.ts"],"names":[],"mappings":"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"}
@@ -18,9 +18,9 @@ var __rest = (this && this.__rest) || function (s, e) {
18
18
  }
19
19
  return t;
20
20
  };
21
- import { accounts, contacts, kase, pcm, publicApi } from '@cee-eng/hydrajs';
21
+ import { contacts, kase, pcm, publicApi } from '@cee-eng/hydrajs';
22
22
  import { formattedApiErrorMessage } from '@rh-support/components';
23
- import { CREATE_SUPPORT_CASE, dtmTrackEventCaseCreationStepEncountered, fetchCaseDetailsByCaseNumber, GET_ACCOUNT, GET_CASE_GROUP, GET_PRODUCTS, getAccountQueryVariables, getApiResourceObject, handleGraphQLAccountResponse, handleGraphQLVersionsResponse, mapGraphQLCaseDetailsToCasePayload, PreviousToNewCaseTypeMap, updateCaseDetailsGraphQLRequest, } from '@rh-support/utils';
23
+ import { CREATE_SUPPORT_CASE, dtmTrackEventCaseCreationStepEncountered, fetchCaseDetailsByCaseNumber, fetchLoggedInUserAccountContactsFromGraphQL, GET_ACCOUNT, GET_CASE_GROUP, GET_PRODUCTS, getAccountQueryVariables, getApiResourceObject, handleGraphQLAccountResponse, handleGraphQLVersionsResponse, mapGraphQLCaseDetailsToCasePayload, PreviousToNewCaseTypeMap, updateCaseDetailsGraphQLRequest, } from '@rh-support/utils';
24
24
  // import delay from 'lodash/delay';
25
25
  import filter from 'lodash/filter';
26
26
  import find from 'lodash/find';
@@ -51,8 +51,10 @@ export const caseReducer = (pState, action) => {
51
51
  }
52
52
  if (((_f = (_e = action.payload) === null || _e === void 0 ? void 0 : _e.caseDetails) === null || _f === void 0 ? void 0 : _f.product) &&
53
53
  pState.caseDetails.product !== ((_h = (_g = action.payload) === null || _g === void 0 ? void 0 : _g.caseDetails) === null || _h === void 0 ? void 0 : _h.product)) {
54
- // need to reset sla on product change as individiual products can have independent sla
55
- action.payload.caseDetails.entitlementSla = undefined;
54
+ // Reset SLA on product change unless the caller already provided the new entitlement SLA
55
+ if (!Object.prototype.hasOwnProperty.call(action.payload.caseDetails, 'entitlementSla')) {
56
+ action.payload.caseDetails.entitlementSla = undefined;
57
+ }
56
58
  resetEntitlementId = true;
57
59
  }
58
60
  return Object.assign(Object.assign(Object.assign({}, pState), { hasLargeCaseDescription, caseDetails: Object.assign(Object.assign({}, pState.caseDetails), action.payload.caseDetails), isCaseUpdating: false }), (resetEntitlementId ? { selectedEntitlementId: undefined } : {}));
@@ -502,7 +504,11 @@ export const setCaseOwner = (dispatch_1, owner_1, product_1, abortSignalCaseGrou
502
504
  }
503
505
  dispatch({
504
506
  type: CaseReducerConstants.caseStateChanged,
505
- payload: { selectedOwner: getApiResourceObject(owner), hasInvalidEntitlements: false },
507
+ payload: {
508
+ selectedOwner: getApiResourceObject(owner),
509
+ // Invert global/user isEntitled (from subscription GraphQL) into case entitlement flag
510
+ hasInvalidEntitlements: owner.isEntitled === false,
511
+ },
506
512
  });
507
513
  dispatch({
508
514
  type: CaseReducerConstants.caseDetailChanged,
@@ -607,6 +613,7 @@ export const fetchCaseGroupsForContactGraphQL = (dispatch_1, apolloClient_1, con
607
613
  try {
608
614
  const { data } = yield apolloClient.query({
609
615
  query: GET_CASE_GROUP,
616
+ variables: { first: 2000 },
610
617
  });
611
618
  const response = data;
612
619
  const allGroups = (_d = (_c = (_b = (_a = response === null || response === void 0 ? void 0 : response.redhat_support_uiapi) === null || _a === void 0 ? void 0 : _a.query) === null || _b === void 0 ? void 0 : _b.RedHatSupportCaseGroup__c) === null || _c === void 0 ? void 0 : _c.edges) !== null && _d !== void 0 ? _d : [];
@@ -666,7 +673,7 @@ export const updateCaseWithSession = (dispatch_1, sessionItem_1, loggedInUserAcc
666
673
  // Set owner and Notified users
667
674
  const notifiedUsersExternal = (_b = (_a = sessionDetails.notifiedUsersExternal) === null || _a === void 0 ? void 0 : _a.split(',')) !== null && _b !== void 0 ? _b : [];
668
675
  const notifiedUsersInternal = (_d = (_c = sessionDetails.notifiedUsersInternal) === null || _c === void 0 ? void 0 : _c.split(',')) !== null && _d !== void 0 ? _d : [];
669
- const allRelevantContacts = yield getAllRelevantContacts(loggedInUserContact, caseDetails.accountNumberRef, caseDetails.contactSSOName, notifiedUsersExternal, notifiedUsersInternal);
676
+ const allRelevantContacts = yield getAllRelevantContacts(loggedInUserContact, caseDetails.accountNumberRef, caseDetails.contactSSOName, notifiedUsersExternal, notifiedUsersInternal, apolloClient);
670
677
  const owner = find(allRelevantContacts, (c) => c.ssoUsername === caseDetails.contactSSOName);
671
678
  const selectedNotificationContacts = getSelectedNotificationContactsFromSession(allRelevantContacts, [
672
679
  ...notifiedUsersExternal,
@@ -690,7 +697,7 @@ export const updateCaseWithSession = (dispatch_1, sessionItem_1, loggedInUserAcc
690
697
  });
691
698
  }
692
699
  });
693
- const getAllRelevantContacts = (loggedInUserContact, caseAccountNumber, contactSsoUsername, notifiedUsersExternal, notifiedUsersInternal) => __awaiter(void 0, void 0, void 0, function* () {
700
+ const getAllRelevantContacts = (loggedInUserContact, caseAccountNumber, contactSsoUsername, notifiedUsersExternal, notifiedUsersInternal, apolloClient) => __awaiter(void 0, void 0, void 0, function* () {
694
701
  if (loggedInUserContact.isInternal) {
695
702
  // Internal users can use the internal API and be done with it
696
703
  const userArray = uniq([contactSsoUsername, ...notifiedUsersExternal, ...notifiedUsersInternal]);
@@ -701,18 +708,12 @@ const getAllRelevantContacts = (loggedInUserContact, caseAccountNumber, contactS
701
708
  return response.items;
702
709
  }
703
710
  else {
704
- const promiseArray = [];
705
- // Only Org admins have access to there own org accounts
706
- loggedInUserContact.isOrgAdmin &&
707
- promiseArray.push(accounts.getAccountContacts(loggedInUserContact.accountNumber));
708
- // However, all external users (org + non-org) can get list of the managed customer contacts
709
- // This is specifically relevant for partners accessing their customer cases
710
- loggedInUserContact.accountNumber !== caseAccountNumber &&
711
- promiseArray.push(accounts.getAccountContacts(caseAccountNumber));
712
- const response = yield Promise.all(promiseArray);
713
711
  const contactsToReturn = [];
714
- response[0] && contactsToReturn.push(...response[0]);
715
- response[1] && contactsToReturn.push(...response[1]);
712
+ const shouldFetchAccountContacts = loggedInUserContact.isOrgAdmin || loggedInUserContact.accountNumber !== caseAccountNumber;
713
+ if (shouldFetchAccountContacts && apolloClient) {
714
+ const accountContacts = yield fetchLoggedInUserAccountContactsFromGraphQL(apolloClient);
715
+ contactsToReturn.push(...accountContacts);
716
+ }
716
717
  contactsToReturn.push(loggedInUserContact);
717
718
  return uniqBy(contactsToReturn, 'ssoUsername');
718
719
  }
@@ -860,7 +861,9 @@ export const updateCaseDetailsGraphQL = (dispatch, apolloClient, caseNumber, cas
860
861
  dispatch({ type: CaseReducerConstants.updateCaseDetailCompleted });
861
862
  return;
862
863
  }
863
- let updatedCaseDetails = Object.assign({}, caseUpdate);
864
+ // productId/entitlementId are only used to build the GraphQL mutation patch, not case details UI state
865
+ const { productId: _productId, entitlementId: _entitlementId } = caseUpdate, caseUpdateWithoutIds = __rest(caseUpdate, ["productId", "entitlementId"]);
866
+ let updatedCaseDetails = Object.assign({}, caseUpdateWithoutIds);
864
867
  if (graphqlDetails) {
865
868
  const mappedGraphQLDetails = mapGraphQLCaseDetailsToCasePayload(graphqlDetails);
866
869
  updatedCaseDetails = Object.assign(Object.assign({}, updatedCaseDetails), Object.fromEntries(Object.entries(mappedGraphQLDetails).filter(([, value]) => value !== null && value !== undefined && value !== '')));
@@ -918,7 +921,7 @@ export const getNotificationContacts4InternalUser = (dispatch, users, caseOwnerS
918
921
  });
919
922
  }
920
923
  });
921
- export const getNotificationContacts4ExternalUser = (dispatch, users, loggedInUserRights, accountNumber, caseOwnerSSO, fullNameCustom) => __awaiter(void 0, void 0, void 0, function* () {
924
+ export const getNotificationContacts4ExternalUser = (dispatch, users, loggedInUserRights, accountNumber, caseOwnerSSO, fullNameCustom, apolloClient) => __awaiter(void 0, void 0, void 0, function* () {
922
925
  try {
923
926
  const selectedNotificationContacts = [];
924
927
  if (loggedInUserRights.isExternalNonOrgAdmin()) {
@@ -957,24 +960,14 @@ export const getNotificationContacts4ExternalUser = (dispatch, users, loggedInUs
957
960
  type: CaseReducerConstants.getSelectedAccountDetailsHydra,
958
961
  payload: { isFetchingSelectedNotificationContacts: true, hasErrorSelectedNotificationContacts: false },
959
962
  });
960
- const promiseArray = [];
961
- // Only Org admins have access to there own org accounts
962
- loggedInUserRights.isOrgAdmin() &&
963
- promiseArray.push(accounts.getAccountContacts(loggedInUserRights.user.accountNumber));
964
- // However, all external users (org + non-org) can get list of the managed customer contacts
965
- // This is specifically relevant for partners accessing their customer cases
966
- loggedInUserRights.isAccountDifferentFromLoggedInAccount(accountNumber) &&
967
- promiseArray.push(accounts.getAccountContacts(accountNumber));
968
- dispatch({
969
- type: CaseReducerConstants.getSelectedAccountDetailsHydra,
970
- payload: { isFetchingSelectedNotificationContacts: true, hasErrorSelectedNotificationContacts: false },
971
- });
972
- const response = yield Promise.all(promiseArray);
963
+ const shouldFetchAccountContacts = loggedInUserRights.isOrgAdmin() ||
964
+ loggedInUserRights.isAccountDifferentFromLoggedInAccount(accountNumber);
973
965
  let contactsToReturn = [];
974
- response[0] && contactsToReturn.push(...response[0]);
975
- response[1] && contactsToReturn.push(...response[1]);
976
- contactsToReturn = uniqBy(contactsToReturn, 'ssoUsername').filter((contact) => usersArr.indexOf(contact.ssoUsername) !== -1);
977
- selectedNotificationContacts.push(...contactsToReturn);
966
+ if (shouldFetchAccountContacts && apolloClient) {
967
+ contactsToReturn = yield fetchLoggedInUserAccountContactsFromGraphQL(apolloClient);
968
+ contactsToReturn = uniqBy(contactsToReturn, 'ssoUsername').filter((contact) => usersArr.indexOf(contact.ssoUsername) !== -1);
969
+ selectedNotificationContacts.push(...contactsToReturn);
970
+ }
978
971
  }
979
972
  dispatch({
980
973
  type: CaseReducerConstants.getSelectedAccountDetailsHydra,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rh-support/troubleshoot",
3
- "version": "2.6.312",
3
+ "version": "2.6.313",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org"
@@ -52,11 +52,11 @@
52
52
  "@progress/kendo-licensing": "1.3.5",
53
53
  "@progress/kendo-react-pdf": "^5.16.0",
54
54
  "@redux-devtools/extension": "^3.3.0",
55
- "@rh-support/components": "2.5.193",
56
- "@rh-support/react-context": "2.5.287",
55
+ "@rh-support/components": "2.5.194",
56
+ "@rh-support/react-context": "2.5.288",
57
57
  "@rh-support/types": "2.0.26",
58
- "@rh-support/user-permissions": "2.5.139",
59
- "@rh-support/utils": "2.5.121",
58
+ "@rh-support/user-permissions": "2.5.140",
59
+ "@rh-support/utils": "2.5.122",
60
60
  "@types/react-redux": "^7.1.33",
61
61
  "@types/redux": "^3.6.0",
62
62
  "date-fns": "3.6.0",
@@ -126,5 +126,5 @@
126
126
  "defaults and supports es6-module",
127
127
  "maintained node versions"
128
128
  ],
129
- "gitHead": "25e583b62d2c134f01811158805d24b70da32847"
129
+ "gitHead": "6166d112918583d5b9030b1e8cb1e7d2a27bcaa4"
130
130
  }