Skip to content

Commit 2ff06e7

Browse files
Rule details flyout on create rule page (#236) (#246)
* rule details flyout on create rule page Signed-off-by: Aleksandar Djindjic <[email protected]> * do not block deletetion if no notifications Signed-off-by: Aleksandar Djindjic <[email protected]> Signed-off-by: Aleksandar Djindjic <[email protected]> (cherry picked from commit 547cbd3) Co-authored-by: Aleksandar Djindjic <[email protected]>
1 parent 69a8d21 commit 2ff06e7

File tree

4 files changed

+55
-8
lines changed

4 files changed

+55
-8
lines changed

public/pages/CreateDetector/components/DefineDetector/components/DetectionRules/DetectionRules.tsx

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,13 @@ import {
1111
CriteriaWithPagination,
1212
EuiText,
1313
} from '@elastic/eui';
14-
import React, { useMemo } from 'react';
14+
15+
import React, { useMemo, useState } from 'react';
1516
import { DetectionRulesTable } from './DetectionRulesTable';
1617
import { RuleItem, RuleItemInfo } from './types/interfaces';
18+
import { RuleViewerFlyout } from '../../../../../Rules/components/RuleViewerFlyout/RuleViewerFlyout';
19+
import { RuleTableItem } from '../../../../../Rules/utils/helpers';
20+
import { RuleItemInfoBase } from '../../../../../Rules/models/types';
1721

1822
export interface CreateDetectorRulesState {
1923
allRules: RuleItemInfo[];
@@ -35,6 +39,8 @@ export const DetectionRules: React.FC<DetectionRulesProps> = ({
3539
onRuleToggle,
3640
onAllRulesToggle,
3741
}) => {
42+
const [flyoutData, setFlyoutData] = useState<RuleTableItem | null>(null);
43+
3844
let enabledRulesCount = 0;
3945
rulesState.allRules.forEach((ruleItem) => {
4046
if (ruleItem.enabled) {
@@ -60,8 +66,28 @@ export const DetectionRules: React.FC<DetectionRulesProps> = ({
6066
onPageChange(nextValues.page);
6167
};
6268

69+
const onRuleDetails = (ruleItem: RuleItem) => {
70+
setFlyoutData(() => ({
71+
title: ruleItem.name,
72+
level: ruleItem.severity,
73+
category: ruleItem.logType,
74+
description: ruleItem.description,
75+
source: ruleItem.library,
76+
ruleInfo: rulesState.allRules.find((r) => r._id === ruleItem.id) as RuleItemInfoBase,
77+
ruleId: ruleItem.id,
78+
}));
79+
};
80+
6381
return (
6482
<EuiPanel style={{ paddingLeft: '0px', paddingRight: '0px' }}>
83+
{flyoutData ? (
84+
<RuleViewerFlyout
85+
hideFlyout={() => setFlyoutData(() => null)}
86+
history={null as any}
87+
ruleTableItem={flyoutData}
88+
ruleService={null as any}
89+
/>
90+
) : null}
6591
<EuiAccordion
6692
buttonContent={
6793
<div data-test-subj="detection-rules-btn">
@@ -85,6 +111,7 @@ export const DetectionRules: React.FC<DetectionRulesProps> = ({
85111
onAllRulesToggled={onAllRulesToggle}
86112
onRuleActivationToggle={onRuleToggle}
87113
onTableChange={onTableChange}
114+
onRuleDetails={onRuleDetails}
88115
/>
89116
</EuiAccordion>
90117
</EuiPanel>

public/pages/CreateDetector/components/DefineDetector/components/DetectionRules/DetectionRulesTable.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export interface DetectionRulesTableProps {
1717
onRuleActivationToggle: (changedItem: RuleItem, isActive: boolean) => void;
1818
onTableChange?: (nextValues: CriteriaWithPagination<RuleItem>) => void;
1919
loading?: boolean;
20+
onRuleDetails?: (ruleItem: RuleItem) => void;
2021
}
2122

2223
const rulePriorityBySeverity: { [severity: string]: number } = {
@@ -34,6 +35,7 @@ export const DetectionRulesTable: React.FC<DetectionRulesTableProps> = ({
3435
onRuleActivationToggle,
3536
onTableChange,
3637
loading = false,
38+
onRuleDetails,
3739
}) => {
3840
//Filter table by rule type
3941
const search: Search = {
@@ -77,7 +79,12 @@ export const DetectionRulesTable: React.FC<DetectionRulesTableProps> = ({
7779
return (
7880
<div style={{ padding: 10 }}>
7981
<EuiInMemoryTable
80-
columns={getRulesColumns(allRulesEnabled, onAllRulesToggled, onRuleActivationToggle)}
82+
columns={getRulesColumns(
83+
allRulesEnabled,
84+
onAllRulesToggled,
85+
onRuleActivationToggle,
86+
onRuleDetails
87+
)}
8188
items={ruleItems}
8289
itemId={(item: RuleItem) => `${item.name}`}
8390
search={search}

public/pages/CreateDetector/components/DefineDetector/components/DetectionRules/utils/constants.tsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,25 @@ export type ActiveToggleOnChangeEvent = React.BaseSyntheticEvent<
1616
export const getRulesColumns = (
1717
allEnabled: boolean,
1818
onAllRulesToggled?: (enabled: boolean) => void,
19-
onActivationToggle?: (item: RuleItem, active: boolean) => void
19+
onActivationToggle?: (item: RuleItem, active: boolean) => void,
20+
onRuleDetails?: (item: RuleItem) => void
2021
): EuiBasicTableColumn<RuleItem>[] => {
2122
const columns: EuiBasicTableColumn<RuleItem>[] = [
2223
{
2324
field: 'name',
2425
name: 'Rule name',
25-
render: (ruleName: string, item: RuleItem): ReactNode => (
26-
<EuiLink style={{ marginLeft: 10 }}>{ruleName}</EuiLink>
27-
),
26+
render: (ruleName: string, item: RuleItem): ReactNode => {
27+
const onRuleNameClicker = () => {
28+
if (onRuleDetails) {
29+
onRuleDetails(item);
30+
}
31+
};
32+
return (
33+
<EuiLink style={{ marginLeft: 10 }} onClick={onRuleNameClicker}>
34+
{ruleName}
35+
</EuiLink>
36+
);
37+
},
2838
},
2939
{
3040
field: 'severity',

public/pages/Rules/components/RuleViewerFlyout/RuleViewerFlyout.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ import { RuleTableItem } from '../../utils/helpers';
2020
import { DeleteRuleModal } from '../DeleteModal/DeleteModal';
2121
import { RuleContentViewer } from '../RuleContentViewer/RuleContentViewer';
2222
import { RuleViewerFlyoutHeaderActions } from './RuleViewFlyoutHeaderActions';
23-
import { RuleService, NotificationsStart } from '../../../../services';
23+
import { RuleService } from '../../../../services';
24+
import { NotificationsStart } from 'opensearch-dashboards/public';
2425

2526
export interface RuleViewerFlyoutProps {
2627
history?: RouteComponentProps['history'];
@@ -87,7 +88,9 @@ export const RuleViewerFlyout: React.FC<RuleViewerFlyoutProps> = ({
8788
closeDeleteModal();
8889
hideFlyout(true);
8990
} else {
90-
errorNotificationToast(notifications, 'delete', 'rule', deleteRuleRes.error);
91+
if (notifications) {
92+
errorNotificationToast(notifications, 'delete', 'rule', deleteRuleRes.error);
93+
}
9194
}
9295
};
9396

0 commit comments

Comments
 (0)