[Threat Hunting Investigations][OpenAPI] Use timeline's generated enums (#189410)

## Summary

Fixes https://github.com/elastic/security-team/issues/10132.

This PR is the first on in a series of PRs to adopt the newly generate
OpenAPI types in the timeline server code base. As a first step, we're
migrating to the newly generated enums only. This has almost no impact
on the schemas and is mostly a one-to-one change.

Despite there being changes in more than 150 files, the review should be
pretty straight-forward. The most changes come from the new distinction
of enums and the actual type of an enum. Meaning a lot of imports and
enum usages needed a simple change.

In some places I found duplicate or unused types and the OpenAPI types
still had a couple of minor mistakes.

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
This commit is contained in:
Jan Monschke 2024-08-06 11:21:23 +02:00 committed by GitHub
parent 769fb994df
commit 13b15bd2e3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
169 changed files with 1405 additions and 1219 deletions

View file

@ -14,7 +14,36 @@ import type { Maybe } from '../../../search_strategy';
import { Direction } from '../../../search_strategy';
import type { PinnedEvent } from '../pinned_events/pinned_events_route';
import { PinnedEventRuntimeType } from '../pinned_events/pinned_events_route';
// TODO https://github.com/elastic/security-team/issues/7491
import { ErrorSchema } from './error_schema';
import type { DataProviderType } from './components.gen';
import {
DataProviderTypeEnum,
RowRendererId,
RowRendererIdEnum,
SortFieldTimeline,
SortFieldTimelineEnum,
TemplateTimelineType,
TemplateTimelineTypeEnum,
TimelineStatus,
TimelineStatusEnum,
TimelineType,
TimelineTypeEnum,
} from './components.gen';
export {
DataProviderType,
DataProviderTypeEnum,
RowRendererId,
RowRendererIdEnum,
SortFieldTimeline,
SortFieldTimelineEnum,
TemplateTimelineType,
TemplateTimelineTypeEnum,
TimelineStatus,
TimelineStatusEnum,
TimelineType,
TimelineTypeEnum,
};
/**
* Outcome is a property of the saved object resolve api
@ -40,8 +69,6 @@ export const SavedObjectResolveAliasPurpose = runtimeTypes.union([
runtimeTypes.literal('savedObjectImport'),
]);
import { ErrorSchema } from './error_schema';
export const BareNoteSchema = runtimeTypes.intersection([
runtimeTypes.type({
timelineId: runtimeTypes.string,
@ -133,14 +160,9 @@ const SavedDataProviderQueryMatchRuntimeType = runtimeTypes.partial({
queryMatch: unionWithNullType(SavedDataProviderQueryMatchBasicRuntimeType),
});
export enum DataProviderType {
default = 'default',
template = 'template',
}
export const DataProviderTypeLiteralRt = runtimeTypes.union([
runtimeTypes.literal(DataProviderType.default),
runtimeTypes.literal(DataProviderType.template),
runtimeTypes.literal(DataProviderTypeEnum.default),
runtimeTypes.literal(DataProviderTypeEnum.template),
]);
const SavedDataProviderRuntimeType = runtimeTypes.partial({
@ -251,93 +273,26 @@ export type Sort = runtimeTypes.TypeOf<typeof SavedSortRuntimeType>;
* Timeline Statuses
*/
export enum TimelineStatus {
active = 'active',
draft = 'draft',
immutable = 'immutable',
}
export const TimelineStatusLiteralRt = runtimeTypes.union([
runtimeTypes.literal(TimelineStatus.active),
runtimeTypes.literal(TimelineStatus.draft),
runtimeTypes.literal(TimelineStatus.immutable),
runtimeTypes.literal(TimelineStatusEnum.active),
runtimeTypes.literal(TimelineStatusEnum.draft),
runtimeTypes.literal(TimelineStatusEnum.immutable),
]);
const TimelineStatusLiteralWithNullRt = unionWithNullType(TimelineStatusLiteralRt);
export const RowRendererCount = Object.keys(RowRendererIdEnum).length;
export const RowRendererValues = Object.values(RowRendererId.Values);
export type TimelineStatusLiteralWithNull = runtimeTypes.TypeOf<
typeof TimelineStatusLiteralWithNullRt
>;
export enum RowRendererId {
/** event.kind: signal */
alert = 'alert',
/** endpoint alerts (created on the endpoint) */
alerts = 'alerts',
auditd = 'auditd',
auditd_file = 'auditd_file',
library = 'library',
netflow = 'netflow',
plain = 'plain',
registry = 'registry',
suricata = 'suricata',
system = 'system',
system_dns = 'system_dns',
system_endgame_process = 'system_endgame_process',
system_file = 'system_file',
system_fim = 'system_fim',
system_security_event = 'system_security_event',
system_socket = 'system_socket',
threat_match = 'threat_match',
zeek = 'zeek',
}
export const RowRendererCount = Object.keys(RowRendererId).length;
const RowRendererIdRuntimeType = stringEnum(RowRendererId, 'RowRendererId');
const RowRendererIdRuntimeType = stringEnum(RowRendererIdEnum, 'RowRendererId');
/**
* Timeline template type
* Timeline types
*/
export enum TemplateTimelineType {
elastic = 'elastic',
custom = 'custom',
}
export const TemplateTimelineTypeLiteralRt = runtimeTypes.union([
runtimeTypes.literal(TemplateTimelineType.elastic),
runtimeTypes.literal(TemplateTimelineType.custom),
]);
export const TemplateTimelineTypeLiteralWithNullRt = unionWithNullType(
TemplateTimelineTypeLiteralRt
);
export type TemplateTimelineTypeLiteral = runtimeTypes.TypeOf<typeof TemplateTimelineTypeLiteralRt>;
export type TemplateTimelineTypeLiteralWithNull = runtimeTypes.TypeOf<
typeof TemplateTimelineTypeLiteralWithNullRt
>;
/*
* Timeline Types
*/
export enum TimelineType {
default = 'default',
template = 'template',
}
export const TimelineTypeLiteralRt = runtimeTypes.union([
runtimeTypes.literal(TimelineType.template),
runtimeTypes.literal(TimelineType.default),
runtimeTypes.literal(TimelineTypeEnum.template),
runtimeTypes.literal(TimelineTypeEnum.default),
]);
export const TimelineTypeLiteralWithNullRt = unionWithNullType(TimelineTypeLiteralRt);
export type TimelineTypeLiteral = runtimeTypes.TypeOf<typeof TimelineTypeLiteralRt>;
export type TimelineTypeLiteralWithNull = runtimeTypes.TypeOf<typeof TimelineTypeLiteralWithNullRt>;
/**
* This is the response type
*/
@ -483,18 +438,11 @@ export const TimelineErrorResponseType = runtimeTypes.union([
export type TimelineErrorResponse = runtimeTypes.TypeOf<typeof TimelineErrorResponseType>;
export type TimelineResponse = runtimeTypes.TypeOf<typeof TimelineResponseType>;
export enum SortFieldTimeline {
title = 'title',
description = 'description',
updated = 'updated',
created = 'created',
}
export const sortFieldTimeline = runtimeTypes.union([
runtimeTypes.literal(SortFieldTimeline.title),
runtimeTypes.literal(SortFieldTimeline.description),
runtimeTypes.literal(SortFieldTimeline.updated),
runtimeTypes.literal(SortFieldTimeline.created),
runtimeTypes.literal(SortFieldTimelineEnum.title),
runtimeTypes.literal(SortFieldTimelineEnum.description),
runtimeTypes.literal(SortFieldTimelineEnum.updated),
runtimeTypes.literal(SortFieldTimelineEnum.created),
]);
export const direction = runtimeTypes.union([
@ -569,7 +517,6 @@ export const pageInfoTimeline = runtimeTypes.type({
export interface PageInfoTimeline {
pageIndex: number;
pageSize: number;
}
@ -661,16 +608,16 @@ export interface SerializedFilterQueryResult {
filterQuery?: Maybe<SerializedKueryQueryResult>;
}
export interface SerializedKueryQueryResult {
kuery?: Maybe<KueryFilterQueryResult>;
serializedQuery?: Maybe<string>;
}
export interface KueryFilterQueryResult {
kind?: Maybe<string>;
expression?: Maybe<string>;
}
export interface SerializedKueryQueryResult {
kuery?: Maybe<KueryFilterQueryResult>;
serializedQuery?: Maybe<string>;
}
export interface TimelineResult {
columns?: Maybe<ColumnHeaderResult[]>;
created?: Maybe<number>;
@ -717,11 +664,6 @@ export interface SortTimeline {
sortOrder: Direction;
}
export interface ExportTimelineNotFoundError {
statusCode: number;
message: string;
}
export interface GetAllTimelineVariables {
pageInfo: PageInfoTimeline;
search?: Maybe<string>;

View file

@ -14,7 +14,6 @@
* version: not applicable
*/
import type { ZodTypeDef } from 'zod';
import { z } from 'zod';
/**
@ -33,6 +32,14 @@ export const DataProviderType = z.enum(['default', 'template']);
export type DataProviderTypeEnum = typeof DataProviderType.enum;
export const DataProviderTypeEnum = DataProviderType.enum;
/**
* The type of the timeline template.
*/
export type TemplateTimelineType = z.infer<typeof TemplateTimelineType>;
export const TemplateTimelineType = z.enum(['elastic', 'custom']);
export type TemplateTimelineTypeEnum = typeof TemplateTimelineType.enum;
export const TemplateTimelineTypeEnum = TemplateTimelineType.enum;
export type ColumnHeaderResult = z.infer<typeof ColumnHeaderResult>;
export const ColumnHeaderResult = z.object({
aggregatable: z.boolean().optional(),
@ -50,46 +57,33 @@ export const ColumnHeaderResult = z.object({
export type QueryMatchResult = z.infer<typeof QueryMatchResult>;
export const QueryMatchResult = z.object({
field: z.string().optional(),
displayField: z.string().optional(),
value: z.string().optional(),
displayValue: z.string().optional(),
operator: z.string().optional(),
field: z.string().nullable().optional(),
displayField: z.string().nullable().optional(),
value: z.string().nullable().optional(),
displayValue: z.string().nullable().optional(),
operator: z.string().nullable().optional(),
});
export interface DataProviderResult {
id?: string;
name?: string;
enabled?: boolean;
excluded?: boolean;
kqlQuery?: string;
queryMatch?: QueryMatchResult;
and?: DataProviderResult[];
type?: DataProviderType;
}
export interface DataProviderResultInput {
id?: string;
name?: string;
enabled?: boolean;
excluded?: boolean;
kqlQuery?: string;
queryMatch?: QueryMatchResult;
and?: DataProviderResultInput[];
type?: DataProviderType;
}
export const DataProviderResult: z.ZodType<
DataProviderResult,
ZodTypeDef,
DataProviderResultInput
> = z.object({
id: z.string().optional(),
name: z.string().optional(),
enabled: z.boolean().optional(),
excluded: z.boolean().optional(),
kqlQuery: z.string().optional(),
export type DataProviderQueryMatch = z.infer<typeof DataProviderQueryMatch>;
export const DataProviderQueryMatch = z.object({
enabled: z.boolean().nullable().optional(),
excluded: z.boolean().nullable().optional(),
id: z.string().nullable().optional(),
kqlQuery: z.string().nullable().optional(),
name: z.string().nullable().optional(),
queryMatch: QueryMatchResult.optional(),
and: z.array(z.lazy(() => DataProviderResult)).optional(),
type: DataProviderType.optional(),
});
export type DataProviderResult = z.infer<typeof DataProviderResult>;
export const DataProviderResult = z.object({
and: z.array(DataProviderQueryMatch).nullable().optional(),
enabled: z.boolean().nullable().optional(),
excluded: z.boolean().nullable().optional(),
id: z.string().nullable().optional(),
kqlQuery: z.string().nullable().optional(),
name: z.string().nullable().optional(),
queryMatch: QueryMatchResult.nullable().optional(),
type: DataProviderType.nullable().optional(),
});
export type RowRendererId = z.infer<typeof RowRendererId>;
@ -154,31 +148,33 @@ export const SerializedFilterQueryResult = z.object({
.object({
kuery: z
.object({
kind: z.string().optional(),
expression: z.string().optional(),
kind: z.string().nullable().optional(),
expression: z.string().nullable().optional(),
})
.nullable()
.optional(),
serializedQuery: z.string().optional(),
serializedQuery: z.string().nullable().optional(),
})
.nullable()
.optional(),
});
export type Sort = z.infer<typeof Sort>;
export const Sort = z.object({
export type SortObject = z.infer<typeof SortObject>;
export const SortObject = z.object({
columnId: z.string().nullable().optional(),
columnType: z.string().nullable().optional(),
sortDirection: z.string().nullable().optional(),
});
export type Sort = z.infer<typeof Sort>;
export const Sort = z.union([SortObject, z.array(SortObject)]);
export type SavedTimeline = z.infer<typeof SavedTimeline>;
export const SavedTimeline = z.object({
columns: ColumnHeaderResult.nullable().optional(),
columns: z.array(ColumnHeaderResult).nullable().optional(),
created: z.number().nullable().optional(),
createdBy: z.string().nullable().optional(),
dataProviders: z
.array(z.lazy(() => DataProviderResult))
.nullable()
.optional(),
dataProviders: z.array(DataProviderResult).nullable().optional(),
dataViewId: z.string().nullable().optional(),
dateRange: z
.object({
@ -190,9 +186,11 @@ export const SavedTimeline = z.object({
description: z.string().nullable().optional(),
eqlOptions: z
.object({
eventCategoryField: z.string().optional(),
tiebreakerField: z.string().optional(),
timestampField: z.string().optional(),
eventCategoryField: z.string().nullable().optional(),
query: z.string().nullable().optional(),
size: z.union([z.string().nullable(), z.number().nullable()]).optional(),
tiebreakerField: z.string().nullable().optional(),
timestampField: z.string().nullable().optional(),
})
.nullable()
.optional(),

View file

@ -21,12 +21,20 @@ components:
# enum default value is temporarily unsupported by the code generator
# default: default
description: The type of data provider to create. Valid values are `default` and `template`.
TemplateTimelineType:
type: string
enum:
- elastic
- custom
description: The type of the timeline template.
SavedTimeline:
type: object
properties:
columns:
$ref: '#/components/schemas/ColumnHeaderResult'
type: array
nullable: true
items:
$ref: '#/components/schemas/ColumnHeaderResult'
created:
type: number
nullable: true
@ -62,10 +70,22 @@ components:
properties:
eventCategoryField:
type: string
nullable: true
query:
type: string
nullable: true
size:
oneOf:
- type: string
nullable: true
- type: number
nullable: true
tiebreakerField:
type: string
nullable: true
timestampField:
type: string
nullable: true
eventType:
type: string
nullable: true
@ -223,35 +243,68 @@ components:
properties:
field:
type: string
nullable: true
displayField:
type: string
nullable: true
value:
type: string
nullable: true
displayValue:
type: string
nullable: true
operator:
type: string
nullable: true
DataProviderResult:
type: object
properties:
id:
type: string
name:
type: string
enabled:
type: boolean
excluded:
type: boolean
kqlQuery:
type: string
queryMatch:
$ref: '#/components/schemas/QueryMatchResult'
and:
type: array
nullable: true
items:
$ref: '#/components/schemas/DataProviderResult'
$ref: '#/components/schemas/DataProviderQueryMatch'
enabled:
type: boolean
nullable: true
excluded:
type: boolean
nullable: true
id:
type: string
nullable: true
kqlQuery:
type: string
nullable: true
name:
type: string
nullable: true
queryMatch:
$ref: '#/components/schemas/QueryMatchResult'
nullable: true
type:
$ref: '#/components/schemas/DataProviderType'
nullable: true
DataProviderQueryMatch:
type: object
properties:
enabled:
type: boolean
nullable: true
excluded:
type: boolean
nullable: true
id:
type: string
nullable: true
kqlQuery:
type: string
nullable: true
name:
type: string
nullable: true
queryMatch:
$ref: '#/components/schemas/QueryMatchResult'
BareNote:
type: object
required: [timelineId]
@ -383,16 +436,21 @@ components:
properties:
filterQuery:
type: object
nullable: true
properties:
kuery:
type: object
nullable: true
properties:
kind:
type: string
nullable: true
expression:
type: string
nullable: true
serializedQuery:
type: string
nullable: true
PinnedEvent:
type: object
required: [eventId, pinnedEventId, timelineId, version]
@ -418,6 +476,12 @@ components:
version:
type: string
Sort:
oneOf:
- $ref: '#/components/schemas/SortObject'
- type: array
items:
$ref: '#/components/schemas/SortObject'
SortObject:
type: object
properties:
columnId:

View file

@ -11,7 +11,7 @@ import type {
TimelineType,
TimelineStatus,
RowRendererId,
} from '../../api/timeline/model/api';
} from '../../api/timeline';
export * from './events';

View file

@ -6,7 +6,7 @@
*/
import type { Filter } from '@kbn/es-query';
import type { RowRendererId, TimelineTypeLiteral } from '../../api/timeline/model/api';
import type { RowRendererId, TimelineType } from '../../api/timeline/model/api';
import type { Direction } from '../../search_strategy';
import type { ColumnHeaderOptions, ColumnId } from '../header_actions';
@ -52,7 +52,7 @@ export interface TimelinePersistInput {
show?: boolean;
sort?: SortColumnTimeline[];
showCheckboxes?: boolean;
timelineType?: TimelineTypeLiteral;
timelineType?: TimelineType;
templateTimelineId?: string | null;
templateTimelineVersion?: number | null;
title?: string;

View file

@ -1028,27 +1028,55 @@ components:
type: boolean
type:
type: string
DataProviderQueryMatch:
type: object
properties:
enabled:
nullable: true
type: boolean
excluded:
nullable: true
type: boolean
id:
nullable: true
type: string
kqlQuery:
nullable: true
type: string
name:
nullable: true
type: string
queryMatch:
$ref: '#/components/schemas/QueryMatchResult'
DataProviderResult:
type: object
properties:
and:
items:
$ref: '#/components/schemas/DataProviderResult'
$ref: '#/components/schemas/DataProviderQueryMatch'
nullable: true
type: array
enabled:
nullable: true
type: boolean
excluded:
nullable: true
type: boolean
id:
nullable: true
type: string
kqlQuery:
nullable: true
type: string
name:
nullable: true
type: string
queryMatch:
$ref: '#/components/schemas/QueryMatchResult'
nullable: true
type:
$ref: '#/components/schemas/DataProviderType'
nullable: true
DataProviderType:
description: >-
The type of data provider to create. Valid values are `default` and
@ -1235,14 +1263,19 @@ components:
type: object
properties:
displayField:
nullable: true
type: string
displayValue:
nullable: true
type: string
field:
nullable: true
type: string
operator:
nullable: true
type: string
value:
nullable: true
type: string
Readable:
type: object
@ -1295,8 +1328,10 @@ components:
type: object
properties:
columns:
$ref: '#/components/schemas/ColumnHeaderResult'
items:
$ref: '#/components/schemas/ColumnHeaderResult'
nullable: true
type: array
created:
nullable: true
type: number
@ -1331,10 +1366,22 @@ components:
type: object
properties:
eventCategoryField:
nullable: true
type: string
query:
nullable: true
type: string
size:
oneOf:
- nullable: true
type: string
- nullable: true
type: number
tiebreakerField:
nullable: true
type: string
timestampField:
nullable: true
type: string
eventType:
nullable: true
@ -1403,18 +1450,37 @@ components:
type: object
properties:
filterQuery:
nullable: true
type: object
properties:
kuery:
nullable: true
type: object
properties:
expression:
nullable: true
type: string
kind:
nullable: true
type: string
serializedQuery:
nullable: true
type: string
Sort:
oneOf:
- $ref: '#/components/schemas/SortObject'
- items:
$ref: '#/components/schemas/SortObject'
type: array
SortFieldTimeline:
description: The field to sort the timelines by.
enum:
- title
- description
- updated
- created
type: string
SortObject:
type: object
properties:
columnId:
@ -1426,14 +1492,6 @@ components:
sortDirection:
nullable: true
type: string
SortFieldTimeline:
description: The field to sort the timelines by.
enum:
- title
- description
- updated
- created
type: string
TimelineResponse:
allOf:
- $ref: '#/components/schemas/SavedTimeline'

View file

@ -1028,27 +1028,55 @@ components:
type: boolean
type:
type: string
DataProviderQueryMatch:
type: object
properties:
enabled:
nullable: true
type: boolean
excluded:
nullable: true
type: boolean
id:
nullable: true
type: string
kqlQuery:
nullable: true
type: string
name:
nullable: true
type: string
queryMatch:
$ref: '#/components/schemas/QueryMatchResult'
DataProviderResult:
type: object
properties:
and:
items:
$ref: '#/components/schemas/DataProviderResult'
$ref: '#/components/schemas/DataProviderQueryMatch'
nullable: true
type: array
enabled:
nullable: true
type: boolean
excluded:
nullable: true
type: boolean
id:
nullable: true
type: string
kqlQuery:
nullable: true
type: string
name:
nullable: true
type: string
queryMatch:
$ref: '#/components/schemas/QueryMatchResult'
nullable: true
type:
$ref: '#/components/schemas/DataProviderType'
nullable: true
DataProviderType:
description: >-
The type of data provider to create. Valid values are `default` and
@ -1235,14 +1263,19 @@ components:
type: object
properties:
displayField:
nullable: true
type: string
displayValue:
nullable: true
type: string
field:
nullable: true
type: string
operator:
nullable: true
type: string
value:
nullable: true
type: string
Readable:
type: object
@ -1295,8 +1328,10 @@ components:
type: object
properties:
columns:
$ref: '#/components/schemas/ColumnHeaderResult'
items:
$ref: '#/components/schemas/ColumnHeaderResult'
nullable: true
type: array
created:
nullable: true
type: number
@ -1331,10 +1366,22 @@ components:
type: object
properties:
eventCategoryField:
nullable: true
type: string
query:
nullable: true
type: string
size:
oneOf:
- nullable: true
type: string
- nullable: true
type: number
tiebreakerField:
nullable: true
type: string
timestampField:
nullable: true
type: string
eventType:
nullable: true
@ -1403,18 +1450,37 @@ components:
type: object
properties:
filterQuery:
nullable: true
type: object
properties:
kuery:
nullable: true
type: object
properties:
expression:
nullable: true
type: string
kind:
nullable: true
type: string
serializedQuery:
nullable: true
type: string
Sort:
oneOf:
- $ref: '#/components/schemas/SortObject'
- items:
$ref: '#/components/schemas/SortObject'
type: array
SortFieldTimeline:
description: The field to sort the timelines by.
enum:
- title
- description
- updated
- created
type: string
SortObject:
type: object
properties:
columnId:
@ -1426,14 +1492,6 @@ components:
sortDirection:
nullable: true
type: string
SortFieldTimeline:
description: The field to sort the timelines by.
enum:
- title
- description
- updated
- created
type: string
TimelineResponse:
allOf:
- $ref: '#/components/schemas/SavedTimeline'

View file

@ -26,7 +26,7 @@ import {
} from '../../hooks/translations';
import { displaySuccessToast, useStateToaster } from '../toasters';
import { TimelineId } from '../../../../common/types/timeline';
import { TimelineType } from '../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../common/api/timeline';
import {
addProviderToTimeline,
fieldWasDroppedOnTimelineColumns,
@ -117,7 +117,7 @@ export const DragDropContextWrapperComponent: React.FC<Props> = ({ browserFields
const onAddedToTimeline = useCallback(
(fieldOrValue: string) => {
const message =
timelineType === TimelineType.template
timelineType === TimelineTypeEnum.template
? ADDED_TO_TIMELINE_TEMPLATE_MESSAGE(fieldOrValue)
: ADDED_TO_TIMELINE_MESSAGE(fieldOrValue);
displaySuccessToast(message, dispatchToaster);

View file

@ -21,7 +21,7 @@ import { sourcererActions } from '../../../store/actions';
import { SourcererScopeName } from '../../../../sourcerer/store/model';
import type { DataProvider } from '../../../../../common/types';
import { TimelineId } from '../../../../../common/types/timeline';
import { TimelineType } from '../../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../../common/api/timeline';
import { useCreateTimeline } from '../../../../timelines/hooks/use_create_timeline';
import { ACTION_INVESTIGATE_IN_TIMELINE } from '../../../../detections/components/alerts_table/translations';
@ -58,7 +58,7 @@ export const InvestigateInTimelineButton: FC<
const clearTimeline = useCreateTimeline({
timelineId: TimelineId.active,
timelineType: hasTemplateProviders ? TimelineType.template : TimelineType.default,
timelineType: hasTemplateProviders ? TimelineTypeEnum.template : TimelineTypeEnum.default,
});
const configureAndOpenTimeline = useCallback(async () => {

View file

@ -13,7 +13,7 @@ import type { Filter } from '@kbn/es-query';
import { dataTableActions } from '@kbn/securitysolution-data-table';
import type { TableId } from '@kbn/securitysolution-data-table';
import type { CustomBulkAction } from '../../../../common/types';
import { RowRendererId } from '../../../../common/api/timeline';
import { RowRendererValues } from '../../../../common/api/timeline';
import { StatefulEventsViewer } from '../events_viewer';
import { eventsDefaultModel } from '../events_viewer/default_model';
import { MatrixHistogram } from '../matrix_histogram';
@ -131,7 +131,7 @@ const EventsQueryTabBodyComponent: React.FC<EventsQueryTabBodyComponentProps> =
const defaultModel = useMemo(
() => ({
...eventsDefaultModel,
excludedRowRendererIds: showExternalAlerts ? Object.values(RowRendererId) : [],
excludedRowRendererIds: showExternalAlerts ? RowRendererValues : [],
}),
[showExternalAlerts]
);

View file

@ -5,7 +5,7 @@
* 2.0.
*/
import { TimelineType } from '../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../common/api/timeline';
import { render, screen, waitFor } from '@testing-library/react';
import type { ComponentProps } from 'react';
import React from 'react';
@ -35,7 +35,7 @@ const toggleShowNotesMock = jest.fn();
const renderTestComponent = (props: Partial<ComponentProps<typeof AddEventNoteAction>> = {}) => {
const localProps: ComponentProps<typeof AddEventNoteAction> = {
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
eventId: 'event-1',
ariaLabel: 'Add Note',
toggleShowNotes: toggleShowNotesMock,
@ -79,7 +79,7 @@ describe('AddEventNoteAction', () => {
ariaLabel: 'Add Note',
'data-test-subj': 'add-note',
isDisabled: false,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
toggleShowNotes: expect.any(Function),
toolTip: '2 Notes available. Click to view them & add more.',
eventId: 'event-1',
@ -101,7 +101,7 @@ describe('AddEventNoteAction', () => {
ariaLabel: 'Add Note',
'data-test-subj': 'add-note',
isDisabled: false,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
toggleShowNotes: expect.any(Function),
toolTip: '1 Note available. Click to view it & add more.',
eventId: 'event-2',
@ -123,7 +123,7 @@ describe('AddEventNoteAction', () => {
ariaLabel: 'Add Note',
'data-test-subj': 'add-note',
isDisabled: false,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
toggleShowNotes: expect.any(Function),
toolTip: 'Add Note',
eventId: 'event-3',

View file

@ -7,7 +7,7 @@
import React, { useMemo } from 'react';
import { NotesButton } from '../../../timelines/components/timeline/properties/helpers';
import { TimelineType } from '../../../../common/api/timeline';
import { type TimelineType, TimelineTypeEnum } from '../../../../common/api/timeline';
import { useUserPrivileges } from '../user_privileges';
import * as i18n from './translations';
import { ActionIconItem } from './action_icon_item';
@ -46,7 +46,7 @@ const AddEventNoteActionComponent: React.FC<AddEventNoteActionProps> = ({
timelineType={timelineType}
toggleShowNotes={toggleShowNotes}
toolTip={
timelineType === TimelineType.template ? i18n.NOTES_DISABLE_TOOLTIP : NOTES_TOOLTIP
timelineType === TimelineTypeEnum.template ? i18n.NOTES_DISABLE_TOOLTIP : NOTES_TOOLTIP
}
eventId={eventId}
notesCount={notesCount}

View file

@ -12,7 +12,7 @@ import { PinEventAction } from './pin_event_action';
import { useUserPrivileges } from '../user_privileges';
import { getEndpointPrivilegesInitialStateMock } from '../user_privileges/endpoint/mocks';
import { TestProviders } from '../../mock';
import { TimelineType } from '../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../common/api/timeline';
jest.mock('../user_privileges');
const useUserPrivilegesMock = useUserPrivileges as jest.Mock;
@ -36,7 +36,7 @@ describe('PinEventAction', () => {
noteIds={[]}
onPinClicked={jest.fn}
eventIsPinned={false}
timelineType={TimelineType.default}
timelineType={TimelineTypeEnum.default}
/>
</TestProviders>
);
@ -57,7 +57,7 @@ describe('PinEventAction', () => {
noteIds={[]}
onPinClicked={jest.fn}
eventIsPinned={false}
timelineType={TimelineType.default}
timelineType={TimelineTypeEnum.default}
/>
</TestProviders>
);

View file

@ -6,10 +6,10 @@
*/
import { isEmpty } from 'lodash/fp';
import type { TimelineTypeLiteral } from '../../../../common/api/timeline';
import type { TimelineType } from '../../../../common/api/timeline';
import { appendSearch } from './helpers';
export const getTimelineTabsUrl = (tabName: TimelineTypeLiteral | 'notes', search?: string) =>
export const getTimelineTabsUrl = (tabName: TimelineType | 'notes', search?: string) =>
`/${tabName}${appendSearch(search)}`;
export const getTimelineUrl = (id: string, graphEventId?: string) =>

View file

@ -9,7 +9,7 @@ import { useMemo } from 'react';
import type { Filter } from '@kbn/es-query';
import { FILTERS, BooleanRelation, FilterStateStore } from '@kbn/es-query';
import type { QueryOperator, DataProvider } from '@kbn/timelines-plugin/common';
import { DataProviderType } from '../../../../../../common/api/timeline';
import { DataProviderTypeEnum } from '../../../../../../common/api/timeline';
import { replaceParamsQuery } from './replace_params_query';
import type { TimelineEventsDetailsItem } from '../../../../../../common/search_strategy';
import {
@ -64,7 +64,7 @@ const dataProviderStub: DataProvider = {
name: '',
excluded: false,
kqlQuery: '',
type: DataProviderType.default,
type: DataProviderTypeEnum.default,
queryMatch: {
field: '',
value: '',
@ -88,7 +88,7 @@ const buildDataProviders = (
name: field,
excluded,
kqlQuery: '',
type: isTemplate ? DataProviderType.template : DataProviderType.default,
type: isTemplate ? DataProviderTypeEnum.template : DataProviderTypeEnum.default,
queryMatch: {
field,
value: result,
@ -102,7 +102,7 @@ const buildDataProviders = (
name: field,
excluded,
kqlQuery: '',
type: isTemplate ? DataProviderType.template : DataProviderType.default,
type: isTemplate ? DataProviderTypeEnum.template : DataProviderTypeEnum.default,
queryMatch: {
field,
value: result,

View file

@ -6,7 +6,7 @@
*/
import { renderHook } from '@testing-library/react-hooks';
import type { QueryOperator } from '@kbn/timelines-plugin/common';
import { DataProviderType } from '../../../../../../common/api/timeline';
import { DataProviderTypeEnum } from '../../../../../../common/api/timeline';
import { useInsightQuery } from './use_insight_query';
import { TestProviders } from '../../../../mock';
import type { UseInsightQuery, UseInsightQueryResult } from './use_insight_query';
@ -19,7 +19,7 @@ const mockProvider = {
name: 'test',
excluded: false,
kqlQuery: '',
type: DataProviderType.default,
type: DataProviderTypeEnum.default,
queryMatch: {
field: 'event.id',
value: '*',

View file

@ -9,7 +9,7 @@ import React, { useCallback, memo } from 'react';
import type { EuiSelectableOption, EuiMarkdownEditorUiPlugin } from '@elastic/eui';
import { EuiModalBody, EuiModalHeader, EuiCodeBlock } from '@elastic/eui';
import { TimelineType } from '../../../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../../../common/api/timeline';
import { SelectableTimeline } from '../../../../../timelines/components/timeline/selectable_timeline';
import type { OpenTimelineResult } from '../../../../../timelines/components/open_timeline/types';
import { getTimelineUrl, useFormatUrl } from '../../../link_to';
@ -66,7 +66,7 @@ const TimelineEditorComponent: React.FC<TimelineEditorProps> = ({ onClosePopover
getSelectableOptions={handleGetSelectableOptions}
onTimelineChange={handleTimelineChange}
onClosePopover={onClosePopover}
timelineType={TimelineType.default}
timelineType={TimelineTypeEnum.default}
/>
</EuiModalBody>
</>

View file

@ -12,7 +12,7 @@ import { useHistory } from 'react-router-dom';
import { useShowTimelineForGivenPath } from '../../utils/timeline/use_show_timeline_for_path';
import type { TimelineId } from '../../../../common/types';
import { TimelineTabs } from '../../../../common/types';
import { TimelineStatus } from '../../../../common/api/timeline';
import { TimelineStatusEnum } from '../../../../common/api/timeline';
import { useKibana } from '../../lib/kibana';
import { useDeepEqualSelector } from '../use_selector';
import { APP_ID, APP_PATH } from '../../../../common/constants';
@ -82,7 +82,7 @@ export const useTimelineSavePrompt = (
if (
!getIsTimelineVisible(relativePath) &&
(changed || (timelineStatus === TimelineStatus.draft && updated != null))
(changed || (timelineStatus === TimelineStatusEnum.draft && updated != null))
) {
confirmSaveTimeline();
} else {
@ -111,7 +111,7 @@ export const useTimelineSavePrompt = (
// Confirm when the user has made any changes to a timeline
if (
!(nextAppId ?? '').includes(APP_ID) &&
(changed || (timelineStatus === TimelineStatus.draft && updated != null))
(changed || (timelineStatus === TimelineStatusEnum.draft && updated != null))
) {
return actions.confirm(
UNSAVED_TIMELINE_SAVE_PROMPT,

View file

@ -17,7 +17,7 @@ import memoizeOne from 'memoize-one';
import { prepareKQLParam } from '../../../../common/utils/kql';
import type { BrowserFields } from '../../../../common/search_strategy';
import type { DataProvider, DataProvidersAnd } from '../../../../common/types';
import { DataProviderType } from '../../../../common/api/timeline';
import { DataProviderTypeEnum } from '../../../../common/api/timeline';
import { EXISTS_OPERATOR } from '../../../../common/types/timeline';
export type PrimitiveOrArrayOfPrimitives =
@ -125,7 +125,7 @@ const buildQueryMatch = (
) =>
`${dataProvider.excluded ? 'NOT ' : ''}${
dataProvider.queryMatch.operator !== EXISTS_OPERATOR &&
dataProvider.type !== DataProviderType.template
dataProvider.type !== DataProviderTypeEnum.template
? checkIfFieldTypeIsNested(dataProvider.queryMatch.field, browserFields)
? convertNestedFieldToQuery(
dataProvider.queryMatch.field,

View file

@ -34,7 +34,7 @@ import {
} from '../../../common/constants';
import { networkModel } from '../../explore/network/store';
import { TimelineTabs, TimelineId } from '../../../common/types/timeline';
import { TimelineType, TimelineStatus } from '../../../common/api/timeline';
import { TimelineTypeEnum, TimelineStatusEnum } from '../../../common/api/timeline';
import { mockManagementState } from '../../management/store/reducer';
import type { ManagementState } from '../../management/types';
import { initialSourcererState, SourcererScopeName } from '../../sourcerer/store/model';
@ -364,7 +364,7 @@ export const mockGlobalState: State = {
kqlQuery: { filterQuery: null },
loadingEventIds: [],
title: '',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
noteIds: [],
@ -386,7 +386,7 @@ export const mockGlobalState: State = {
sortDirection: 'desc',
},
],
status: TimelineStatus.draft,
status: TimelineStatusEnum.draft,
version: null,
selectedEventIds: {},
isSelectAllChecked: false,

View file

@ -11,7 +11,11 @@ import type { DataTableModel } from '@kbn/securitysolution-data-table';
import { VIEW_SELECTION } from '../../../common/constants';
import type { TimelineResult } from '../../../common/api/timeline';
import { TimelineId, TimelineTabs } from '../../../common/types/timeline';
import { RowRendererId, TimelineType, TimelineStatus } from '../../../common/api/timeline';
import {
RowRendererIdEnum,
TimelineTypeEnum,
TimelineStatusEnum,
} from '../../../common/api/timeline';
import type { OpenTimelineResult } from '../../timelines/components/open_timeline/types';
import type { TimelineEventsDetailsItem } from '../../../common/search_strategy';
@ -128,7 +132,7 @@ export const mockOpenTimelineQueryResults = {
noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'],
pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'],
title: 'test 1',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
created: 1558386787614,
@ -242,7 +246,7 @@ export const mockOpenTimelineQueryResults = {
noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'],
pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'],
title: 'test 2',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
created: 1558386787614,
@ -356,7 +360,7 @@ export const mockOpenTimelineQueryResults = {
noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'],
pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'],
title: 'test 2',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
created: 1558386787614,
@ -470,7 +474,7 @@ export const mockOpenTimelineQueryResults = {
noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'],
pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'],
title: 'test 3',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
created: 1558386787614,
@ -584,7 +588,7 @@ export const mockOpenTimelineQueryResults = {
noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'],
pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'],
title: 'test 4',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
created: 1558386787614,
@ -698,7 +702,7 @@ export const mockOpenTimelineQueryResults = {
noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'],
pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'],
title: 'test 5',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
created: 1558386787614,
@ -812,7 +816,7 @@ export const mockOpenTimelineQueryResults = {
noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'],
pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'],
title: 'test 6',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
created: 1558386787614,
@ -926,7 +930,7 @@ export const mockOpenTimelineQueryResults = {
noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'],
pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'],
title: 'test 7',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
created: 1558386787614,
@ -1040,7 +1044,7 @@ export const mockOpenTimelineQueryResults = {
noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'],
pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'],
title: 'test 7',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
created: 1558386787614,
@ -1154,7 +1158,7 @@ export const mockOpenTimelineQueryResults = {
noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'],
pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'],
title: 'test 7',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
created: 1558386787614,
@ -1268,7 +1272,7 @@ export const mockOpenTimelineQueryResults = {
noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'],
pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'],
title: 'test 7',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
created: 1558386787614,
@ -1382,7 +1386,7 @@ export const mockOpenTimelineQueryResults = {
noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'],
pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'],
title: 'test 7',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
created: 1558386787614,
@ -1496,7 +1500,7 @@ export const mockOpenTimelineQueryResults = {
noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'],
pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'],
title: 'test 7',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
created: 1558386787614,
@ -1920,9 +1924,9 @@ export const mockTimelineModel: TimelineModel = {
sortDirection: Direction.desc,
},
],
status: TimelineStatus.active,
status: TimelineStatusEnum.active,
title: 'Test rule',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
version: '1',
@ -2001,7 +2005,7 @@ export const mockGetOneTimelineResult: TimelineResult = {
],
kqlMode: 'filter',
title: 'Test rule',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
savedQueryId: null,
@ -2051,24 +2055,24 @@ export const defaultTimelineProps: CreateTimelineProps = {
eventIdToNoteIds: {},
eventType: 'all',
excludedRowRendererIds: [
RowRendererId.alert,
RowRendererId.alerts,
RowRendererId.auditd,
RowRendererId.auditd_file,
RowRendererId.library,
RowRendererId.netflow,
RowRendererId.plain,
RowRendererId.registry,
RowRendererId.suricata,
RowRendererId.system,
RowRendererId.system_dns,
RowRendererId.system_endgame_process,
RowRendererId.system_file,
RowRendererId.system_fim,
RowRendererId.system_security_event,
RowRendererId.system_socket,
RowRendererId.threat_match,
RowRendererId.zeek,
RowRendererIdEnum.alert,
RowRendererIdEnum.alerts,
RowRendererIdEnum.auditd,
RowRendererIdEnum.auditd_file,
RowRendererIdEnum.library,
RowRendererIdEnum.netflow,
RowRendererIdEnum.plain,
RowRendererIdEnum.registry,
RowRendererIdEnum.suricata,
RowRendererIdEnum.system,
RowRendererIdEnum.system_dns,
RowRendererIdEnum.system_endgame_process,
RowRendererIdEnum.system_file,
RowRendererIdEnum.system_fim,
RowRendererIdEnum.system_security_event,
RowRendererIdEnum.system_socket,
RowRendererIdEnum.threat_match,
RowRendererIdEnum.zeek,
],
filters: [],
highlightedDropAndProviderId: '',
@ -2104,9 +2108,9 @@ export const defaultTimelineProps: CreateTimelineProps = {
sortDirection: Direction.desc,
},
],
status: TimelineStatus.draft,
status: TimelineStatusEnum.draft,
title: '',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineVersion: null,
templateTimelineId: null,
version: null,

View file

@ -21,7 +21,7 @@ import type { EnhancerOptions } from 'redux-devtools-extension';
import type { Storage } from '@kbn/kibana-utils-plugin/public';
import type { CoreStart } from '@kbn/core/public';
import reduceReducers from 'reduce-reducers';
import { TimelineType } from '../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../common/api/timeline';
import { TimelineId } from '../../../common/types';
import { initialGroupingState } from './grouping/reducer';
import type { GroupState } from './grouping/types';
@ -122,7 +122,7 @@ export const createStoreFactory = async (
id: TimelineId.active,
timelineById: {},
show: false,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
columns: [],
dataViewId: null,
indexNames: [],

View file

@ -33,7 +33,7 @@ import {
import type { CreateTimeline, UpdateTimelineLoading } from './types';
import type { EcsSecurityExtension as Ecs } from '@kbn/securitysolution-ecs';
import type { DataProvider } from '../../../../common/types/timeline';
import { TimelineType, TimelineStatus } from '../../../../common/api/timeline';
import { TimelineTypeEnum, TimelineStatusEnum } from '../../../../common/api/timeline';
import { TimelineId, TimelineTabs } from '../../../../common/types/timeline';
import type { ISearchStart } from '@kbn/data-plugin/public';
import { searchServiceMock } from '@kbn/data-plugin/public/search/mocks';
@ -440,9 +440,9 @@ describe('alert actions', () => {
sortDirection: 'desc',
},
],
status: TimelineStatus.draft,
status: TimelineStatusEnum.draft,
title: '',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
version: null,

View file

@ -52,7 +52,7 @@ import {
} from '../../../../common/detection_engine/utils';
import type { TimelineResult } from '../../../../common/api/timeline';
import { TimelineId } from '../../../../common/types/timeline';
import { TimelineStatus, TimelineType } from '../../../../common/api/timeline';
import { TimelineStatusEnum, TimelineTypeEnum } from '../../../../common/api/timeline';
import type {
SendAlertToTimelineActionProps,
ThresholdAggregationData,
@ -990,7 +990,7 @@ export const sendAlertToTimelineAction = async ({
const { timeline, notes } = formatTimelineResultToModel(
timelineTemplate,
true,
timelineTemplate.timelineType ?? TimelineType.default
timelineTemplate.timelineType ?? TimelineTypeEnum.default
);
const query = replaceTemplateFieldFromQuery(
timeline.kqlQuery?.filterQuery?.kuery?.expression ?? '',
@ -1056,9 +1056,9 @@ export const sendAlertToTimelineAction = async ({
...timeline,
excludedRowRendererIds: [],
title: '',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
status: TimelineStatus.draft,
status: TimelineStatusEnum.draft,
dataProviders,
eventType: 'all',
filters,

View file

@ -5,13 +5,11 @@
* 2.0.
*/
import { TimelineType } from '../../../../common/api/timeline';
import { DataProviderTypeEnum, TimelineTypeEnum } from '../../../../common/api/timeline';
import type { Filter } from '@kbn/es-query';
import { FilterStateStore } from '@kbn/es-query';
import type { DataProvider } from '../../../timelines/components/timeline/data_providers/data_provider';
import { DataProviderType } from '../../../timelines/components/timeline/data_providers/data_provider';
import { mockDataProviders } from '../../../timelines/components/timeline/data_providers/mock/mock_data_providers';
import {
getStringArray,
replaceTemplateFieldFromQuery,
@ -143,7 +141,7 @@ describe('helpers', () => {
const replacement = replaceTemplateFieldFromQuery(
'',
mockTimelineDetails,
TimelineType.default
TimelineTypeEnum.default
);
expect(replacement).toEqual('');
});
@ -152,7 +150,7 @@ describe('helpers', () => {
const replacement = replaceTemplateFieldFromQuery(
' ',
mockTimelineDetails,
TimelineType.default
TimelineTypeEnum.default
);
expect(replacement).toEqual('');
});
@ -161,7 +159,7 @@ describe('helpers', () => {
const replacement = replaceTemplateFieldFromQuery(
'host.name: placeholdertext',
mockTimelineDetails,
TimelineType.default
TimelineTypeEnum.default
);
expect(replacement).toEqual('host.name: apache');
});
@ -175,7 +173,7 @@ describe('helpers', () => {
const replacement = replaceTemplateFieldFromQuery(
'host.name: *',
dupTimelineDetails,
TimelineType.default
TimelineTypeEnum.default
);
expect(replacement).toEqual('host.name: *');
});
@ -184,7 +182,7 @@ describe('helpers', () => {
const replacement = replaceTemplateFieldFromQuery(
'user.id: placeholdertext',
mockTimelineDetails,
TimelineType.default
TimelineTypeEnum.default
);
expect(replacement).toEqual('user.id: placeholdertext');
});
@ -195,7 +193,7 @@ describe('helpers', () => {
const replacement = replaceTemplateFieldFromQuery(
'',
mockTimelineDetails,
TimelineType.template
TimelineTypeEnum.template
);
expect(replacement).toEqual('');
});
@ -204,7 +202,7 @@ describe('helpers', () => {
const replacement = replaceTemplateFieldFromQuery(
' ',
mockTimelineDetails,
TimelineType.template
TimelineTypeEnum.template
);
expect(replacement).toEqual('');
});
@ -213,7 +211,7 @@ describe('helpers', () => {
const replacement = replaceTemplateFieldFromQuery(
'host.name: placeholdertext',
mockTimelineDetails,
TimelineType.template
TimelineTypeEnum.template
);
expect(replacement).toEqual('host.name: placeholdertext');
});
@ -227,7 +225,7 @@ describe('helpers', () => {
const replacement = replaceTemplateFieldFromQuery(
'host.name: *',
dupTimelineDetails,
TimelineType.default
TimelineTypeEnum.default
);
expect(replacement).toEqual('host.name: *');
});
@ -236,7 +234,7 @@ describe('helpers', () => {
const replacement = replaceTemplateFieldFromQuery(
'user.id: placeholdertext',
mockTimelineDetails,
TimelineType.default
TimelineTypeEnum.default
);
expect(replacement).toEqual('user.id: placeholdertext');
});
@ -323,7 +321,7 @@ describe('helpers', () => {
const replacement = reformatDataProviderWithNewValue(
mockDataProvider,
mockTimelineDetails,
TimelineType.default
TimelineTypeEnum.default
);
expect(replacement).toEqual({
id: 'apache',
@ -339,7 +337,7 @@ describe('helpers', () => {
displayValue: undefined,
},
and: [],
type: TimelineType.default,
type: TimelineTypeEnum.default,
});
});
@ -357,7 +355,7 @@ describe('helpers', () => {
const replacement = reformatDataProviderWithNewValue(
mockDataProvider,
dupTimelineDetails,
TimelineType.default
TimelineTypeEnum.default
);
expect(replacement).toEqual({
id: 'apache',
@ -373,7 +371,7 @@ describe('helpers', () => {
displayValue: undefined,
},
and: [],
type: TimelineType.default,
type: TimelineTypeEnum.default,
});
});
@ -386,7 +384,7 @@ describe('helpers', () => {
const replacement = reformatDataProviderWithNewValue(
mockDataProvider,
mockTimelineDetails,
TimelineType.default
TimelineTypeEnum.default
);
expect(replacement).toEqual({
id: 'my-id',
@ -402,7 +400,7 @@ describe('helpers', () => {
displayValue: undefined,
},
and: [],
type: TimelineType.default,
type: TimelineTypeEnum.default,
});
});
});
@ -414,11 +412,11 @@ describe('helpers', () => {
mockDataProvider.id = 'Braden';
mockDataProvider.name = 'Braden';
mockDataProvider.queryMatch.value = '{host.name}';
mockDataProvider.type = DataProviderType.template;
mockDataProvider.type = DataProviderTypeEnum.template;
const replacement = reformatDataProviderWithNewValue(
mockDataProvider,
mockTimelineDetails,
TimelineType.template
TimelineTypeEnum.template
);
expect(replacement).toEqual({
id: 'apache',
@ -434,7 +432,7 @@ describe('helpers', () => {
displayValue: undefined,
},
and: [],
type: DataProviderType.default,
type: DataProviderTypeEnum.default,
});
});
@ -444,11 +442,11 @@ describe('helpers', () => {
mockDataProvider.id = 'Braden';
mockDataProvider.name = 'Braden';
mockDataProvider.queryMatch.value = '{host.name}';
mockDataProvider.type = DataProviderType.default;
mockDataProvider.type = DataProviderTypeEnum.default;
const replacement = reformatDataProviderWithNewValue(
mockDataProvider,
mockTimelineDetails,
TimelineType.template
TimelineTypeEnum.template
);
expect(replacement).toEqual({
id: 'Braden',
@ -464,7 +462,7 @@ describe('helpers', () => {
displayValue: undefined,
},
and: [],
type: DataProviderType.default,
type: DataProviderTypeEnum.default,
});
});
@ -479,11 +477,11 @@ describe('helpers', () => {
mockDataProvider.id = 'Braden';
mockDataProvider.name = 'Braden';
mockDataProvider.queryMatch.value = '{host.name}';
mockDataProvider.type = DataProviderType.template;
mockDataProvider.type = DataProviderTypeEnum.template;
const replacement = reformatDataProviderWithNewValue(
mockDataProvider,
dupTimelineDetails,
TimelineType.template
TimelineTypeEnum.template
);
expect(replacement).toEqual({
id: 'apache',
@ -499,7 +497,7 @@ describe('helpers', () => {
displayValue: undefined,
},
and: [],
type: DataProviderType.default,
type: DataProviderTypeEnum.default,
});
});
@ -509,11 +507,11 @@ describe('helpers', () => {
mockDataProvider.id = 'my-id';
mockDataProvider.name = 'Rebecca';
mockDataProvider.queryMatch.value = 'Rebecca';
mockDataProvider.type = DataProviderType.default;
mockDataProvider.type = DataProviderTypeEnum.default;
const replacement = reformatDataProviderWithNewValue(
mockDataProvider,
mockTimelineDetails,
TimelineType.template
TimelineTypeEnum.template
);
expect(replacement).toEqual({
id: 'my-id',
@ -529,7 +527,7 @@ describe('helpers', () => {
displayValue: undefined,
},
and: [],
type: DataProviderType.default,
type: DataProviderTypeEnum.default,
});
});
});

View file

@ -11,12 +11,15 @@ import type { Filter, KueryNode } from '@kbn/es-query';
import { FilterStateStore, fromKueryExpression } from '@kbn/es-query';
import type { TimelineEventsDetailsItem } from '../../../../common/search_strategy';
import { TimelineType } from '../../../../common/api/timeline';
import {
DataProviderTypeEnum,
type TimelineType,
TimelineTypeEnum,
} from '../../../../common/api/timeline';
import type {
DataProvider,
DataProvidersAnd,
} from '../../../timelines/components/timeline/data_providers/data_provider';
import { DataProviderType } from '../../../timelines/components/timeline/data_providers/data_provider';
interface FindValueToChangeInQuery {
field: string;
@ -114,9 +117,9 @@ export const findValueToChangeInQuery = (
export const replaceTemplateFieldFromQuery = (
query: string,
eventData: TimelineEventsDetailsItem[],
timelineType: TimelineType = TimelineType.default
timelineType: TimelineType = TimelineTypeEnum.default
): string => {
if (timelineType === TimelineType.default) {
if (timelineType === TimelineTypeEnum.default) {
if (query.trim() !== '') {
const valueToChange = findValueToChangeInQuery(fromKueryExpression(query));
return valueToChange.reduce((newQuery, vtc) => {
@ -157,10 +160,10 @@ export const replaceTemplateFieldFromMatchFilters = (
export const reformatDataProviderWithNewValue = <T extends DataProvider | DataProvidersAnd>(
dataProvider: T,
eventData: TimelineEventsDetailsItem[],
timelineType: TimelineType = TimelineType.default
timelineType: TimelineType = TimelineTypeEnum.default
): T => {
// Support for legacy "template-like" timeline behavior that is using hardcoded list of templateFields
if (timelineType !== TimelineType.template) {
if (timelineType !== TimelineTypeEnum.template) {
if (templateFields.includes(dataProvider.queryMatch.field)) {
const newValue = getStringArray(dataProvider.queryMatch.field, eventData);
if (newValue.length) {
@ -171,13 +174,13 @@ export const reformatDataProviderWithNewValue = <T extends DataProvider | DataPr
dataProvider.queryMatch.displayValue = undefined;
}
}
dataProvider.type = DataProviderType.default;
dataProvider.type = DataProviderTypeEnum.default;
return dataProvider;
}
if (timelineType === TimelineType.template) {
if (timelineType === TimelineTypeEnum.template) {
if (
dataProvider.type === DataProviderType.template &&
dataProvider.type === DataProviderTypeEnum.template &&
dataProvider.queryMatch.operator === ':'
) {
const newValue = getStringArray(dataProvider.queryMatch.field, eventData);
@ -191,12 +194,12 @@ export const reformatDataProviderWithNewValue = <T extends DataProvider | DataPr
dataProvider.queryMatch.value = newValue[0];
dataProvider.queryMatch.displayField = undefined;
dataProvider.queryMatch.displayValue = undefined;
dataProvider.type = DataProviderType.default;
dataProvider.type = DataProviderTypeEnum.default;
return dataProvider;
}
dataProvider.type = dataProvider.type ?? DataProviderType.default;
dataProvider.type = dataProvider.type ?? DataProviderTypeEnum.default;
return dataProvider;
}
@ -207,7 +210,7 @@ export const reformatDataProviderWithNewValue = <T extends DataProvider | DataPr
export const replaceTemplateFieldFromDataProviders = (
dataProviders: DataProvider[],
eventData: TimelineEventsDetailsItem[],
timelineType: TimelineType = TimelineType.default
timelineType: TimelineType = TimelineTypeEnum.default
): DataProvider[] =>
dataProviders.map((dataProvider) => {
const newDataProvider = reformatDataProviderWithNewValue(dataProvider, eventData, timelineType);

View file

@ -26,7 +26,7 @@ import { timelineActions } from '../../../../timelines/store';
import { useCreateTimeline } from '../../../../timelines/hooks/use_create_timeline';
import { INVESTIGATE_BULK_IN_TIMELINE } from '../translations';
import { TimelineId } from '../../../../../common/types/timeline';
import { TimelineType } from '../../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../../common/api/timeline';
import { sendBulkEventsToTimelineAction } from '../actions';
import type { CreateTimelineProps } from '../types';
import type { SourcererScopeName } from '../../../../sourcerer/store/model';
@ -138,7 +138,7 @@ export const useAddBulkToTimelineAction = ({
const clearActiveTimeline = useCreateTimeline({
timelineId: TimelineId.active,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
});
const updateTimelineIsLoading = useCallback(

View file

@ -22,7 +22,7 @@ import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_ex
import { createHistoryEntry } from '../../../../common/utils/global_query_string/helpers';
import { useKibana } from '../../../../common/lib/kibana';
import { TimelineId } from '../../../../../common/types/timeline';
import { TimelineType } from '../../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../../common/api/timeline';
import { timelineActions } from '../../../../timelines/store';
import { sendAlertToTimelineAction } from '../actions';
import { useUpdateTimeline } from '../../../../timelines/components/open_timeline/use_update_timeline';
@ -141,7 +141,7 @@ export const useInvestigateInTimeline = ({
const clearActiveTimeline = useCreateTimeline({
timelineId: TimelineId.active,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
});
const unifiedComponentsInTimelineDisabled = useIsExperimentalFeatureEnabled(
@ -164,7 +164,8 @@ export const useInvestigateInTimeline = ({
indexNames: timeline.indexNames ?? [],
show: true,
excludedRowRendererIds:
!unifiedComponentsInTimelineDisabled && timeline.timelineType !== TimelineType.template
!unifiedComponentsInTimelineDisabled &&
timeline.timelineType !== TimelineTypeEnum.template
? timeline.excludedRowRendererIds
: [],
},

View file

@ -16,7 +16,7 @@ import {
} from '../../../../common/components/event_details/table/use_action_cell_data_provider';
import type { DataProvider, QueryOperator } from '../../../../../common/types/timeline';
import { TimelineId } from '../../../../../common/types/timeline';
import { TimelineType } from '../../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../../common/api/timeline';
import { useCreateTimeline } from '../../../../timelines/hooks/use_create_timeline';
import { updateProviders } from '../../../../timelines/store/actions';
import { sourcererSelectors } from '../../../../common/store';
@ -36,7 +36,7 @@ export const useNavigateToTimeline = () => {
const clearTimeline = useCreateTimeline({
timelineId: TimelineId.active,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
});
const navigateToTimeline = useCallback(

View file

@ -9,7 +9,7 @@ import { EuiHorizontalRule, EuiText } from '@elastic/eui';
import React, { useCallback, useMemo, useEffect } from 'react';
import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features';
import { SortFieldTimeline, TimelineType } from '../../../../common/api/timeline';
import { SortFieldTimelineEnum, TimelineTypeEnum } from '../../../../common/api/timeline';
import { useGetAllTimeline } from '../../../timelines/containers/all';
import { useQueryTimelineById } from '../../../timelines/components/open_timeline/helpers';
import type { OnOpenTimeline } from '../../../timelines/components/open_timeline/types';
@ -80,7 +80,7 @@ const StatefulRecentTimelinesComponent: React.FC<Props> = ({ filterBy }) => {
);
const { fetchAllTimeline, timelines, loading } = useGetAllTimeline();
const timelineType = TimelineType.default;
const timelineType = TimelineTypeEnum.default;
const { timelineStatus } = useTimelineStatus({ timelineType });
useEffect(() => {
@ -91,7 +91,7 @@ const StatefulRecentTimelinesComponent: React.FC<Props> = ({ filterBy }) => {
},
search: '',
sort: {
sortField: SortFieldTimeline.updated,
sortField: SortFieldTimelineEnum.updated,
sortOrder: Direction.desc,
},
onlyUserFavorite: filterBy === 'favorites',

View file

@ -15,7 +15,7 @@ import type {
OpenTimelineResult,
} from '../../../timelines/components/open_timeline/types';
import { HoverPopover } from '../../../common/components/hover_popover';
import { TimelineType } from '../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../common/api/timeline';
import { RecentTimelineCounts } from './counts';
import * as i18n from './translations';
@ -53,14 +53,14 @@ const RecentTimelinesItem = React.memo<RecentTimelinesItemProps>(
hoverContent={
<EuiToolTip
content={
timeline.timelineType === TimelineType.default
timeline.timelineType === TimelineTypeEnum.default
? i18n.OPEN_AS_DUPLICATE
: i18n.OPEN_AS_DUPLICATE_TEMPLATE
}
>
<EuiButtonIcon
aria-label={
timeline.timelineType === TimelineType.default
timeline.timelineType === TimelineTypeEnum.default
? i18n.OPEN_AS_DUPLICATE
: i18n.OPEN_AS_DUPLICATE_TEMPLATE
}

View file

@ -17,7 +17,7 @@ import { createMockStore, mockGlobalState, TestProviders } from '../../common/mo
import { useSourcererDataView } from '../containers';
import { useSignalHelpers } from '../containers/use_signal_helpers';
import { TimelineId } from '../../../common/types/timeline';
import { TimelineType } from '../../../common/api/timeline';
import { type TimelineType, TimelineTypeEnum } from '../../../common/api/timeline';
import { sortWithExcludesAtEnd } from '../../../common/utils/sourcerer';
import { render, fireEvent, screen, waitFor } from '@testing-library/react';
@ -263,7 +263,7 @@ describe('Update available for timeline template', () => {
...mockGlobalState.timeline.timelineById,
[TimelineId.active]: {
...mockGlobalState.timeline.timelineById.test,
timelineType: TimelineType.template,
timelineType: TimelineTypeEnum.template,
},
},
},
@ -339,7 +339,7 @@ describe('Missing index patterns', () => {
...mockGlobalState.timeline.timelineById,
[TimelineId.active]: {
...mockGlobalState.timeline.timelineById.test,
timelineType: TimelineType.template,
timelineType: TimelineTypeEnum.template as TimelineType,
},
},
},
@ -392,7 +392,7 @@ describe('Missing index patterns', () => {
activePatterns: ['myFakebeat-*'],
});
const state3 = cloneDeep(state2);
state3.timeline.timelineById[TimelineId.active].timelineType = TimelineType.default;
state3.timeline.timelineById[TimelineId.active].timelineType = TimelineTypeEnum.default;
store = createMockStore(state3);
render(

View file

@ -21,7 +21,7 @@ import * as i18n from './translations';
import { Blockquote, ResetButton } from './helpers';
import { UpdateDefaultDataViewModal } from './update_default_data_view_modal';
import { TimelineId } from '../../../common/types';
import { TimelineType } from '../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../common/api/timeline';
import { timelineSelectors } from '../../timelines/store';
import { useDeepEqualSelector } from '../../common/hooks/use_selector';
import { timelineDefaults } from '../../timelines/store/defaults';
@ -46,15 +46,15 @@ interface Props {
const translations = {
deprecated: {
title: {
[TimelineType.default]: i18n.CALL_OUT_DEPRECATED_TITLE,
[TimelineType.template]: i18n.CALL_OUT_DEPRECATED_TEMPLATE_TITLE,
[TimelineTypeEnum.default]: i18n.CALL_OUT_DEPRECATED_TITLE,
[TimelineTypeEnum.template]: i18n.CALL_OUT_DEPRECATED_TEMPLATE_TITLE,
},
update: i18n.UPDATE_INDEX_PATTERNS,
},
missingPatterns: {
title: {
[TimelineType.default]: i18n.CALL_OUT_MISSING_PATTERNS_TITLE,
[TimelineType.template]: i18n.CALL_OUT_MISSING_PATTERNS_TEMPLATE_TITLE,
[TimelineTypeEnum.default]: i18n.CALL_OUT_MISSING_PATTERNS_TITLE,
[TimelineTypeEnum.template]: i18n.CALL_OUT_MISSING_PATTERNS_TEMPLATE_TITLE,
},
update: i18n.ADD_INDEX_PATTERN,
},

View file

@ -8,7 +8,7 @@
import { EuiIcon, EuiLink, EuiToolTip } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n-react';
import React, { useMemo } from 'react';
import { TimelineType } from '../../../common/api/timeline';
import { type TimelineType, TimelineTypeEnum } from '../../../common/api/timeline';
import { Blockquote } from './helpers';
import * as i18n from './translations';
@ -41,7 +41,7 @@ export const CurrentPatternsMessage = ({
[activePatterns, deadPatterns.length, selectedPatterns, timelineType]
);
if (timelineType === TimelineType.template) {
if (timelineType === TimelineTypeEnum.template) {
return (
<span data-test-subj="sourcerer-current-patterns-message">
<FormattedMessage
@ -83,7 +83,7 @@ export const NoMatchDataMessage = ({
() => selectedPatterns.filter((p) => !activePatterns.includes(p)).join(', '),
[activePatterns, selectedPatterns]
);
if (timelineType === TimelineType.template) {
if (timelineType === TimelineTypeEnum.template) {
return (
<FormattedMessage
id="xpack.securitySolution.indexPatterns.timelineTemplate.noMatchData"
@ -118,7 +118,7 @@ export const BadCurrentPatternsMessage = ({
[selectedPatterns]
);
if (timelineType === TimelineType.template) {
if (timelineType === TimelineTypeEnum.template) {
return (
<FormattedMessage
id="xpack.securitySolution.indexPatterns.timelineTemplate.currentPatternsBad"
@ -147,7 +147,7 @@ export const DeprecatedMessage = ({
onReset: () => void;
timelineType: TimelineType;
}) => {
if (timelineType === TimelineType.template) {
if (timelineType === TimelineTypeEnum.template) {
return (
<span data-test-subj="sourcerer-deprecated-message">
<FormattedMessage
@ -180,7 +180,7 @@ export const MissingPatternsMessage = ({
timelineType: TimelineType;
onReset: () => void;
}) => {
if (timelineType === TimelineType.template) {
if (timelineType === TimelineTypeEnum.template) {
return (
<span data-test-subj="sourcerer-missing-patterns-message">
<FormattedMessage

View file

@ -11,7 +11,7 @@ import { timelineDefaults } from '../timelines/store/defaults';
import { APP_UI_ID } from '../../common/constants';
import type { DataProvider } from '../../common/types';
import { TimelineId } from '../../common/types/timeline';
import { TimelineType } from '../../common/api/timeline';
import { TimelineTypeEnum } from '../../common/api/timeline';
import { useStartTransaction } from '../common/lib/apm/use_start_transaction';
import { timelineActions } from '../timelines/store';
import { useCreateTimeline } from '../timelines/hooks/use_create_timeline';
@ -56,7 +56,7 @@ export const useInvestigateInTimeline = ({
const clearActiveTimeline = useCreateTimeline({
timelineId: TimelineId.active,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
});
const updateTimeline = useUpdateTimeline();

View file

@ -9,7 +9,7 @@ import React from 'react';
import { render } from '@testing-library/react';
import { mockTimelineModel, TestProviders } from '../../../common/mock';
import { AddToFavoritesButton } from '.';
import { TimelineStatus } from '../../../../common/api/timeline';
import { TimelineStatusEnum } from '../../../../common/api/timeline';
const mockGetState = jest.fn();
jest.mock('react-redux', () => {
@ -41,7 +41,7 @@ describe('AddToFavoritesButton', () => {
it('should render favorite button enabled and unchecked', () => {
mockGetState.mockReturnValue({
...mockTimelineModel,
status: TimelineStatus.active,
status: TimelineStatusEnum.active,
});
const { getByTestId, queryByTestId } = renderAddFavoritesButton();
@ -57,7 +57,7 @@ describe('AddToFavoritesButton', () => {
it('should render favorite button disabled for a draft timeline', () => {
mockGetState.mockReturnValue({
...mockTimelineModel,
status: TimelineStatus.draft,
status: TimelineStatusEnum.draft,
});
const { getByTestId } = renderAddFavoritesButton();
@ -68,7 +68,7 @@ describe('AddToFavoritesButton', () => {
it('should render favorite button disabled for an immutable timeline', () => {
mockGetState.mockReturnValue({
...mockTimelineModel,
status: TimelineStatus.immutable,
status: TimelineStatusEnum.immutable,
});
const { getByTestId } = renderAddFavoritesButton();
@ -91,7 +91,7 @@ describe('AddToFavoritesButton', () => {
it('should use id for guided tour if prop is true', () => {
mockGetState.mockReturnValue({
...mockTimelineModel,
status: TimelineStatus.active,
status: TimelineStatusEnum.active,
});
const { getByTestId } = renderAddFavoritesButton(true);

View file

@ -12,7 +12,7 @@ import { i18n } from '@kbn/i18n';
import type { State } from '../../../common/store';
import { selectTimelineById } from '../../store/selectors';
import { timelineActions } from '../../store';
import { TimelineStatus } from '../../../../common/api/timeline';
import { TimelineStatusEnum } from '../../../../common/api/timeline';
import { TIMELINE_TOUR_CONFIG_ANCHORS } from '../timeline/tour/step_config';
const ADD_TO_FAVORITES = i18n.translate(
@ -51,7 +51,7 @@ export const AddToFavoritesButton = React.memo<AddToFavoritesButtonProps>(
selectTimelineById(state, timelineId)
);
const isTimelineDraftOrImmutable = status !== TimelineStatus.active;
const isTimelineDraftOrImmutable = status !== TimelineStatusEnum.active;
const label = isFavorite ? REMOVE_FROM_FAVORITES : ADD_TO_FAVORITES;
const handleClick = useCallback(

View file

@ -9,7 +9,7 @@ import { EuiButtonEmpty, EuiButtonIcon, EuiFlexGroup, EuiFlexItem, EuiPopover }
import React, { useCallback, useMemo, useState } from 'react';
import * as i18n from './translations';
import { useCreateTimeline } from '../../hooks/use_create_timeline';
import { TimelineType } from '../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../common/api/timeline';
import { OpenTimelineModal } from '../open_timeline/open_timeline_modal';
import type { ActionTimelineToShow } from '../open_timeline/types';
@ -39,12 +39,12 @@ export const AddTimelineButton = React.memo<AddTimelineButtonComponentProps>(({
const createNewTimeline = useCreateTimeline({
timelineId,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
onClick: togglePopover,
});
const createNewTimelineTemplate = useCreateTimeline({
timelineId,
timelineType: TimelineType.template,
timelineType: TimelineTypeEnum.template,
onClick: togglePopover,
});

View file

@ -5,7 +5,7 @@
* 2.0.
*/
import { DataProviderType } from '../../../../common/api/timeline';
import { DataProviderTypeEnum } from '../../../../common/api/timeline';
import { mockBrowserFields } from '../../../common/containers/source/mock';
import {
@ -144,7 +144,7 @@ describe('helpers', () => {
label: 'is',
},
],
type: DataProviderType.default,
type: DataProviderTypeEnum.default,
})
).toBe(true);
});
@ -163,7 +163,7 @@ describe('helpers', () => {
label: 'is',
},
],
type: DataProviderType.default,
type: DataProviderTypeEnum.default,
})
).toBe(false);
});
@ -182,7 +182,7 @@ describe('helpers', () => {
label: 'is one of',
},
],
type: DataProviderType.default,
type: DataProviderTypeEnum.default,
})
).toBe(false);
});
@ -201,7 +201,7 @@ describe('helpers', () => {
label: '',
},
],
type: DataProviderType.default,
type: DataProviderTypeEnum.default,
})
).toBe(false);
});
@ -220,7 +220,7 @@ describe('helpers', () => {
label: 'invalid-operator',
},
],
type: DataProviderType.default,
type: DataProviderTypeEnum.default,
})
).toBe(false);
});
@ -239,7 +239,7 @@ describe('helpers', () => {
label: 'is one of',
},
],
type: DataProviderType.template,
type: DataProviderTypeEnum.template,
})
).toBe(false);
});
@ -258,7 +258,7 @@ describe('helpers', () => {
label: 'is not one of',
},
],
type: DataProviderType.template,
type: DataProviderTypeEnum.template,
})
).toBe(false);
});

View file

@ -9,7 +9,7 @@ import { findIndex } from 'lodash/fp';
import type { EuiComboBoxOptionOption } from '@elastic/eui';
import type { FieldCategory } from '@kbn/timelines-plugin/common/search_strategy';
import { DataProviderType } from '../../../../common/api/timeline';
import { type DataProviderType, DataProviderTypeEnum } from '../../../../common/api/timeline';
import type { BrowserFields } from '../../../common/containers/source';
import { getAllFieldsByName } from '../../../common/containers/source';
@ -83,7 +83,7 @@ export const selectionsAreValid = ({
const fieldIsValid = browserFields && getAllFieldsByName(browserFields)[fieldId] != null;
const operatorIsValid = findIndex((o) => o.label === operator, operatorLabels) !== -1;
const isOneOfOperatorSelectionWithTemplate =
type === DataProviderType.template &&
type === DataProviderTypeEnum.template &&
(operator === i18n.IS_ONE_OF || operator === i18n.IS_NOT_ONE_OF);
return fieldIsValid && operatorIsValid && !isOneOfOperatorSelectionWithTemplate;

View file

@ -12,11 +12,11 @@ import React from 'react';
import { mockBrowserFields } from '../../../common/containers/source/mock';
import { TestProviders } from '../../../common/mock';
import {
DataProviderType,
IS_OPERATOR,
EXISTS_OPERATOR,
IS_ONE_OF_OPERATOR,
} from '../timeline/data_providers/data_provider';
import { DataProviderTypeEnum } from '../../../../common/api/timeline';
import { StatefulEditDataProvider } from '.';
@ -393,7 +393,7 @@ describe('StatefulEditDataProvider', () => {
providerId={`hosts-table-hostName-${value}`}
timelineId={timelineId}
value={value}
type={DataProviderType.template}
type={DataProviderTypeEnum.template}
/>
</TestProviders>
);

View file

@ -24,7 +24,7 @@ import type { BrowserFields } from '../../../common/containers/source';
import type { PrimitiveOrArrayOfPrimitives } from '../../../common/lib/kuery';
import type { OnDataProviderEdited } from '../timeline/events';
import type { QueryOperator } from '../timeline/data_providers/data_provider';
import { DataProviderType } from '../timeline/data_providers/data_provider';
import { type DataProviderType, DataProviderTypeEnum } from '../../../../common/api/timeline';
import {
getCategorizedFieldNames,
@ -86,7 +86,7 @@ export const StatefulEditDataProvider = React.memo<Props>(
providerId,
timelineId,
value,
type = DataProviderType.default,
type = DataProviderTypeEnum.default,
}) => {
const [updatedField, setUpdatedField] = useState<EuiComboBoxOptionOption[]>([{ label: field }]);
const [updatedOperator, setUpdatedOperator] = useState<EuiComboBoxOptionOption[]>(
@ -105,7 +105,7 @@ export const StatefulEditDataProvider = React.memo<Props>(
const showValueInput = useMemo(
() =>
type !== DataProviderType.template &&
type !== DataProviderTypeEnum.template &&
updatedOperator.length > 0 &&
updatedOperator[0].label !== i18n.EXISTS &&
updatedOperator[0].label !== i18n.DOES_NOT_EXIST &&
@ -137,7 +137,7 @@ export const StatefulEditDataProvider = React.memo<Props>(
(selectedField: EuiComboBoxOptionOption[]) => {
setUpdatedField(selectedField);
if (type === DataProviderType.template) {
if (type === DataProviderTypeEnum.template) {
setUpdatedValue(`{${selectedField[0].label}}`);
}
@ -256,7 +256,7 @@ export const StatefulEditDataProvider = React.memo<Props>(
</EuiFormRow>
)}
{showComboBoxInput && type !== DataProviderType.template && (
{showComboBoxInput && type !== DataProviderTypeEnum.template && (
<EuiFormRow label={i18n.VALUE_LABEL}>
<ControlledComboboxInput onChangeCallback={onValueChange} value={value} />
</EuiFormRow>
@ -268,7 +268,7 @@ export const StatefulEditDataProvider = React.memo<Props>(
</EuiFlexItem>
<EuiFlexItem grow={false}>
{type === DataProviderType.template && showComboBoxInput && (
{type === DataProviderTypeEnum.template && showComboBoxInput && (
<>
<EuiCallOut
color="warning"

View file

@ -16,7 +16,7 @@ import { APP_ID, APP_UI_ID } from '../../../../../common/constants';
import { setInsertTimeline, showTimeline } from '../../../store/actions';
import { useKibana } from '../../../../common/lib/kibana';
import { TimelineId } from '../../../../../common/types/timeline';
import { TimelineStatus, TimelineType } from '../../../../../common/api/timeline';
import { TimelineStatusEnum, TimelineTypeEnum } from '../../../../../common/api/timeline';
import { getCreateCaseUrl, getCaseDetailsUrl } from '../../../../common/components/link_to';
import { SecurityPageName } from '../../../../app/types';
import * as i18n from './translations';
@ -117,7 +117,9 @@ export const AttachToCaseButton = React.memo<AttachToCaseButtonProps>(({ timelin
<EuiButtonEmpty
iconType="arrowDown"
iconSide="right"
disabled={timelineStatus === TimelineStatus.draft || timelineType !== TimelineType.default}
disabled={
timelineStatus === TimelineStatusEnum.draft || timelineType !== TimelineTypeEnum.default
}
data-test-subj="timeline-modal-attach-to-case-dropdown-button"
onClick={togglePopover}
>

View file

@ -13,7 +13,7 @@ import { timelineActions } from '../../../store';
import { defaultHeaders } from '../../timeline/body/column_headers/default_headers';
import { TestProviders } from '../../../../common/mock';
import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features';
import { RowRendererId } from '../../../../../common/api/timeline';
import { RowRendererValues } from '../../../../../common/api/timeline';
import { defaultUdtHeaders } from '../../timeline/unified_components/default_headers';
jest.mock('../../../../common/components/discover_in_timeline/use_discover_in_timeline_context');
@ -73,7 +73,7 @@ describe('NewTimelineButton', () => {
show: true,
timelineType: 'default',
updated: undefined,
excludedRowRendererIds: [...Object.keys(RowRendererId)],
excludedRowRendererIds: RowRendererValues,
});
});

View file

@ -8,7 +8,7 @@
import { EuiButtonEmpty, EuiContextMenuItem, EuiContextMenuPanel, EuiPopover } from '@elastic/eui';
import React, { useMemo, useState, useCallback } from 'react';
import { useCreateTimeline } from '../../../hooks/use_create_timeline';
import { TimelineType } from '../../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../../common/api/timeline';
import * as i18n from './translations';
interface NewTimelineButtonProps {
@ -27,12 +27,12 @@ export const NewTimelineButton = React.memo(({ timelineId }: NewTimelineButtonPr
const createNewTimeline = useCreateTimeline({
timelineId,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
onClick: togglePopover,
});
const createNewTimelineTemplate = useCreateTimeline({
timelineId,
timelineType: TimelineType.template,
timelineType: TimelineTypeEnum.template,
onClick: togglePopover,
});

View file

@ -10,7 +10,7 @@ import React from 'react';
import { OpenTimelineButton } from './open_timeline_button';
import { TestProviders } from '../../../../common/mock/test_providers';
import { useParams } from 'react-router-dom';
import { TimelineType } from '../../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../../common/api/timeline';
import { useStartTransaction } from '../../../../common/lib/apm/use_start_transaction';
import { useSourcererDataView } from '../../../../sourcerer/containers';
import { useTimelineStatus } from '../../open_timeline/use_timeline_status';
@ -60,7 +60,7 @@ describe('OpenTimelineButton', () => {
});
it('should open the modal after clicking on the button', async () => {
(useParams as jest.Mock).mockReturnValue({ tabName: TimelineType.template });
(useParams as jest.Mock).mockReturnValue({ tabName: TimelineTypeEnum.template });
(useStartTransaction as jest.Mock).mockReturnValue({ startTransaction: jest.fn() });
(useSourcererDataView as jest.Mock).mockReturnValue({ dataViewId: '', selectedPatterns: [] });
(useTimelineStatus as jest.Mock).mockReturnValue({

View file

@ -10,7 +10,7 @@ import { render, waitFor } from '@testing-library/react';
import { SaveTimelineButton } from './save_timeline_button';
import { mockTimelineModel, TestProviders } from '../../../../common/mock';
import { useUserPrivileges } from '../../../../common/components/user_privileges';
import { TimelineStatus } from '../../../../../common/api/timeline';
import { TimelineStatusEnum } from '../../../../../common/api/timeline';
import { useCreateTimeline } from '../../../hooks/use_create_timeline';
jest.mock('../../../../common/components/user_privileges');
@ -49,7 +49,7 @@ describe('SaveTimelineButton', () => {
});
mockGetState.mockReturnValue({
...mockTimelineModel,
status: TimelineStatus.active,
status: TimelineStatusEnum.active,
isSaving: false,
});
(useCreateTimeline as jest.Mock).mockReturnValue({});
@ -68,7 +68,7 @@ describe('SaveTimelineButton', () => {
});
mockGetState.mockReturnValue({
...mockTimelineModel,
status: TimelineStatus.active,
status: TimelineStatusEnum.active,
isSaving: false,
});
(useCreateTimeline as jest.Mock).mockReturnValue({});
@ -98,7 +98,7 @@ describe('SaveTimelineButton', () => {
(useUserPrivileges as jest.Mock).mockReturnValue({
kibanaSecuritySolutionsPrivileges: { crud: true },
});
mockGetState.mockReturnValue({ ...mockTimelineModel, status: TimelineStatus.immutable });
mockGetState.mockReturnValue({ ...mockTimelineModel, status: TimelineStatusEnum.immutable });
const { getByTestId } = renderSaveTimelineButton();

View file

@ -8,7 +8,7 @@
import React, { useCallback, useState } from 'react';
import { EuiButton, EuiToolTip } from '@elastic/eui';
import { useSelector } from 'react-redux';
import { TimelineStatus } from '../../../../../common/api/timeline';
import { TimelineStatusEnum } from '../../../../../common/api/timeline';
import { useUserPrivileges } from '../../../../common/components/user_privileges';
import { SaveTimelineModal } from './save_timeline_modal';
import * as i18n from './translations';
@ -41,8 +41,8 @@ export const SaveTimelineButton = React.memo<SaveTimelineButtonProps>(({ timelin
const { status, isSaving } = useSelector((state: State) => selectTimelineById(state, timelineId));
const canSaveTimeline = canEditTimelinePrivilege && status !== TimelineStatus.immutable;
const isUnsaved = status === TimelineStatus.draft;
const canSaveTimeline = canEditTimelinePrivilege && status !== TimelineStatusEnum.immutable;
const isUnsaved = status === TimelineStatusEnum.draft;
const unauthorizedMessage = canSaveTimeline ? null : i18n.CALL_OUT_UNAUTHORIZED_MSG;
return (

View file

@ -8,7 +8,7 @@
import React from 'react';
import { render } from '@testing-library/react';
import { mockTimelineModel, TestProviders } from '../../../../common/mock';
import { TimelineStatus, TimelineType } from '../../../../../common/api/timeline';
import { TimelineStatusEnum, TimelineTypeEnum } from '../../../../../common/api/timeline';
import { SaveTimelineModal } from './save_timeline_modal';
import * as i18n from './translations';
@ -73,8 +73,8 @@ describe('SaveTimelineModal', () => {
it('should show correct header for save timeline template modal', () => {
mockGetState.mockReturnValue({
...mockTimelineModel,
status: TimelineStatus.draft,
timelineType: TimelineType.template,
status: TimelineStatusEnum.draft,
timelineType: TimelineTypeEnum.template,
});
const { getByTestId } = renderSaveTimelineModal();
@ -88,7 +88,7 @@ describe('SaveTimelineModal', () => {
it('should render all the dom elements of the modal', () => {
mockGetState.mockReturnValue({
...mockTimelineModel,
status: TimelineStatus.draft,
status: TimelineStatusEnum.draft,
});
const { getByTestId, queryByTestId } = renderSaveTimelineModal();
@ -120,7 +120,7 @@ describe('SaveTimelineModal', () => {
it('should show correct header for edit timeline template modal', () => {
mockGetState.mockReturnValue({
...mockTimelineModel,
status: TimelineStatus.active,
status: TimelineStatusEnum.active,
});
const { getByTestId } = renderSaveTimelineModal();
@ -131,8 +131,8 @@ describe('SaveTimelineModal', () => {
it('should show correct header for save timeline template modal', () => {
mockGetState.mockReturnValue({
status: TimelineStatus.active,
timelineType: TimelineType.template,
status: TimelineStatusEnum.active,
timelineType: TimelineTypeEnum.template,
});
const { getByTestId } = renderSaveTimelineModal();
@ -147,9 +147,9 @@ describe('SaveTimelineModal', () => {
mockGetState.mockReturnValue({
...mockTimelineModel,
description: 'my description',
status: TimelineStatus.active,
status: TimelineStatusEnum.active,
title: 'my timeline',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
});
const { getByTestId } = renderSaveTimelineModal();
@ -179,7 +179,7 @@ describe('SaveTimelineModal', () => {
it('should show discard timeline in the close button', () => {
mockGetState.mockReturnValue({
...mockTimelineModel,
status: TimelineStatus.draft,
status: TimelineStatusEnum.draft,
});
const { getByTestId } = renderSaveTimelineModal(true);
@ -192,8 +192,8 @@ describe('SaveTimelineModal', () => {
it('should show discard timeline template in the close button', () => {
mockGetState.mockReturnValue({
...mockTimelineModel,
timelineType: TimelineType.template,
status: TimelineStatus.draft,
timelineType: TimelineTypeEnum.template,
status: TimelineStatusEnum.draft,
});
const { getByTestId } = renderSaveTimelineModal(true);

View file

@ -26,7 +26,7 @@ import type { State } from '../../../../common/store';
import { selectTimelineById } from '../../../store/selectors';
import { getUseField, Field, Form, useForm } from '../../../../shared_imports';
import { TimelineId } from '../../../../../common/types/timeline';
import { TimelineStatus, TimelineType } from '../../../../../common/api/timeline';
import { TimelineStatusEnum, TimelineTypeEnum } from '../../../../../common/api/timeline';
import { timelineActions } from '../../../store';
import * as commonI18n from '../../timeline/properties/translations';
import * as i18n from './translations';
@ -78,13 +78,13 @@ export const SaveTimelineModal = React.memo<SaveTimelineModalProps>(
[]
);
const isUnsaved = status === TimelineStatus.draft;
const isUnsaved = status === TimelineStatusEnum.draft;
const prevIsSaving = usePrevious(isSaving);
// Resetting the timeline by replacing the active one with a new empty one
const resetTimeline = useCreateTimeline({
timelineId: TimelineId.active,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
});
const handleSubmit = useCallback(
@ -139,8 +139,8 @@ export const SaveTimelineModal = React.memo<SaveTimelineModalProps>(
}, [closeSaveTimeline, resetTimeline, showWarning]);
const closeModalText = useMemo(() => {
if (status === TimelineStatus.draft && showWarning) {
return timelineType === TimelineType.template
if (status === TimelineStatusEnum.draft && showWarning) {
return timelineType === TimelineTypeEnum.template
? i18n.DISCARD_TIMELINE_TEMPLATE
: i18n.DISCARD_TIMELINE;
}
@ -149,11 +149,11 @@ export const SaveTimelineModal = React.memo<SaveTimelineModalProps>(
const modalHeader = useMemo(
() =>
status === TimelineStatus.draft
? timelineType === TimelineType.template
status === TimelineStatusEnum.draft
? timelineType === TimelineTypeEnum.template
? i18n.SAVE_TIMELINE_TEMPLATE
: i18n.SAVE_TIMELINE
: timelineType === TimelineType.template
: timelineType === TimelineTypeEnum.template
? i18n.NAME_TIMELINE_TEMPLATE
: i18n.SAVE_TIMELINE,
[status, timelineType]
@ -161,8 +161,8 @@ export const SaveTimelineModal = React.memo<SaveTimelineModalProps>(
const saveButtonTitle = useMemo(
() =>
status === TimelineStatus.draft && showWarning
? timelineType === TimelineType.template
status === TimelineStatusEnum.draft && showWarning
? timelineType === TimelineTypeEnum.template
? i18n.SAVE_TIMELINE_TEMPLATE
: i18n.SAVE_TIMELINE
: i18n.SAVE,
@ -182,7 +182,7 @@ export const SaveTimelineModal = React.memo<SaveTimelineModalProps>(
disabled: isSaving,
spellCheck: true,
placeholder:
timelineType === TimelineType.template
timelineType === TimelineTypeEnum.template
? commonI18n.UNTITLED_TEMPLATE
: commonI18n.UNTITLED_TIMELINE,
}),

View file

@ -6,8 +6,7 @@
*/
import { i18n } from '@kbn/i18n';
import type { TimelineTypeLiteral } from '../../../../../common/api/timeline';
import { TimelineType } from '../../../../../common/api/timeline';
import { type TimelineType, TimelineTypeEnum } from '../../../../../common/api/timeline';
export const NEW_TIMELINE_BTN = i18n.translate(
'xpack.securitySolution.timeline.modal.newTimelineBtn',
@ -115,10 +114,10 @@ export const CLOSE_MODAL = i18n.translate(
}
);
export const UNSAVED_TIMELINE_WARNING = (timelineType: TimelineTypeLiteral) =>
export const UNSAVED_TIMELINE_WARNING = (timelineType: TimelineType) =>
i18n.translate('xpack.securitySolution.timeline.saveTimeline.modal.warning.title', {
values: {
timeline: timelineType === TimelineType.template ? 'timeline template' : 'timeline',
timeline: timelineType === TimelineTypeEnum.template ? 'timeline template' : 'timeline',
},
defaultMessage: 'You have an unsaved {timeline}. Do you wish to save it?',
});

View file

@ -11,7 +11,11 @@ import { NewTimelineButton } from '.';
import { TimelineId } from '../../../../common/types';
import { timelineActions } from '../../store';
import { useDiscoverInTimelineContext } from '../../../common/components/discover_in_timeline/use_discover_in_timeline_context';
import { RowRendererId, TimelineType } from '../../../../common/api/timeline';
import {
RowRendererValues,
type TimelineType,
TimelineTypeEnum,
} from '../../../../common/api/timeline';
import { TestProviders } from '../../../common/mock';
import { defaultUdtHeaders } from '../timeline/unified_components/default_headers';
@ -43,7 +47,7 @@ describe('NewTimelineButton', () => {
const spy = jest.spyOn(timelineActions, 'createTimeline');
const { getByTestId, queryByTestId, queryByText } = renderNewTimelineButton(
TimelineType.default
TimelineTypeEnum.default
);
const button = getByTestId('timelines-page-create-new-timeline');
@ -62,9 +66,9 @@ describe('NewTimelineButton', () => {
id: TimelineId.active,
indexNames: selectedPatterns,
show: true,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
updated: undefined,
excludedRowRendererIds: [...Object.values(RowRendererId)],
excludedRowRendererIds: RowRendererValues,
});
});
});
@ -73,7 +77,7 @@ describe('NewTimelineButton', () => {
const spy = jest.spyOn(timelineActions, 'createTimeline');
const { getByTestId, queryByTestId, queryByText } = renderNewTimelineButton(
TimelineType.template
TimelineTypeEnum.template
);
const button = getByTestId('timelines-page-create-new-timeline-template');
@ -92,7 +96,7 @@ describe('NewTimelineButton', () => {
id: TimelineId.active,
indexNames: selectedPatterns,
show: true,
timelineType: TimelineType.template,
timelineType: TimelineTypeEnum.template,
updated: undefined,
excludedRowRendererIds: [],
});

View file

@ -10,7 +10,7 @@ import React, { useCallback } from 'react';
import { i18n } from '@kbn/i18n';
import { TimelineId } from '../../../../common/types';
import { useCreateTimeline } from '../../hooks/use_create_timeline';
import { TimelineType } from '../../../../common/api/timeline';
import { type TimelineType, TimelineTypeEnum } from '../../../../common/api/timeline';
const NEW_TIMELINE = i18n.translate('xpack.securitySolution.timelines.newTimelineButtonLabel', {
defaultMessage: 'Create new Timeline',
@ -41,7 +41,7 @@ export const NewTimelineButton = React.memo<NewTimelineButtonProps>(({ type }) =
});
const dataTestSubj = `timelines-page-create-new-${
type === TimelineType.default ? 'timeline' : 'timeline-template'
type === TimelineTypeEnum.default ? 'timeline' : 'timeline-template'
}`;
const handleCreateNewTimeline = useCallback(async () => {
@ -55,7 +55,7 @@ export const NewTimelineButton = React.memo<NewTimelineButtonProps>(({ type }) =
onClick={handleCreateNewTimeline}
fill
>
{type === TimelineType.default ? NEW_TIMELINE : NEW_TEMPLATE_TIMELINE}
{type === TimelineTypeEnum.default ? NEW_TIMELINE : NEW_TEMPLATE_TIMELINE}
</EuiButton>
);
});

View file

@ -10,7 +10,7 @@ import { mount } from 'enzyme';
import '../../../../common/mock/formatted_relative';
import { NoteCards } from '.';
import { TimelineStatus } from '../../../../../common/api/timeline';
import { TimelineStatusEnum } from '../../../../../common/api/timeline';
import { TestProviders } from '../../../../common/mock';
import type { TimelineResultNote } from '../../open_timeline/types';
import { TimelineId } from '../../../../../common/types';
@ -58,7 +58,7 @@ describe('NoteCards', () => {
getNewNoteId: jest.fn(),
notes: [],
showAddNote: true,
status: TimelineStatus.active,
status: TimelineStatusEnum.active,
toggleShowAddNote: jest.fn(),
updateNote: jest.fn(),
timelineId: TimelineId.test,

View file

@ -5,7 +5,7 @@
* 2.0.
*/
import { TimelineStatus, TimelineType } from '../../../../../common/api/timeline';
import { TimelineStatusEnum, TimelineTypeEnum } from '../../../../../common/api/timeline';
export const mockTimeline = {
data: {
@ -144,9 +144,9 @@ export const mockTimeline = {
noteIds: [],
pinnedEventIds: [],
pinnedEventsSaveObject: [],
status: TimelineStatus.active,
status: TimelineStatusEnum.active,
title: 'my timeline',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
templateTimelineId: null,
templateTimelineVersion: null,
savedQueryId: null,
@ -398,7 +398,7 @@ export const mockTemplate = {
noteIds: [],
pinnedEventIds: [],
pinnedEventsSaveObject: [],
status: TimelineStatus.immutable,
status: TimelineStatusEnum.immutable,
title: 'Generic Process Timeline',
timelineType: 'template',
templateTimelineId: 'cd55e52b-7bce-4887-88e2-f1ece4c75447',

View file

@ -5,5 +5,7 @@
* 2.0.
*/
export const DEFAULT_SORT_FIELD = 'updated';
import { SortFieldTimelineEnum } from '../../../../common/api/timeline';
export const DEFAULT_SORT_FIELD = SortFieldTimelineEnum.updated;
export const DEFAULT_SORT_DIRECTION = 'desc';

View file

@ -12,7 +12,7 @@ import { useParams } from 'react-router-dom';
import { DeleteTimelineModal } from './delete_timeline_modal';
import * as i18n from '../translations';
import { TimelineType } from '../../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../../common/api/timeline';
jest.mock('react-router-dom', () => {
const actual = jest.requireActual('react-router-dom');
@ -24,7 +24,7 @@ jest.mock('react-router-dom', () => {
describe('DeleteTimelineModal', () => {
beforeAll(() => {
(useParams as jest.Mock).mockReturnValue({ tabName: TimelineType.default });
(useParams as jest.Mock).mockReturnValue({ tabName: TimelineTypeEnum.default });
});
test('it renders the expected title when a timeline is selected', () => {
@ -134,7 +134,7 @@ describe('DeleteTimelineModal', () => {
describe('DeleteTimelineTemplateModal', () => {
beforeAll(() => {
(useParams as jest.Mock).mockReturnValue({ tabName: TimelineType.template });
(useParams as jest.Mock).mockReturnValue({ tabName: TimelineTypeEnum.template });
});
test('it renders a deletion warning', () => {

View file

@ -12,7 +12,7 @@ import { isEmpty } from 'lodash/fp';
import { useParams } from 'react-router-dom';
import * as i18n from '../translations';
import { TimelineType } from '../../../../../common/api/timeline';
import { type TimelineType, TimelineTypeEnum } from '../../../../../common/api/timeline';
interface Props {
title?: string | null;
@ -28,7 +28,7 @@ export const DELETE_TIMELINE_MODAL_WIDTH = 600; // px
export const DeleteTimelineModal = React.memo<Props>(({ title, closeModal, onDelete }) => {
const { tabName } = useParams<{ tabName: TimelineType }>();
const warning =
tabName === TimelineType.template
tabName === TimelineTypeEnum.template
? i18n.DELETE_TIMELINE_TEMPLATE_WARNING
: i18n.DELETE_TIMELINE_WARNING;

View file

@ -10,7 +10,7 @@ import React from 'react';
import { useParams } from 'react-router-dom';
import { DeleteTimelineModalOverlay } from '.';
import { TimelineType } from '../../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../../common/api/timeline';
import * as i18n from '../translations';
import { useAppToasts } from '../../../../common/hooks/use_app_toasts';
@ -42,7 +42,7 @@ describe('DeleteTimelineModal', () => {
};
beforeAll(() => {
(useParams as jest.Mock).mockReturnValue({ tabName: TimelineType.default });
(useParams as jest.Mock).mockReturnValue({ tabName: TimelineTypeEnum.default });
});
describe('showModalState', () => {
@ -78,7 +78,7 @@ describe('DeleteTimelineModal', () => {
});
test('it shows correct toast message on success for deleted templates', async () => {
(useParams as jest.Mock).mockReturnValue({ tabName: TimelineType.template });
(useParams as jest.Mock).mockReturnValue({ tabName: TimelineTypeEnum.template });
const wrapper = mountWithIntl(<DeleteTimelineModalOverlay {...defaultProps} />);
wrapper.find('button[data-test-subj="confirmModalConfirmButton"]').simulate('click');

View file

@ -12,7 +12,7 @@ import { createGlobalStyle } from 'styled-components';
import { useParams } from 'react-router-dom';
import { DeleteTimelineModal, DELETE_TIMELINE_MODAL_WIDTH } from './delete_timeline_modal';
import type { DeleteTimelines } from '../types';
import { TimelineType } from '../../../../../common/api/timeline';
import { type TimelineType, TimelineTypeEnum } from '../../../../../common/api/timeline';
import { useAppToasts } from '../../../../common/hooks/use_app_toasts';
import * as i18n from '../translations';
@ -48,7 +48,7 @@ export const DeleteTimelineModalOverlay = React.memo<Props>(
deleteTimelines(savedObjectIds, savedSearchIds);
addSuccess({
title:
timelineType === TimelineType.template
timelineType === TimelineTypeEnum.template
? i18n.SUCCESSFULLY_DELETED_TIMELINE_TEMPLATES(savedObjectIds.length)
: i18n.SUCCESSFULLY_DELETED_TIMELINES(savedObjectIds.length),
});
@ -56,7 +56,7 @@ export const DeleteTimelineModalOverlay = React.memo<Props>(
deleteTimelines(savedObjectIds);
addSuccess({
title:
timelineType === TimelineType.template
timelineType === TimelineTypeEnum.template
? i18n.SUCCESSFULLY_DELETED_TIMELINE_TEMPLATES(savedObjectIds.length)
: i18n.SUCCESSFULLY_DELETED_TIMELINES(savedObjectIds.length),
});

View file

@ -9,7 +9,7 @@ import type { EuiBasicTable } from '@elastic/eui';
import { EuiContextMenuPanel, EuiContextMenuItem } from '@elastic/eui';
import React, { useCallback, useMemo } from 'react';
import { TimelineType } from '../../../../common/api/timeline';
import { type TimelineType, TimelineTypeEnum } from '../../../../common/api/timeline';
import * as i18n from './translations';
import type { DeleteTimelines, OpenTimelineResult } from './types';
@ -21,7 +21,7 @@ export const useEditTimelineBatchActions = ({
deleteTimelines,
selectedItems,
tableRef,
timelineType = TimelineType.default,
timelineType = TimelineTypeEnum.default,
}: {
deleteTimelines?: DeleteTimelines;
selectedItems?: OpenTimelineResult[];
@ -108,7 +108,7 @@ export const useEditTimelineBatchActions = ({
onComplete={onCompleteBatchActions.bind(null, closePopover)}
title={
selectedItems?.length !== 1
? timelineType === TimelineType.template
? timelineType === TimelineTypeEnum.template
? i18n.SELECTED_TEMPLATES(selectedItems?.length ?? 0)
: i18n.SELECTED_TIMELINES(selectedItems?.length ?? 0)
: selectedItems[0]?.title ?? ''

View file

@ -9,7 +9,7 @@ import React, { useCallback, useEffect } from 'react';
import { useParams } from 'react-router-dom';
import * as i18n from '../translations';
import { TimelineType } from '../../../../../common/api/timeline';
import { type TimelineType, TimelineTypeEnum } from '../../../../../common/api/timeline';
import { useAppToasts } from '../../../../common/hooks/use_app_toasts';
import { exportSelectedTimeline } from '../../../containers/api';
import { downloadBlob } from '../../../../common/utils/download_blob';
@ -30,7 +30,7 @@ const ExportTimeline: React.FC<{
addSuccess({
title:
timelineType === TimelineType.template
timelineType === TimelineTypeEnum.template
? i18n.SUCCESSFULLY_EXPORTED_TIMELINE_TEMPLATES(exportCount)
: i18n.SUCCESSFULLY_EXPORTED_TIMELINES(exportCount),
'data-test-subj': 'addObjectToContainerSuccess',

View file

@ -24,7 +24,7 @@ import {
} from './helpers';
import type { OpenTimelineResult } from './types';
import { TimelineId } from '../../../../common/types/timeline';
import { TimelineType, TimelineStatus } from '../../../../common/api/timeline';
import { TimelineTypeEnum, TimelineStatusEnum } from '../../../../common/api/timeline';
import {
mockTimeline as mockSelectedTimeline,
mockTemplate as mockSelectedTemplate,
@ -325,14 +325,18 @@ describe('helpers', () => {
savedObjectId: 'savedObject-1',
title: 'Awesome Timeline',
version: '1',
status: TimelineStatus.active,
timelineType: TimelineType.default,
status: TimelineStatusEnum.active,
timelineType: TimelineTypeEnum.default,
};
const newTimeline = defaultTimelineToTimelineModel(timeline, false, TimelineType.template);
const newTimeline = defaultTimelineToTimelineModel(
timeline,
false,
TimelineTypeEnum.template
);
expect(newTimeline).toEqual({
...defaultTimeline,
timelineType: TimelineType.template,
timelineType: TimelineTypeEnum.template,
columns: defaultUdtHeaders,
});
});
@ -342,11 +346,11 @@ describe('helpers', () => {
savedObjectId: 'savedObject-1',
title: 'Awesome Template',
version: '1',
status: TimelineStatus.active,
timelineType: TimelineType.template,
status: TimelineStatusEnum.active,
timelineType: TimelineTypeEnum.template,
};
const newTimeline = defaultTimelineToTimelineModel(timeline, false, TimelineType.default);
const newTimeline = defaultTimelineToTimelineModel(timeline, false, TimelineTypeEnum.default);
expect(newTimeline).toEqual({
...defaultTimeline,
columns: defaultUdtHeaders,
@ -484,21 +488,21 @@ describe('helpers', () => {
savedObjectId: 'savedObject-1',
title: 'Awesome Timeline',
version: '1',
status: TimelineStatus.immutable,
timelineType: TimelineType.template,
status: TimelineStatusEnum.immutable,
timelineType: TimelineTypeEnum.template,
};
const newTimeline = defaultTimelineToTimelineModel(
timeline,
false,
TimelineType.template,
TimelineTypeEnum.template,
false
);
expect(newTimeline).toEqual({
...defaultTimeline,
dateRange: { end: '2020-10-28T11:37:31.655Z', start: '2020-10-27T11:37:31.655Z' },
status: TimelineStatus.immutable,
timelineType: TimelineType.template,
status: TimelineStatusEnum.immutable,
timelineType: TimelineTypeEnum.template,
title: 'Awesome Timeline',
columns: defaultUdtHeaders,
excludedRowRendererIds: [],
@ -510,20 +514,20 @@ describe('helpers', () => {
savedObjectId: 'savedObject-1',
title: 'Awesome Timeline',
version: '1',
status: TimelineStatus.active,
timelineType: TimelineType.default,
status: TimelineStatusEnum.active,
timelineType: TimelineTypeEnum.default,
};
const newTimeline = defaultTimelineToTimelineModel(
timeline,
false,
TimelineType.default,
TimelineTypeEnum.default,
false
);
expect(newTimeline).toEqual({
...defaultTimeline,
dateRange: { end: '2020-07-08T08:20:18.966Z', start: '2020-07-07T08:20:18.966Z' },
status: TimelineStatus.active,
status: TimelineStatusEnum.active,
title: 'Awesome Timeline',
columns: defaultUdtHeaders,
});
@ -534,22 +538,22 @@ describe('helpers', () => {
savedObjectId: 'savedObject-1',
title: 'Awesome Timeline',
version: '1',
status: TimelineStatus.active,
timelineType: TimelineType.default,
status: TimelineStatusEnum.active,
timelineType: TimelineTypeEnum.default,
};
const newTimeline = defaultTimelineToTimelineModel(
timeline,
false,
TimelineType.default,
TimelineTypeEnum.default,
false
);
expect(newTimeline).toEqual({
...defaultTimeline,
dateRange: { end: '2020-07-08T08:20:18.966Z', start: '2020-07-07T08:20:18.966Z' },
status: TimelineStatus.active,
status: TimelineStatusEnum.active,
title: 'Awesome Timeline',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
defaultColumns: defaultUdtHeaders,
columns: defaultUdtHeaders,
});
@ -561,23 +565,23 @@ describe('helpers', () => {
savedObjectId: 'savedObject-1',
title: 'Awesome Timeline',
version: '1',
status: TimelineStatus.active,
timelineType: TimelineType.default,
status: TimelineStatusEnum.active,
timelineType: TimelineTypeEnum.default,
columns: customColumns,
};
const newTimeline = defaultTimelineToTimelineModel(
timeline,
false,
TimelineType.default,
TimelineTypeEnum.default,
false
);
expect(newTimeline).toEqual({
...defaultTimeline,
dateRange: { end: '2020-07-08T08:20:18.966Z', start: '2020-07-07T08:20:18.966Z' },
status: TimelineStatus.active,
status: TimelineStatusEnum.active,
title: 'Awesome Timeline',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
defaultColumns: defaultUdtHeaders,
columns: customColumns,
});
@ -623,7 +627,7 @@ describe('helpers', () => {
duplicate: false,
graphEventId: '',
timelineId: '',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
onError,
onOpenTimeline,
openTimeline: true,
@ -682,7 +686,7 @@ describe('helpers', () => {
duplicate: false,
graphEventId: '',
timelineId: '',
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
openTimeline: true,
};
@ -754,7 +758,7 @@ describe('helpers', () => {
duplicate: false,
graphEventId: '',
timelineId: '',
timelineType: TimelineType.template,
timelineType: TimelineTypeEnum.template,
onOpenTimeline,
openTimeline: true,
};
@ -817,7 +821,7 @@ describe('helpers', () => {
duplicate: false,
graphEventId: '',
timelineId: undefined,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
onOpenTimeline,
openTimeline: true,
unifiedComponentsInTimelineDisabled: false,
@ -853,7 +857,7 @@ describe('helpers', () => {
duplicate: false,
graphEventId: '',
timelineId: TimelineId.active,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
onOpenTimeline: undefined,
openTimeline: true,
unifiedComponentsInTimelineDisabled: false,
@ -892,7 +896,7 @@ describe('helpers', () => {
duplicate: false,
graphEventId: '',
timelineId: TimelineId.active,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
onOpenTimeline,
openTimeline: true,
unifiedComponentsInTimelineDisabled: false,

View file

@ -23,10 +23,11 @@ import type {
Note,
} from '../../../../common/api/timeline';
import {
RowRendererId,
DataProviderType,
TimelineStatus,
TimelineType,
DataProviderTypeEnum,
RowRendererValues,
TimelineStatusEnum,
type TimelineType,
TimelineTypeEnum,
} from '../../../../common/api/timeline';
import { TimelineId, TimelineTabs } from '../../../../common/types/timeline';
import { useUpdateTimeline } from './use_update_timeline';
@ -168,22 +169,22 @@ const getTemplateTimelineId = (
targetTimelineType?: TimelineType
) => {
if (
targetTimelineType === TimelineType.default &&
timeline.timelineType === TimelineType.template
targetTimelineType === TimelineTypeEnum.default &&
timeline.timelineType === TimelineTypeEnum.template
) {
return timeline.templateTimelineId;
}
return duplicate && timeline.timelineType === TimelineType.template
return duplicate && timeline.timelineType === TimelineTypeEnum.template
? // TODO: MOVE TO THE BACKEND
uuidv4()
: timeline.templateTimelineId;
};
const convertToDefaultField = ({ and, ...dataProvider }: DataProviderResult) => {
if (dataProvider.type === DataProviderType.template) {
if (dataProvider.type === DataProviderTypeEnum.template) {
return deepMerge(dataProvider, {
type: DataProviderType.default,
type: DataProviderTypeEnum.default,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
enabled: dataProvider.queryMatch!.operator !== IS_OPERATOR,
queryMatch: {
@ -202,7 +203,7 @@ const getDataProviders = (
dataProviders: TimelineResult['dataProviders'],
timelineType?: TimelineType
) => {
if (duplicate && dataProviders && timelineType === TimelineType.default) {
if (duplicate && dataProviders && timelineType === TimelineTypeEnum.default) {
return dataProviders.map((dataProvider) => ({
...convertToDefaultField(dataProvider),
and: dataProvider.and?.map(convertToDefaultField) ?? [],
@ -229,9 +230,9 @@ export const getTimelineStatus = (
timelineType?: TimelineType
) => {
const isCreateTimelineFromAction = timelineType && timeline.timelineType !== timelineType;
if (isCreateTimelineFromAction) return TimelineStatus.draft;
if (isCreateTimelineFromAction) return TimelineStatusEnum.draft;
return duplicate ? TimelineStatus.active : timeline.status;
return duplicate ? TimelineStatusEnum.active : timeline.status;
};
export const defaultTimelineToTimelineModel = (
@ -240,7 +241,7 @@ export const defaultTimelineToTimelineModel = (
timelineType?: TimelineType,
unifiedComponentsInTimelineDisabled?: boolean
): TimelineModel => {
const isTemplate = timeline.timelineType === TimelineType.template;
const isTemplate = timeline.timelineType === TimelineTypeEnum.template;
const defaultHeadersValue = !unifiedComponentsInTimelineDisabled
? defaultUdtHeaders
: defaultHeaders;
@ -253,15 +254,15 @@ export const defaultTimelineToTimelineModel = (
: defaultHeadersValue,
defaultColumns: defaultHeadersValue,
dateRange:
timeline.status === TimelineStatus.immutable &&
timeline.timelineType === TimelineType.template
timeline.status === TimelineStatusEnum.immutable &&
timeline.timelineType === TimelineTypeEnum.template
? {
start: DEFAULT_FROM_MOMENT.toISOString(),
end: DEFAULT_TO_MOMENT.toISOString(),
}
: timeline.dateRange,
dataProviders: getDataProviders(duplicate, timeline.dataProviders, timelineType),
excludedRowRendererIds: isTemplate ? [] : Object.keys(RowRendererId),
excludedRowRendererIds: isTemplate ? [] : RowRendererValues,
eventIdToNoteIds: setEventIdToNoteIds(duplicate, timeline.eventIdToNoteIds),
filters: timeline.filters != null ? timeline.filters.map(setTimelineFilters) : [],
isFavorite: duplicate
@ -365,7 +366,7 @@ export const useQueryTimelineById = () => {
initialized: true,
savedSearchId: savedSearchId ?? null,
excludedRowRendererIds:
!unifiedComponentsInTimelineDisabled && timelineType !== TimelineType.template
!unifiedComponentsInTimelineDisabled && timelineType !== TimelineTypeEnum.template
? timelineDefaults.excludedRowRendererIds
: [],
},

View file

@ -13,7 +13,7 @@ import { useHistory, useParams } from 'react-router-dom';
import '../../../common/mock/formatted_relative';
import { SecurityPageName } from '../../../app/types';
import { TimelineType } from '../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../common/api/timeline';
import { TimelineId } from '../../../../common/types';
import {
TestProviders,
@ -107,7 +107,7 @@ describe('StatefulOpenTimeline', () => {
beforeEach(() => {
(useParams as jest.Mock).mockReturnValue({
tabName: TimelineType.default,
tabName: TimelineTypeEnum.default,
pageName: SecurityPageName.timelines,
});
useUserPrivilegesMock.mockReturnValue({
@ -172,12 +172,12 @@ describe('StatefulOpenTimeline', () => {
}
);
expect(result.current.timelineType).toBe(TimelineType.default);
expect(result.current.timelineType).toBe(TimelineTypeEnum.default);
});
test("should land on correct timelines' tab with url timelines/template", () => {
(useParams as jest.Mock).mockReturnValue({
tabName: TimelineType.template,
tabName: TimelineTypeEnum.template,
pageName: SecurityPageName.timelines,
});
@ -188,12 +188,12 @@ describe('StatefulOpenTimeline', () => {
}
);
expect(result.current.timelineType).toBe(TimelineType.template);
expect(result.current.timelineType).toBe(TimelineTypeEnum.template);
});
test("should land on correct templates' tab after switching tab", async () => {
(useParams as jest.Mock).mockReturnValue({
tabName: TimelineType.template,
tabName: TimelineTypeEnum.template,
pageName: SecurityPageName.timelines,
});
@ -209,7 +209,7 @@ describe('StatefulOpenTimeline', () => {
);
await waitFor(() => {
wrapper
.find(`[data-test-subj="timeline-${TimelineTabsStyle.tab}-${TimelineType.template}"]`)
.find(`[data-test-subj="timeline-${TimelineTabsStyle.tab}-${TimelineTypeEnum.template}"]`)
.first()
.simulate('click');
@ -230,7 +230,7 @@ describe('StatefulOpenTimeline', () => {
}
);
expect(result.current.timelineType).toBe(TimelineType.default);
expect(result.current.timelineType).toBe(TimelineTypeEnum.default);
});
test('should not change url after switching filter', async () => {
@ -252,7 +252,7 @@ describe('StatefulOpenTimeline', () => {
await waitFor(() => {
wrapper
.find(
`[data-test-subj="open-timeline-modal-body-${TimelineTabsStyle.filter}-${TimelineType.template}"]`
`[data-test-subj="open-timeline-modal-body-${TimelineTabsStyle.filter}-${TimelineTypeEnum.template}"]`
)
.first()
.simulate('click');
@ -613,7 +613,7 @@ describe('StatefulOpenTimeline', () => {
expect(
wrapper
.find(
`[data-test-subj="open-timeline-modal-body-${TimelineTabsStyle.filter}-${TimelineType.default}"]`
`[data-test-subj="open-timeline-modal-body-${TimelineTabsStyle.filter}-${TimelineTypeEnum.default}"]`
)
.exists()
).toEqual(true);

View file

@ -153,7 +153,7 @@ export const StatefulOpenTimelineComponent = React.memo<OpenTimelineOwnProps>(
/** The requested sort direction of the query results */
const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>(DEFAULT_SORT_DIRECTION);
/** The requested field to sort on */
const [sortField, setSortField] = useState(DEFAULT_SORT_FIELD);
const [sortField, setSortField] = useState<SortFieldTimeline>(DEFAULT_SORT_FIELD);
const getTimeline = useMemo(() => timelineSelectors.getTimelineByIdSelector(), []);
const timelineSavedObjectId = useShallowEqualSelector(
@ -194,7 +194,7 @@ export const StatefulOpenTimelineComponent = React.memo<OpenTimelineOwnProps>(
},
search,
sort: {
sortField: sortField as SortFieldTimeline,
sortField,
sortOrder: sortDirection as Direction,
},
onlyUserFavorite: onlyFavorites,
@ -318,7 +318,7 @@ export const StatefulOpenTimelineComponent = React.memo<OpenTimelineOwnProps>(
if (sort != null) {
const { field, direction } = sort;
setSortDirection(direction);
setSortField(field);
setSortField(field as SortFieldTimeline);
}
}, []);

View file

@ -17,7 +17,7 @@ import type { TimelinesTableProps } from './timelines_table';
import { mockTimelineResults } from '../../../common/mock/timeline_results';
import { OpenTimeline } from './open_timeline';
import { DEFAULT_SORT_DIRECTION, DEFAULT_SORT_FIELD } from './constants';
import { TimelineType, TimelineStatus } from '../../../../common/api/timeline';
import { TimelineTypeEnum, TimelineStatusEnum } from '../../../../common/api/timeline';
import { getMockTheme } from '../../../common/lib/kibana/kibana_react.mock';
import { useUserPrivileges } from '../../../common/components/user_privileges';
@ -72,8 +72,8 @@ describe('OpenTimeline', () => {
sortDirection: DEFAULT_SORT_DIRECTION,
sortField: DEFAULT_SORT_FIELD,
title,
timelineType: TimelineType.default,
timelineStatus: TimelineStatus.active,
timelineType: TimelineTypeEnum.default,
timelineStatus: TimelineStatusEnum.active,
templateTimelineFilter: [<div key="mock-a" />, <div key="mock-b" />],
totalSearchResultsCount: mockSearchResults.length,
});
@ -317,7 +317,7 @@ describe('OpenTimeline', () => {
test("it should render bulk actions if timelineStatus is active (selecting custom templates' tab)", () => {
const defaultProps = {
...getDefaultTestProps(mockResults),
timelineStatus: TimelineStatus.active,
timelineStatus: TimelineStatusEnum.active,
};
const wrapper = mountWithIntl(
<ThemeProvider theme={mockTheme}>
@ -436,7 +436,7 @@ describe('OpenTimeline', () => {
});
const defaultProps = {
...getDefaultTestProps(mockResults),
timelineStatus: TimelineStatus.active,
timelineStatus: TimelineStatusEnum.active,
};
const wrapper = mountWithIntl(
<ThemeProvider theme={mockTheme}>
@ -455,7 +455,7 @@ describe('OpenTimeline', () => {
});
const defaultProps = {
...getDefaultTestProps(mockResults),
timelineStatus: TimelineStatus.active,
timelineStatus: TimelineStatusEnum.active,
};
const wrapper = mountWithIntl(
<ThemeProvider theme={mockTheme}>
@ -471,7 +471,7 @@ describe('OpenTimeline', () => {
test('it should NOT include createFrom, duplicate, createRule, delete in timeline actions when user has read only access', () => {
const defaultProps = {
...getDefaultTestProps(mockResults),
timelineStatus: TimelineStatus.active,
timelineStatus: TimelineStatusEnum.active,
};
useUserPrivilegesMock.mockReturnValue({
kibanaSecuritySolutionsPrivileges: { crud: false, read: true },
@ -490,7 +490,7 @@ describe('OpenTimeline', () => {
test("it should render selected count if timelineStatus is active (selecting custom templates' tab)", () => {
const defaultProps = {
...getDefaultTestProps(mockResults),
timelineStatus: TimelineStatus.active,
timelineStatus: TimelineStatusEnum.active,
};
const wrapper = mountWithIntl(
<ThemeProvider theme={mockTheme}>
@ -504,7 +504,7 @@ describe('OpenTimeline', () => {
test("it should not render bulk actions if timelineStatus is immutable (selecting Elastic templates' tab)", () => {
const defaultProps = {
...getDefaultTestProps(mockResults),
timelineStatus: TimelineStatus.immutable,
timelineStatus: TimelineStatusEnum.immutable,
};
const wrapper = mountWithIntl(
<ThemeProvider theme={mockTheme}>
@ -521,7 +521,7 @@ describe('OpenTimeline', () => {
});
const defaultProps = {
...getDefaultTestProps(mockResults),
timelineStatus: TimelineStatus.immutable,
timelineStatus: TimelineStatusEnum.immutable,
};
const wrapper = mountWithIntl(
<ThemeProvider theme={mockTheme}>
@ -537,7 +537,7 @@ describe('OpenTimeline', () => {
test("it should not render selected count if timelineStatus is immutable (selecting Elastic templates' tab)", () => {
const defaultProps = {
...getDefaultTestProps(mockResults),
timelineStatus: TimelineStatus.immutable,
timelineStatus: TimelineStatusEnum.immutable,
};
const wrapper = mountWithIntl(
<ThemeProvider theme={mockTheme}>

View file

@ -10,7 +10,7 @@ import type { EuiBasicTable } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n-react';
import styled from 'styled-components';
import { TimelineType, TimelineStatus } from '../../../../common/api/timeline';
import { TimelineTypeEnum, TimelineStatusEnum } from '../../../../common/api/timeline';
import { ImportDataModal } from '../../../common/components/import_data_modal';
import {
UtilityBarGroup,
@ -65,7 +65,7 @@ export const OpenTimeline = React.memo<OpenTimelineProps>(
setImportDataModalToggle,
sortField,
tabName,
timelineType = TimelineType.default,
timelineType = TimelineTypeEnum.default,
timelineStatus,
timelineFilter,
templateTimelineFilter,
@ -168,7 +168,7 @@ export const OpenTimeline = React.memo<OpenTimelineProps>(
...(onCreateRuleFromEql != null ? createRuleFromEql : []),
];
if (timelineStatus !== TimelineStatus.immutable) {
if (timelineStatus !== TimelineStatusEnum.immutable) {
timelineActions.push('export');
timelineActions.push('selectable');
}
@ -176,7 +176,7 @@ export const OpenTimeline = React.memo<OpenTimelineProps>(
if (
onDeleteSelected != null &&
deleteTimelines != null &&
timelineStatus !== TimelineStatus.immutable
timelineStatus !== TimelineStatusEnum.immutable
) {
timelineActions.push('delete');
}
@ -184,7 +184,7 @@ export const OpenTimeline = React.memo<OpenTimelineProps>(
return timelineActions;
}
// user with read access should only see export
if (timelineStatus !== TimelineStatus.immutable) {
if (timelineStatus !== TimelineStatusEnum.immutable) {
return ['export', 'selectable'];
}
return [];
@ -248,15 +248,15 @@ export const OpenTimeline = React.memo<OpenTimelineProps>(
<UtilityBarText data-test-subj="query-message">
<>
{i18n.SHOWING}{' '}
{timelineType === TimelineType.template ? nTemplates : nTimelines}
{timelineType === TimelineTypeEnum.template ? nTemplates : nTimelines}
</>
</UtilityBarText>
</UtilityBarGroup>
<UtilityBarGroup>
{timelineStatus !== TimelineStatus.immutable && (
{timelineStatus !== TimelineStatusEnum.immutable && (
<>
<UtilityBarText data-test-subj="selected-count">
{timelineType === TimelineType.template
{timelineType === TimelineTypeEnum.template
? i18n.SELECTED_TEMPLATES((selectedItems || []).length)
: i18n.SELECTED_TIMELINES((selectedItems || []).length)}
</UtilityBarText>

View file

@ -16,7 +16,7 @@ import type { TimelinesTableProps } from '../timelines_table';
import { mockTimelineResults } from '../../../../common/mock/timeline_results';
import { OpenTimelineModalBody } from './open_timeline_modal_body';
import { DEFAULT_SORT_DIRECTION, DEFAULT_SORT_FIELD } from '../constants';
import { TimelineType, TimelineStatus } from '../../../../../common/api/timeline';
import { TimelineTypeEnum, TimelineStatusEnum } from '../../../../../common/api/timeline';
import { getMockTheme } from '../../../../common/lib/kibana/kibana_react.mock';
jest.mock('../../../../common/lib/kibana');
@ -55,8 +55,8 @@ describe('OpenTimelineModal', () => {
selectedItems: [],
sortDirection: DEFAULT_SORT_DIRECTION,
sortField: DEFAULT_SORT_FIELD,
timelineType: TimelineType.default,
timelineStatus: TimelineStatus.active,
timelineType: TimelineTypeEnum.default,
timelineStatus: TimelineStatusEnum.active,
templateTimelineFilter: [<div key={0} />],
title,
totalSearchResultsCount: mockSearchResults.length,

View file

@ -10,7 +10,7 @@ import { mountWithIntl } from '@kbn/test-jest-helpers';
import React from 'react';
import { ThemeProvider } from 'styled-components';
import { TimelineType } from '../../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../../common/api/timeline';
import { SearchRow } from '.';
@ -32,7 +32,7 @@ describe('SearchRow', () => {
onQueryChange={jest.fn()}
onToggleOnlyFavorites={jest.fn()}
query=""
timelineType={TimelineType.default}
timelineType={TimelineTypeEnum.default}
/>
</ThemeProvider>
);
@ -52,7 +52,7 @@ describe('SearchRow', () => {
onQueryChange={jest.fn()}
onToggleOnlyFavorites={jest.fn()}
query=""
timelineType={TimelineType.default}
timelineType={TimelineTypeEnum.default}
/>
</ThemeProvider>
);
@ -72,7 +72,7 @@ describe('SearchRow', () => {
onQueryChange={jest.fn()}
onToggleOnlyFavorites={onToggleOnlyFavorites}
query=""
timelineType={TimelineType.default}
timelineType={TimelineTypeEnum.default}
/>
</ThemeProvider>
);
@ -90,7 +90,7 @@ describe('SearchRow', () => {
onQueryChange={jest.fn()}
onToggleOnlyFavorites={jest.fn()}
query=""
timelineType={TimelineType.default}
timelineType={TimelineTypeEnum.default}
/>
</ThemeProvider>
);
@ -111,7 +111,7 @@ describe('SearchRow', () => {
onQueryChange={jest.fn()}
onToggleOnlyFavorites={jest.fn()}
query=""
timelineType={TimelineType.default}
timelineType={TimelineTypeEnum.default}
/>
</ThemeProvider>
);
@ -136,7 +136,7 @@ describe('SearchRow', () => {
onQueryChange={onQueryChange}
onToggleOnlyFavorites={jest.fn()}
query=""
timelineType={TimelineType.default}
timelineType={TimelineTypeEnum.default}
/>
</ThemeProvider>
);

View file

@ -15,7 +15,7 @@ import {
import React, { useMemo } from 'react';
import styled from 'styled-components';
import { TimelineType } from '../../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../../common/api/timeline';
import * as i18n from '../translations';
import type { OpenTimelineProps } from '../types';
@ -58,7 +58,7 @@ export const SearchRow = React.memo<Props>(
const searchBox = useMemo(
() => ({
placeholder:
timelineType === TimelineType.default
timelineType === TimelineTypeEnum.default
? i18n.SEARCH_PLACEHOLDER
: i18n.SEARCH_TEMPLATE_PLACEHOLDER,
incremental: false,

View file

@ -16,7 +16,7 @@ import type {
OnOpenDeleteTimelineModal,
} from '../types';
import * as i18n from '../translations';
import { TimelineStatus, TimelineType } from '../../../../../common/api/timeline';
import { TimelineStatusEnum, TimelineTypeEnum } from '../../../../../common/api/timeline';
type Action = EuiTableActionsColumnType<object>['actions'][number];
/**
@ -47,7 +47,7 @@ export const getActionsColumns = ({
onClick: ({ savedObjectId }: OpenTimelineResult) => {
onOpenTimeline({
duplicate: true,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
timelineId: savedObjectId!,
});
@ -57,7 +57,8 @@ export const getActionsColumns = ({
description: i18n.CREATE_TIMELINE_FROM_TEMPLATE,
'data-test-subj': 'create-from-template',
available: (item: OpenTimelineResult) =>
item.timelineType === TimelineType.template && actionTimelineToShow.includes('createFrom'),
item.timelineType === TimelineTypeEnum.template &&
actionTimelineToShow.includes('createFrom'),
} as Action;
const createTemplateFromTimeline = {
@ -66,7 +67,7 @@ export const getActionsColumns = ({
onClick: ({ savedObjectId }: OpenTimelineResult) => {
onOpenTimeline({
duplicate: true,
timelineType: TimelineType.template,
timelineType: TimelineTypeEnum.template,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
timelineId: savedObjectId!,
});
@ -76,7 +77,8 @@ export const getActionsColumns = ({
description: i18n.CREATE_TEMPLATE_FROM_TIMELINE,
'data-test-subj': 'create-template-from-timeline',
available: (item: OpenTimelineResult) =>
item.timelineType !== TimelineType.template && actionTimelineToShow.includes('createFrom'),
item.timelineType !== TimelineTypeEnum.template &&
actionTimelineToShow.includes('createFrom'),
} as Action;
const openAsDuplicateColumn = {
@ -93,7 +95,7 @@ export const getActionsColumns = ({
description: i18n.OPEN_AS_DUPLICATE,
'data-test-subj': 'open-duplicate',
available: (item: OpenTimelineResult) =>
item.timelineType !== TimelineType.template && actionTimelineToShow.includes('duplicate'),
item.timelineType !== TimelineTypeEnum.template && actionTimelineToShow.includes('duplicate'),
} as Action;
const openAsDuplicateTemplateColumn = {
@ -110,7 +112,7 @@ export const getActionsColumns = ({
description: i18n.OPEN_AS_DUPLICATE_TEMPLATE,
'data-test-subj': 'open-duplicate-template',
available: (item: OpenTimelineResult) =>
item.timelineType === TimelineType.template && actionTimelineToShow.includes('duplicate'),
item.timelineType === TimelineTypeEnum.template && actionTimelineToShow.includes('duplicate'),
} as Action;
const exportTimelineAction = {
@ -121,7 +123,7 @@ export const getActionsColumns = ({
if (enableExportTimelineDownloader != null) enableExportTimelineDownloader(selectedTimeline);
},
enabled: (timeline: OpenTimelineResult) => {
return timeline.savedObjectId != null && timeline.status !== TimelineStatus.immutable;
return timeline.savedObjectId != null && timeline.status !== TimelineStatusEnum.immutable;
},
description: i18n.EXPORT_SELECTED,
'data-test-subj': 'export-timeline',
@ -136,7 +138,7 @@ export const getActionsColumns = ({
if (onOpenDeleteTimelineModal != null) onOpenDeleteTimelineModal(selectedTimeline);
},
enabled: ({ savedObjectId, status }: OpenTimelineResult) =>
savedObjectId != null && status !== TimelineStatus.immutable,
savedObjectId != null && status !== TimelineStatusEnum.immutable,
description: i18n.DELETE_SELECTED,
'data-test-subj': 'delete-timeline',
available: () => actionTimelineToShow.includes('delete') && deleteTimelines != null,
@ -153,7 +155,7 @@ export const getActionsColumns = ({
enabled: (timeline: OpenTimelineResult) =>
onCreateRule != null &&
timeline.savedObjectId != null &&
timeline.status !== TimelineStatus.immutable,
timeline.status !== TimelineStatusEnum.immutable,
description: i18n.CREATE_RULE_FROM_TIMELINE,
'data-test-subj': 'create-rule-from-timeline',
available: ({ queryType }: OpenTimelineResult) =>
@ -174,7 +176,7 @@ export const getActionsColumns = ({
enabled: (timeline: OpenTimelineResult) =>
onCreateRuleFromEql != null &&
timeline.savedObjectId != null &&
timeline.status !== TimelineStatus.immutable,
timeline.status !== TimelineStatusEnum.immutable,
description: i18n.CREATE_RULE_FROM_TIMELINE,
'data-test-subj': 'create-rule-from-eql',
available: ({ queryType }: OpenTimelineResult) =>

View file

@ -17,7 +17,7 @@ import * as i18n from '../translations';
import type { OnOpenTimeline, OnToggleShowNotes, OpenTimelineResult } from '../types';
import { getEmptyTagValue } from '../../../../common/components/empty_value';
import { FormattedRelativePreferenceDate } from '../../../../common/components/formatted_date';
import { TimelineType } from '../../../../../common/api/timeline';
import { type TimelineType, TimelineTypeEnum } from '../../../../../common/api/timeline';
import { TimelineId } from '../../../../../common/types';
const LineClampTextContainer = styled.span`
@ -68,7 +68,8 @@ export const getCommonColumns = ({
{
dataType: 'string' as EuiTableDataType,
field: 'title',
name: timelineType === TimelineType.default ? i18n.TIMELINE_NAME : i18n.TIMELINE_TEMPLATE_NAME,
name:
timelineType === TimelineTypeEnum.default ? i18n.TIMELINE_NAME : i18n.TIMELINE_TEMPLATE_NAME,
render: (title: string, timelineResult: OpenTimelineResult) =>
timelineResult.savedObjectId != null ? (
<EuiLink

View file

@ -13,8 +13,7 @@ import { ACTION_COLUMN_WIDTH } from './common_styles';
import { getNotesCount, getPinnedEventCount } from '../helpers';
import * as i18n from '../translations';
import type { FavoriteTimelineResult, OpenTimelineResult } from '../types';
import type { TimelineTypeLiteralWithNull } from '../../../../../common/api/timeline';
import { TimelineType } from '../../../../../common/api/timeline';
import { type TimelineType, TimelineTypeEnum } from '../../../../../common/api/timeline';
/**
* Returns the columns that have icon headers
@ -22,7 +21,7 @@ import { TimelineType } from '../../../../../common/api/timeline';
export const getIconHeaderColumns = ({
timelineType,
}: {
timelineType: TimelineTypeLiteralWithNull;
timelineType: TimelineType | null;
}): Array<EuiTableFieldDataColumnType<object>> => {
const columns = {
note: {
@ -77,5 +76,5 @@ export const getIconHeaderColumns = ({
};
const templateColumns = [columns.note, columns.favorite];
const defaultColumns = [columns.pinnedEvent, columns.note, columns.favorite];
return timelineType === TimelineType.template ? templateColumns : defaultColumns;
return timelineType === TimelineTypeEnum.template ? templateColumns : defaultColumns;
};

View file

@ -27,8 +27,11 @@ import { getActionsColumns } from './actions_columns';
import { getCommonColumns } from './common_columns';
import { getExtendedColumns } from './extended_columns';
import { getIconHeaderColumns } from './icon_header_columns';
import type { TimelineTypeLiteralWithNull } from '../../../../../common/api/timeline';
import { TimelineStatus, TimelineType } from '../../../../../common/api/timeline';
import {
TimelineStatusEnum,
type TimelineType,
TimelineTypeEnum,
} from '../../../../../common/api/timeline';
import { useUserPrivileges } from '../../../../common/components/user_privileges';
/**
@ -63,7 +66,7 @@ export const getTimelinesTableColumns = ({
onSelectionChange: OnSelectionChange;
onToggleShowNotes: OnToggleShowNotes;
showExtendedColumns: boolean;
timelineType: TimelineTypeLiteralWithNull;
timelineType: TimelineType | null;
hasCrudAccess: boolean;
}): Array<EuiBasicTableColumn<object>> => {
return [
@ -110,7 +113,7 @@ export interface TimelinesTableProps {
showExtendedColumns: boolean;
sortDirection: 'asc' | 'desc';
sortField: string;
timelineType: TimelineTypeLiteralWithNull;
timelineType: TimelineType | null;
tableRef: React.MutableRefObject<EuiBasicTable<OpenTimelineResult> | null>;
totalSearchResultsCount: number;
}
@ -171,7 +174,7 @@ export const TimelinesTable = React.memo<TimelinesTableProps>(
return {
selectable: (timelineResult: OpenTimelineResult) =>
timelineResult.savedObjectId != null &&
timelineResult.status !== TimelineStatus.immutable,
timelineResult.status !== TimelineStatusEnum.immutable,
selectableMessage: (selectable: boolean) =>
!selectable ? i18n.MISSING_SAVED_OBJECT_ID : '',
onSelectionChange,
@ -215,7 +218,7 @@ export const TimelinesTable = React.memo<TimelinesTableProps>(
const noItemsMessage =
isLoading || searchResults == null
? i18n.LOADING
: timelineType === TimelineType.template
: timelineType === TimelineTypeEnum.template
? i18n.ZERO_TIMELINE_TEMPLATES_MATCH
: i18n.ZERO_TIMELINES_MATCH;

View file

@ -9,7 +9,7 @@ import { DEFAULT_SEARCH_RESULTS_PER_PAGE } from '../../../pages/timelines_page';
import { DEFAULT_SORT_DIRECTION, DEFAULT_SORT_FIELD } from '../constants';
import type { OpenTimelineResult } from '../types';
import type { TimelinesTableProps } from '.';
import { TimelineType } from '../../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../../common/api/timeline';
export const getMockTimelinesTableProps = (
mockOpenTimelineResults: OpenTimelineResult[]
@ -31,7 +31,7 @@ export const getMockTimelinesTableProps = (
showExtendedColumns: true,
sortDirection: DEFAULT_SORT_DIRECTION,
sortField: DEFAULT_SORT_FIELD,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
totalSearchResultsCount: mockOpenTimelineResults.length,
tableRef: { current: null },
});

View file

@ -11,11 +11,9 @@ import type { TimelineModel } from '../../store/model';
import type {
RowRendererId,
SingleTimelineResolveResponse,
TimelineTypeLiteral,
TimelineTypeLiteralWithNull,
TimelineType,
TimelineStatus,
TemplateTimelineTypeLiteral,
TimelineStatusLiteralWithNull,
TemplateTimelineType,
Note,
} from '../../../../common/api/timeline';
@ -63,7 +61,7 @@ export interface OpenTimelineResult {
status?: TimelineStatus | null;
title?: string | null;
templateTimelineId?: string | null;
timelineType?: TimelineTypeLiteral;
timelineType?: TimelineType;
updated?: number | null;
updatedBy?: string | null;
}
@ -98,7 +96,7 @@ export type OnOpenTimeline = ({
}: {
duplicate: boolean;
timelineId: string;
timelineType?: TimelineTypeLiteral;
timelineType?: TimelineType;
}) => void;
export type OnOpenDeleteTimelineModal = (selectedItem: OpenTimelineResult) => void;
@ -195,9 +193,9 @@ export interface OpenTimelineProps {
/** the requested field to sort on */
sortField: string;
/** this affects timeline's behaviour like editable / duplicatible */
timelineType: TimelineTypeLiteralWithNull;
timelineType: TimelineType | null;
/* active or immutable */
timelineStatus: TimelineStatusLiteralWithNull;
timelineStatus: TimelineStatus | null;
/** when timelineType === template, templatetimelineFilter is a JSX.Element */
templateTimelineFilter: JSX.Element[] | null;
/** timeline / timeline template */
@ -240,13 +238,13 @@ export enum TimelineTabsStyle {
export interface TimelineTab {
disabled: boolean;
href: string;
id: TimelineTypeLiteral;
id: TimelineType;
name: string;
onClick: (ev: { preventDefault: () => void }) => void;
}
export interface TemplateTimelineFilter {
id: TemplateTimelineTypeLiteral;
id: TemplateTimelineType;
name: string;
disabled: boolean;
withNext: boolean;

View file

@ -9,14 +9,14 @@ import React, { useState, useCallback, useMemo } from 'react';
import { EuiFilterButton } from '@elastic/eui';
import type {
TimelineTypeLiteralWithNull,
TemplateTimelineTypeLiteralWithNull,
TimelineStatusLiteralWithNull,
} from '../../../../common/api/timeline';
import {
TemplateTimelineType,
TimelineStatus,
TimelineType,
TemplateTimelineType,
} from '../../../../common/api/timeline';
import {
TemplateTimelineTypeEnum,
TimelineStatusEnum,
TimelineTypeEnum,
} from '../../../../common/api/timeline';
import * as i18n from './translations';
@ -28,18 +28,18 @@ export const useTimelineStatus = ({
elasticTemplateTimelineCount,
customTemplateTimelineCount,
}: {
timelineType: TimelineTypeLiteralWithNull;
timelineType: TimelineType | null;
elasticTemplateTimelineCount?: number | null;
customTemplateTimelineCount?: number | null;
}): {
timelineStatus: TimelineStatusLiteralWithNull;
templateTimelineType: TemplateTimelineTypeLiteralWithNull;
timelineStatus: TimelineStatus | null;
templateTimelineType: TemplateTimelineType | null;
templateTimelineFilter: JSX.Element[] | null;
installPrepackagedTimelines: () => void;
} => {
const [selectedTab, setSelectedTab] = useState<TemplateTimelineTypeLiteralWithNull>(null);
const [selectedTab, setSelectedTab] = useState<TemplateTimelineType | null>(null);
const isTemplateFilterEnabled = useMemo(
() => timelineType === TimelineType.template,
() => timelineType === TimelineTypeEnum.template,
[timelineType]
);
@ -52,23 +52,23 @@ export const useTimelineStatus = ({
() =>
templateTimelineType == null
? null
: templateTimelineType === TemplateTimelineType.elastic
? TimelineStatus.immutable
: TimelineStatus.active,
: templateTimelineType === TemplateTimelineTypeEnum.elastic
? TimelineStatusEnum.immutable
: TimelineStatusEnum.active,
[templateTimelineType]
);
const filters = useMemo(
() => [
{
id: TemplateTimelineType.elastic,
id: TemplateTimelineTypeEnum.elastic,
name: i18n.FILTER_ELASTIC_TIMELINES,
disabled: !isTemplateFilterEnabled,
withNext: true,
count: elasticTemplateTimelineCount ?? undefined,
},
{
id: TemplateTimelineType.custom,
id: TemplateTimelineTypeEnum.custom,
name: i18n.FILTER_CUSTOM_TIMELINES,
disabled: !isTemplateFilterEnabled,
withNext: false,
@ -108,7 +108,7 @@ export const useTimelineStatus = ({
}, [templateTimelineType, filters, isTemplateFilterEnabled, onFilterClicked]);
const installPrepackagedTimelines = useCallback(async () => {
if (templateTimelineType !== TemplateTimelineType.custom) {
if (templateTimelineType !== TemplateTimelineTypeEnum.custom) {
await installPrepackedTimelines();
}
}, [templateTimelineType]);

View file

@ -10,8 +10,7 @@ import { useParams } from 'react-router-dom';
import { EuiTabs, EuiTab, EuiSpacer } from '@elastic/eui';
import { noop } from 'lodash/fp';
import type { TimelineTypeLiteralWithNull } from '../../../../common/api/timeline';
import { TimelineType } from '../../../../common/api/timeline';
import { type TimelineType, TimelineTypeEnum } from '../../../../common/api/timeline';
import { SecurityPageName } from '../../../app/types';
import { getTimelineTabsUrl, useFormatUrl } from '../../../common/components/link_to';
import * as i18n from './translations';
@ -25,7 +24,7 @@ export interface UseTimelineTypesArgs {
}
export interface UseTimelineTypesResult {
timelineType: TimelineTypeLiteralWithNull;
timelineType: TimelineType | null;
timelineTabs: JSX.Element;
timelineFilters: JSX.Element;
}
@ -37,19 +36,19 @@ export const useTimelineTypes = ({
const { formatUrl, search: urlSearch } = useFormatUrl(SecurityPageName.timelines);
const { navigateToUrl } = useKibana().services.application;
const { tabName } = useParams<{ pageName: SecurityPageName; tabName: string }>();
const [timelineType, setTimelineTypes] = useState<TimelineTypeLiteralWithNull>(
tabName === TimelineType.default || tabName === TimelineType.template
const [timelineType, setTimelineTypes] = useState<TimelineType | null>(
tabName === TimelineTypeEnum.default || tabName === TimelineTypeEnum.template
? tabName
: TimelineType.default
: TimelineTypeEnum.default
);
const notesEnabled = useIsExperimentalFeatureEnabled('securitySolutionNotesEnabled');
const timelineUrl = useMemo(() => {
return formatUrl(getTimelineTabsUrl(TimelineType.default, urlSearch));
return formatUrl(getTimelineTabsUrl(TimelineTypeEnum.default, urlSearch));
}, [formatUrl, urlSearch]);
const templateUrl = useMemo(() => {
return formatUrl(getTimelineTabsUrl(TimelineType.template, urlSearch));
return formatUrl(getTimelineTabsUrl(TimelineTypeEnum.template, urlSearch));
}, [formatUrl, urlSearch]);
const notesUrl = useMemo(() => {
@ -83,7 +82,7 @@ export const useTimelineTypes = ({
const getFilterOrTabs: (timelineTabsStyle: TimelineTabsStyle) => TimelineTab[] = useCallback(
(timelineTabsStyle: TimelineTabsStyle) => [
{
id: TimelineType.default,
id: TimelineTypeEnum.default,
name: i18n.TAB_TIMELINES,
href: timelineUrl,
disabled: false,
@ -91,7 +90,7 @@ export const useTimelineTypes = ({
onClick: timelineTabsStyle === TimelineTabsStyle.tab ? goToTimeline : noop,
},
{
id: TimelineType.template,
id: TimelineTypeEnum.template,
name: i18n.TAB_TEMPLATES,
href: templateUrl,
disabled: false,

View file

@ -9,7 +9,7 @@ import { useCallback } from 'react';
import { useDispatch } from 'react-redux';
import { isEmpty } from 'lodash/fp';
import type { Note } from '../../../../common/api/timeline';
import { TimelineStatus, TimelineType } from '../../../../common/api/timeline';
import { TimelineStatusEnum, TimelineTypeEnum } from '../../../../common/api/timeline';
import { createNote } from '../notes/helpers';
import { InputsModelId } from '../../../common/store/inputs/constants';
@ -65,8 +65,8 @@ export const useUpdateTimeline = () => {
);
}
if (
_timeline.status === TimelineStatus.immutable &&
_timeline.timelineType === TimelineType.template
_timeline.status === TimelineStatusEnum.immutable &&
_timeline.timelineType === TimelineTypeEnum.template
) {
dispatch(
dispatchSetRelativeRangeDatePicker({

View file

@ -11,13 +11,12 @@ import { createMockStore, mockGlobalState, TestProviders } from '../../../common
import { fireEvent, render, waitFor } from '@testing-library/react';
import { RowRendererSwitch } from '.';
import { TimelineId } from '../../../../common/types';
import { RowRendererId } from '../../../../common/api/timeline';
import { RowRendererValues } from '../../../../common/api/timeline';
const localState = structuredClone(mockGlobalState);
// exclude all row renderers by default
localState.timeline.timelineById[TimelineId.test].excludedRowRendererIds =
Object.values(RowRendererId);
localState.timeline.timelineById[TimelineId.test].excludedRowRendererIds = RowRendererValues;
const renderTestComponent = (props?: ComponentProps<typeof TestProviders>) => {
const store = props?.store ?? createMockStore(localState);
@ -69,7 +68,7 @@ describe('Row Renderer Switch', () => {
expect(getByTestId('row-renderer-switch')).toHaveAttribute('aria-checked', 'false');
expect(
localStore.getState().timeline.timelineById[TimelineId.test].excludedRowRendererIds
).toMatchObject(Object.values(RowRendererId));
).toMatchObject(RowRendererValues);
});
});
});

View file

@ -10,7 +10,7 @@ import { EuiToolTip, EuiSwitch, EuiFormRow, useGeneratedHtmlId } from '@elastic/
import React, { useCallback, useMemo } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import styled from 'styled-components';
import { RowRendererId } from '../../../../common/api/timeline';
import { RowRendererValues } from '../../../../common/api/timeline';
import type { State } from '../../../common/store';
import { setExcludedRowRendererIds } from '../../store/actions';
import { selectExcludedRowRendererIds } from '../../store/selectors';
@ -40,7 +40,7 @@ export const RowRendererSwitch = React.memo(function RowRendererSwitch(
);
const isAnyRowRendererEnabled = useMemo(
() => Object.values(RowRendererId).some((id) => !excludedRowRendererIds.includes(id)),
() => RowRendererValues.some((id) => !excludedRowRendererIds.includes(id)),
[excludedRowRendererIds]
);
@ -48,7 +48,7 @@ export const RowRendererSwitch = React.memo(function RowRendererSwitch(
dispatch(
setExcludedRowRendererIds({
id: timelineId,
excludedRowRendererIds: Object.values(RowRendererId),
excludedRowRendererIds: RowRendererValues,
})
);
}, [dispatch, timelineId]);

View file

@ -4,26 +4,26 @@
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { RowRendererId } from '../../../../../common/api/timeline';
import { type RowRendererId, RowRendererIdEnum } from '../../../../../common/api/timeline';
import * as i18n from './translations';
export const eventRendererNames: { [key in RowRendererId]: string } = {
[RowRendererId.alert]: i18n.ALERT_NAME,
[RowRendererId.alerts]: i18n.ALERTS_NAME,
[RowRendererId.auditd]: i18n.AUDITD_NAME,
[RowRendererId.auditd_file]: i18n.AUDITD_FILE_NAME,
[RowRendererId.library]: i18n.LIBRARY_NAME,
[RowRendererId.system_security_event]: i18n.AUTHENTICATION_NAME,
[RowRendererId.system_dns]: i18n.DNS_NAME,
[RowRendererId.netflow]: i18n.FLOW_NAME,
[RowRendererId.system]: i18n.SYSTEM_NAME,
[RowRendererId.system_endgame_process]: i18n.PROCESS,
[RowRendererId.registry]: i18n.REGISTRY_NAME,
[RowRendererId.system_fim]: i18n.FIM_NAME,
[RowRendererId.system_file]: i18n.FILE_NAME,
[RowRendererId.system_socket]: i18n.SOCKET_NAME,
[RowRendererId.suricata]: 'Suricata',
[RowRendererId.threat_match]: i18n.THREAT_MATCH_NAME,
[RowRendererId.zeek]: i18n.ZEEK_NAME,
[RowRendererId.plain]: '',
[RowRendererIdEnum.alert]: i18n.ALERT_NAME,
[RowRendererIdEnum.alerts]: i18n.ALERTS_NAME,
[RowRendererIdEnum.auditd]: i18n.AUDITD_NAME,
[RowRendererIdEnum.auditd_file]: i18n.AUDITD_FILE_NAME,
[RowRendererIdEnum.library]: i18n.LIBRARY_NAME,
[RowRendererIdEnum.system_security_event]: i18n.AUTHENTICATION_NAME,
[RowRendererIdEnum.system_dns]: i18n.DNS_NAME,
[RowRendererIdEnum.netflow]: i18n.FLOW_NAME,
[RowRendererIdEnum.system]: i18n.SYSTEM_NAME,
[RowRendererIdEnum.system_endgame_process]: i18n.PROCESS,
[RowRendererIdEnum.registry]: i18n.REGISTRY_NAME,
[RowRendererIdEnum.system_fim]: i18n.FIM_NAME,
[RowRendererIdEnum.system_file]: i18n.FILE_NAME,
[RowRendererIdEnum.system_socket]: i18n.SOCKET_NAME,
[RowRendererIdEnum.suricata]: 'Suricata',
[RowRendererIdEnum.threat_match]: i18n.THREAT_MATCH_NAME,
[RowRendererIdEnum.zeek]: i18n.ZEEK_NAME,
[RowRendererIdEnum.plain]: '',
};

View file

@ -8,7 +8,7 @@
import { EuiLink } from '@elastic/eui';
import React from 'react';
import { RowRendererId } from '../../../../../common/api/timeline';
import { type RowRendererId, RowRendererIdEnum } from '../../../../../common/api/timeline';
import {
AlertsExample,
AuditdExample,
@ -51,15 +51,15 @@ export interface RowRendererOption {
export const renderers: RowRendererOption[] = [
{
id: RowRendererId.alerts,
name: eventRendererNames[RowRendererId.alerts],
id: RowRendererIdEnum.alerts,
name: eventRendererNames[RowRendererIdEnum.alerts],
description: i18n.ALERTS_DESCRIPTION,
example: AlertsExample,
searchableDescription: i18n.ALERTS_DESCRIPTION,
},
{
id: RowRendererId.auditd,
name: eventRendererNames[RowRendererId.auditd],
id: RowRendererIdEnum.auditd,
name: eventRendererNames[RowRendererIdEnum.auditd],
description: (
<span>
<Link url="https://www.elastic.co/guide/en/beats/auditbeat/current/auditbeat-module-auditd.html">
@ -72,8 +72,8 @@ export const renderers: RowRendererOption[] = [
searchableDescription: `${i18n.AUDITD_NAME} ${i18n.AUDITD_DESCRIPTION_PART1}`,
},
{
id: RowRendererId.auditd_file,
name: eventRendererNames[RowRendererId.auditd_file],
id: RowRendererIdEnum.auditd_file,
name: eventRendererNames[RowRendererIdEnum.auditd_file],
description: (
<span>
<Link url="https://www.elastic.co/guide/en/beats/auditbeat/current/auditbeat-module-auditd.html">
@ -86,15 +86,15 @@ export const renderers: RowRendererOption[] = [
searchableDescription: `${i18n.AUDITD_FILE_NAME} ${i18n.AUDITD_FILE_DESCRIPTION_PART1}`,
},
{
id: RowRendererId.library,
name: eventRendererNames[RowRendererId.library],
id: RowRendererIdEnum.library,
name: eventRendererNames[RowRendererIdEnum.library],
description: i18n.LIBRARY_DESCRIPTION,
example: LibraryExample,
searchableDescription: i18n.LIBRARY_DESCRIPTION,
},
{
id: RowRendererId.system_security_event,
name: eventRendererNames[RowRendererId.system_security_event],
id: RowRendererIdEnum.system_security_event,
name: eventRendererNames[RowRendererIdEnum.system_security_event],
description: (
<div>
<p>{i18n.AUTHENTICATION_DESCRIPTION_PART1}</p>
@ -106,15 +106,15 @@ export const renderers: RowRendererOption[] = [
searchableDescription: `${i18n.AUTHENTICATION_DESCRIPTION_PART1} ${i18n.AUTHENTICATION_DESCRIPTION_PART2}`,
},
{
id: RowRendererId.system_dns,
name: eventRendererNames[RowRendererId.system_dns],
id: RowRendererIdEnum.system_dns,
name: eventRendererNames[RowRendererIdEnum.system_dns],
description: i18n.DNS_DESCRIPTION_PART1,
example: SystemDnsExample,
searchableDescription: i18n.DNS_DESCRIPTION_PART1,
},
{
id: RowRendererId.netflow,
name: eventRendererNames[RowRendererId.netflow],
id: RowRendererIdEnum.netflow,
name: eventRendererNames[RowRendererIdEnum.netflow],
description: (
<div>
<p>{i18n.FLOW_DESCRIPTION_PART1}</p>
@ -126,8 +126,8 @@ export const renderers: RowRendererOption[] = [
searchableDescription: `${i18n.FLOW_DESCRIPTION_PART1} ${i18n.FLOW_DESCRIPTION_PART2}`,
},
{
id: RowRendererId.system,
name: eventRendererNames[RowRendererId.system],
id: RowRendererIdEnum.system,
name: eventRendererNames[RowRendererIdEnum.system],
description: (
<div>
<p>
@ -145,8 +145,8 @@ export const renderers: RowRendererOption[] = [
searchableDescription: `${i18n.SYSTEM_DESCRIPTION_PART1} ${i18n.SYSTEM_NAME} ${i18n.SYSTEM_DESCRIPTION_PART2} ${i18n.SYSTEM_DESCRIPTION_PART3}`,
},
{
id: RowRendererId.system_endgame_process,
name: eventRendererNames[RowRendererId.system_endgame_process],
id: RowRendererIdEnum.system_endgame_process,
name: eventRendererNames[RowRendererIdEnum.system_endgame_process],
description: (
<div>
<p>{i18n.PROCESS_DESCRIPTION_PART1}</p>
@ -158,29 +158,29 @@ export const renderers: RowRendererOption[] = [
searchableDescription: `${i18n.PROCESS_DESCRIPTION_PART1} ${i18n.PROCESS_DESCRIPTION_PART2}`,
},
{
id: RowRendererId.registry,
name: eventRendererNames[RowRendererId.registry],
id: RowRendererIdEnum.registry,
name: eventRendererNames[RowRendererIdEnum.registry],
description: i18n.REGISTRY_DESCRIPTION,
example: RegistryExample,
searchableDescription: i18n.REGISTRY_DESCRIPTION,
},
{
id: RowRendererId.system_fim,
name: eventRendererNames[RowRendererId.system_fim],
id: RowRendererIdEnum.system_fim,
name: eventRendererNames[RowRendererIdEnum.system_fim],
description: i18n.FIM_DESCRIPTION_PART1,
example: SystemFimExample,
searchableDescription: i18n.FIM_DESCRIPTION_PART1,
},
{
id: RowRendererId.system_file,
name: eventRendererNames[RowRendererId.system_file],
id: RowRendererIdEnum.system_file,
name: eventRendererNames[RowRendererIdEnum.system_file],
description: i18n.FILE_DESCRIPTION_PART1,
example: SystemFileExample,
searchableDescription: i18n.FILE_DESCRIPTION_PART1,
},
{
id: RowRendererId.system_socket,
name: eventRendererNames[RowRendererId.system_socket],
id: RowRendererIdEnum.system_socket,
name: eventRendererNames[RowRendererIdEnum.system_socket],
description: (
<div>
<p>{i18n.SOCKET_DESCRIPTION_PART1}</p>
@ -192,8 +192,8 @@ export const renderers: RowRendererOption[] = [
searchableDescription: `${i18n.SOCKET_DESCRIPTION_PART1} ${i18n.SOCKET_DESCRIPTION_PART2}`,
},
{
id: RowRendererId.suricata,
name: eventRendererNames[RowRendererId.suricata],
id: RowRendererIdEnum.suricata,
name: eventRendererNames[RowRendererIdEnum.suricata],
description: (
<p>
{i18n.SURICATA_DESCRIPTION_PART1}{' '}
@ -207,15 +207,15 @@ export const renderers: RowRendererOption[] = [
searchableDescription: `${i18n.SURICATA_DESCRIPTION_PART1} ${i18n.SURICATA_NAME} ${i18n.SURICATA_DESCRIPTION_PART2}`,
},
{
id: RowRendererId.threat_match,
name: eventRendererNames[RowRendererId.threat_match],
id: RowRendererIdEnum.threat_match,
name: eventRendererNames[RowRendererIdEnum.threat_match],
description: i18n.THREAT_MATCH_DESCRIPTION,
example: ThreatMatchExample,
searchableDescription: `${i18n.THREAT_MATCH_NAME} ${i18n.THREAT_MATCH_DESCRIPTION}`,
},
{
id: RowRendererId.zeek,
name: eventRendererNames[RowRendererId.zeek],
id: RowRendererIdEnum.zeek,
name: eventRendererNames[RowRendererIdEnum.zeek],
description: (
<p>
{i18n.ZEEK_DESCRIPTION_PART1}{' '}

View file

@ -23,7 +23,7 @@ import { useDispatch } from 'react-redux';
import styled from 'styled-components';
import type { State } from '../../../common/store';
import { RowRendererId } from '../../../../common/api/timeline';
import { RowRendererValues } from '../../../../common/api/timeline';
import { useDeepEqualSelector } from '../../../common/hooks/use_selector';
import { setExcludedRowRendererIds as dispatchSetExcludedRowRendererIds } from '../../store/actions';
import { timelineSelectors } from '../../store';
@ -94,7 +94,7 @@ const StatefulRowRenderersBrowserComponent: React.FC<StatefulRowRenderersBrowser
const hideFieldBrowser = useCallback(() => setShow(false), []);
const handleDisableAll = useCallback(() => {
setExcludedRowRendererIds(Object.values(RowRendererId));
setExcludedRowRendererIds(RowRendererValues);
}, [setExcludedRowRendererIds]);
const handleEnableAll = useCallback(() => {

View file

@ -8,7 +8,7 @@
import React from 'react';
import { render } from '@testing-library/react';
import { TimelineSaveStatus } from '.';
import { TimelineStatus } from '../../../../common/api/timeline';
import { TimelineStatusEnum } from '../../../../common/api/timeline';
import { useDeepEqualSelector } from '../../../common/hooks/use_selector';
import { __IntlProvider as IntlProvider } from '@kbn/i18n-react';
import { TimelineId } from '../../../../common/types';
@ -26,7 +26,7 @@ const renderTimelineSaveStatus = () => {
describe('TimelineSaveStatus', () => {
it('should render unsaved status if draft timeline', () => {
(useDeepEqualSelector as jest.Mock).mockReturnValue({
status: TimelineStatus.draft,
status: TimelineStatusEnum.draft,
});
const { getByTestId, getByText } = renderTimelineSaveStatus();
@ -61,7 +61,7 @@ describe('TimelineSaveStatus', () => {
it('should not render any status', () => {
(useDeepEqualSelector as jest.Mock).mockReturnValue({
changed: false,
status: TimelineStatus.active,
status: TimelineStatusEnum.active,
updated: Date.now(),
});

View file

@ -12,7 +12,7 @@ import { i18n } from '@kbn/i18n';
import { timelineSelectors } from '../../store';
import { timelineDefaults } from '../../store/defaults';
import { useDeepEqualSelector } from '../../../common/hooks/use_selector';
import { TimelineStatus } from '../../../../common/api/timeline';
import { TimelineStatusEnum } from '../../../../common/api/timeline';
const UNSAVED = i18n.translate('xpack.securitySolution.timeline.saveStatus.unsavedLabel', {
defaultMessage: 'Unsaved',
@ -47,7 +47,7 @@ export const TimelineSaveStatus = React.memo<TimelineSaveStatusProps>(({ timelin
pick(['changed', 'status', 'updated'], getTimeline(state, timelineId) ?? timelineDefaults)
);
const isDraft = status === TimelineStatus.draft;
const isDraft = status === TimelineStatusEnum.draft;
let statusContent: React.ReactNode;
if (isDraft || !updated) {

View file

@ -13,7 +13,7 @@ import { TestProviders } from '../../../../../common/mock';
import { EventColumnView } from './event_column_view';
import { DefaultCellRenderer } from '../../cell_rendering/default_cell_renderer';
import { TimelineId, TimelineTabs } from '../../../../../../common/types/timeline';
import { TimelineType } from '../../../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../../../common/api/timeline';
import { useShallowEqualSelector } from '../../../../../common/hooks/use_selector';
import { useIsExperimentalFeatureEnabled } from '../../../../../common/hooks/use_experimental_features';
import { getDefaultControlColumn } from '../control_columns';
@ -79,7 +79,7 @@ jest.mock('../../../../../common/lib/kibana', () => {
describe('EventColumnView', () => {
useIsExperimentalFeatureEnabledMock.mockReturnValue(false);
(useShallowEqualSelector as jest.Mock).mockReturnValue(TimelineType.default);
(useShallowEqualSelector as jest.Mock).mockReturnValue(TimelineTypeEnum.default);
const ACTION_BUTTON_COUNT = 4;
const leadingControlColumns = getDefaultControlColumn(ACTION_BUTTON_COUNT);

View file

@ -6,7 +6,7 @@
*/
import { eventHasNotes, eventIsPinned, getPinOnClick, getPinTooltip } from './helpers';
import { TimelineType } from '../../../../../common/api/timeline';
import { TimelineTypeEnum } from '../../../../../common/api/timeline';
describe('helpers', () => {
describe('eventHasNotes', () => {
@ -26,7 +26,7 @@ describe('helpers', () => {
isAlert: false,
isPinned: true,
eventHasNotes: true,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
})
).toEqual('This event cannot be unpinned because it has notes');
});
@ -37,7 +37,7 @@ describe('helpers', () => {
isAlert: true,
isPinned: true,
eventHasNotes: true,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
})
).toEqual('This alert cannot be unpinned because it has notes');
});
@ -48,7 +48,7 @@ describe('helpers', () => {
isAlert: false,
isPinned: true,
eventHasNotes: false,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
})
).toEqual('Unpin event');
});
@ -59,7 +59,7 @@ describe('helpers', () => {
isAlert: true,
isPinned: true,
eventHasNotes: false,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
})
).toEqual('Unpin alert');
});
@ -70,7 +70,7 @@ describe('helpers', () => {
isAlert: false,
isPinned: false,
eventHasNotes: true,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
})
).toEqual('This event cannot be unpinned because it has notes');
});
@ -81,7 +81,7 @@ describe('helpers', () => {
isAlert: true,
isPinned: false,
eventHasNotes: true,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
})
).toEqual('This alert cannot be unpinned because it has notes');
});
@ -92,7 +92,7 @@ describe('helpers', () => {
isAlert: false,
isPinned: false,
eventHasNotes: false,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
})
).toEqual('Pin event');
});
@ -103,7 +103,7 @@ describe('helpers', () => {
isAlert: true,
isPinned: false,
eventHasNotes: false,
timelineType: TimelineType.default,
timelineType: TimelineTypeEnum.default,
})
).toEqual('Pin alert');
});
@ -114,7 +114,7 @@ describe('helpers', () => {
isAlert: false,
isPinned: false,
eventHasNotes: false,
timelineType: TimelineType.template,
timelineType: TimelineTypeEnum.template,
})
).toEqual('This event may not be pinned while editing a template timeline');
});
@ -125,7 +125,7 @@ describe('helpers', () => {
isAlert: true,
isPinned: false,
eventHasNotes: false,
timelineType: TimelineType.template,
timelineType: TimelineTypeEnum.template,
})
).toEqual('This alert may not be pinned while editing a template timeline');
});

View file

@ -10,8 +10,7 @@ import { isEmpty } from 'lodash/fp';
import type { EcsSecurityExtension as Ecs } from '@kbn/securitysolution-ecs';
import type { TimelineItem, TimelineNonEcsData } from '../../../../../common/search_strategy';
import type { TimelineEventsType } from '../../../../../common/types/timeline';
import type { TimelineTypeLiteral } from '../../../../../common/api/timeline';
import { TimelineType } from '../../../../../common/api/timeline';
import { type TimelineType, TimelineTypeEnum } from '../../../../../common/api/timeline';
import type { OnPinEvent, OnUnPinEvent } from '../events';
import * as i18n from './translations';
@ -27,9 +26,9 @@ export const getPinTooltip = ({
isAlert: boolean;
isPinned: boolean;
eventHasNotes: boolean;
timelineType: TimelineTypeLiteral;
timelineType: TimelineType;
}) => {
if (timelineType === TimelineType.template) {
if (timelineType === TimelineTypeEnum.template) {
return i18n.DISABLE_PIN(isAlert);
} else if (eventHasNotes) {
return i18n.PINNED_WITH_NOTES(isAlert);

View file

@ -11,7 +11,7 @@ import React from 'react';
import { AlertField } from './alert_field';
import type { RowRenderer } from '../../../../../../../common/types';
import { RowRendererId } from '../../../../../../../common/api/timeline';
import { RowRendererIdEnum } from '../../../../../../../common/api/timeline';
import {
ID,
DESTINATION_IP,
@ -52,7 +52,7 @@ export const ALERT_RENDERER_FIELDS = [
];
export const alertRenderer: RowRenderer = {
id: RowRendererId.alert,
id: RowRendererIdEnum.alert,
isInstance: (ecs) => eventKindMatches(get('event.kind', ecs)),
renderRow: ({ contextId = DEFAULT_CONTEXT_ID, data, isDraggable, scopeId }) => {
const eventId = get(ID, data);

View file

@ -10,7 +10,7 @@ import { get } from 'lodash/fp';
import React from 'react';
import type { RowRenderer } from '../../../../../../../common/types/timeline';
import { RowRendererId } from '../../../../../../../common/api/timeline';
import { RowRendererIdEnum } from '../../../../../../../common/api/timeline';
import { RowRendererContainer } from '../row_renderer';
import { AuditdGenericDetails } from './generic_details';
@ -24,7 +24,7 @@ export const createGenericAuditRowRenderer = ({
actionName: string;
text: string;
}): RowRenderer => ({
id: RowRendererId.auditd,
id: RowRendererIdEnum.auditd,
isInstance: (ecs) => {
const module: string | null | undefined = get('event.module[0]', ecs);
const action: string | null | undefined = get('event.action[0]', ecs);
@ -57,7 +57,7 @@ export const createGenericFileRowRenderer = ({
text: string;
fileIcon?: IconType;
}): RowRenderer => ({
id: RowRendererId.auditd_file,
id: RowRendererIdEnum.auditd_file,
isInstance: (ecs) => {
const module: string | null | undefined = get('event.module[0]', ecs);
const action: string | null | undefined = get('event.action[0]', ecs);

View file

@ -7,20 +7,20 @@
import type { EcsSecurityExtension as Ecs } from '@kbn/securitysolution-ecs';
import { TimelineId } from '../../../../../../../common/types/timeline';
import { RowRendererId } from '../../../../../../../common/api/timeline';
import { RowRendererIdEnum } from '../../../../../../../common/api/timeline';
import { combineRenderers } from '.';
describe('combineRenderers', () => {
const contextId = 'abcd';
const a = {
id: RowRendererId.netflow,
id: RowRendererIdEnum.netflow,
isInstance: jest.fn(),
renderRow: jest.fn(),
};
const b = {
id: RowRendererId.registry,
id: RowRendererIdEnum.registry,
isInstance: jest.fn(),
renderRow: jest.fn(),
};
@ -32,7 +32,7 @@ describe('combineRenderers', () => {
beforeEach(() => jest.clearAllMocks());
it('returns a renderer with the expected id', () => {
const id = RowRendererId.library; // typically id from 'a', or 'b', but it can be any value
const id = RowRendererIdEnum.library; // typically id from 'a', or 'b', but it can be any value
expect(combineRenderers({ a, b, id }).id).toEqual(id);
});

View file

@ -6,12 +6,12 @@
*/
import type { RowRenderer } from '../../../../../../../common/types/timeline';
import { RowRendererId } from '../../../../../../../common/api/timeline';
import { RowRendererIdEnum } from '../../../../../../../common/api/timeline';
import { hasThreatMatchValue } from './helpers';
import { renderThreatMatchRows } from './threat_match_rows';
export const threatMatchRowRenderer: RowRenderer = {
id: RowRendererId.threat_match,
id: RowRendererIdEnum.threat_match,
isInstance: hasThreatMatchValue,
renderRow: renderThreatMatchRows,
};

View file

@ -10,7 +10,7 @@ import React from 'react';
import styled from 'styled-components';
import type { RowRenderer } from '../../../../../../../common/types/timeline';
import { RowRendererId } from '../../../../../../../common/api/timeline';
import { RowRendererIdEnum } from '../../../../../../../common/api/timeline';
import { asArrayIfExists } from '../../../../../../common/lib/helpers';
import {
TLS_CLIENT_CERTIFICATE_FINGERPRINT_SHA1_FIELD_NAME,
@ -85,7 +85,7 @@ export const eventActionMatches = (eventAction: string | object | undefined | nu
};
export const netflowRowRenderer: RowRenderer = {
id: RowRendererId.netflow,
id: RowRendererIdEnum.netflow,
isInstance: (ecs) =>
eventCategoryMatches(get(EVENT_CATEGORY_FIELD, ecs)) ||
eventActionMatches(get(EVENT_ACTION_FIELD, ecs)),

View file

@ -8,14 +8,14 @@
import React from 'react';
import type { RowRenderer } from '../../../../../../common/types/timeline';
import { RowRendererId } from '../../../../../../common/api/timeline';
import { RowRendererIdEnum } from '../../../../../../common/api/timeline';
const PlainRowRenderer = () => <></>;
PlainRowRenderer.displayName = 'PlainRowRenderer';
export const plainRowRenderer: RowRenderer = {
id: RowRendererId.plain,
id: RowRendererIdEnum.plain,
isInstance: (_) => true,
renderRow: PlainRowRenderer,
};

View file

@ -14,7 +14,7 @@ import { reasonColumnRenderer } from './reason_column_renderer';
import { plainColumnRenderer } from './plain_column_renderer';
import type { ColumnHeaderOptions, RowRenderer } from '../../../../../../common/types';
import { RowRendererId } from '../../../../../../common/api/timeline';
import { RowRendererIdEnum } from '../../../../../../common/api/timeline';
import { render } from '@testing-library/react';
import { cloneDeep } from 'lodash';
@ -41,7 +41,7 @@ const field: ColumnHeaderOptions = {
const rowRenderers: RowRenderer[] = [
{
id: RowRendererId.alerts,
id: RowRendererIdEnum.alerts,
isInstance: (ecs) => ecs === validEcs,
renderRow: () => <span data-test-subj="test-row-render" />,
},

View file

@ -9,13 +9,13 @@ import { get } from 'lodash/fp';
import React from 'react';
import type { RowRenderer } from '../../../../../../../common/types/timeline';
import { RowRendererId } from '../../../../../../../common/api/timeline';
import { RowRendererIdEnum } from '../../../../../../../common/api/timeline';
import { RowRendererContainer } from '../row_renderer';
import { SuricataDetails } from './suricata_details';
export const suricataRowRenderer: RowRenderer = {
id: RowRendererId.suricata,
id: RowRendererIdEnum.suricata,
isInstance: (ecs) => {
const module: string | null | undefined = get('event.module[0]', ecs);
return module != null && module.toLowerCase() === 'suricata';

View file

@ -9,7 +9,7 @@ import { get } from 'lodash/fp';
import React from 'react';
import type { RowRenderer } from '../../../../../../../common/types/timeline';
import { RowRendererId } from '../../../../../../../common/api/timeline';
import { RowRendererIdEnum } from '../../../../../../../common/api/timeline';
import { DnsRequestEventDetails } from '../dns/dns_request_event_details';
import { EndgameSecurityEventDetails } from '../endgame/endgame_security_event_details';
@ -28,7 +28,7 @@ export const createGenericSystemRowRenderer = ({
actionName: string;
text: string;
}): RowRenderer => ({
id: RowRendererId.system,
id: RowRendererIdEnum.system,
isInstance: (ecs) => {
const module: string | null | undefined = get('event.module[0]', ecs);
const action: string | null | undefined = get('event.action[0]', ecs);
@ -59,7 +59,7 @@ export const createEndgameProcessRowRenderer = ({
actionName: string;
text: string;
}): RowRenderer => ({
id: RowRendererId.system_file,
id: RowRendererIdEnum.system_file,
isInstance: (ecs) => {
const action: string | null | undefined = get('event.action[0]', ecs);
const category: string | null | undefined = get('event.category[0]', ecs);
@ -91,7 +91,7 @@ export const createFimRowRenderer = ({
actionName: string;
text: string;
}): RowRenderer => ({
id: RowRendererId.system_fim,
id: RowRendererIdEnum.system_fim,
isInstance: (ecs) => {
const action: string | null | undefined = get('event.action[0]', ecs);
const category: string | null | undefined = get('event.category[0]', ecs);
@ -132,7 +132,7 @@ export const createEndpointAlertsRowRenderer = ({
skipRedundantProcessDetails = false,
text,
}: EndpointAlertCriteria): RowRenderer => ({
id: RowRendererId.alerts,
id: RowRendererIdEnum.alerts,
isInstance: (ecs) => {
const action: string[] | null | undefined = get('event.action', ecs);
const category: string[] | null | undefined = get('event.category', ecs);
@ -173,7 +173,7 @@ export const createEndpointLibraryRowRenderer = ({
actionName: string;
text: string;
}): RowRenderer => ({
id: RowRendererId.library,
id: RowRendererIdEnum.library,
isInstance: (ecs) => {
const action: string | null | undefined = get('event.action[0]', ecs);
const dataset: string | null | undefined = get('event.dataset[0]', ecs);
@ -202,7 +202,7 @@ export const createGenericFileRowRenderer = ({
actionName: string;
text: string;
}): RowRenderer => ({
id: RowRendererId.system_file,
id: RowRendererIdEnum.system_file,
isInstance: (ecs) => {
const module: string | null | undefined = get('event.module[0]', ecs);
const action: string | null | undefined = get('event.action[0]', ecs);
@ -233,7 +233,7 @@ export const createSocketRowRenderer = ({
actionName: string;
text: string;
}): RowRenderer => ({
id: RowRendererId.system_socket,
id: RowRendererIdEnum.system_socket,
isInstance: (ecs) => {
const action: string | null | undefined = get('event.action[0]', ecs);
return action != null && action.toLowerCase() === actionName;
@ -256,7 +256,7 @@ export const createSecurityEventRowRenderer = ({
}: {
actionName: string;
}): RowRenderer => ({
id: RowRendererId.system_security_event,
id: RowRendererIdEnum.system_security_event,
isInstance: (ecs) => {
const category: string | null | undefined = get('event.category[0]', ecs);
const action: string | null | undefined = get('event.action[0]', ecs);
@ -280,7 +280,7 @@ export const createSecurityEventRowRenderer = ({
});
export const createDnsRowRenderer = (): RowRenderer => ({
id: RowRendererId.system_dns,
id: RowRendererIdEnum.system_dns,
isInstance: (ecs) => {
const dnsQuestionType: string | null | undefined = get('dns.question.type[0]', ecs);
const dnsQuestionName: string | null | undefined = get('dns.question.name[0]', ecs);
@ -305,7 +305,7 @@ export const createEndpointRegistryRowRenderer = ({
actionName: string;
text: string;
}): RowRenderer => ({
id: RowRendererId.registry,
id: RowRendererIdEnum.registry,
isInstance: (ecs) => {
const action: string | null | undefined = get('event.action[0]', ecs);
const dataset: string | null | undefined = get('event.dataset[0]', ecs);

View file

@ -9,13 +9,13 @@ import { get } from 'lodash/fp';
import React from 'react';
import type { RowRenderer } from '../../../../../../../common/types/timeline';
import { RowRendererId } from '../../../../../../../common/api/timeline';
import { RowRendererIdEnum } from '../../../../../../../common/api/timeline';
import { RowRendererContainer } from '../row_renderer';
import { ZeekDetails } from './zeek_details';
export const zeekRowRenderer: RowRenderer = {
id: RowRendererId.zeek,
id: RowRendererIdEnum.zeek,
isInstance: (ecs) => {
const module: string | null | undefined = get('event.module[0]', ecs);
return module != null && module.toLowerCase() === 'zeek';

Some files were not shown because too many files have changed in this diff Show more