@rh-support/troubleshoot 2.3.0-alpha.0 → 2.4.5-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/esm/components/AccountInfo/OwnerSelector.d.ts.map +1 -1
- package/lib/esm/components/AccountInfo/OwnerSelector.js +1 -1
- package/lib/esm/components/CaseEditView/CaseDetailsTabs.js +2 -2
- package/lib/esm/components/CaseEditView/CaseOverview/CaseType.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/CaseOverview/CaseType.js +18 -4
- package/lib/esm/components/CaseEditView/CaseOverview/index.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/CaseOverview/index.js +2 -2
- package/lib/esm/components/CaseEditView/CaseSolutions/CaseSolutions.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/CaseSolutions/CaseSolutions.js +4 -2
- package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseInternalStatus.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseInternalStatus.js +2 -1
- package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseDiscussion.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CaseDiscussion.js +6 -4
- package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CommentSearch.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/CommentSearch.js +3 -2
- package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment.js +4 -1
- package/lib/esm/components/CaseEditView/Tabs/CaseHistory/Timeline.css +95 -21
- package/lib/esm/components/CaseEditView/Tabs/CaseHistory/Timeline.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/Tabs/CaseHistory/Timeline.js +269 -137
- package/lib/esm/components/CaseInformation/Fts.d.ts.map +1 -1
- package/lib/esm/components/CaseInformation/Fts.js +6 -5
- package/lib/esm/components/CaseManagement/Cep.d.ts.map +1 -1
- package/lib/esm/components/CaseManagement/Cep.js +3 -2
- package/lib/esm/components/CaseManagement/RHAssociatesSelector.d.ts.map +1 -1
- package/lib/esm/components/CaseManagement/RHAssociatesSelector.js +11 -5
- package/lib/esm/components/CaseManagement/SendNotifications/CaseContactSelector.d.ts.map +1 -1
- package/lib/esm/components/CaseManagement/SendNotifications/CaseContactSelector.js +11 -5
- package/lib/esm/components/Recommendations/AsideResults.d.ts.map +1 -1
- package/lib/esm/components/Recommendations/AsideResults.js +3 -1
- package/lib/esm/components/Recommendations/EARules/EARule.d.ts.map +1 -1
- package/lib/esm/components/Recommendations/EARules/EARule.js +0 -2
- package/lib/esm/components/Recommendations/EARules/EARuleInfoInline.d.ts.map +1 -1
- package/lib/esm/components/Recommendations/EARules/EARuleInfoInline.js +2 -2
- package/lib/esm/components/Recommendations/Recommendations.d.ts.map +1 -1
- package/lib/esm/components/Recommendations/Recommendations.js +19 -8
- package/lib/esm/components/SubmitCase/SubmitCase.js +3 -3
- package/lib/esm/components/Suggestions/TopContent.d.ts.map +1 -1
- package/lib/esm/components/Suggestions/TopContent.js +1 -4
- package/lib/esm/components/shared/fileUpload/fileSelectors/WidgetFileSelector.d.ts +2 -2
- package/lib/esm/components/shared/fileUpload/fileSelectors/WidgetFileSelector.d.ts.map +1 -1
- package/lib/esm/components/shared/fileUpload/fileSelectors/WidgetFileSelector.js +10 -1
- package/lib/esm/components/wizardLayout/WizardLayout.d.ts.map +1 -1
- package/lib/esm/components/wizardLayout/WizardLayout.js +4 -1
- package/lib/esm/components/wizardLayout/WizardMain.d.ts.map +1 -1
- package/lib/esm/components/wizardLayout/WizardMain.js +5 -0
- package/lib/esm/components/wizardLayout/WizardNavigation.d.ts.map +1 -1
- package/lib/esm/components/wizardLayout/WizardNavigation.js +35 -25
- package/lib/esm/hooks/useWizard.js +1 -1
- package/lib/esm/reducers/CaseReducer.d.ts +1 -1
- package/lib/esm/reducers/CaseReducer.d.ts.map +1 -1
- package/lib/esm/reducers/CaseReducer.js +13 -9
- package/lib/esm/reducers/SessionRestoreReducer.d.ts +1 -1
- package/lib/esm/reducers/SessionRestoreReducer.d.ts.map +1 -1
- package/lib/esm/reducers/SessionRestoreReducer.js +14 -121
- package/lib/esm/scss/_main.scss +2 -1
- package/lib/esm/scss/_pf-overrides.scss +6 -0
- package/package.json +11 -12
|
@@ -11,6 +11,7 @@ import { Button, Tooltip, TooltipPosition } from '@patternfly/react-core';
|
|
|
11
11
|
import { ToastNotification } from '@rh-support/components';
|
|
12
12
|
import { GlobalMetadataStateContext } from '@rh-support/react-context';
|
|
13
13
|
import { AbilityContext, CaseListFields, resourceActions, resources } from '@rh-support/user-permissions';
|
|
14
|
+
import { dtmTrackEventCaseStepEncountered } from '@rh-support/utils';
|
|
14
15
|
import differenceBy from 'lodash/differenceBy';
|
|
15
16
|
import filter from 'lodash/filter';
|
|
16
17
|
import find from 'lodash/find';
|
|
@@ -31,11 +32,13 @@ function RHAssociatesSelector(props) {
|
|
|
31
32
|
const [isRHAssociatesUpdating, setIsRHAssociatesUpdating] = useState(false);
|
|
32
33
|
const ability = useContext(AbilityContext);
|
|
33
34
|
const { isExportingPDF } = useContext(PDFContext);
|
|
34
|
-
const { caseNumber, contactSsoUsername, selectedOwner, selectedNotificationContacts } = useCaseSelector((state) => ({
|
|
35
|
+
const { caseNumber, contactSsoUsername, product, selectedOwner, selectedNotificationContacts, version } = useCaseSelector((state) => ({
|
|
35
36
|
caseNumber: state.caseDetails.caseNumber,
|
|
36
37
|
contactSsoUsername: state.caseDetails.contactSSOName,
|
|
37
38
|
selectedOwner: state.selectedOwner,
|
|
38
39
|
selectedNotificationContacts: state.selectedNotificationContacts,
|
|
40
|
+
product: state.caseDetails.product,
|
|
41
|
+
version: state.caseDetails.version,
|
|
39
42
|
}), isEqual);
|
|
40
43
|
const caseDispatch = useCaseDispatch();
|
|
41
44
|
const onRhAssociateAdded = (addedUsers) => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -64,7 +67,7 @@ function RHAssociatesSelector(props) {
|
|
|
64
67
|
ToastNotification.addDangerMessage(t(`Red Hat associate failed to get removed`));
|
|
65
68
|
}
|
|
66
69
|
});
|
|
67
|
-
const onNotifiedUserChange = (
|
|
70
|
+
const onNotifiedUserChange = (selectedContacts_1, ...args_1) => __awaiter(this, [selectedContacts_1, ...args_1], void 0, function* (selectedContacts, throwTrackEventOnAdd = false) {
|
|
68
71
|
const toAdd = filter(differenceBy(selectedContacts, selectedNotificationContacts, 'ssoUsername'), (item) => item.ssoUsername !== contactSsoUsername);
|
|
69
72
|
const toRemove = filter(differenceBy(selectedNotificationContacts, selectedContacts, 'ssoUsername'), (item) => item.isInternal && item.ssoUsername !== contactSsoUsername);
|
|
70
73
|
let newContacts = [];
|
|
@@ -72,6 +75,9 @@ function RHAssociatesSelector(props) {
|
|
|
72
75
|
newContacts = [...selectedNotificationContacts, ...toAdd];
|
|
73
76
|
if (!isEmpty(caseNumber)) {
|
|
74
77
|
yield onRhAssociateAdded(toAdd);
|
|
78
|
+
if (throwTrackEventOnAdd) {
|
|
79
|
+
dtmTrackEventCaseStepEncountered('follow', caseNumber, product, version);
|
|
80
|
+
}
|
|
75
81
|
}
|
|
76
82
|
}
|
|
77
83
|
else if ((toRemove || []).length > 0) {
|
|
@@ -90,9 +96,9 @@ function RHAssociatesSelector(props) {
|
|
|
90
96
|
!isCurrentUserSelectedInternalNotifiedUser();
|
|
91
97
|
const showRemoveWatchButton = () => (loggedInUserRights.data.isInternal() && isCurrentUserSelectedInternalNotifiedUser()) ||
|
|
92
98
|
contactSsoUsername === loggedInUser.data.ssoUsername;
|
|
93
|
-
const addCurrentUser = () => {
|
|
94
|
-
onNotifiedUserChange([Object.assign(Object.assign({}, loggedInUser.data), { accountNumber: loggedInUserRights.data.getAccountNumber() })]);
|
|
95
|
-
};
|
|
99
|
+
const addCurrentUser = () => __awaiter(this, void 0, void 0, function* () {
|
|
100
|
+
onNotifiedUserChange([Object.assign(Object.assign({}, loggedInUser.data), { accountNumber: loggedInUserRights.data.getAccountNumber() })], true);
|
|
101
|
+
});
|
|
96
102
|
const removeCurrentUser = () => {
|
|
97
103
|
if (isCurrentUserSelectedInternalNotifiedUser()) {
|
|
98
104
|
onNotifiedUserChange(filter(selectedNotificationContacts, (contact) => contact.ssoUsername !== loggedInUser.data.ssoUsername));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CaseContactSelector.d.ts","sourceRoot":"","sources":["../../../../../src/components/CaseManagement/SendNotifications/CaseContactSelector.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CaseContactSelector.d.ts","sourceRoot":"","sources":["../../../../../src/components/CaseManagement/SendNotifications/CaseContactSelector.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAgBvE,MAAM,WAAW,MAAM;CAAG;AAG1B,iBAAS,mBAAmB,CAAC,KAAK,EAAE,MAAM,qBA8bzC;AAED,eAAe,mBAAmB,CAAC"}
|
|
@@ -11,6 +11,7 @@ import { Button, Tooltip, TooltipPosition } from '@patternfly/react-core';
|
|
|
11
11
|
import { CaseContactsSelectorExternal, getHydraContactLabel, PromisifyModal, ToastNotification, usePrevious, } from '@rh-support/components';
|
|
12
12
|
import { GlobalMetadataStateContext, useCanEditCase } from '@rh-support/react-context';
|
|
13
13
|
import { AbilityContext, CaseDetailsFields, resourceActions, resources } from '@rh-support/user-permissions';
|
|
14
|
+
import { dtmTrackEventCaseStepEncountered } from '@rh-support/utils';
|
|
14
15
|
import differenceBy from 'lodash/differenceBy';
|
|
15
16
|
import filter from 'lodash/filter';
|
|
16
17
|
import find from 'lodash/find';
|
|
@@ -34,7 +35,7 @@ function CaseContactSelector(props) {
|
|
|
34
35
|
const canSeeEmailNotifications = ability.can(resourceActions.PATCH, resources.CASE_DETAILS, CaseDetailsFields.CASE_DETAILS_SEND_NOTIFICATIONS);
|
|
35
36
|
const [isAssociatesUpdating, setIsAssociatesUpdating] = useState(false);
|
|
36
37
|
const { t } = useTranslation();
|
|
37
|
-
const { accountNumber, caseNumber, contactSsoUsername, selectedNotificationContacts, selectedOwner, customEmailsList, selectedCaseGroupUsers, ownersCaseGroups, groupNumber, createdById, } = useCaseSelector((state) => ({
|
|
38
|
+
const { accountNumber, caseNumber, contactSsoUsername, selectedNotificationContacts, selectedOwner, customEmailsList, product, selectedCaseGroupUsers, ownersCaseGroups, groupNumber, createdById, version, } = useCaseSelector((state) => ({
|
|
38
39
|
accountNumber: state.caseDetails.accountNumberRef,
|
|
39
40
|
caseNumber: state.caseDetails.caseNumber,
|
|
40
41
|
contactSsoUsername: state.caseDetails.contactSSOName,
|
|
@@ -45,6 +46,8 @@ function CaseContactSelector(props) {
|
|
|
45
46
|
groupNumber: state.caseDetails.groupNumber,
|
|
46
47
|
ownersCaseGroups: state.ownersCaseGroups,
|
|
47
48
|
createdById: state.caseDetails.createdById,
|
|
49
|
+
product: state.caseDetails.product,
|
|
50
|
+
version: state.caseDetails.version,
|
|
48
51
|
}), isEqual);
|
|
49
52
|
const caseDispatch = useCaseDispatch();
|
|
50
53
|
const { addCustomEmail, canAddCustomEmail, hideCustomEmails, deleteCustomEmail, isUpdatingCustomEmails, isEmailValid, showAddEmailToAccountModal, } = useCustomEmails({
|
|
@@ -185,7 +188,7 @@ function CaseContactSelector(props) {
|
|
|
185
188
|
}
|
|
186
189
|
return hasGroupAccess;
|
|
187
190
|
});
|
|
188
|
-
const onNotifiedUserChange = (...args_1) => __awaiter(this, [...args_1], void 0, function* (selectedContacts = []) {
|
|
191
|
+
const onNotifiedUserChange = (...args_1) => __awaiter(this, [...args_1], void 0, function* (selectedContacts = [], throwTrackEvent = false) {
|
|
189
192
|
// check if selection changed
|
|
190
193
|
const alreadySelected = [
|
|
191
194
|
...customEmailsList.data,
|
|
@@ -199,6 +202,9 @@ function CaseContactSelector(props) {
|
|
|
199
202
|
const selectedCustomEmails = remove(allSelectedContacts, (item) => item.customOption || item.emailAddress).map((item) => item.label || item.emailAddress || item.ssoUsername);
|
|
200
203
|
yield processCustomEmails(selectedCustomEmails);
|
|
201
204
|
yield processCaseContacts(allSelectedContacts);
|
|
205
|
+
if (throwTrackEvent) {
|
|
206
|
+
dtmTrackEventCaseStepEncountered('follow', caseNumber, product, version);
|
|
207
|
+
}
|
|
202
208
|
});
|
|
203
209
|
/** Reset all non-internal selectedNotificationContacts when selected account number changes */
|
|
204
210
|
useEffect(() => {
|
|
@@ -214,9 +220,9 @@ function CaseContactSelector(props) {
|
|
|
214
220
|
!isCurrentUserSelectedExternalNotifiedUser();
|
|
215
221
|
const showRemoveWatchButton = () => loggedInUserRights.data.isExternal() &&
|
|
216
222
|
(isCurrentUserSelectedExternalNotifiedUser() || isCurrentUserCaseContact);
|
|
217
|
-
const addCurrentUser = () => {
|
|
218
|
-
onNotifiedUserChange([...selectedNotificationContacts, ...customEmailsList.data, loggedInUser.data]);
|
|
219
|
-
};
|
|
223
|
+
const addCurrentUser = () => __awaiter(this, void 0, void 0, function* () {
|
|
224
|
+
onNotifiedUserChange([...selectedNotificationContacts, ...customEmailsList.data, loggedInUser.data], true);
|
|
225
|
+
});
|
|
220
226
|
const removeCurrentUser = () => {
|
|
221
227
|
if (isCurrentUserSelectedExternalNotifiedUser()) {
|
|
222
228
|
onNotifiedUserChange([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AsideResults.d.ts","sourceRoot":"","sources":["../../../../src/components/Recommendations/AsideResults.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AsideResults.d.ts","sourceRoot":"","sources":["../../../../src/components/Recommendations/AsideResults.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAwC,MAAM,OAAO,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AASvD,OAAO,EAAE,eAAe,EAAsC,MAAM,iCAAiC,CAAC;AAUtG,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,qBA0MzC"}
|
|
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
};
|
|
10
10
|
import { pcm, search } from '@cee-eng/hydrajs';
|
|
11
11
|
import { useDebounce } from '@rh-support/components';
|
|
12
|
-
import { computeRecommendationAbstract, computeRecommendationTitle, convertObjToEncodedQueryParams, getSolrParams, getTrimmedCharacters, PreviousCaseTypes, replaceHighlightingData, } from '@rh-support/utils';
|
|
12
|
+
import { computeRecommendationAbstract, computeRecommendationTitle, convertObjToEncodedQueryParams, dtmTrackEventRecommendationListingItemClicked, getSolrParams, getTrimmedCharacters, PreviousCaseTypes, replaceHighlightingData, } from '@rh-support/utils';
|
|
13
13
|
import isEmpty from 'lodash/isEmpty';
|
|
14
14
|
import isEqual from 'lodash/isEqual';
|
|
15
15
|
import React, { useContext, useEffect, useRef } from 'react';
|
|
@@ -117,7 +117,9 @@ export function AsideResults(props) {
|
|
|
117
117
|
const onResourceClick = (doc, index) => (event) => {
|
|
118
118
|
if (isSelectedAccounntSecureSupport)
|
|
119
119
|
return;
|
|
120
|
+
const rank = index + 1 + PAGE_SIZE * ((recommendationState.currentPage || 1) - 1);
|
|
120
121
|
createOrUpdateSessionResources(sessionRestoreDispatch, activeSessionId, sessionResourceTracking, SessionResourceSource.RECOMMENDATIONS_ASIDE, [getSessResFromRec(doc, SessionResourceVisibility.VISITED, index + 1)], payload);
|
|
122
|
+
dtmTrackEventRecommendationListingItemClicked(window.location.href, activeSection, 'middle', doc.id, rank, doc.allTitle, doc.view_uri, 'Recommendation Aside', 'Live troubleshooting powered by OpenShift AI');
|
|
121
123
|
};
|
|
122
124
|
useEffect(() => {
|
|
123
125
|
if (isSelectedAccounntSecureSupport)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EARule.d.ts","sourceRoot":"","sources":["../../../../../src/components/Recommendations/EARules/EARule.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EARule.d.ts","sourceRoot":"","sources":["../../../../../src/components/Recommendations/EARules/EARule.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAM1C,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,UAAU,cAAc;IACpB,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;CAClH;AAGD,eAAO,MAAM,aAAa,+BAGxB,CAAC;AAEH,wBAAgB,gBAAgB,mBAM/B;AACD,wBAAgB,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;;;;CAAA,qBAoClD;AAED,iBAAS,WAAW,sBAGnB;AAED,iBAAS,iBAAiB,sBA0BzB;AAED,iBAAS,aAAa,CAAC,EAAE,SAA6B,EAAE,SAAc,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,qBA2BnH;AAED,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
2
|
import { pcm } from '@cee-eng/hydrajs';
|
|
3
|
-
import { dtmTrackEventCaseStartStopped } from '@rh-support/utils';
|
|
4
3
|
import DOMPurify from 'dompurify';
|
|
5
4
|
import isEqual from 'lodash/isEqual';
|
|
6
5
|
import React, { useContext } from 'react';
|
|
@@ -31,7 +30,6 @@ export function EARule({ children, rule, ruleRank }) {
|
|
|
31
30
|
const sessionRestoreDispatch = useContext(SessionRestoreDispatchContext);
|
|
32
31
|
const onCtaClick = (link, title) => () => {
|
|
33
32
|
createOrUpdateSessionResources(sessionRestoreDispatch, activeSessionId, sessionResourceTracking, SessionResourceSource.EDMOUND_ABOTT, [getSessResFromEA(link, SessionResourceVisibility.VISITED, ruleRank, rule.rule_id)], JSON.stringify({ product, version, summary }));
|
|
34
|
-
dtmTrackEventCaseStartStopped(`insight rule button click: ${title}`, undefined, `${product}|${version}`);
|
|
35
33
|
};
|
|
36
34
|
return (React.createElement(EARuleContext.Provider, { value: {
|
|
37
35
|
rule,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EARuleInfoInline.d.ts","sourceRoot":"","sources":["../../../../../src/components/Recommendations/EARules/EARuleInfoInline.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EARuleInfoInline.d.ts","sourceRoot":"","sources":["../../../../../src/components/Recommendations/EARules/EARuleInfoInline.tsx"],"names":[],"mappings":"AAUA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAM/D,OAAO,EAAE,aAAa,EAAkD,MAAM,gCAAgC,CAAC;AAO/G,UAAU,MAAM;IACZ,OAAO,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,EAAE,OAAY,EAAE,EAAE,MAAM,qBAwJxD"}
|
|
@@ -14,7 +14,7 @@ import CloseIcon from '@patternfly/react-icons/dist/js/icons/close-icon';
|
|
|
14
14
|
import InfoCircleIcon from '@patternfly/react-icons/dist/js/icons/info-circle-icon';
|
|
15
15
|
import { PaginationCompact, useFetch } from '@rh-support/components';
|
|
16
16
|
import { GlobalMetadataStateContext } from '@rh-support/react-context';
|
|
17
|
-
import {
|
|
17
|
+
import { getResTypeFromUrl, getStyleVariantColor, StyleVariants } from '@rh-support/utils';
|
|
18
18
|
import isEqual from 'lodash/isEqual';
|
|
19
19
|
import some from 'lodash/some';
|
|
20
20
|
import React, { useContext, useEffect, useState } from 'react';
|
|
@@ -102,7 +102,7 @@ export function EARuleInfoInline({ eaRules = [] }) {
|
|
|
102
102
|
React.createElement(EARuleTitle, null))),
|
|
103
103
|
React.createElement("div", { className: "pf-v5-c-alert__action" },
|
|
104
104
|
React.createElement(Button, { style: { fontSize: 15 }, variant: ButtonVariant.link, "data-tracking-id": "se-recommended-asa-ignore", type: "button", onClick: onIgnoreBtnClick }, validEARulesLength > 1 ? React.createElement(Trans, null, "Skip") : React.createElement(CloseIcon, null))),
|
|
105
|
-
React.createElement("div", { className: "pf-v5-c-alert__description"
|
|
105
|
+
React.createElement("div", { className: "pf-v5-c-alert__description" },
|
|
106
106
|
React.createElement(EARuleDescription, null)),
|
|
107
107
|
React.createElement("div", { className: "pf-v5-c-alert__action-group pf-v5-u-display-flex" },
|
|
108
108
|
React.createElement(EARuleArticle, { className: "pf-v5-u-align-self-center pf-v5-u-mr-sm", linkTitle: "View details" }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Recommendations.d.ts","sourceRoot":"","sources":["../../../../src/components/Recommendations/Recommendations.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Recommendations.d.ts","sourceRoot":"","sources":["../../../../src/components/Recommendations/Recommendations.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAa,MAAM,kBAAkB,CAAC;AAelE,OAAO,EAAoB,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAWpF,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjD,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACzE,qCAAqC,CAAC,EAAE,OAAO,CAAC;IAChD,aAAa,EAAE,GAAG,CAAC;CACtB;AAED,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,KAAK,EAAE,MAAM,qBA+SpD"}
|
|
@@ -2,7 +2,7 @@ import { pcm } from '@cee-eng/hydrajs';
|
|
|
2
2
|
import { Label, Pagination, PaginationVariant } from '@patternfly/react-core';
|
|
3
3
|
import { LoadingDots, useDebounce, usePrevious } from '@rh-support/components';
|
|
4
4
|
import { useGlobalStateContext } from '@rh-support/react-context';
|
|
5
|
-
import { computeRecommendationAbstract, computeRecommendationTitle,
|
|
5
|
+
import { computeRecommendationAbstract, computeRecommendationTitle, dtmTrackEventRecommendationListingDisplayed, dtmTrackEventRecommendationListingItemClicked, formatDate, } from '@rh-support/utils';
|
|
6
6
|
import differenceBy from 'lodash/differenceBy';
|
|
7
7
|
import isEmpty from 'lodash/isEmpty';
|
|
8
8
|
import isEqual from 'lodash/isEqual';
|
|
@@ -85,7 +85,7 @@ export default function Recommendations(props) {
|
|
|
85
85
|
// recreate a new AbortController for each call
|
|
86
86
|
let controller = new AbortController();
|
|
87
87
|
abortControllerRef.current = controller;
|
|
88
|
-
if (!isEmpty(issue)) {
|
|
88
|
+
if (!isEmpty(issue) || !isEmpty(summary)) {
|
|
89
89
|
!loggedInUsersAccount.data.secureSupport
|
|
90
90
|
? fetchWatsonXRecommendations(recommendationDispatch, payload, MAXROW, recPageSize, 0, true, queryFilters, controller.signal)
|
|
91
91
|
: fetchRecommendations(recommendationDispatch, payload, MAXROW, recPageSize, 0, true, caseNumber, isSecureSupportAccount, queryFilters, controller.signal);
|
|
@@ -106,9 +106,9 @@ export default function Recommendations(props) {
|
|
|
106
106
|
recommendationState.insightsKcsIds,
|
|
107
107
|
], 1000);
|
|
108
108
|
useEffect(() => {
|
|
109
|
-
props.userSeenRecommendations && props.userSeenRecommendations(!recommendationState.isLoadingRecommendations);
|
|
109
|
+
props.userSeenRecommendations && props.userSeenRecommendations(!recommendationState.isLoadingRecommendations); //reset userSeenRecommendations when recommendationState changes
|
|
110
110
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
111
|
-
}, [recommendationState]);
|
|
111
|
+
}, [recommendationState.numFound]);
|
|
112
112
|
useEffect(() => {
|
|
113
113
|
if (recommendationState.isLoadingRecommendations)
|
|
114
114
|
return;
|
|
@@ -121,6 +121,18 @@ export default function Recommendations(props) {
|
|
|
121
121
|
setCaseRecommendations(caseDispatch, recommendationState.visibleDocs, caseResourceLinks);
|
|
122
122
|
}
|
|
123
123
|
createOrUpdateSessionResources(sessionRestoreDispatch, activeSessionId, sessionResourceTracking, SessionResourceSource.RECOMMENDATIONS, getSessResFromRecs(recommendationState.visibleDocs, SessionResourceVisibility.PRESENTED, pageSize || DEFAULTPAGESIZE, recommendationState.currentPage || 1), JSON.stringify(payload));
|
|
124
|
+
const listing = recommendationState.visibleDocs.map((doc, i) => ({
|
|
125
|
+
content: {
|
|
126
|
+
contentID: doc.id,
|
|
127
|
+
contentPosition: i + 1,
|
|
128
|
+
contentTitle: doc.publishedTitle,
|
|
129
|
+
contentUrl: doc.view_uri,
|
|
130
|
+
displayFeature: 'Troubleshooting',
|
|
131
|
+
displayFeatureTitle: '',
|
|
132
|
+
},
|
|
133
|
+
isDisplayed: true,
|
|
134
|
+
}));
|
|
135
|
+
dtmTrackEventRecommendationListingDisplayed('middle', activeSection, listing, recommendationState.numFound);
|
|
124
136
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
125
137
|
}, [caseDispatch, recommendationState.visibleDocs, activeSessionId]);
|
|
126
138
|
useEffect(() => {
|
|
@@ -145,10 +157,9 @@ export default function Recommendations(props) {
|
|
|
145
157
|
setCurrentPage(recommendationDispatch, 1);
|
|
146
158
|
};
|
|
147
159
|
const onResourceClick = (doc, index) => (event) => {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
dtmTrackEventCaseStartStopped('recommendation click', caseNumber, `${product}|${version}`);
|
|
160
|
+
const rank = index + 1 + (pageSize || DEFAULTPAGESIZE) * ((recommendationState.currentPage || 1) - 1);
|
|
161
|
+
createOrUpdateSessionResources(sessionRestoreDispatch, activeSessionId, sessionResourceTracking, SessionResourceSource.RECOMMENDATIONS, [getSessResFromRec(doc, SessionResourceVisibility.VISITED, rank)], JSON.stringify(payload));
|
|
162
|
+
dtmTrackEventRecommendationListingItemClicked(window.location.href, activeSection, 'middle', doc.id, rank, doc.allTitle, doc.view_uri, 'Main Recommendation', 'Live search results powered by OpenShift AI');
|
|
152
163
|
};
|
|
153
164
|
return (React.createElement(React.Fragment, null,
|
|
154
165
|
React.createElement(LoadingDots, { className: "recommendation-loading-dots", show: recommendationState.isLoadingRecommendations && !isEmpty(summary) && !isEmpty(issue) }),
|
|
@@ -168,11 +168,11 @@ export default function SubmitCase(props) {
|
|
|
168
168
|
React.createElement("div", { className: "submit-case-header-container" },
|
|
169
169
|
React.createElement("p", { className: "kicker kicker-sm pf-v5-u-mb-sm" }, !isEmpty(RouteUtils.seBasePath) &&
|
|
170
170
|
!isUploadingAttachment(attachmentState.caseFiles.selectedLocalFiles) ? (React.createElement(React.Fragment, null,
|
|
171
|
-
React.createElement("div", {
|
|
171
|
+
React.createElement("div", { className: "submit-page-title pf-v5-u-mb-lg" },
|
|
172
172
|
React.createElement(Icon, { className: "submit-case-check-icon pf-v5-u-mt-sm", size: "lg" },
|
|
173
173
|
React.createElement(CheckCircleIcon, null)),
|
|
174
174
|
' ',
|
|
175
|
-
React.createElement(Text, { className: "pf-v5-u-mb-0", component: TextVariants.h1 },
|
|
175
|
+
React.createElement(Text, { role: "alert", className: "pf-v5-u-mb-0", component: TextVariants.h1 },
|
|
176
176
|
React.createElement(Trans, null, "We've added your case to our queue"))),
|
|
177
177
|
React.createElement("div", { className: "pf-v5-u-mt-sm" },
|
|
178
178
|
React.createElement(Trans, null, "Case number:"),
|
|
@@ -184,7 +184,7 @@ export default function SubmitCase(props) {
|
|
|
184
184
|
React.createElement(Icon, { size: "lg", className: "submit-case-check-icon" },
|
|
185
185
|
React.createElement(CheckCircleIcon, null)),
|
|
186
186
|
' ',
|
|
187
|
-
React.createElement(Text, { component: TextVariants.h1 },
|
|
187
|
+
React.createElement(Text, { role: "alert", component: TextVariants.h1 },
|
|
188
188
|
React.createElement(Trans, null, "We\u2019ve added your case to our queue"))),
|
|
189
189
|
React.createElement(React.Fragment, null,
|
|
190
190
|
React.createElement(Trans, null, "Case number: "),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TopContent.d.ts","sourceRoot":"","sources":["../../../../src/components/Suggestions/TopContent.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2DAA2D,CAAC;
|
|
1
|
+
{"version":3,"file":"TopContent.d.ts","sourceRoot":"","sources":["../../../../src/components/Suggestions/TopContent.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2DAA2D,CAAC;AAIxF,OAAO,KAAmB,MAAM,OAAO,CAAC;AASxC,UAAU,MAAM;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,KAAK,EAAE,MAAM,qBA8I/C"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { pcm } from '@cee-eng/hydrajs';
|
|
2
2
|
import { Accordion, AccordionContent, AccordionItem, AccordionToggle, Tooltip } from '@patternfly/react-core';
|
|
3
|
-
import { dtmTrackEventCaseStartStopped } from '@rh-support/utils';
|
|
4
3
|
import isEqual from 'lodash/isEqual';
|
|
5
4
|
import map from 'lodash/map';
|
|
6
5
|
import React, { useState } from 'react';
|
|
@@ -14,7 +13,7 @@ export default function TopContent(props) {
|
|
|
14
13
|
const sessionRestoreDispatch = React.useContext(SessionRestoreDispatchContext);
|
|
15
14
|
const { sessionRestore: { activeSessionId, sessionResourceTracking }, } = React.useContext(SessionRestoreStateContext);
|
|
16
15
|
const [expanded, setExpanded] = useState('');
|
|
17
|
-
const { product, version, summary, issue, environment, periodicityOfIssue, timeFramesAndUrgency
|
|
16
|
+
const { product, version, summary, issue, environment, periodicityOfIssue, timeFramesAndUrgency } = useCaseSelector((state) => ({
|
|
18
17
|
product: state.caseDetails.product,
|
|
19
18
|
version: state.caseDetails.version,
|
|
20
19
|
summary: state.caseDetails.summary,
|
|
@@ -22,11 +21,9 @@ export default function TopContent(props) {
|
|
|
22
21
|
environment: state.caseDetails.environment,
|
|
23
22
|
periodicityOfIssue: state.caseDetails.periodicityOfIssue,
|
|
24
23
|
timeFramesAndUrgency: state.caseDetails.timeFramesAndUrgency,
|
|
25
|
-
caseNumber: state.caseDetails.caseNumber,
|
|
26
24
|
}), isEqual);
|
|
27
25
|
const onLinkClick = (item) => (event) => {
|
|
28
26
|
props.onResourceClick && props.onResourceClick(item);
|
|
29
|
-
dtmTrackEventCaseStartStopped('top content click', caseNumber, `${product}|${version}`);
|
|
30
27
|
};
|
|
31
28
|
const onToggle = (id) => {
|
|
32
29
|
if (id === expanded) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IDClassNameProps } from '@rh-support/types/shared';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
interface
|
|
3
|
+
export interface IWidgetFileSelectorProps extends IDClassNameProps {
|
|
4
4
|
isSessionId: boolean;
|
|
5
5
|
isPrivate: boolean;
|
|
6
6
|
isIdea?: boolean;
|
|
@@ -9,6 +9,6 @@ interface IProps extends IDClassNameProps {
|
|
|
9
9
|
fileName: string[];
|
|
10
10
|
};
|
|
11
11
|
}
|
|
12
|
-
declare function WidgetFileSelector({ id, className, isSessionId, isPrivate, isIdea, showFileExceed, }:
|
|
12
|
+
declare function WidgetFileSelector({ id, className, isSessionId, isPrivate, isIdea, showFileExceed, }: IWidgetFileSelectorProps): React.JSX.Element;
|
|
13
13
|
export default WidgetFileSelector;
|
|
14
14
|
//# sourceMappingURL=WidgetFileSelector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WidgetFileSelector.d.ts","sourceRoot":"","sources":["../../../../../../src/components/shared/fileUpload/fileSelectors/WidgetFileSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"WidgetFileSelector.d.ts","sourceRoot":"","sources":["../../../../../../src/components/shared/fileUpload/fileSelectors/WidgetFileSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG5D,OAAO,KAAqB,MAAM,OAAO,CAAC;AAS1C,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAC9D,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE;QACb,IAAI,EAAE,OAAO,CAAC;QACd,QAAQ,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;CACL;AAED,iBAAS,kBAAkB,CAAC,EACxB,EAAO,EACP,SAAc,EACd,WAAW,EACX,SAAiB,EACjB,MAAc,EACd,cAA8C,GACjD,EAAE,wBAAwB,qBAsF1B;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
import { humanizeSize } from '@rh-support/utils';
|
|
1
|
+
import { dtmTrackEventUploadFileToAnalyze, humanizeSize } from '@rh-support/utils';
|
|
2
|
+
import isEqual from 'lodash/isEqual';
|
|
2
3
|
import React, { useContext } from 'react';
|
|
3
4
|
import { useDropzone } from 'react-dropzone';
|
|
4
5
|
import { Trans, useTranslation } from 'react-i18next';
|
|
6
|
+
import { useCaseSelector } from '../../../../context/CaseContext';
|
|
7
|
+
import { RouteContext } from '../../../../context/RouteContext';
|
|
5
8
|
import { onDrop } from '../reducer/AttachmentHelper';
|
|
6
9
|
import { AttachmentDispatchContext } from '../reducer/AttachmentReducerContext';
|
|
7
10
|
function WidgetFileSelector({ id = '', className = '', isSessionId, isPrivate = false, isIdea = false, showFileExceed = { show: false, fileName: [] }, }) {
|
|
8
11
|
const { t } = useTranslation();
|
|
12
|
+
const { caseDetails } = useCaseSelector((state) => ({
|
|
13
|
+
caseDetails: state.caseDetails,
|
|
14
|
+
}), isEqual);
|
|
15
|
+
const { routeState: { activeSection, isCaseCreate }, } = useContext(RouteContext);
|
|
9
16
|
const MAX_SIZE = isIdea ? 5242880 : undefined;
|
|
10
17
|
// Attachment Reducer Related
|
|
11
18
|
const dispatchToAttachmentReducer = useContext(AttachmentDispatchContext);
|
|
@@ -23,6 +30,8 @@ function WidgetFileSelector({ id = '', className = '', isSessionId, isPrivate =
|
|
|
23
30
|
// react-dropzone doesn't get triggered. So we need to manually clear the input value
|
|
24
31
|
// so that user can attach the same file twice
|
|
25
32
|
inputRef.current.value = null;
|
|
33
|
+
// Call a dtm track even whenever the file uploader is clicked
|
|
34
|
+
dtmTrackEventUploadFileToAnalyze(isCaseCreate, activeSection, caseDetails.caseType, caseDetails.product, caseDetails.version);
|
|
26
35
|
};
|
|
27
36
|
return (React.createElement(React.Fragment, null,
|
|
28
37
|
React.createElement("label", Object.assign({ className: "file-diag-dragndrop", htmlFor: "file-diag-selector" }, getRootProps({ onClick: onLabelClick }), { "data-tracking-id": "file-selector-widget-main" }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WizardLayout.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/WizardLayout.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WizardLayout.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/WizardLayout.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,EAAuC,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAavG,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;CACpD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,qBA6KzC"}
|
|
@@ -11,7 +11,7 @@ import { Grid, GridItem } from '@patternfly/react-core';
|
|
|
11
11
|
import { SupportFeedbackForm } from '@rh-support/components';
|
|
12
12
|
import { fetchProducts, GlobalMetadataDispatchContext, GlobalMetadataStateContext } from '@rh-support/react-context';
|
|
13
13
|
import { ability, CaseListFields, resourceActions, resources } from '@rh-support/user-permissions';
|
|
14
|
-
import { getVersionIfOnlyVersion, pendoTrackEvent, PreviousCaseTypes } from '@rh-support/utils';
|
|
14
|
+
import { dtmTrackEventCaseCreationStepEncountered, getVersionIfOnlyVersion, pendoTrackEvent, PreviousCaseTypes, } from '@rh-support/utils';
|
|
15
15
|
import findIndex from 'lodash/findIndex';
|
|
16
16
|
import isEqual from 'lodash/isEqual';
|
|
17
17
|
import React, { useContext, useEffect, useRef, useState } from 'react';
|
|
@@ -80,6 +80,7 @@ export function WizardLayout(props) {
|
|
|
80
80
|
return isModalPresent;
|
|
81
81
|
};
|
|
82
82
|
const submitCaseAndNavigate = (isReSubmitting) => __awaiter(this, void 0, void 0, function* () {
|
|
83
|
+
var _a, _b;
|
|
83
84
|
confirmationModalType && setConfirmationModalType(null);
|
|
84
85
|
// if a confirmation modal exists, show it and don't submit the case as
|
|
85
86
|
// it will be handled by the confirmation modal itself
|
|
@@ -92,6 +93,8 @@ export function WizardLayout(props) {
|
|
|
92
93
|
React.createElement(SupportFeedbackForm, { isInline: true }),
|
|
93
94
|
" if you continue to see this message.")));
|
|
94
95
|
submitCase(caseDispatch, sessionRestoreDispatch, caseState, sessionItem, isCaseCreate, errorMessageCaseSubmit500, loggedInUser.data.ssoUsername, loggedInUsersAccount === null || loggedInUsersAccount === void 0 ? void 0 : loggedInUsersAccount.data.secureSupport, isReSubmitting || false);
|
|
96
|
+
const isCreatingCaseFlow = RouteUtils.getQueryParams(props.routeProps).caseCreate === 'true';
|
|
97
|
+
dtmTrackEventCaseCreationStepEncountered(isCreatingCaseFlow, 'submit', (_a = caseState.caseDetails) === null || _a === void 0 ? void 0 : _a.caseNumber, (_b = caseState.caseDetails) === null || _b === void 0 ? void 0 : _b.caseType, caseState.caseDetails.summary, caseState.caseDetails.product, caseState.caseDetails.version);
|
|
95
98
|
// reset viewedModals on case submit
|
|
96
99
|
viewedConfirmationModalsList.current = [];
|
|
97
100
|
!isReSubmitting &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WizardMain.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/WizardMain.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WizardMain.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/WizardMain.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAiD,MAAM,OAAO,CAAC;AAEtE,OAAO,EAAS,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAK9D,OAAO,EAAoB,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAQpF,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjD,qBAAqB,EAAE,CAAC,cAAc,EAAE,OAAO,KAAK,IAAI,CAAC;IACzD,mBAAmB,EAAE,CAAC,gCAAgC,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5E;AAED,iBAAS,UAAU,CAAC,KAAK,EAAE,MAAM,qBA2IhC;AACD,eAAe,UAAU,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Wizard, WizardContextConsumer, WizardFooter } from '@patternfly/react-core/deprecated';
|
|
2
2
|
import { LoadingIndicator } from '@rh-support/components';
|
|
3
|
+
import { dtmTrackEventCaseCreationStepEncountered } from '@rh-support/utils';
|
|
3
4
|
import isEqual from 'lodash/isEqual';
|
|
4
5
|
import React, { Suspense, useContext, useRef, useState } from 'react';
|
|
5
6
|
import { useTranslation } from 'react-i18next';
|
|
@@ -57,6 +58,10 @@ function WizardMain(props) {
|
|
|
57
58
|
return;
|
|
58
59
|
};
|
|
59
60
|
const onCurrentStepChanged = (step) => {
|
|
61
|
+
if (step.order === 0) {
|
|
62
|
+
const isCreatingCaseFlow = RouteUtils.getQueryParams(props.routeProps).caseCreate === 'true';
|
|
63
|
+
dtmTrackEventCaseCreationStepEncountered(isCreatingCaseFlow, 'start');
|
|
64
|
+
}
|
|
60
65
|
setActiveSectionChanged(dispatchToRouteReducer, step.id);
|
|
61
66
|
updateisNextBtnClickedToShowValidationError(dispatchToRouteReducer, false);
|
|
62
67
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WizardNavigation.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/WizardNavigation.tsx"],"names":[],"mappings":"AAOA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAE/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAOvD,OAAO,EAAoB,eAAe,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"WizardNavigation.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/WizardNavigation.tsx"],"names":[],"mappings":"AAOA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAE/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAOvD,OAAO,EAAoB,eAAe,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAM3G,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjD,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC3C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,mBAAmB,EAAE,CAAC,gCAAgC,EAAE,OAAO,KAAK,IAAI,CAAC;IACzE,gBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,0BAA0B,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IAC5E,kCAAkC,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACpF,qCAAqC,CAAC,EAAE,OAAO,CAAC;IAChD,gCAAgC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACjF,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,oBAAoB,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;CACxE;AAGD,iBAAS,gBAAgB,CAAC,KAAK,EAAE,MAAM,qBA6PtC;kBA7PQ,gBAAgB;;;AA+PzB,eAAe,gBAAgB,CAAC"}
|
|
@@ -11,7 +11,7 @@ import { pcm } from '@cee-eng/hydrajs';
|
|
|
11
11
|
import { Button, ButtonVariant } from '@patternfly/react-core';
|
|
12
12
|
import { useFetch } from '@rh-support/components';
|
|
13
13
|
import { GlobalMetadataStateContext, useCanCreateCase } from '@rh-support/react-context';
|
|
14
|
-
import {
|
|
14
|
+
import { dtmTrackEventCaseCreationStepEncountered, getResTypeFromUrl, scrollIntoView } from '@rh-support/utils';
|
|
15
15
|
import find from 'lodash/find';
|
|
16
16
|
import isEqual from 'lodash/isEqual';
|
|
17
17
|
import React, { useContext, useEffect, useState } from 'react';
|
|
@@ -23,6 +23,7 @@ import { SessionRestoreStateContext } from '../../context/SessionRestoreContext'
|
|
|
23
23
|
import { setCaseState } from '../../reducers/CaseReducer';
|
|
24
24
|
import { AppRouteSections } from '../../reducers/RouteConstNTypes';
|
|
25
25
|
import { updateisNextBtnClickedToShowValidationError } from '../../reducers/RouteReducer';
|
|
26
|
+
import RouteUtils from '../../utils/routeUtils';
|
|
26
27
|
import { RecommendationFeedbackModal } from '../Recommendations/RecommendationFeedbackModal';
|
|
27
28
|
import { useIsSectionValid } from '../shared/useIsSectionValid';
|
|
28
29
|
const defaultProps = {};
|
|
@@ -56,6 +57,11 @@ function WizardNavigation(props) {
|
|
|
56
57
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
57
58
|
}, []);
|
|
58
59
|
useEffect(() => {
|
|
60
|
+
var _a, _b;
|
|
61
|
+
const isCreatingCase = RouteUtils.getQueryParams(props.routeProps).caseCreate === 'true';
|
|
62
|
+
dtmTrackEventCaseCreationStepEncountered(isCreatingCase,
|
|
63
|
+
// @ts-ignore
|
|
64
|
+
props.activeStep.id, (_a = caseState.caseDetails) === null || _a === void 0 ? void 0 : _a.caseNumber, (_b = caseState.caseDetails) === null || _b === void 0 ? void 0 : _b.caseType, caseState.caseDetails.summary, caseState.caseDetails.product, caseState.caseDetails.version);
|
|
59
65
|
if (props.activeStep.id === AppRouteSections.TROUBLESHOOT) {
|
|
60
66
|
window.scrollTo({
|
|
61
67
|
top: 0,
|
|
@@ -70,16 +76,30 @@ function WizardNavigation(props) {
|
|
|
70
76
|
return;
|
|
71
77
|
}
|
|
72
78
|
const observer = new IntersectionObserver(([entry]) => {
|
|
73
|
-
if
|
|
74
|
-
|
|
79
|
+
// future debugging needs if resolution issue occurs
|
|
80
|
+
// console.log('Intersection status:', entry.isIntersecting);
|
|
81
|
+
// console.log('Intersection ratio:', entry.intersectionRatio);
|
|
82
|
+
// console.log({ hasUserScrolled });
|
|
83
|
+
const boundingRect = entry.boundingClientRect;
|
|
84
|
+
const isScrollingUp = boundingRect.top > 0;
|
|
85
|
+
const isAboveThreshold = entry.intersectionRatio >= 0.3;
|
|
86
|
+
isAboveThreshold && props.setUserCanNavigateToTroubleshoot(true);
|
|
87
|
+
isAboveThreshold && props.setUserSeenRecommendations(true);
|
|
88
|
+
// If scrolling up, always use the threshold check
|
|
89
|
+
if (isScrollingUp) {
|
|
90
|
+
setHasUserScrolled(isAboveThreshold);
|
|
91
|
+
props.setUserScrolledLabel(isAboveThreshold);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
// If scrolling down and we hit the threshold, set to true
|
|
95
|
+
if (isAboveThreshold) {
|
|
75
96
|
props.setUserScrolledLabel(true);
|
|
76
|
-
|
|
77
|
-
props.userClickedNextonRecommendationsFn(true);
|
|
78
|
-
}
|
|
97
|
+
props.userClickedNextonRecommendationsFn && props.userClickedNextonRecommendationsFn(true);
|
|
79
98
|
}
|
|
80
99
|
}, {
|
|
81
100
|
root: null,
|
|
82
|
-
threshold: 0.
|
|
101
|
+
threshold: [0, 0.3], // Changing threshold value to have its effect on pagination when page size is more than 10.
|
|
102
|
+
rootMargin: '0px',
|
|
83
103
|
});
|
|
84
104
|
const resultsRowElement = props.resultsRowRef.current;
|
|
85
105
|
if (resultsRowElement) {
|
|
@@ -90,30 +110,22 @@ function WizardNavigation(props) {
|
|
|
90
110
|
observer.unobserve(resultsRowElement);
|
|
91
111
|
}
|
|
92
112
|
};
|
|
93
|
-
}, [recommendationState.numFound,
|
|
113
|
+
}, [recommendationState.numFound, hasUserScrolled, props]);
|
|
94
114
|
const onNext = () => {
|
|
95
115
|
var _a;
|
|
96
116
|
updateisNextBtnClickedToShowValidationError(dispatchToRouteReducer, true);
|
|
97
117
|
//handle the new changes for 13406:
|
|
98
118
|
if (props.activeStep.id === AppRouteSections.SUMMARIZE && recommendationState.numFound > 2) {
|
|
99
|
-
if (!
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
});
|
|
107
|
-
}
|
|
119
|
+
if (!hasUserScrolled) {
|
|
120
|
+
scrollIntoView(props.resultsRowRef, {
|
|
121
|
+
navBarRef,
|
|
122
|
+
timeout: 0,
|
|
123
|
+
onlyIfNotInViewport: true,
|
|
124
|
+
offset: 120,
|
|
125
|
+
});
|
|
108
126
|
props.userClickedNextonRecommendationsFn && props.userClickedNextonRecommendationsFn(true);
|
|
109
127
|
return;
|
|
110
128
|
}
|
|
111
|
-
else {
|
|
112
|
-
props.setUserCanNavigateToTroubleshoot(true);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
props.setUserCanNavigateToTroubleshoot(true);
|
|
117
129
|
}
|
|
118
130
|
const userCanNotOpenCase = props.activeStep.id === AppRouteSections.TROUBLESHOOT && canCreateCase.alert();
|
|
119
131
|
if (userCanNotOpenCase || !isSectionValidFn(props.activeStep.id))
|
|
@@ -140,13 +152,11 @@ function WizardNavigation(props) {
|
|
|
140
152
|
props.onNext && props.onNext();
|
|
141
153
|
}
|
|
142
154
|
}
|
|
143
|
-
dtmTrackEventCaseStartStopped(`${props.activeStep.nextButtonLabel} button clicked on ${props.activeStep.name} step`, `${caseState.caseDetails.caseNumber}`, `${caseState.caseDetails.product}|${caseState.caseDetails.version}`);
|
|
144
155
|
return;
|
|
145
156
|
};
|
|
146
157
|
const onBack = () => {
|
|
147
158
|
if (props.activeStep.hidRestOnBack)
|
|
148
159
|
props.onShowRestUpdate(false);
|
|
149
|
-
dtmTrackEventCaseStartStopped(`${props.activeStep.nextButtonLabel} button clicked on ${props.activeStep.name} step`, '', `${caseState.caseDetails.product}|${caseState.caseDetails.version}`);
|
|
150
160
|
props.onBack();
|
|
151
161
|
};
|
|
152
162
|
const onRecsFeedbackModalToggle = () => {
|
|
@@ -50,7 +50,7 @@ export function useWizard(routeProps, props) {
|
|
|
50
50
|
: AlertType.DANGER, isInline: true, title: title, className: "pf-v5-u-mb-lg", "data-tracking-id": isLoading ? 'wait-recommendations-loading' : 'proceed-address-errors' }));
|
|
51
51
|
};
|
|
52
52
|
let summarizeNextButtonLabelLogic = () => {
|
|
53
|
-
return props.
|
|
53
|
+
return props.userScrolledLabel;
|
|
54
54
|
};
|
|
55
55
|
// components that are used in wizard steps
|
|
56
56
|
const appRouteConfugurations = {
|
|
@@ -36,7 +36,7 @@ export declare const deleteNotifiedUsers: (dispatch: CaseReducerDispatchType, ca
|
|
|
36
36
|
export declare const addingNotifiedUsers: (dispatch: CaseReducerDispatchType, caseNumber: string, addedUsers: IContact[]) => Promise<void>;
|
|
37
37
|
export declare const clearSelectedAccount: (dispatch: CaseReducerDispatchType) => void;
|
|
38
38
|
export declare const setCaseAccountNumber: (dispatch: CaseReducerDispatchType, accountNumber: string, isLoggedInUsersAccount?: boolean, loggedInUserAccount?: Partial<IAccount>) => Promise<void>;
|
|
39
|
-
export declare const setCaseOwner: (dispatch: CaseReducerDispatchType, owner: IContact, product: string, abortSignalCaseGroup?: AbortSignal, abortSignalEntitlements?: AbortSignal, setCaseGroupToUngroupedOrDefault?: boolean, caseGroupNumberToRestore?: string | undefined, canChangeGroup?: boolean) => Promise<void>;
|
|
39
|
+
export declare const setCaseOwner: (dispatch: CaseReducerDispatchType, owner: IContact, product: string, abortSignalCaseGroup?: AbortSignal, abortSignalEntitlements?: AbortSignal, setCaseGroupToUngroupedOrDefault?: boolean, caseGroupNumberToRestore?: string | undefined, canChangeGroup?: boolean, isUserUpdate?: boolean, caseNumber?: string) => Promise<void>;
|
|
40
40
|
export declare const fetchCaseGroupsForSSO: (dispatch: CaseReducerDispatchType, contactSsoUsername: string, setCaseGroupToUngroupedOrDefault?: boolean, abortSignal?: AbortSignal, caseGroupNumberToRestore?: string | undefined) => Promise<void>;
|
|
41
41
|
export declare const updateCaseWithSession: (dispatch: CaseReducerDispatchType, sessionItem: ISessionItem, loggedInUserAccountNumber: string, loggedInUserContact: IContact, loggedInUserAccount?: Partial<IAccount>) => Promise<void>;
|
|
42
42
|
export declare const fetchCaseDetails: (dispatch: CaseReducerDispatchType, caseNumber: string, loggedInUserRights: any, loggedInUser: any) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CaseReducer.d.ts","sourceRoot":"","sources":["../../../src/reducers/CaseReducer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,qDAAqD,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAEtH,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAA+B,MAAM,qCAAqC,CAAC;AAC9G,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAE/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAWxD,OAAO,EAEH,uBAAuB,EAEvB,UAAU,EAGb,MAAM,mBAAmB,CAAC;AAS3B,OAAO,EAAE,0BAA0B,EAAiB,MAAM,yBAAyB,CAAC;AAEpF,eAAO,MAAM,WAAW,WAAY,UAAU,UAAU,GAAG,KAAG,UAyN7D,CAAC;AAGF,eAAO,MAAM,cAAc,aAAc,uBAAuB,aAAa,OAAO,CAAC,YAAY,CAAC,SAEjG,CAAC;AAEF,eAAO,MAAM,YAAY,aAAc,uBAAuB,aAAa,OAAO,CAAC,UAAU,CAAC,SAE7F,CAAC;AAEF,eAAO,MAAM,eAAe,aAAc,uBAAuB,gCAAgC,QAAQ,EAAE,SAK1G,CAAC;AAEF,eAAO,MAAM,UAAU,aACT,uBAAuB,0BACT,0BAA0B,eACrC,UAAU,eACV,YAAY,gBACX,OAAO,mBACJ,MAAM,GAAG,GAAG,CAAC,OAAO,2BACZ,MAAM,mBACd,OAAO,cACZ,OAAO,kBA8CtB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oCAAoC,aAAc,uBAAuB,qBAUrF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,aAAc,uBAAuB,eAAe,OAAO,SAOpG,CAAC;AAEF,eAAO,MAAM,wBAAwB,aAAoB,uBAAuB,cAAc,MAAM,kBAsBnG,CAAC;AAGF,eAAO,MAAM,0BAA0B,oBAClB,OAAO,YACd,uBAAuB,0BACT,0BAA0B,eACrC,YAAY,cACb,MAAM,eACL,UAAU,kBAK1B,CAAC;AAGF,eAAO,MAAM,cAAc,2BACC,0BAA0B,eACrC,YAAY,cACb,MAAM,kBAQrB,CAAC;AAIF,eAAO,MAAM,cAAc,aACb,uBAAuB,cACrB,MAAM,cACN,WAAW,kBAoB1B,CAAC;AAEF,eAAO,MAAM,sBAAsB,aACrB,uBAAuB,QAC3B,mBAAmB,EAAE,sBACP,iBAAiB,EAAE,SAO1C,CAAC;AAEF,eAAO,MAAM,mBAAmB,aAAoB,uBAAuB,WAAW,MAAM,eAAe,MAAM,kBAYhH,CAAC;AAEF,eAAO,MAAM,kBAAkB,aACjB,uBAAuB,cACrB,MAAM,eACL,OAAO,CAAC,UAAU,CAAC,kBAmBnC,CAAC;AAEF,eAAO,MAAM,mBAAmB,aAClB,uBAAuB,cACrB,MAAM,gBACJ,MAAM,EAAE,kBAoBzB,CAAC;AAEF,eAAO,MAAM,mBAAmB,aAClB,uBAAuB,cACrB,MAAM,cACN,QAAQ,EAAE,kBAmBzB,CAAC;AAEF,eAAO,MAAM,oBAAoB,aAAc,uBAAuB,SASrE,CAAC;AAEF,eAAO,MAAM,oBAAoB,aACnB,uBAAuB,iBAClB,MAAM,0DAEA,OAAO,CAAC,QAAQ,CAAC,kBA8CzC,CAAC;AAEF,eAAO,MAAM,YAAY,aACX,uBAAuB,SAC1B,QAAQ,WACN,MAAM,yBACQ,WAAW,4BACR,WAAW,yEAEV,MAAM,GAAG,SAAS,mBAC7B,OAAO,
|
|
1
|
+
{"version":3,"file":"CaseReducer.d.ts","sourceRoot":"","sources":["../../../src/reducers/CaseReducer.ts"],"names":[],"mappings":"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"}
|