From 5a455a9f0cf5d8bdf6ec0eada53243805b8b4971 Mon Sep 17 00:00:00 2001 From: Nikita Indik Date: Tue, 10 Dec 2024 20:03:13 +0100 Subject: [PATCH] Reduce number of options, update tooltips --- .../comparison_side_help_info.tsx | 64 ++----- .../comparison_side/field_comparison_side.tsx | 13 +- .../comparison_side/translations.ts | 73 ++++++++ .../versions_picker/constants.ts | 158 ++++++++++++++---- .../versions_picker/versions_picker.tsx | 16 +- .../components/field_final_side_help_info.tsx | 8 +- .../field_upgrade_state_info.tsx | 33 ++-- .../field_upgrade_state_info/translations.tsx | 15 ++ .../field_upgrade_state_enum.ts | 1 + .../use_prebuilt_rules_upgrade_state.ts | 18 +- 10 files changed, 275 insertions(+), 124 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/comparison_side_help_info.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/comparison_side_help_info.tsx index 47e5e537f3ab0..7e0f0ae68b07f 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/comparison_side_help_info.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/comparison_side_help_info.tsx @@ -9,14 +9,7 @@ import React from 'react'; import useToggle from 'react-use/lib/useToggle'; import { EuiPopover, EuiText, EuiButtonIcon } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { i18n } from '@kbn/i18n'; import { TITLE } from './translations'; -import { - BASE_VERSION, - CURRENT_VERSION, - FINAL_VERSION, - TARGET_VERSION, -} from './versions_picker/translations'; /** * Theme doesn't expose width variables. Using provided size variables will require @@ -27,7 +20,11 @@ import { */ const POPOVER_WIDTH = 320; -export function ComparisonSideHelpInfo(): JSX.Element { +interface ComparisonSideHelpInfoProps { + options: Array<{ value: string; text: string; title: string }>; +} + +export function ComparisonSideHelpInfo({ options }: ComparisonSideHelpInfoProps): JSX.Element { const [isPopoverOpen, togglePopover] = useToggle(false); const button = ( @@ -43,25 +40,18 @@ export function ComparisonSideHelpInfo(): JSX.Element { {TITLE}, versions: ( <>
    -
  • - {BASE_VERSION} {'-'} {BASE_VERSION_EXPLANATION} -
  • -
  • - {CURRENT_VERSION} {'-'} {CURRENT_VERSION_EXPLANATION} -
  • -
  • - {TARGET_VERSION} {'-'} {TARGET_VERSION_EXPLANATION} -
  • -
  • - {FINAL_VERSION} {'-'} {FINAL_VERSION_EXPLANATION} -
  • + {options.map((option) => ( +
  • + {option.text} {'-'} {option.title} +
  • + ))}
), @@ -71,35 +61,3 @@ export function ComparisonSideHelpInfo(): JSX.Element { ); } - -const BASE_VERSION_EXPLANATION = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.baseVersionExplanation', - { - defaultMessage: 'version originally installed from Elastic prebuilt rules package', - } -); - -const CURRENT_VERSION_EXPLANATION = ( - {BASE_VERSION}, - }} - /> -); - -const TARGET_VERSION_EXPLANATION = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.targetVersionExplanation', - { - defaultMessage: 'version coming from a new version of Elastic prebuilt rules package', - } -); - -const FINAL_VERSION_EXPLANATION = i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.finalVersionExplanation', - { - defaultMessage: - 'version used to the update the rule. Initial value is suggested by the diff algorithm.', - } -); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/field_comparison_side.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/field_comparison_side.tsx index 0b9b37c91e226..bbbc8c581282e 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/field_comparison_side.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/field_comparison_side.tsx @@ -8,8 +8,8 @@ import React, { useState } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; import { VersionsPicker } from './versions_picker/versions_picker'; -import type { Version } from './versions_picker/constants'; -import { SelectedVersions } from './versions_picker/constants'; +import type { Version, SelectedVersions } from './versions_picker/constants'; +import { getOptionsForDiffOutcome } from './versions_picker/constants'; import { FieldUpgradeSideHeader } from '../field_upgrade_side_header'; import { useFieldUpgradeContext } from '../rule_upgrade/field_upgrade_context'; import { pickFieldValueForVersion } from './utils'; @@ -22,9 +22,8 @@ export function FieldComparisonSide(): JSX.Element { const { fieldName, fieldDiff, finalDiffableRule } = useFieldUpgradeContext(); const resolvedValue = finalDiffableRule[fieldName]; - const [selectedVersions, setSelectedVersions] = useState( - SelectedVersions.CurrentFinal - ); + const options = getOptionsForDiffOutcome(fieldDiff, resolvedValue); + const [selectedVersions, setSelectedVersions] = useState(options[0].value); const [oldVersionType, newVersionType] = selectedVersions.split('_') as [Version, Version]; @@ -42,13 +41,13 @@ export function FieldComparisonSide(): JSX.Element {

{i18n.TITLE} - +

diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/translations.ts index 8208892ac298d..dadf5c0e572a2 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/translations.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/translations.ts @@ -6,6 +6,7 @@ */ import { i18n } from '@kbn/i18n'; +import { FINAL_UPDATE } from '../field_final_side/components/translations'; export const TITLE = i18n.translate( 'xpack.securitySolution.detectionEngine.rules.upgradeRules.comparisonSide.title', @@ -20,3 +21,75 @@ export const NO_CHANGES = i18n.translate( defaultMessage: 'No changes', } ); + +export const UPDATE_FROM_ELASTIC_TITLE = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.updateFromElasticTitle', + { + defaultMessage: 'Update from Elastic', + } +); + +export const UPDATE_FROM_ELASTIC_EXPLANATION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.updateFromElasticExplanation', + { + defaultMessage: 'view the changes in Elastic’s latest update', + } +); + +export const MY_CHANGES_TITLE = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.myChangesTitle', + { + defaultMessage: 'My changes', + } +); + +export const MY_CHANGES_EXPLANATION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.myChangesExplanation', + { + defaultMessage: `view what you have changed in your installed rule and in the {finalUpdateSectionLabel} section`, + values: { + finalUpdateSectionLabel: FINAL_UPDATE, + }, + } +); + +export const MY_CHANGES_FINAL_UPDATE_ONLY_EXPLANATION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.myChangesFinalUpdateOnlyExplanation', + { + defaultMessage: `view the changes you made in the {finalUpdateSectionLabel} section`, + values: { + finalUpdateSectionLabel: FINAL_UPDATE, + }, + } +); + +export const MERGED_CHANGES_TITLE = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.mergedChangesTitle', + { + defaultMessage: 'My changes merged with Elastic’s', + } +); + +export const MERGED_CHANGES_EXPLANATION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.mergedChangesExplanation', + { + defaultMessage: 'view an update suggestion that combines your changes with Elastic’s', + } +); + +export const MY_CUSTOMIZATION_TITLE = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.myCustomizationTitle', + { + defaultMessage: 'My customization', + } +); + +export const MY_CUSTOMIZATION_EXPLANATION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.versions.myCustomizationExplanation', + { + defaultMessage: `view what you have changed in your installed rule. Doesn’t include changes made in the {finalUpdateSectionLabel} section.`, + values: { + finalUpdateSectionLabel: FINAL_UPDATE, + }, + } +); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/constants.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/constants.ts index 04d38ed10dce2..3a5c7e818c7f3 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/constants.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/constants.ts @@ -5,8 +5,13 @@ * 2.0. */ -import type { EuiSelectOption } from '@elastic/eui'; -import * as i18n from './translations'; +import { isEqual } from 'lodash'; +import type { ThreeWayDiff } from '../../../../../../../../common/api/detection_engine'; +import { + ThreeWayDiffConflict, + ThreeWayDiffOutcome, +} from '../../../../../../../../common/api/detection_engine'; +import * as i18n from '../translations'; export enum Version { Base = 'base', @@ -24,35 +29,120 @@ export enum SelectedVersions { TargetFinal = 'target_final', } -export const CURRENT_OPTIONS: EuiSelectOption[] = [ - { - value: SelectedVersions.CurrentFinal, - text: i18n.VERSION1_VS_VERSION2(i18n.CURRENT_VERSION, i18n.FINAL_VERSION), - }, - { - value: SelectedVersions.CurrentTarget, - text: i18n.VERSION1_VS_VERSION2(i18n.CURRENT_VERSION, i18n.TARGET_VERSION), - }, -]; - -export const TARGET_OPTIONS: EuiSelectOption[] = [ - { - value: SelectedVersions.TargetFinal, - text: i18n.VERSION1_VS_VERSION2(i18n.TARGET_VERSION, i18n.FINAL_VERSION), - }, -]; - -export const BASE_OPTIONS: EuiSelectOption[] = [ - { - value: SelectedVersions.BaseFinal, - text: i18n.VERSION1_VS_VERSION2(i18n.BASE_VERSION, i18n.FINAL_VERSION), - }, - { - value: SelectedVersions.BaseTarget, - text: i18n.VERSION1_VS_VERSION2(i18n.BASE_VERSION, i18n.TARGET_VERSION), - }, - { - value: SelectedVersions.BaseCurrent, - text: i18n.VERSION1_VS_VERSION2(i18n.BASE_VERSION, i18n.CURRENT_VERSION), - }, -]; +export const getOptionsForDiffOutcome = ( + fieldDiff: ThreeWayDiff, + resolvedValue: unknown +): Array<{ value: SelectedVersions; text: string; title: string }> => { + switch (fieldDiff.diff_outcome) { + case ThreeWayDiffOutcome.StockValueCanUpdate: { + const hasUserChangedResolvedValue = !isEqual(fieldDiff.merged_version, resolvedValue); + + const options = [ + { + value: SelectedVersions.CurrentTarget, + text: i18n.UPDATE_FROM_ELASTIC_TITLE, + title: i18n.UPDATE_FROM_ELASTIC_EXPLANATION, + }, + ]; + + if (hasUserChangedResolvedValue) { + options.push({ + value: SelectedVersions.CurrentFinal, + text: i18n.MY_CHANGES_TITLE, + title: i18n.MY_CHANGES_FINAL_UPDATE_ONLY_EXPLANATION, + }); + } + + return options; + } + case ThreeWayDiffOutcome.CustomizedValueNoUpdate: + return [ + { + value: SelectedVersions.BaseFinal, + text: i18n.MY_CHANGES_TITLE, + title: i18n.MY_CHANGES_EXPLANATION, + }, + ]; + case ThreeWayDiffOutcome.CustomizedValueSameUpdate: + return [ + { + value: SelectedVersions.BaseFinal, + text: i18n.MY_CHANGES_TITLE, + title: i18n.MY_CHANGES_EXPLANATION, + }, + { + value: SelectedVersions.BaseTarget, + text: i18n.UPDATE_FROM_ELASTIC_TITLE, + title: i18n.UPDATE_FROM_ELASTIC_EXPLANATION, + }, + ]; + case ThreeWayDiffOutcome.CustomizedValueCanUpdate: { + const hasUserChangedResolvedValue = !isEqual(fieldDiff.merged_version, resolvedValue); + + if (fieldDiff.conflict === ThreeWayDiffConflict.SOLVABLE) { + return [ + { + value: SelectedVersions.BaseFinal, + text: hasUserChangedResolvedValue ? i18n.MY_CHANGES_TITLE : i18n.MERGED_CHANGES_TITLE, + title: hasUserChangedResolvedValue + ? i18n.MY_CHANGES_FINAL_UPDATE_ONLY_EXPLANATION + : i18n.MERGED_CHANGES_EXPLANATION, + }, + { + value: SelectedVersions.BaseTarget, + text: i18n.UPDATE_FROM_ELASTIC_TITLE, + title: i18n.UPDATE_FROM_ELASTIC_EXPLANATION, + }, + { + value: SelectedVersions.BaseCurrent, + text: i18n.MY_CUSTOMIZATION_TITLE, + title: i18n.MY_CUSTOMIZATION_EXPLANATION, + }, + ]; + } + + if (fieldDiff.conflict === ThreeWayDiffConflict.NON_SOLVABLE) { + return [ + { + value: SelectedVersions.BaseFinal, + text: i18n.MY_CHANGES_TITLE, + title: i18n.MY_CHANGES_EXPLANATION, + }, + { + value: SelectedVersions.BaseTarget, + text: i18n.UPDATE_FROM_ELASTIC_TITLE, + title: i18n.UPDATE_FROM_ELASTIC_EXPLANATION, + }, + { + value: SelectedVersions.BaseCurrent, + text: i18n.MY_CUSTOMIZATION_TITLE, + title: i18n.MY_CUSTOMIZATION_EXPLANATION, + }, + ]; + } + } + case ThreeWayDiffOutcome.MissingBaseCanUpdate: { + const hasUserChangedResolvedValue = !isEqual(fieldDiff.merged_version, resolvedValue); + + const options = [ + { + value: SelectedVersions.CurrentTarget, + text: i18n.UPDATE_FROM_ELASTIC_TITLE, + title: i18n.UPDATE_FROM_ELASTIC_EXPLANATION, + }, + ]; + + if (hasUserChangedResolvedValue) { + options.push({ + value: SelectedVersions.CurrentFinal, + text: i18n.MY_CHANGES_TITLE, + title: i18n.MY_CHANGES_FINAL_UPDATE_ONLY_EXPLANATION, + }); + } + + return options; + } + default: + return []; + } +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/versions_picker.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/versions_picker.tsx index 4710667e0b315..b31a8318c6d35 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/versions_picker.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/versions_picker/versions_picker.tsx @@ -5,29 +5,23 @@ * 2.0. */ -import React, { useCallback, useMemo } from 'react'; +import React, { useCallback } from 'react'; import { css } from '@emotion/css'; import { EuiSelect } from '@elastic/eui'; -import type { EuiSelectOption } from '@elastic/eui'; -import { BASE_OPTIONS, CURRENT_OPTIONS, TARGET_OPTIONS, SelectedVersions } from './constants'; +import { SelectedVersions } from './constants'; import * as i18n from './translations'; interface VersionsPickerProps { - hasBaseVersion: boolean; + options: Array<{ value: SelectedVersions; text: string; title: string }>; selectedVersions: SelectedVersions; onChange: (pickedVersions: SelectedVersions) => void; } export function VersionsPicker({ - hasBaseVersion, + options, selectedVersions = SelectedVersions.CurrentFinal, onChange, }: VersionsPickerProps) { - const options: EuiSelectOption[] = useMemo( - () => [...CURRENT_OPTIONS, ...TARGET_OPTIONS, ...(hasBaseVersion ? BASE_OPTIONS : [])], - [hasBaseVersion] - ); - const handleChange = useCallback( (changeEvent: React.ChangeEvent) => { onChange(changeEvent.target.value as SelectedVersions); @@ -49,5 +43,5 @@ export function VersionsPicker({ const VERSIONS_PICKER_STYLES = css` // Set min-width a bit wider than default // to make English text in narrow screens readable - min-width: 220px; + min-width: 300px; `; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/field_final_side_help_info.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/field_final_side_help_info.tsx index e3e0b38da7d63..ef8cfc820535d 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/field_final_side_help_info.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/field_final_side/components/field_final_side_help_info.tsx @@ -9,6 +9,7 @@ import React from 'react'; import useToggle from 'react-use/lib/useToggle'; import { EuiPopover, EuiText, EuiButtonIcon } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; +import * as i18n from '../../../../../../rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/translations'; /** * Theme doesn't expose width variables. Using provided size variables will require @@ -34,8 +35,11 @@ export function FieldFinalSideHelpInfo(): JSX.Element { {i18n.UPDATE_BUTTON_LABEL}, + }} /> diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_state_info/field_upgrade_state_info.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_state_info/field_upgrade_state_info.tsx index a85cf96cc50d2..e57ed41042e33 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_state_info/field_upgrade_state_info.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_state_info/field_upgrade_state_info.tsx @@ -28,6 +28,13 @@ export function FieldUpgradeStateInfo({ state }: FieldUpgradeStateInfoProps): JS description: i18n.NO_UPDATE_DESCRIPTION, }; + case FieldUpgradeStateEnum.SameUpdate: + return { + color: 'success', + title: i18n.SAME_UPDATE, + description: i18n.SAME_UPDATE_DESCRIPTION, + }; + case FieldUpgradeStateEnum.NoConflict: return { color: 'success', @@ -65,19 +72,21 @@ export function FieldUpgradeStateInfo({ state }: FieldUpgradeStateInfoProps): JS }, [state]); return ( - - - {badge} - - {title} - - - {description && ( + <> + + + {badge} - {i18n.SEPARATOR} {description} + {title} - )} - - + + {description && ( + + {i18n.SEPARATOR} {description} + + )} + + + ); } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_state_info/translations.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_state_info/translations.tsx index c3115c6ce0925..0b67f590d3f64 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_state_info/translations.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/rule_upgrade/field_upgrade_state_info/translations.tsx @@ -22,6 +22,21 @@ export const NO_UPDATE_DESCRIPTION = i18n.translate( } ); +export const SAME_UPDATE = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.sameUpdate', + { + defaultMessage: 'Matching update', + } +); + +export const SAME_UPDATE_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.sameUpdateDescription', + { + defaultMessage: + 'The field was modified after rule installation, and your changes are the same as the update from Elastic.', + } +); + export const NO_CONFLICT = i18n.translate( 'xpack.securitySolution.detectionEngine.rules.upgradeRules.fieldUpgradeState.noConflict', { diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/field_upgrade_state_enum.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/field_upgrade_state_enum.ts index 0fd522403edc6..241bb1221a6f3 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/field_upgrade_state_enum.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/model/prebuilt_rule_upgrade/field_upgrade_state_enum.ts @@ -7,6 +7,7 @@ export enum FieldUpgradeStateEnum { NoUpdate = 'NO_UPDATE', + SameUpdate = 'SAME_UPDATE', NoConflict = 'NO_CONFLICT', Accepted = 'ACCEPTED', SolvableConflict = 'SOLVABLE_CONFLICT', diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_prebuilt_rules_upgrade_state.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_prebuilt_rules_upgrade_state.ts index 81d64b1b39945..3412947426301 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_prebuilt_rules_upgrade_state.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_prebuilt_rules_upgrade_state.ts @@ -20,6 +20,7 @@ import { ThreeWayDiffConflict, type RuleSignatureId, NON_UPGRADEABLE_DIFFABLE_FIELDS, + ThreeWayDiffOutcome, } from '../../../../../../common/api/detection_engine'; import { assertUnreachable } from '../../../../../../common/utility_types'; @@ -104,11 +105,18 @@ function calcFieldsState( switch (fieldDiff.conflict) { case ThreeWayDiffConflict.NONE: - fieldsState[fieldName] = { - state: fieldDiff.has_update - ? FieldUpgradeStateEnum.NoConflict - : FieldUpgradeStateEnum.NoUpdate, - }; + if (fieldDiff.has_update) { + fieldsState[fieldName] = { + state: FieldUpgradeStateEnum.NoConflict, + }; + } else { + fieldsState[fieldName] = { + state: + fieldDiff.diff_outcome === ThreeWayDiffOutcome.CustomizedValueSameUpdate + ? FieldUpgradeStateEnum.SameUpdate + : FieldUpgradeStateEnum.NoUpdate, + }; + } break; case ThreeWayDiffConflict.SOLVABLE: