diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts
index 9a8a2757ebd4e..cade87d2d5070 100644
--- a/x-pack/plugins/security_solution/common/constants.ts
+++ b/x-pack/plugins/security_solution/common/constants.ts
@@ -451,7 +451,7 @@ export const RULES_TABLE_MAX_PAGE_SIZE = 100;
* we will need to update these constants with the corresponding version.
*/
export const NEW_FEATURES_TOUR_STORAGE_KEYS = {
- RULE_MANAGEMENT_PAGE: 'securitySolution.rulesManagementPage.newFeaturesTour.v8.11',
+ RULE_MANAGEMENT_PAGE: 'securitySolution.rulesManagementPage.newFeaturesTour.v8.13',
TIMELINES: 'securitySolution.security.timelineFlyoutHeader.saveTimelineTour',
TIMELINE: 'securitySolution.timeline.newFeaturesTour.v8.12',
};
diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/tab_navigation.tsx b/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/tab_navigation.tsx
index 996fdcd1bb176..0f38ff32cfefa 100644
--- a/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/tab_navigation.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/tab_navigation.tsx
@@ -50,6 +50,7 @@ const TabNavigationItemComponent = ({
href={appHref}
onClick={handleClick}
append={isBeta && {betaOptions?.text ?? BETA}}
+ id={id}
>
{name}
diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/json_diff/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/json_diff/translations.ts
index b03c3f0a2085a..45aa87f1964f2 100644
--- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/json_diff/translations.ts
+++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/json_diff/translations.ts
@@ -17,20 +17,6 @@ export const EXPAND_UNCHANGED_LINES = (linesCount: number) =>
}
);
-export const BASE_VERSION = i18n.translate(
- 'xpack.securitySolution.detectionEngine.rules.upgradeRules.baseVersionLabel',
- {
- defaultMessage: 'Base version',
- }
-);
-
-export const BASE_VERSION_DESCRIPTION = i18n.translate(
- 'xpack.securitySolution.detectionEngine.rules.upgradeRules.baseVersionDescriptionLabel',
- {
- defaultMessage: 'Shows currently installed rule',
- }
-);
-
export const CURRENT_RULE_VERSION = i18n.translate(
'xpack.securitySolution.detectionEngine.rules.upgradeRules.currentVersionLabel',
{
diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_details_flyout.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_details_flyout.tsx
index c2d00c819253a..d6507115bcd48 100644
--- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_details_flyout.tsx
+++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_details_flyout.tsx
@@ -109,6 +109,7 @@ interface RuleDetailsFlyoutProps {
size?: EuiFlyoutProps['size'];
extraTabs?: EuiTabbedContentTab[];
dataTestSubj?: string;
+ id?: string;
closeFlyout: () => void;
}
@@ -118,6 +119,7 @@ export const RuleDetailsFlyout = ({
size = 'm',
extraTabs = [],
dataTestSubj,
+ id,
closeFlyout,
}: RuleDetailsFlyoutProps) => {
const { expandedOverviewSections, toggleOverviewSection } = useOverviewTabSections();
@@ -181,6 +183,7 @@ export const RuleDetailsFlyout = ({
return (
{
- {i18n.BASE_VERSION}
+ {i18n.CURRENT_RULE_VERSION}
diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/feature_tour/rules_feature_tour.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/feature_tour/rules_feature_tour.tsx
index d2f64ec882840..96e05f490147c 100644
--- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/feature_tour/rules_feature_tour.tsx
+++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/feature_tour/rules_feature_tour.tsx
@@ -22,9 +22,11 @@ import {
} from '@elastic/eui';
import { noop } from 'lodash';
import type { FC } from 'react';
-import React, { useEffect, useMemo, useState } from 'react';
+import React, { useEffect, useMemo } from 'react';
import { NEW_FEATURES_TOUR_STORAGE_KEYS } from '../../../../../../common/constants';
import { useKibana } from '../../../../../common/lib/kibana';
+import { useIsElementMounted } from '../rules_table/guided_onboarding/use_is_element_mounted';
+import { PREBUILT_RULE_UPDATE_FLYOUT_ANCHOR } from '../upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table_context';
import * as i18n from './translations';
export interface RulesFeatureTourContextType {
@@ -32,7 +34,7 @@ export interface RulesFeatureTourContextType {
actions: EuiTourActions;
}
-export const SEARCH_CAPABILITIES_TOUR_ANCHOR = 'search-capabilities-tour-anchor';
+export const PER_FIELD_UPGRADE_TOUR_ANCHOR = 'updates';
const TOUR_STORAGE_KEY = NEW_FEATURES_TOUR_STORAGE_KEYS.RULE_MANAGEMENT_PAGE;
const TOUR_POPOVER_WIDTH = 400;
@@ -41,14 +43,14 @@ const tourConfig: EuiTourState = {
currentTourStep: 1,
isTourActive: true,
tourPopoverWidth: TOUR_POPOVER_WIDTH,
- tourSubtitle: i18n.TOUR_TITLE,
+ tourSubtitle: '',
};
const stepsConfig: EuiStatelessTourStep[] = [
{
step: 1,
- title: i18n.SEARCH_CAPABILITIES_TITLE,
- content: {i18n.SEARCH_CAPABILITIES_DESCRIPTION},
+ title: i18n.UPDATE_TOUR_TITLE,
+ content: {i18n.UPDATE_TOUR_DESCRIPTION},
stepsTotal: 1,
children: <>>,
onFinish: noop,
@@ -56,7 +58,7 @@ const stepsConfig: EuiStatelessTourStep[] = [
},
];
-export const RulesFeatureTour: FC = () => {
+export const RuleFeatureTour: FC = () => {
const { storage } = useKibana().services;
const restoredState = useMemo(
@@ -74,28 +76,9 @@ export const RulesFeatureTour: FC = () => {
storage.set(TOUR_STORAGE_KEY, { isTourActive, currentTourStep });
}, [tourState, storage]);
- const [shouldShowSearchCapabilitiesTour, setShouldShowSearchCapabilitiesTour] = useState(false);
-
- useEffect(() => {
- /**
- * Wait until the tour target elements are visible on the page and mount
- * EuiTourStep components only after that. Otherwise, the tours would never
- * show up on the page.
- */
- const observer = new MutationObserver(() => {
- if (document.querySelector(`#${SEARCH_CAPABILITIES_TOUR_ANCHOR}`)) {
- setShouldShowSearchCapabilitiesTour(true);
- observer.disconnect();
- }
- });
-
- observer.observe(document.body, {
- childList: true,
- subtree: true,
- });
-
- return () => observer.disconnect();
- }, []);
+ const isTourAnchorMounted = useIsElementMounted(PER_FIELD_UPGRADE_TOUR_ANCHOR);
+ const isFlyoutOpen = useIsElementMounted(PREBUILT_RULE_UPDATE_FLYOUT_ANCHOR);
+ const shouldShowRuleUpgradeTour = isTourAnchorMounted && !isFlyoutOpen;
const enhancedSteps = useMemo(
() =>
@@ -135,7 +118,7 @@ export const RulesFeatureTour: FC = () => {
[tourSteps, tourActions]
);
- return shouldShowSearchCapabilitiesTour ? (
+ return shouldShowRuleUpgradeTour ? (
{
*/
// eslint-disable-next-line react/no-children-prop
children={undefined}
- anchor={`#${SEARCH_CAPABILITIES_TOUR_ANCHOR}`}
+ anchor={`#${PER_FIELD_UPGRADE_TOUR_ANCHOR}`}
anchorPosition="downCenter"
/>
) : null;
diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/feature_tour/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/feature_tour/translations.ts
index 45715c6ca76d8..92fcae264b243 100644
--- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/feature_tour/translations.ts
+++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/feature_tour/translations.ts
@@ -28,17 +28,16 @@ export const NEXT_STEP_LABEL = i18n.translate(
}
);
-export const SEARCH_CAPABILITIES_TITLE = i18n.translate(
- 'xpack.securitySolution.detectionEngine.rules.allRules.featureTour.searchCapabilitiesTitle',
+export const UPDATE_TOUR_TITLE = i18n.translate(
+ 'xpack.securitySolution.detectionEngine.ruleDetails.updateTourTitle',
{
- defaultMessage: 'Enhanced search capabilities',
+ defaultMessage: 'New field view of updates',
}
);
-export const SEARCH_CAPABILITIES_DESCRIPTION = i18n.translate(
- 'xpack.securitySolution.detectionEngine.rules.allRules.featureTour.searchCapabilitiesDescription',
+export const UPDATE_TOUR_DESCRIPTION = i18n.translate(
+ 'xpack.securitySolution.detectionEngine.ruleDetails.updateTourDescription',
{
- defaultMessage:
- 'It is now possible to search rules by index patterns, like "filebeat-*", or by MITRE ATT&CK™ tactics or techniques, like "Defense Evasion" or "TA0005".',
+ defaultMessage: "Click on a rule's name to view the latest changes.",
}
);
diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/translations.ts
index 626c52a0173d8..026c35f664bb3 100644
--- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/translations.ts
+++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/translations.ts
@@ -37,3 +37,17 @@ export const UPDATE_BUTTON_LABEL = i18n.translate(
defaultMessage: 'Update',
}
);
+
+export const UPDATE_FLYOUT_PER_FIELD_TOOLTIP_DESCRIPTION = i18n.translate(
+ 'xpack.securitySolution.detectionEngine.ruleDetails.perFieldTooltip',
+ {
+ defaultMessage: 'View changes field by field.',
+ }
+);
+
+export const UPDATE_FLYOUT_JSON_VIEW_TOOLTIP_DESCRIPTION = i18n.translate(
+ 'xpack.securitySolution.detectionEngine.ruleDetails.jsonViewTooltip',
+ {
+ defaultMessage: 'View the latest rule changes in JSON format.',
+ }
+);
diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table_context.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table_context.tsx
index d5a5938688925..0a938e0d10512 100644
--- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table_context.tsx
+++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table_context.tsx
@@ -7,7 +7,7 @@
import type { Dispatch, SetStateAction } from 'react';
import React, { createContext, useCallback, useContext, useMemo, useState } from 'react';
-import { EuiButton } from '@elastic/eui';
+import { EuiButton, EuiToolTip } from '@elastic/eui';
import type { EuiTabbedContentTab } from '@elastic/eui';
import { PerFieldRuleDiffTab } from '../../../../rule_management/components/rule_details/per_field_rule_diff_tab';
import { useIsUpgradingSecurityPackages } from '../../../../rule_management/logic/use_upgrade_security_packages';
@@ -85,6 +85,8 @@ export interface UpgradePrebuiltRulesTableState {
selectedRules: RuleUpgradeInfoForReview[];
}
+export const PREBUILT_RULE_UPDATE_FLYOUT_ANCHOR = 'updatePrebuiltRulePreview';
+
export interface UpgradePrebuiltRulesTableActions {
reFetchRules: () => void;
upgradeOneRule: (ruleId: string) => void;
@@ -284,7 +286,14 @@ export const UpgradePrebuiltRulesTableContextProvider = ({
? [
{
id: 'updates',
- name: ruleDetailsI18n.UPDATES_TAB_LABEL,
+ name: (
+
+ <>{ruleDetailsI18n.UPDATES_TAB_LABEL}>
+
+ ),
content: (
@@ -297,7 +306,14 @@ export const UpgradePrebuiltRulesTableContextProvider = ({
? [
{
id: 'jsonViewUpdates',
- name: ruleDetailsI18n.JSON_VIEW_UPDATES_TAB_LABEL,
+ name: (
+
+ <>{ruleDetailsI18n.JSON_VIEW_UPDATES_TAB_LABEL}>
+
+ ),
content: (
@@ -329,6 +345,7 @@ export const UpgradePrebuiltRulesTableContextProvider = ({
{
const [isImportModalVisible, showImportModal, hideImportModal] = useBoolState();
@@ -53,6 +55,9 @@ const RulesPageComponent: React.FC = () => {
invalidateFetchRuleManagementFilters,
invalidateFetchCoverageOverviewQuery,
]);
+ const isPerFieldPrebuiltRulesDiffingEnabled = useIsExperimentalFeatureEnabled(
+ 'perFieldPrebuiltRulesDiffingEnabled'
+ );
const [
{
@@ -172,6 +177,7 @@ const RulesPageComponent: React.FC = () => {
kibanaServices={kibanaServices}
categories={[DEFAULT_APP_CATEGORIES.security.id]}
/>
+ {isPerFieldPrebuiltRulesDiffingEnabled && }
diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json
index 4114bf89971a4..9be834f334917 100644
--- a/x-pack/plugins/translations/translations/fr-FR.json
+++ b/x-pack/plugins/translations/translations/fr-FR.json
@@ -33548,8 +33548,6 @@
"xpack.securitySolution.detectionEngine.rules.allRules.exportFilenameTitle": "rules_export",
"xpack.securitySolution.detectionEngine.rules.allRules.featureTour.nextStepLabel": "Aller à l'étape suivante",
"xpack.securitySolution.detectionEngine.rules.allRules.featureTour.previousStepLabel": "Revenir à l'étape précédente",
- "xpack.securitySolution.detectionEngine.rules.allRules.featureTour.searchCapabilitiesDescription": "Il est maintenant possible de rechercher des règles par modèle d'indexation, tel que \"filebeat-*\", ou par tactique ou technique MITRE ATT&CK™, telle que \"Évasion par la défense \" ou \"TA0005\".",
- "xpack.securitySolution.detectionEngine.rules.allRules.featureTour.searchCapabilitiesTitle": "Capacités de recherche améliorées",
"xpack.securitySolution.detectionEngine.rules.allRules.featureTour.tourTitle": "Nouveautés",
"xpack.securitySolution.detectionEngine.rules.allRules.filters.customRulesTitle": "Règles personnalisées",
"xpack.securitySolution.detectionEngine.rules.allRules.filters.disabledRulesTitle": "Règles désactivées",
diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json
index 625abe46a2c53..73a0505bc2810 100644
--- a/x-pack/plugins/translations/translations/ja-JP.json
+++ b/x-pack/plugins/translations/translations/ja-JP.json
@@ -33548,8 +33548,6 @@
"xpack.securitySolution.detectionEngine.rules.allRules.exportFilenameTitle": "rules_export",
"xpack.securitySolution.detectionEngine.rules.allRules.featureTour.nextStepLabel": "次のステップに進む",
"xpack.securitySolution.detectionEngine.rules.allRules.featureTour.previousStepLabel": "前のステップに戻る",
- "xpack.securitySolution.detectionEngine.rules.allRules.featureTour.searchCapabilitiesDescription": "「filebeat-*」などのインデックスパターンや、「Defense Evasion」や「TA0005」などのMITRE ATT&CK™方式または手法でルールを検索できます。",
- "xpack.securitySolution.detectionEngine.rules.allRules.featureTour.searchCapabilitiesTitle": "拡張検索機能",
"xpack.securitySolution.detectionEngine.rules.allRules.featureTour.tourTitle": "新機能",
"xpack.securitySolution.detectionEngine.rules.allRules.filters.customRulesTitle": "カスタムルール",
"xpack.securitySolution.detectionEngine.rules.allRules.filters.disabledRulesTitle": "無効なルール",
diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json
index 504324488c01b..43a5613072842 100644
--- a/x-pack/plugins/translations/translations/zh-CN.json
+++ b/x-pack/plugins/translations/translations/zh-CN.json
@@ -33530,8 +33530,6 @@
"xpack.securitySolution.detectionEngine.rules.allRules.exportFilenameTitle": "rules_export",
"xpack.securitySolution.detectionEngine.rules.allRules.featureTour.nextStepLabel": "前往下一步",
"xpack.securitySolution.detectionEngine.rules.allRules.featureTour.previousStepLabel": "前往上一步",
- "xpack.securitySolution.detectionEngine.rules.allRules.featureTour.searchCapabilitiesDescription": "现在可以按搜索模式(如“filebeat-*”) 或者 MITRE ATT&CK™ 策略或技术(如“Defense Evasion”或“TA0005”)搜索规则。",
- "xpack.securitySolution.detectionEngine.rules.allRules.featureTour.searchCapabilitiesTitle": "已增强搜索功能",
"xpack.securitySolution.detectionEngine.rules.allRules.featureTour.tourTitle": "最新动态",
"xpack.securitySolution.detectionEngine.rules.allRules.filters.customRulesTitle": "定制规则",
"xpack.securitySolution.detectionEngine.rules.allRules.filters.disabledRulesTitle": "已禁用规则",