From bc351862df6d4d08862cfb8f6b2c60ca817418c5 Mon Sep 17 00:00:00 2001 From: Jan Monschke Date: Mon, 22 Jan 2024 17:32:14 +0100 Subject: [PATCH] [SecuritySolution] Reset `updated`, `changed` and `version` when duplicating a timeline (#175110) ## Summary Fixes https://github.com/elastic/kibana/issues/173968 When duplicating a timeline (note: not the same as `save as new`), the save status of the duplicate timeline wasn't displaying correctly (https://github.com/elastic/kibana/issues/173968). That's because we did not reset the local values of `updated`, `changed` and `version`. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios (cherry picked from commit 8d2bab7aa8182b9434d0c0cd2ec9cbfa5e703ef0) --- .../components/open_timeline/helpers.test.ts | 7 +++- .../components/open_timeline/helpers.ts | 35 ++++++++++++------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.test.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.test.ts index 6bd865e2750a2..4abe201b33901 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.test.ts @@ -777,7 +777,12 @@ describe('helpers', () => { expect(dispatchAddTimeline).toHaveBeenCalledWith({ id: TimelineId.active, savedTimeline: true, - timeline: mockTimelineModel, + timeline: { + ...mockTimelineModel, + version: null, + updated: undefined, + changed: undefined, + }, }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts index e4f5f8746cc0c..e4a738cbe55e3 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts @@ -435,18 +435,22 @@ export const dispatchUpdateTimeline = preventSettingQuery, }: UpdateTimeline): (() => void) => () => { - if (!isEmpty(timeline.indexNames)) { + let _timeline = timeline; + if (duplicate) { + _timeline = { ...timeline, updated: undefined, changed: undefined, version: null }; + } + if (!isEmpty(_timeline.indexNames)) { dispatch( sourcererActions.setSelectedDataView({ id: SourcererScopeName.timeline, - selectedDataViewId: timeline.dataViewId, - selectedPatterns: timeline.indexNames, + selectedDataViewId: _timeline.dataViewId, + selectedPatterns: _timeline.indexNames, }) ); } if ( - timeline.status === TimelineStatus.immutable && - timeline.timelineType === TimelineType.template + _timeline.status === TimelineStatus.immutable && + _timeline.timelineType === TimelineType.template ) { dispatch( dispatchSetRelativeRangeDatePicker({ @@ -461,24 +465,29 @@ export const dispatchUpdateTimeline = dispatch(dispatchSetTimelineRangeDatePicker({ from, to })); } dispatch( - dispatchAddTimeline({ id, timeline, resolveTimelineConfig, savedTimeline: duplicate }) + dispatchAddTimeline({ + id, + timeline: _timeline, + resolveTimelineConfig, + savedTimeline: duplicate, + }) ); if ( !preventSettingQuery && - timeline.kqlQuery != null && - timeline.kqlQuery.filterQuery != null && - timeline.kqlQuery.filterQuery.kuery != null && - timeline.kqlQuery.filterQuery.kuery.expression !== '' + _timeline.kqlQuery != null && + _timeline.kqlQuery.filterQuery != null && + _timeline.kqlQuery.filterQuery.kuery != null && + _timeline.kqlQuery.filterQuery.kuery.expression !== '' ) { dispatch( dispatchApplyKqlFilterQuery({ id, filterQuery: { kuery: { - kind: timeline.kqlQuery.filterQuery.kuery.kind ?? 'kuery', - expression: timeline.kqlQuery.filterQuery.kuery.expression || '', + kind: _timeline.kqlQuery.filterQuery.kuery.kind ?? 'kuery', + expression: _timeline.kqlQuery.filterQuery.kuery.expression || '', }, - serializedQuery: timeline.kqlQuery.filterQuery.serializedQuery || '', + serializedQuery: _timeline.kqlQuery.filterQuery.serializedQuery || '', }, }) );