@rh-support/troubleshoot 2.6.118 → 2.6.120
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/AccountSelector.js +1 -1
- package/lib/esm/components/AccountInfo/css/accountSelector.css +3 -2
- package/lib/esm/components/CaseEditView/Case.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/Case.js +1 -1
- package/lib/esm/components/CaseEditView/CaseOverview/CaseOwnerInfo.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/CaseOverview/CaseOwnerInfo.js +1 -1
- package/lib/esm/components/CaseEditView/CaseOverview/CaseType.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/CaseOverview/CaseType.js +2 -4
- package/lib/esm/components/CaseEditView/CaseOverview/index.js +2 -2
- package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseOpenshiftClusterId/CaseOpenShiftPopover.js +1 -1
- package/lib/esm/components/CaseEditView/Tabs/CaseDetails/ProductVersion.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/Tabs/CaseDetails/ProductVersion.js +4 -2
- package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment.js +2 -1
- package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/VerifyCaseStatusModal/VerifyCaseStatusModal.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/VerifyCaseStatusModal/VerifyCaseStatusModal.js +2 -3
- package/lib/esm/components/CaseEditView/Tabs/CaseHistory/Timeline.css +13 -33
- package/lib/esm/components/CaseEditView/Tabs/CaseSummary/CaseSummary.js +3 -3
- package/lib/esm/components/CaseEditView/Tabs/CaseSummary/CaseSummaryErrorMessage.js +1 -1
- package/lib/esm/components/CaseEditView/Tabs/RelatedTasks/RelatedTasks.js +1 -1
- package/lib/esm/components/CaseInformation/CaseGroup.d.ts.map +1 -1
- package/lib/esm/components/CaseInformation/CaseGroup.js +11 -1
- package/lib/esm/components/CaseInformation/CaseInformation.d.ts.map +1 -1
- package/lib/esm/components/CaseInformation/CaseInformation.js +4 -4
- package/lib/esm/components/CaseInformation/Description.d.ts.map +1 -1
- package/lib/esm/components/CaseInformation/Description.js +1 -3
- package/lib/esm/components/CaseInformation/Severity.d.ts.map +1 -1
- package/lib/esm/components/CaseInformation/Severity.js +1 -1
- package/lib/esm/components/CaseInformation/SupportLevel.d.ts.map +1 -1
- package/lib/esm/components/CaseInformation/SupportLevel.js +1 -1
- package/lib/esm/components/CaseManagement/OpenshiftDropdownV4.d.ts.map +1 -1
- package/lib/esm/components/CaseManagement/OpenshiftDropdownV4.js +12 -6
- package/lib/esm/components/IdeaInformation/IdeaInformation.d.ts.map +1 -1
- package/lib/esm/components/IdeaInformation/IdeaInformation.js +4 -4
- package/lib/esm/components/OpenCase/OpenCase.d.ts.map +1 -1
- package/lib/esm/components/OpenCase/OpenCase.js +8 -2
- package/lib/esm/components/ProductSelector/AllProductsSelector.d.ts.map +1 -1
- package/lib/esm/components/ProductSelector/AllProductsSelector.js +18 -6
- package/lib/esm/components/ProductSelector/ProductSelector.d.ts.map +1 -1
- package/lib/esm/components/ProductSelector/ProductSelector.js +12 -5
- package/lib/esm/components/Recommendations/ClusterRecommendationItems.d.ts +2 -0
- package/lib/esm/components/Recommendations/ClusterRecommendationItems.d.ts.map +1 -1
- package/lib/esm/components/Recommendations/ClusterRecommendationItems.js +16 -13
- package/lib/esm/components/Recommendations/ClusterRecommendations.d.ts.map +1 -1
- package/lib/esm/components/Recommendations/ClusterRecommendations.js +1 -4
- package/lib/esm/components/Recommendations/Recommendations.d.ts.map +1 -1
- package/lib/esm/components/Recommendations/Recommendations.js +38 -38
- package/lib/esm/components/RemoteRider/RemoteRiderAcceptanceModal.d.ts.map +1 -1
- package/lib/esm/components/Review/Review.d.ts.map +1 -1
- package/lib/esm/components/Review/Review.js +5 -1
- package/lib/esm/components/TroubleshootSection/AskRedHat.js +1 -1
- package/lib/esm/components/TroubleshootSection/TroubleshootSection.d.ts +0 -9
- package/lib/esm/components/TroubleshootSection/TroubleshootSection.d.ts.map +1 -1
- package/lib/esm/components/TroubleshootSection/TroubleshootSection.js +44 -150
- package/lib/esm/components/shared/useIsSectionValid.d.ts.map +1 -1
- package/lib/esm/components/shared/useIsSectionValid.js +71 -32
- package/lib/esm/components/wizardLayout/WizardAside.d.ts.map +1 -1
- package/lib/esm/components/wizardLayout/WizardAside.js +9 -18
- package/lib/esm/components/wizardLayout/WizardMain.d.ts.map +1 -1
- package/lib/esm/components/wizardLayout/WizardMain.js +64 -110
- package/lib/esm/components/wizardLayout/WizardNavigation.d.ts.map +1 -1
- package/lib/esm/components/wizardLayout/WizardNavigation.js +53 -59
- package/lib/esm/css/AskRedHat.css +2 -9
- package/lib/esm/css/app.css +1 -1
- package/lib/esm/hooks/useWizard.d.ts +0 -4
- package/lib/esm/hooks/useWizard.d.ts.map +1 -1
- package/lib/esm/hooks/useWizard.js +6 -20
- package/lib/esm/reducers/AIResponseConstNTypes.d.ts +2 -17
- package/lib/esm/reducers/AIResponseConstNTypes.d.ts.map +1 -1
- package/lib/esm/reducers/AIResponseConstNTypes.js +0 -3
- package/lib/esm/reducers/AIResponseReducer.d.ts +0 -2
- package/lib/esm/reducers/AIResponseReducer.d.ts.map +1 -1
- package/lib/esm/reducers/AIResponseReducer.js +0 -17
- package/lib/esm/reducers/CaseConstNTypes.js +3 -3
- package/lib/esm/reducers/CaseDiscussionTabReducer.js +1 -1
- package/lib/esm/reducers/CaseHelpers.d.ts +8 -6
- package/lib/esm/reducers/CaseHelpers.d.ts.map +1 -1
- package/lib/esm/reducers/CaseHelpers.js +20 -10
- package/lib/esm/reducers/CaseReducer.d.ts +1 -0
- package/lib/esm/reducers/CaseReducer.d.ts.map +1 -1
- package/lib/esm/reducers/CaseReducer.js +37 -2
- package/lib/esm/reducers/RouteConstNTypes.d.ts.map +1 -1
- package/lib/esm/reducers/RouteConstNTypes.js +1 -0
- package/lib/esm/scss/_pf-overrides.scss +23 -2
- package/package.json +7 -9
- package/lib/esm/components/Suggestions/TopContentSidebar.d.ts +0 -3
- package/lib/esm/components/Suggestions/TopContentSidebar.d.ts.map +0 -1
- package/lib/esm/components/Suggestions/TopContentSidebar.js +0 -26
- package/lib/esm/hooks/useAB.d.ts +0 -22
- package/lib/esm/hooks/useAB.d.ts.map +0 -1
- package/lib/esm/hooks/useAB.js +0 -37
|
@@ -33,10 +33,11 @@ const AllProductsSelector = forwardRef((props, ref) => {
|
|
|
33
33
|
var _a, _b;
|
|
34
34
|
const { globalMetadataState: { allProducts, loggedInUserRights }, } = useContext(GlobalMetadataStateContext);
|
|
35
35
|
const caseDispatch = useCaseDispatch();
|
|
36
|
-
const { product, version, contactSSOName } = useCaseSelector((state) => ({
|
|
36
|
+
const { product, version, contactSSOName, ABTestVariation } = useCaseSelector((state) => ({
|
|
37
37
|
product: state.caseDetails.product,
|
|
38
38
|
version: state.caseDetails.version,
|
|
39
39
|
contactSSOName: state.caseDetails.contactSSOName,
|
|
40
|
+
ABTestVariation: state.ABTestVariation,
|
|
40
41
|
}), isEqual);
|
|
41
42
|
const { topContentState: { topContent }, } = useContext(TCStateContext);
|
|
42
43
|
const { routeState: { activeSection, isCaseCreate }, } = useContext(RouteContext);
|
|
@@ -79,14 +80,25 @@ const AllProductsSelector = forwardRef((props, ref) => {
|
|
|
79
80
|
RouteUtils.updateQueryParams(props.routeProps, newParams);
|
|
80
81
|
}
|
|
81
82
|
const entitledProducts = filter(allProducts.data.productsResult, (p) => p.isEntitledProduct);
|
|
83
|
+
const isATestvariation = ABTestVariation === 'A';
|
|
84
|
+
const isBTestvariation = ABTestVariation === 'B' || isEmpty(ABTestVariation);
|
|
85
|
+
// Determine whether to render the ProductVersionDropdownSelector
|
|
82
86
|
const renderProductVersionDropdownSelector = (activeSection === (isCaseCreate ? AppRouteSections.SUMMARIZE : AppRouteSections.TROUBLESHOOT) &&
|
|
83
87
|
!props.caseCreateExperience) ||
|
|
84
88
|
activeSection === AppRouteSections.GET_SUPPORT ||
|
|
85
|
-
|
|
86
|
-
props.isOnReviewPage;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
activeSection === AppRouteSections.
|
|
89
|
+
isBTestvariation ||
|
|
90
|
+
(isATestvariation && (props.isOnGetSupportPage || props.isOnReviewPage));
|
|
91
|
+
// Determine whether to render the OpenCaseIssue component
|
|
92
|
+
const renderOpenCaseIssue = (isBTestvariation &&
|
|
93
|
+
(activeSection === (isCaseCreate ? AppRouteSections.SUMMARIZE : AppRouteSections.TROUBLESHOOT) ||
|
|
94
|
+
activeSection === AppRouteSections.REVIEW ||
|
|
95
|
+
activeSection === AppRouteSections.SUBMIT_CASE)) ||
|
|
96
|
+
(isATestvariation &&
|
|
97
|
+
(activeSection === (isCaseCreate ? AppRouteSections.SUMMARIZE : AppRouteSections.TROUBLESHOOT) ||
|
|
98
|
+
activeSection === AppRouteSections.REVIEW ||
|
|
99
|
+
activeSection === AppRouteSections.SUBMIT_CASE)) ||
|
|
100
|
+
(!props.caseCreateExperience &&
|
|
101
|
+
activeSection === (isCaseCreate ? AppRouteSections.SUMMARIZE : AppRouteSections.TROUBLESHOOT));
|
|
90
102
|
return (React.createElement(React.Fragment, null,
|
|
91
103
|
renderProductVersionDropdownSelector && (React.createElement("div", { className: "form-group product-selector-wrapper" },
|
|
92
104
|
React.createElement("div", { className: "all-product-selector-dropdown" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductSelector.d.ts","sourceRoot":"","sources":["../../../../src/components/ProductSelector/ProductSelector.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAwC,MAAM,OAAO,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"ProductSelector.d.ts","sourceRoot":"","sources":["../../../../src/components/ProductSelector/ProductSelector.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAwC,MAAM,OAAO,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAOlE,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,gCAAgC,CAAC,EAAE,OAAO,CAAC;IAC3C,aAAa,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC9D,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,KAAK,EAAE,MAAM,qBA0GpD"}
|
|
@@ -8,12 +8,13 @@ import React, { useContext, useEffect, useRef } from 'react';
|
|
|
8
8
|
import { Trans, useTranslation } from 'react-i18next';
|
|
9
9
|
import { useCaseDispatch, useCaseSelector } from '../../context/CaseContext';
|
|
10
10
|
import { RouteContext } from '../../context/RouteContext';
|
|
11
|
-
import { useAB } from '../../hooks/useAB';
|
|
12
11
|
import { useFetchCVEData } from '../../hooks/useFetchCVEData';
|
|
13
12
|
import { setCaseState } from '../../reducers/CaseReducer';
|
|
14
13
|
import { CveModal } from '../Cve/CveModal';
|
|
14
|
+
import { EARuleWidget } from '../Recommendations/EARules/EARuleWidget';
|
|
15
15
|
import Recommendations from '../Recommendations/Recommendations';
|
|
16
16
|
import { AllProductsSelector } from './AllProductsSelector';
|
|
17
|
+
import { ProductSelectorLoader } from './ProductSelectorLoader';
|
|
17
18
|
/**
|
|
18
19
|
* Responsible for:
|
|
19
20
|
* # Setting case state with product version from url.
|
|
@@ -25,16 +26,18 @@ import { AllProductsSelector } from './AllProductsSelector';
|
|
|
25
26
|
export default function ProductSelector(props) {
|
|
26
27
|
const { cveRecommendation } = useFetchCVEData();
|
|
27
28
|
const { t } = useTranslation();
|
|
28
|
-
const { isVariationA } = useAB();
|
|
29
29
|
const { globalMetadataState: { allProducts, pcmConfig }, } = useContext(GlobalMetadataStateContext);
|
|
30
|
-
const { product, version } = useCaseSelector((state) => ({
|
|
30
|
+
const { product, version, ABTestVariation } = useCaseSelector((state) => ({
|
|
31
31
|
product: state.caseDetails.product,
|
|
32
32
|
version: state.caseDetails.version,
|
|
33
|
+
ABTestVariation: state.ABTestVariation,
|
|
33
34
|
}), isEqual);
|
|
34
35
|
const { routeState: { isCaseCreate }, } = useContext(RouteContext);
|
|
35
36
|
const caseDispatch = useCaseDispatch();
|
|
36
37
|
const cveModalEnabledConfig = getConfigField(pcmConfig.data, 'isCVEModalEnabled', PCM_CONFIG_FIELD_TYPE.STRING);
|
|
37
38
|
const isCVEModalEnabled = cveModalEnabledConfig === '1';
|
|
39
|
+
const isATestvariation = ABTestVariation === 'A';
|
|
40
|
+
const isBTestvariation = ABTestVariation === 'B' || isEmpty(ABTestVariation);
|
|
38
41
|
useEffect(() => {
|
|
39
42
|
if (!isCVEModalEnabled) {
|
|
40
43
|
setCaseState(caseDispatch, {
|
|
@@ -53,8 +56,11 @@ export default function ProductSelector(props) {
|
|
|
53
56
|
(cveRecommendation === null || cveRecommendation === void 0 ? void 0 : cveRecommendation.length) !== 0 && isCVEModalEnabled && React.createElement(CveModal, null),
|
|
54
57
|
React.createElement(AllProductsSelector, { routeProps: props.routeProps, checkEntitledProduct: isCaseCreate ? true : false, ref: productSelectorRef, isOnSummaryPage: true, isOnGetSupportPage: props === null || props === void 0 ? void 0 : props.isOnGetSupportPage, caseCreateExperience: props.caseCreateExperience })));
|
|
55
58
|
return (React.createElement(React.Fragment, null,
|
|
59
|
+
isBTestvariation && allProducts.isFetching && React.createElement(ProductSelectorLoader, null),
|
|
56
60
|
React.createElement(AlertMessage, { variant: AlertType.DANGER, className: "pf-v6-u-mt-lg", title: t('There was an error loading products.'), show: allProducts.isError }),
|
|
57
|
-
|
|
61
|
+
isBTestvariation
|
|
62
|
+
? !allProducts.isFetching && !allProducts.isError && rederProductSelect
|
|
63
|
+
: isATestvariation && rederProductSelect,
|
|
58
64
|
product === 'Subscription Watch' && (React.createElement(Alert, { isInline: true, variant: AlertVariant.warning, title: React.createElement(Trans, null,
|
|
59
65
|
' ',
|
|
60
66
|
"If you're having a subscription issue that doesn't relate to",
|
|
@@ -65,7 +71,8 @@ export default function ProductSelector(props) {
|
|
|
65
71
|
React.createElement("a", { href: "/support/contact", "data-tracking-id": "contact-customer-service" }, "customer service"),
|
|
66
72
|
' ',
|
|
67
73
|
"for help.") })),
|
|
68
|
-
|
|
74
|
+
isBTestvariation && React.createElement(EARuleWidget, null),
|
|
75
|
+
!(props === null || props === void 0 ? void 0 : props.isOnGetSupportPage) && (React.createElement("div", { className: "suggestions-result-section" },
|
|
69
76
|
React.createElement(ErrorBoundary, { errorMsgInfo: { message: t('There was an error loading recommendations') } }, !isEmpty(version) && (React.createElement("div", { className: "common-suggestions" },
|
|
70
77
|
React.createElement(Recommendations, { routeProps: props.routeProps, userSeenRecommendations: props.userSeenRecommendations, userClickedNextonRecommendationsValue: props.userClickedNextonRecommendations, resultsRowRef: props.resultsRowRef }))))))));
|
|
71
78
|
}
|
|
@@ -2,6 +2,8 @@ import { IClusterRecommendation } from '@cee-eng/hydrajs/@types/api/pcm/preCaseD
|
|
|
2
2
|
import React from 'react';
|
|
3
3
|
interface IProps {
|
|
4
4
|
clusterRecommendations: IClusterRecommendation[];
|
|
5
|
+
onViewMoreRecommendation?: () => void;
|
|
6
|
+
displayVeiwMoreBtn?: boolean;
|
|
5
7
|
}
|
|
6
8
|
export declare function ClusterRecommendationItems(props: IProps): React.JSX.Element;
|
|
7
9
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClusterRecommendationItems.d.ts","sourceRoot":"","sources":["../../../../src/components/Recommendations/ClusterRecommendationItems.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oDAAoD,CAAC;AAI5F,OAAO,KAAgC,MAAM,OAAO,CAAC;AAYrD,UAAU,MAAM;IACZ,sBAAsB,EAAE,sBAAsB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ClusterRecommendationItems.d.ts","sourceRoot":"","sources":["../../../../src/components/Recommendations/ClusterRecommendationItems.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oDAAoD,CAAC;AAI5F,OAAO,KAAgC,MAAM,OAAO,CAAC;AAYrD,UAAU,MAAM;IACZ,sBAAsB,EAAE,sBAAsB,EAAE,CAAC;IACjD,wBAAwB,CAAC,EAAE,MAAM,IAAI,CAAC;IACtC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,qBA4FvD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { pcm } from '@cee-eng/hydrajs';
|
|
2
|
-
import { Label } from '@patternfly/react-core';
|
|
2
|
+
import { Button, Label } from '@patternfly/react-core';
|
|
3
3
|
import ArrowRightIcon from '@patternfly/react-icons/dist/js/icons/arrow-right-icon';
|
|
4
4
|
import isEqual from 'lodash/isEqual';
|
|
5
5
|
import React, { useContext, useEffect } from 'react';
|
|
@@ -29,16 +29,19 @@ export function ClusterRecommendationItems(props) {
|
|
|
29
29
|
createOrUpdateSessionResources(sessionRestoreDispatch, activeSessionId, sessionResourceTracking, SessionResourceSource.CLUSTER_RECOMMENDATION, getRulesToSave('', '', recsWithUrl), JSON.stringify({ product, version, openshiftClusterID }));
|
|
30
30
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
31
31
|
}, [props.clusterRecommendations, activeSessionId]);
|
|
32
|
-
return (React.createElement("pfe-accordion", null,
|
|
33
|
-
React.createElement(
|
|
34
|
-
React.createElement("
|
|
35
|
-
|
|
36
|
-
React.createElement("
|
|
37
|
-
React.createElement(
|
|
38
|
-
React.createElement(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
React.createElement(
|
|
42
|
-
|
|
43
|
-
|
|
32
|
+
return (React.createElement("pfe-accordion", null,
|
|
33
|
+
props.clusterRecommendations.map((rule, i) => (React.createElement(React.Fragment, null,
|
|
34
|
+
React.createElement("pfe-accordion-header", null,
|
|
35
|
+
React.createElement("p", null, rule.description)),
|
|
36
|
+
React.createElement("pfe-accordion-panel", null,
|
|
37
|
+
React.createElement("p", null,
|
|
38
|
+
React.createElement(Label, { icon: riskLabels[rule.total_risk].icon, className: riskLabels[rule.total_risk].className },
|
|
39
|
+
React.createElement(Trans, null, riskLabels[rule.total_risk].label))),
|
|
40
|
+
React.createElement("p", null, rule.details || ''),
|
|
41
|
+
React.createElement("a", { onClick: (e) => onResourceClick(e, rule, i), className: "pf-v6-u-font-weight-bold", "data-tracking-id": "cluster-recommendations", href: detailsUrl, target: "_blank", rel: "noopener noreferrer" },
|
|
42
|
+
React.createElement(Trans, null,
|
|
43
|
+
"View details and remediation steps ",
|
|
44
|
+
React.createElement(ArrowRightIcon, { "aria-hidden": "true" }))))))),
|
|
45
|
+
props.displayVeiwMoreBtn && (React.createElement(Button, { className: "pf-v6-u-p-md", variant: "link", onClick: props.onViewMoreRecommendation, "data-tracking-id": "cluster-recs-view-more" },
|
|
46
|
+
React.createElement(Trans, null, "View more recommendations")))));
|
|
44
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClusterRecommendations.d.ts","sourceRoot":"","sources":["../../../../src/components/Recommendations/ClusterRecommendations.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ClusterRecommendations.d.ts","sourceRoot":"","sources":["../../../../src/components/Recommendations/ClusterRecommendations.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAa1C,UAAU,MAAM;IACZ,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,8BAA8B,CAAC,EAAE,OAAO,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,KAAK,EAAE,MAAM,qBAuD3D"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Button } from '@patternfly/react-core';
|
|
2
1
|
import { GlobalMetadataStateContext } from '@rh-support/react-context';
|
|
3
2
|
import isEqual from 'lodash/isEqual';
|
|
4
3
|
import React, { useContext } from 'react';
|
|
@@ -35,8 +34,6 @@ export default function ClusterRecommendations(props) {
|
|
|
35
34
|
React.createElement("h3", { className: "card-heading popular-solutions" },
|
|
36
35
|
React.createElement(Trans, null, "Cluster recommendations")),
|
|
37
36
|
React.createElement("div", null,
|
|
38
|
-
React.createElement(ClusterRecommendationItems, { clusterRecommendations: clusterRecommendations.data.slice(0, NUMBER_OF_RULES_TO_DISPLAY) }),
|
|
39
|
-
clusterRecommendations.data.length > NUMBER_OF_RULES_TO_DISPLAY && (React.createElement(Button, { className: "pf-v6-u-p-md", variant: "link", isBlock: true, onClick: onViewMoreRecommendation, "data-tracking-id": "cluster-recs-view-more" },
|
|
40
|
-
React.createElement(Trans, null, "View more recommendations")))))),
|
|
37
|
+
React.createElement(ClusterRecommendationItems, { clusterRecommendations: clusterRecommendations.data.slice(0, NUMBER_OF_RULES_TO_DISPLAY), onViewMoreRecommendation: onViewMoreRecommendation, displayVeiwMoreBtn: clusterRecommendations.data.length > NUMBER_OF_RULES_TO_DISPLAY })))),
|
|
41
38
|
showClusterRecommendationsModal && React.createElement(ClusterRecommendationsModal, null)));
|
|
42
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Recommendations.d.ts","sourceRoot":"","sources":["../../../../src/components/Recommendations/Recommendations.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"Recommendations.d.ts","sourceRoot":"","sources":["../../../../src/components/Recommendations/Recommendations.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAevD,OAAO,EAAoB,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAapF,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+YpD"}
|
|
@@ -2,7 +2,7 @@ import { pcm } from '@cee-eng/hydrajs';
|
|
|
2
2
|
import { Label, Pagination, PaginationVariant, Popover, Spinner } from '@patternfly/react-core';
|
|
3
3
|
import InfoCircleIcon from '@patternfly/react-icons/dist/js/icons/info-circle-icon';
|
|
4
4
|
import StarIcon from '@patternfly/react-icons/dist/js/icons/star-icon';
|
|
5
|
-
import { useDebounce, usePrevious } from '@rh-support/components';
|
|
5
|
+
import { LoadingDots, useDebounce, usePrevious } from '@rh-support/components';
|
|
6
6
|
import { computeRecommendationAbstract, computeRecommendationTitle, dtmTrackEventContentListingItemClicked, formatDate, getRecommendationTitle, } from '@rh-support/utils';
|
|
7
7
|
import differenceBy from 'lodash/differenceBy';
|
|
8
8
|
import find from 'lodash/find';
|
|
@@ -15,7 +15,6 @@ import { useCaseDispatch, useCaseSelector } from '../../context/CaseContext';
|
|
|
15
15
|
import { RecommendationDispatchContext, RecommendationStateContext } from '../../context/RecommendationContext';
|
|
16
16
|
import { RouteContext } from '../../context/RouteContext';
|
|
17
17
|
import { SessionRestoreDispatchContext, SessionRestoreStateContext } from '../../context/SessionRestoreContext';
|
|
18
|
-
import { useAB } from '../../hooks/useAB';
|
|
19
18
|
import { getRecommendationObject } from '../../reducers/CaseHelpers';
|
|
20
19
|
import { setCaseRecommendations } from '../../reducers/CaseReducer';
|
|
21
20
|
import { fetchWatsonXRecommendations, RecommendationsConstants, setCurrentPage, setVisibleDocs, } from '../../reducers/RecommendationsReducer';
|
|
@@ -28,14 +27,14 @@ import { WatsonxAiIcon } from './WatsonxAiIcon';
|
|
|
28
27
|
const { SessionResourceSource, SessionResourceVisibility } = pcm.preCase.session;
|
|
29
28
|
export default function Recommendations(props) {
|
|
30
29
|
var _a, _b, _c;
|
|
31
|
-
const {
|
|
32
|
-
const { product, version, environment, summary, caseResourceLinks, issue, cveWorkflowRecommendation } = useCaseSelector((state) => ({
|
|
30
|
+
const { product, version, environment, summary, caseResourceLinks, issue, ABTestVariation, cveWorkflowRecommendation, } = useCaseSelector((state) => ({
|
|
33
31
|
product: state.caseDetails.product,
|
|
34
32
|
version: state.caseDetails.version,
|
|
35
33
|
environment: state.caseDetails.environment,
|
|
36
34
|
summary: state.caseDetails.summary,
|
|
37
35
|
issue: state.caseDetails.issue,
|
|
38
36
|
caseResourceLinks: state.caseDetails.caseResourceLinks,
|
|
37
|
+
ABTestVariation: state.ABTestVariation,
|
|
39
38
|
cveWorkflowRecommendation: state.cveWorkflowRecommendation,
|
|
40
39
|
}), isEqual);
|
|
41
40
|
const caseDispatch = useCaseDispatch();
|
|
@@ -47,7 +46,7 @@ export default function Recommendations(props) {
|
|
|
47
46
|
const { recommendationState } = useContext(RecommendationStateContext);
|
|
48
47
|
const prevMainRecommendations = usePrevious((_a = recommendationState === null || recommendationState === void 0 ? void 0 : recommendationState.visibleDocs) !== null && _a !== void 0 ? _a : []);
|
|
49
48
|
const recommendationDispatch = useContext(RecommendationDispatchContext);
|
|
50
|
-
const DEFAULTPAGESIZE =
|
|
49
|
+
const DEFAULTPAGESIZE = 8;
|
|
51
50
|
const MAXROW = 24;
|
|
52
51
|
const recPageSize = pageSize !== null && pageSize !== void 0 ? pageSize : DEFAULTPAGESIZE;
|
|
53
52
|
const abortControllerRef = useRef(undefined);
|
|
@@ -57,17 +56,16 @@ export default function Recommendations(props) {
|
|
|
57
56
|
summary: summary,
|
|
58
57
|
description: issue, // we don't need to truncate to 20k as Watsonx max recs is 4000 done for us already
|
|
59
58
|
};
|
|
59
|
+
const isATestvariation = ABTestVariation === 'A';
|
|
60
|
+
const isBTestvariation = ABTestVariation === 'B' || isEmpty(ABTestVariation);
|
|
60
61
|
const isRecSearchPayloadSame = isEqual(payload, recommendationState.prevRecommendationsBody);
|
|
61
62
|
useEffect(() => {
|
|
62
63
|
// currently due to the debounce we use after the page load leads to some delay in the disbaling of next button
|
|
63
64
|
// since the state of the next button depends on the loading rec flag so we force the flag to be true every time the
|
|
64
65
|
// rec section is rendered for the first time except the case when we won't make a new search since there was no change in the rec payload.
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
? [AppRouteSections.SUMMARIZE]
|
|
69
|
-
: [AppRouteSections.TROUBLESHOOT];
|
|
70
|
-
if (!validSections.includes(activeSection) || !summary || isRecSearchPayloadSame) {
|
|
66
|
+
if (activeSection !== (isCaseCreate ? AppRouteSections.SUMMARIZE : AppRouteSections.TROUBLESHOOT) ||
|
|
67
|
+
!summary ||
|
|
68
|
+
isRecSearchPayloadSame) {
|
|
71
69
|
return;
|
|
72
70
|
}
|
|
73
71
|
!isRecSearchPayloadSame &&
|
|
@@ -82,12 +80,8 @@ export default function Recommendations(props) {
|
|
|
82
80
|
* Also, log the newly presented resources on the session
|
|
83
81
|
*/
|
|
84
82
|
useDebounce(() => {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
: isCaseCreate
|
|
88
|
-
? [AppRouteSections.SUMMARIZE]
|
|
89
|
-
: [AppRouteSections.TROUBLESHOOT];
|
|
90
|
-
if (!validSections.includes(activeSection) || isRecSearchPayloadSame) {
|
|
83
|
+
if (activeSection !== (isCaseCreate ? AppRouteSections.SUMMARIZE : AppRouteSections.TROUBLESHOOT) ||
|
|
84
|
+
isRecSearchPayloadSame) {
|
|
91
85
|
return;
|
|
92
86
|
}
|
|
93
87
|
setCurrentPage(recommendationDispatch, 1);
|
|
@@ -187,33 +181,39 @@ export default function Recommendations(props) {
|
|
|
187
181
|
t('Match')))));
|
|
188
182
|
};
|
|
189
183
|
return (React.createElement(React.Fragment, null,
|
|
184
|
+
isBTestvariation && (React.createElement(LoadingDots, { className: "recommendation-loading-dots", show: recommendationState.isLoadingRecommendations && !isEmpty(summary) })),
|
|
190
185
|
React.createElement("div", { className: "recommendation-list", ref: props.resultsRowRef },
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
recommendationState.isLoadingRecommendations
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
" ",
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
186
|
+
isATestvariation
|
|
187
|
+
? (recommendationState.visibleDocs.length !== 0 ||
|
|
188
|
+
recommendationState.isLoadingRecommendations) && (React.createElement("div", { className: `${recommendationState.isLoadingRecommendations ? 'gradient' : ''} label-container-icon` },
|
|
189
|
+
React.createElement("div", { id: "DeepPurpleColorAILabel" },
|
|
190
|
+
recommendationState.isLoadingRecommendations ? (React.createElement(React.Fragment, null,
|
|
191
|
+
React.createElement("span", { className: "loading-text" },
|
|
192
|
+
React.createElement(Spinner, { size: "sm", className: "pf-v6-u-mr-xs" }),
|
|
193
|
+
' ',
|
|
194
|
+
React.createElement(Trans, null, recommendationState.visibleDocs.length
|
|
195
|
+
? 'Updating recommendations '
|
|
196
|
+
: 'Recommending articles '),
|
|
197
|
+
' ',
|
|
198
|
+
React.createElement(InfoCircleIcon, { color: "#5E40BE" })))) : (React.createElement(React.Fragment, null,
|
|
199
|
+
React.createElement("span", { className: "ai-label-text" },
|
|
200
|
+
React.createElement(WatsonxAiIcon, { fillColor: "#FFFFFF", className: "pf-v6-u-mr-xs" }),
|
|
201
|
+
' ',
|
|
202
|
+
React.createElement("span", { className: "ai-label-text1" },
|
|
203
|
+
React.createElement(Trans, null, "Recommended search results"),
|
|
204
|
+
" ",
|
|
205
|
+
infoPopover)))),
|
|
206
|
+
' ')))
|
|
207
|
+
: recommendationState.visibleDocs.length !== 0 && (React.createElement(Label, { color: "purple", className: "pf-v6-u-mb-md" },
|
|
208
|
+
React.createElement(WatsonxAiIcon, { fillColor: "#6753ac", className: "pf-v6-u-mr-xs" }),
|
|
209
|
+
React.createElement(Trans, null, "Live search results powered by OpenShift AI"))),
|
|
210
|
+
isATestvariation && recommendationState.isLoadingRecommendations ? (React.createElement(RecommendationsLoader, null)) : (React.createElement("ul", { className: "list-flat" }, map(recommendationState.visibleDocs, (doc, i) => {
|
|
211
211
|
var _a, _b;
|
|
212
212
|
return (React.createElement("li", { className: "result", key: doc.id },
|
|
213
213
|
React.createElement("header", { className: "result-header" },
|
|
214
214
|
React.createElement("a", { href: `${doc.view_uri}?${RouteUtils.getSEResourceQueryParams(activeSessionId, (_b = (_a = sessionResourceTracking[SessionResourceSource.RECOMMENDATIONS]) === null || _a === void 0 ? void 0 : _a.resourceOriginId) !== null && _b !== void 0 ? _b : '', SessionResourceSource.RECOMMENDATIONS)}`, className: "se-recommended ts-result", "data-tracking-id": `se-recommended-main-recommendations-${i}`, rel: "noopener noreferrer", target: "_blank", onClick: onResourceClick(doc, i), dangerouslySetInnerHTML: computeRecommendationTitle(doc) }),
|
|
215
215
|
React.createElement("div", { className: "header-meta pf-v6-u-mt-xs" },
|
|
216
|
-
doc.rerank_score && computeLabel(doc),
|
|
216
|
+
isATestvariation && doc.rerank_score && computeLabel(doc),
|
|
217
217
|
doc.kcsState === 'verified' && (React.createElement(React.Fragment, null,
|
|
218
218
|
React.createElement("span", { className: "status-verified pf-v6-u-font-weight-bold pf-v6-u-success-color-100" }, "verified"),
|
|
219
219
|
React.createElement("span", { className: "list-separator" }, "\u2013"))),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteRiderAcceptanceModal.d.ts","sourceRoot":"","sources":["../../../../src/components/RemoteRider/RemoteRiderAcceptanceModal.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,OAAO,KAAqB,MAAM,OAAO,CAAC;AAG1C,UAAU,MAAM;IACZ,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;CACrD;AAED,MAAM,CAAC,OAAO,UAAU,0BAA0B,CAAC,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"RemoteRiderAcceptanceModal.d.ts","sourceRoot":"","sources":["../../../../src/components/RemoteRider/RemoteRiderAcceptanceModal.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,OAAO,KAAqB,MAAM,OAAO,CAAC;AAG1C,UAAU,MAAM;IACZ,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;CACrD;AAED,MAAM,CAAC,OAAO,UAAU,0BAA0B,CAAC,KAAK,EAAE,MAAM,qBAwD/D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Review.d.ts","sourceRoot":"","sources":["../../../../src/components/Review/Review.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAIvD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"Review.d.ts","sourceRoot":"","sources":["../../../../src/components/Review/Review.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAIvD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAqBlE,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;CACpD;AACD,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,KAAK,EAAE,MAAM,qBA2E3C"}
|
|
@@ -24,10 +24,12 @@ import CaseContactSelector from '../CaseManagement/SendNotifications/CaseContact
|
|
|
24
24
|
import { Hostname } from '../ImproveCase/Hostname';
|
|
25
25
|
import KtQuestions from '../ImproveCase/KtQuestions';
|
|
26
26
|
import { AllProductsSelector } from '../ProductSelector/AllProductsSelector';
|
|
27
|
+
import { EARuleWidget } from '../Recommendations/EARules/EARuleWidget';
|
|
27
28
|
export default function Review(props) {
|
|
28
29
|
const caseDispatch = useCaseDispatch();
|
|
29
|
-
const { contactInfo24x7, caseType } = useCaseSelector((state) => ({
|
|
30
|
+
const { contactInfo24x7, ABTestVariation, caseType } = useCaseSelector((state) => ({
|
|
30
31
|
contactInfo24x7: state.caseDetails.contactInfo24x7,
|
|
32
|
+
ABTestVariation: state.ABTestVariation,
|
|
31
33
|
caseType: state.caseDetails.caseType,
|
|
32
34
|
}), isEqual);
|
|
33
35
|
const ability = useContext(AbilityContext);
|
|
@@ -35,7 +37,9 @@ export default function Review(props) {
|
|
|
35
37
|
const onSeverityChange = (payload) => {
|
|
36
38
|
setCaseDetails(caseDispatch, payload);
|
|
37
39
|
};
|
|
40
|
+
const isBTestvariation = ABTestVariation === 'B' || isEmpty(ABTestVariation);
|
|
38
41
|
return (React.createElement(React.Fragment, null,
|
|
42
|
+
isBTestvariation && React.createElement(EARuleWidget, null),
|
|
39
43
|
React.createElement("form", { className: "review-form card card-light push-bottom" },
|
|
40
44
|
React.createElement(AccountSelector, null),
|
|
41
45
|
React.createElement(OwnerSelector, null),
|
|
@@ -140,7 +140,7 @@ export const AskRedHat = ({ onChatWithAIClick }) => {
|
|
|
140
140
|
// Use accumulated response if streaming, otherwise use the final response
|
|
141
141
|
const answer = aiResponseState.isStreaming && aiResponseState.accumulatedResponse
|
|
142
142
|
? aiResponseState.accumulatedResponse
|
|
143
|
-
: (aiResponse === null || aiResponse === void 0 ? void 0 : aiResponse.answer) || (aiResponse === null || aiResponse === void 0 ? void 0 : aiResponse.content);
|
|
143
|
+
: (aiResponse === null || aiResponse === void 0 ? void 0 : aiResponse.answer) || (aiResponse === null || aiResponse === void 0 ? void 0 : aiResponse.content) || t('No AI response available yet.');
|
|
144
144
|
const sources = React.useMemo(() => (aiResponse === null || aiResponse === void 0 ? void 0 : aiResponse.sources) || (aiResponse === null || aiResponse === void 0 ? void 0 : aiResponse.references) || [], [aiResponse]);
|
|
145
145
|
const sourcesCount = sources.length || 0;
|
|
146
146
|
// Show loading only when streaming has started but no content received yet
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import '@ifd-ui/ask-redhat-core/ask-redhat-core.css';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
import { RouteComponentProps } from 'react-router-dom';
|
|
4
|
-
import { IRouteUrlParams } from '../../reducers/RouteConstNTypes';
|
|
5
3
|
interface IProps {
|
|
6
|
-
routeProps: RouteComponentProps<IRouteUrlParams>;
|
|
7
|
-
userSeenRecommendations?: (value: React.SetStateAction<boolean>) => void;
|
|
8
|
-
userClickedNextonRecommendations?: boolean;
|
|
9
|
-
resultsRowRef: React.MutableRefObject<HTMLDivElement | null>;
|
|
10
4
|
inlineEditable: boolean;
|
|
11
5
|
initialIsEditing?: boolean;
|
|
12
6
|
required?: boolean;
|
|
@@ -19,9 +13,6 @@ interface IProps {
|
|
|
19
13
|
aiServicesAvailable: boolean;
|
|
20
14
|
isSecureSupport?: boolean;
|
|
21
15
|
hasConfirmedStatesideSupport?: boolean;
|
|
22
|
-
onBack?: (e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
23
|
-
haveARHFieldsChanged?: boolean;
|
|
24
|
-
resetARHFieldsChanged?: () => void;
|
|
25
16
|
}
|
|
26
17
|
declare function TroubleshootSection(props: IProps): React.JSX.Element;
|
|
27
18
|
declare namespace TroubleshootSection {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TroubleshootSection.d.ts","sourceRoot":"","sources":["../../../../src/components/TroubleshootSection/TroubleshootSection.tsx"],"names":[],"mappings":"AAAA,OAAO,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"TroubleshootSection.d.ts","sourceRoot":"","sources":["../../../../src/components/TroubleshootSection/TroubleshootSection.tsx"],"names":[],"mappings":"AAAA,OAAO,6CAA6C,CAAC;AAUrD,OAAO,KAA6B,MAAM,OAAO,CAAC;AAclD,UAAU,MAAM;IACZ,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,4BAA4B,CAAC,EAAE,OAAO,CAAC;CAC1C;AAUD,iBAAS,mBAAmB,CAAC,KAAK,EAAE,MAAM,qBAgOzC;kBAhOQ,mBAAmB;;;AAmO5B,eAAe,mBAAmB,CAAC"}
|