Skip to content

Commit 5bf6b2e

Browse files
authored
rule details flyout on detector create 4th step (opensearch-project#266)
* rule details flyout on detector create 4th step Signed-off-by: Aleksandar Djindjic <[email protected]> * rule details flyout on detector edit page Signed-off-by: Aleksandar Djindjic <[email protected]> Signed-off-by: Aleksandar Djindjic <[email protected]>
1 parent 2ccadad commit 5bf6b2e

File tree

4 files changed

+85
-17
lines changed

4 files changed

+85
-17
lines changed

public/pages/CreateDetector/components/DefineDetector/components/DetectionRules/types/interfaces.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55

66
import { RuleItemInfoBase } from '../../../../../../Rules/models/types';
7+
import { RuleInfo } from './../../../../../../../../server/models/interfaces/Rules';
78

89
export interface RuleItem {
910
name: string;
@@ -13,6 +14,7 @@ export interface RuleItem {
1314
library: string;
1415
description: string;
1516
active: boolean;
17+
ruleInfo: RuleInfo;
1618
}
1719

1820
export type RuleItemInfo = RuleItemInfoBase & { enabled: boolean };

public/pages/Detectors/components/DetectorRulesView/DetectorRulesView.tsx

Lines changed: 55 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ import { Detector } from '../../../../../models/interfaces';
1313
import { RuleInfo } from '../../../../../server/models/interfaces';
1414
import { errorNotificationToast, translateToRuleItems } from '../../../../utils/helpers';
1515
import { NotificationsStart } from 'opensearch-dashboards/public';
16+
import { RulesTable } from '../../../Rules/components/RulesTable/RulesTable';
17+
import { RuleTableItem } from '../../../Rules/utils/helpers';
18+
import { RuleViewerFlyout } from '../../../Rules/components/RuleViewerFlyout/RuleViewerFlyout';
1619

1720
export interface DetectorRulesViewProps {
1821
detector: Detector;
@@ -21,6 +24,18 @@ export interface DetectorRulesViewProps {
2124
notifications: NotificationsStart;
2225
}
2326

27+
const mapRuleItemToRuleTableItem = (ruleItem: RuleItem): RuleTableItem => {
28+
return {
29+
title: ruleItem.name,
30+
level: ruleItem.severity,
31+
category: ruleItem.logType,
32+
description: ruleItem.description,
33+
source: ruleItem.library,
34+
ruleId: ruleItem.id,
35+
ruleInfo: { ...ruleItem.ruleInfo, prePackaged: ruleItem.library === 'Sigma' },
36+
};
37+
};
38+
2439
export const DetectorRulesView: React.FC<DetectorRulesViewProps> = (props) => {
2540
const totalSelected = props.detector.inputs.reduce((sum, inputObj) => {
2641
return (
@@ -30,6 +45,7 @@ export const DetectorRulesView: React.FC<DetectorRulesViewProps> = (props) => {
3045
);
3146
}, 0);
3247

48+
const [flyoutData, setFlyoutData] = useState<RuleTableItem | null>(null);
3349
const [enabledRuleItems, setEnabledRuleItems] = useState<RuleItem[]>([]);
3450
const [allRuleItems, setAllRuleItems] = useState<RuleItem[]>([]);
3551
const [loading, setLoading] = useState(false);
@@ -125,22 +141,44 @@ export const DetectorRulesView: React.FC<DetectorRulesViewProps> = (props) => {
125141

126142
const getDetectionRulesTitle = () => `View detection rules (${totalSelected})`;
127143

128-
return props.rulesCanFold ? (
129-
<EuiAccordion
130-
id={props.detector.name}
131-
title={getDetectionRulesTitle()}
132-
buttonContent={
133-
<EuiText size="m">
134-
<p>{getDetectionRulesTitle()}</p>
135-
</EuiText>
136-
}
137-
>
138-
<EuiSpacer size="l" />
139-
{rules}
140-
</EuiAccordion>
141-
) : (
142-
<ContentPanel title={`Active rules (${totalSelected})`} actions={actions}>
143-
{rules}
144-
</ContentPanel>
144+
const onShowRuleDetails = (rule: RuleTableItem) => {
145+
setFlyoutData(() => rule);
146+
};
147+
148+
return (
149+
<>
150+
{flyoutData ? (
151+
<RuleViewerFlyout
152+
hideFlyout={() => setFlyoutData(() => null)}
153+
history={null as any}
154+
ruleTableItem={flyoutData}
155+
ruleService={null as any}
156+
notifications={props.notifications}
157+
/>
158+
) : null}
159+
{props.rulesCanFold ? (
160+
<EuiAccordion
161+
id={props.detector.name}
162+
title={getDetectionRulesTitle()}
163+
buttonContent={
164+
<EuiText size="m">
165+
<p>{getDetectionRulesTitle()}</p>
166+
</EuiText>
167+
}
168+
>
169+
<EuiSpacer size="l" />
170+
<RulesTable
171+
loading={loading}
172+
ruleItems={enabledRuleItems.map((i) => mapRuleItemToRuleTableItem(i))}
173+
showRuleDetails={onShowRuleDetails}
174+
/>
175+
{rules}
176+
</EuiAccordion>
177+
) : (
178+
<ContentPanel title={`Active rules (${totalSelected})`} actions={actions}>
179+
{rules}
180+
</ContentPanel>
181+
)}
182+
</>
145183
);
146184
};

public/pages/Detectors/components/UpdateRules/UpdateRules.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import { ServicesContext } from '../../../../services';
2020
import { ServerResponse } from '../../../../../server/models/types';
2121
import { NotificationsStart } from 'opensearch-dashboards/public';
2222
import { errorNotificationToast, successNotificationToast } from '../../../../utils/helpers';
23+
import { RuleTableItem } from '../../../Rules/utils/helpers';
24+
import { RuleViewerFlyout } from '../../../Rules/components/RuleViewerFlyout/RuleViewerFlyout';
2325

2426
export interface UpdateDetectorRulesProps
2527
extends RouteComponentProps<
@@ -38,6 +40,7 @@ export const UpdateDetectorRules: React.FC<UpdateDetectorRulesProps> = (props) =
3840
const [customRuleItems, setCustomRuleItems] = useState<RuleItem[]>([]);
3941
const [prePackagedRuleItems, setPrePackagedRuleItems] = useState<RuleItem[]>([]);
4042
const detectorId = props.location.pathname.replace(`${ROUTES.EDIT_DETECTOR_RULES}/`, '');
43+
const [flyoutData, setFlyoutData] = useState<RuleTableItem | null>(null);
4144

4245
useEffect(() => {
4346
const getDetector = async () => {
@@ -86,6 +89,7 @@ export const UpdateDetectorRules: React.FC<UpdateDetectorRulesProps> = (props) =
8689
library: 'Sigma',
8790
description: rule._source.description,
8891
active: enabledRuleIds.includes(rule._id),
92+
ruleInfo: rule,
8993
}));
9094
setPrePackagedRuleItems(ruleItems);
9195
} else {
@@ -124,6 +128,7 @@ export const UpdateDetectorRules: React.FC<UpdateDetectorRulesProps> = (props) =
124128
library: 'Custom',
125129
description: rule._source.description,
126130
active: enabledRuleIds.includes(rule._id),
131+
ruleInfo: rule,
127132
}));
128133
setCustomRuleItems(ruleItems);
129134
} else {
@@ -210,8 +215,29 @@ export const UpdateDetectorRules: React.FC<UpdateDetectorRulesProps> = (props) =
210215
};
211216

212217
const ruleItems = prePackagedRuleItems.concat(customRuleItems);
218+
219+
const onRuleDetails = (ruleItem: RuleItem) => {
220+
console.log('onRuleDetails', ruleItem);
221+
setFlyoutData(() => ({
222+
title: ruleItem.name,
223+
level: ruleItem.severity,
224+
category: ruleItem.logType,
225+
description: ruleItem.description,
226+
source: ruleItem.library,
227+
ruleInfo: ruleItem.ruleInfo,
228+
ruleId: ruleItem.id,
229+
}));
230+
};
213231
return (
214232
<div>
233+
{flyoutData ? (
234+
<RuleViewerFlyout
235+
hideFlyout={() => setFlyoutData(() => null)}
236+
history={null as any}
237+
ruleTableItem={flyoutData}
238+
ruleService={null as any}
239+
/>
240+
) : null}
215241
<EuiTitle size={'m'}>
216242
<h3>Edit detector rules</h3>
217243
</EuiTitle>
@@ -222,6 +248,7 @@ export const UpdateDetectorRules: React.FC<UpdateDetectorRulesProps> = (props) =
222248
ruleItems={ruleItems}
223249
onRuleActivationToggle={onToggle}
224250
onAllRulesToggled={onAllRulesToggle}
251+
onRuleDetails={onRuleDetails}
225252
/>
226253

227254
<EuiSpacer size="xl" />

public/utils/helpers.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ export function ruleItemInfosToItems(
122122
logType: detectorType.toLowerCase(),
123123
name: itemInfo._source.title,
124124
severity: itemInfo._source.level,
125+
ruleInfo: itemInfo,
125126
}));
126127
}
127128

0 commit comments

Comments
 (0)